Global Game Jam Retrospective

Another Global Game Jam has come and gone but I am still on a high from having made a complete game in less than 48 hours. Global Game Jam is a worldwide (duh!) event where people get together and try to make a game in 48 hours based on a theme which is given out when the event starts. This years theme was transmission.

In this post I will detail what I think went well and not so well for me during the jam. But first, the game itself.

Major League TelthemeBlast is a local multiplayer sports game where players use teleporters that explode upon use to destroy other players and become the last one standing.

The idea came about during the group brainstorming session where someone thought of teleportation as a way of “transmitting” an object or person. Since teleportation is relatively easy to create as a game mechanic and I really enjoy creating local multiplayer games, it didn’t seem like too much of a leap to make it something out of the idea.

What Went Well

Scope and planning

This was the first time I’ve ever managed to not go overboard in scope during a game jam and I think most of it had to do with creating a Trello board to manage my tasks. I made sure that I was always working on something that I had planned to implement and if I took too long on a single component, I shelved it and worked on it later.

Another thing that really helped me was the 4:44 principle coined by Rami Ismail which says spend 4 hours getting the core mechanic of your game done and spend the other 44 polishing it (minus sleep and anything else life throws at you). Although it took me slightly longer than 4 hours to get the core mechanic in, it provided a good guideline for me to know if I was on track.

I really enjoyed the game I produced

For once I was proud to show off something I had worked on; I was still nervous to showcase it but I was still proud of what I produced and people really seemed to enjoy it. I also had a lot of confidence in my core mechanic and it is really a game I enjoy playing with my friends. I don’t think this would have been as evident if I didn’t spend most of my time polishing the game.

What Could Have Gone Better

I didn’t find a team

I went into the weekend hoping to find a team to jam with however a multitude of things happened that meant I decided to work alone.

I couldn’t make it to the keynote and theme reveal because of family reasons. I met a group after the keynote and went for a brainstorming session where we narrowed it down to a couple of ideas, one of them being teleportation. I had to leave them after the brainstorming session to go watch the Australia Day skyworks and by the time I got back, they had split into groups and were both working on separate driving themed games, neither of which really enticed me.

By that time I was dead set on using teleportation and had a pretty decent idea to back it up that I just went it alone.

Where to From Here

Lets Make Games is hosting an after jam event on the 10th of February so my goal is to polish it off and add more to showcase it there. I have gone back to my trusty planning tool Trello to add more tasks and keep on track and I have been trying to show it off to as many people as possible to get their feedback.

I really hope to get this game to a somewhat complete state so I can either sell it on itch.io or possibly even Steam but that seems far off at the moment. In the meantime I will be updating my progress on this blog so please follow me on Twitter to find out when I update.

Major League TeleBlast on Global Game Jam

I'm in for Global Game Jam 2018

So following on from the tradition of posting an “I’m In” when you are participating in Ludum Dare1, here is mine for Global Game Jam 2018.

After years of not doing much game development and never actually having somewhat of a reasonably completed game in my portfolio, I have decided to commit to doing Global Game Jam this year.

I will be participating at an event here in Perth, Australia and I’m going with the intention of meeting people and forming a group at the event. Since my expertise has always been programming, I hope to meet some artists/designers/other programmers and work as part of a team to get something done in the 48 hours.

Where I have usually let myself down in previous game jams is through too much scope and pursuit of perfection as opposed to just good enough. I really hope to meet some more experienced game jammers who can help me stay grounded and focused on getting one idea or mechanic complete in as short a time as possible and then polish from there.

As for the tools I will be using:

Game Engine: Unity3D (C#)

Graphics: GIMP, Aseprite

Sound: Audacity, SFXR

Timelapse:

while [ 1 ];do vardate=$(date +%d\-%m\-%Y\_%H.%M.%S); screencapture -t jpg -x ~/Desktop/Timelapse/$vardate.jpg; sleep 10; done

I also have one optional goal that I’ve set myself and that is to build a game that is playable on an arcade machine since I am currently in the process of building my own and I think it would be really awesome to be able to play a game I made on it.

Also been looking through the list of diversifiers, there are a couple that have caught my eye:

  • So Sociable - Build a game that uses a social network API
  • Upside down - One or more game systems programmed by an artist, major art assets produced by programmers/coders
  • Look back - Create a game which uses retro controllers of any type. No modern controllers! (which fits in with my personal goal)
  • Created by Warren Robinett - Your game contains some kind of hidden secret or Easter egg.

This week I have started getting back into working with Unity3D so I don’t go into it without any practice. I am very much looking forward to putting something together over the weekend, meeting some people and having fun.


1 So the whole tradition of “I’m In” posts came about because there was a bug feature in the Ludum Dare website where a user didn’t exist until they created a blog post, hence they got people to tell them that they plan on participating and what tools they intend to use. Ludum Dare FAQ

Pathfinder to D&D 5E - The Differences

Context

So I have been DMing a Pathfinder campaign (Rise of the Runelords) for a group of my mates for the last couple of months however from my point of view, things just haven’t felt right. As a DM I have been feeling bogged down by the rules, from having to know when to apply minor +1 bonuses or penalties to being able to describe why we have 5 different knowledge skills and what they are used for. I have been looking at a number of different systems to try and adapt to including Savage Worlds and Dungeon World but finally I have settled on D&D 5th Edition. This is a small look at the rule differences as they apply to our group for their benefit as well as anyone else thinking of making the switch.

Differences

Skills

D&D 5th Edition greatly simplifies both the list of skills and how to apply them. Here is the list of Pathfinder skills with their D&D equivalents:

Pathfinder D&D
Acrobatics Acrobatics
Appraise  
Bluff Deception
Climb Athletics
Craft  
Diplomacy Persuasion
Disable Device  
Disguise  
Escape Artist  
Fly  
Handle Animal Animal Handling
Heal Medicine
Intimidate Intimidation
Knowledge (arcana) Arcana
Knowledge (dungeoneering)  
Knowledge (engineering)  
Knowledge (geography)  
Knowledge (history) History
Knowledge (local) Investigation
Knowledge (nature) Nature
Knowledge (nobility)  
Knowledge (planes)  
Knowledge (religion) Religion
Linguistics  
Perception Perception
Perform Performance
Profession  
Ride  
Sense Motive Insight
Sleight of Hand Sleight of Hand
Spellcraft  
Stealth Stealth
Survival Survival
Swim Athletics
Use Magic Device  

In addition to this, players no longer put ranks into skills when they level up. Instead, their class determines what skills they are proficient in and when they use those skills, they instead get a bonus applied to the roll based on their level.

D&D also makes use of Passive Skill Checks, something I couldn’t find mentioned in the Pathfinder rule book. Passive skill checks don’t require dice rolls and is used by the DM to secretly determine whether the player characters succeed at something such as noticing a hidden monster. Passive skill checks are equal to:

10 + skill modifier + proficiency bonus (if proficient)

In addition to this, the aid another action is replaced by simply giving a character advantage (see Advantage and Disadvantage) if two or more are working together. There is also rules for group checks which force everyone to make a skill check and if at least half succeed then the check is a success, otherwise it is a failure.

Proficiency

Proficiency is incorporated into D&D at the expense of Skill Ranks and Saving Throws and scales with your characters level. When you create your character, you choose what skills and saving throws you are proficient in and any time you use those skills, you apply your proficiency bonus in addition to your ability modifier.

In addition proficiency is added to:

  • Attack rolls with weapons you are proficient with
  • Attack rolls with spells you cast
  • Ability checks using tools you are proficient with

Proficiency starts at +2 at level 1 and increases every 4 levels thereafter.

Saving Throws

Reflex, Fortitude and Will saves are “replaced” with ability saves meaning instead you will use your STR, DEX, CON, INT, WIS, CHA ability modifiers for your saving throws. It really is just a naming change but it reduces the number of terms players have to remember.

When you create your character, your class determines which 2 abilities you have proficiency in which means whenever you have to perform a saving throw of that type, you add your proficiency bonus.

Item Proficiencies

Your class will tell you what weapons and items your character is proficient in using. Whenever you use these items, you gain your proficiency bonus to your skill check.

Advantage and Disadvantage

Instead of remembering all the cases where players get minor bonuses or penalties when rolling the dice, D&D incorporates advantage and disadvantage. This makes it much easier on me since I don’t have a DM screen full of when these bonuses or penalties should apply.

In both cases you roll 2 d20s; if you have advantage you take the higher value and if you are at a disadvantage you take the lower value.

Cover

Cover is one of these things where I’m somewhat puzzled as to why they didn’t just use the advantage/disadvantage system in favor of +X bonuses but I can also see why. Simply, half cover provides a +2 bonus to AC and 3/4 cover provides a +5 to AC. You cannot target someone in full cover.

Inspiration

I tried to introduce a similar system into our game of Pathfinder under the term Hero Points. In hindsight I probably went a bit too overboard with the description of them and set too many parameters around how they are earned and what they are used for.

Inspiration is awarded when you play your character in a way that is true to their personality traits, ideals, bonds or flaws or otherwise portray your character in an interesting way.

Inspiration can be used to give a player advantage on one attack roll, save throw or ability check.

Character Personality

I love the D&D includes some guidelines for fleshing out a character as part of the creation process; in particular traits, ideals, bonds, flaws and background.

At character creation, a character background or create your own which describes where you came from and how you became an adventurer. This will then define your possible traits, ideals, bonds and flaws or you can create your own.

Your personality traits define your character, you get to choose 2 at creation. e.g. I’ve enjoyed fine food, drink, and high society among my temple’s elite. Rough living grates on me.

You also get to choose 1 ideal, which describes what drives your character. Ideals typically are connected to your alignment. e.g. Power - I hope to one day rise to the top of my faith’s religious hierarchy.

Your bonds represent your connection with the people, places and events in the world. You get to choose 1 at creation. e.g. I owe my life to the priest who took me in when my parents died.

Flaws represent some vice, fear, compulsion or weakness for your character. e.g. I am suspicious of strangers and expect the worst of them.

Feats

Feats are optional in D&D and are quite powerful. Every 4 levels, you get to choose if you want to take a feat or increase 2 of your ability scores. In our campaign, feats characters currently have will be reworked slightly to match their D&D power levels.

Combat Turns

Combat turns are mentioned a lot more simply in D&D but that doesn’t mean they lack the depth of Pathfinder, it leaves more up to the DMs discretion and players imagination. Each player turn in combat is simply:

  • Move
  • Take 1 action

Some spells, actions or abilities will also allow you to take a bonus action on your turn. You can only take 1 bonus action per turn.

When you attack, you no longer apply a base attack bonus. Instead, if you are proficient with the weapon you are attacking with, you can apply your proficiency bonus.

Critical Hits

Critical hits mean you roll your damage dice twice, there is no rolling to confirm the critical.

Non-Lethal Damage vs Knocking Out

Instead of stating whether you are doing non-lethal damage; when an attacker reduces a creature 0 hit points, they determine whether the opponent is killed or just knocked out.

Two Weapon Fighting

As long as you have a light weapon in your other hand, you can attack with it as a bonus action. You don’t add your ability modifier to the damage of the bonus attack.

Combat Maneuvers

The terms Combat Maneuver Defense (CMD) and Combat Maneuver Bonus (CMB) are gone in favor of using a characters Athletics and Acrobatics skills depending on the situation. I like this change because the few times I would have to ask for a player characters CMD it would draw blank looks followed by a search through the character sheet to find the appropriate value.

Damage Resistance

In Pathfinder, damage resistance is expressed as a type of damage followed by a number which determines how much to reduce incoming damage of that type. This is simplified in D&D by ruling if a creature or character has resistance to a particular type of damage, damage of that type is halved against it.

D&D also introduces vulnerabilities. If a creature has a vulnerability to a particular damage type, damage of that type is doubled.

Dying

When you start your turn with 0 hit points, you must perform a death saving throw. Roll a d20, if the result is 10 or higher, it is a success, otherwise you fail.

On your third success, you become stable. On your third failure, you die.

This is just a small summary of the rule differences between Pathfinder and D&D that I found important for our group, they are in no way all the differences. In a follow up, I will be discussing how the player characters change as a result of us moving to D&D.

Releasing is Equal Parts Terrifying and Exciting

Just over a month ago I released my small side-project to the world and while the limited hype around it has fizzled out, its an experience I will never forget. I built a web app that showed Board Game collectors to show the games in their collection that they have not played, something commonly known as a ‘wall of shame’; you can view it at Board Game Wall of Shame.

This was the first time I’ve ever built something to the point where I felt proud to put it out in the wild. Normally I would start a whole bunch of ideas but never get to a point where I can look at it and say I’m proud for people to start using it. I feel like I have partly experienced a fear of shipping and partly a lack of motivation to continue working on things.

My approach to side projects

I must say I’ve read my fair share of articles about dealing with a fear of shipping but the most useful by far was a Hacker News thread on it in which, a wise person stated that the only way to get over a fear of shipping is by actually shipping. There are more pieces of wisdom in the thread which I could rehash however here are some of the biggest things I learned from this process.

Know your Target Audience

And know where they frequently go; it helps if you are also part of this community. These are the people that are going to care about what you’re doing and make sure you’re not just telling people you know because you’re not always going to get realistic feedback from them.

So for me this was easy, I was targeting board gamers and the places they most frequent are [/r/boardgames] and [Board Game Geek]. I got my biggest spike in users when I posted my project to the Board Games Subreddit which was an incredibly exciting experience for me. I was able to watch the usage graphs spike and the database fill up with entries which was really fucking cool.

My first week of traffic

Respond to Feedback

No matter how good or bad it is, make sure you have a presence and respond to what people have to say.

This was the hardest one for me, not everyone is going to like what you’ve done and those people are typically the ones that are going to let you know about it. Within the first 10 minutes of my post being on Reddit someone commented with a URL on Board Game Geek that will allow you to do the exact same thing as my web app did. At this point I could have said “how stupid am I for building something that is already easily available?!” and called it a night.

Called out on Reddit

But I think the most important thing is how you respond to that feedback. I could take pride in how well my web app displayed the results and how people found it more pleasurable to use. So make sure whenever you release your product, you are there to respond to people and provide a real presence behind it no matter if the feedback is good or bad.

Continuing Work is Harder than Finishing

One of the most amazing things that happened when I released my app and told people about it was the constructive feedback and additional features people wanted to see. While it was extremely exciting to see people using my product, it was more exciting that they could see the potential of it and give me ideas on how to improve it.

While getting the app to a point where I was proud to show it off was difficult and became a bit of a slog at times, it was a whole lot more difficult trying to continue on working on it. In my head I was done, I had got it to a point where I was happy with it and even though some people provided me with some great ideas to extend it, I just could not find the motivation to implement them.

I think this comes back to my approach to side projects where I always want to work on the next big idea because after enough time I poke enough holes in the existing ideas them that they sink. That is why something like the Board Game Wall of Shame is going to be something I may use from time to time but I think it will eventually fall away.

Having said that, the experience of actually shipping something and getting it in the hands of actual users was a hugely beneficial one, mostly full of ups and involving a sizeable learning curve in how to deal with feedback. It is something I would love to do again, provided I come up with something I am motivated to work on for long enough.

Building, Testing and Deploying your Nuget package with Travis CI

This all came about because I am building a Board Game Geek XML API wrapper in C# and wanted to be able to commit a change, build and upload the new version of the package to Nuget. You can view the repository here. If you want to get straight into it without diving indepth, my .travis.yml configuration file is as follows

language: csharp
solution: <Project Name>.sln
install:
  - curl -L -o nuget.exe https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
  - mono nuget.exe restore <Project Name>.sln
  - mono nuget.exe install NUnit.Runners -Version 3.6.1 -OutputDirectory testrunner
script:
  - xbuild /p:Configuration=Release <Project Name>.sln
  - mono ./testrunner/NUnit.ConsoleRunner.3.6.1/tools/nunit3-console.exe ./<Project Name>Test/bin/Release/<Project Name>Test.dll
  - mono nuget.exe pack ./<Project Name>/<Project Name>.nuspec -Version $MAJOR_VERSION_NUMBER.$MINOR_VERSION_NUMBER.$TRAVIS_BUILD_NUMBER
  - mono nuget.exe setApiKey $NUGET_API_KEY -Source https://www.nuget.org -Verbosity quiet
  - mono nuget.exe push <Project Name>.$MAJOR_VERSION_NUMBER.$MINOR_VERSION_NUMBER.$TRAVIS_BUILD_NUMBER.nupkg -Source https://www.nuget.org/api/v2/package  

Also it was quite important that my nuspec file had the following lines. You can view my full nuspec file here.

<files>
     <file src="bin/Release/<Project Name>.dll" target="lib/<Target runtime>" />
</files>

The first 2 lines of the file should be fairly self explanatory and are required for telling Travis about your project. I’ll start by going into the install section of the file.

  - curl -L -o nuget.exe https://dist.nuget.org/win-x86-commandline/latest/nuget.exe
  - mono nuget.exe restore <Project Name>.sln
  - mono nuget.exe install NUnit.Runners -Version 3.6.1 -OutputDirectory testrunner

These lines simply set up the necessary dependencies to build your project, namely the latest version of Nuget, any dependencies for your project and the NUnit test runner. I know it may be considered bad practice to bring in the latest version of Nuget for this however until it lets me down, I don’t think I’ll change it.

The more interesting part comes in the script configuration.

  - xbuild /p:Configuration=Release <Project Name>.sln
  - mono ./testrunner/NUnit.ConsoleRunner.3.6.1/tools/nunit3-console.exe ./<Project Name>Test/bin/Release/<Project Name>Test.dll

The first two lines simply build the library using xbuild and runs the unit tests for the project. If you have no tests you can simply remove all the lines that reference NUnit.

Note about using different versions of NUnit - You shouldn’t have a problem most of the time using a different version however I know between versions 2 and 3, they completely changed the directory structure so it did take a bit of fiddling to find the correct test runner.

  - mono nuget.exe pack ./<Project Name>/<Project Name>.nuspec -Version $MAJOR_VERSION_NUMBER.$MINOR_VERSION_NUMBER.$TRAVIS_BUILD_NUMBER

This line simply builds the Nuget package based off your nuspec configuration. It is important to note here that you cannot just reference your csproj as you may do when running on Windows since this feature is not supported as of yet on Mono. I have also added environment variables in Travis for MAJOR_VERSION_NUMBER and MINOR_VERSION_NUMBER and then I use the automatically generated TRAVIS_BUILD_NUMBER for generating a full version number.

  - mono nuget.exe setApiKey $NUGET_API_KEY -Source https://www.nuget.org -Verbosity quiet
  - mono nuget.exe push <Project Name>.$MAJOR_VERSION_NUMBER.$MINOR_VERSION_NUMBER.$TRAVIS_BUILD_NUMBER.nupkg -Source https://www.nuget.org/api/v2/package  

The final 2 lines relate to uploading your package to Nuget. The first requires you to have set your NUGET_API_KEY in the environment variables for Travis. Also if you have a public build it is very important that you include the -Verbosity quiet option in this step since otherwise your API key gets exposed in your build log.

The final line will simply push your Nuget package to the server.

I hope you have enjoyed my quide to building, testing and deploying your Nuget packages with Travis CI and if you have any questions or comments, feel free to let me know below.