Are you over 18 and want to see adult content?
More Annotations
![A complete backup of https://gothictheatre.com](https://www.archivebay.com/archive6/images/15770b72-a7d0-43cf-b34c-ea8003c26124.png)
A complete backup of https://gothictheatre.com
Are you over 18 and want to see adult content?
![A complete backup of https://plainfield-il.org](https://www.archivebay.com/archive6/images/bdb73e17-8872-42fb-b146-3bbcd89eba92.png)
A complete backup of https://plainfield-il.org
Are you over 18 and want to see adult content?
![A complete backup of https://erickson-foundation.org](https://www.archivebay.com/archive6/images/eed7865d-7d67-4682-86a9-7865e2e17f05.png)
A complete backup of https://erickson-foundation.org
Are you over 18 and want to see adult content?
![A complete backup of https://suzuki.co.nz](https://www.archivebay.com/archive6/images/a6cd0372-c487-43b0-a60e-6ce3d52ce2f7.png)
A complete backup of https://suzuki.co.nz
Are you over 18 and want to see adult content?
![A complete backup of https://sonycreativesoftware.com](https://www.archivebay.com/archive6/images/3760ea03-5d42-403d-a5e5-49398d4ff025.png)
A complete backup of https://sonycreativesoftware.com
Are you over 18 and want to see adult content?
![A complete backup of https://edwardsaquifer.org](https://www.archivebay.com/archive6/images/d41668d2-30bf-488f-8db5-f96be564e0a1.png)
A complete backup of https://edwardsaquifer.org
Are you over 18 and want to see adult content?
![A complete backup of https://roupasparaatacado.com.br](https://www.archivebay.com/archive6/images/bf942769-fb5f-48f3-9034-5ee0349a2489.png)
A complete backup of https://roupasparaatacado.com.br
Are you over 18 and want to see adult content?
![A complete backup of https://collingwood.co.uk](https://www.archivebay.com/archive6/images/684c076e-3f99-4cbc-9696-85dd6edc09d6.png)
A complete backup of https://collingwood.co.uk
Are you over 18 and want to see adult content?
![A complete backup of https://inclusivecapitalism.com](https://www.archivebay.com/archive6/images/5948bc97-dc21-454a-9df5-d3c25a3e4010.png)
A complete backup of https://inclusivecapitalism.com
Are you over 18 and want to see adult content?
![A complete backup of https://landspeed.com](https://www.archivebay.com/archive6/images/1a007b25-e740-4072-b0ed-b113a04986de.png)
A complete backup of https://landspeed.com
Are you over 18 and want to see adult content?
![A complete backup of https://horsens.dk](https://www.archivebay.com/archive6/images/25c9a791-33ea-4817-81d3-aa1daaacba04.png)
A complete backup of https://horsens.dk
Are you over 18 and want to see adult content?
![A complete backup of https://lahnstein.de](https://www.archivebay.com/archive6/images/d0738ce9-95ce-4d73-b05a-630b7fee1f17.png)
A complete backup of https://lahnstein.de
Are you over 18 and want to see adult content?
Favourite Annotations
![A complete backup of https://texasfarmersmarket.org](https://www.archivebay.com/archive6/images/480f3bcc-b809-4854-9ce2-7249069fdee7.png)
A complete backup of https://texasfarmersmarket.org
Are you over 18 and want to see adult content?
![A complete backup of https://helenoftroy.com](https://www.archivebay.com/archive6/images/857ccf72-9a35-408f-b787-921c3d8b7097.png)
A complete backup of https://helenoftroy.com
Are you over 18 and want to see adult content?
![A complete backup of https://sxsoft.com](https://www.archivebay.com/archive6/images/29e87d0c-4264-4959-938b-79f8816ee0e0.png)
A complete backup of https://sxsoft.com
Are you over 18 and want to see adult content?
![A complete backup of https://kyodo-pr.co.jp](https://www.archivebay.com/archive6/images/e1406401-7868-43b1-b58a-e5ef5120e65c.png)
A complete backup of https://kyodo-pr.co.jp
Are you over 18 and want to see adult content?
![A complete backup of https://advojka.cz](https://www.archivebay.com/archive6/images/b71ec46c-ce59-4438-9055-73d743837226.png)
A complete backup of https://advojka.cz
Are you over 18 and want to see adult content?
![A complete backup of https://btgexplorer.com](https://www.archivebay.com/archive6/images/356ba0e0-8fba-4473-9c50-7951c6ba0ff8.png)
A complete backup of https://btgexplorer.com
Are you over 18 and want to see adult content?
![A complete backup of https://securitybenefit.com](https://www.archivebay.com/archive6/images/ac501961-0290-4b34-98f5-62fad299a8a2.png)
A complete backup of https://securitybenefit.com
Are you over 18 and want to see adult content?
![A complete backup of https://anarchycreek.com](https://www.archivebay.com/archive6/images/5158f947-498d-4735-99c5-d2b6e2b5068a.png)
A complete backup of https://anarchycreek.com
Are you over 18 and want to see adult content?
![A complete backup of https://qianjia.com](https://www.archivebay.com/archive6/images/f90e0d3d-20f6-4ccd-9298-ae4d58eb531e.png)
A complete backup of https://qianjia.com
Are you over 18 and want to see adult content?
![A complete backup of https://dofnord.dk](https://www.archivebay.com/archive6/images/1a6c0c2e-424e-4206-b99d-2a457432b186.png)
A complete backup of https://dofnord.dk
Are you over 18 and want to see adult content?
![A complete backup of https://survival.es](https://www.archivebay.com/archive6/images/c6f6ac3a-f447-450b-96d9-1d9ba8a178f5.png)
A complete backup of https://survival.es
Are you over 18 and want to see adult content?
![A complete backup of https://escape-kit.com](https://www.archivebay.com/archive6/images/a4f5f25f-30ce-4c7d-989a-c7d3ac93a7d3.png)
A complete backup of https://escape-kit.com
Are you over 18 and want to see adult content?
Text
West
COWBOY PROGRAMMING » MY CODING PRACTICES IN 1991 This is JUST Wonderful ! :-) I like your careful style, which leads me to understanding that there was something inherently complete in the way you could specify your programming patterns and best practices down to machine code level – which is not possible nowadays anymore- although the patterns and practices could ( and sometimes should )stay the same ]
COWBOY PROGRAMMING » PERFORCE SSH FROM WINDOWS AND MAC TO I’ve been traveling a bit, but still want to do development in a nice tidy way. At home I had a Perforce server running on a big local machine, and I could connect to it on port 1666 from my PC, my laptopand my Mac.
INNOVATION - COWBOYPROGRAMMING.COM Innovation The Bridge Between Coax Wiring and IP Networking. Information networks and client architectures are in transition.Voice, data and now
PROPOSED FINAL JUDGMENT 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 58971.1 10-CV-2614-WHA FINAL JUDGMENT THE LANIER LAW FIRM, P.C. Christopher D COWBOY PROGRAMMING » REDDIT-PROOFING WORDPRESS Since writing this, I had another huge spike in traffic (20,000 visitors in a day), which again caused a crash. As a result, I installed WP-Super Cache, which is much more robust that WP-Cache. I also adjusted the theme to use a static stylesheet (style.css) ratherthan a
COWBOY PROGRAMMING » EVOLVE YOUR HIERARCHY The component approach, which is gaining more acceptance in current game development, is one of separating the functionality into individual components that are mostly independent of one another. The traditional object hierarchy is dispensed with, and an object is now created as an aggregation (a collection) of independent components. COWBOY PROGRAMMING » WHAT IS COWBOY PROGRAMMING? Cowboy Programming is a description that is often applied to game programmers. It implies an individualistic style of programming, where the programmer creates ad-hoc solutions to problems based on their personal experience and knowledge base, rather than implementing a standard solution, or one arrived at by teamwork. COWBOY PROGRAMMING » PROGRAMMING POKER AI The procedure for simulating a game is very simple: Create a pack of cards. Set score = 0. Remove the known cards (your hole cards, and any community cards) Repeat 1000 times (or more, depending on CPU resources and desired accuracy) Shuffle the remaining pack. COWBOY PROGRAMMING » TRENDS IN GAME PROGRAMMING This article was originally published in The Inner Product column of Game Developer magazine, September 2006. The job of a game programmer has been constantly evolving since game programming began its commercial existence sometime back in the 1970s. COWBOY PROGRAMMING » SOME TREES I MADE Cowboy Programming Game Development and General Hacking by the OldWest
COWBOY PROGRAMMING » MY CODING PRACTICES IN 1991 This is JUST Wonderful ! :-) I like your careful style, which leads me to understanding that there was something inherently complete in the way you could specify your programming patterns and best practices down to machine code level – which is not possible nowadays anymore- although the patterns and practices could ( and sometimes should )stay the same ]
COWBOY PROGRAMMING » PERFORCE SSH FROM WINDOWS AND MAC TO I’ve been traveling a bit, but still want to do development in a nice tidy way. At home I had a Perforce server running on a big local machine, and I could connect to it on port 1666 from my PC, my laptopand my Mac.
INNOVATION - COWBOYPROGRAMMING.COM Innovation The Bridge Between Coax Wiring and IP Networking. Information networks and client architectures are in transition.Voice, data and now
PROPOSED FINAL JUDGMENT 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 58971.1 10-CV-2614-WHA FINAL JUDGMENT THE LANIER LAW FIRM, P.C. Christopher D COWBOY PROGRAMMING » REDDIT-PROOFING WORDPRESS Since writing this, I had another huge spike in traffic (20,000 visitors in a day), which again caused a crash. As a result, I installed WP-Super Cache, which is much more robust that WP-Cache. I also adjusted the theme to use a static stylesheet (style.css) ratherthan a
COWBOY PROGRAMMING » WHAT IS COWBOY PROGRAMMING? Cowboy Programming is a description that is often applied to game programmers. It implies an individualistic style of programming, where the programmer creates ad-hoc solutions to problems based on their personal experience and knowledge base, rather than implementing a standard solution, or one arrived at by teamwork. COWBOY PROGRAMMING » PROGRAMMING BIO I first started programming games in 1979, aged 12, when my Grandfather bought me a Casio FX-180p, a programmable calculator that had just 38 steps, and a COWBOY PROGRAMMING » MULTI-CORE PROCESSORS This article originally appeared in the "Inner Product" column in Game Developer Magazine, February 2006. Next generation game platforms are increasingly making use of multiple processors to deliver morecomputing power.
COWBOY PROGRAMMING » PROGRAMMING RESPONSIVENESS Programming Responsiveness – “Responsiveness is something that can make or break a game at first impression. This is especially true in reviews where a game with poor responsiveness will be described as being “sluggish†, “unresponsive†, “floaty†or “sloppy†. A better game might bereferred to as â
COWBOY PROGRAMMING » TRENDS IN GAME PROGRAMMING This article was originally published in The Inner Product column of Game Developer magazine, September 2006. The job of a game programmer has been constantly evolving since game programming began its commercial existence sometime back in the 1970s. COWBOY PROGRAMMING » CHECKWORD To check a word, type it in and touch “Search”. You will be told if the word is “Good” or “Bad” to play in Scrabble. To clear the display, just touch “Search” again. In the options, you can select “Use ‘Acceptable’” to change the messages to “Acceptable” and “Unacceptable”, as COWBOY PROGRAMMING » WHAT IS NTKMLPA.EXE? ntkmlpa.exe is a misreading of ntkrnlpa.exe (NTKRNLPA.EXE), it’s the part of the windows kernel (it’s the named process “NT Kernel &System”).
COWBOY PROGRAMMING » MY CODING PRACTICES IN 1991 This is JUST Wonderful ! :-) I like your careful style, which leads me to understanding that there was something inherently complete in the way you could specify your programming patterns and best practices down to machine code level – which is not possible nowadays anymore- although the patterns and practices could ( and sometimes should )stay the same ]
COWBOY PROGRAMMING » COMPILING RUBY AS A VISUAL STUDIO 5 Responses to “Compiling Ruby as a Visual Studio Solution”. 1. Washu says: October 1st, 2007 at 9:52 pm. Having done a bit of Ruby work in the past, I must say that their C interface sucks. The fact that the language isn’t even remotely 64 bit compatible (although 1.9/2.0 are “going to be”, I’ve yet to see them make progress on COWBOY PROGRAMMING » WHY WON’T IT BUILD? It’s a timeless tale; you find some useful looking code sample on the internet, you download it, you try to build it and it does not build. This is such a common occurrence that non-building code samples seem to greatly outnumber correctly building code samples on theinternet by a
COWBOY PROGRAMMING
GAME DEVELOPMENT AND GENERAL HACKING BY THE OLD WEST*
PAGES
* About
* Inner Product
* Toggling Hotlink Protection in CPanel Kills WordPress Permalinks*
*
RECENT POSTS
* 1995 Programming on the Sega Saturn * Customizing Home Page Bookmarks on iPhone and iPad * AURemoteIOServer Error getting default device UID: ‘!obj’ * iPhone OpenAL Linking Problem * Some Uses of SQL Databases in Game Development * Custom responsiveness measuring device * My coding practices in 1991 * Debugging Memory Corruption in Game Development * CPanel Hotlink Protection Breaks WP Permalinks * The CheckWord Pricing Experiment* CheckWord Reviews
* CheckWord – My iPhone Scrabble word checker app* CheckWord
* Perforce SSH from Windows and Mac to Linux * Measuring Responsiveness in Video Games * Programming Responsiveness * Running in Circles * Practical Fluid Mechanics * Debugging Heisenbugs * Exponential Optimizing, or not. * Managed Code in Games * Blogroll and Categories not working in WordPress 2.3.2 * Visualizing and Diagrams * What is ntkmlpa.exe?* Hotfixing Vista
* MySQL Server Install Problems with Vista * Optional code in WordPress header * Reddit-proofing WordPress * Get and Build Ruby 1.9 for Windows * Compiling Ruby as a Visual Studio Solution * Why won’t it build? * Speeding up slow Vista * Why is Vista Slow? * Optimized Asset Processing * Falling Sand Game from the ’80s * What is invalid parameter noinfo and how do I get rid of it? * Comments vs. Self Documenting Code* Stylus Control
* The Seven Stages of the Programmer* Programming Bio
* Cowboy Scrabble Programming * Delving into Cowboy Programming * Visualizing Floats * Trends in Game Programming * Shattering Reality* Blob Physics
* Parallax Mapped Bullet Holes * Multithreading Particle Sytems * Evolve Your Hierarchy * Multi-core Processors * Mature Optimization * Practical Hash IDs * Programming Poker AI* Debug and Release
* What is Cowboy Programming?* Pushing Buttons
* Some Trees I Made
* About
* Teleological vs. Ontogenetic* Blob Correction
* Notes on “Mature Optimization”*
*
EXTERNAL LINKS
* Games I Programmed*
WEB RESOURCES
* Dev Master Dev Master – Your source for game development * Game Programming Wiki* GameDev.Net
* GP Wiki Links
* The Daily WTF
*
CMP SITES
* Gamasutra
* Game Career Guide
* Game Developer Magazine* Game Set Watch
* Games on Deck
* Serious Games Source*
GAME DEV BLOGS
* DeadRock
* Fustian Future
* Japanmanship
* New Retro Yesterday’s ideas tomorrow! * Seven Degrees of Freedom*
LINKS
* Holly West Holly West – Author of ‘Diaryof Bedlam’
*
*
RECENT COMMENTS
* Quora
on Evolve Your Hierarchy * Require.js and Inheritance • Tal Woolf | InteractiveDeveloper
on Evolve Your Hierarchy * Game Models – A Different Approach (Part 2) | npruehs on Evolve Your Hierarchy * Game Models – A Different Approach I | npruehs on Evolve Your Hierarchy * Passez à l’ Entity System ! Partie 1 on Evolve Your Hierarchy * Artemis: the Greek goddess of software architecture | star-fu.tv on Evolve Your Hierarchy * Game Objects « DTO Softwareon Evolve
Your Hierarchy
* DevBlog: C+ « 7c0h on Evolve YourHierarchy
* The Core Concept « The Infestation Cometh on Evolve Your Hierarchy * Game components infrastructure for XNA. | Box Hacker on Evolve Your Hierarchy * Padrões no desenvolvimento de games | USPGameDevon Evolve
Your Hierarchy
* Developer Diary: Jetpack game HTML5 - Day 1 - Michiel De Mey's Blog - Michiel De Mey's Blog - Programmer, designer and flash juggler on Evolve Your Hierarchy * Implementing Object Composition | Q&A System on Evolve Your Hierarchy * Developer Diary: Jetpack game HTML5 – Day 1 - Michiel De Mey's Blog - Programmer, designer and flash juggler on Evolve Your Hierarchy * 有關Re-Factoryçš„comment « NDark MSN Live Space on Evolve Your Hierarchy * C++ Metadata – Part II, Inheritance, Dynamic Casting, and Allocation | Game Development Student Journal on Evolve Your Hierarchy * Day 8: Add game entities to our iPhone game on Evolve Your Hierarchy * design patterns – MVC-like compartmentalization in games? – Game Development – Stack Exchange | TechRetriever on Evolve Your Hierarchy * Functional Reactive Programming kick-starter guide « Web life between Python and lambda calculus on Evolve Your Hierarchy * Complex Functionality Using Component Systems | GameDevSoc on Evolve Your Hierarchy * Amit’s Game Programming Information « Morgen Free'sBlog
on Evolve Your Hierarchy * Crafty, Game engine para el desarrollo de videojuegos para navegador - Chalchicha.es on Evolve Your Hierarchy * Scripting with Artemis Entity System Framework « Gemserkon Evolve
Your Hierarchy
* Daily Update #2 | Game Development Blogon Evolve Your
Hierarchy
* Engines
on Evolve Your Hierarchy * Component-Based? Entity-Component? Confused? Part 1 | chris mann on Evolve Your Hierarchy * 2D Game Engine – Dokuro2 « Bombpersons's Blog on Evolve Your Hierarchy * Lag: The Bane Of Touch Screens | Games from Withinon
Measuring Responsiveness in Video Games * Developers Diary – Developing Methodology | Ploobs on Evolve Your Hierarchy * Learn how to play a guitar today. Lots of video tutorials and guides on Measuring Responsiveness in Video Games * Fun With Springs… | FMLon Blob
Physics
* Component-based architecture « Burger Engine Blog on Evolve Your Hierarchy * Introducing ‘Xanor’ (WIP) - pekaliciouson Evolve Your
Hierarchy
* Entity/Component Game Design: A Primeron Evolve Your
Hierarchy
* Cowboy coding | Jesus Was Rastaon Delving
into Cowboy Programming * » Onedayitwillmake on Evolve Your Hierarchy * Component system | BoxHackeron Evolve
Your Hierarchy
* As promised: Component Binding BEHIND THE SCENES « et1337 makesgames
on Evolve Your Hierarchy * Game Objects and Entities » John Payne's Code Blog on Evolve Your Hierarchy * Component-based game design | Javascript Teamon Evolve Your
Hierarchy
* Mark J. Derulo on Programming Responsiveness * Christian Smith on Blogroll and Categories not working in WordPress2.3.2
* Entity frameworks | Gray Lantern on Evolve Your Hierarchy * Fyodor on Visualizing Floats * The best laid plans… | SLEEPY-GENIUS: tHE gAME dESIGN mUSINGS oFmARCUS mONTGOMERY
on
Evolve Your Hierarchy * Clojure Entity Component System | resatorion Evolve Your
Hierarchy
* Complex Functionality Using Component Systems on Evolve Your Hierarchy * Refactoring Fun « Hydroxic-Acid on Evolve Your Hierarchy * Mick on Evolve Your Hierarchy * Trent Sterling on Evolve YourHierarchy
* Lancechop on CheckWord * Shaikh Zafar on iPhone OpenAL Linking Problem * lost files recovery on Reddit-proofing WordPress * Aaron Schmidt on CheckWord – My iPhone Scrabble word checker app * SEO Content Writing Service on Reddit-proofing WordPress * Tweets that mention Cowboy Programming » Delving into Cowboy Programming -- Topsy.com on Delving into Cowboy Programming * Complex Functionality Using Component Systems « GameDevSoc on Evolve Your Hierarchy * Creating An Eternal Animation With Crafty.js | Programmateur on Evolve Your Hierarchy * Component Based game development | Rohin's Development Blog on Evolve Your Hierarchy * component-vs-hierarchical-modeling | Code, Hacks and Other NerdyThings on
Evolve Your Hierarchy * Modelli di Intelligenza nel Poker – Indie Vault on Programming Poker AI * State of the Art Game Objects | GBGames - Thoughts on Indie GameDevelopment
on
Evolve Your Hierarchy * Cowboy Programming » Falling Sand Game from the ’80s | AfterToday News
on Falling Sand Game from the ’80s * Games from Within | Lag: The Bane Of Touch Screenson
Programming Responsiveness * Zerg: my new game architecture-entity-system-thingy « My .planon
Evolve Your Hierarchy * Evolve Your Hierarchy « Black Straits Historical on Evolve Your Hierarchy * 10 ทัà¸à¸©à¸°à¸—ี่ Developer ควรรู้ | CodePonPon.com on Delving into Cowboy Programming * EastZoneSoupCube - links for 2010-07-20on Programming
Poker AI
* Nightshade Engine on EvolveYour Hierarchy
* Nightshade Engine on EvolveYour Hierarchy
* Gotta strike while the iron is hot – A night at TSC (2010.03.24) Scrabble Adventures on CheckWord – My iPhone Scrabble word checker app * Mick West on Delving into CowboyProgramming
* Kevin C on Delving into CowboyProgramming
* Peter Moss on Some Trees I Made * vitrier on AURemoteIOServer Error getting default device UID: ‘!obj’ * Rein on Some Uses of SQL Databases inGame Development
* Boynton Beach on
AURemoteIOServer Error getting default device UID: ‘!obj’ * Poker Bill on Programming PokerAI
* Free iPad on Custom responsiveness measuring device * Eastern Europe on Custom responsivenessmeasuring device
* Compressibility of Water « Greg Arakelianon
Practical Fluid Mechanics * personalized playing cards on Programming Poker AI * jonathan on AURemoteIOServer Error getting default device UID: ‘!obj’ * Game Engine Design / iPhone Game Engine Resources | Kleinsch on Evolve Your Hierarchy * Facebook Applications on iPhone OpenAL Linking Problem * Matt Kukowski on Comments vs. SelfDocumenting Code
* Un Nouveau Moteur | Kromatykon Evolve Your
Hierarchy
* John Jones on Evolve Your Hierarchy * van lines movers on AURemoteIOServer Error getting default device UID: ‘!obj’ * Adam on Reddit-proofing WordPress * Interesting Reading… – The Blogs at HowStuffWorkson
Programming Responsiveness * iPhone Games Review on iPhone OpenAL Linking Problem * Linkmoko on My coding practices in1991
* To assert or not to assert | .mischief.mayhem.soap. on Some Uses of SQL Databases in GameDevelopment
* burning calories on VisualizingFloats
* Drilian’s House of Game Development » Blog Archive » Update ForThe Past N Months
on
Evolve Your Hierarchy * Matt C. on Why is Vista Slow? * Bill on CPanel Hotlink Protection Breaks WP Permalinks * gebäudeenergieberater on iPhone OpenAL Linking Problem* Programming Tools
on My coding practices in 1991 * Erik on Delving into Cowboy Programming * computer education onProgramming Bio
* waldkraiburg on Pushing Buttons * Mick West on CheckWord Reviews * Stan R. on CheckWord Reviews * baju korea on Debugging Memory Corruptionin Game Development
* Alexander Churanov on Debugging Memory Corruption in Game Development * pýrlanta on Some Uses of SQL Databases in Game Development * Angelreisen on Pushing Buttons * Erick on Programming Poker AI * Glass Queens on iPhone OpenALLinking Problem
* dog health information on VisualizingFloats
* muscle supplements onProgramming Bio
* çelik kapı on Compiling Ruby as a Visual Studio Solution * Facebook Applications on iPhone OpenALLinking Problem
* jonathon @ be a video game tester on Custom responsiveness measuringdevice
* clabbers on CheckWord * Second Chance Checking on iPhone OpenAL Linking Problem * Zach on Evolve Your Hierarchy * Seiska on Cowboy ScrabbleProgramming
* lehti on Debugging Heisenbugs * Tilaa on iPhone OpenAL Linking Problem * train horn on Custom responsivenessmeasuring device
* Ian on My coding practices in 1991 * Payday Loans IL on My codingpractices in 1991
* Phil Ivey on Programming Poker AI * spyder paintball guns on Custom responsiveness measuring device * pitching machines on Custom responsiveness measuring device * adult site reviews on My coding practicesin 1991
* Catherine Ellis on HotfixingVista
* software gestionaleon Shattering
Reality
* ajay powell on iPhone OpenAL Linking Problem * estetik on Falling Sand Game from the’80s
* Poker guy on Programming Poker AI * Catherine Ellis on VisualizingFloats
* simon on
AURemoteIOServer Error getting default device UID: ‘!obj’ * Checking Account on iPhone OpenAL Linking Problem * Facebook Application Developers on CheckWord – My iPhone Scrabble word checker app * Patil S K on MySQL Server Install Problems with Vista * WSOP on Programming Poker AI * iphone application developerson
Debugging Memory Corruption in Game Development * Baju Muslim on Debugging Memory Corruptionin Game Development
* Justin on MySQL Server Install Problems with Vista * Omar on Blob Physics * danny on iPhone OpenAL Linking Problem * Marc on Evolve Your Hierarchy * postgresql fanboy on Some Uses of SQL Databases in Game Development * Mick West on Evolve Your Hierarchy * Ash on Evolve Your Hierarchy* thuiswerk on
CPanel Hotlink Protection Breaks WP Permalinks * EvaUnit02 on Programming Responsiveness * Shakor on Delving into Cowboy Programming * Cindy on MySQL Server Install Problems with Vista * nielsbot on CheckWord – My iPhone Scrabble word checker app * Miles3298 on Why is Vista Slow? * Brad on AURemoteIOServer Error getting default device UID: ‘!obj’ * Smartie77 on Speeding up slow Vista * Smartie77 on Why is Vista Slow? * bholly on AURemoteIOServer Error getting default device UID:‘!obj’
* james @ train horns for sale on Reddit-proofing WordPress * Mick West on Evolve Your Hierarchy * andrei pokrovsky on Evolve YourHierarchy
* fx trading on AURemoteIOServer Error getting default device UID: ‘!obj’ * Mick West on MySQL Server InstallProblems with Vista
* Phillip on MySQL Server Install Problems with Vista * bowling news on iPhone OpenAL LinkingProblem
* corporate video on AURemoteIOServer Error getting default device UID: ‘!obj’ * Mobile Application Development on iPhone OpenAL Linking Problem * Mobile Application Development on CheckWord – My iPhone Scrabble word checker app * ÐºÑ€ÐµÐ°Ñ‚Ð¸Ð²Ð½Ð°Ñ Ñ€ÐµÐºÐ»Ð°Ð¼Ð° on AURemoteIOServer Error getting default device UID: ‘!obj’ * Problems with Wordpress categories gone | Mosabuam - Manfred Moser, Werner Moser and gang on Blogroll and Categories not working in WordPress 2.3.2 * götten sikis on Reddit-proofingWordPress
* kelowna on Custom responsivenessmeasuring device
* Generic on Custom responsiveness measuring device * Kirk on Custom responsiveness measuringdevice
* Kirk on Some Uses of SQL Databases inGame Development
* Kirk on AURemoteIOServer Error getting default device UID: ‘!obj’ * Steven on Programming Poker AI * Steven on Programming Bio * xt Commerce Templates on Pushing Buttons * EIleen @ Philippines Outsourcing onSome Trees I Made
* nintendo r4ds on AURemoteIOServer Error getting default device UID: ‘!obj’ * J Surrey on AURemoteIOServer Error getting default device UID: ‘!obj’ * xt Commerce Templates on CPanel Hotlink Protection Breaks WP Permalinks * Mick West on CPanel Hotlink Protection Breaks WP Permalinks * motorsport on CPanel Hotlink Protection Breaks WP Permalinks * Mick West on CheckWord – My iPhone Scrabble word checker app * Lee Rimar on CheckWord – My iPhone Scrabble word checker app * RobertMfromLI on Blogroll and Categories not working in WordPress 2.3.2 * ZigBee on AURemoteIOServer Error getting default device UID: ‘!obj’ * Raymund @ Pinoy Social Network on Some Uses of SQL Databases in Game Development * Krishna on MySQL Server Install Problems with Vista* Yuly Navas
on
AURemoteIOServer Error getting default device UID: ‘!obj’ * Tim Claason on Delving intoCowboy Programming
* iphone on iPhone OpenALLinking Problem
* busana muslim on Debugging Memory Corruption in Game Development * coding on My coding practices in 1991 * Pimp My Nintendo on Measuring Responsiveness in Video Games * Handmade jewellery on iPhone OpenALLinking Problem
* songs on Blogroll and Categories not working in WordPress 2.3.2 * Music Videos on AURemoteIOServer Error getting default device UID: ‘!obj’ * vippipaikat on Custom responsiveness measuring device * Mick West on Evolve Your Hierarchy * jason on Evolve Your Hierarchy * Brian on The Seven Stages of the Programmer * Brian on The Seven Stages of the Programmer * F on Delving into Cowboy Programming * tony g poker coupon code on CheckWord – My iPhone Scrabble word checker app * New cars on AURemoteIOServer Error getting default device UID: ‘!obj’ * Understanding Lag « c# to javascript, actionscripton
Programming Responsiveness * Zed Shaw on The Seven Stages of the Programmer * Andy on The Seven Stages of the Programmer * Andy on The Seven Stages of the Programmer * Dominique Rabeuf on The Seven Stages of theProgrammer
* Niner on The Seven Stages of the Programmer * Doug on The Seven Stages of the Programmer * Hugh on MySQL Server Install Problems withVista
* ggn on My coding practices in 1991 * ggn on My coding practices in 1991 * Spanish Fork Mechanic on CPanel Hotlink Protection Breaks WP Permalinks * fast property sale on Custom responsiveness measuring device * Bill on MySQL Server Install Problems with Vista * The extreme IT personalities and how to lead around them. « The World of an IT Leader on Delving into Cowboy Programming * Mick West on Programming Poker AI * 3m0k1D on Programming Poker AI* mike on Custom
responsiveness measuring device * Pmaz on Programming Poker AI * Mick West on Evolve Your Hierarchy * Bjrn on Evolve Your Hierarchy * Mick West on Evolve Your Hierarchy * Bjrn on Evolve Your Hierarchy * perfect on Reddit-proofingWordPress
* James on Measuring Responsiveness inVideo Games
* Andy Berdan on AURemoteIOServer Error getting default device UID: ‘!obj’ * Ali on Falling Sand Game from the ’80s * tony on Falling Sand Game from the ’80s * Entity Systems « chrislunsford.com on Evolve Your Hierarchy * Gareth Lees on Some Uses of SQL Databases in Game Development * inkjetcanvas on Custom responsivenessmeasuring device
* Manu on MySQL Server Install Problems with Vista * Arul Inthirarajah on CheckWord * Mike on Practical FluidMechanics
* Mike on Programming Bio * cooking games on Falling Sand Game from the ’80s * Free Games Download on Falling Sand Game from the ’80s * Mick West on Some Trees I Made * Domain Reviews on CPanel Hotlink Protection Breaks WP Permalinks * Joe on Some Trees I Made * Mick West on Mature Optimization * Malcolm on MatureOptimization
*
WORDPRESS
* Log in
* Entries RSS
* Comments RSS
* WordPress.org
June 3rd, 2010
1995 PROGRAMMING ON THE SEGA SATURNBy Mick West
This is a document I wrote in 1995, while working on Neversoft’s first game: Skeleton Warriors. Â It was the first game I’d worked on where I did not use 68K Assembly. The photo shows me at work around that time. The Saturn dev kit (the “Small Box” and the ICE) is on the right. THE STATE OF THE GAME The following document briefly describes the state of the code for Skeleton Warriors on the Sega Saturn, and also points at some of the many things still to be done….. The primary purpose of this document is to effectively bring Dan, Ken and James up to speed with the current code, explaining what each module does, and how they interact. It will also give Mick an overview of the sad and sorry state of his code, hopefully prompting him topull his socks up.
I will also maybe go into a little detail regarding the incorporation of data (the .GOB and .GOB files) into the program, and what we will be doing in the future. The Development Hardware The target machine is the Sega Saturn, which has two SH2 Risc microprocessors and one 68000. Currently we only use the Master SH2, the slave SH2 will be used when we get around to figuring out how. The 68000 is used to drive the sound chip, we should not have to write any code for that as we will be using the Sega supplied sound library. The program is nearly all written in plain C. We use the GNU SH2 compiler to produce the SH2 assembly output. There are a few SH2 modules, mostly limited to pure data. I have not, as yet written anything at all of significance in SH2. The development system we use is PsyQ. This is not the Sega standard development system, however, it is considered to be the best by everyone who has tried it. The alternative system is SNASM, by Cross Products, who are owned by Sega. Most of the sample code supplied by Sega is intended to run on the SNASM development system, however it is easily convertible to the PsyQ. The PsyQ system consists of a SCSI interface board that you install on the PC, and a cartridge that plugs into the Saturn, and a cable to connect the two. Source is compiled on the PC and downloaded to the Saturn where it is run. The code can be debugged from the PC. The link is controlled by a TSR program (PSYBIOS) that handles communications between the machines. It also allows the Saturn to load files from the PC in much the same way it would load them from CD. We use this feature to load the files for each level. Mick also has a couple of large, and loud boxes in his room. He also has two PCs. The smaller of the two boxes is a E7000PC, which is an SH2 In Circuit Emulator, useful for telling where you program has crashed if the PsyQ debugger does not stop it. Also useful for watching memory writes, but I've not used it very much yet. The Second of the loud boxes is what is known as a "Small Box" (The original "Large Box" was about the same size as a small fridge). This is essentially a Saturn, with extra interfaces for the E7000 and for the CD emulator. It also has switches on the front to change the country ID, and to switch between PAL and NTSC. The CD emulator is what the other computer has inside it. A big board which uses the hard drive of the computer to pretend to be a CD drive. You can build a CD image on this and emulate in real time mode to see what the game will look like when it actually gets to CD. This seems to nearly more or less work to some extent, though there are a few problems which I am working with Sega to try and resolve. Compilation and linking The overall construction of the final program is controlled by a single makefile: MAKEFILE.MAK. This contains the dependencies and targets for the entire project, including the compilation of the .GOBand .GOV files.
Individual C source (.C) modules are compiled into SH2 (.OBJ) object modules by the program CCSH. This first calls the GNU C preprocessor CPPSH (in the C:\GNUSH2\BIN) then calling CC1SH on this output to produce SH2 assembly code, then finally calling ASSH (in C:\PSYQ) to assemble this into the final object format. We do not use C++, as I was told it produced prohibitively large object files. However I have not experimented with this, and those // comment would be useful. Feel free to experiment. The few SH2 assembly language files we us (with .S extension) as simply assembled directly to .OBJ files using ASMSH (not the same as ASSH, it is a more complex macro assembler). At the moment, they are really only used for the simple incorporation of data, and have no machine specific code in there. The RAM on the Saturn that you can put code in is split into two one megabyte chunks. One at address $06000000 and the other at $00200000. The chunk at $00200000 is used exclusively to hold the graphics for the main character. The program code actually goes at $06010000 (the first $10000 bytes are used for system space, the stack and suchlike.) The code is position dependent and is complied to run at that specific address ($06010000) and no other. The .OBJ files are linked together with the PSYLINK program to produce a file MAIN.CPE which is an executable program with a small header that can be downloaded to the Saturn with the RUN program. PSYLINK uses the file TEST.LNK to specify which .OBJ files to include andwhere to put them.
The Data
The game is split into a number of levels, many of the levels use some of the same data, but mostly it is different from level to level. Each level has all the data for that level brought together in two huge files .GOV and .GOB. (for the mine it's MINE.GOV and MINE.GOB). The GOV file contains a short header, then all the data that need to be in video memory. The .GOB file contains all the data that need to be inRAM.
A level consist of some of the following data files. .SSQ – A sprite sequencer file .SBM – A bitmap file, used for the bitmap backgrounds .MAP- Both maps for the character mapped backgrounds. .TIL – The tilesets and palettes for the character mappedbackgrounds.
.PTH – The data for the path and trigger points. .TEX – Textures for the path. .SSQ and .SBM files are produced by Mick's increasingly irrelevantsequencer "SEQ".
.MAP, .TIL, .PTH and .TEX files are produced by Dan's increasing amazing map editor "TULE". These files are assembled into the appropriate .GOV and .GOB files, using the ASMSH assembler. See files LEVEL.S and LEVEL1.S to see how it is done. Some level specific data is also included in the .GOVfile.
The Modules
TEST.S – Nothing really, sets up a few labels. MAIN.C – The top level of the program. Contains the hardware initialization, the level setup, the level playing code and various other little bits and pieces that should really be put in more appropriate modules. Has a fair amount of garbage in as it is the module easiest to put things in for quick testing. Contains the code for loading from CD or PC fileserver. Contains the Flag for switching the TIMING color bars on and off. GFXLIB.C – Various routines for accessing the hardware and performing various graphics functions. These were all written pretty much from scratch by Dan and are often very inefficient. If you find yourself using a routine from here a lot, it might be a good idea to take a look at what it is doing and write a faster version incorporated with your code. However, all the functions work and provide an excellent framework for the initial implementation and testing of things. Pat on the back for Dan, without whom, none of this would be possible. SMP_PAD.C – Various routines for reading the Saturn joypad, veryhardware dependent.
GLOBALS.C – All the global variables and a few general function. The use of global variables is appropriate programming practice. However, it is rather slow to implement global variables in SH2 for various reasons, so I may eventually convert some to these to global structures, if needs be. Contain the variables describing the state of the MAN and the PATH. MAN.C – Handles the movement and display of the man (Prince Lightstar, Talyn, Guardian or Grimskull – the character that you control). At present this is mostly logic for moving him around and colliding with the path. Also providing the appropriate animation for each action. A lot of work still remains to be done here. OB.C – Handles movement and display of the objects in the game, specifically the enemy objects, like Skeleton Warriors and little alien things. This is were the bulk of the gameplay will be programmed in terms of enemy AI and basic movement and triggering. the data structure is still not finalized, specifically the issues of collision and animation are not fully worked out. Lots of work here. DATA.S – Various tables, at the moment, mainly the animations of the main man characters. LAYER.C – The scrolling of the parallax backgrounds. Updates the character mapped backgrounds and scroll the bitmaps. Also does the line scroll (the wavy effect) on the fog layer. At the moment the maps for the character mapped layers are stored uncompressed. They need to be compressed in the RLE format I was using on the genesis version. This task may fall to Ken if we get a Saturn dev system before a Sony. PAL.C – The palette. There are 2048 colors to choose from, any pixel on screen can be any on these colors. I have logically divided the palettes into eight 256 color palettes. PAL.C has code for initialize these, setting them up and some provision for cycling them. They will also need fading and more complex cycling, as well as brightnessflashes etc.
BUL.C – Primitive setup for handling bullets (sword blast, hand blast, wrist rockets etc.) as separate objects. Still needs a fair bit for work for more complex use of bullets. Still needs proper collisionand animation code.
PAD.C – Simple module to remember the state of the joypad in a more usable format. Remembers if a button has recently been pressed, and if it is pressed now. START.C – One line to say what the first level is, for ease of changing it with a batch file. PANEL.C – Some simple routines for putting up a power bar. PATH.C – Monstrous routines for drawing the path and also doing collision detection with the path. MATH.C – Simple Sine, Cosine and Rotate a point by an angle. Here’s some sample code from MAN.C. Everything is very hard coded, referring to a global “Man” data structure. Lots of hardcoded numbers.
/**************************************************************/ /* Trigger jumping if needed, also variable height jump logic */Man_JumpTrigger()
{
if ( Man.JumpFudge ){
Man.JumpFudge--;
}
if ( Man.Mode != M_Crouch || Man_StandingRoom() ) // ok if not crouched, or there is headroom{
if (Pad_Jump->Pressed) /* jump button pressed */{
if ((Man.Contact || (Man.Mode == M_Hang) || Man.JumpFudge) && Pad_Jump->Triggered && !Man.Blocking) /* and not already jumping */{
if (Man.Mode == M_Hang && Pad1.Down.Pressed){
Man.Contact=0;
Man.Mode=M_Jump;
Man.AnimBase = LS_Jumping; /* Change base anim to jumping */ Man_TriggerSeq(LS_Jump); /* start the jumping start anim */ Man.YV.f = 0x10000; /* and have no YV */ Man.Y.i += 4; /* and have no YV */}
else
{
Pad_Jump->Triggered = 0; if ( !JetPacCheat ) Man.YV.f = -0x00080000; /* Initial jump speed */else
Man.YV.f = -0x00008000; // Initial speed in Jetpac mode Man.Contact = 0; /* not on the ground any more */ Man.JumpTime = 0; /* just started jumping */ Man.AnimBase = LS_Jumping; /* Change base anim to jumping */ Man_TriggerSeq(LS_Jump); /* start the jumping start anim */ Man.XV.f+=Man.FlyVel; if (Man.HangEnd && Man.Mode == M_Hang) // if hanging { // and on the end of a pathMan.HangEnd = 0;
Man.X.i += 12*Man.Facing; // the move past end of path Man.JumpTime = -3; // bit more fixed v jump time}
Man.Mode = M_Jump; /* change mode to jumping */}
}
else /* Already jumping */{
if (Man.JumpTime++ < MaxJumpTime) /* Still in initial jump period */ Man.YV.f -= 0x0005000; /* So can maintain jump YV */}
}
else /* jump button not pressed */{
Man.JumpTime = MaxJumpTime+1; /* so can't alter YV again until landed */}
}
}
The file OB.C grew to a 9000 line monster file, which included all the behavior patterns of the individual objects in the game. Also with a vast amount of hard-coded numbers, like this: Drop_Arac(S_Ob *pOb){
int t;
if (pOb->Jump==1)
{
pOb->yv.f+=0x7fff;
pOb->y.f+=pOb->yv.f; t=Path_GetYZ(pOb->x.i,pOb->y.i,pOb)-15; if ((t>pOb->y.i)&&(ty.i+20)){
pOb->Jump=0;
pOb->y.i+=15;
Turn_Around(pOb);
pOb->SeqFile=Sprites; Object_TriggerSeq(Arac_JumpLand,pOb);}
}
else
{
if (pOb->Frame==16)pOb->Jump=1;
if (pOb->AnimStat==AnimDone){
pOb->t1=0;
pOb->Mode=&Pattern_Arac;}
}
Command_Arac(pOb);
}
Nasty stuff. This style of code was appropriate when games were very small, and grew out of the 68K days. Posted in Game Development| No
Comments
May 28th, 2010
CUSTOMIZING HOME PAGE BOOKMARKS ON IPHONE AND IPADBy Mick West
Sometimes you want to set a bookmark on the home page that has arbitrary text (like some search parameters) in the URL, but navigating to that URL forwards you to another URL that strips off the parameters. On the iPhone and iPad you can edit bookmarks after you create them, but if you make you bookmark by “Add to Home Screen”, then there’s no way of editing in the parameters. Here’s an easy way to fix this: 1) Go to the site, and zoom the screen so you’ll end up with a niceicon
2) Exit Safari, go to Settings->General->Network->WiFi, then tap the blue arrow next to your WiFi network name 3) Under HTTP Proxy, set it to manual, and change the server to a random .com, like  dhfudsnfjuefsdajf.com 4) Back in safari, enter the custom URL.  You’ll get an error, but the URL will be unchanged. 5) Tap the “+” then “Add to Home Screen” 6) back into the settings, and undo the proxy changes. Posted in Game Development| No
Comments
May 20th, 2009
AUREMOTEIOSERVER ERROR GETTING DEFAULT DEVICE UID: ‘!OBJ’By Mick West
Normally when get an novel error message I just look it up on the internet, and get some clue as to the solution. But this was a first, no clue at all. Even the “AURemoteIOServer” hardly showed up at all. So I though I’d share my solution, to help the three other people who have similar problems. Here’s the deal. Programming on the iPhone using the simulator on a Mac Mini. I buy a meaty Mac Pro, which compiles incredibly fast, migrate everything over, but when I run code with OpenAL in it, it crashes with the above error and an unclear call stack. SOLUTION: WENT INTO SYSTEM PREFERENCES -> SOUND -> OUTPUT, AND SAW THE DEVICE WAS SET TO IPHONESIMULATORAUDIODEVICE, I CHANGED THIS TO “INTERNAL SPEAKERS”, REBOOTED, AND ALL WAS WELL. (actually, changed it to Digital Out first, but that was no crash, yet silent, so then changed to Internal Speakers after reboot). What caused this? Who knows? I suspect it was something to do with XCode not being migrated, possibly because my OSX was 10.5.7 on the Mini and 10.5.6 on the Pro. Anyway, it was an obscure bug, and the lesson learned was that you have to dig around _related_ things somtimes, especially in a loose system like the emulator – which is not really emulating, just being a narrow window on the Mac’s hardware, hence is calling the Mac’s sound code. Posted in Game Development| 18
Comments
March 20th, 2009
IPHONE OPENAL LINKING PROBLEMBy Mick West
If you are having linker problems like: ld warning: in /Library/Frameworks//OpenAL.framework/OpenAL, file is not of required architectureUndefined symbols:
“_alSourcePlay”, referenced from: SoundEngineEffect::Start()    in SoundEngine.o SoundEngineEffect::PlaybackProc(void*)  in SoundEngine.o Then the problem is that you have an OpenAL framework in /LIBRARY/FRAMEWORKS and XCode is looking there first. The simple solution is to delete or rename it.  But that’s not very useful if you need it for something else, or you want you code to compile for other people.  So the correct solution is to change the Framework Search Path. So, in Project -> Edit Project Settings  select “All Configurations” and “All Settings”, then under Search Paths -> Framework Search Paths,  add: $SDKROOT/SYSTEM/LIBRARY/FRAMEWORKS/ This will show up in the options as something like iphoneos2.2/System/Library/Frameworks/ (depending on the project setting, and at compile time will automatically switch to the correct framework for the target architecture (simulator or device) and OSversion.
Posted in Game Development| 15
Comments
December 29th, 2008
SOME USES OF SQL DATABASES IN GAME DEVELOPMENTBy Mick West
RELATIONAL DATABASES Relational Databases are sometimes viewed as being in the domain of business applications and web development. You would use a relational database for boring applications such as inventory, accounting, or implementing a shopping cart system for a commercial web site. Databases can be viewed by game-programmers as old-fashioned, large, slow, and replete with imponderable terminology such as “inner joins”, “foreign key” and “tuple”. However, modern databases are actually fast, easy to use, and can be quite useful in various stages of game development. While relational databases can be immensely complex and powerful, their robustness and ubiquity means they can also be useful for relatively simple tasks. In this article I’ll attempt to de-mystify databases a little, show how they can easily be incorporated into development code, and discuss a fewpotential usages.
WHAT IS IT?
A relational database is simply a set of tables with named columns where each row is an individual record. Game programmers essentially use many forms of relation databases at run-time to store and organize things like game objects and various resources. Those databases are generally rather ad-hoc, and tuned for a specific purpose and operating environment, and are implemented using custom code. While technically this is a database, the programmer would probably not refer to it as such. The usages of relational databases I discuss below are not intended to replace these custom in-game “databases”, but rather to add new functionality to be used during the development process. While the examples I give are all for Windows based development, the nature of communication with a database server is basically text based, so a minimum amount of work would be required to implement similar functionality on console platforms.SETUP
Databases are run by a server, so the first thing you need to do is set up a server. The server can be local, in that it’s part of your code, and you access it directly via a relatively low level API. Alternatively the server can be remote, and you access it via a network connection. This distinction can be blurred a little as you can have a server on your local machine, accessed via the network (using localhost) – but that’s still essentially a remote server, just somewhat quicker. Here we’ll be discussing remote servers. There are several ways of setting up a database, and what you settle on will vary with your needs and situation. If you have developers in various locations, then you might benefit from having your database hosted by a third party, as this should ensure everyone has sufficiently fast access. If your developers are all on the same network, then you’d more typically have the databases hosted on the network server. If you are a lone developer, then you’d be more likely to have the database on your local machine, to take advantage of the additional speed. Setting up a database is very easy. If you have remote hosting you are often supplied with a web interface such as phpMyAdmin that allows you to create databases and users. On a local network your network server will often already have some database server software installed, and you can just add a database to that. Lacking this, you can very simply install a database by downloading and installing the MySQL software, which takes only a few minutes to get up and running. Once you have a database up and running, it’s very important that you have some way of testing your connection and the database, so you can more easily debug problems with your code. A useful tool here is HeidiSQL, a free program that let’s you connect to your database server, and setup, examine and modify databases in a visual manner. There is also more fully featured software such as PremiumSoft’s NaviCat, which performs similar functions. In the examples below I give the SQL query definitions for the database tables. While it’s quite possible to set these up using a command line tool or web interface, it’s generally easier to use a tool like NaviCat, as it allows you to more easily adjust individual parameters in your tables. A database server can have various users. If you are just doing some initial experimentation, then you can just log in as the “root” user that you set up when you installed the server. However, as you expand the usage of the databases, then you will want to add additional users with fewer privileges to prevent inadvertent modifications to the database. Once this is set up, you can now connect to your database from your code. The simplest way (from game code) is to use the C API. The code to connect is shown in listing 1. The SERVER_NAME would be the URL or ip address of your server, or “localhost” if it’s on your local machine. This setup needs only be done once when your program runs, and the other examples assume this has already been done, and there is a valid value in the “handle” variable. Error checking is omitted for clarity, but is something you will need to add, especially if connecting over the internet. LISTING 1 – Code to connect to a database #define SERVER_NAME “localhost” #define DB_USER “user_name” #define DB_USERPASS “password” #define DB_NAME “db1″ MYSQL *handle=NULL; handle = mysql_init(NULL); mysql_real_connect(handle,SERVER_NAME, DB_USER,DB_USERPASS,DB_NAME,0,NULL,0);UNIQUE ASSET IDS
A useful example of using a database during development is for the generation of asset IDs. I touched on this briefly in my article “Practical Hash IDs” (Game Developer, December 2005). The idea is that for the purpose of efficiency (both speed and space) it’s best to refer to assets using a unique 32 bit ID. In the previous article, I suggested using 32 bit CRCs for the ID. That approach has a number of advantages, but there is still the problem with collisions, and if you are going to use databases in a broader manner it makes more sense to generate the IDs using the database. The simplest way to do this is to have a table that consists of an ID and an asset name (as a string). The ID field will be an integer, and set to autoincrement. (See Listing 2) Then whenever you add an asset name to the table, a unique ID will automatically be generated. To find the 32-bit ID number of any string, we simply look to see if it’s in the database, and if not, we add it. Then we just query the database for this string. See Listing 3 for a function that implementsthis.
Listing 2 – SQL that defines the simple table of IDs CREATE TABLE `TABLE1` ( `ID` INT(11) NOT NULL AUTO_INCREMENT, `NAME` TEXT, PRIMARY KEY (`ID`) ) Listing 3 – Get a unique ID for a string identifier uint32 GetID(const char *name) { char select_query; char add_query; MYSQL_RES *result=NULL; MYSQL_ROW row; uint32 id = -1; sprintf(select_query,“SELECT * FROM table1 WHERE name=’%s’”,name); if (!mysql_query(handle,select_query)) { result = mysql_use_result(handle); row = mysql_fetch_row(result); if (!row) { sprintf(add_query,“INSERT INTO `table1` (`id`,`name`) VALUES (NULL,’%s’)”,name); mysql_query(handle,add_query); mysql_query(handle,select_query); result = mysql_use_result(handle); row = mysql_fetch_row(result); } id = atoi(row); mysql_free_result(result); } return id; } These IDs are typically baked into the data as part of the build process, but can also be used directly in the code in the exact same way as was outlined in “Practical Hash IDs”. Note here that what we are doing is not a run-time process. The database is only intended to be used during game development, for the initial creations of ID by the team. If you are using CRCs, then it’s quite easy to modify this code to check for collisions.TRACKING ASSERTS
A common issue during game development is what to do about asserts and warnings in the code. Warnings are often ignored by non-technical staff, and manual solutions such as “when you see this warning, come and tell me” are not very reliable. The line between asserts and warnings is often blurred in order to facilitate uninterrupted development. Asserts (which should indicate some fatal error which requires immediate attention) sometime have an “ignore” option, which gets switched on by the creative staff, who don’t care so much about tracking down your bugs. In a development environment with a large number of people, there could be a lot of asserts or warnings being fired off by your code, and it swiftly becomes very difficult to separate signal from noise, and to get the information to the correct person. Clearly some automated system would be useful. Here we can easily use a simple database table to track these things. Listing 4 and 5 show a simple implementation of this. Listing 4 – SQL Table for storing asserts CREATE TABLE `ASSERTS` ( `ASSERT` TEXT, `MESSAGE` TEXT, `FILE` TEXT, `LINE` INT(11) DEFAULT NULL, `MACHINE` TEXT, `TIME` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP )<>
Listing 5 – Assert replacements that log asserts to a database table char assert_buffer;
void assert_printf( const char* text, … ){
va_list a;
va_start(a, text );
vsprintf( assert_buffer,text,a);va_end(a);
}
void SQLAssert(const char *assert, const char *file, int line){
printf (“%s, %s, %d\n”,assert_buffer, file, line);char query;
sprintf(query,”INSERT INTO `asserts` (`assert`,`message`,`file`,`line`,`machine`) VALUES (‘%s’,'%s’,'%s’,'%d’,'%s’)”, assert,assert_buffer,file,line,GetMachineName()); mysql_query(handle,query); if (0 /*don’t ignore*/ ) __asm int 3}
#define NewAssert( test)\if( !(test)) { \
assert_buffer=0 ; \
SQLAssert(#test,__FILE__,__LINE__); \}
#define NewAssertM( test, params )\if( !(test)) { \
assert_printf params ; \ SQLAssert(#test,__FILE__,__LINE__); \}
// Usage, note extra parentheses: // NewAssertM(p==NULL,(“p not NULL (%p)”,p)); // NewAssert(p==NULL);<>
The macro NewAssert is a drop-in replacement for the standard assert() macro. The only parameter is a test that must return true. If it returns false, then the macro calls SQLAssert with #test (a string containing the actual test code), and the standard file and line numbers. SQLAssert then formats a string that will add these to the database.
In addition there is a more sophisticated assert macro, NewAssertM, that takes an additional parameter which is actually a list of parameters enclosed in parentheses. These are passed to the assert_printf() function which treats it as a sprintf into the assert_buffer. The assert_buffer is then passed to the database. This allows you to add an arbitrary string to the assert info in the database, usually this would contain the values of various variables involved in whatever you are testing. See the example usage at the endof listing 5.
So what we have now is an assert macro (or a warning macro) that you can track every single instance where it fires, and no longer have to rely on the artists and level designers (or even the testers) to accurately report what is going on. You can even leave it in for beta versions, and gather a large amount of data from a geographicallydiverse set.
The example shown includes a field for “machine”, which is intended to hold the machine name. Using this you can identify if a particular warning is going off a lot for one particular user. You could quite easily extend the assert logging to hold any additional information that might be useful, such as the IP address, or the current level name. Since this is a standard database, it’s very easy to query, extract reports into spreadsheets, and even generate graphs and web-pages from the information in the database. Interesting metrics can be generated, such as which source files trigger the most assertions, or even what day of the week has the highest rate ofproblems.
The 'time’ field in the table is set to “default CURRENT_TIMESTAMP”, which means that whenever the assert fires, this field is set to the server’s current date and time. This can be very useful in tracking down bugs, as you can see when an error or warning first occurred, and attempt to correlate that with whatever was changed around that time. This can be useful for prioritizing things. If a particular assert has been triggering for several days (or weeks) and nothing is being done about it, then it might be that it needs to be downgraded to a warning, or an informational message (or you might need to fire someone.) This kind of high level overview of issues can be useful when there are a large number of developers on a team.OTHER USES
The two examples above make very little usage of the vast power of a relational database server. The data structures are essentially flat, and there is nothing “relational” about them. Normally a database would have multiple tables, cross indexed with each other to avoid data duplication. However, there is nothing wrong with using a database in this simple manner. It might seem like overkill to use it for logging – which you might do to a CSV text file – but it does not cost us anything to do it like this, and you immediately get the benefits of multiple remote connections to a robust repository, and very sophisticated filtering and report generation. The fact that we are barely using any of the features of the database is beside thepoint.
With that in mind, there might be other obvious areas where a database could be used instead of plain logging. User input could be logged if your database is fast enough. Many gameplay metrics could be logged in early test versions, such as how long it takes to complete each goal in each level. This data could be collated over thousands of runs, and used to fine-tune the difficulty level of a game. Remember that once you have the basic database set up and the connection software in place, it is very easy to add arbitrary new tables, and to start recording whatever you like.Resources:
MySQL – A powerful open source database server. dev.mysql.com Paul DuBois – Writing MySQL Programs Using C, MySQL, Third Edition, Sample Chapter: http://www.kitebird.com/mysql-book/ch06-3ed.pdf Posted in Game Development| 11
Comments
Previous Entries | NextPage »
Cowboy Programming is powered by WordPress | Using Tiga theme with a bit of Ozh + WP 2.2 / 2.3 TigaUpgrade
Details
Copyright © 2024 ArchiveBay.com. All rights reserved. Terms of Use | Privacy Policy | DMCA | 2021 | Feedback | Advertising | RSS 2.0