In the morning, we took a tour of Nintendo, Germany. All of us were super excited, yet some were tired(or just me). As a star company, Nintendo is very careful about its information; we were given visitor passes, had to sign in and were only exposed to certain areas. On the 16th floor is the European headquarter of Nintendo where we weren’t allowed to go. In this building, there are no game developers(they are mainly in Japan as we were told), instead, it’s a marketing and localization team for the European market. Very nice and understandable of the organizer, we were treated to some freshly brewed coffee before the tour started. After passing 100 security doors, two PR workers gave us a presentation on the company’s history, values, and leaders. The lady was very patient with us during the question session, however, all of the questions were about marketings rather than game development. Afterward, we had lunch at their cafeteria and I dripped tomato sauce on my white shirt, rip. I think the break room was the highlight of our Nintendo trip where they display the old consoles, Nintendo figures and a bunch of other gears. It was like a Nintendo museum. There was an employee only shop where I bought 2 amiibos, 4 coasters, and a keychain with the host’s help.
Our second stop was Crytek. For those who doesn’t know the company, they were the original developer of FarCry(Ubisoft now owns the IP), Crisis series, RYSE son of Rome, Robinson and their newest game Hunt showdown(still in EA). For their presentation, the HR demonstrated a brief overview of the company and how to get jobs in the interview. After that, Brian gave us a live demo on CryEngine; I can tell he tried really hard to sell us the engine but… In my opinion, CryEngine has a lot of potentials and may be able to compete with Unity or Enreal in 5 years, but for now, it has a lack of functionality. I understand that they made the Engine for Crysis and it’s a side project of the company, yet I just don’t think it’s ready to be popular. For example, Brian showed us how you can add invisible wheels with spring to an empty mesh to create a trampoline without writing scripts, however, you’d have to play with the two values to make the perfect elasticity. First of all, it’s kind of weird to have wheels on random meshes even though they are invisible. Second of all, it takes a lot of time to come up with the perfect values while you don’t have a formula.
Even though the presentations were a little frustrating, I enjoyed Crytek the most out of all companies. Because it was very casual and people actually make games in the office. We got to walk around their studios and talk to people, many of them were catching deadlines for Hunt’s new patch and all QAs were working hard. The whole floor was overheated, no doubt, feeling bad for the game developers. We weren’t allowed to take pictures at all due to upcoming releases.
After the two companies, we headed to a ramen place for dinner. It was a 20 minute walk and I was hangry the entire ride. My day was very fulfilling and I was satisfied with what I saw.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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.