Thursday and Friday – The Final days in Germany

Thursday and Friday were the final two days in Germany. Because of how short Friday turned out to be, I decided to include it in this blog post as I primarily used it as a resting to day to prepare for the journey back to the United States.

Thursday began as an earlier than usual day, as I had to wake up early to prepare myself for the journey to the town called Worms. We went to the train station to catch the first of two trains required to get to the town. The two train rides were not particularly long, though I did spend some time on the first train napping to try and get as much sleep as possible.

Once we got through both trains and arrived in the two, we began the day by walking around the town and seeing some monuments as we made our way to visit Kalypso Media.

At Kalypso Media, we were given a presentation about how the company is structured and the various locations and roles within the company and its various other studios/offices, as well as some sandwiches and soda to snack on (Tropico themed soda at that). From then on we were given a tour of the office in Worms and shown the various departments and given a rundown of what the responsibilities of the different roles were. After the presentation and office tour, we were then let out to go explore the town of Worms. Some in the group opted to visit an old Jewish cemetery within the town, while others opted to go out exploring on their own.

I personally opted to go exploring on my own with Amanda, and spent a large portion of the time in Worms visiting various shops looking for souvenirs and neat things to buy to bring back home and give to family. We also stopped to get Ice cream along the way (a running theme for this trip) and saw many different areas of the town.

After shopping for a bit around Worms, we met back up with the group at the train station, and departed back to Frankfurt. Once we got back to Frankfurt, we decided to get dinner at a restaurant that was what seemed like a half hour walk away, give or take some time. I was told while walking to this restaurant that it was incredibly “German Themed”, and this got me excited as I really wanted to have more traditional German food. These claims did not fall short, this restaurant was incredibly “German Themed” with plenty of wooden carvings and beer to go around. I decided to order a dish called, if memory serves, the “Frankfurter” which was set to be a bit of everything in regards to some of the more traditional German food. It was quite delicious, and something I would definitely eat again. In addition to that meal, I also tried some of the restaurants Apple Wine, which was also quite tasty.

After dinner we decided to head back to the hotel, and some of us decided to go to the “O’Reilly’s” pub one last time as a sort of farewell dinner for the German students as they would be leaving before us early on Friday.

After the pub, I went back to the hotel to call it a night for Thursday, and rest up for the final day in Germany on Friday.

On Friday, we were given a free day to explore the city and finish up and business or shopping we needed to do. As such, I decided to go to a place called Skyline Mall, as I had been recommended to go there by a friend who had been to Frankfurt in the past, and I still had some shopping I needed to do. Before going there, however, I got the chance to say goodbye to the German students before they left to return to Paderborn, and it was quite the sad farewell as I was and am unsure if I will ever get to see them again.

After wandering around the mall for a bit and doing some light shopping (and getting ice cream), I returned to the hotel to spend some time sleeping as I began very tired while walking around the three different shopping floors within the mall (and I hadn’t gotten much sleep the night before). After a quick power nap, I met up with Alex and Amanda to go get noodles for dinner at an “Authentic Japanese Restaurant” that was a several blocks away. The noodles at this restaurant were fairly good, however they were not as good as a noodle restaurant that we had gone to as a full group with both German and American students a few nights before. After finishing up at the restaurant, we began heading back towards the hotel as we were told the farewell ice cream meetup was going to be starting soon. Once we got back to the hotel, we met up with the other students, and proceeded to an ice cream shop that was only a few blocks down, where we had our farewell ice cream dinner then headed back to the hotel, officially ending the trip.

The Games Industry: Germany Edition

Wednesday, after resting up from our fairy-tale like adventures in Eltville, we ventured out to visit the Nintendo and Crytek studios in Frankfurt. While I am not able to share the finer details of my trip to these studios, I will share what I believe I am allowed to.

The first studio that we went to go visit was the Nintendo studio in Frankfurt. We boarded a train that took us relatively close to the studio itself, and then walked the final short distance to the business plaza the Nintendo building is located in.

While at this studio we learned that it isn’t focused on developing the games, as most if not all of the Nintendo game development is done in Japan, but this branch manages marketing as well as the publishing and legal aspects of getting Nintendo games in Europe, and more specifically in some cases in Germany. From then on we discussed more aspects of the processes involved with what this branch does in Europe, and some of the experiences that those that worked there had.

From then on, we went to a room where we were allowed to take pictures in, and this room contained many (if not all) of the games and consoles Nintendo had published and created, many of which were setup and ready to be played.

After spending some time in this room playing video games and competing in a few impromptu Super Smash Brothers matches (where I learned I cannot play Bayonetta to save my life), we then left this office building and made our way over to the Crytek studio building on the other side of Frankfurt.

At Crytek, we were given a presentation by our gracious host on getting into the games industry and some of the various positions one might expect to fill while getting a job in games. After that, we were given a demonstration on how to use different elements of Cryengine, and how some of the different tools in the engine work together. There was a big emphasis during this presentation on the visual scripting tools built into the engine, and the various game development roles that could utilize these tools for building different aspects of a game. After that, we were split into groups, one which got to play one of Crytek’s latest games “The Climb” which is a VR climbing game, and the other group got a tour around the office. After the first group finished the tour, the two groups swapped so that everyone got to see how the studio was laid out, and gome some brief glimpses of what was going on around the studio. After the tours were complete, we ended our journey around the Crytek studio, and began our journey back to the hotel.

Soon after getting back to the Hotel, we set out once again but this time in search of dinner. We decided on getting Ramen at a place a bit far away from the hotel called “Ramen Jun”. Over the course of the day I had gained a significant hunger, as did many of my other fellow students. To quench this hunger, Alex and I decided to order Large portions for our ramen bowls. This resulted in the two of us receiving bowls of ramen that were bigger than our heads. While I did manage to finish my bowl of ramen, it was definitely a challenge (a delicious one at that). After finishing up our Ramen, we all went back to the hotel where we ended the day to rest up for the next one.

Eltville and Elegance

Tuesday we took a train down to a town called Eltville. Little did I know that I would be visit one of the most stunning towns I had ever been to, or that we would be finishing the day in pure elegance in the town’s castle.

Tuesday morning, after taking the train down to Eltville, we briefly spent some time walking around the town together. After seeing some of the streets and looking at the older buildings, which I learned some of which were older than the United States, we decided to break up to get Icecream and some people went off to explore the town for a bit, before meeting up by the river that runs through the town.

I went with Professor Jacobs, Volker, and Sam to get ice cream and a smaller shop than the other people on the trip were getting ice cream at. We ordered our ice cream, and sat down to enjoy it as people typically do. Once I finished my ice cream, however, I remembered that I had seen a restaurant that had the word “Doner” on it. I was told by a friend of mine that had been to Germany many times in the past that I needed to go to a restaurant with this word in the title, as it would be some of the more delicious street food I had ever eaten. As a result, I decided to briefly step away from my ice cream companions to go order something from this restaurant. I decided on ordering a “Doner sandwich with cheese”, and was not at all disappointed with the results!

After getting my Doner sandwich and returning to the group I had gone with to get ice cream, we walked down to the river bank, and not only did I get to see a stunning ground-level view of the river, but also got to sit down and enjoy my delicious sandwich. We also some some bits of the old town wall on our way down to the river, which fit perfectly in with the old style buildings of the inner town.

After I finished my Doner sandwich and had some time to admire the river, we were informed via the group chat that there was a place down the way along the river that had delicious cold drinks, which was perfect as it was a rather warm and sunny day. I, as well as the nearby students from Germany, decided to make our way down to this building that we had been sent a picture of. Inside, I quickly learned that they had a drink called “Longwein” which was a mixture of lemonade, mint, ginger, and the local town’s special wine. This drink was absolutely delicious, and a perfect drink to have while relaxing at a table alongside the river. In the end, I ended up ordering two of these drinks because it was so amazing, and I had several flashbacks to lounging on the beach and a sea-side restaurant from a trip I went on to the island of capri many years back. It was an amazing and relaxing experience.

After enjoying our “Longwein” and talking for a while, we decided it was time to go explore the nearby castle, and as I soon found out would we actually be meeting the Mayor of the town in that castle.

We walked castle gardens for a fair bit, and I was amazed at how beautiful the flower displays around the castle grounds were, as well as the overall architecture of the castle itself. After a while I began to feel like I was no longer actually on earth, but in a fairy tale of some sort.

After walking through the gardens for a while, the castle began to close up for the day. Despite this, however, we went up to the interior part of the castle, where we met up with the Mayor of the town. We were then invited to climb up one of the towers in the castle, where several historical displays were setup, and when we get to the very top we were able to get a higher up view of the river and the surrounding town.

After concluding our tour of the castle tower, we then joined the Mayor in an upper-garden section of the castle where we enjoyed champaign, pretzels, and a dip for the pretzels that was incredibly delicious.

The reception lasted for about an hour and a half I believe, but after that we thanked the Mayor for this wonderful gesture, and sooner after returned to the train station in order to get back to our hotel. After getting back to the hotel, I decided to call it for the day there, as I had experienced a wonderful but eventful day.

The Rocky Road to Frankfurt

Monday began our departure from Paderborn, which was a very sad event as I had grown rather attached to the small but beautiful city. Alas, Monday morning we headed down to the train station so that we could take two trains in order to get to our destination.

On the first train we were all lucky enough to have our own assigned seats. Because of my exhaustion from the Game Jam, I was in and out of sleeping during this train ride, but when I was awake I spent most of the time just looking out the window at the surrounding landscape. I learned firsthand that Germany seems to have a lot of windmills scattered around, as every few minutes I saw a new one.

AFter some time we got to our transfer stop, and once we boarded the new train it was discovered we didn’t all have assigned seats like the first one, and it was a sort of free-for-all treasure hunt in order to get one. Unfortunately, I did not find a seat in time, and was too tired to walk up and down the halls of the different carts looking for one. Instead, I and a few other students, opted to sit on our suitcases in a semi-spacious hallway near the restrooms. My fellow students decided it would be a perfect time to pull out their switches to catch a few games of Super Smash Brothers. I initially joined them for a few rounds, but once my Switch battery was getting low I decided to just check the news on my phone and play some games on that device until we got to our destination.

After getting to the Frankfurt train station, it was a surprisingly short walk from the train station to the hotel. We all traveled together to the hotel, then got checked in and sorted into our rooms. After that, some students opted to go on a bit of a tour/walk around of the City with some of the students from Germany, while others were allowed to get settled in and spend some time resting and recovering. I opted for the latter, and after unpacking a bit in my room and getting the essentials setup like my laptop and switch charging. Once that was complete, I decided I wanted to go get food and walk around slightly in the direct area. I teamed up with Sam from our group so that I wouldn’t be traveling alone on my first day, and we went to the ” Sapôres Sàigòn Street Food ” restaurant, which was only a block or so away. I initially though from the name of the restaurant it would be more like a food stand giving away street food, such as gyros and sandwiches. I was, however, completely mistaken. This restaurant turned out to be more of a sit down restaurant where you ordered food and it came in plates that you shouldn’t just walk away with. I decided to order something I couldn’t even pronounce, but was not disappointed with the results.

Once I had finished up eating this delicious dish of meat, noddles, and various vegetables, we learned that we were meeting in a nearby pub called “O’Reilly’s”, where some were getting food but most were just getting drinks. We walked back in the direction of the hotel, as this pub was basically right outside it, and found the table our fellow journey members were sitting at. I ordered some drinks, and spent the rest of the evening hanging out with the students from Germany until I decided to return back to the hotel to get some much needed rest.

Game Jam Day 4: The Final Rush

Sunday marked the 4th and final day of the Game Jam. Presentations for the various games that had been made were not slated to occur until later in the afternoon/evening, so the morning became an “all hands on deck” dash to get everything put together and working as much as possible.

I woke up early on Sunday in order to try and maximize the amount of time I had in order to get everything ready on my end for the enemy AI setup, as I still had at least one more enemy to fully implement, the “Frightened” enemy type. Once I got to my desk to start coding, however, I was informed that the rotational system I had previous implemented was actually something that should be left in for only certain enemy types that needed to be marked as doing that type of behavior (i.e. the spider and the yet to be added mouse enemies). Along with that, I was asked to set up the enemies Unity Scriptable Objects, which was a system I had never used before.

Putting the rotational system back in place was not as much of a challenge as I had originally anticipated, as I was able to grab the code from a previous version thanks to the power of source control. I simply took the old rotational code I had made, cleaned it up a bit, and merged it with my new rotational code and used a Boolean value to determine which rotational code needed to be used to rotate the character.

Using a Boolean value to determine which type of rotation system the NPCs should use was also made easier with the use of Unity Scriptable Objects. While it took me a while to figure out what a Unity Scriptable Object was, and I got a bit confused on how they worked, after being shown how to roughly set them up and use them by a fellow team member I quickly understood their use. I transitioned most of the settings from the original script to the Unity Scriptable Objects code file, and linked the two together such that updating the settings in the Scriptable Object changed the way different NPCs performed. Using this system also allowed the Game Designers to create multiple different NPC types that follow the same general behavior patterns, which became very useful even in my own testing as I created a “SUPER Angry Spider” NPC that I made incredibly fast and powerful in order to test various systems. When I needed to refine pre-existing systems by adding more variables into the mix to alter the way things functioned (such as adding different types of speed the enemies would use depending on what they were doing), adding this in such that it could be understood and editable by an outsider became much easier.

Once the Scriptable Objects had been fully setup the way I needed them to be and the rotational system was fully reimplemented, I began working on finishing up the frightened mouse NPC that I had only barely started working on the day before for 10 minutes at best. I coded the mouse to,as with all NPCs, utilize the wander function to travel within a certain area when there are no players nearby. Beyond that, however, I setup a “FleeFromPlayers” function to accomplish the behavior of having the mouse, as the function title implies, run away from nearby players.

Setting this script up was actually relatively simple once I was able to plan out what I wanted to happen on a pencil and piece of paper. Essentially what happens is the NPC checks the location of nearby players, and when players enter the “aggro zone” that got setup for aggressive NPCs, instead of chasing after them they will instead add them to a list object for nearby players. Once the nearby players are added to the list the method then builds an average direction vector the mouse should travel towards in order to get away from the players by getting the positions of the players in relation to the mouse and turning that into a directional vector. I also made it so that the mouse would use a “Charge Speed” variable I had setup for the aggressive NPCs as the speed at which the mouse runs away from the players. Once this was implemented and functioning properly, I then went into the task of setting up the rotations in the event the mouse was marked as being one that should rotate. This was not entirely that difficult, I only needed to take a step back and go through what the code I had written was doing to find the places I needed to make code changes for flee rotations to work smoothly.

After the mouse was setup, I then went about the task of seeing how it would work in one of the actual levels that had been built as opposed to my own personal test scene that I had setup. One problem I noticed almost immediately was that the mouse was able to easily fly off the map and go through the walls when chased to that point. I then decided to try and find a solution to this, and in order to do this I had to look into the Unity Tilemap system, as it was used to build the level maps. I found that there was a way to get the bounds of the Tilemaps, much like you are able to get the bounds of various colliders. One thing that I did initially get confused by with the new system though was that instead of using Vector 2s and Vector 3s, it insead used Vector Ints, which was a data type I had not previously used. It took a bit of trial and error and digging, but I found out there was a way to convert a Vector2 into a Vector2Int. Once I had gotten that setup, I tried making it so that the mouse would stay within the boundaries of the “Wall” Tilemap that the designers has put in place to keep the players from moving beyond the map. This was moderately successful, as I employed a similar tactic for making sure the other enemies stayed inside their wander zones when not chasing the player, however the mouse would go just beyond the wall so that it was still out of the player’s reach. Initially I thought this would be an issue but then thought it was like the mouse escaping through cracks in the walls, as the setting for this game was in an old dungeon. I discussed it with the other developers and the designers are we decided it was a cool feature, so the players had to be quick and strategic in order to get the mouse.

Once the mouse NPC was completely setup, we decided to merge the branches together to see how everything worked on a singular branch. Initially things were looking good, but then after merging one branch in particular that had many changes to core systems, we realized things were no longer functioning properly. There was a huge miscommunication issue that seemed to crop up in the last couple of hours as a team member tried to redo a lot of systems that had been put in place the night before the final day. Unfortunately, the team member that made many changes to the core mechanics was unable to get everything straightened out in time and get everything working in unison before the end of the game jam, although some things were thankfully able to return to a functional state.

Once the time came for work to finish on all the projects, we went down a few floors for all the teams to present their games. The games that were presented all looked amazing considering the limited amount of time and resources available to work on them. I was particularly impressed by the fact that the “Strike Counter” game was able to get networking setup, and the amount of detail and presentation of the game “Beat the Boss”. While I did not do the presentation for our game, those who were presenting had to restart the game an unfortunate number of times due to bugs that popped up in the last minute due to the breakdown in communication on how the systems worked together. Overall though, they were able to present the game all the way through (without going into any of the enemy AI mechanics due to some of the issues) and we got some great feedback on how the game could potentially be brought over to either Nintendo Switch or Mobile devices.

After the Game Jam presentations were done, we all gathered outside to take a group photo with all those who participated in the Game Jam to go on a wall of fame for the lab. Unfortunately, I was unable to locate a copy of this photo as of yet.

After the Game Jam was over, we headed back to the hotel to rest up for a bit, but then set out to go find dinner. We headed over to a burger restaurant called Road House. I was informed on the way over to the restaurant that there was a triple-patty burger that could be eaten, and felt I had been issued a challenge. Soon after getting there however, I learned that not only was there a triple-patty burger but also a five patty burger, and those who fully ate it were placed on a wall of fame in the restaurant and got a hoodie.

I decided in the end not to order this burger, and instead went with this three patty burger. It quickly turned out that my eyes were bigger than my stomach, as I was not even able to finish the three patty burger, and in the end had to box it up for later. Along with that, I also had the opportunity to try a hot sauce called “100% pain”. Being the brave lad that I am, I decided it would be an excellent idea to dunk an entire french fry in the sauce then immediately put it in my mouth. Within seconds my face felt like it was getting exponentially hotter and tears started forming in my eyes. Luckily a good friend that was with us ran to go get me some milk for instant relief, and I decided it would be in my best interest to not try that sauce again.

After dinner concluded, we decided to go on a trip to get Ice Cream, but learned that all of the nearby Ice Cream places had closed. So, instead of getting a delicious frozen treat, we instead went for a long walk reminiscing about the past week and ended up in a beautiful section of the park in the center of Paderborn where we sat by the river continuing to talk. After spending some time at this park, we then returned to the hotel so we could rest up for our trip to Frankfurt (after a very tearful farewell to those who would not be joining us in Frankfurt).

Game Jam thoughts: Overall, I feel like I performed well in the Game Jam. I learned a lot about different systems present in Unity and how to better code with other people who may not know that much about coding in mind for those who will need to design levels. This particularly came to the front when I learned about using Unity Scriptable Objects. I spent most of my time this Game Jam working on the enemy AI, in addition to discussing with the other coders ways in which they could solve the problems they were having with things such as player controls. I was a bit disappointed that my hard work was not able to be showcased for the presentation, as a core element that enabled player and enemy AI interactions to function properly was altered to the point that the enemies no longer detected the player, no were consumed when the player crashed into them. Along with that, systems that the other developers had made for various things the player was supposed to be able to do were also rendered non-functional, and when I sat down with them to try and get them working we were unsure how we could go about bringing them back up in time as many of the core files for the game had been significantly altered. I did, however, learn a lot about quaternion math in Unity and how to go about programming different enemy AI interactions. I would be very interested in fixing up the project from its current state in the future, and go ahead with building it up more and maybe even move it to console.

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.

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.