Attack of the Free-For-Non-Commercial-Use Game Engines!

I just stumbled across this story on Slashdot announcing Epic’s release of a free version of it’s Unreal Engine for non-commercial uses [Epic Press Release: http://epicgames.com/press_releases/udk.html]. The story also points out that last week Unity also announced a free version of their game engine, also for non-commercial games [Unity Press Release: http://unity3d.com/company/news/unity2.6-press.html].

It makes my heart swell to hear this! I’ve been a gamer (Console and PC, primarily PC) for well since my dad brought home our first Atari around 1978 (I may be a year or two off, I was 5 or 6 at the time) and I was hooked. Games are most likely the reason I chose Computer Programming as a career. I’ve been involved in game development as well. Not enough so that I work as a game developer, but enough that I do understand what it takes to get a game together (I am not a marketing guy, so I’m specifically talking about the Development portion of the process here.) You may have even played something I created [perhaps a later post will include some elaboration].

There are three types of Game Development companies in the world. One type that creates Game Engines and Game Content, ones that just creates Game Content, and ones that just create Game Engines.

Let me define Game Engine and Game Content

  • Game Content is  3d models, 2d sprites, sound effects, music soundtracks, story lines, characters, character dialog, etc.
  • Game Engine shows the content to the game player and interacts with the player to turn his actions into what he is doing in the game (so the engine controls rendering to the computer screen, reading the game controllers, sending force feedback commands to the controller/joystick, tracking player and enemy health, move everything around using the in game version of the laws of physics, etc.

All game companies create Game Content, that is their Intellectual Property that they hope will sell enough copies of a game to pay them to make the next version of it. Some companies employ development staff that also creates the Game Engine that handles all their Game Content. These guys hope to sell enough copies to pay them to make the next version of it as well, but they hope so many copies are sold that other Game Content companies will buy their Game Engine and create their own Game Content for it and sell you another game. Finally, the companies that just create Game Engines hope to entice a Game Content company to buy their engine and use that for their content.

And this completely ignores the Hardware level of games which is really in the Console gaming realm. As one might suspect, these guys make hardware that can run Game Engines, so they try to sell their hardware platform to companies that make Game Engines.

The landscape has not always been like this. It used to be the Game Company would make the engine and the content, shop it to a publisher who put it on the store shelves (remember, this was back before the Internet.) What happened was, these guys actually started to make money selling games and more companies wanted in on the action. Eventually some suit figured out that it was cheaper to buy the license to use/modify an existing game engine and just pay employees to make content, and they were right!

I’m not trying to say that making content is easy, and I’m not saying they don’t have development staff to customize the engine to suit their needs and to also implement the rules the game runs under as they are completely different from one game to another. This is the code that gives you health when you get the mushroom power-up, or makes you jump higher and float to the ground when under the effects of a high jump spell.

This, in my mind IS the game, the Game Engine itself just runs it all as a platform. It is a pretty delineated and sensible distinction. It is this distinction that has allowed for the the different types of game companies to exist.

GameDiagram

So as you can see, Id made both the content and engine for Doom3, and the Engine for Quake4, that’s three revenue streams, and that’s just one game that uses the Doom3 engine. You get the point here.

Now what we are seeing is companies springing up that just create Game Engines and not an underlying title to showcase it. This is because more and more people are in the gaming industry to create content for these games. And they can undercut Id on the price which lowers the cost of getting into game development, which lowers the cost of games you and I buy.

Except, like the Apple App Store, more choices are just that more choices and it encourages shovel-ware because if you have five titles for sale you’re bound to sell more then just a single title, and it’s easier to make five titles by buying an engine then writing one. It is also good in the way if fosters competition at the top of the chain which means better engines for everybody!

At the very least the modding communities pleased to be able to actually get the hands into the engine itself rather then just the game functions it exposes. Very exciting!

Trackback URL for this post:

http://blog.monkk.com/trackback/60

“Find in Files” functionality from a bash shell

Since I always forget how to do this I thought I’d just post it here 🙂

This information is taken from http://www.athabascau.ca/html/depts/compserv/webunit/HOWTO/find.htm#EX03 [edit: the page is no longer serving here is a link to the archive.org’s cached version] and is certainly more detailed then what I will post. So without further ado, :

Scenario 1: You want to find all files that contain the string “primary” in the current directory:

find . -exec grep -q "primary" '{}' ; -print

and it will yield something like:

./fix-ie.css./page.tpl.php./print.css./style-rtl.css./style.css./template.php

 

Scenario 2: You want to find all files that contain the string “primary” in the current directory and list the lines that contain your search term:

find . -exec grep "primary" '{}' ; -print

and it will yield something like (ignore the color coding…) :

p "primary" '{}' ; -print ul.primary { ./fix-ie.css <?php if (isset($primary_links)) : ?> <?php print theme('links', $primary_links, array('class' => 'links pri mary-links')) ?> <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></di v>'; endif; ?> ./page.tpl.php ul.primary-links, ul.secondary-links, ./print.css ul.primary-links { ul.primary-links li { ul.primary { ul.primary li a, ul.primary li.active a, ul.primary li a:hover, ul.primary li a: visited, ul.primary li a:after { ul.primary li a, ul.primary li.active a, ul.primary li a:hover, ul.primary li a: visited, ./style-rtl.css ul.primary-links { ul.primary-links li { ul.primary-links li a, ul.primary-links li a:link, ul.primary-links li a:visited { ul.primary-links li a:hover, ul.primary-links li a.active { ul.primary, ul.primary li, ul.secondary, ul.secondary li { ul.primary { ul.primary li a, ul.primary li.active a, ul.primary li a:hover, ul.primary li a: visited, ul.primary li.active a, ul.primary li.active a:link, ul.primary li.active a:visi ted, ul.primary li a:hover, ul.primary li.active a, ./style.css return menu_primary_local_tasks(); ./template.php (uiserver):u37978795:~/hosted/drupal.monkk.com/themes/garland > find . -exec gre p "primary" '{}' ; -print ul.primary { ./fix-ie.css <?php if (isset($primary_links)) : ?> <?php print theme('links', $primary_links, array('class' => 'links pri mary-links')) ?> <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></di v>'; endif; ?> ./page.tpl.php ul.primary-links, ul.secondary-links, ./print.css ul.primary-links { ul.primary-links li { ul.primary { ul.primary li a, ul.primary li.active a, ul.primary li a:hover, ul.primary li a: visited, ul.primary li a:after { ul.primary li a, ul.primary li.active a, ul.primary li a:hover, ul.primary li a: visited, ./style-rtl.css ul.primary-links { ul.primary-links li { ul.primary-links li a, ul.primary-links li a:link, ul.primary-links li a:visited { ul.primary-links li a:hover, ul.primary-links li a.active { ul.primary, ul.primary li, ul.secondary, ul.secondary li { ul.primary { ul.primary li a, ul.primary li.active a, ul.primary li a:hover, ul.primary li a: visited, ul.primary li.active a, ul.primary li.active a:link, ul.primary li.active a:visi ted, ul.primary li a:hover, ul.primary li.active a, ./style.css return menu_primary_local_tasks(); ./template.php (uiserver):u37978795:~/hosted/drupal.monkk.com/themes/garland > find . -exec gre p -q "primary" '{}' ; -print ./fix-ie.css ./page.tpl.php ./print.css ./style-rtl.css ./style.css ./template.php (uiserver):u37978795:~/hosted/drupal.monkk.com/themes/garland > less page.tpl.ph p (uiserver):u37978795:~/hosted/drupal.monkk.com/themes/garland > find . -exec gre p -q "primary" '{}' ; -print ./fix-ie.css ./page.tpl.php ./print.css ./style-rtl.css ./style.css ./template.php (uiserver):u37978795:~/hosted/drupal.monkk.com/themes/garland > find . -exec gre p "primary" '{}' ; -print ul.primary { ./fix-ie.css <?php if (isset($primary_links)) : ?> <?php print theme('links', $primary_links, array('class' => 'links pri mary-links')) ?> <?php if ($tabs): print '<ul class="tabs primary">'. $tabs .'</ul></di v>'; endif; ?> ./page.tpl.php ul.primary-links, ul.secondary-links, ./print.css ul.primary-links { ul.primary-links li { ul.primary { ul.primary li a, ul.primary li.active a, ul.primary li a:hover, ul.primary li a: visited, ul.primary li a:after { ul.primary li a, ul.primary li.active a, ul.primary li a:hover, ul.primary li a: visited, ./style-rtl.css ul.primary-links { ul.primary-links li { ul.primary-links li a, ul.primary-links li a:link, ul.primary-links li a:visited { ul.primary-links li a:hover, ul.primary-links li a.active { ul.primary, ul.primary li, ul.secondary, ul.secondary li { ul.primary { ul.primary li a, ul.primary li.active a, ul.primary li a:hover, ul.primary li a: visited, ul.primary li.active a, ul.primary li.active a:link, ul.primary li.active a:visi ted, ul.primary li a:hover, ul.primary li.active a, ./style.css return menu_primary_local_tasks(); ./template.php

And there you have it, enjoy!

 

Trackback URL for this post:

http://blog.monkk.com/trackback/59

Fun with a batch file for starting and stopping “Development” related services

Here's the scenario: you are a programmer in both hobby and career, but you've got other hobbies, like video games. But first and foremost, you are a programmer… So not only do you have a number of video games sucking up precious hard drive space, you have a full blown installation of Visual Studio, Sql Server Express, IIS, all running on your local machine. Come game time, you've got all these services sitting around waiting to be used in some development, meanwhile you're trying to get max frames-per-second with Crysis…

Not a big deal, Windows+R then "services.msc" and those pesky services down, get your game on and then… Oh wait, some more development… Back to services.msc and turn them back on. Gets very old, very quick…

So I decided to do a little something about it, a very little something, I wrote a batch file to present a little start or stop menu and start up the services or shut them down.

Here is a list of services I felt like adding in there, there could be more… I could have turned off svncache, etc… I figured why bother… The list I used is:

  • SQL Server (SQLEXPRESS)
  • SQL Server Browser
  • SQL Server VSS Writer
  • World Wide Web Publishing Service
  • IIS Admin Service
  • Machine Debug Manager
and the code ends up looking like this:
   1: ECHO off
   2: CLS
   3:  
   4: IF "%1"=="" GOTO MENU
   5:  
   6: SET M=%1
   7: GOTO EVALUATEMODE
   8:  
   9: :MENU
  10: ECHO.
  11: ECHO ---------------------------------
  12: ECHO Start or Stop the Dev Environment
  13: ECHO ---------------------------------
  14: ECHO  S : Start the dev environment services
  15: ECHO  P : the dev environment services
  16: ECHO  Q : Do nothing and quit
  17: ECHO.
  18:  
  19: SET /P M=Type S, P, or Q then press Enter: 
  20:  
  21: :EVALUATEMODE
  22: IF "%M%"=="S" GOTO START
  23: IF "%M%"=="s" GOTO START
  24: IF "%M%"=="P" GOTO STOP
  25: IF "%M%"=="p" GOTO STOP
  26: IF "%M%"=="Q" GOTO CLEANUP
  27: IF "%M%"=="q" GOTO CLEANUP
  28: IF "%M%"=="/?" GOTO HELP
  29: IF "%M%"=="-?" GOTO HELP
  30: IF "%M%"=="--help" GOTO HELP
  31:  
  32: ECHO Invalid Mode: %M%
  33: GOTO MENU
  34:  
  35: :START
  36:   net start "SQL Server (SQLEXPRESS)"
  37:   net start "SQL Server Browser"
  38:   net start "SQL Server VSS Writer"
  39:   net start "World Wide Web Publishing Service"
  40:   net start "IIS Admin Service"
  41:   net start "Machine Debug Manager"
  42:   GOTO CLEANUP
  43:  
  44: :STOP
  45:   net stop "SQL Server (SQLEXPRESS)"
  46:   net stop "SQL Server Browser"
  47:   net stop "SQL Server VSS Writer"
  48:   net stop "World Wide Web Publishing Service"
  49:   net stop "IIS Admin Service"
  50:   net stop "Machine Debug Manager"
  51:   GOTO CLEANUP
  52:   
  53: :HELP
  54:   ECHO Usage:
  55:   ECHO dev-environ.bat [Mode = S | P | Q]
  56:   ECHO   Mode: S = Start the dev environment services
  57:   ECHO   Mode: P = Stop the dev environment services
  58:   ECHO   Mode: Q = Quit this .bat and do nothing
  59:   ECHO.
  60:   GOTO EOF
  61:   
  62: :CLEANUP
  63:   ECHO.
  64:   ECHO Done.
  65:     
  66: :EOF

Not terribly clean, and I probably could have done it with a windows app with c#, but it would have been so much work for the same result. Anyway, enjoy!

Caveat: With Widnows 7 (or Vista) with the UAC enabled, you'll want to right-click on the .bat or shortcut to it and and run it as Administrator so that it has permissions to stop or start the windows services.

The contents of the code above are conveniently located below under Attachment's for this entry. Cut down on the cut and paste errors 😉

Trackback URL for this post:

http://blog.monkk.com/trackback/56
Attachment Size
dev-environ.bat 1.44 KB

Damn gimicks, aka “The Hat Trick”

So I'm minding my own business, restarting my Steam client to check for any game updates and what do I see but this (click the image for the full sized version):

Dirty Cheap Trick

So if you're at all interested in Team Fortress 2, you'll know that a few months ago they introduced the concept of unlockable customization content for the characters in the game, in the form of Hats. They are typically not achievement based but some magical percentage determines if you are eligible to unlock one every hour or so and if you're lucky maybe you get one. Well, I guess it's ok but really who cares, they simply are aesthetic, but I have found exactly ONE hat after many many (far too many) hours of playing… It's annoying when others have a whole bunch of 'em.  But fine, you wait long enough, you get 'em…

Now this, Pre-Order a different game of ours and get a free hat for TF2? I mean, yeah, it's not a bad marketing ploy, but we are all still waiting for an inventory trading system… Which in itself is kinda lame in a FPS… If I wanted a MMORPG, I'd go play one… I'm already grinding on getting lame achievements to get weapons which I will actually use… but hats? Really? That's what you're spending your time on?

Trackback URL for this post:

http://blog.monkk.com/trackback/55