Wasteland – Twenty Six Years Later

At the front of the original Wasteland manual was a short note from the programmer, describing tradeoffs that were made during the development to enable certain features to be present. The note ends with the following text:

Wasteland_CoverartThere’s a lot for you to see and do throughout the game, but you don’t have to follow any single path for success. There’s plenty of room to goof off in this game. So don’t sweat it if you don’t know what something is used for — you might not even need it to win. But don’t make too many judgement errors too many times, or victory will slip farther and farther away. We can’t make it too easy to win, after all.

 

After you finish Wasteland the first time (for which we congratulate you), you can go back and check out all theplaces you didn’t get to fully explore the first time through. Play it again; try things a different way. It’s not over when it’s over.

 

I doubt that, at the time, the writer could have possibly envisioned the way that final sentence – “It’s not over when it’s over” – would manifest itself. Or that it would be twenty six years before it did.

Continue reading

Returning to Norrath

I have played pretty much all of the major MMORPG releases, if not at retail then at least in betas. While not the first MMO I had played, EverQuest was certainly the one that is the most memorable for me.

eqstuff

Some of my old EverQuest stuff – Yes, even EQ Online Adventures

I started on release day (March 16, 1999) with a group of local friends that had all decided to buy the game based on the excitement one of our number expressed while participating in the beta, and had soon formed a guild that became one of the top dozen guilds game-wide in the pre-World of Warcraft days.

In the 15 plus years since its release, the original EverQuest has seen 20 expansions. As a guild, we retired around the time of the Dragons of Norrath expansion (Early 2005) and moved on to other things. Some of us played EverQuest 2 (released in November 2004) for a while as well, which probably contributed to retirements from the original EverQuest.

Last month (April 2014) Sony Online Entertainment changed up their All-Access subscription, dropping the price and adding EverQuest, EverQuest 2, PlanetSide 2, DC Universe Online, and Dragon’s Prophet to a single subscription. Also included when they are released will be Landmark and EverQuest Next.

At some point over the years, Sony had converted their games to a free-to-play model, introducing an in-game store selling items and features for real-world cash. I had popped back into both EQ and EQ2 a couple of times over the last decade to see how things looked, and with the revamp of the All Access pass, I decided to reactivate my subscription and take the old games for a spin.

Continue reading

Numenera – First Impressions

I picked up the Numenera core rulebook a short while back. For those not familiar with Numenera, this is a new pen-and-paper role-playing game from Monte Cook, the long time TSR author, and producer of various D&D publications, including several items from the Planescape setting, and founder of Malhavoc Press, a producer of D20 supplements.

MCG-Numenera-Cover-CorebookNumenera was funded on Kickstarter, raising over $500,000. Unfortunately, by the time I found out about it the Kickstarter campaign had ended, so I picked up my copy on Amazon.

The setting is described as “Science Fantasy”, and takes place on Earth about 1,000,000,000 (yes, one billion) years in the future. Over this vast stretch of time, our world is now unrecognizable. Several civilizations have arisen, thrived, and fallen over the course of this time, with the game detailing the setting of the Ninth World, built upon the rubble and ashes of the eight great civilizations that came before it.

Continue reading

Humble Spring Sale

HumbleSpringSale

The Humble Store is running a spring sale from May 6th through May 21st, with some pretty good savings on a number of games, including some recent titles like Thief and South Park : The Stick of Truth.

10% of all Humble Stores go to charity, and their weekly and roughly monthly pay-what-you-want deals are usually pretty good for picking up games and occasionally other items (right now the main Humble Bundle is a set of digital comic books).

Most of the games net you Steam keys, so you will need a Steam account to redeem them.

Kickstarter Delivery – Veronica Mars

Back in April 2013, I joined 91,584 other people and contributed to the Kickstarter campaign for the Veronica Mars movie. I had never seen the series at the time, but I had heard from a few people that it was really good, so I backed the Kickstarter and went hunting for the DVDs of the TV Series online. I was able to get each season for about $12 each by keeping an eye on the prices over a couple of months.

My wife and I both really enjoyed the series, so when the backer streaming version of the movie was released on the day it came out in theaters we sat down and watched it, though the streaming quality wasn’t that great. The sound kept getting out of sync just enough to make it look like a badly dubbed film. Bad sound sync always seems to be distracting in a movie for me, so while I enjoyed the film itself the overall experience wasn’t the best.

When I got home today, though, I found the final part of my Kickstarter reward for the campaign waiting for me:

vmars

 

The packaging is decidedly no frills (no printed insert – just the case and the disc), but I expect that it is the same as the retail DVD that is coming out tomorrow. That packaging seems to be the case more and more for DVDs these days.

Some time this week, we will sit down and watch the DVD version, without the distraction of the weird sound issues. I’ll also be interested to watch the documentary about the making of the movie that is included on the disc.

As an aside, so far (knock on wood) everything I have backed on Kickstarter (9 projects at this point) has either delivered as promised or is moving along smoothly – in fact, I just exited Wasteland 2 before typing up this post.) Generally I think a lot of the problems people have with Kickstarter campaigns come from not really thinking about how realistic the campaign’s goal is before jumping in. I know I’ve seen several that I thought were interesting, but the lack of detail on how exactly the producers were going to accomplish what they were planning has steered me away from them.

Active Directory Authoritative Restore

One of the things I hope to do with this blog is post tidbits of information that I come up with after resolving an IT-related problem. Things that were not immediately obvious when searching around the internet to research the issue. Hopefully if other people run into the same problem, they will be able to benefit from these posts. Of course, all of the standard disclaimers apply – this worked in the environment I was in. Your environment might be different. Always backup first, your mileage may vary, etc 🙂

Over the weekend, I was asked to assist with a problem. About 500 user accounts had been accidentally deleted from an organization’s Active Directory. Their AD domain is a child domain of a larger forest, and the deletion had come from a user in the domain above them.

The network in question was running Windows 2008 R2 for some of their domain controllers, but several were still Windows 2003, so the functional level was still at 2003. This means that the Active Directory recycle bin feature was not available. Given the size of the deletion, it was necessary to perform a restore from backup.

Once we had done the tape-based restore, blocked incoming sync traffic, and marked the objects on the restored domain controller as authoritative, we attempted to use repadmin to push the changes out from the restored DC with:

 

repadmin /syncall (dc name) /e /A /P /d /q

 

and monitor the replication with

 

repadmin /showreps (neighbor dc name)

 

But we kept receiving an error message from /showreps stating that:

 

Last attempt @ YYYY-MM-DD HH:MM:SS failed, result 8418 (0x20e2):
"The replication operation failed because of a schema mismatch between the servers involved."

 

Upon investigation, it turned out that the admins in the parent domain had issued a schema update related to a custom AD attribute on the same day as the deletion took place, meaning that the NTDS backup from the night before did not contain that schema update, but did contain the user accounts and group membership that needed to be restored.

The solution turned out to be ensuring that the objects in the restored DC were authoritative and then enabling incoming replication traffic on the DC:

 

repadmin /options (ServerName) -DISABLE_INBOUND_REPL

 

This allowed the schema update to complete, which enabled replication between the restored DC and the rest of the domain. After this was done, the /syncall replication performed normally. We then performed a second push to ensure group memberships were updated. When doing an authoritative restore it is possible that group membership lists will be pushed before user accounts are created, so when the group is replicated the users that don’t yet exist won’t be in the replicated group. Pushing the groups a second time (after all of the user accounts are replicated) resolves this problem.

All in all, it took a few hours, but the problem was resolved without any major disruption.

Portal 2 Mod – Thinking with Time Machine

Portal and Portal 2 are very near the top of my list of all-time favorite games. The original game was simply so well done that I was overjoyed when they announced a sequel. Even though the second game was considerably longer than the first, I finished Portal 2 in a single sitting, and have gone back through it several times. I’ve also played all of the co-op levels with a friend.

Along comes Steam user Stridemann with a mod for Portal 2 that adds an entirely new twist to the puzzle solving fun : A “Back to the Future” styled tablet that lets you record and play back your actions so that you can interact with your past self in order to complete test chambers. Called “Thinking with Time Machine” (a rather unfortunate play on the Thinking with Portals tagline), the mod is free as long as you own Portal 2 (and if you don’t, you should!)

 2014-05-02_00001Handing myself a cube!

One of the primary mechanics in TWTM is recording yourself crouched by a wall you would not normally be able to jump to so that you can replay yourself doing so and jump onto your own back and up onto the ledge. This is the first mechanic you learn in the mod, and one that is used extensively throughout, but it is by no means the only one.

You will need to have your clone do things like pick up cubes and bring them to certain locations where you will later come along and take them from her. Since objects like blocks and spheres, and the environment, are not effected by your personal time machine, you need to make sure the circumstances for your clone interacting with them are correct before replaying your actions.

The result is an enjoyable twist on the standard Portal puzzle mechanics, and rather like playing coop by yourself (without having to wonder what in the world the other person is doing/thinking. If you are wondering that while playing TWTM, well…) There are a few things to learn that aren’t really documented anywhere that I’ve been able to find (the keys do flash quickly in in-game animations on the walls of the early levels):

  • Press “R” to start a recording, and “Q” to end it.
  • Press “F” to begin playing back your most recent recording (you can only have one)
  • When you play back a recording, all open portals will close as if you went through a discouragement field
  • Your clone’s portals are separate from your own. You can both open orange and blue portals, but your portals connect to your portals and hers connect to hers
  • Balls don’t necessarily observe the rules of gravity as we understand them. Chamber 5, I’m looking at you!


2014-05-02_00003

My clone creating portals

While a bit short (the test chamber numbers go up to 9, though the last one doesn’t involve much other than a cutscene), TWTM is a very enjoyable mod. The difficulty progression seems about right, and while there are occasionally areas where timing is important, it never really becomes a “twitch” game, making thinking through the puzzles the primary challenge rather that needing to jump at exactly the right second from exactly the right spot.

The author has hinted at the possibility of a way for others to make TWTM levels, but hasn’t released anything along those lines yet. I would love to see the mod expanded upon with new chambers.

Steam Sale – Star Wars Franchise

starwars_sale

Steam is running a weekend long sale of everything Star Wars in honor of Star Wars Day (May the 4th be with you!). All of the titles are 66% off until Monday. The titles include:

Star Wars Collection 2014
Star Wars Battlefront II
Star Wars Jedi Knight: Dark Forces II
Star Wars Jedi Knight: Jedi Academy
Star Wars Jedi Knight: Mysteries of the Sith
Star Wars Republic Commando
Star Wars Starfighter
Star Wars The Clone Wars: Republic Heroes
Star Wars The Force Unleashed: Ultimate Sith Edition
Star Wars The Force Unleashed II
Star Wars Dark Forces
Star Wars Knights of the Old Republic
Star Wars Knights of the Old Republic II
Star Wars Empire at War: Gold Pack
Pinball FX2 – Star Wars Pinball: Balance of the Force Pack
Pinball FX2 – Star Wars Pack

 

Cool Kickstarter Projects – Rollable D4s

One thing you can never have as a tabletop RPG player is too many dice. Ok, so my wife might disagree with that statement, but I stand by it! Every few years, someone comes up with a way to make a new type of dice (remember the d30’s and the 100-sided dice?)

A Kickstarter user by the name of Leo Atreides from the UK has a project that is about halfway through the funding period to produce “rollable” four-sided dice. I’m not certain I actually need a differently shaped d4, but they do look sleek.

rollabled4

He lists free international delivery, and for £10 (that about $17 US Dollars) you can pick up 8 dice (four of your choosing and four of theirs) plus any stretch goal items that wind up getting funded. Assuming you end up with a few extra dice from the bonuses, that should work out to less than $2/die, about twice what dice sets go for on Amazon, but they don’t have these on Amazon… 🙂

You can visit the Kickstarter campaign to learn more or back the project.

 

A PowerShell Snake Game

As a network administrator, PowerShell is just one of those tools that, once you use it, you can never imagine doing a lot of admin tasks without it.

Interested in Powershell games? Check out my new Powershell Match Three game

 

Given it’s similar structure to other languages, I picked up on PowerShell pretty quickly, and while doodling around with it decided to try using it for something for which it was really never intended. After all PowerShell is awesome for automating data loading, updating Active Directory attributes, generating reports or extracting data to build a dynamic HTML snippet to be served up by a web page, but there are GAMES to be considered!

So here is my PowerShell game. The classic “Snake” computer game, allowing you to use the arrow keys on the keyboard to hunt down and eat apples (stunningly represented by a red @ sign – I know, the graphics are impressive!)

Powershell_Snake

 

Below is the (fairly heavily commented) result (along with a .ZIP file to download the script at the bottom of the page in case copying and pasting from a website isn’t for you – and does that ever work right?)

The script utilizes PowerShell’s RawUI functionality to position the cursor to write individual characters. Each segment of the snake’s body is stored in an array, but when the snake moves forward, the only “drawing” that takes place is to remove the last block of the tail and draw the new head block.

In most games, you would clear and redraw the entire screen after every frame, but given the interpreted nature of PowerShell, it just isn’t fast enough to do that. Even this method is pushing it once the snake grows a bit. Things get slower over time as more blocks need to be checked to determine if the snake has run into itself. The code here could be improved upon – for example, it should be possible to determine a general slowdown rate as the snake grows and adjust the sleep near the end of the script (that delays between each frame) to eliminate at least some of the lag. Since this was a project for an hour of free time, I didn’t go that far with it.

Update: See the comments for Dave Wyatt’s update that changes the way the tail is checked for his and removes the slowdown completely 🙂

I do have a couple more ideas for games that could be written in PowerShell when considering the speed restrictions, so we’ll just have to see if they every make it into .PS1 files. In the mean time, enjoy chasing the apple…

#requires -version 2

#
# Powershell Snake Game
# Author : Kurt Jaegers
#

#
# Draws the snake to the screen, including cleaning up the last segment of the tail
#
function DrawTheSnake
{
 
  # Erase the tail segment that is disappearing
  $rui.cursorposition = $tail[0]
  write-host -foregroundcolor white -backgroundcolor black -NoNewline " " 
 
  # Shift all of the tail segments down one
  for ($i=0; $i -lt ($tailLength - 1); $i++)
  {
    $tail[$i].x = $tail[$i+1].x
    $tail[$i].y = $tail[$i+1].y
  }
 
  # Set the last segment of the tail to the current position
  $tail[-1].x = $coord.x
  $tail[-1].y = $coord.y
  
  # Draw all segments of the snake  
  for ($i=0; $i -lt $tailLength; $i++)
  {
    $rui.cursorposition = $tail[$i]
    write-host -foregroundcolor white -backgroundcolor white -NoNewline " "
  }

}


#
# Generate a random location for the apple, making sure it isnt inside the snake
#
function MoveTheApple
{ 
  $ok = $true;
  do 
  {
    $script:apple.x = get-random -min 2 -max ($rui.WindowSize.width - 2)
    $script:apple.y = get-random -min 2 -max ($rui.WindowSize.height - 2)
    $ok=$true
    for ($i=0; $i -lt $tailLength; $i++)
    {
      if (($tail[$i].x -eq $apple.x) -and ($tail[$i].y -eq $apple.y))
      {
        $ok=$false;
      }
    }
  } While (!$ok)
}

#
# Draw the apple to the screen
#
function DrawTheApple
{
  $rui.CursorPosition = $apple
  write-host -foregroundcolor red -backgroundcolor black "@"
}

#
# Check to see if the snake hits the apple
#
function CheckAppleHit
{
  # if the x/y of the head matches the x/y of the apple, we hit the apple
  if (($tail[-1].x -eq $apple.x) -and ($tail[-1].y -eq $apple.y))
  {
    # relocate the apple
    MoveTheApple
    
    $score += 500
    
    # Add to the snake's length
    $script:tailLength++
    $script:tail += new-object System.Management.Automation.Host.Coordinates
    $script:tail[-1].x = $coord.x
    $script:tail[-1].y = $coord.y
  }
}

#
# Check to see if the snake's head hits the walls of the screen
#
function CheckWallHits
{
  if (($coord.x -eq 0) -or ($coord.y -eq 0) -or ($coord.x -eq $host.ui.rawui.windowsize.width-1) -or ($coord.y -eq $host.ui.rawui.windowsize.height-1))
  {
    cls
    write-host -foregroundcolor red "You lost! Score was $score"
    exit
  }
}


#
# Draw a fence around the edges of the screen
#
function DrawScreenBorders
{
  $cur = new-object System.Management.Automation.Host.Coordinates
  $cur.x=0
  $cur.y=0
  
  for ($x=0; $x -lt $host.ui.rawui.windowsize.width; $x++)
  {
    $cur.x=$x
    $cur.y=0
    $host.ui.rawui.cursorposition = $cur
    write-host -foregroundcolor black -backgroundcolor white -nonewline "#"

    $cur.y=$host.ui.rawui.windowsize.height-1
    $host.ui.rawui.cursorposition = $cur
    write-host -foregroundcolor black -backgroundcolor white -nonewline "#"
    
  }
  
  for ($y=0; $y -lt $host.ui.rawui.windowsize.height-1; $y++)
  {
    $cur.y=$y
    $cur.x=0
    $host.ui.rawui.cursorposition = $cur
    write-host -foregroundcolor black -backgroundcolor white -nonewline "#"

    $cur.x=$host.ui.rawui.windowsize.width-1
    $host.ui.rawui.cursorposition = $cur
    write-host -foregroundcolor black -backgroundcolor white -nonewline "#"
    
  }  
}

function CheckSnakeBodyHits
{
  for ($i=0; $i -lt $tailLength -1; $i++)
  {
    if (($tail[$i].x -eq $coord.x) -and ($tail[$i].y -eq $coord.y))
    {
      cls
      write-host -foregroundcolor red "You lost! Score was $score"
      exit
    }
  }
}

# ---------------------------------
# ---------------------------------
# Main script block starts here
# ---------------------------------
# ---------------------------------

# Grab UI objects and set some colors
$ui=(get-host).ui
$rui=$ui.rawui
$rui.BackgroundColor="Black"
$rui.ForegroundColor="Red"
cls

# write out lines to make sure the buffer is big enough to cover the screen
for ($i=0; $i -lt $rui.screensize.height; $i++)
{
  write-host "" 
}
$coord = $rui.CursorPosition
$save = $coord
$cs = $rui.cursorsize
$rui.cursorsize=0
$score = 0

$done = $false

$before = 0
$after  = 15
$dir = 0

$coord.X = $rui.screensize.width/2
$coord.y = $rui.screensize.height/2

$coord.x = 80
$coord.Y = 15
$apple = new-object System.Management.Automation.Host.Coordinates
DrawScreenBorders;
MoveTheApple;

$tail = @()
$tailLength = 5

for ($i=0; $i -lt $tailLength; $i++)
{
  $tail += new-object System.Management.Automation.Host.Coordinates
  $tail[$i].x = $coord.x
  $tail[$i].y = $coord.y
}

while (!$done)
{
  
  if ($rui.KeyAvailable)
  {
    $key = $rui.ReadKey()
    if ($key.virtualkeycode -eq -27)
    {
      $done=$true
    }
    if ($key.keydown)
    {
      # Left
      if ($key.virtualkeycode -eq 37)
      {
        $dir=0
      }   
      # Up
      if ($key.virtualkeycode -eq 38)
      {
        $dir=1
      } 
      # Right
      if ($key.virtualkeycode -eq 39)
      {
        $dir=2
      }
      # Down
      if ($key.virtualkeycode -eq 40)
      {
        $dir=3
      }
    }
  }
  
  if ($dir -eq 0)
  { 
    $coord.x--;
  }
  
  if ($dir -eq 1)
  {
    $coord.y--;
  }
  
  if ($dir -eq 2)
  {
    $coord.x++;
  }
  
  if ($dir -eq 3)
  {
    $coord.y++;
  }

  DrawTheApple;
  DrawTheSnake;
  CheckWallHits;
  CheckSnakeBodyHits;
  CheckAppleHit;

    
  start-sleep -mil 100
  
  $score += $tailLength;
  
}

$rui.cursorsize=$cs

Download Snake.zip – PowerShell Snake Game

  • Advertisement