Skip navigation

Category Archives: Game Design

I’ve been getting back into my game engine again.  Shawn Kendall, one of the owners of ZG, has been kind enough to provide me with some tips and pointers for engine design.  Shawn is an incredibly learned man in this subject and used to teach game engine design at Full Sail U here in Florida.  Naturally, this has been an amazing opportunity which I plan to continue to leverage as much as possible.  In any case, the basics of the engine are pretty much planned out by now and I will probably be uploading the images of that sometime soon.  It’s been a lot of work and slow going, but it will be pretty awesome to have an engine of my own to dork around with and gain experience from.

On to the title of this post: the people at the ZG office **LOVE** Magic: The Gathering.  They play pretty much every Friday night, sparsely during the week, and sometimes even during breaks.  They are constantly talking about the new sets that are coming out, the recent deck they built to best so-and-so, and how broken certain cards are.  Me?  I like Magic, but I probably won’t ever get to the level of devotion that these guys have.

However, I have found that MTG is a very solid, well built, and fascinating game.  Since my time this summer has been almost exclusively *coding* games, I figure flexing my design and balancing skills is just as important.  I think Magic is a great place to start with that, so I have come up with a few card concepts that I would love to have feedback about.  I will hopefully be churning out more card concepts over the summer, but we’ll start with these:

Spiteful Visions:  2 Black                                      – Common

Sorcery

Target player discards 2 cards and draws a card.

Conspire

“Forgetting is as much of a blessing as a curse.” -Iithes

Slash and Burn:  3 Red, 2 Colorless                   – Uncommon

Sorcery

Destroy target green permanent or target basic land unless it’s controller pays 3 Life.

“Take a life to save a life?  Sounds like a fair trade.”

Thriving Sapsire:  5 Green                                    – Rare

Creature – Saproling Ancient

3/3

Put a -1/-1 counter on Thriving Sapsire: put two 1/1 Saproling tokens onto the battlefield.

When Thriving Sapsire is placed in a graveyard, put two 1/1 Saproling token onto the battlefield.

Creatures of the forest never die, they simply get smaller.

Inspired Flight:  2 Blue, 2 White                        – Common

Enchantment

Enchant Creature

Enchanted Creature gains +2/+3 and has flying.  Place a -1/-1 counter on enchanted creature.  When enchanted creature is put into a graveyard it’s controller gains Life equal to the number of -1/-1 counters on enchanted creature.

“The best things in life might just kill you.” -Tarr’agun

I’ve been putting off a new post for quite a while now since I feel that readers don’t care about how cool things have been around here.  Let me just say that ZG is pretty damned amazing.  The people are awesome, the work is engaging, and I couldn’t ask for a better introduction to the games industry.

As far as things I’ve learned though:

I learned about the “user story” planning model.  I had never heard of this before ZG, but it is apparently sweeping through the industry as the revolutionary new way to manage projects.  How this works is content is presented as a need from the user’s perspective.  Then tasks are assigned to the stories to separate the user story into a functional piece of the product.  For example, a user story might be: As a player, I want to be able to jump. This means that whatever is needed to make the final result of a jumping player is encompassed by this story: physics engine, character animations, noises, decals, whatever as long as the final results of the story is that the user perceives jumping.  After the stories are all compiled, the team then participates in “planning poker”.  A deck of cards with groups of Ace, 2, 3, 5, 8, Jack, Queen, and King are split up so that all members have one of each card.  A user story is selected and everyone places a card on the table estimating the difficulty of that story.  Ace is trivial, 2 is a day, 3 is slightly more than a day, a three is two to three days, etc., where Queen is a 25, meaning the task is large and hard to predict it’s time needs and King means 50 – a task that is daunting and will require many many man-hours to complete.  This technique seemed a little strange at first, but it has turned out be very powerful.  It really helps to figure out what concessions you need to make in order to deliver the expected results and packages each story into a single entity, generally independent of other parts of the project.

Next on the list of edumacatification is “Scrum Team Management”.  This is a part of the agile development philosophy, attempting to keep teams and projects lightweight and flexible.  The idea is that scrum meetings are held every day at the same time and last no longer than 15 minutes.  Period.  In these meetings everyone on the team explains what they did yesterday, what they plan to do today, and if they are waiting on anything (a blocker, as it’s called).  This puts everyone on the same page and encourages communication.  It seems to have worked pretty well so far.

Along with the Scrum methodology is the Sprint ideal.  Sprints are short periods of development where a specific set of user stories are focused on.  If a user story is not part of a sprint, it is ignored (unless there is a direct dependance, wherein both the blocking story and the depending story will most likely be involved in the same sprint).  These sprints are usually 2-4 weeks in length, but some longer and some go shorter.  For example, I have been working in 1 week sprints.  This is mostly because my project is smaller and we have very few people working on the project at this time, allowing for rapid development and easy communication.

My last piece of wisdom to pass down is simple, but profound.  I have been informed that it is NEVER a good idea to make more work for the people above you.  Take the time to do it right the first time.  Research, test, model, plan, do whatever you need to do.  Because if you do something stupid and someone who costs the company more money has to clean up after you, everyone is going to be angry and you will look dense and inconsiderate.  This doesn’t mean you shouldn’t ask for help.  This means that you should exhaust every resource you can before you go whining to more expensive people.

Things have been going really well down here.  Florida blows, but that’s really only because I’m used to dry, cooler weather.  Be sure to keep in touch and stay tuned in.  I should have more nuggets of wisdom some time down the line.

I don’t own the rights to The Matrix, so I can’t sell this.  However, I can put it in my portfolio and show it off to potential employers.  So take a gander and let me know what you think.  Alex, eat your heart out!

The Matrix Role Playing System

I decided to go with the maze game for the iPhone/iPod Touch.  It will consist of a target that will either be circular or cuboid that the player must move to the end point using their fingers to guide it.  Touching a wall or object will set the target back to the last checkpoint.  I haven’t decided whether I want to implement lives or a timer.  I will try both and see which one playetesters enjoy more.  I think lives will be best, but that remains to be seen.  Simple game with some decent potential, here’s what I have for the “boring architecture part”:

Graphics

  • Don’t need texture loading (that I can think of)
  • Simple style of colored shapes
  • View scrolling when the target gets to the edge of a defined area.
  • Will have to rebuild Radiance to make sure all of this works well.

User Interface

  • Basic Cocoa UI elements, using Radiance I can overlay what I need.
  • Want to experiment with different kinds of menus and UI displays.
  • Need to make sure view scrolling is adjustable.

Physics

  • Implementing Separating Axis Theorem which requires rebuilding Continuum.
  • Need to detect edge triggers for things like doors and victory conditions.
  • Unit test the crap out of my revamped vector system and rotation implementation.

Game Logic

  • Target resets to last checkpoint after (5) seconds of not being touched.
  • If the target touches an edge or another object, reset.
  • Timer?  Lives?  TBA
  • Later levels will have the target orbit the touch point.
  • Later levels will have multiple targets.
  • Later levels will have multiple targets with independent end points.

Level Builder

  • Grid system to start, build level with “positive” tiles on negative background.
  • Want to implement this in Lua to allow for greatest flexibility.

So, that’s pretty much the gist of it.  I have a lot of work to do.  Already rebuilt the vector class I was using to be a little more friendly.  Looking into SAT implementations.  I understand the concepts, but I’m unsure about implementation.  This is gonna be a lot of work at a difficult time.  Cross your fingers…

That’s right, the end of the semester is rapidly approaching.  For the last few weeks of class we are supposed to pick a personal project that we want to do and run with it.  I have a few ideas for this one.  I already told Prof. Monnens I was going to do one of these, but I am still deciding.  Here are the possibilities:

  • A maze game for the iPhone
  • Help Tim with Mass Effect TTRPG
  • Realistic space combat game
  • 4x TBS game that I have been working on in the past
  • The Speciation Sim outlined in ‘Life, advanced’ below.

I’m probably going to do either the maze game or help Tim.  Both of these are relatively simple and would fit within the purview of the class.  I may just assign them percentage values and roll a d100 like a good nerd.  I’ll be sure to post what I decide and how I got there.  Peace.

EDIT:  I have opened it up to a poll.  I will be deciding shortly, so get your votes in now!

A good friend of mine, Alex Haase, visited me this weekend and I told him about my idea for an evolution-based game/simulation to expose the mechanics of the evolutionary process and the complexity of homeostasis within a single organism as well as within an entire species. We collaborated to create a very detailed set of rules, environments, and implementations in order to achieve this end. I’m incredibly proud to present the method we came up with.

GENETICS

A given organism’s genetic code will be represented by an array of strings. This array will be arbitrary [8-80] in length, and the strings will also be arbitrary in length [1-256]. This will bring maximum storage for a single genetics table to (256 bytes * 80 / 1000 bytes/kb) 20.48kb. This is quite reasonable and represents a rather large amount of data. However, data in a real gene is not read from end to end. Different genes are spread out over the chromosome, including sections of inert and unused data. Upon generation of the genetics table, a gene map will also be created to determine where each gene sequence begins and ends. This will be represented by an array of arrays containing gene location objects which will hold table index, gene start, and gene end. In this way, the genetics table can be parsed for information dynamically without the possibility of easy user interpretation. Alex had suggested that patterns be evaluated for certain well-known advantageous traits (such as camouflage, cyst stasis, or territorial marking). I agree with a slight modification: the the pattern checking be based not on a specific, static pattern, but by recognition of stepped character differences (more about this later). These patterns will be stored in a dictionary (hash table) of trait expression objects.

So, the way all of these pieces come together is like so:

The genetic table generator will run, generating a table with random properties and values. Keep in mind, the strings will actually be evaluated on their ASCII values in relation to target values. More on this in a few. A simple genetic table might look something like this:

[0] -> Ysl74.,34,.9/\]2gg5D25][46

[1] -> IIb,berl3/64654=/+saddhrt9rh-9454y

[2] -> ?>wa/a’QR#M KGLcknw83_+++

The gene map will create an array containing information like this:

(Motility) [0] -> [0] -> {index: 2, start: 6, end: 15}

The trait generator will generate a table of traits looking something like this:

[“Hibernation”] -> {34, 123, 65, 19}

[“Poison”] -> {10, 99, 14, 29, 78, 16, 41}

The numbers in the trait expressions represent the difference from one character to the next. So a gene section with the ASCII difference between it’s first and second letters that is 10 would begin to qualify for the trait at index 1. The more of these sequential differences the gene satisfies, the stronger the trait will manifest. This kind of checking may be quite expensive, but we’ll have to see.

Genes will be evaluated against a randomly determined array of arrays of numbers to determine the organisms resulting fitness. Genes will be read using the gene map to concatenate all of the like genes together, and then the system will begin evaluating each gene based on it’s ASCII value. The randomly determined array works as a standard. The deviation from the standard by each character in the string goes towards the gene’s score. Then the length of the gene, the total score, and the number of standard elements are factored in to get the final score for that gene. So, say our Motility gene standard was 34-198-102, and we had a gene that was translated into ASCII with values 56-202-181-89-30-2-102. Well, 56 is closest to 34 and is off by 22, so the first score is 22. 202 is closest to 198 and off by 4 so the total so far is 26. 181 is closest to 198 and is off by 17, so the total score is 43; and so on. Normally I would do all the math, but I don’t feel like it right now. Let’s just assume that the total score is 116. We then calc the gene potency by dividing the maximum string capacity (255 * 7), 1785, by the total score to get 15.3879. We then divide this answer by the number of standard values (4), to get the final value of 3.8. This is a fantastically good gene value. Most values will have values between 1.2 and 2.8, but it will vary greatly.

SPECIES

Our first plan for the implementation focused on microbial life. It’s a great starting point, so that’s what I will present here and will be working with for a while. However, I hope expand to multi-cellular creatures at some point, because I feel this system has a lot of potential no matter what scale you work at. So, here are attributes used to describe an organisms capabilities and presence within the sim/game:

  • Offense: Determines the amount of damage the organism can deal to it’s target food source. Food sources will only relinquish food (or die) after a certain amount of damage has been dealt.
  • Motility: The speed at which the organism can move about. This value will be guaged on percentage of a maximum value.
  • Defense: The amount of physical damage resistance, representing cell wall composition or hide thickness etc.
  • Sensation: The degree to which the organism is aware of it’s surroundings.
  • Blending: The degree to which the organism can blend into it’s environment.
  • Health: Determines the maximum amount of damage the organism can sustain until it dies.
  • Metabolism: The percentage of energy the organism can glean from it’s food source.  A higher value allows for more energy output.
  • Storage: The amount of food the organism stores for later use.  Stored food also increases the organisms weight, requiring more energy to move.
  • pH Resistance: The range of pH values the organism can survive in.  If the organism is in an environment it is not resistant to, it will begin taking damage at a rate of (|resist – environment|).  This gives them time to move into suitable environs.
  • Radiation Resistance: The amount of radiation the organism can withstand without becoming ill.  Double this value will kill the organism outright.  Radiation always has a chance of damaging DNA, so rad resist is simply for living conditions.
  • Ion Resistance: The range of diluted ions that the organism can live in.  This attribute functions similarly to pH resistance.
  • Thermal Resistance: The heat range in which the organism can live.  This attribute functions similarly to pH resistance.
  • Redundancy: The number of copies of genetic code the organism possesses.  When something effects DNA (such as radiation damage or replication), a random copy will be selected.  This aids in radiation resistance and mutation resistance.
  • Regeneration: How quickly physical wounds and health are healed.
  • Sequencing: The speed and accuracy at which replication occurs.  Levels are stepped, providing more accuracy, then more speed, etc.
  • Diet:  This one’s tricky.  This attribute determines which food sources the organism can eat, which ones it cannot eat, and which ones are poisonous (should it eat it), including poisons from attacks and other biological agents.

ORGANISM

In between each generation cycle, each organism will have active stats that will be taken into consideration while advancing state:

  • Health: The current amount of health the organism has.  If this falls to 0, it dies and can be therefore eaten.
  • Motility Modifier: This is directly effected by the organism’s health, decreasing as the organism is injured, allowing predators to  secure their prey more easily.
  • Energy: This is spent to perform different tasks, such as moving, digestion, attacking, regenerating, or reproducing.  Energy is gained through the eating and digestion of food.
  • Food Stored: The amount of food the organism has stored before it needs to feed again.
  • Health Modifier: This stat is directly effected by the organism’s radiation, pH, ion, and heat conditions.  If this modifier changes the organism’s maximum health to 0 or lower, the organism dies.
  • Conditions: This array stores the amount of ongoing radiation, pH, ion, heat, poison, physical, and other conditions that may be affecting the creature.

ENVIRONMENT:

The ‘test’ environment for this sim/game will be a petri dish.  The environment will be filled with many different species of bacteria, and resources will be pretty readily available, just to make sure the system works.  However, as the scope of this project grows, environments will become much more realistic and interesting.

  • pH Balance: The acidity of the surrounds.
  • Ion Balance: The amount of dissolved ions.
  • Background Radiation: The amount of ambient radiation.
  • Ambient Heat: The amount of ambient heat in the environment.
  • Resource Pockets: These pockets of food will be scattered about randomly.

The environment will change, sometimes slowly, sometimes rapidly.  Many different events will occur to change the environment in one way or another to show how selective pressures change species.

So, that’s the idea for now.  I’m still trying to figure out how to make this into a fun and interesting *game* versus a interesting *simulation*.  Will give more details later.