Year Three

With 3rd Year comes our 3rd (and last?) GDW project. The team (Dany, Josh, Max, and myself) started brainstorming by writing out a list of what each of us wanted and didn’t want to see in our game this year. It might not be the case, but I noticed a lot of our ideas drew heavily from games we were currently invested in; a casual observer might see shades of League of Legends and Guild Wars 2 in our quick notes. Being aware of this, we tried to consciously avoid recreating those games.

a brain storm

We wanted to try out RPG-elements like stat-building and loot. To try to keep our scope realistic, I encouraged us to try to keep the length of a play-through short. I reasoned that people would be much more willing to play short and consistently exciting games than gamble on investing too much of their free time on a long game with uncertain pay-offs. Our epic RPG will have to wait. The loot and stats, however, were still interesting enough to keep around.

The next idea we started building on was reminiscent of the Horde mode from Gears of War 2. The player would control a powerful character and try to defend some objective from increasingly stronger waves of enemies. We were musing over some kind of action-RPG/tower-defence amalgamation for a while when the idea of summoning armies was put forth. The idea quickly led us to a game where opposing generals battled for control of objectives by summoning their forces as they ran around the level. From this we found more and more interesting ideas for depth and strategy.  Smiles and ideas abound. We all seemed to be playing out scenarios in this nebulous strategy game in our heads.
The aesthetics of the game are just as loosely defined, I think. As it stands, the game would feature medieval armies and settings. This isn’t new territory for strategy games by any means and I hope we keep looking for a cool visual theme instead of letting it stop at “good enough”.

the bloody aftermath

That’s about where we are now. Now to prototype hex mechanics for the foreseeable future.

Advertisements

Menu

As the deadline approaches our group is focusing more and more on fine-tuning the game feel and improving its presentation. Along those lines, my last few days have consisted of creating our menu system. For it I chose a clean computer-terminal design. The menus are treated as a large tree in-code and the rendering reflects that. As the user chooses options the resulting menu options are drawn stacked beside it and scaled down to fit its height. This video shows what I mean more clearly.

With some more dressing I hope to have the thing look like a terminal of unquestionable power. As the user choices lead them towards the actual game I want to have the menu zoom in more and more until a “division-by-zero error” causes the black hole the game takes place in to form.

It will look super neat if all goes well.

Game Progress & Feel Goodery

We have just about completed the transfer to Verlet-based physics. We had car-car collisions working already but now we also generate verlet walls to keep the cars on track. It was relatively simple too- most of the wall code we had already was directly applicable to verlet. The only real problem was that tracks that were too long would cause out of bounds errors when creating all of the walls. Predicting when those cases would occur and generating a new, hopefully shorter, track fixed that up and has the happy side effect of limiting how long tracks end up being.

Fine tuning controls and balance as well as importing all of our various assets will be the entertainment for the coming days.

As far as me goes, I have thinking game design for the last few days non-stop. Any extra processing time my brain can find has been redirected from its regularly-scheduled recital of Lady Gaga lyrics to mulling over game design ideas and decisions. The challenge now is to find time to code all these ideas, which means learning how to efficiently prototype. Which will be a valuable thing to know!

exciting

game progress

Updates have been sparse!

 

Which is because progress has been just as sparse!

 

We’re still futzing about with physics implementation and loading textures. Luckily Professor Kapralos assigned work with FMod and OpenGL lighting so we worked those out.

 

Sparse indeed.

 

Hopefully I have more time to write and program after midterms stop stressing me out!

Wherein I discuss League of Legends

…. and use words like “wherein”.

League of Legends is an online “Multiplayer Battle Arena” developed and published by Riot Games. The game sets two teams of either 3 or 5 players against each other in a race to destroy the enemy’s base while protecting their own. Players control a single character that levels up and earns gold as they kill enemy players and the endless waves of NPC minions that spawn from each base. This character progression sets the tempo for the game- characters typically start out meek and not much stronger than the average NPC but will be able to wipe out waves of monsters with a single spell or demolish entire buildings solo by the end of the game.

Before the round starts each player chooses which character they will play as. Characters range from powerful swordsman to giant birds that shoot shards of ice to massive space aliens. Each has a unique set of 4 abilities that they can learn or power-up each time they level-up. These abilities are what define the role of each character. They might serve to boost the damage each subsequent attack the character performs, or create an impenetrable wall of ice to block movement, or, if the mood strikes, simply eat whatever enemy is causing you the most stress.

Each round starts with a minute and a half for each team to prepare. Players are given a set amount of gold to start with that they can use to buy items that increase their stats (for instance, a Dagger gives a bonus 15% to their attack speed) or potions that can restore health or mana when necessary.  In addition to figuring out which items they want to use, each team uses the first few minutes to figure out where they want to send everybody.

League of Legends, for the most part, takes place on a map with the teams starting in opposite corners of the map in their respective bases. The bases are connected by three paths, referred to as “lanes”; one following the top edge of the map, another along the bottom edge, and one going straight through the middle. These lanes are where players spend the majority of their time. The endless waves of NPC minions that spawn in each base follow these 3 paths towards the enemy base, stopping to fight whenever they come across an enemy, creating a sort of moving front-line. Between these three lanes is a twisting forest that is useful as a way to quickly travel from lane to lane and also as a way to earn money by killing the monsters that are minding their own business within.

So the game starts, the players buy their preferred gear, and they head out into lanes to butt-heads with the other team. A typical match sees 2 players from each team heading towards the bottom lane, another one from each going to the center lane, and the last two going top. The experience gained whenever a nearby enemy dies is divided evenly among each player nearby so someone who is solo earns double the experience of someone with a partner. What that means is that the players from each team who went to the center lane solo will be considerably ahead in terms of experience when compared to the players who shared a lane. These more-powerful players will then use their advantage to sneak off to another lane where the players are lower-level to coordinate an attack and hopefully kill some of the other team and increase their advantage, snowballing into eventually pushing the enemy back to their base and destroying it.

The draw of the game is the complex interactions that come from having 10 unique characters being played in each game. Teams want to balance out their team to include a good mix of magical and physical damage, while also having characters that are capable of supporting others with healing or other beneficial spells and those that can simply take a beating so others don’t have to. A good composition is essential, having five glass cannons might sound appealing until they get into a scuffle and can only take a few hits before dying.

Another draw is how much the game rewards smart plays. Mindlessly attacking all of the enemy minions to try to push straight to their base might seem like a smart move but since money is only rewarded when yours is the killing blow, players will wait until the last moment before attacking to make sure they get the money. Where one player might just attack everything that moves and end up in enemy territory away from the safety of their team, one that only attacks when it will finish a minion off (sometimes called “last hitting” in game) will have kept themselves near the safety of their own base while earning the same amount of money. Players are constantly looking for new ways to maximize gains while minimizing risk.

That same philosophy permeates through most decisions made in game. Near the middle of the map there is a giant worm monster that your team can try to defeat. Successfully killing it rewards your entire team with gold as well as a magical buff to all of their stats. The rub is that killing it is no easy task, and a team that isn’t careful could end up being ambushed by the enemy team while they attempt to kill it. They need to plan ahead and find the right time to go for it, usually when the enemy is dead and respawning.

The advantage in game can swing dramatically because of things like that. A team that positions themselves well in a fight to maximize the effectiveness of their abilities while being able to avoid most of the enemy’s can beat a statistically stronger team. And afterwards they might be able to kill that giant worm I mentioned and level the playing field. So while leveling up and getting good items is important, its not a way to automatically win. Players have to look for opportunities and make the most of them to get ahead.

The interface of the game is designed to facilitate such plays. The abilities of each character are mapped to the QWE and R keys so players don’t have to spend time relearning hotkeys when they want to play a different role. There is a minimap that shows the location of each visible player and also lets the teammates mark places on the map to better coordinate plans. Player health is represented by a bar above their head and changes from green to red to easily identify how injured someone is with a quick glance.

The sound also works to make the game easier to play. Each character has unique cues that trigger whenever they use certain abilities. The sound of a bear trap being set might dissuade you from checking out whats in that tall grass. Additionally, an omnipresent announcer exists to alert you of important events like when someone dies or a building is destroyed.

A major misstep with the game is how it handles critical strikes and dodges. In a game that otherwise rewards logical thinking and planning the inclusion of a completely random element is very out of place.  Having games be decided by the roll of a die instead of player input and skill can be frustrating and unsatisfying. Chess would be a lot less popular if 1 out of a 100 times a piece might dodge an attack and waste the opponent’s turn. I’d like to see them either removed or be controlled by the player. Perhaps each character gets a “Dodge” ability that they can use every so often that can avoid an attack if timed correctly.

League of Legends is basically a more updated version of Defense of the Ancients, a popular Warcraft 3 map. Riot Games managed to take the same tactical gameplay and make it more accessible while also adding extra complexities. A strange idea, but it works. The learning curve is much more gradual and players develop a better sense of the game as they play. They pick up on smart plays and learn from missteps through playing and not flipping through the pages of a manual.

Verlet Is Still Neat

I spent my time coding up some more of the verlet implementation. In addition to points and edges there are now bodies that are just a collection of pointers to the vertices and edges that make them up. The bodies came to be because I needed something to use for collisions. So now bodies use the separating axis theory to test for collisions and the colliding edges and vertices are nudged away from each other when they collide. The crazy thing about verlet is that it works out great. In pushing away from each other the other edges in the bodies stop being their desired length and when the constraint function iterates it sorts them out and produces believable post-collision motions. Objects collide and go spinning away in a satisfying way. All that from a bunch of points trying to maintain distances from each other. It’s wild.

 

update:
It’s all working out great. Here is a video of some boxes I made. The little X inside each one is another set of constraints each box needs. Using only the 4 sides of the boxes as the constraints would let them flop over and collapse.
I can play with the strength of any edge or simply how many times the constraints are iterated each frame to make them more or less resistant to changes in shape.

Until I implement friction I’ve just got a global damping slowing down all the boxes.

Game Update

We’ve all set out tasks we want to get done ASAP for the game. I’m going to be trying to replace our current physics implementation with Verlet. Verlet is a really neat way to get things moving and reacting believably that is based on points and constraints between them. After an hour or so I was able to make any shape I wanted by defining vertices and edges and then let them loose in a box and watch them bounce around very nicely.

This should really help out with making some good car-car interaction going and make the game a lot more fun. No more fumbling with collision force calculations for hours with no real useful results!

Here is a short clip of a test program I made:

watch as my headless spiderman ragdoll swings into walls