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.

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.

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.

Day 8: Otterly Terrific

Today was the end of the game jam and our last day in Paderborn. After the club, Alex and I ended up sleeping in late and arriving at the games lab around 11. I got to see an update of the game that implemented the grappling hook and streams that were going to be part of the puzzle. I finished up the animations and had to go through and fix a lot of the start and end poses. I clearly know nothing about animation blending trees (I didn’t know they were a thing until today) but I am eager to learn how to do it when I have more time. It seems like a pretty integral part of video game animations, so I’m going to start watching tutorials and reading up about it while in Frankfurt next week. After that I tried to bring my rock pile into mudbox to paint, but then I realized I would need to UV the ENTIRE pile of rocks before I could do that. I wanted to add glowing algae to highlight where the otter could enter holes, but after spending a stupid amount of time UVing rocks, I eventually gave up and went back to modeling. I should have been texturing, but I was so tired at that point that I would have rather just kept modeling, and we had so little time anyway that I had to make the decision to finish the game jam doing the thing I love the most. I created corals and sea weeds to add atmospheric aesthetic and used mudbox for the first time since the single lab day we were taught it in the fall semester. It was somewhat like Zbrush so I was able to bring over the fundamental principles of sculpting with a tablet and keyboard, but I was definitely lost with most of the UI and could only create the most basic sculpts. I would also like to learn mudbox more for this kind of occasion; I can only use the school’s licenses of Zbrush so I only had access to the student version of mudbox.

Onto the presentation. I was pretty upset about how it went; I thought the game designers and coders would do a good job of presenting, but they were stumbling over their words, not pointing out important mechanics, not explaining the story correctly, not showing enough of the environment. It was also very dark, which I felt ultimately ruined the whole game. Most of the models I worked on today were not implemented. However, we were able to implement an impressive number of mechanics and all of them worked as intended, even though they were a bit clunky. All the other games were good in concept, but there was only one that I thought was interesting and enjoyable. A lot of the other teams had a lot of infighting and wrote over each other’s code, or there were no artists on the team so they were lacking visually. Ultimately I’m happy with what we were able to do, and plan on continuing the game this fall semester as a sophomore film requirement.

After that we all took a big picture and said our goodbyes. I was really sad to say goodbye to everyone, especially the few people I had gotten really close to over the past few days. We went out for burgers with the professor and two of the German students who we had all grown attached to. I have started to have conversations about returning to Paderborn to work on the game they will be developing my senior year. It’s still just an idea, but the more I talk about it the more I’m already excited to start planning it. If it were up to me I would have spent another week in Paderborn with the students, but we are off to Frankfurt for a very fun week and our German friends can get back to schoolwork and finishing up their semester.

Day 7: Come on and Slam, and Welcome to the Jam

It’s the next day of the game jam and another full day of work. I was mostly animating all day, which meant I wasn’t having very much fun. The space man rig I got didn’t have any controllers, and because I am unfamiliar with rigging I didn’t want to waste time trying to stumble through it. I had to spend a lot of time counter animating and trying to figure out how to create a walk cycle without my character moving forward. Ultimately, I’m not very proud of the animation and I plan to go back, rig the character, and learn how to do the animations properly. Once I’m not under a time crunch I think it will come easier to me.

My teammates continue to work hard and implement impressive mechanics surprisingly fast. Everything feels like it’s coming together, and whenever I need a break from modeling and animating, I can go and see the coders and find something new every time. I’m very happy with my models, I managed to create a ton of stuff to include in my portfolio. Also, with all the work I’m doing I’m starting to feel better about the game that’s waiting for me back home. I have proved to myself in this game jam that I am able to work long and hard for a game I’m passionate about; with all the anxiety I’m feeling towards my future after I graduate, I’m gradually gaining more confidence and this trip has only spurred that onward.

We stopped for a barbeque dinner at a nearby park. I got to catch up with everyone on their progress and relax while eating good food. I learned more about the German students and what their future plans are. I also talked to Stephen and Vulker about studying abroad for a semester in my senior year when I’m completely a full game for my thesis. It would line up really well with the work that I need to do and the process they go through. We also got to play lawn games, including an America vs German drinking game that I got roped into.

I wasn’t much help after the barbeque because of how tired I was, so I decided to leave the lab because I wouldn’t make any progress anyway. Mike and I decided to go get ice cream and stop at a general store for supplies. However, both of us cannot be trusted with directions, so what should have been a five-minute walk back to the hotel ended up being 45 minutes. At least I walked off the ice cream. That wasn’t the end of our night though, as the Germans offered to get us into a small nightclub. Although I was tired from all the walking, the prospect of spending more time with our friends before we had to leave them Monday was enough to convince me to go back out. The club was so much fun and the music they played was so much fun to dance with. I was sore the next day from all the dancing. I got to talk about music and local culture and get a lot closer with some of the Germans. It was an invaluable experience (and the drinks weren’t too bad either).

GameJam Part1

I think I’ll start this blog by introducing my team. My team consists 3 programmers including me, 2.5 artists, 1.5 musicians, and 3 game designers. Everyone is very nice to me (Markus is special, there’s always the weird one on a team), even though everyone else is German but they try to speak as much English as possible to make me welcomed. After we were dismissed from the lab room, the team leader locked us into a creepy, small, hot, and terrifying room to further discuss the concept of the game. We finally agreed on a point and click adventure game with a cyber western background. It was a totally peaceful discussion without people yelling at each other.

One thing I have to complain is that the lab is soooooooooo hot!!!!!! Around 30+ computers are running Unity, Adobe and rendering at the same time. The heat generated in this room is worse than RIT’s dorm(which you know how those are). Thank God we have 2.5 fridges in the room that are filled with drinks(I promise you, no one hides beer in the lab).

Team Meeing

By the end of the first day, I was already pretty close to my teammates and we have the tasks nicely divided. I was in charge of the character’s movement, main camera, and menu; Sebastion has implemented a dialogs system for the Game Designers to write scripts; Alex worked on an inventory class. The basic game was set up and the next step is to further develop the game logic. Very excited to see what the game turns out to be. I have always been a fan of puzzle games and this is my first time working on a puzzle game. Even though I was mainly programming for the game instead of storytelling, I’m pumped to develop a puzzle adventure game as my side project.

Snapshot of our WIP game

Day 6: Birb

So there I am, stomach full of pastry and holding a bag of fresh strawberries I had just bought at the bakery, waiting for the bus. Alex and I had a late start this morning and finally found the right bus route to take, hoping that it wouldn’t randomly drop us off across town again. A very loud thud shakes the bus shelter and a woman next to us screams as a bird flaps to the ground. I’m not going to go into detail, mostly because I am still SHOOK, but we had to catch the bus without knowing its fate. I cried the entire bus ride . . . and while walking across campus . . . and again when I had to explain why I looked like I had been crying. I’m reeling. Bird, if you’re out there, I hope you’re okay. And if you’re dead, I hope a friendly neighborhood cat ensures that your death wasn’t a waste.

Anyway . . .

Today was the second day of our game jam and the first full workday. We immediately started working when we arrived, only stopping occasionally to drink soda and chose another YouTube video to watch. I managed to get several models done, including a pile of rocks that will serve as our first otter puzzle. I’m annoyed that it took so long and I had to start over a few times because I didn’t like the look of it, and I’m still nervous that it might not be clear enough and the puzzle will not work. I also finished the grappling hook, force field generator, and various ship parts to scatter around as other wrecked ship. I’m really worried about all the work that is ahead of me and although my passion and motivation is there, I am getting very tired and working slower than I want. I still have models to complete, as well as all the texturing and creating animation cycles for our main character.

However, I am still having a great time and my models are turning out surprisingly well. Because of school and work, I haven’t been able to just sit down and make cool models in a long time. I’ve been watching Game Grumps play Undertale and the time is passing without really making me tired. My team is also still doing fantastic; from talking to my other American friends, apparently, we’re one of the only teams that isn’t constantly fighting and running into language barriers. I’m so excited that I get to work on this game that I’ve been thinking about for nearly a year. My love of maya is reinvigorated after a hard semester making a film and not being able to focus on video games.

Come on and SLAM and welcome to the Game Jam

Thursday marked the beginning of the RIT-Paderborn University Game Jam. Because it was a public holiday (Ascension Day), it started off as a relatively relaxed day with plenty of time to get to the University before the Game Jam started. With that said however, the final handful of minutes before the Jam started turned hectic, as many of the doors around the university were locked. I, as well as a few other students, got utterly and completely lost in a maze of doors, some locked and others unlocked. Despite the obstacles in front of us, we did eventually make it to the Games Lab just in time for the start of the Jam.

When the Game Jam started, we were split into teams of two in order to brainstorm games with the theme “Better Together”. Once that had been done for about 15 minutes, teams were combined into teams of 6 in order to discuss the ideas that people had come up with and decide on a single game to propose. Originally, my partner and I came up with a 2-player maze-puzzle game where the players start in a room together then go down various hallways in order to simultaneously hit levers and complete obstacles in order to advance through the maze. This idea was discussed briefly when we then formed into a team of 6, but we decided to propose a different game that seemed to me like a VR version of Dungeons and Dragons with a single player in VR in the game, and a second player acting as the Dungeon Master from their PC. The PC player would be in charge of spawning in enemies for the VR player and determining what items they get in the game, while the VR player would have to solve puzzles and fight the monsters. I fell in love with this idea, and while it eventually did not make the final cut, as all the teams met and decided on only 6 games despite there being more than 6 teams, I do want to eventually make this game a reality.

After the 6 games to be made had been decided upon, people were then sorted into various development teams for the different games based on their skill-sets. I was chosen to be a coder on a game called A-blob-calypse. Originally I had wanted to be a designer for the game, but because I have a solid coding background and there seemed to be a deficit of coders, I had no issue with filling in the role. Once we were sorted in teams, we began discussing various concepts for the game and how they would be implemented. Unfortunately, I began to feel rather ill midway through the day, and while I did get the chance to contribute to the project to get it started, I ended up heading back to the hotel earlier than I had originally planned so that I could rest up for the next day of development.

Sunshine, Castles, and Ice cream

Wednesday was a relaxing day for the group of RIT students in Germany. Instead of spending the day in Paderborn as we have done in previous days, we instead ventured out to see new locations and eventually made our way to a city called Bielefeld. The day was particularly sunny and warm, and made for a great day of walking around outside and enjoying the area.

In this city, we spent some time in the late morning and early afternoon walking around looking at the various shops in the area before settling down to eat lunch at a restaurant called Vapiano. While the menus were and unique style of paying for food via an accumulating card took a moment to understand, the food served at the restaurant was bursting with flavor and had various ingredients I had not heard of before.

After the lunch, we continued to walk around the city as we made our way towards Sparrenburg castle. In the city on that day they appeared to be setting up for a carnival, as Thursday was to be a big public holiday for Germany. It was interesting and fun to see all the carnival rides setup throughout the city streets and the various street vendors selling all manner of things from clothing to familiar “American Food”.

On the way up towards the castle I was able to see increasingly widespread views of the city, as the castle was perched on a rather large hill. Once we got to the castle, we had some extra time to spend while waiting for a guided tour through various parts of the castle, and I decided to spend that time taking as many pictures as I could. I was even able to get some wonderful pictures of the city from the ground level of the castle itself.

Once the tour started, we spent some time initially in the open air looking at various things in the castle yard such as the various castle towers and water well, but soon after made our way down into the crypts for a history lesson on the castle itself and the lifestyles of those who inhabited it. Down in the crypts we looked at the general dining area for the various soldiers that lived there, the bakery where all the bread for the castle was baked, and even the castle jail. I found the tour incredibly satisfying, and most of the information in the tour was translated and relayed from German to English which I appreciated significantly.

After the castle tour was through, the group then climbed to the top of the tower in the middle of the castle to get a birds-eye view of the surrounding city.

Once some time had been spent at the top of the tower and everyone navigated back down stairs inside of it safely, the group primarily had one goal in mind: To eat Spaghetti Ice cream. To satisfy this goal, a group of our German counterparts discussed where the best place in the city was to acquire such a treat, and led us to an outdoor ice cream restaurant where we could experience spaghetti ice cream in the fullest. After dining on ice cream and discussing a wide variety of topics with those at lunch, the group decided on returning to Paderborn to call it for the day in order to rest up for the coming Game Jam.

A Day Through Time

On Tuesday, the trip in Germany took a bit of a step through time as we viewed and discussed technology from the past, and then looked out where some technology is going for the future!

The day began with a trip to the Heinz Nixdorf Museum where we partook in a guided tour for some of the exhibits in the facility. We looked at the very basic machines and technology that were developed and became the basis for modern computer technology. Most of these devices functioned as calculators and number machines, which was very interesting. The tour also went over the start of using binary based systems for technology, and some of the devices that used the earlier implementations of this system.

Eventually the tour made its way to more modern computer systems and went over how they were made, including earlier Apple and IBM machines. After briefly looking at the more modern computer systems, which I found much easier to understand how they operated compared to the older machines that involved thousands of different wires and plugs, we eventually made our way to the much more present day and somewhat futuristic technologies involved with robots. In this section of the museum, we got to look at a number of robots on display and briefly discussed some of the technology that is being developed for robotics and artificial intelligence. We spent some time interacting with the robots they had on display at the museum, and I was very impressed with how functional they appeared and with what they were able to do. One robot in particular was able to draw pictures of people that stood in front of it, and another was designed to seemingly be a personal assistant of sorts.

After that the group moved on to the Paderborn University where we ate lunch, and then discussed what we had seen at the museum with our German counterparts. Once everyone had eaten lunch, we then moved onto the Games Lab that they have setup at the University where we sat in on a lecture about artificial intelligence. This lecture was based on current AI implementations in the world, leaning more towards applications in video games, and then turned into discussions about where that technology may go in the future. I found this subject particularly interesting because I have spent some of my own personal time looking into the subject of AI and the different ways it can be developed and implemented. Specifically, I am interested in the concept of building Neural Network AIs that take in information and are able to adapt and form connections and decisions based off of that information. I feel these types of systems would make significant changes in the games industry and change the way we play games all together.

After that the group spent some time in the Games Lab itself play-testing the game “Q”, and discussing with our German counterparts the various elements that went into getting the game ready for a steam beta launch. After that, some of us decided to go shopping while others returned to the hotel or stayed in the Games Lab. In the evening, a board game night was hosted in the Games Lab, and while I did not personally attend due to jet-lag issues and fatigue, others participated and had a great time with the German students playing board games into the early hours of the morning.