This was a week of both tedious nonsense and stimulating problem solving; of extreme unhappiness and strong satisfaction. Progress was made, though not as much as I’d hoped, and while I didn’t get to witness everything coming together properly, that sight is definitely on the horizon. I hope you like bullet points, because this one’s another post comprised of edited notes.
Monday
Morning:
- I solved the issue of the lines and grid inconsistently clipping through each other by giving the grid and the two lines each an individual material, rendered at different points in the render queue (so that they’re in a consistent render order)
- I saw that the widths of the lines were freaking out a bit when they were turning, especially at tighter angles, and I tried to think of ways to fix this, but the only way that made sense to me would be rewriting the code to draw the lines in separate chunks (with one for each segment), which could be time consuming and may require a fair amount of thought to get right
Afternoon:
- After having lunch, I fixed the issue of the lines shrinking from an infinite width instead of growing from none by multiplying the widths at their heads by the width multiplier value, instead of directly setting the width multiplier property
- I programmed a couple of loops to make the player and Triangle Man start about halfway down the triangle grid, two spaces in
- I first programmed a short bit of code to set the Triangle Man’s direction based on the player’s and a decreasing inaccuracy value (to make the player’s direction gradually matched over time), and then paused the game at the start of the interaction to come up with a series of test values for the Triangle Man’s movement pattern before synchronisation (to first get him into place, and then have a repeatable pattern)
- I made the lines longer, so that the patterns they create are clearer
- I felt that the mechanic could use more visual feedback for success, so I added some code to make the whole triangle grid pulsate if the two are moving in the same direction
- I made a build of the game, and recorded some footage of myself playing it
- I spent some time editing the footage, trying to keep the video within a minute
- After getting feedback on Discord for the footage and giving feedback to, and discussing ideas with, George and Sam, I uploaded the video to social media
- I appended the description of the game for the publication to make it a bit longer, including a section that describes the game’s origins as a project
Evening:
- After having dinner, I updated the game description for the publication, and found and edited images for my essay for the publication (which took a fair while)
- I created a new Unity project for the final version of the game (with all content combined) and created a new GitKraken repository for it, linking it to a remote repository on GitHub
- I spent some time creating sets of folders for the game’s potential assets (so that everyone contributing to the project knows where everything is), I imported the post processing package (finding that it’s now moved to the Package Manager window, which helps) and I started adding the necessary game objects to the scene
- After pushing the changes to GitKraken, I headed to bed
Tuesday
Morning:
- I went to the studio and continued adding folders and objects to the game’s final Unity project
- Ella came in and I had her try out the triangle mechanic, taking note of her feedback:
- She was at first only flicking the stick in desired directions (with mixed results) out of a worry that the directions could be misread if she held it, so I need to make it clear that the direction is stored (and which direction will be moved in)
- She was successfully matching the pattern, but because synchronisation took a fair while, she had to continue matching it for a long time, and making a mistake made her lose her rhythm, so I need to make synchronisation quicker
- I discussed with Ella her ideas for the art for the publication, and then we spoke about how the environments are leaning more towards supporting a camera at a lower angle than we’d initially intended (due to the higher level of detail and the overhanging objects)
- George came in, and we discussed what we’d been working on and what we need to consider (including sound effects and skyboxes, which I could try to handle with an in-code colour transition)
- We discussed how to handle the lines for the characters joining in when ascending the tower, settling on the flautist doing a slight wiggle in the middle at twice the frequency, and the Triangle Man and trumpeter doing a double helix motion along with Gloria and the Piano Man at a wider amplitude
- George presented the idea of needing to make it obvious where to go for players that don’t necessarily play games, as they might not have the inherent instinct to approach characters just because they’re different – we can’t make it hold the player’s hand too much, but through testing, we need to see whether a variety of players know what to do
Afternoon:
- After switching rooms and having lunch, George showed me the tower and I told him how to handle colliders and how I could program the camera while moving up it
- I continued to add objects to the Unity project, and then spoke with Ella about possibly handling the Triangle Man encounter by panning the camera towards him when approaching a corner (so that he doesn’t need to move)
- Ella checked where everyone was and how long they felt they’d take with their current tasks
- I started feeling very unhappy, and was incapable of doing anything for a fair while
- While I was incapable of working, Ella asked me what my plan was for the week, and then I returned to doing nothing
- Adam tried the triangle mechanic, and he quite liked it and played it as intended
- He said to make it more obvious when the roles have reversed, and felt that it wouldn’t be worth reprogramming the lines to fix the visual bugs
- He said to get a drip-feed of the music from Sam and Tim, to integrate it when I can (for testing and getting used to the integration)
- I briefly spoke to Ella and George about the feasibility of implementing a bespoke interaction between the flautist and the Triangle Man, and I learnt that the wind villagers fall from trees on swings, rather than upside down (as I’d assumed)
- I spent another long while incapable of working
- Feeling very unhappy, I headed home
Evening:
- After having dinner and washing-up, I continued adding objects and folders to the collated Unity project, and then (after pushing the changes to GitKraken) started copying old scripts to it
- I updated the status management script to account for the added interactions, so that the player would be properly determined as currently interacting
- I continued to copy and edit scripts (which involved changing a number of names and references to keep everything in line) from the integrated wind mechanic prototype until I went to bed
Wednesday
Morning:
- I went to the studio fairly early and made some tweaks to a few of the scripts I’d copied over the prior evening, changing name references, values and calculations to account for changes I’d made in approach for the mechanics and naming conventions
- Adam came into the studio, and after showing him what I’d been up to and telling him my plans for what I’d work on, he reiterated the need to prioritise having a playable experience over a polished one at first (and to integrate music before animations)
- I continued to copy and tweak scripts for the new Unity project
- I copied over the imported Gloria model (without the unlit materials I made) from the vertical slice project to the new project
- I headed out to Tesco for lunch
Afternoon:
- After having lunch, I copied Gloria’s materials from the vertical slice project and placed them accordingly on the placeholder Gloria models
- After giving some objects the necessary components, I briefly spoke to Adam again
- I set up the inputs for the analogue sticks in the input settings menu, placed a plane on the floor and tested that Gloria’s movement was working (thankfully, it was)
- I quickly added a circular layer mask in Photoshop to our social media profile picture and set it as the application icon in the project settings (as we’d previously decided that this image would be the application icon)
- I started feeling very unhappy, and wasn’t able to get anything done for a while, eventually deciding to leave
Evening:
- A while after dinner, I copied the scripts from the brass mechanic prototype, and then imported the circular sprite I’d made for that prototype
- I created a prefab for the balls that are dropped in the brass mechanic and dragged it into its space in the mechanic’s value management script
- After setting up all of the necessary objects, I checked that the brass mechanic was working, and after switching the render orders of materials, it was working as intended
- I had to fix an object reference to get the wind mechanic working properly, and then I spent a short while tweaking it and getting to grips with its variables again (since it’s been a while since I last touched it), which also included maintaining its opacity at full throughout the waves (as they’d initially been programmed to gradually fade, but that wasn’t actually working with the materials I’d originally been using)
- After drying-up, I copied over and tweaked the scripts for the triangle mechanic, set up the prefab for the lines in the triangle grid and tested that the mechanic was working (it was)
- I also made it so that the triangle grid sets its colour immediately, so that it doesn’t appear as a white grid before the interaction has started
- I copied over the scripts for the piano mechanic, but changed how the keys are destroyed when they’re replaced or finished with, making it happen in a for loop within the script that instantiates them instead of based on a frame counter within a script attached to each segment of the key set
- I attached all of the scripts, made a prefab for the segments of keys, tested the mechanic and tweaked a few things, including making the lines rotate upwards on a smoother curve (taken from the code of my other mechanics) and making the lines draw at the same radius (since the materials should handle the render order), and then it was working as intended
- Before heading to bed, I reprogrammed the section of the isometric camera’s code that transitions its values when prompted to do so, switching it to rely on a single shifting value (from 0 to 1) to multiply by the distance between each value’s starting and target values and add to the starting value (instead of many additions that factor-in independent total and remaining distances), and to use the same curve that I was using with the mechanics at various points for the transition (for less of a difference between the slowest and fastest transition speeds)
- The new version would hopefully be smoother to look at and more performant than the old version, though the start and end of the transition would likely be less gradual than before (and may require a lerp on the camera to be smoothed over)
- I intended to spend a portion of the morning programming a similar piece of code for making the camera’s target object transition its position and rotation towards those of its parent (being zero locally)
Thursday
Morning:
- I went to the studio early and, after a while, removed the unnecessary variables from the isometric camera script and shortened the names of the distance variables
- After a bit of talking, I changed the values being set for the isometric camera from the camera management script to suit the changes made to that script
- I started feeling incredibly unhappy and couldn’t work for a fair while, and then I went to my First Support appointment
Afternoon:
- After having lunch, I spoke to Adam for a while in his office, and then returned to the studio
- I spent hours feeling incredibly unhappy and unable to work, getting nothing done at the studio
- I had an emergency GP call, and discussed with them how I could proceed with the rest of the day and with my depression
Evening:
- After I was helped to feel better (which was appreciated), I headed home, and determined over the phone that I’d be receiving an antidepressant prescription the following day
- After having dinner, I gave Sam some feedback on the music that he posted to the group’s Discord server
- After drying-up, I changed the code for setting the current camera to account for a new set of transition-related variables, and then I added a subroutine to make the camera’s target object gradually move and rotate towards the camera it’s targeting (by changing an influence value from 1 to 0 and multiplying a modified version of that value by the camera’s initial offset)
- I realised that I couldn’t do a simple multiplication of the starting rotation, as it might spin in the least efficient direction to get to the target vector of zero, so I wrote some simple code to calculate the distance between the starting rotation and a vector of zero (based on whether each component of the initial rotation is greater or less than 180°)
- I watched the second PlayStation “State of Play” livestream before heading to bed
Friday
Morning:
- I got to the studio early, but didn’t really do any work for a good while
- Through a discussion with the team, we determined that we’d each have around 50-60 words as a bio on the website, alongside a photo of each of us
- Adam showed us the paint colours that we could choose from for painting our cabinets for the Winchester show (on 11th June), and we settled for “Kentucky Blue”
- Adam brought out the unsold items from prior years, as inspiration for things to sell in the shop during the Winchester show
- George tried the triangle mechanic and found it too difficult to match, but got there eventually
- Bernie then tried the triangle mechanic, and gave me some feedback on it:
- He liked having to memorise the directions, but found the actual pattern to memorise to be too easy, so it could probably do with being longer
- He said that memorisation takes some brain power, so people could get stuck
- When he tried matching the Triangle Man’s directions outside of the trail, he said it was confusing that you can do it without being in the same space
- For visual feedback to make it obvious to trace the exact position of the line, Bernie suggested speeding up the movement when you’re away from the line
- The general consensus was to make the player have to trace the Triangle Man’s line instead of matching the current direction, and after discussing the prospect, I figured out a way to program it (by checking the player’s target and current spaces against sets of two of the Triangle Man’s)
- Bernie said that players could exploit their ability to go back and forth along the Triangle Man’s line for synchronisation, so I suggested having the synchronisation loss rate equal to the gain rate, which he agreed would work
Afternoon:
- We went to town for lunch, and then I had to pick up a prescription from the GP and the pharmacy
- I wrote a short bio for our team page on the project’s website and sent it to Ella for her to paste it in
- I went to my first counselling session through the university’s Enabling Services
- When I got back to the studio, Adam told me that I’d need to make sure I’d sorted out a pipeline with George for him to finish off the environments and for me to implement them (and that plan has been sorted, with George looking to finish off the environments over the weekend, and me programming the logic in the meantime)
- I booked a GP appointment, and when I returned to the studio, Laura came in and spoke to us about the shop for the Winchester degree show (and, of course, I took notes accordingly)
- I spent a short while looking at shirt colours with Ella, to find a potential site on which to get t-shirts for the degree show
- We discussed the possibility of making an art book to show off the development process, for potentially selling at the degree show (and each holding a copy of), and that seems to be something that we want to be doing
- We went home
Evening:
- After having dinner, I did my week’s shopping at Tesco
- A fair while later, I implemented the loop I’d thought of earlier to check whether the player is tracing part of the trail that the Triangle Man left in his wake, but while coding it, I realised that I’d have to come up with a way for the Triangle Man to trace the player’s trail (for the sake of consistency)
- This would be hard due to the difficult nature of getting the Triangle Man to the player’s trail in the first place, so I considered having him simply double back until he reaches a point at which he collides with the player (which wouldn’t necessarily account for the player successfully synchronising early on and then refusing to make contact with the Triangle Man), or programming a way for the Triangle Man to find his way to the player (which might prove to be difficult)
- I tested whether the loop was working, and it was (which made the interaction incredibly easy for me, though I’m not sure how a new player would find it), so I actively thought about how to get the Triangle Man to the player during the interaction
- After a while spent thinking, I added some code to check whether the Triangle Man is moving between the right spaces after the reversal has happened
- I then spent some time adding the code to make the Triangle Man first target the player’s space, moving towards it in a direction based on its relative position along its row compared to the Triangle Man’s, and then the code to make the Triangle Man match the direction that the player moved from the space at which the two made contact
- I tested the system, and while it wasn’t working at first, I realised that this was because I was adding a 1 as if it were in brackets with a value that was being subtracted (leading to one of six directions not being properly detected, thus causing the Triangle Man not to set a direction and desynchronise with the player), and so subtracting that 1 made the system work completely as intended (which was ridiculously satisfying)
- I briefly tweaked the lines to look like they’re moving in curves of speed, moving far more slowly around the intersections than between them
- I made a build of the game, pushed the changes to GitKraken, recorded some footage and sent it to the team
- I was fairly tired and it was fairly late, so I headed to bed
Saturday
Morning:
- After having a shave, I took a photo of myself for our site’s team page, and then proceeded to add the image to the page in Wix
Afternoon:
- I spent a while editing the photo for my social media images (which wasn’t great, considering I don’t like looking at my face…)
- Quite some time after lunch, I imported George’s collated model for the environment white box (which will soon be replaced by a more up-to-date version soon), and I spent a bit of time trying to import it properly (setting its scale and compression through trial and error)
- I tried to walk through the whole environment, and though certain parts were hard to climb, I was able to make it through everything (though I posted my feedback in George’s channel to let him know about the difficulties climbing and the inconsistent scales of the wind and triangle areas)
- I looked through the code for the wind mechanic to see how I was setting and resetting the Boolean to determine whether the tower is being looked at, and noticed that I had to stop the Boolean from being reset as soon as the mechanic has stopped being drawn
- I was thinking of how I could consistently cue the characters to pause and then look at the tower after each interaction, and thought that I could switch from having one Boolean to determine that characters are looking to having one to reflect waiting before looking, one to reflect characters generally looking, and a set to determine which area the tower is being looked-at from, with coroutines to toggle the Booleans sequentially after a certain amount of has passed
- I programmed a series of coroutines to handle starting and stopping looking at the tower (as well as cuing the game to end), and made them public so that they could be called from the interactions’ scripts once they’d each finished
- I realised that I could also note that the interactions have stopped within the coroutines (instead of individually setting the Booleans at the same time as calling the coroutines), so I amended them to include adjusting their respective values
- One by one, I made the interactions call their respective looking coroutines in the sections of code that determine when they’re over
Evening:
- After having dinner and going on a walk, I amended the script for the ping system to accommodate for all of the areas that characters can be in, and thought about how to make this one script applicable for triggering all of the interactions (rather than having individual scripts for that, like in the wind mechanic’s vertical slice)
- I changed the code for setting the rotation of a character so that they turn towards the tower when everyone’s meant to be looking at it (and realised that I’d probably need to append that code to turn at an angle to the player during interactions, if marked as being a particular character)
- I placed the empty object for characters to target when looking at the tower
- I started programming if statements for triggering the interactions from the rotation/ping system script, but then I realised that I was actually meant to be triggering them from Gloria’s interaction script, so I commented the code out
- I spent the rest of the evening playing Mordhau and speaking with a friend, and eventually got to bed in the early hours
Sunday
Afternoon:
- After spending a chunk of the morning cleaning, I had my lunch and tried to open the Unity project, but it was taking forever
- I restarted my laptop, backed-up the old GitKraken master branch, pushed the project to the master branch and let a stopwatch count how long the project was taking to open while looking for possible solutions (I determined that I’d try a potential fix if it reached twenty minutes)
- The fixes weren’t working, so I tried giving Unity time to load, but after an hour and a half I felt like it just wasn’t going to happen (especially with George saying that it was working fine on his PC)
- The pattern I noticed in Unity’s log file was that it’d always hang on checking whether assets need to be removed or imported, so I assumed it was something to do with the large quantity of assets in the environment
- I cloned the GitKraken repository into a folder on my SSD, and the project opened properly
- Having wasted most of my afternoon, I first changed the code for checking whether characters are in range when the player is trying to interact, checking certain distances based on which synchronisations have already happened and which are yet to happen, with different Booleans and conditions for each character
- I then added the code for setting the interactions to start based on which character is determined to be in range
- I changed the object for the flautist to have the standard rotation script instead of his own bespoke one, and duplicated the object to make versions for the other characters
- After booking an extra graduation ticket, I started trying to properly size the character objects in relation to Gloria (though couldn’t properly, as I needed Ella’s size comparison image), and then created new objects in the scene to serve as the targets for the camera to look at the tower after synchronisation interactions
Evening:
- After dinner, I thought about which cameras I’d need throughout the game, added them to the camera management script as objects, gave them each an integer value to refer to them with and (re)programmed the subroutine for setting the camera target object’s parent to the correct camera target based on the currently set camera number
- After spending a while thinking through and taking note of a potential way to handle and program the cameras for approaching and climbing the tower, I realised that I had to slightly change the code for setting the camera target’s parent, so that they can each be given different different transition speeds
- I started working on the week’s blog post, and having spent a fair while doing that, this brings me to this moment in time
While I did have the actually satisfying and stimulating task of pivoting the triangle mechanic during the week, most of it was spent merely bringing my previous work together, which was pretty tedious. That tedium is set to continue this week, as I’ll have to be getting everything to work properly in the environment (as I should have done already). I’ll also have to program the various camera scripts that are remaining (which, as far as I’m aware, all concern reaching and ascending the tower), and there’ll be a lot of general testing and polishing to make sure everything is working as intended. I also hope to have as much as possible in place before the music is handed my way at the end of the week, so that I can get that working nicely in the game (including tuning the interactions to work with their respective tracks). I hope I don’t have more breakdowns this week, but I accept that it’s always a possibility, as demonstrated by the week just gone. Anyway, I’ll tell you how everything goes in next week’s post.