The Rinkhals has Eclectic Tastes (PyWeek 9)
Monday, September 7th, 2009 | Uncategorized | No Comments
This past week Confluence, Jerith, Nitwit, David and I took part in PyWeek 9 — an online challenge to write a computer game in one week. The result is Operation Fox Assault. It’s a bit like what Warcraft would have been if the protagonists were chickens and the game had been written in a week. Mac, Windows and Linux downloads are available on our team page.
Now for some general musings on the PyWeek that was.
Each PyWeek begins with the entrants voting on a theme. The result is announced at midnight (GMT) on a Saturday and this is the starting gun for the one week of development. Final submissions must be uploaded before midnight the following Saturday, although there is a twenty-four hour grace period after that to allow developers to fix critical bugs or sort out problems with packaging and uploading their entries.
This PyWeek’s theme was ‘Feather’. The Sunday morning after the announcement the core Rinkhals team gathered at the Yola offices to brainstorm game ideas and strategise. I think it was Jerith that came up with the spark that resulted in the Operation Fox Assault concept but even before the idea was fully formed the entire team was running with it. A few whiteboard sketches later and we were stuck in to game development. Initially Confluence was doing artwork, Jerith was creating the tile map and Nitwit and I were running around putting general architecture such as the game engine in place.
Based on discussions overheard on th #pyweek channel it seems we were one of the few teams to get off to a rapid start. Many of those represented on the channel were still hunting around for basic game concepts on the second day of the competition.
Looking back at that first session there were two things that were to aid us greatly in the week ahead:
- We had a good concept that the entire team was enthusiastic about.
- We were realistic about what was achievable. Nitwit pointed out that we each had about twenty hours of development time available and although we did extend that a bit by working long evenings during the week, I think it was a solid estimate of the subjective time available.
At the end of the first day we had something that ran and displayed the game board.
The rest of the week was a frenzy of development (except for Tuesday evening which was spent playing V:tES). On Wednesday Jerith came round to our place to code. Sometime in the middle of the week David joined the team and added sound. Stubbed code written by one developer was suddenly leapt on by other developers and turned into fully fledged features.
From a programming perspective the tight deadline was surprisingly liberating. Gone was agonizing over how best to structure code or long-term maintainability. Grabbing low-hanging fruit and rapid development were the order of the day.
Team Rinkhals is almost certainly the most talented development team I’ve had the privilege to be part of and I have a newfound appreciation for what a difference a talented team makes. Not once did I have to explain basic Python or programming concepts, or show someone how to use svn merge or dive into the internals of a library to debug something for someone else. I felt I could trust the code committed by my fellow team members — which given that there was very little time to read it was helpful.
By the time the final Saturday arrived we were in pretty good spirits. Operation Fox Assault was in good shape and although there were a reasonable number of items left on the to-do list most of them were minor enhancements and polishing. The big outstanding items were packaging the game for Windows (using py2exe) and Mac (using py2app). I got stuck into the py2exe work in the early evening. There were some scary moments when the py2exe build was segfaulting but eventually at around ten o’clock the Windows packaging was sorted out and we headed out to Roxy’s for a leisurely dinner. We returned shortly before midnight. Jerith put the finishing touches on the py2app packaging and the rest of us cleaned up minor bugs before submitting our entry a few minutes after 2:00am.
Now all that’s left is to take part in the judging which runs until the end of this week. I’m anxious to see Fox Assault do well, but I’m already satisfied that we ended up with a pretty cool little game — the three hours I spent playing it in unlimited mode last night are testament to this.
If you’re wondering about the rinkhals’ tastes, see the Wikipedia entry.
P.S. Also see Nitwit’s post about our team’s PyWeek experiences.
DMs’ Dinner II
Monday, May 25th, 2009 | Roleplaying | No Comments
a.k.a. This Time We Won’t Bitch About Our Players (Much)
This was the second of our (so far) two DMs’ Dinners. For the benefit of those unfamiliar with the concept, it’s an evening where DMs gather to talk shop. Each DM brings something to drink, a plate of eats and a topic for the agenda. The agenda isn’t prescriptive — it’s just a pool of topics to draw from to keep the discussion flowing and prevent interesting talking points being forgotten.
Both dinners have been quite successful. On each occasion we covered a lot of ground, generated a pile of new (to me) ideas and managed not to womble too far from the subject of running roleplaying games. While I’d like to attribute this to our mad organisational skills and the quality of guests, I think the success stems mostly from the nature of DMing itself.
Present: Simon, Adrianna, Mike, Beth, Dave S, Matthew, Garrick, Ian, Oliver, Anna, Dave M, Dan, Karl and Chris.
Topics we didn’t get to: Game days; Season 2 always sucks; Fudging the dice; Use of red herrings
Introductions
As is now customary we kicked off with each person briefly introducing themselves and saying something about their roleplaying background. I didn’t minute any of this but I did write down the name of a system every time one was mentioned:
WoD, Ars Magica, Old WoD, DnD, Underwater DnD, L5R, The Window, Aberrant, Psion, Trinity, Unknown Armies, Deadlands, GURPS, MERP, Call of Cthulhu, Dark Heresy, DnD 2nd Ed to 3.5 Ed, DnD 4th Ed, DnD, DnD, Old WoD, Unknown Armies, Masquerade, Requiem, Hunter, Mage: the Awakening, DnD, New WoD, AD&D.
Party Cohesion
The first topic select was Party Cohesion — how to avoid running a separate game for each player:
- Vetting character players and including inter-party bonds at character creation. Lots of people indicating that this didn’t often guarantee cohesion.
- Keep side plots on the side. Have a firm idea of which plots the party are currently working on together and keep those central.
- Make sure that plots intended to be central are ones the party feel they can play together.
Alternatives to Victory
So many plots and scenes end in victory for the players. How do we help parties deal with failure, accept defeat and move on?
- Some Call of Cthulhu and Unknown Armies players have the opposite problem — a mindset of failure. In this cases the problem is more one of getting the party to act like there is some chance of success.
- If the players are forced to retreat, it helps to quickly give the party a direction to retreat in — nearby fortifications, a place of safety, allies or reinforcements. This then replaces the old goal of outright victory, allowing the group to stay focused.
- Defeat can often lead to players being too cautious.
- Beware of the limbo where the players aren’t sure what you expect of them in a scene. Make sure that they as players have some idea of the risks involved in continuing the fight and consequences of retreating.
- In-game ways for the characters to assess the difficulty and risk of a situation.
- Practice killing PCs.
- Provide the option of a negotiated settlement.
- Death is not the only form of failure.
- Help players get over the defeat by having an NPC their characters respect, especially a powerful NPC, congratulate them. Have some response from the winning side — let the PCs know their enemy has at least felt the blow.
- Possibility of gaining allies as result of defeat.
- If your party is too gung-ho, use in-game means to let them know not everyone likes they way they operate. Perhaps have a neutral NPC become an enemy.
- If there is a negotiated settlement, it helps to have the PCs take the initiative otherwise they’re left feeling that they have simply done what their enemies asked.
- NPCs are your way of showing the PCs what the world thinks of them. In a more general sense, the community the PCs inhabit can also fulfill this role.
- Make use of creative consequences.
- Sometimes it’s nice to win.
- Closure is often more important than winning.
Climactic Combats
Do they work? Are they just dicefests? Are there ways to make them better? What are the alternatives for climactic scenes?
- Break up your fight scene in multiple stages. Wear the PCs down rather than hitting them hard in one go. Make it less of a winner-takes-all scenario.
- Introduce alternative objectives such as taking the villain alive.
- Have a twist in the plot in the middle of the climactic combat. Some factor the PCs didn’t account for in their plans which forces them to reevaluate things.
- Build tension with small random elements — the guard who almost spots them, the weapon which jams and has to have the chamber cleared, etc.
- Make the location interesting.
- Put a time limit on the combat (the bomb explodes in sixty seconds, that kind of thing).
- Sync game time with real time. It adds urgency and tension and prevents the scene dragging out. But if you do this, give the PCs ample time to plan.
- Try having the rewards or aftermath be the real climax.
- Maps: Good for planning and ensuring a coherent view of the combat situation. Bad as it encourages detailed round-to-round strategizing and slows down combat.
- Have perception checks in combat but create minor penalties to rolling them (-5 to attack, that sort of thing). Make sure there are occasionally things to see (the hidden sniper or tripwire, the enemy leader sneaking out the back door).
Building Cities
Cities are big and it’s impossible to fully experience even the cities we live in. How to we make cities in our games feel realistic and detailed?
- Each character coming up with their own location, three per PC — where they live, where they work, where they socialise.
- Comprehensiveness trap: don’t try to map the whole thing. The game city is a big morass the players reach into for smaller locations. Flesh out the locations the party know well. Remember the NPCs who frequent each location.
- Opening up cities district by district.
- Leave space in your city for the things you forget when initially designing it.
- Take a modern city and use it as an source of ideas and locations for your game city, even if your game city is in a wildly different setting.
A follow-up question was how to deal with NPC and location creep — as a campaign runs, one tends to accrue more and more NPCs and locations until they become unmanageable.
- If players are staying interested in a character you feel you have played out, have them leave the campaign in an interesting way. Maybe they leave the city for elsewhere, or perhaps they are killed — either way, make it interesting.
- Only actually need ten to fifteen NPCs. This is what the PCs can realistically care about.
- Have NPCs come to PCs for help if you need to have PCs care more about an NPC.
- Watch movies in a similar setting to keep the game setting firmly in your mind (and hopefully exciting to you).
- Have NPCs use locations the PCs frequent for their own meeting, dodgy dealings, etc.
- Tie ad-libbed locations to existing structures.
Illusion of Free Will
How to reliably create the “ah-ha!” moment when a player realises something about a scene or scenario? How to get players to make the intuitive leap? Specifically when writing a convention module (where one is a DM-once-removed).
- Shut down other options, but try not to be too obvious.
- What is obvious varies a lot from person to person. Take a leaf out of the comedian’s book and lay down lots of clues in quick succession in the hopes that one of them will spark with the player.
- Stack things in your favour — mitigate the risk to the module or campaign by making it work without the “ah-ha” moment (even if it is much cooler with it).
- Avoid foreshadowing — rather slowly proceed to an inevitable conclusion.
PCs as Bad Guys
When PCs are too bad and cross the moral event horizon into the realm where you no longer empathise with them, how ones one trade off having the good guys win with having a satisfying roleplaying experience for the players?
- Have a hierarchy of bad NPCs — bigger bad guys can balance things out.
- Have players define morals — what their PCs won’t do.
- Foreshadow player characters’ destruction. Run a fatalistic tragedy where success is going out in spectacular fashion, rather than winning.
- Reiteration of importance of a moral framework of some sort for the bad PCs.
- Ensure all player characters on the same moral page.
- A loyal bodyguard PC can make an interesting contrast to the other PCs.
- How does your PC sleep at night? What is her or her noble stimulus?
- No character views themselves as bad.
- Restricted is interesting — bad PCs need to be restricted by something other than the societal moral code (perhaps by their own code of honour, or by society’s backlash against their behaviour).
The One Dubious Character
How to handle moral conflict between player characters.
- Handle maturely.
- Discuss likely interactions as players up front, before they become a problem in-game.
- Be considerate of the group dynamics.
- Remember that multiple *players* can believe their character is in the right.
- Have some PCs act as in-game intermediaries between the warring PCs.
- Often explosive problems occur after a build-up of tension over smaller issues.
- Sort out minor problems before the explosions occur.
- Beware of the players playing their characters close to their chests — if there’s going to be an inter-PC attack, at the very least the DM needs warning.
- Easier if players are friends.
- Don’t sweat the small things — but don’t let them build up either.
Realism
Dealing with a situation where the DM and a player have very different understandings of some aspect of reality that impacts the game world. For example, a player who is a medieval history nut being DMed in an Ars Magica campaign by a DM who is not. Another common situation this arises in is realism in combat — how much is desired varies a lot from player to player.
- Have to balance one person’s disbelief against disbelief of the party as a group.
- Suit the amount of realism and detail you give to the player you’re interacting with.
- Use realism as flavour but avoid making it mandatory.
- Depends on what the DM and player want.
- Keep a firm handle on what is player knowledge and what is character knowledge.
- The consensus reality of the group is important.
- If you have a PC with charisma 20 played by a player who isn’t, use dice to handle all the non-verbal parts of interactions — body language, tells, etc.
Players and Rules
How much of the rules should the players know?
- Players should know the rules applicable to their characters.
- Trust your players.
- Write core rules down for yourself.
- Farm out rules-lawyering and look-ups to players — the DM has the least time to do this.
- Players must know enough of the rules to decide their character’s actions quickly. Especially true of combat rules.
- Document house rules.
- If a player is uninterested in the rules, try tying the rules to character traits and how their character actually does what they do. Reduce combat and other rules-heavy aspects to the character’s schticks — a few signature moves they do often that the player knows what dice to roll for.
- Photocopy things players need to refer to regularly — spells, crit tables, etc.
- Adjust how rules -heavy you are for each player — some appreciate more, other appreciate less.
- Can’t be a half-assed rules lawyer.
- Discussion contentious rules issues out of session — make snap decisions and then read up and discuss them later.
Involvement Outside Game Sessions
How to get players to be interested and generate backgrounds, plot hooks, etc?
- Give XP rewards, perhaps only usable on backgrounds and dump merits (things which are cool but which players never buy because they have little mechanical effect).
- Give them allies related to the content they generate.
- Not always a problem if some people give detailed backgrounds and others don’t. The player sending all the email isn’t necessarily the only person having fun or even the one having the most fun.
- Try ensure that every session has one thing for each player to run with or one moment for them to shine in.
- Having questionnaires to fill out can make it easier for players to contribute. Answering questions is easier than generating content from nothing.
- Character creation via a job application form to a weird agency.
- Ten things your character does on a daily basis.
- Six things I hate about you.
- Danger of the DM giving all the attention to more active players.
- Give quiet players scene time.
- Structure of going around the table asking everyone what they want to do helps and avoids accidentally skipping people.
- Which time slice is being narrated?
Players not Pitching
How to handle it?
- Need commitment from players!
- Consider formal leave of absence.
- Make PC less and less central to the plot. Have a subplot to occupy them off screen.
- Catch up on what’s been happening out of session (general recap for all players at start of session is still useful).
- When a player does return from a leave of absence, bring them back in an interesting way. Bring back with a bit of a boom. Have first session back be about the returning character — don’t fade them in gently. Perhaps they’re back but trouble is hot on their heels?
Messing with LARPs
This really belonged in a LARP writers’ dinner, but we threw it in anyway.
What are the effects one can use to steer or introduce pacing to a LARP? How does one do it well?
- Provide out-of-character encouragement to players.
- Use in-character talking provided by NPCs or objects that talk or can be interacted with.
- The NPC who came in from the cold.
- Bit players or NPCs.
- You really want an extra DM for each object or NPC or other point of interaction since a DM fulfilling one of these roles isn’t available for other tasks.
- Events that happen, especially timed events.
We also briefly discussed the use of mini-LARPs as special sessions for campaigns. Perhaps to highlight some meeting or negotiation.
Snobbery
People who love one system and hate all others. Players considering themselves above certain campaigns or systems. Are they right? How common is it?
- Moving between campaigns and systems is often a big investment.
- DnD is good for newbies — can be played almost like a boardgame if needed and thus is easy to get into.
- System choice and genre choice are not orthogonal.
- “Because it’s indie, it’s better” — attitude observed
- Try out systems as modules.
- Group telling a story, system a tool.
- Often it’s just trash talk — building yourself up by tearing others down.
- DnD is the Microsoft of roleplaying — sometimes it gets flack just for being the default.
Killing PCs
By this point we were down to just a few diehard DMs.
- Kill PCs if necessary.
- Magical healing makes it hard to punish players for mistakes.
- Introduce other consequences for actions.
Min-minning
What to do about players who intentionally make useless characters or refuse to use their character’s skills effectively?
- This is basically a character who is all flavour; often they provide comic relief. Comedy is difficult and such characters are often annoying rather than funny.
- Need to bear in mind to what extent the party is accepting of dead weight.
Whitespace
Tuesday, October 21st, 2008 | Tech | No Comments
I’ve got a soft spot for stack-based languages — and not just because the bytecode for my current favourite language happens to be one (albeit one with a fairly extensive set of relatively complex operations). Another soft spot is toy languages, so it shouldn’t be surprising that I’ve been meaning to play around with something like Whitespace or Brainfuck for a while. All I lacked was an itch [1,2] and yesterday I got one.
In 2008, if you’re going to write code to convert tabs to spaces, there really seems to be only one choice. Not only is Whitespace one of the few languages to fully support literate programming but it also has advanced security built right into the syntax and the very name is tailored to the problem domain at hand.
So, armed with a tutorial, an assembler and a Python Whitespace interpreter [3], I set to work. An hour or two later I had a result, which you can find here. It can be called using something like:
echo -e “a\tb c” | python main.py ../tabs2spaces/tabs2spaces.ws
or
echo -e “a\tb c” | python main.py ../tabs2spaces/comment.embedded
for the text embedded version (here main.py refers to Phillip Bradbury’s interpreter).
I opted for Phillip’s Python version of the Whitespace interpreter rather than the more standard Haskell one, because Phillip’s one sensibly reports -1 when the end of standard input is reached, while the Haskell one raises an error. I had to make one minor change to Phillip’s interpreter to stop parsing the source file once the end-of-program token had been reached, which allows it to process embedded Whitespace where the text extends beyond the program source. The modified version is available here under the GPL.
[1] “good work” may be something of a misnomer in this case.
[2] And I’m dubious as to whether this constitutes “knowing what to write”.
[3] What better way of implementing one stack-based language than with another stack-based language?
The Dragon Curve
Tuesday, October 21st, 2008 | Tech | No Comments
My front page needed something to distinguish it a bit from the sea of internet homepages and the obvious thing was a fractal. After hunting around a little on the Wikipedia list I opted for the Dragon Curve.
The dragon curve or Heighway dragon is one of the many named space-filling (you can see it has Hausdorff dimension 2 in the list) curves and happens to look quite nice while being slightly less well-known. You can generate it either by recursively adding detail to a straight line (as is often done for the Koch curve and Sierpinski triangles) or by taking the limit set of an iterated function system (like for the Mandelbrot set).
Of course it would have been a bit boring to just slap up an image, and I felt it would be cool to have something that actually used the refinement algorithm to construct the dragon curve on screen, so with the help of jQuery and jQuery.svg, I made a little Javascript and SVG (sorry, IE users) implementation that performs the first 14 iterations.
A beginning.
Wednesday, September 10th, 2008 | Life | No Comments
Recent events. Trip to Monkey Town for my birthday. Followed by lunch at the Ocean Basket at Harbour Island, next to the Gordon’s Bay Boat Angling Club and then by the ransacking of the second-hand bookstore and ice-cream parlour at the nearby beachfront. That evening we drove through to Hermanus, accompanied by select personages, to have dinner with my mother. Sunday consisted of watching whales, eating at Coffee on the Rocks in De Kelders and acquiring a bonsai tree. The tree is question is a Chinese Hackberry.