Game Jams and Barbecues

Saturday began as an interesting day. I had gotten a late start as I had been up late the night before working on coding the wandering and rotating of the enemies for the game. Because I had such a late start, most of my fellow students had already left for the gameslab. I had a vague recollection of where the bus stop to get onto in order to get to the university was, but I was unfortunately unable to locate it exactly.

As a result, I decided that it was a nice enough day out to instead walk to the university as opposed to taking the bus. As such, I put in the address for the university on my phone, and began walking in the direction it was pointing me. Unfortunately, however, there appeared to be an issue with google maps on my phone that day, as it was constantly saying I was in the wrong position and facing the wrong direction after I had already gotten some distance towards where it was telling me to go. This lead to a situation where my phone was constantly “recalculating” the route I was supposed to travel on, and was causing my phone to act rather slow. Eventually, I decided to use the directions my phone was giving me as more of a general “guideline” for the direction I should be heading, and was lucky enough to eventually find street signs that had “Universität Paderborn” written on them with arrows pointing in the right direction. I began following the directions on the signs, and while walking around got a rather nice view of the surrounding town, though unfortunately I did not think to take pictures during my walk. All in all, it took about 40 minutes to get from the hotel to the university, but that is including all the times I got turned around and went down incorrect streets trying to follow the directions I was given by my phone.

Once I got into the gameslab, I began continuing to refine and show off the rotational code I had put in place the night before for the enemy AI to my fellow team members, but then soon after began coding for the different interactions the player would have with the enemies in the game.

I started out working on two of the three types of enemies that would be implemented into the game. The first of which was a neutral NPC that would wander aimlessly within the boundaries of its designated wander zone. When the player collides with this type of enemy, a method is run that checks the size/mass of the player compared to the NPC. If the player is bigger than the enemy they are colliding with, they consume that enemy as they would a normal collectible around the map. If they are smaller, however, the enemy will consume the player instead and the player that got consume is set to be inactive. This enemy type was relatively easy to code, and was functional soon after I began working on the code.

The second type of enemy that was implemented into the game was an aggressive enemy type. This enemy had an “aggro range” that determine whether or not a player was close enough to the enemy for it to begin chasing after that player. I accomplished setting this up by having a Game Manager entity within the scene that stored lists of the players that were active within the scene and all the enemies that were in the scene. Because the number of enemies within a scene was going to usually be a lot smaller than the amount of collectibles, I decided to implement the “aggro range” for the enemies by doing distance checks between the player and the enemies, and if the player got to close to an aggressive enemy, the player’s location became the directional target for the enemy and the enemy would no longer wander within the bounds of their wander zone. Getting this initially setup was not difficult, but I had a hard time implementing a constant rotation toward the player while it was being chased by the enemy (following the theme that I am not the best at quaternion math). After a lot of google searching and reading through the unity documentation, I was able to setup a system I was satisfied with where the enemy would be constantly rotating towards the player’s position while chasing them, and I was able to reuse a lot of my code from before when I got the enemies to rotate toward the direction they were moving in the wander zones.

Once I had the movement setup for the aggressive NPCs, I then moved onto coding what would happen when the two collided. As a team we decided something different should happen as opposed to the “Eat or Be Eaten” interaction that was in place for the neutral NPCs. In the end we decided on having a knockback and split system where if an aggressive NPC collides with the player, if the player is above a certain mass/size threshold but smaller than the NPC, the player would be split in half. When this occurs, one half of the original player, still being controlled by the player themselves, is shot off in the direction the enemy was coming towards the player at while the other half is set as a general collectible for the player to reacquire to get back their original mass/size. If the player is below that splitting threshold, they are instead consumed as normal by the NPC. If they are bigger than the NPC, they instead consume the NPC as normal. While not originally hard to setup compared to the neutral NPCs, this system did take some time to get working.

Right around the time that I finished getting the aggressive NPC setup, it was time for the German and American students to leave for a few hours to travel to a nearby park for a barbecue and lawn games event that had been setup. We all packed up our things and left the lab, and when we got to the park proceeded to lounge around while enjoying delicious food, discussing mechanics for the various games that were being worked on, and some of us even began playing a more classic drinking game called Flunkyball.

This game involved two teams, one on each side of a bottle of water placed between them. The teams would line up and place their drinks infront of them, and go back and forth throwing a ball to try and knock over the bottle of water between them. If a team manages to knock over the bottle with the ball, everyone on that team begins to drink their drink as fast as they can while the other team sends out two people: one to stand the bottle up and the other to collect the ball. Once the opposing team collects the ball and stands the bottle up, the team that knocked it over has to stop drink. The game goes back and forth like this until one team completely finishes all of their drinks.

All in all I found this game to be incredibly enjoyable, and we played it many times throughout the barbecue.

After the barbecue had gone on for a while, I and a number of other students decided it would be a good idea to return to the lab to continue working on our games. We traveled back to the lab, and I spent a few more hours refining and smoothing out the random walking for the enemies and the aggressive enemy type. Just as I was about to leave, however, I was informed that they no longer wanted the enemies to rotate, as this would be handled by the artists with the sprite animations. After the news was given to me and I discussed the subject of rotating the enemies with the team lead, I then had to heavily modify the movement code to have the enemies no longer rotate as they moved to fall in line with the new requirements I was given. Having to do that was a bit heartbreaking, as I had spent a lot of time building that rotational system up, and was not informed it was not necessary during any of the times I was show casing it to my fellow team members.

Once the rotational system was removed for the code, I packed up my things and went back to the hotel to try and get some rest before the final day of the Game Jam.

Eltvile am Rhein

Eltville is a small town an hour away from Frankfurt, known for its wine, sparkling wine (Sekt), and roses. It is a very neat town that reminds me of Stardew Valley, where everyone knows everyone, there’s nothing but peace and relaxation.

I had a slow start this morning since I decided to sleep in. I pretty much just grabbed a drink from Starbucks and then got ready for our little trip. After we arrived at the town, we made our first stop at an ice cafe and I enjoyed a vanilla ice cream coffee. Then, we walked around the town a little bit and chilled by the river for a while. It was a really peaceful moment that I chatted with my friends while staring at the river. Besides boats, there were also people kayaking, crewing, jet skiing and so on. Followed by, we enjoyed some drinks at a bar by the river. It had perfect selfie lighting where I took 100 pictures until we had to leave for the garden.

The garden was absolutely beautiful! We got there at 6:30pm ish which is the time for perfect sunset lighting again!!! I made Sam take i++ pictures for me until he couldn’t bear with me anymore. (poor Sam) The mayor showed up at around 7pm and gave us a tour of the tower which contained a little museum and a small meeting room. In the museum, there was a case full of letters where capital letters are stored on the top rows, thus, they are also called upper case.

Back in the garden, the mayor prepared a little champagne and pretzel ceremony for us. It was so fancy that I have never experienced such in my life. I felt rich. Coming back home wasn’t so hot anymore, the train was actually cool and bearable. Surprising, I did not end my day at a bar again, instead, I wrote blogs with a nice mango colada by my side.

Did not steal anyone’s drink for this picture.
Delicious

Tuesday in Frankfurt: Electorate Castle

After surviving nights of sauna-level heat at night, we took a tour of the Electorate Castle today in Frankfurt. This castle is as old as the 14th century, and contains an exhibit of the work of Johannes Gutenberg, the inventor of modern book printing. After having a drink at the bar by the river, we looked around the garden in the courtyard, then we went upstairs to see the exhibit.

Photos courtesy of the talented Penny Wang

Inside, there was a case which contained letter and number stamps which were used for printing books and newspapers. I believe we discovered where the term “upper case” for capital letters came from; the capital letters were stored on the top row of cases.

We also got ice cream prior to the tour. I finally got original spaghettieis this time, with strawberry sauce that resembles tomato sauce.

The tour was given by none other than the Mayor of Frankfurt, who mentioned to us that he worked on designing and publishing comic books, which are well-known throughout Germany. Afterward, we took a group picture together

The Quaternion Conundrum

Friday, after I had fully rested up and felt much better than the day before, I began my deep dive into coding for the team that I had been placed on, A-blob-calypse. We spent the initial parts of the morning finalizing our ideas for the game and discussing what would and wouldn’t be in the final product, building off of what we had discussed the day before. The game became centered around the player controlling a magical blob monster that went around absorbing objects, animals, and people in order to grow in size and strength. We also decided that in order to incorporate the Game Jam theme of “better together” we would implement a system where multiple players could control the same or different blobs, by coming together to form one mega-blob or splitting apart into smaller individually controlled blobs. We also decided on a number of NPCs that would be implemented in the game, each with their own specific interactions setup.

I was put in charge of coding the AI interactions between the player and the enemies of the game, as well as setting up a collectibles system for the players to absorb non-enemies in order to grow their character. A lot of the coding that I did on Friday involved setting up enemies that would move around in a designated area so that the Game Designers could build sections of the maps where enemies would and wouldn’t be. Because of the nature of these systems, building them up required a lot of vector math, and while I am fairly well versed in vector based math and coding for game mechanics, it is far from one of my stronger suits. I spent a lot of time working on getting it as close to “just right” as I could.

For the collectibles portion of my coding tasks, I found coding this system to be the easier of the two. Originally I tried to do vector comparisons with the position vectors for the player and all the objects to determine how close they were to each other, but soon after beginning to code this I decided to do something else as I felt constantly checking position vectors against each other may be a bit unnecessary. After the initial idea was scrapped, to accomplish allowing the player to absorb collectibles I decided to use 2D colliders on the player and the objects, and coded it so the when an OnCollisionEnter function was fired off, it would run a script for both the player and the object the player was absorbing. The script run on the object that was being absorb allowed for an absorption animation to be played and eventually deleted the game object from the scene, while the script for the player increased their size and mass.

For the enemies portion of my coding task, I decided to go about doing this by using Empty Game Objects in Unity and attaching a Polygon colliders to them. This polygon collider was used to draw out a designated area for the enemies to wander around in that could be shaped as necessary for each level. The enemies would pick a random direction within that area, then begin to update their position towards that direction. Each time they would go to update their position, however, they would run a check to ensure that their future position would still be within the bounds of the Polygon collider. If it wasn’t, originally I had them retarget and pick a new direction that would be within the bounds of the collider.

After that system was implemented, I decided to go with a different approach for keeping the enemies within their wander zone, as I ran into an issue where the NPCs were constantly moving in and out of the wandering area in one or two corners. So, instead of the retargeting system to keep them within the area, I instead had the enemies target the center of the wandering area and move to it, then retarget a new direction. This caused the enemies moving around to look a lot better than at first.

Once I had the enemies setup to wander within a specific zone, I then began working on having them rotate to face the direction they were moving towards. This added a lot of quaternion math into the already vector heavy code that I was working on. While I am able to work my way around vector based coding, coding game mechanics involving rotations and quaternions was something I had rarely ever done before, and posed a big challenge for me. Luckily, I was surrounded with other coders working on various elements for their own games, and many were happy to help me work my way through the rotational math and provide input on the various game ideas I had. Eventually, I got to a solid point where the NPCs were rotating towards the directions they were moving, although this was accomplished much later in the evening back at the hotel, as everyone had already left the gameslab to go home by that point and it took me a long time to get the quaternion rotations working.

Getting to Frankfurt

Today was just a traveling day. I had pretty much packed my suitcase already so my morning was chill. I sat in the cafeteria and drank coffee until our cab was almost here. Which my professor found out later that our breakfast wasn’t free; we drank 500 euros worth of coffee for the past few days.

Unfortunately, our first train was delayed that we couldn’t make it to our connection ride. However, I think the Germans are very experienced with situations like this so we quickly had a backup plan for a different connection. In the first train ride, we did not know where to get off until the very last minute so everyone was panicking to get their suitcases and to rush off the train. Our second ride was quite sick, I would say. First of all, we did not have seats where many of us had to stand for a couple of hours (I was lucky enough to get a seat). Second of all, I was overheating the entire ride!!! Especially when the train stopped for 10min before the final destination, I could not breathe there.

The hotel has a very convenient location that’s just across from the train station. But for the same reason, the hotel is also very aged without AC. I understand that it is a German thing most places don’t have ACs; so I’m trying my best to adapt. After we settled down at the hotel, it started pouring which cooled down that temperature a lot. Then, I popped into Stephen’s cab for dinner where I had caramelized pancakes. It was so delicious that it’s even compatible with my favorite dutch pancakes. I also couldn’t believe that Stephen tricked me to look away so he could steal my pancakes.

Saturday in Paderborn (Game Jam Day 3)

Today was the third day of our game jam with German students. We made a good amount of progress on Soshi Shinobi, though Xbox controls with 2 controllers continues to be a pain to program. Though at this point keyboard controls work with Player 1 on WASD and Player 2 on keyboard keys. Switching works properly, too. At about 5:00, we took a break from the game jam to go have dinner at a barbecue.

The German students prepared a variety of food for all of us, including hamburgers, sausages, hot dogs, grilled cheese (literally), and steak. Some of us sat on blankets, others at tables, while Alex put his Minecraft wisdom to use to create his own throwing axe.

Before and after dinner, we played a fun little drinking game called Flunkyball. Two even teams of people line up with an alcoholic beverage in front of them on the ground. Between both teams is a half-full 2-liter bottle of soda (courtesy of me…), and each person on each team throws a ball at it to try and knock it over. If they’re successful in knocking it over, everyone on the team picks up their beverage and drinks as quickly as they can. Two people designated on the opposite team must run over and stand the soda bottle back up, and pick up the ball and bring it behind their own line of beverages, then shout “stop!” Then the scoring team stops drinking, and a player on the opposite team tries next. If a player misses, nobody drinks, and the next player on the opposite team tries next. The game ends when everybody on one team finishes, and that team wins.

Image result for flunkyball
Image result for flunkyball
Pictures taken from Google Images because I forgot to take them during our games

On to Frankfurt

Today was our last day in Paderborn at the In Via Hotel. It was a pretty uneventful day, except for taking 3 hours worth of train rides to Frankfurt. I discovered in some places you have to pay one euro to use the restroom (What?) Despite 90-degree weather continuing to plague us, some of us were fortunate enough to have fans and windows to open up in our rooms.

Hotel room at Savoy Frankfurt

After getting settled into the hotel, we had some dinner. I had schnitzel for the first time, which is veal pounded flat as a pancake, then fried.

Afterward we went out for drinks.

Blurry, but gets the point across
I ordered a frozen strawberry margarita.

Week One Wrap-up

Saturday night at 5 we arose from our jamming and took a brief walk in the now very summery weather. Our destination: barbecue! We found a nice big park and set up shop with burgers and bratwurst. We spend a good few hours enjoying the sunny afternoon before some people started heading back to work in the labs.

Sunday was the last day of the jam, with work officially to cease at 3pm. My task at the moment was to integrate the UI for the game end screen, showing the scores and player names. The coders meanwhile were scrambling to clean up bugs. By the time of the presentation, our game unfortunately did not have it’s core mechanic implemented. It did, however, feature working networked multiplayer between 4 computers.

Post Mortem: Strike Counter was kinda doomed from the start. Not to fail, but to not get very far. I was impressed by how my team was able to get networking up, but the time and energy spent on this one feature left little room to integrate any of the interesting design ideas that inspired the game.

After every team’s presentation and respective critiques, we posed for a big group photo. We were told this photo would go on the fill the last empty spot in the university’s hall of fame, so I guess I’m a little honored. The rest of the day was left to us, and I had one last castle to get to.

Schloß Neuhaus is a really pretty castle surrounded by the same peaceful river that flows through Paderborn. It apparently functions today as a high school. Sunday, however, was right in the midst of Schützenfest, a lively holiday in which certain townspeople are crowned royalty for a year. That night, the kings and queens of the last year had their final celebration in their finest clothing as the whole town gathered for festivities. I helped myself to some ice cream and finally tried out currywurst before heading back through a scenic wooded area right on the water.

We also had one last dinner with some of our good friends who wouldn’t be joining us in Frankfurt. The place we chose sold a 40 euro burger that can apparently get you in another hall of fame, but we decided to save it for next time.

My Game!
Castle Number 3 (For Me)
Finally tried that good stuff

Day 9: Traveling to the Big City

Today was largely uneventful. I had planned on getting up at 8am to give myself time to get breakfast and pack, but I ended up snoozing my alarm until 9:38 when I started packing. It was a pretty messy sort and shove kind of job, and in the middle of packing we got the “cabs are here” text that forced us to shove whatever was left into our backpacks and run down to the lobby. Burdened with extra water bottles and a cat mug, we went to the airport where I bought breakfast and yet another cat postcard to assuage my separation anxiety from my cat. Spoiler: the croissant I bought had bacon in it. I lost my appetite after a bite into that. . .

We got on the train and were able to find our assigned seats quite easily. Maybe it’s rude to say it, but it felt nice to be able to kick people out of our seats instead of trying to find anywhere was empty. I slept most of the way while Alex and Mike had a Smash Bros tournament behind me; however, our German friends gave us no warning for which stop we were getting off. I went from having a nice nap to scrambling out the train in about .5 seconds. We were not so lucky on our connecting train, which meant most of us had to stand in a hot cabin for an hour. Alex was nice enough to offer me the seat he was able to find, so I spent the rest of the time sleeping and looking at cat pictures. I miss my cat.

The hotel is . . . something. There is still no air conditioning and breakfast is oddly not included with the rooms. I have a single room because of my narcolepsy, but it smells fainting of urine and the shower curtain doesn’t actually move because the hooks are trapped between the frame and the ceiling. It was difficult trying to take a refreshing, cold shower because it was so small, spilling water onto the floor in concerning amounts, and there were no shelves, so I was trying to not step on the shampoo bottles I had to put on the floor. The good news is my room has a great view of a back alley/parking lot, stained concrete buildings, and some lovely trash cans. Thankfully because it’s a slow day I can take a nap and finally do some laundry that I’ve been putting off for three days.

Beat the Boss Post-Mortem & Final Paderborn Dinner Review

There’s a reason I wanted to work on Beat the Boss as opposed to all the other games that weren’t left on the cutting room floor (rest in peace, DDWD, gone too soon). Not only did it seem in scope, it seemed genuinely fun just from concept alone. I didn’t, however, account for the infallible mantra every game developer should be following whenever they make a new game: “My game is out of scope.”

The rest of my team didn’t recognize that either until they got their hands on their keyboards, and removed the whole “elemental synergy” thing as soon as they did. It’s from that point that the game design turned into an indecisive whirlwind of disjointed ideas; we only really discussed the design in the beginning, before we’d removed the elemental abilities. This led to another all too common issue; a communication deficiency.

I’ve mentioned that I felt like an intern already, but I also felt like an ambassador; a coder and secondary game-designer that bridged the gap between one side of the room and the other, literally.

Now that I think about it, the only thing I worked on for the entire jam that actually got implemented properly was the text inside of the boss’s health bar. None of the abilities got put in despite them all being 97% done (all they needed was some damage inflicting code), and my fully functioning cooldown icons were dropped as well due to bugs in experimental lighting and whatnot taking priority. We had models for breakable pots in the background and pretty destructible pillars, but no final character model, fireball model (even though fireballs for the boss were made), or crossbow bolt model. We didn’t even implement the shield model that was displayed front and center on one of the statues. The focus seemed to be on graphics, and yet, half of the game straight up didn’t have graphics to begin with. Our game was a jack of all trades, master of none, and that could have been changed with some more communication, and maybe a reevaluation of priorities.

Despite all that griping and despite my dissatisfaction with how little I got to actually do for the game, we managed to make something very nice for a handful of days. A jack of all trades, master of none is nothing to sneeze at for a game jam game; it’s leagues better than a broken mess that barely works. Even despite all the issues I think we had, all we really needed to iron them out was time.

A gameplay video given to us by Ingo, one of our teammates.

After the game jam presentations, however, we had some time to relax, and after that, dinner, at a burger place I can’t remember the name of at the moment.

I decided on getting a “DT Bacon Dog,” some ginger ale, and some Calamari, deciding that, worst case scenario, I’d feet it to my associates should I not have room / not like them very much. Meanwhile, Mike was debating whether he should get a triple patty burger or a five patty burger. It’s worth noting finishing the five patty burger, entitled something along the lines of “THE BURGINATOR,” would get you a spot on a hall of fame, a hoodie, and a few other goodies, so he didn’t just have a death wish.

The Bacon Dog wasn’t quite up to my very American savory standards, but it was still very good. Unlike what I’m used to in America, the bacon was seriously good. Had you taken out the hot dogs and replaced them with fresh grilled American ones, you’d have a really dangerously good combo going.

The DT Bacon Dog. When the menu said “zwei hotdogs” I figured they’d come in separate buns. It was as difficult to keep together as it looks.

The calamari was just as good as I expected; not very. It was still decent, but not worth eating after filling myself up on the Bacon Dog. The batter to calamari ratio was a little too high, and it wasn’t quite salty enough anyway. Better not salty enough than too salty, though.

The calamari. It really wasn’t that bad, there was just a little too much batter and I was full. The salad was pretty good, though.

Meanwhile, Mike was eating his triple patty burger and suffering greatly. It was mostly due, however, to covering an entire french fry in hot sauce entitled “PAIN 100%” and eating it.

Because I’m well known as a bold risk-taker, I decided to try it, by taking about a pinkie-tip’s worth of it, gently dipping the tip of a french fry into that, and briefly touching the sauce with the tip of my tongue.

A french fry garnished with bona-fide, 100% all natural pain.

I swear that the tip of my tongue came close to going numb; the heat wasn’t painful, because I only just barely touched the sauce, but it was some INTENSE heat. I honestly, truly believe that if I’d eaten a “proper” serving of it, I would have literally passed out. The moment I felt the heat, I realized Mike’s predicament. He was handling it like a champ, though, considering everything. The big glass of milk he emptied not long after probably helped.

Tobi, on the other hand, had eaten an entire triple patty burger and was now finishing Alex’s, and offering to finish Mike’s as well, should he need to. I simply sat there drinking my second glass of ginger ale, completely full. I don’t know if it was just because I was abnormally thirsty, the ginger ale is better in Germany, or I just haven’t realized it, but the ginger ale was very good. Maybe I ought to drink it more often.