(attribute a name opstring) (defop README.html req (doctype xhtml 1.1 strict) (tag (html xmlns "http://www.w3.org/1999/xhtml" "xml:lang" "en") (tag head (tag title (pr "Blackthorn"))) (tag body (tag (div style "margin-left: 20%;") (tag h2 (pr "Blackthorn: Lisp Game Engine"))) (tag (div style "float: left; width: 20%;") (tag p (tag (a href "#blackthorn") (pr "What is Blackthorn?"))) (tag p (tag (a href "#why") (pr "Why another game engine?"))) (tag p (tag (a href "#provide") (pr "What does Blackthorn provide?"))) (tag p (tag (a href "#details") (pr "Details"))) (tag p (tag (a href "#prereq") (pr "Prerequisites"))) (tag p (tag (a href "#install") (pr "Installation"))) (tag p (tag (a href "#download") (pr "Download"))) (tag p (tag (a href "#license") (pr "License")))) (tag (div style "float: right; width: 80%;") (tag h3 (tag (a name "blackthorn") (pr "What is Blackthorn?"))) (tag p (pr "Blackthorn is a framework for writing 2D games in Common Lisp. Blackthorn is attempt to write an efficient, dynamic, persistent 2D game engine in an expressive language which makes it easy to write games.")) (tag h3 (tag (a name "why") (pr "Why another game engine?"))) (tag p (pr "Games are hard to write. The effort needed to write a usable game engine from scratch, especially when dealing with the low-level details of languages like C, make the cost of writing games prohibitive. Libraries like ") (tag (a href "http://www.libsdl.org/") (pr "SDL")) (pr " get many of the driver-level graphics details out of the way, but still leave the user writing in C. Libraries like ") (tag (a href "http://www.pygame.org/news.html") (pr "PyGame")) (pr " and ") (tag (a href "http://code.google.com/p/lispbuilder/wiki/LispbuilderSDL") (pr "LISPBUILDER-SDL")) (pr " wrap more of these low-level details, but still don't provide a full game engine needed for writing substantial games.")) (tag p (pr "There are, of course, game engines which provide this functionality to the user. ") (tag (a href "http://www.yoyogames.com/gamemaker/") (pr "Game Maker")) (pr ", for example, is an engine which provides everything needed to make a basic game, and an extention language for writing more complex behavior. Using Game Maker, an experienced user can write a basic game in five minutes. However, Game Maker (and similar programs the authors have tried) have some substantial flaws. Problems with Game Maker, specifically, include:") (tag ul (tag li (pr "Game Maker only runs on Windows. A Linux port is still a dream, and porting to any sort of mobile device is completely unimaginable.")) (tag li (pr "Game Maker's extension language, GML, is a kludge, and inefficient. (The lack of a rich set of built-in datastructures is something I hear GML users complaining about frequently.)")) (tag li (pr "Game Maker is closed source, so it would be impossible for anyone other than the authors to fix any of the above problems with Game Maker.")))) (tag h3 (tag (a name "provide") (pr "What does Blackthorn provide?"))) (tag p (pr "Blackthorn attempts to fix many of the problems above. Blackthorn provides:") (tag ul (tag li (pr "A not-yet-complete subset of the functionality provided by Game Maker. Despite being incomplete, Blackthorn is already capable of supporting simple games.")) (tag li (pr "Blackthorn is written in Common Lisp, providing:") (tag ul (tag li (pr "Efficiency which is (depending on the implementation, and the benchmark) capable of competing with C.")) (tag li (pr "Portable to any platform supported by a compliant ANSI Common Lisp compiler. Blackthorn currently runs on Windows, Linux, and Mac OSX. Porting Blackthorn to a new compiler takes a couple of hours.")) (tag li (pr "Dynamic behavior, because the entire compiler is available at runtime. An on-screen development REPL (read-eval-print loop, i.e. a development console) with an on-screen debugger is provided, giving the user the ability to rewrite arbitrary pieces of code on the fly.")) (tag li (pr "Extensibility, because the game engine itself is an open platform, and because user code operates at the same level as the game engine.")) (tag li (pr "And finally, because Blackthorn is open source, it is open to improvements from the community.")))))) (tag h3 (tag (a name "details") (pr "Details"))) (tag p (pr "Blackthorn uses ") (tag (a href "http://code.google.com/p/lispbuilder/") (pr "LISPBUILDER-SDL")) (pr " for graphics support (which internally uses ") (tag (a href "http://www.libsdl.org/") (pr "SDL")) (pr ", ") (tag (a href "http://www.libsdl.org/projects/SDL_image/") (pr "SDL_image")) (pr ", and ") (tag (a href "http://www.ferzkopp.net/joomla/content/view/19/14/") (pr "SDL_gfx")) (pr "), and either ") (tag (a href "http://www.franz.com/products/allegrocache/") (pr "AllegroCache")) (pr ", ") (tag (a href "http://common-lisp.net/project/elephant/") (pr "Elephant")) (pr ", or ") (tag (a href "http://common-lisp.net/project/cl-store/") (pr "CL-STORE")) (pr " as an internal database for object persistence.")) (tag p (pr "Blackthorn currently runs on Windows, Linux, and Mac OSX, under ") (tag (a href "http://franz.com/products/allegrocl/") (pr "Allegro CL")) (pr ", ") (tag (a href "http://www.sbcl.org/") (pr "SBCL")) (pr ", ") (tag (a href "http://clisp.cons.org/") (pr "CLISP")) (pr ", and ") (tag (a href "http://ecls.sourceforge.net/") (pr "ECL")) (pr ". Blackthorn is tested semi-regularly with the following configurations:") (tag ul (tag li (pr "Windows x86/Allegro CL/CL-STORE")) (tag li (pr "Windows x86/SBCL/CL-STORE")) (tag li (pr "Windows x86/CLISP/CL-STORE")) (tag li (pr "Linux x86 and x86-64/SBCL/CL-STORE")) (tag li (pr "Mac OSX x86/SBCL/CL-STORE"))) (pr "Other configurations which have worked in the past, but haven't necessarily been tested recently include:") (tag ul (tag li (pr "Windows x86/Allegro CL/AllegroCache")) (tag li (pr "Windows x86/SBCL/Elephant (BDB)")) (tag li (pr "Linux x86 and x86-64/SBCL/Elephant (BDB)")) (tag li (pr "Linux x86-64/ECL/CL-STORE"))) (pr "Note: As the games using Blackthorn have become increasingly complex, the load Blackthorn puts on its backing DB has become an increasing performance issue. Currently, the only configuration which runs with a decent frame rate is CL-STORE, because both AllegroCache and Elephant access the disk excessively. Solutions for speeding up either DB are being looked into (e.g. Elephant's Snapshot Set), but none are currently usable.")) (tag h3 (tag (a name "prereq") (pr "Prerequisites"))) (tag p (pr "The following are required for developing with Blackthorn with the CL-STORE backend.")) (tag p (pr "A compatible Lisp compiler:") (tag ul (tag li (tag (a href "http://franz.com/products/allegrocl/") (pr "Allegro CL"))) (tag li (tag (a href "http://www.sbcl.org/") (pr "SBCL"))) (tag li (tag (a href "http://clisp.cons.org/") (pr "CLISP"))) (tag li (tag (a href "http://ecls.sourceforge.net/") (pr "ECL")))) (pr "Among the compatible compilers, SBCL is suggested because it is (a) free and open source, (b) compatible with Windows, Linux and Mac, and (c) has the best performance of the compilers listed. Allegro CL is also a good choice, but is commercial software (although a free version is available).")) (tag p (pr "Direct dependencies:") (tag ul (tag li (tag (a href "http://code.google.com/p/lispbuilder/") (pr "LISPBUILDER-SDL, -SDL-IMAGE, and -SDL-GFX"))) (tag li (tag (a href "http://common-lisp.net/project/cl-store/") (pr "CL-STORE"))) (tag li (tag (a href "http://common-lisp.net/project/closer/closer-mop.html") (pr "Closer to MOP"))) (tag li (tag (a href "http://common-lisp.net/project/moptilities/") (pr "Moptilities"))) (tag li(tag (a href "http://www.common-lisp.org/project/cl-containers/") (pr "CL-Containers"))) (tag li (tag (a href "http://www.cliki.net/trivial-garbage") (pr "Trivial Garbage"))) (tag li (tag (a href "http://www.weitz.de/cl-fad/") (pr "CL-FAD"))))) (tag p (pr "Windows only (optional):") (tag ul (tag li (tag (a href "http://www.cygwin.com/") (pr "Cygwin")) (pr " or ") (tag (a href "http://gnuwin32.sourceforge.net/") (pr "GnuWin32")) (pr " to use the Makefile")) (tag li (tag (a href "http://nsis.sourceforge.net/") (pr "NSIS")) (pr " for building installers")))) (tag h3 (tag (a name "install") (pr "Installation"))) (tag p (pr "Download the source using ") (tag (a href "http://darcs.net/") (pr "darcs"))) (tag (div style "margin-left: 1em;") (tag pre (pr "darcs get http://common-lisp.net/~eslaughter/darcs/blackthorn"))) (tag p (pr "To start Blackthorn from the shell, merely call make")) (tag (div style "margin-left: 1em;") (tag pre (pr "make"))) (tag p (pr "Optionally, use parameters to specify the build environment, e.g.")) (tag (div style "margin-left: 1em;") (tag pre (pr "make cl=sbcl db=nodb driver=load.lisp system=bunnyslayer"))) (tag p (pr "If instead you prefer to start Blackthorn interactively, start your Lisp and")) (tag (div style "margin-left: 1em;") (tag pre (pr "(load \"load\")"))) (tag h3 (tag (a name "download") (pr "Download"))) (tag p (pr "Binary distributions are made semi-frequently and are available for download at ") (tag (a href "http://elliottslaughter.net/bunnyslayer/download") (pr "http://elliottslaughter.net/bunnyslayer/download")) (pr ".")) (tag h3 (tag (a name "license") (pr "License"))) (tag p (pr "Blackthorn is free and open source software, see the ") (tag (a href "COPYRIGHT") (pr "COPYRIGHT")) (pr " file for details."))))))