Sunday, April 10, 2016

Darkest, Darkest Dungeon - The Hamlet, The Ruins

The Hamlet

Much work to do. Once a bustling hive of activity, the hamlet offered little in service. It, too, had felt the harsh sting of my lineage’s demise. Boarded up and left to time’s grasp. Rising above the rooftops our mansion silhouetted the sky with exposed beams like festering claws. No place to stay anymore.

We need fresh souls to infuse life into this dilapidated estate, and for that, a restoration of the stagecoach network is my first priority. With deeds and crests of sovereignty, the veins of commerce were once again revived.

Canouville was the first to alight into our bleak domain, an aspiring Vestal with judgemental vigor. Raoullin also made the journey, but his proclivity to plague made for an awkward commute. Our assembly is enough to embark upward into the ruinous remains of my bloodline.

The Ruins

With limited provisions we set out to my ancestral home. Gothic architecture rising above once demanded respect, now webbed in neglect it portrayed a more sinister abode. Leading the way through the grandiose entrance, I halted at the sight of candles bracing a raised altar beneath a muralled monk. Lit candles. Apprehensive we scanned the foyer, but skeletal remains adorning the windows only indicated a prior, more murderous occasion.

Ever east through creaking door to a corridor festooned with derelict shelves of vellum and decaying plaster. Still nothing, but the tension eats into Dismas and I as we exchange nervous glances. Of note, an unburned torch held aloft, poised for a task long forgotten. We will give it purpose again.

Up ahead, a strongbox placed proudly in the vaulted chamber drew our gaze while a rabble of bones lurched toward us in animated fits. “To Arms!”

Raullin, silent as ever, reacted first with a puff of emboldening vapours to break my shocked condition and keen the senses. Dismas drew and fired forcefully, splintering bone and exploding whatever foul mastery held its frame together. “Back to the Pit!” He raged. I followed with my own critical smite to blanket the floor with unholy remains. They CAN be fought, they CAN be beaten!

Our attention turned to the reinforced chest. Surely no sober logic leaves this prize so openly on display? A trap? Dismas dared the lock with well-seasoned expertise and proffered up coin, scriven records of land grants and an unlikely shovel. “We’ll be needing that” announced Canouville, scouting the upcoming passageway. True enough, a crude jumble of stones and debris stood tall, defying our advance. Protruding corpses of unknown labourers mocked our attempts to clear the rubble, but with grim determination and spaded steel we overcame the obstacle.

Lying in wait, a brace of skeletons lumbered toward us, backed by a masked cultist. Grapeshot peppered them all as Dismas took command, urging us into the fray. Raoullin let loose a blinding flask of fireworks toward the surprised acolyte while I zealously accused the leading skeletons; “Destroy. Them. All!” My words ripped through what fabric of control bound the bones together, leaving one in a clattering heap and the other wavering. Delivering holy judgement upon the stunned cultist, Canouville’s call boomed bright to rip clear the mask and expire the eyes behind it. The remaining soldier of bone took a grave slash toward our group, catching Canouville off guard. Dismas closed with knife in hand, but skilled execution in bloodletting offered no assistance in felling the calcified corpse, leaving the fatal blow to my own hand. A faint hope blossoms.These creatures seem poorly constructed and easily overpowered by zealous might.

Through the portico into another ruined expanse. No ambush or assault, but a choice of paths for consideration. We head East, more through comforting routine than strategic merit.

The torch, our lifeblood of sanity. Slowly ebbing into shadowy cocoon.

Saturday, April 09, 2016

Darkest, Darkest Dungeon - Reynauld the Crusader

Reynauld the Crusader

As the stagecoach wheels clattered along the cobblestones leading to our venerable house, I held the note loosely, hoping that the pored-over words would shake into a more enlightening alignment. The lanterns held back the darkness, but offered little comfort to my wandering mind. Memories of playing in the cavernous halls of that old house flooded back.

An unearthly howl pierced the night and broke me from my reverie. The startled horses bucked out and couldn’t be contained by the driver’s whip. We left the road to an even bumpier excursion before clattering to a halt minus a wheel and our means of locomotion. Dismas and I were unscathed, but alone as the coach driver scurried after the fleeing mares, a torrent of cursing that trailed into the blackness.

“I guess this means we are on foot?” Queried Dismas. 

We left the luggage for a future return and headed East. Ever East. The hamlet is just ahead.

A grizzled thug stepped out to block our path, but we were in no mood to talk. Dismas, good with a knife, opened his veins while I landed a pommel strike to daze him for a moment. He recovered quickly though and still managed a slashing uppercut that caught my brow. Move quicker or die. Dismas dispatched him with ruthless efficiency to bring the tempo back to an eerie night’s walk. The gold will help, if only to make the tavern that much more enticing upon arrival.

Ever East.

A disheveled tent came into view, but no movement betrayed its owner. Possibly the lowlife bleeding out back on the road? Dismas wasted no time in claiming the additional gold and misappropriated onyx. 

Another ambush! We’ll send them a message that the rightful owner has returned and there is no place for these vermin. Dismas was quick to shoot, but the grapeshot missed both the larger, whip-wielding brigand or the fusiler toward the back. I landed a stunning blow to curtail the bloodletter’s flaying, but couldn’t escape the blanket fire that erupted into the night. Back to the knives for Dismas as we focused on the heavy-set villian to drop him quickly. The whip was our concern, but a point blank shot drove me away before returning with my own justified strike. Prodigious size alone does not dissuade the sharpened blade. 

Pelted with blanket fire, Dismas and I took shelter behind the fallen mass, but the rain of shrapnel didn’t cease. Exploding through the bloodied carcass, we set upon the rifle-clad bandit with steel. As the fiend fell, a faint hope blossomed. 

Portraits, deeds and crests of my heritage lay with the fallen, but I will make something of them in time. More gold to be relieved too, but the hard-won chest held nothing but blight. 

My return was not met with adulation. These squalid lands, these corrupted hovels are mine to rebuild, but the populace remain ambivalent. I, too, fear they may be right. Stress rises when I see their downcast husks.

Darkest, Darkest Dungeon - An Unwelcome Letter

An Unwelcome Letter

“Ruin has come to our family. “
“You remember our venerable house? Opulent and imperial, gazing proudly from its stoic perch above the moor. I lived all my years in that ancient, rumour-shadowed manor, fattened on decadence and luxury”
“And yet I began to tire of conventional extravagance. Singular, unsettling tales suggested the mansion itself was a gateway to some fabulous and unnameable power.”
“With relic and ritual, I bent every effort towards the excavation and recovery of those long buried secrets, exhausting what remained of our family fortune on sworly workmen and sturdy shovels.”   
“At last, in those salt-soaked crags beneath the lowest foundations, we unearthed that damnable portal and a deluded evil. Our every step unsettled the ancient earth, but we were in a realm of death and madness.”
“In the end, I, alone, fled laughing and wailing through those blackened arcades of antiquity until consciousness failed me.”
“You remember our venerable house? Opulent and imperial.”
“It is a festering abomination!”
“I beg you, return home! Claim your birthright and deliver our family from the ravenous, clutching shadows of the darkest dungeon!” 

Monday, March 28, 2016

Kitesurfing Memories

Finally got a woo to measure jumping height, and March delivered a 2 weeks spell of near 20 knot days to test it out. This video was of a particularly clean day in the run-out channel at 1/2 tide. Such a smooth section. Such a lovely day to be out on the water. Such a great time going higher and higher!

TournamentCompare v0.004 - Player Pools

One slight deviation from the old Clarion application is that I have instituted player pools as a starting point for a tournament. All players for a tournament are entered into a sorted list (player pool) that the tournament template draws from. This allows the generation of the player pool to be independent from the tournament template and can therefore be used to test all sorts of varied starting positions and even seeding patterns.

For smaller tournament formats (8 players or less), every possible player pool combination can be generated and used in sequence to eliminate another possible bias. For 8 players this would be 40320 combinations (8 factorial). If a tournament is larger than 8, you could potentially take the top 8 combinations and interleave other random players to give 16, 32, 64, or 128 player pools. This would give a large control set (~40,000 samples), but at least give a somewhat even spread of higher candidates.Unfortunately it would also eliminate the random chance that the most skilled player meets the second most skilled player in round 1 of a 128 player tournament. Since generating a random player pool will be quite easy, I can also test the difference of these two formats and isolate a specific amount of bias due to potential seeding.      

TournamentCompare v0.003 - Validating a tournament template

Because the tournament template system is flexible enough to allow all sorts of formats, it is also flexible enough to bring in all sorts of loops, missing players, unlinked matches, etc, so I'll be making up a validator to vet each tournament template before running thousands of tests on an invalid tournament.

Here's the high level pseudocode:

  1. Start with the final match and work back along the player entry locations until all matches have been processed into a list (vettedMatchList) and all the players are in another list (competitorList). This also sets the match layer (how deep into the tournament that this match represents)
  2. Check to make sure that all TournamentTemplateMatches for this TournamentTemplate have been accounted for.
  3. Check to make sure that all competitors have an entry into the tournament
  4. Build a list (noExitMatchList) for each match that 2nd place continues in the tournament.This is combined with the match layer to evaluate final exit position for 2nd placegetters that do NOT continue.
  5. Mark the tournament as valid and update the database with match layers & exit positions. 

Wednesday, December 02, 2015

New bridle for 14m

13-16Kn, NE Archie's (40mins)
The pulleys had worn through the outer sheath of the original 14m bridle lines a couple of weeks ago. I'd been using it a little more regularly, but hadn't noticed the pulley had collapsed and was pushing the lines up against the sharp edges of the pulley wall. Both sides had collapsed so I think they may have been on the way out for a while but I hadn't noticed.  Eventually decided to hand it over to Wardy for replacement as the inner core didn't look like it would last more than a session.

I finally got to test the 14m today and it performed better than I remember. The canopy remained full even with agressive turns and delivered smooth power coming off turns. I had to trim in the centre lines like my 10m, but I was contemplating doing that from a couple of performances before the bridle replacement anyway.

All set for a couple of big days if the predictions are accurate.


Island Jumping

The changing sands of Elliott River mouth have formed a small point in the Northern channel that gets covered over at 1/2 tide. I've been using this point for a while to use clean water on the inside of it and a boost into the (somewhat) deeper water on the other side. A few weeks ago I got a good lookback at the point just before it went under:

Wednesday, November 04, 2015


Last time I was down at Burnett heads I lost the camera in the mud, so a couple of months and another Kogan action camera later I finally have footage of the smoothness behind the wall on a clean 20+ Kn day.

Monday, August 24, 2015

TournamentCompare v0.002 - Enumerated Types in data first MVC

After tinkering with the controllers and views, I decided to look into a way to display the enumerated types used to set where the players were previously before this match. Ideally I wanted a radio control (as I had in Clarion), but the formatting eluded me for a super clean and simple implementation without losing data first design. In the end it turned out to be easier as a byte-stored enumerated type that can then be edited as a droplist.

Tournament Templates

One of the main parts of the program is to be able to put together any tournament format and then be able to run through thousands of tests to see the inherent bias of the tournament type. The tournament templates to be tested would then need to be anything from single elim, round robin, double elim, swiss, world cup rounds into single elim, etc. To achieve this, each tournament template would be a combination of TournamentTemplateMatches where each match accepts the 2 entering players from either the original player pool at the start of the tournament, another match previously held (Eg: single elim final match accepts the winners from the semifinals matches), a round robin subtournament, or an aggregator of previous scores to create a subtournament pool of ranked players.

Because each match could be pointing back to another match or another round (I'm assuming that subtournament aggregators can be handled by the round template with no rounds), I needed a concrete way of storing which type it was. Setting the PreviousType to "Match"would also mean that the PreviousMatchID is now valid, whereas if "Round"was the previous type then the PreviousRoundID would be valid.

Enumerated Types in data first MVC

Ideally I'd like to see in the database the type listed so that the data is a bit more human readable, but after investigation it seems that C# prefers integers or Bytes as the underlying enumerator value. I'd debated changing them to integers, but decided to use bytes instead (Tinyint in SQL) so that they appear as a different type in not to be confused with an ID. Changing the database wasn't too hard after manually changing the data to conform, then updating the field type in the designer.

Because I want to continually bring in database changes, I was keen to find a way that left the enumeration types already bound. I'd initially added the types in as another model, but found out later that you can add them directly into the model designer of the database with a right click > add >  enum  or by adding it to the enum types in the model browser. You can then change the fields to the new enumerated type. Doing this way it maintains the enum inside the database design (and scope) and also doesn't drop the assignment of the enum when the database is reloaded.

The display fields handled the enum perfectly, but the editing fields treated it like a string. There was some additional code to manually change the @html.EditorFor() to a @Html.EnumDropDownFor(), but I really wanted to be able to regenerate the controllers and views for any data first changes, so eventually settled on adding a html helper to overload the EditorFor() when an enum is detected.