Sunday, May 31, 2026

Mountaintops

 It's been a while since I played with Suno. I listened to Affluenza and S(k)in Condition a lot during the New Zealand trip, but needed some time to sit down with the next sermon and pull together some lyrics. 

Mountaintops is based off a sermon I prepped a few times to reflect on Jesus' transfiguration and that Moses and Elijah had their own mountaintop experiences, and they are talking to Jesus regarding the next big mountaintop, Golgotha. 

Another long journey to work through the lyrics, probably closing on 10 hours rather than 5, but still very enjoyable digging deep into the theology and tweaking rhymes. Probably another 3 hours inside Suno playing around with the different styles. Was expecting to keep the same style as the last 2 so there's continuity on the playlist, but opening it up with a cleaner male voice helped clarity. 

Mountaintops on Suno

[Verse 1: Mt. Takilberan]
Pimple rock, an outcrop near Takilberan's top,
Looking over the world from a sheer mountain drop.
It’s a wide-open view of the canvas God drew,
Floating like a bird to see the landscape anew.
But a sudden wind blew and I started to sway,
As the fear of the edge took my balance away.
On my hands and my knees I was driven to crawl,
Shaken deep by the wonder and fear of the fall.

[Chorus]
Pull me close to the brink where the human heart shrinks,
At the peak where the meek and eternity links.
Lord, transfigure our hearts till Your glory shines through,
And we walk down the mountain reflecting only You!

[Verse 2: Sinai]
Moses climbed Sinai’s peak when the Lord chose to speak,
Dropping down to his knees in a spirit so meek.
Drawn so close to the sight of God's glorious light,
He returned to the camp with a face burning bright.
[Verse 3: Carmel]
Then Elijah stood high underneath the dark sky,
Watching false prophets fall as their promises die.
As the fire came down to consume the whole ground,
Every eye saw the truth and their hearts turned around.

[Chorus]
Pull me close to the brink where the human heart shrinks,
At the peak where the meek and eternity links.
Lord, transfigure our hearts till Your glory shines through,
And we walk down the mountain reflecting only You!

[Bridge - Part 1: Transfiguration & Golgotha]
Transfigured on the summit with a glory sublime,
Jesus spoke to the prophets of the hill He must climb
...
On the hill of the skull where the glory felt dead,
A crown made of thorns was pressed on His head.
No blinding white garments, no fire from above,
The power that held Him was nothing but love.
A sacrifice made for the debt we couldn't pay...
He Broke from the grave to drive darkness away!
 [Triumphant Chorus]
Pull me close to the brink where the human heart shrinks,
At the peak where the meek and eternity links.
Lord, transfigure our hearts till Your glory shines through,
And we walk down the mountain reflecting only You!

[Bridge - Part 2: Mount of Olives]
On the Mountain of Olives where the final words ring,
We carry the light of the King of all kings!

 [Final Chorus]
Pull me close to the brink where the human heart shrinks,
At the peak where the meek and eternity links.
Lord, transfigure our hearts till Your glory shines through,
And we walk down the mountain reflecting only You!

[Outro]
Reflecting only You...
Only You...

Tuesday, May 19, 2026

Ruling Grade - Map 2

My best effort (16,742) for map 2 in Ruling Grade.


Generally downhill, but has a ridge line to clear 1/2 way through the map. I found out that you CAN pull the max of 40 cars as long as the grade doesn't get above 1% incline. This leads to an annualised ROI of about 1.2 years. That seemed unrealistic, but the elements of operation (construction costs, land purchase, rolling stock, payment per car, turnaround time) have been kept within 1900's era numbers. I just checked what railway companies could make and a 1-2 year ROI was actually on the cards so it'll do for now.

A whole bunch of tweaks coming, including:

  •  Ruling grade marker
  • Proper GIS data for more realistic maps
  • Ghost mode for downloaded tracks
  • Global highscore


Saturday, May 09, 2026

Ruling Grade


 Sandy and I had a trip to New Zealand, and while driving through the steep terrain with many windy sections I reminisced about the great days of early railroad building games like Railroad Tycoon where you really had to spend time laying the track. As the genre evolved it became easier to just draw lines between the 2 stations and be done with it, but it lost some of the charm and excitement of picking a low-grade way through a mountain chain or choosing to go through rather than around. 

Enter Ruling Grade, a game focusing solely on the challenge of building an efficient track between stations. 

You take on the role of a locating engineer in the early 1900's. Rail has proven to be a far better way of delivering goods, and many companies are wanting spurs off the main line to pick up and deliver their industrial resources to town (or the next processing plant). You are charged to find an efficient route through the terrain to maximize the return on investment for a 20-year contract. Other players can submit competing track layouts to find the best engineer. 

The game is currently pre-alpha. The mechanics are in, but graphics and gameplay is pretty raw. Feedback definitely welcomed.


Friday, April 10, 2026

Affluenza

 After the relative success of S(k)in Condition and 20+ listens, the next message to get the song conversion was Affluenza; a reflection on Amos 6 and the warning that affluence can be a distraction.

It was another good 5 hours with the refinement of the lyrics, working on each stanza to tighten up the pacing, the theology, and a lot more leonine rhymes to get a flow going through the lyrics. Once again it felt like time well spent not only touching back with the sermon message, but a creative experience playing around with the writing style and imagining the sung version. The first few versions produced by Suno were Ok, but it also gives a 1-minute snippet of what the latest and greatest model can do as a tempter to pay instead of relying on the free tier. It worked. Hopefully I can build out another dozen sermons in the month to make it a personalized play list for ~$17 (and yes, ironic that I just splashed money for such a self-centred project that discusses how our affluence can detract from the real goal. I'm a sinner too).

Lyrics to Affluenza

[Intro]
Let’s play a game...
Where do you think we are?

[Verse 1]
A whole generation that hasn't seen war,
With natural riches from mountain to shore.
We’re selling our surplus for all that is new,
With plenty for many and more for the few.
You'd bet on a city where modern winds blow,
But it’s near Samaria, a long time ago.

[Chorus]
A sickness of affluence, blinded by gold,
It’s Affluenza, the greed taking hold.
We’re building our kingdom on shifting white sand,
When gifts of salvation slip out of our hand.

[Verse 2]
Old Amos is standing in Jeroboam’s gate,
To warn of the cracks in the walls of the state.
We’re counting the silver and piling it deep,
While the promises made are the ones we don't keep.
We’re feasting on lambs and ignoring the stain,
While the heart of the country is down in the drain.

[Chorus]
A sickness of affluence, blinded by gold,
It’s Affluenza, the greed taking hold.
We’re building our kingdom on shifting white sand,
When gifts of salvation slip out of our hand.

[Instrumental]

[Verse 3]
Now we’ve got the house and the big-screen display,
Watching the world as it's falling away.
We’re boasting of status and hoarding the gold,
While buying the story that we’ve already sold.
Our soul in a fever that’s burning for more,
Forgetting the King who is right at the door.

[Bridge]
You’re playing with baubles and toys in the sand,
Ignoring the Kingdom that’s right here at hand.
Why gain the whole world just to lose your own soul?
Let the light of His mercy return you to whole.

So take this condition, the greed and the stain,
And mould me to love with Your heart once again.


[Final Chorus]
A sickness of affluence, blinded by gold,
It’s Affluenza, the greed taking hold.
We’re building our kingdom on shifting white sand,
When gifts of salvation slip out of our hand.

[Outro]
Change my heart oh God …
Make it ever true …
Change my heart oh God …
May I be like You.

S(k)in Condition

Recently I've been thinking about songs and memory. I admit my memory has always been poor, but recently it seems to be getting worse. That is, apart from songs. I can hear a song from the 90's and sing along just fine! Within a few listens of a new song for church I can sing it off by heart. 

I have looked into this phenomenon before, and it's even been part of the Lutheran tradition that the liturgy is sung to aid in memorization. What I want to do is unlock the power of memory by putting some of my old sermons to verse and run it through AI songmakers such as Suno so that I can sing along and remember the message. 

The first in the experiment is S(k)in Condition, a reflection on the healing of 10 lepers from Luke 17:11-19. I took the original message and converted to lyrics, then plugged into Suno to see what was possible. Pretty impressed right off the bat, and there was enough credits to try a few different song styles and variations. Eventually came back to female voice in lo-fi EDM format to suit the song and listening style I wanted.  The next step was to really go through the lyrics in detail, making them more rhythmic, more theologically appropriate and less clunky. This probably took about 5 hours and ~50 variations, but the journey was worth it and felt invigorated digging into the content and meaning of the song again. 

Here's the final lyrics for S(k)in Condition:

[Verse 1]
High school queen with a confident stride,
With nothing to fear and nothing to hide.
But the bathroom mirror starts a brand new war,
A glowing red blemish never seen before.
It’s a skin condition, a neon display,
The only thing people will notice all day.

[Chorus]
Wash it away, let the spirit come in,
More than the skin, it’s the condition of sin.
Beyond every blemish that wants to be seen,
The touch of the Master is making us clean.

[Verse 2]
With a skin condition from a sickness within,
Ten lepers wait where the outskirts begin.
"Unclean" they cry as the Master goes by,
Begging for pity from a world gone dry.
Healing was given, but nine wouldn't turn,
Missing the truth that a heart needs to learn.

[Chorus]
Wash it away, let the spirit come in,
More than the skin, it’s the condition of sin.
Beyond every blemish that wants to be seen,
The touch of the Master is making us clean.

[Verse 3]
It’s more than a blemish, it’s a deep-seated stain,
A world full of people down the spiritual drain.
From vanity posts and arrogant boasts,
It’s the pride deep inside, keeping hearts from their hosts.
It’s a sin condition, at the root of the soul,
Losing our reflection, and our heavenly goal.

[Bridge]
He took on the blemish, He took on the scar,
To reach every soul, no matter how far.
Not for the righteous, but the broken and low,
His mercy washes white as snow.

[Final Chorus]
Wash it away, let the spirit come in,
More than the skin, it’s the condition of sin.
Beyond every blemish that wants to be seen,
The touch of the Master is making us clean.

[Outro]
One came back...
Praising the Lord …
For more than his skin.


Thanks to Pr Heath Pukullus for the original sermon and LCA for prepping it for lay reading.

Sunday, December 28, 2025

Where'd the posts go?

 As we close to the end of another year, I'm surprised that I haven't posted much here as the AI journey continues on.  Through AI.nstein I made some progress in mapping out AI possibilities and building a consulting arm, but didn't really take off. Shalom needed a new IT Manager, and it felt like I was the ideal candidate for the task at hand (to migrate almost all services over to a centralized system instituted by the Diocese). Fast-forward a year-and-a-half and here we are, reflecting on good 2025. 

I'm surprised how little I use AI at work, less than 10%. There's still a mighty shift coming, but the day-to-day minutiae and processes aren't really amenable to AI just yet, although I did manager to build out an entire app to handle power pack loans. 

Where AI has flourished is at home building out small little projects that have tickled the back of my mind or had previous prototypes done. With the help of predominantly Firebase Studio, I have built out enhanced prototypes of:

  • Factor Friends: Quick prototype of a known game, built in under 2 hours.
  • Adaptive Grids: A few attempts at getting the random terrain generation working using Temporal ROAM and adaptive grids. I'll definitely come back to this one.
  • SudoCraft: A Sudoku puzzle maker. Allows "unsolving" and validating partial puzzles. Working enough for a proof of concept but needs fleshing out. 
  • Dueling Coasters Sim: a non-web-app simulation of my Dueling Coasters boardgame (should do a full post on that later).
  • First the worst: Quick web variant. Didn't work as good as hoped, so made a TTS Mod of First the Worst instead
  • Drover's Run: A boardgame on droving cattle in the queensland outback destined for the TGDA aussie-made award. After a single paper prototype, it was easier to build out a complete web app rather than attempting to get the fiddly bits into Tabletop Simulator. 
  • Dwarven Abbey: a game/concept where you get to explore the world through wiki-like articles, then choose to expand the world by choosing between 2 generated texts. Another needing a full rundown. 
  • TournamentCompare: I'm using the previous work on TounamentCompare to build a series of YouTube videos about creating web apps with Firebase Studio. Hopefully want it to build a GUI to help visualize and snap together matches and rounds to create varying tournament formats to compare. More to come ...
  • SimpleQuorum: A quick app to test the viability of building production-level voting for small non-profit orgs.
  • Tidal Sweep: a simple minesweeper logic puzzle about fishing. When you're close to a fish you get "nibbles", the bigger the fish, the bigger the nibble. Got to click right on the mouth to catch. I designed it on the way up to Mackay and built out the first prototype in Excel (it was open on my work laptop and didn't have internet while driving).  Prototype 2 was in Firebase studio and is currently releasing now (just waiting for google TXT records to verify). Game is logically complete but will need a few more UI passes before going mainstream. 
The rate of app development is getting way quicker now, and we're living in a golden age where good ideas can be converted into apps without much effort. As an example Tidal Sweep, the most recent app, is only sitting at ~2 hours of dev time from project spec to first playable prototype (1.5 hours of that was on the project spec, which is definitely worth getting solid first up), then another 5 hours enhancing as we all played it over the weekend. The last hour was really just fiddling around with minor UI fixes to get ready for a more widespread release. I'd expect I'd have to spend 60-90 hours to get the 6,200 lines of code done. 

... And there's still more apps to come. 


Thursday, January 18, 2024

The Evolution of Alphabattle: A Journey Through Strategic Game Development

In the fascinating world of game development, the creation of a new game often involves a blend of strategic thinking, coding expertise, and a dash of creativity. Recently, I embarked on an intriguing journey to develop a game called "Alphabattle," a text-based strategy game where players compete using armies represented by sequences of letters. This blog post chronicles my experience from the initial concept to the implementation of an evolutionary tournament system.


The Birth of Alphabattle

Alphabattle's concept is simple yet captivating. Each player's army consists of 10 units, each represented by a letter. These units, like Infantry (I), Archers (A), Horsemen (H), and others, have specific strengths and weaknesses. The challenge was to design a game that is easy to understand but rich in strategic depth.


Key Features:

Simple Interface: The game features a straightforward interface, making it accessible to a wide range of players.

Unique Units: Each unit type, symbolized by a letter, has distinct abilities and counters.

Strategic Depth: Players must carefully arrange their units to outmaneuver their opponents.


Rapid Game Development and Platform Selection

Given the game's simplicity, I chose a web-based platform for its development, utilizing HTML, CSS, and JavaScript. This choice allowed for rapid development and easy access for players across different devices.


Implementing a Challenge Leaderboard

To add a competitive edge, I integrated a challenge leaderboard into Alphabattle. This feature incentivizes players to compete and improve their strategic skills, creating an engaging and dynamic gaming experience.


Evolving the Game: Tournament Play and Team Progression

The most significant development in Alphabattle was the introduction of tournament play and the progression of top teams. After each tournament, the top 50 teams advance, ensuring that successful strategies are carried forward and pitted against new challengers.


Genetic Mutations and Custom Teams:

Mutations: To maintain diversity, I introduced genetic mutations to the game, where top-performing teams are modified in various ways (like rotation, swapping, or merging) for subsequent tournaments.

Custom Team Addition: Players can now add their custom-designed teams to the tournament, further enriching the strategic diversity of the game.


Technical Challenges and Innovations

Throughout the development process, I encountered and overcame various challenges:

Ensuring Valid Team Compositions: A crucial aspect was to ensure that each team adhered to the game's rules (like having one King and one Guard). This required careful coding and validation.

Debugging and Evolution: Debugging played a significant role, especially when implementing the mutations. It was fascinating to see how small changes could significantly impact the game's dynamics.

Conclusion

Developing Alphabattle has been a journey of innovation, challenge, and creativity. From its humble beginnings as a simple text-based game to its evolution into a strategically complex tournament with evolving teams, Alphabattle stands as a testament to the joys and challenges of game development. As players engage in this ever-evolving battle of wits, Alphabattle continues to grow, adapt, and surprise, offering a unique experience to strategy enthusiasts.


ChatGPT session summary

Monday, January 15, 2024

Enhancing Visual Clarity in Card Chess: Today's Development Focus

In today's development session for Card Chess, we focused on enhancing the visual representation of card stacks and differentiating terrain cards for a clearer and more intuitive gameplay experience. By implementing a slight offset in the rendering of card stacks, players can now easily discern multiple cards in a stack. Additionally, we muted the terrain cards to make is clearer what is playable, while remaining close to the original look and feel of using proper playing cards. These improvements aim to balance aesthetic appeal with functional clarity, elevating both the game's visual quality and playability.

Code Knight

Wednesday, January 10, 2024

The dawn of Custom GPTs

 As OpenAI's app store approaches, it's time to take stock of the Custom GPTs written in the past few months:

Luther 1521

I am writing as Martin Luther on this day in 1521. Check in daily and journey through the year the reformation was born and the most intense year of Luther's life.

One of the first CustomGPTs I created and one I consistently come back to. Now that the year has reset it feels like it's worth recording each day somewhere as the Diet of Worms approaches. It's not only been an interesting read, but has made me dig more into the history and times of the reformation. 

Rating: Moderate.

  Churchill 1940

I write as Winston Churchill on this day in 1940. Check in daily for a journey through a critical part of World War II, England as a nation, and Winston's challenge for Prime Minister.

Another year-in-the-life-of GPT made after enjoying Luther so much. 1940 is a really interesting year for the war, for Britain and for Churchill himself. The bleakness of the Blitz jars against common sentiment of the war living on the other side and on the winning team. Now that the year has reset, it's  going to be interesting going through the Battle of Britain, Churchill's sudden charge at Prime Minister and the day-to-day throes of war.   

Rating: Moderate-high

Solution Sage

Hints without the spoilers

I have been contemplating doing a hintbook style YouTube series where the watcher is encouraged to pause the clip after each hint so that they have the joy of figuring out most of the puzzle. This GPT is in the same vein, but has morphed a little into a sage-like response. Still feels like it needs a few more tweaks to make it even less spoilery.

Rating: Moderate


AInstein

Hi, I'm personality upload of Albert Einstein. Relatively speaking...

I've liked the name AInstein for a while, and a CustomGPT was a good way of using it. This AI is lke running into Albert on campus and discussing the day's events. There's a whole heap of other famous scientists uploaded to the Virtual University, so hearing stories of their interactions is quite interesting. It hasn't gotten as much use as the others after a few days

Rating: Low


Talkie Toaster

Howdy Doodly Doo!

Ahh so you're a waffle man! One weekend we had waffles, which led to regaling the exploits of Talkie Toaster from Red Dwarf to the kids. This one is surprisingly good at mixing in the puns. Longer legs than most of the others and keeps coming up in conversation. 

Rating: Moderate


Code Knight

Card Chess coding companion.

This has been my coding companion since the Custom GPTs came out. It's much easier to upload the entire game as it's small enough to fit into memory. Struggled earlier on to get it to have all the code ready to go rather than analysing it (which it still does sometimes), but the hallucination outside of the coding standards used have dropped dramatically and it's been quite effective. In use far more than any other Custom GPT, but only as a personal assistant and likely never to be release publically.


Jobber

Personalized, professional job application support.

This is a new Custom GPT to help me apply for jobs. I place a lot of emphasis on the cover letter to bring out the varied experiences I've had and how they would apply to a specific job (far more than the resume' would), so this one helps by analysing previous cover letters to see if a posted job is something I'm likely to be a strong candidate for. It also helps review cover letters for potential weaknesses so that additional effort can be made to shore up those parts of the application. As with most interactions with ChatGPT on a new subject, I like to get it look for weaknesses in the concept first as it tends to be a bit of a yes-man. It's actually pretty good at providing unbiased feedback when requested.


Tuesday, January 09, 2024

Card Chess Game Development: Expanding Strategic Horizons with Terrain Variety

In the fascinating world of game development, each day brings new opportunities to enhance player experience and add layers of strategic depth. Since our last update, we've taken significant strides in the development of the Card Chess game, particularly focusing on the implementation of diverse terrain types. Here's a glimpse into the progress we've made:


Introducing Terrain Diversity

Our primary objective was to enrich the strategic gameplay of Card Chess by incorporating various terrain types. This not only adds visual appeal but also introduces new tactical considerations for players. We implemented three distinct terrain types: Random, Chequerboard, and Balanced Random.


Random Terrain: In this setup, terrain cards (2s, 3s, and 5s) are randomly distributed across the designated terrain area, introducing an element of unpredictability to each game.


Chequerboard Terrain: We created a method to arrange the terrain cards in a chequerboard pattern, alternating between red and black suits. This layout offers a visually pleasing and strategically challenging terrain.


Balanced Random Terrain: A unique approach where each set of ranks (2s, 3s, and 5s) is shuffled independently and placed in a predefined 235532 pattern. This maintains a balance in rank distribution while still incorporating randomness.


UI Enhancements for Terrain Selection

To complement these new terrain types, we updated the game’s user interface. A dropdown menu was added to the opening screen, allowing players to select their preferred terrain type before starting a game. This feature not only improves the game's usability but also empowers players with more control over their game setup.


Code Refinement and Testing

A significant portion of our work involved refining the code to support these new features. We utilized constants for terrain rows to enhance code readability and maintainability. Thorough testing was conducted for each terrain type to ensure correct implementation and integration with the game’s existing rules and mechanics.


Looking Ahead

As we continue to develop Card Chess, our focus remains on creating an engaging and strategically rich experience for players. The introduction of diverse terrain types marks a significant milestone in this journey, opening up new tactical possibilities and game dynamics.


Stay tuned for more updates as we continue to evolve and enhance the Card Chess game!

Code Knight

Monday, January 08, 2024

Card Chess - Code Knight daily review

In the dynamic world of game development, creating an immersive and enjoyable user experience is paramount. Today's focus was a deep dive into enhancing a game known as Card Chess - a strategy game combining elements of chess with the randomness of cards. Our journey through various aspects of game development using C# and Myra, a UI library for MonoGame, offered insightful glimpses into the intricacies of building a captivating game.


Elevating the Endgame: The Win/Lose Screen

A crucial part of any game is its conclusion - the moment of triumph or defeat. We embarked on creating a win/lose screen that not only announces the game's outcome but does so while showcasing the final state of the board. The challenge was to overlay this information elegantly. By employing a semi-transparent screen, we managed to display the game's result while allowing players to view the endgame board state, enhancing the player's connection to the game's conclusion.


State of Play: Refining Game States

Next, we delved into the game's heartbeat - its state management. The GameState enum in CardChessGame.cs was fine-tuned to include specific states reflecting various game outcomes. This addition paved the way for more nuanced control over the game's flow, allowing for a more refined gaming experience.


User Interface: A Touch of Finesse

A significant portion of the day was spent enhancing the game's user interface. We replicated the CreateOpeningMenu method to craft a results menu, complete with a "Play Again" button - a feature allowing players to jump right back into action. To ensure clarity in communication, we added a label displaying the game's outcome, making use of the EndGameState. Attention to detail was key as we meticulously adjusted the positioning and padding of UI elements for optimal layout and readability.


Terrain Choices: Enhancing Strategic Depth

In a strategic twist, we introduced a terrain selection feature in the opening menu. A dropdown list, or ComboBox, was implemented, offering players the choice between different terrain types like "None", "Random", and "Chequerboard". This feature not only added a layer of depth to the game's strategy but also showcased how UI elements could be dynamically populated using enums for a streamlined codebase.


Behind the Scenes: Game and Board Logic

A significant discussion point was where to store the terrainType variable - in the game class or the board class. This decision hinged on the architectural and functional implications within the game. We also refactored the ResetGame() method to incorporate terrain type, illustrating the importance of adaptable and maintainable code.


Localization: Crossing Language Barriers

Finally, we touched upon the topic of localization. Using enums to populate UI elements like a ComboBox poses a unique challenge in a multilingual setting. We explored the use of resource files for localized strings, ensuring that the game remains accessible and enjoyable to a diverse audience.


Conclusion

Today's journey through game development highlighted the delicate balance between technical prowess and creative vision. Each line of code, each UI adjustment, and each gameplay tweak brought us closer to a game that not only challenges the mind but also delights the senses. As we wrapped up the day, it was clear that the art of game development is a continuous pursuit of perfection, where every detail contributes to an unforgettable player experience.

Code Knight

Wednesday, October 04, 2023

CardChess V006

 ChatGPT Summary

Over the past week, our discussions have mainly revolved around the implementation and debugging of a game simulation involving cards, players, and boards. Here's a quick summary

Game Implementation & Cloning
We explored designing classes like Card, Player, and Board and implemented cloning mechanisms to create deep copies of these objects, ensuring the original game state remains unchanged during simulations.

Minimax Algorithm & Simulating Moves
We implemented a version of the Minimax algorithm for determining the best move for a computer player in the game.
We introduced SimGameState to simulate game states for exploring possible future moves without affecting the actual game state.
Developed methods like ApplyMove and ApplySimMove to allow a move to be made in the simulated game state.
Introduced SimMove to handle moves within SimGameState, and methods to convert back and forth between Move and SimMove.

Scoring and Move Evaluation
Explored the logic of scoring and evaluating moves and developed methods like RankMoveForBoard and GetPlayerScore to estimate the value of a move or a board state within the Minimax algorithm.
Iterated on RankMoveForBoard and GetPlayerScore to consider various game scenarios and card states (like covered cards or cards covering an opponent's card).

Debugging and Refining Logic
Throughout our discussions, we worked through various logic and implementation challenges, ensuring that cloned and original objects are managed properly, and that moves in simulated game states are accurately represented and do not affect the actual game state.
Addressed specific issues like making sure that moves are valid, players' states are updated appropriately, and that the Minimax algorithm explores possible moves in a logical and efficient manner.

Future Steps
Potential next steps might involve further refining move evaluation logic, optimizing the Minimax algorithm, addressing any remaining bugs or logical inconsistencies, and potentially exploring additional features or variations of the game.

Wednesday, August 30, 2023

CardChess v0.05

Soo... I've been quietly developing CardChess as an experiment in using ChatGPT and AI-powered coding techniques. So far there has definitely been an improvement over doing it myself (mainly due to my lack of knowledge with MonoGame and the finer details of C#). It's also much more fun and collaborative using it more as a pair programmer experience. 

I've recently also cleaned up the opening menu with the Leonardo.ai generated art to the left (Stable diffusion skinned system)

Below is ChatGPT's summary of the project so far..


 ChatGPT Summary: 

As of your last update, the CardChess project is in the process of implementing computer-controlled players. The game can be played between two human players, and the basic structure and rules of the game have been implemented. Here are some of the key aspects that have been worked on:
  • Game Concept: The game concept, including the rules, the board setup, the movement of the cards, and the win conditions, has been defined.
  • Board Setup: The board is set up with a 6x6 grid, and the initial positions of the cards for both players have been implemented.
  • Card Movement: The movement of the cards, including the rules for valid moves and attacking, have been implemented. The Move class has been created to handle the movement of the cards, and the PlayableCard class has StartMove and FinishMove methods to handle the start and finish of a move.
  • Win Conditions: The win condition, which is covering both kings of the opponent, has been implemented.
  • Game States: Different game states, such as the opening menu, human turn, computer turn, and game over, have been implemented.
  • UI: The opening menu has been implemented, including the play button and the background. The game state is also being exported to a JSON file for future analysis and AI learning.
  • Computer Player: The framework for a computer opponent has been started, including the GetMove method to get a move from the computer player, and the ExecuteMove method to execute the move. The Player class has a GetMove method that can be overridden by the ComputerPlayer class. Currently the computer opponent only uses random moves.
  • Animation: Implemented the animation for the movement of the cards.

Pending tasks include:
  • Computer AI: Developing multiple AI opponents.
  • Testing and Debugging: Thorough testing and debugging of the game to ensure that it runs smoothly and without errors.
  • UI Enhancement: Enhancing the user interface, including the opening menu with opponent selection, clean up the game board, and the game over screen.
  • Game Analysis and AI Learning: Implementing the game analysis and AI learning features using the exported game state.

Monday, January 16, 2023

GameLog 2023-02

 Toward the end of last year the Steam stats in review reminded me of the old GameLogs and had a few hours of reminiscing. That also led to a new Year's resolution to kick them off again this year with a potential cover of iPad / Android games too. 


Software Inc - 16.5 Hrs - Pretty sure I've played it before, but a few new updates had me pick this one up to round out a return to Steam games over the holidays. A couple of attempts to get a fledgling company off the ground into launching its first game, but when it netted ~500K it felt like the game was essentially solved. Might come back at a later point and set a few moe challenges, like manufacturing my own console. 


HexRogue - 5.3 Hrs - Quick little strategy game combining catan-like maps into a tactical battler. Seems a little too quick, but still in beta.


Star Valor - 48 Hrs - Possibly not all in this year, but a neat little space privateer game with a bit more focus on building a posse' rather than going it alone. Only got into what feels like the mid-game in terms of ship size, but felt like I could see the finish line. Might try again when it's released.


Stellar Winds - 12h - Android idle space battler that uses ship styles to relatively good effect to make it not just a linear experience. 


Pokemon Purple - 3h - Switch pickup for the family for Christmas, largely driven by MissGooey's Pokemon craze that is still going strong. Giving it a whirl too.


Urban flow -1.5h - quick little switch co-op game with Sandy. Good frantic traffic light flippin'  


Tuesday, May 17, 2022

TournamentCompare v0.007 - The microsoft alternative

 After getting a standard user set up (so I'm not directly touching the admin account), the first step is to set up a new Power Platform environment to keep all the development tables and apps away from the default instance. I'm also tempted to have a Dev / Test / Prod environment too. Yep, may as well go full lifecyccle management from the get-go (It'll be in Dev for a significant chunk of time anyway).

Hmm, apparently the tenant doesn't have enough space for the database. Sure enough, database capacity is 0 of 0, No space allocated. Might see if  I can create the environment without the dataverse database and make afterwards. Hmm nope, still complaining about capacity constraints. Tried signing up for the developer plan for power apps, but it just took me to the same environment. Looks like Microsoft confirms that the developer plan cannot create environments. Oh well.

The next alternative is to create separate databases in the dataverse of the default instance and hopefully link them to separate solutions. Actually without environments the standard solution export / import isn't going to work. Possibly just use DevOps and branching?

Setting up DevOps it looks like my personal account had got there first to register VRBones. Since my personal account is also set up as a developer for Visual Studio, it probably makes sense to leave it there, so I just added the organisation admin and standard user to the mix and made a new TournamentCompare project. 

Upon looking into the DevOps integration it looks to be only with VS Team Services account. Ok, it looks like I'll just need to build out the app in default and keep it lightweight before deciding whether lifecycle management will help to push out anything.  

Tournament Template files created pretty quickly. Next step is to check the model-driven app and especially the self-referenced heirarchy.



Tuesday, May 03, 2022

Microsoft 365 and Power Apps development

Inspired by my new job at Best Practice, I have been looking at Microsoft 365 Dataverse and model-driven power apps as a potential replacement for TournamentCompare development (and possibly others). 

Although it looked like you could sign up for a free community / developer plan, it didn't like my hotmail address. Digging deeper it looked like all I had to do was have a custom domain, so I set up a dev account on tournamentcompare.com, but it still rejected stating it needed a O365 tenant (had expected such, otherwise it would have created all the back end anyway). 

It turns out what I REALLY need is a developer tenant for the entire Microsoft 365 suite, which comes with 25 sample E5 licenses and a 3 month extendable trial window. Super impressed with this offering and goes along the lines of Visual Studio being offered for free too. 

Initially it offered a sample userbase and SharePoint site for a trial, but since I had used the admin tools before I decided to go with the custom install and eschew the trial data, even though it warned on a possible 2 day setup timeframe. Luckily it was provisioned within a minute and sure enough, all the admin controls are available. 

Checking SharePoint and it has a boilerplate communication-style site already set up and admin back end ready to go. 

Jumping straight over to Power Apps and although it took a little to process, it was also provisioned and looks to be ready for development. Excellent, don't need the developer plan (kinda makes sense since I am already inside a dev plan for the entire tenant).

Popping over to Azure Active Directory and, as expected by now, it is also provisioned on a Premium P2 license. This will also allow a great sandbox for testing some of the potential dev opportunities at work (PIM springs to mind).

Overall super happy with the offering.

  

Wednesday, February 02, 2022

TournamentCompare v0.006 - The resurrection

 Now that I have some time to blow the dust off parked projects, TournamentCompare is back in active development. Since almost 7 years have passed, there has a been a pretty steep relearn and upgrade path to get back into the swing of things. 

Visual Studio 2022
Previously development had been exclusively on the laptop with a full install of VS2012, whereas with the community edition generally available I wanted to move it all over to my main PC. Most of the code came across, but the project had issues reconnecting the local files to the new version of SQLExpress. Rather than tackle the upgrade I assumed the laptop would make an easier upgrade path and, as I was taking it to Andrew's, would be required anyway. Over the course of the resurrection I bounced several times between old-but-working versions and the draw of a shinier interface with more integration. 

NuGet Package Management
On the laptop I was able to easily get the original project cloned and compiled under VS2022, but when I went to test a database field update, the scaffolding options for generating the controller and view failed due to requiring EF 6.4.4. After an hour struggling to upgrade 6.1.1 to 6.4.4 using the NuGet package manager (continually downloaded a 0kb package) I gave up and went back to the old code and VS2012 to at least confirm everything was actually working. As package management would definitely be needed eventually I returned after calming down and it was likely an artifact of storing the data on Google Drive. I didn't have much confidence in the cloned package so I looked to regenerate the project again from scratch. 

.NET Framework
When building a brand new project, the package management issues disappeared, but generating the EDMX and controllers from the SQL database seemed to be completely missing. It turns out that a new MVC project using default settings builds only on .NET Core and all the solutions I found for scaffolding out the model-controller & view were definitely NOT what I'd call helpful. To get a new project with .NET Framework elements needed additional components installed into VS 2022, but once up and running it quickly generated the model, controllers and views as expected. 

Bootstrap
I had re-read some of the initial blog posts and recalled the struggles with enumerated types. Instead of repeating the coding upgrades to maintain data-first capability, I revisited the initial clone of the code on my main PC and resolved most of the database upgrade and connection issues. NuGet was also working to deliver Entity Framework 6.4.4, but failed to clean up the old version properly (restart VS needed). Feeling confident I upgraded all other components and promptly broke the compile with bootstrap giving unexpected object errors. Looking into it, Bootstrap 3.x to bootstrap 5.x is just too big a jump, so chose just to downgrade. 

So after a couple of days it feels like I have revisited and relearned most of the foibles with Entity Framework and MVC to set off and actually make progress

ToDo:

 - Get Github integrated so I can develop on PC or laptop
 - Confirm everything is able to be published to Azure SQL & Azure apps
 - Build a few more tournament templates
 - Generate sample tournaments rather than record every single tournament instance when calculating bias. 
 - Generate bias using running methods for averages, std deviations and other aggregators.  



  


Monday, October 05, 2020

Bo'ness Dynasty Pt3 - King Maine McCinaed 'the reveler' of Lothian


(This is an AAR for Crusader Kings III. Year 867 start with the Earl of Fife - renamed to the Bo'ness Dynasty.)
Pt1 - High Chieftan Drystan
Pt2 - High Chieftan Cinaed of Lothian

Trained as an adequate bargainer, Maine made is name as the life of the party. A dear friend to vassals, foreign rulers and wandering knights, Maine's feasts brought many to Edinburgh and most stayed to add their sword or skills to the glory of Lothian. Under Maine's rule the Bo'ness line strengthened in number and power with most finding desirable matches around the banquet table and landed titles flowing from continued expansion throughout Ireland, England, Norway and Denmark.  

Although the Bo'ness family tree grew greatly, Maine himself had only one daughter, Anna, through his early years. Maine's dearest held the family hopes of alliance with France together with early betrothals to Armagnac, but by the time the marriage proposal came to fruition Aquitaine had split from Francia, taking Armagnac with them. Adding to the strife, the Bouchard rulers were swayed to Messalianism, a new heretical offshoot of the Christian faith. For this they were hounded and purged through holy war, leaving Anna stranded without a husband. Before Maine could bring her home, Anna's elderly father-in-law, Duke Bouchard, forced another marriage to the young genius, dashing hopes of future children and alliances. This would not do. Maine plotted to bring her home through any means to keep the Bo'ness heir safe. Soon Duke Bouchard died to mysterious circumstances.

With Maine approaching 40 and still no male heir to the throne, the marriage to 'Anna the wise' was annulled under suspicion of infidelity. Maine's 2nd wife, Alix de Trainel (also gifted with a marvellous intellect) soon lifted to become a magnanimous host of the ever more impressive feasts crowding the halls of Edinburgh. 2 more daughters graced the family line, but concerns were finally laid to rest when Adam, heir to the Lothian throne, was born with Maine over 45. Alix continued to have children, leaving 8 to share the heritage left behind by the time Maine died.

With lineage secured, Maine's final years were devoted to becoming a King in his own right. The kingdom of Alba had flourished in large part to the growing power base of Lothian, but increases in land and levees for Maine also meant increases to his leige. Coupled with King Cinaed V's tight relationship to the Bavarian King, he held a dominant position fielding almost 14,000 men at the height of his power. Another concern was the tanistry elective process limiting kingdom candidates to only those of the Ailpin house; it couldn't be ousted by Bo'ness candidates no matter their standing. An exit strategy had to be found. 

Maine's opening came with the mysterious death of King Cinaed V to a spider bite, succeeding to King Conchenn. While the new liege had lower prestige and less alliances, he could still field 8,000 souls if needed. Maine's troops had grown to over 6,000, but was unsure how the generally reliable family alliances would hold since all swore fealty to Alba as well. With additional alliances garnered through his children to Wessex and as far-flung as Florence, Maine pressed for independence alone as Conchenn returned from raiding Ireland. The Lothian elite were also bolstered by mercenary warbands to field over 17,000 once raised. As Alba's levees returned to their lands, the Retinue of Hengist and other warbands tore into Gowrie, demolishing the standing army and laying siege the capital. Unable to recall Lothian levees, King Conchernn's army depleted to a measly 4,800 that even his own mercenary hires could not recover from. After the first month the campaign had largely been won, leaving only a few harried skirmishes and sieges to seal independence.

Shortly after breaking the shackles of Alba, the Kingdom of Lothian was announced with all lands from Edinburgh to York under rule as well as holdings in Ireland, Norway, Denmark and the Netherlands. As the embarrassment of Alba's sudden fall from dominance over the northern realms sunk in, King Conchernn switched primary titles to the Kingdom of Norway to signify where his power base now lay. Alba is no more.    

Maine's drunken excesses finally took their toll as the obese king revelled his last feast. King Adam may be young, but has his own destiny and domain to lead now.  







Sunday, September 20, 2020

Bo'ness Dynasty Pt2 - High Chieftan Cinaed of Lothian

(This is an AAR for Crusader Kings III. Year 867 start with the single title of Earl of Fife and the start of the Bo'ness Dynasty.)


Cinaed took up the mantle of patron to the Bo'ness line amidst the turmoil of Viking battles for Scotland (Alba) and Northern England. With internal bickering between sons of Ivar the Boneless, other nations descended onto the confusion to tear out a piece for themselves. Cinaed helped himself to most of Lothian to surround his new capital at Edinburgh. Other regions of Ireland and Northumbria also came under the control of the Duke of Moray to add to Alba's dominance of the northern lands. 

In between local skirmishes and clams on the mainland, Cinaed also strengthened his presence on the Nordic coastline to completely supplant the Danes all the way to the Finnish peninsula as well as all mountain passes over into Swedish lands. 

Mercia moved in on Danes holding York to put even more pressure on established viking conquests. Cinaed also saw the opportunity to move in and take the prized capital of York, but missed the opportunity to compliment it with the fertile lowlands around Leeds, with the West Riding capital ceding to Mercia. Spoils were split on the Lancastrian coast as well with Cinaed holding Westmorland and the rest falling to an expanding Mercia. 

All was not happy families within the Alban Kingdom as easy Danish targets dried up. Strife started with the Earl of Lennox declaring rightful ownership of the Irish lands of Oriel, held by Cnes Bo'ness along with her norwegian estates in Traendalog. Mormaer Tadg from Atholl supported the claim to add vastly superior numbers to the equation and tore through the local Oriel defenses. With no formal alliance to assist, Cinaed changed tack and found an avenue to claim Lennox itself through somewhat dubious heraldry. He pressed the claim immediately and swept through the midland holding with ease and pushed into Atholl while their forces were preoccupied overseas on the nordic coast. As they pinned Cnes's troops into a final pitched battle, word reached Flaithbertach Neill that his domain is no more and, as a landless lord, his claim to Oriel is no longer valid.

Even though a few more petty claims over Danish lands rounded out the Cinaed's reign as one of expansion, the internal fractures of Alba hinted at an independent future for the Bo'ness line. 




Sunday, September 13, 2020

Bo'ness Dynasty Pt1 - High Chieftain Drystan

 (This is an AAR for Crusader Kings III. Year 867 start with the Earl of Fife - renamed to the Bo'ness Dynasty.)


Drystan is the earliest known landholder for the Bon'ess Dynasty. Although there is no record of his early life or even how he came to hold the Mormaerdom (Earldom) of Fife, Drystan is likely to have come from Gaelic tribal lands between Edinburg and Linlithgow during the time of viking raids and great upheaval.  

Under the Kingship of Causantin II of Alba, Drystan had relative independence and sought a path to take over Edinburg to claim his homeland. With Ivar the Boneless raiding from the west and Jorvik pushing up from York, Drytan's meagre army could not hold claim for long on the Lothian capital, and eventually fell to Danish hands along with Northumbria. Disheartened, Drystan looked to Linlithgow instead. 

Both Sterling and Linlithgow were held by fellow vassal MacMuirdach. Although internal fighting was not unheard of, MacMuirdach held double the lands and could command almost 1000 tribesmen. Through marriage of Drystan's youngest son into the line of Prince Rhodri 'the great' of Gwynedd, the alliance yielded almost 2000 men to call upon and press the homeland claim. Stirling would fall 5 years later.

With Danish kings vying for Ireland, a small window of opportunity opened to allow Drystan to pinch Oriel from one of the smaller invaders. Alba also allied with Meath to control the top of Ireland until Bjorn 'Ironsides' headed west and dominated. 

Alba turned back to the mainland and forced claims on Strathearn's heart, taking Glasgow from the independent Kingdom. Drystan followed in on the weakened Cumbrians to pick up Kyle and surrounds, leaving Carrick and Galloway to fall soon after to Ivar the Boneless, giving continuous land from east to west across Scotland.

As a more established Earl and finding favour with Moray, Drystan continued tussels with smaller independent Danes on the Nordic coastline, gaining foothold in Bjorgvin and pushing north all the way round to Raumsdale. Enough land was gained to usurp the Vestlond title and elevate Drystan to High Chieftan. 

As an ill-fated holy war between Alba and The Isles was drawing to a close, Ivar the Boneless succumbed to injury and left his nation shattered between siblings. With Lothian falling to Jarl Godfrid separate to The Isles, Drystan pounced on the opportunity to take entire duchy in one bold claim. Calling on all allies and additional mercenaries the weakened Danes fell to a 4,500 strong army, but before the final sieges ran their course Drystan succumbed to old age. His dream of ruling from Edinburgh came 3 months later for the Bo'ness line.