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

Welcome to the Twenty Sided Blog!

Welcome to my tiny corner of the web. I am a database administrator, network admin, hobbyist game developer, book author, game player, and all around geek. Up until now, I’ve been running a little game development web site called XNA Resources, but since Microsoft killed off XNA with the release of Windows 8, that puts a damper on the usefulness of new XNA information (of course, the XNA framework lives on in MonoGame, check it out if you are an XNA enthusiast).

Given the name and URL of my old XNA site, it was not really conducive to writing on other topics, so the TwentySidedBlog was born. I plan to cover a wide range of nerd-friendly topics, including coding (games and otherwise), movies, games (computer, console, board, and pen-and-paper) and any number of other things I find interesting. Each post will be a virtual toss of the icosahedron to determine what the topic might be.

To get things started, the next article will combine both scripting and game development!

  • Advertisement