Welcome back to For Amusement Only. This is Nick Baldrige. Ian Ian Harrower is an amazing asset to the P3 pinball platform's ecosystem and to pinball as a whole. Among several pinball and P3 accomplishments, he's a highly ranked player in the IFPA. He has a Twitch channel, GammaGoat, where he will play and discuss gameplay and strategies for various games, P3 and non. He's created an open and welcoming Discord for P3 enthusiasts and owners. He's released open source utilities to spur creativity or help other developers, as well as a fantastic tutorial for new game creation on the P3. He shared several prototypes with the community as they're developed, giving insight into the development and inspiration to other developers. And he has released a commercial game, Birdwatcher, for the P3 Pinball platform. I'd like to welcome Ian Ian Harrower to the For Amusement Only EM and Bingo Pinball podcast. Welcome, Ian. Well, thank you very much for the kind intro there, Nick. Happy to have you. Happy to talk about your game, Birdwatcher. Before we launch into the development, I wanted to encourage my listeners after this episode, if you would like to learn more about Ian and his background, to listen to the excellent interview with Dan Rosenstein on the Pinball Innovators and Makers podcast. And that link will be in the show notes. So, Ian, how did you find pinball? How did I find pinball? Yeah, so my origin to that is work, basically. So at work, when we moved into our new office, they were planning out, they had some budget for a game room, and they were planning out some purchase for that. And one of the senior engineers at the company was really into pinball, went through university during the peak of Bally Williams in the 90s, and owned several machines at home and was like, we should get a pinball machine. And he basically only knew two designers, Pat Lawler and Steve Ritchie. And he's like, well, we should get the Steve Ritchie machine from Stern Spider-Man. So we bought a Stern Spider-Man. And I would say that once I tried it, I probably played that game almost every day for a year. I certainly played it every day at work and I'd go in on weekends and play it and really got the itch for pinball at that point. Excellent. And, you know, something I've always wondered about that story, who did the maintenance for that Stern Spider-Man? So the original Stern Spider-Man, there was the first time something went wrong with it. They brought in the distributor, which was Starburst Amusements here in Canada, part of the Cineplex group, although they've been sold now. Their maintenance person was fine. They were able to fix things, but it was very slow to get them to come out and very expensive to get them to come out. And we have an office full of engineers and electrical engineers, and it didn't take long for someone to say, let me just open this up and pull out the manual, and I can probably fix this myself. So there was one of the people in the office who sort of took on the mantle of that. And once I started buying my own machines, I certainly started helping with the maintenance and eventually took over most of the maintenance on that machine. And the second machine we got much, much later, which was a Judge Dredd. And that thing was terrible to maintain. But I sort of tried to keep that going. But they got a lot of play and like free play in an office environment. The game's basically running more than you would get on any route. They took a beating, and it was really hard to keep them up and running. What attracted you to the P3 initially? When I first saw it announced, it was very much the idea that there was going to be an open SDK for it. The thought of being able to develop my own stuff, even if it was just for fun, just to play around with, was really appealing. So that was really the primary draw to me being interested in the platform. And when did you take ownership of the P3? That's a good question. You're like trying to push on my recollection of years very well here. In the first batch of orders after they announced the bundle of games at Texas Pinball Festival with Lexi Lightspeed and then the add-on games, barnyard lexi lightspeed secret agent showdown rugs and in lagoon so that bundle of the two modules sort of bought that day one when it was released and i think that means i got my machine delivered in 2018 okay but i could be off by a year one direction or the other very good and why was the p3 discord created i'd say the primary reason that was created was for the ability to organize online cosmic kart racing games. Once they launched the ability to play cosmic kart racing, it was much more enjoyable if you had voice chat. And if you wanted to just jump on and find a time, it's not like playing Call of Duty, where you have a million people trying to hit a matchmaking service. You have a limited pool of people, so you need to arrange ahead of time that you want to play online. So I created it primarily for that purpose, actually exclusively for that purpose. But it wasn't, it was just a Discord at that point. It didn't become a community hub until a little later, but it happened fairly quickly that people just started chatting in there as well. Yeah, it's been a very welcoming and fun space to hang out in for me. So I'm really thankful that that was created. Thanks very much for putting that together and ensuring that it stays that welcoming environment. So as a developer with a long and storied development background, which again, you can hear more of in your interview with Dan Rosenstein, what do you enjoy most about working on the P3 or how do you find the SDK? I think, well, so those are kind of the, the, how does it work and what is rewarding about it? Kind of two different aspects of things. I think that the thing that I find immensely rewarding is pinball is a physical thing. There's a physicality to it. And even if I'm just doing some trivial little prototype thing, the act of compiling that code, putting it on the physical machine and seeing it run was super, super rewarding. And it's that, like, there's this moment of, this is just really cool. I can physically interact with the thing I made. And I just love that. And the SDK itself is, there are some design choices in it that at times seem odd. I think there's good reasons for them that are tied to like a lot of the hardware behind it and frustrating at times. Don't get me started on how frustrated I am about light shows at times. But the SDK is very well designed. It's really easy to get 99% of what you want to just work. And now that I'm more familiar with it, there are things I would change in my own designs of my games. But it's clear it's, for the most part, very well documented and answers are easy to get. The developers at Multimorphic and other people like yourself who have developed games are always very quick to answer any questions that come up. Let's transition to your first commercial game for the P3, Birdwatcher. Can you explain a bit about the concept of the game? So what I set out to do is to build an approachable game where anyone could feel like they identify with the character that they are playing. You are yourself and you are taking photographs of birds. It was very important for me to be inclusive from that standpoint, such that a child or an adult, regardless of gender, regardless of who you are, could feel like I am part of this game, as opposed to playing some Marvel superhero where you may not identify as that person. That's great escapism, but that's not necessarily you. So I wanted to create something where anyone could feel like they identify with it. I chose the theme of birdwatching partially because I wanted to utilize aspects of the platform like the screen. There's a barnyard plus aspect of what I was trying to go for here. I enjoyed the game barnyard and I wanted to make something that was kind of like barnyard, but more sophisticated that might make people come back more and more. And so the idea of taking photographs just sort of popped into my head and I enjoy birds and nature. and birdwatching was sort of the avenue I went. During the process of creation, you actually released a tutorial for P3 developers or prospective P3 developers titled simply the Birdwatcher Tutorial. It walks a player from a freshly set up instance of the SDK through the modifications needed to create a simple version or a simplified version of Birdwatcher. What was the genesis of this tutorial project, and why did you feel it was important to release this to the community? Well, I think the idea was it's the thing I wish existed when I started. The E3 sample app that comes with the SDK is actually great, and it's got a lot of complexity. There's a lot going on. There's some interesting sort of modes with the side targets, with the inlanes, and it shows you how to do all of that. But it also kind of like when you get a project and you're just sort of thrown into the middle of it, you can start playing with changing things, but you don't really understand the genesis of how it got there. And so I very much wanted for myself something that started from scratch and went through all of the steps. And I had done some other toy things before this. And so I was fairly confident that I could write a pretty good tutorial that would walk through the entire process. And from day one, my idea was to co-release the tutorial and a polished visuals version of it as a commercial game at the same time. I think I massively underestimated the work in writing, editing and getting the tutorial released, and then massively underestimated even more the process towards taking that towards a commercial game. And the tutorial isn't perfect, but I think what it does well is it starts from nothing and you see the incremental process and it does cover almost everything you'd want to do. There's some gaps that maybe one day I'll go back and add into it, especially since I've learned more. But it gets you from beginning to most of a game with a few bugs in probably, if you really work on it, like three hours or so of sitting down and doing it. That's impressively quick. And I've seen quite the response from new developers, especially picking it up and running with it. So that's very exciting to see from the sidelines. Are you encouraged by the response that it's received? I've been thrilled by the feedback I've got from people. And I am looking forward to the first commercial release of someone who found the tutorial useful. for Birdwatcher, the commercial release. Can you walk us through the game? You've talked about taking photos of birds. How exactly does that function? The main game loop has three things that happen. The view you get as a player across the play field is a field, and within that field there are five bushes. Those five bushes represent spawn points where birds can be emitted, and they sort of shoot out in the direction towards the center from those bushes. There are two mechanisms that will spawn birds. One of them is a timer, which is randomized between certain values. And so just as a background event, birds will randomly spawn out of one of the bushes. The second way that you can spawn birds from the bushes is that there are shots indicated on the play field. So they're actually kind of hard coded. We can get into the how do you write. I'm sure we will get into how to write a game for all modules. but from an all module perspective by default i look at the module config and any shot is called a ramp and feeds the left and right in lane will spawn a bird unless i override that so if someone releases a new module today you won't get the arrows indicating that the ramp will spawn a bird but assuming it runs it will spawn a bird when you shoot a ramp that feeds the left in lane or right in late. And then when a bird is on the screen, you take a photograph of it by rolling over it with the ball, which uses the P3's ability to track and estimate the location of the ball using the IR grid. And once you take a photo, it gets added to your collection, which persists across games if you are logged in. It has a series of points awarded based on the rarity of the bird that was spawned. And that's the primary game mechanic. There's sort of a secondary function, which is time. The game is timed. Thematically, you have a camera. The camera has a battery, and you're trying to take as many photos as you can before your battery expires. And there is a mechanism in the game to recharge your battery by spelling the word recharge on the side targets, which you can do once to restore your battery up to 100%. So if you wait to the last possible second, you can double your play time by using the recharge function. And the overall time is adjustable in the settings menu. Is that correct? Yes. So it is a per-profile adjustment, I believe, for the overall time. Excellent. You've mentioned Birdwatcher is a game that can utilize multiple modules. Was it always your intent to allow for multiple module play? It was. So the persistent bird book, which keeps track of what birds you have collected, was kind of a primary design principle of what I wanted. You know, I have some demos, some prototypes for some other games. This is a common trend in the games I was playing around with. And I know that you have similar common trends in your own games. And I think it's something that naturally sparks interest because of the way the platform is set up. So I wanted persistence. and I really quickly came to the idea of having a specific bird for each module and encouraging people to swap modules and play the game on different modules. Whether I succeeded at that or not, it's a different question, but that was sort of the design principle was that I would want it to play on all modules. There's sort of a secondary factor, which is that I was developing Birdwatcher Tutorial and my first game I developed, I did it specifying one play field. And in some ways that's a lot easier, but when I start a new project now, I always start it as an all module project. I don't want to have to swap modules on my machine to try it. So if I'm testing out visuals or light shows or anything that isn't module specific, I want my app to load. And so the whole game may not function, but those module independent things, I want to be able to test on the physical machine without having to swap playfields. So I now start all my projects as sort of module agnostic so that I can test that way. Interesting. So regarding carryover progression, you touched on that a bit, but you actually offer two different methods for carryover, both with profile interaction and then a location or non-profile interactive carryover. What are the differences between these two modes of operation? And what were some of the challenges in implementation? So the original design was profiles. And the idea was for people to use profiles. That is the sort of base design of the game. That is how the game was intended to be played. And then I was going to have nothing as a carryover if you were not logged in. And as I moved towards thinking about a commercial release, it raised a lot of questions that I hadn't thought of. This is a weird game to put on location, but I wanted the game to function on location. and you wouldn't necessarily be able to log into a profile it's maybe disabled because if you've got hundreds of people coming through your location they're not going to each be able to create a profile and you don't want to give them access to all of that so i still wanted people to kind of have a reason to keep coming back and so i came to the idea of having a play session where if you just finished a non game either at home or on location your bird book would still persist for your next game as long as you started it within a certain time period. That's operator adjustable. I think my default is something like 30 seconds. So if you play another game within 30 seconds, your birds are going to persist. And you can see what new things you get, and you can try to complete that bird book. You could dump quarters into the game and try to complete the bird book on location if you wanted to. And it gives you that option. I'm very happy with how that played out in the end as a design, even though the non-logged in design was not something I had in mind from the beginning. And I'll say that the game, which I call Arena, which will probably never get released, but maybe will, it actually forced players to log in in that version. And I've now changed my mind about how I'm going to approach that game based on really liking how Birdwatcher came out with the sort of continue default profile option. Excellent. It's always interesting when design consideration for commercial release influences your way of thinking about other games that you're working on. At least I really enjoyed that aspect of development. So I'm glad to hear that you're experiencing that as well. Did you have any issues with the actual implementation of the carryover of the bird book? I implemented it in a very simple way. It is just a serialized object. The object that represents the bird book just gets serialized to disk and then loaded. I originally looked at doing it through the natively supported features, which the way you would typically do things for persisting within a save state and across player changes within the SDK is to write data back to a database. But you are storing key value pairs where the key is a string and the value can be any number of a series of primitives. And I could have implemented it that way if I had implemented things like a multiplayer games. I probably would have, but I've made the design consideration to simplify my life and make it single player from day one. And that meant just using native serialized object types within Unity was the easiest way for me to approach it. There is still a challenge from a design perspective, which is something I haven't solved across much of my development, but I kind of get the job done, so I'm okay with it. But that bird book is the source of truth for the bird book is not very clear in my design principle because it's a persistent object within the UI space that is always being presented to the player. It kind of keeps track of it within the UI layer, except the source of truth has to be in the mode layer, especially with the serializing out. And so I always keep tracking both places and then update from the mode to the UI to make sure they stay in sync. And that's not a great principle, but I haven't really figured out the correct design paradigm for dealing with the two layers and source of truth in most of my designs. Yeah, it can be very tricky to find something workable and then hone it from there. So I sympathize. But I do love the separation between UI and mode layer more generally on the SDK. A player has played Birdwatcher. They've completed their bird book. What's what's next for that player? What are the additional challenges available? So I wanted something to keep people coming back. And so I did introduce one other sort of additional thing to find and thing to collect. So if you've completed your bird book, you've already found the rare birds. So there are two very rare birds, and you can still get them just playing on a single module. They're kind of Easter egg jokes. I won't spoil them here, although they're spoiled everywhere. They're not that surprising. They got kept as a secret for like 30 minutes or something like that after I released the game. So there's those two. But once you've completed it, I wanted something else for people to do. So there is a rare version of everybreeches, which I call a crystal bird. So there's a lighting effect, a material effect on the bird model, which gives it this glass crystal-like look. When this bird spawns, it creates an interesting light show that does a radial explosion of lights from the center of it with a particle trail and a sort of wind chime, crystal wind chime type noise. So you really know what's happening. and when you take a photo of this it will give you a special marker within your bird book and it is very rare and getting the crystal versions of the rare birds is incredibly rare and so completing the entire crystal bird book i don't think anyone has done it someday someone might you know it just takes time and a little bit of skill you still have to i think you still have to take a photo to get the mark so you can fail which would be frustrating but it's all there And so there's something else for people to chase down. And that is, you know, inspired by various other collecting games that have alternate colorways. Very rare and similar to collectible cards themselves with foils and things like that, which is what I was trying to go for. What is the total number of birds to collect? There are 15 birds. There are two rare birds, seven module-specific birds. Something like three of them are common and the rest are uncommon. And the distribution works that the module bird for the module you are playing spawns at a common rarity. So if you're playing on Weird Al, you will see the chicken a lot. If you're playing on drains, you will see the bat a lot because they will spawn as a common bird. And so each module has that common bird, but each module will allow you to see each of the bird types just with a different rarity value, as you noted. So if I'm a P3 owner that owns only Cannon Lagoon, for example, I can complete my my bird book in total. Are the crystal forms of the birds more common on their native modules? The crystal form isn't more common, but it is. So it's an independent draw. So first I draw what bird it is. And the distribution is sort of, if you shoot a ramp, you actually get a uncommon or rare bird. You don't get a common bird. And the timer spawn draws over the entire distribution. So if you're trying to get the seagull, you're going to see more seagulls and therefore have more opportunities to see the crystal seagull if you were playing on Cannon Lagoon than if you were playing on one of the other modules, but it doesn't block you out. I think that this was a design choice where I didn't want anyone to feel like there was any part of the game they couldn't access. And I kind of went back and forth on this, because it actually would be very cool if you only got the bird by playing on the module. But I felt, I think I chickened out, basically, and felt that players would be upset with me for buying something where they can't see all of the content. That makes sense. So next, let's transition to artwork. Birdwatcher is primarily a 3D game. Did you use any pre-purchased assets in the creation of the game, or did you develop all the models yourself? It is both. I started developing all the models myself. All of the birds, I modeled myself. And the sort of main environment, I modeled myself. When I got to doing backgrounds, I started modeling myself. And you can probably tell which ones I did first, because I did model them myself, which is like Lexi. Because my first idea for Lexi was to, you know, recreate the ship crash off in the background. I'll say like my original idea for Birdwatcher, which there was no way I could ever implement and it was like way too hard, was to actually model the modules within the game instead of being on a field, being like you were shrunk down within the pinball machine and in the background, actually seeing the physical module playfield, which I think would have been really cool, but there was no way I could have actually succeeded at that. Anyways, so having the ship crash, it's sort of like in a similar spot as to where the ship is within the Lexi playfield. And it's a much simpler background there. But then when I got to something like Feist, I wanted to have a cityscape in the background, and I wasn't going to model a city myself. I could. Like, they're just boxes with textures on top of them, and it would take time, but I just decided that for the return on my investment, I might as well just buy an asset pack. And so I bought a megacity asset pack within Unity and just sort of slapped that down in the background. And then once I owned it, I'm like, and once I'd done that once, it was very easy for me to just say, okay, well, now we're just going to use this everywhere and create our environments using this. And so the quick answer is of the 3D stuff, the birds, the field, the bushes, well, the clouds are someone else's asset except for the Translight, in which case I remodeled them myself for licensing reasons because I couldn't actually create Translights using a Unity asset, which is weird and complicated because Unity is licensing. So some of that I did, some of it I didn't. That is one of the strengths of leveraging Unity as part of the SDK for making P3 games is that there's a marketplace of 3D, 2D artwork, music, sound that can be leveraged within your game. Now, it wouldn't be unique to your game, but it is a great way to implement something like you mentioned, that cityscape. As you say, you could have modeled it, but it is certainly quicker and more effective use of your time, perhaps, to utilize one of those pre-purchased assets. So very cool way to mix those two worlds of creating your own and leveraging existing. So as far as creating your own models, what software do you utilize? So primarily everything there was done in Blender. And that still is where I am most comfortable doing 3D. And did you have any prior Blender experience? Not really. I think I had probably done a little bit of stuff at some point. I'd played around with Blender. I had used other 3D modeling software many, many years ago. I like 3ds max and did a lot of AutoCAD back in high school, but the world has changed a lot since then. And so Blender was fairly new to me, but also kind of familiar though. It wasn't too hard to get up to speed, but I looked at some low poly bird tutorials on YouTube to kind of get a sense of what the best workflow was to, to end up modeling things. Cause what I'd done previously was largely constructive solid geometry type modeling. And now in Blender, that doesn't really work the same way. It's much more about slicing faces and extruding faces and various things like that. So I had to kind of learn a new way. And then I ultimately ended up buying a bundle of courses as well that I ran through some of. And that was actually very helpful just to get my workflows improved within Blender and understand what tools I should be using at what point and what the keyboard shortcuts for everything are and just how to improve my workflow. And I will say, like, my bird models have a unique style. They're very much consistent across the entire game. Do they look like anatomically correct birds? No. But I made them myself, so that was kind of the idea. That was a core principle. I wanted to see what it would be like for me to build this myself as opposed to just buying an asset pack of birds, which I could have done as well. You took these models, pulled them into the game, and then there came a choice for how to animate them. As you say, the birds emit from the bushes. Do you add bones and rigging or move the completed model? And which method did you choose and why did you choose that method? I chose not to animate. There's a number of reasons for that, mostly because animating is really hard. And even modeling the bird in such a way that animating would be possible is really hard. Because if you think of the bone structure of an actual bird and the act of taking off into flight, it goes through a lot of movement in its spine, in its wings. and the way its feathers deform and change, it isn't something that you can actually just model with a simple, here's eight points on a bone mesh. It's just going to look wrong. You actually have to model feathers as well. You have to be able to spread them apart and change the way things look. And you have to start to look at muscle and stuff like that. So I kind of decided that I could do really low-quality animations that look like those wind-up birds where they have stiff arms that just flap. But I didn't think that would look good. And I checked out a really, really nice, free, off-of-sketch fab animation of a seagull flying that someone put together. And it was gliding and waving its wings every now and again to stay in the hover state. And I actually put that on one of my models. and I'm like, I could do a lot of work and transfer someone else's animation onto my model. It's still not going to look like it's taking off because taking off is really hard. And at the level at which you see it on the play field from the sort of overhead view, I just didn't think animation was worth it. And that's sort of the short answer is that the time investment and quality that I would get out just wasn't there for me to bother doing. Yeah, for the number of seconds that the player actually sees the bird in flight, it's fairly short. So adding a sort of distracting to the eye element like flapping and movement might be overwhelming for the player. I'm not sure. I haven't seen how it would look with that. That's an interesting concept when you're developing a game is that adding more realistic elements doesn't necessarily make it a more compelling experience. So your back glass has a very clever dynamic viewfinder that follows and photographs the birds. Were there any challenges in implementing that system? Yes and no. So that is darn entirely using Cinemachine. So Cinemachine was developed by Unity. It was developed during the transition from Unity 5.6 to Unity 2017. It is not officially compatible with Unity 5.6. However, the previous versions of it that were very early on worked in 5.6 outside of animations. So the basic camera tracking worked and works reasonably well and was released under the Unity library. I forget what the exact license is, but it's the Unity library for their licenses, which basically says you can use this as long as you're releasing a Unity game. and so I just tried it. I was like, what happens if I take this into 5.6? Well, all the tests fail, and you get all kinds of missing things because the render pipeline got completely rewritten in 2017, so none of that exists, but you just delete those folders, and now all of a sudden you have a state machine which can do smooth transitions between multiple cameras, which can have cameras track objects, And so I then just had to figure out how to piece all that together. So the basic idea of how that actually works in the back glass is I have one static camera that points at the bushes. And then I have two cameras for tracking birds. And when a bird spawns I point the next camera at the new bird and then create a camera transition to pan and zoom from the previous camera to the next camera And so it pans the focus over to the new bird zooms in and frames it And I just sort of keep updating in a cyclic manner which bird it's pointing at. And then if no birds are on the screen, it will revert back to looking at the Bush's camera. So it transitions between the three states of the cameras. and it does the hard work, the math automatically for computing the smooth fades and zooms between them, or the pans and zooms between them. And I didn't have to do any of that. Very cool. The music in Birdwatcher is very relaxing, and you'll hear a slice of that at the top and bottom of this podcast. But how did you decide to use this song? So this is one of these, when I started developing games, one of the things I started doing was when assets went on sale, I just bought them. And so there are several Humble Bundle sales that had gone on where I was just like, I'm just going to grab this bundle and maybe I'll use it, maybe I won't. And so there's some 2D assets that I bought that way. There was a music bundle from a composer whose company is called Dark Fantasy Studios. And I'd actually bought it, that bundle, primarily for use in Arena, which I kind of mentioned briefly. I wasn't sure if I was going to use it there, but it had weapon sound effects. It had voice call-outs for spell castings and things like that in a made-up language in a female and male voice and various things like that, as well as a bunch of spooky, eerie, RPG-type music. And so I bought that bundle. and then when I was doing Birdwatcher I sort of looked through what I had and there were a couple albums on there that were very much in a completely different style than Dark Fantasy which were some very nice, light friendly songs and so I picked three of them to use within the game and the Attract Mode music which, so that's my Attract Mode music, it just sort of had a nice laid back vibe that kind of matched with like the sun coming up on a field and life it's called celebrate life like it's it's very much got a a feel towards it and that um and then there is a main song for the that is less there's less to it it's more backgroundy um that plays during the game and then there's a high score track and it's actually kind of funny because the attract mode one i just kind of liked the song but it didn't really it was too in your face to have as the main loop songs um but But then when I went and made my trailer, I made the trailer using the main Game Loop song, and my beta testers were like, what are you doing? You can't have that song play in your trailer. Birdwatcher is that attract-mo music. That's the feel of the game. So in some ways, this track that I purchased very much defines, in a very short amount of time, the feel of the games. I agree. The other tracks that you mentioned, were they also from that bundle, or were they from other sources? Oh, yes. They're all they're all from that bundle. I think they're off of three different albums within that bundle. But they are all from there. And you will probably see other songs from that bundle in future games from Ian Hairwear Games, because I have it. And it's finding music is a lot of work and getting custom compositions is a lot of work. And those are not right now what I want to be focusing on. Do you happen to know if all three of the songs were composed by the same composer as Celebrate Life? Yes. Yes. OK. Yes. So Dark Fantasy Studios is just the one composer who I don't want to get his name wrong because I don't have it in front of me and I want to pronounce it correctly. There will be a link to Celebrate Life in the show notes and Dark Fantasy Studios. Moving on in sound design for each bird, there's a unique sound effect or call. How did you acquire those? I think every single piece I use is from freesounds.org. And every single one of them is Creative Commons 0, so public domain, except one. There was one CC by, so Creative Commons 4 attribute commercials allowed sound callout because there were just fewer callouts for some of the birds. And I even had to fake some of them. A lot of them are not actually the real bird. But it's an amazing resource of extremely varying quality of audio. and a lot of it is Creative Commons Zero. So completely free to modify, free to use, free to use commercial, no need to attribute. And a lot of it falls under like a full spectrum of licenses. But if you're willing to put the time in, there's some really cool stuff there. There's also some really like historically interesting stuff that will never really work as like a video game content because it's just way too noisy and stuff like that. but it's neat. Like you can, and if you want like the, an original cleaned up recording of the Wilhelm scream, it's there. You know, you could just go get it. And I don't know how to do real commercial audio design. Like I know there are places you can buy and license and buy subscriptions and various things like that. But freesounds has been enough for me to get me what I need right. And you can tell in Birdwatcher that some of the bird calls are much cleaner than others. And then there are some fake bird calls. One is the bat. First of all, I apologize to everyone who is angry at me because bats aren't birds. And I apologize to the one person who's angry at me for clarifying that bats aren't birds because he doesn't think it's worth it. And it doesn't matter, but I like to be specific here. But so bats actually have several sounds. And so they do actually have a sort of call. I think what I ended up using in the game was their echolocation sound, which is sort of more bat-like than their sort of screech calls, which just sounded bad. I don't remember. One of them sounded really weird. It is sort of like, this is real, but I don't like it. So I went with something that sounded more like what I would expect. The other manufactured one. So there's some things where the real recording or a similar recording I didn't like. So some of the cooing of the family of dove-like birds. So I have a pigeon, a hoopoe, and the dove itself. They're all kind of dove-like birds. And I cheated and used incorrect ones. One, because there's no recording of a hoopoe anywhere. but I know it has a coo dove-like sound. And so I just sort of like went to the family of doves, doves, pigeons and that, to come up with appropriate sounds in that place. And so they're not necessarily accurate. And the other one is the hummingbird, which was actually really interesting because the hummingbird actually does have a bird call. And that's another place where it sounded nothing like, one, it's really hard to get a recording of. It's a very tiny bird. And it doesn't, its call isn't really distinct. It doesn't really cut through very well. And so what I ended up using there was a sound file of a fly trapped in a cup. So a microphone under a cup with a fly inside the cup. And so to try to make the sound of the wings of the hummingbird. And that was what I used as the sound there. Very interesting. So how did you determine which birds should be available upon which module? Did the sound design play a part in that selection? or was it all pre-planned at the start? You act like I'm saying anything. I'm very much a moment, in the moment kind of person. So for each of the main birds within the modules, I kind of looked at the module and asked myself, what bird feels like it is in this? And one of the first ones I did was Lexi Lightspeed. And I sort of asked myself, well, where does Lexi Lightspeed take place? So it takes place in a Florida swamp. And I don't remember if it specifically refers to Florida in the game, but when it crashes, you can see it crashes into Florida, and there's definitely a Florida vibe to the game, whether it talks about Florida specifically or not. And so I kind of was looking around. I'm like, what interesting-looking birds? Because they need to be visually distinctive enough for you to say, oh, yeah, I think that is what that is. And I went with the Belted Kingfisher there, which is got a very distinctive crest to it that i thought i could model in a way that people could look at it and say that looks like a belting kingfisher so you know that was very much kind of what bird would actually be in this environment and that was a single similar feel for heist heist is a ocean city which is not legally distinct from atlantic city but it's got kind of like an Atlantic City vibe to it. But it's a city, and I sort of felt I already had other coastal bird modules, so a pigeon seemed like the kind of thing that was in the city, despite the fact that seagulls are actually in the game. But I went with pigeons as an appropriate thing. I think there are actually pigeons in the opening animation for Heist, now that I think about it. So yeah, that was sort of the inspiration for those. So I kind of started from the module and asked myself, can I model this in such a way that is recognizable, and then went from there for the module specific. Makes perfect sense. Always interesting to hear about the creative process that brings about these different decisions regarding assets or artwork that are specific to each portion of any given game. So the other aspect to it is that within each environment, there is also a billboard. And this was another sort of art consideration that was entirely inspired by the fact that Lexi Lightspeed Escape from Earth has a mini LCD on the playfield. And I needed something to put there. and I decided that putting a billboard that was then mimicked within the background of the screen would kind of get towards that original vision I talked about where you see the ship crashed here and the billboard here and then I sort of extended that and put a unique billboard in every single one of the modules based on the bird that was there kind of explaining the connection of the bird to the module to a large degree. So as you play the game, you'll see if you're playing on Cosmic Car Racing, you'll see the module-specific bird and then a short blurb, come visit the observatory or come meet Gull at Cannon Lagoon, those kinds of things. Were those assets created or were they pre-purchased? And did you do the creation? So feel free, everyone can feel free to get very angry at me right now, but those are all AI-created images. I believe in slightly ethical AI art amongst all of the image generators. I kind of feel the way stability AI does there, especially on their later models. And those were created using Stable Diffusion 2.0, which has artists opt out. So that was the one where they actually implemented the ability for artists to opt their images out of training. you know we can get into the ethics of AI art in a lot of ways but the background images were created using stable diffusion 2.0 and then like text of that thrown on top of it by me and it's you know it's a bit of a process to create reasonable looking images to use there but I am not I am not artistically talented and so I think that and I don't have a budget to necessarily pay a real artist for their time. And so this was a rapid approach for something that isn't core to the game, that is non-copyrightable art that I can use that is close to my own creation. And I don't feel that the images I produced appear to be anything taken or overfitted from real art. And now that we've talked about assets, let's talk about programming. What was the biggest challenge that you had in programming the game? So I think the biggest challenge is probably the fact that I was trying to design for every module simultaneously. And that extends from light shows to various hardware choices to play field designers doing really weird things that completely make the primary implementation of my game not make any sense. That was a dig at you, Nick. Hey, now, as far as the multiple module, what was the hardest part about that? Was it just the testing or was it actually implementation? Were there issues with not just creating the light shows, but creating beautiful light shows that worked across each module? or did the SDK help you in the development of those? So the SDK certainly helps in a lot of respects, but light shows is challenging. And there aren't a lot of light shows in my game. There are sort of, there's a few primary ones, but like, let's talk about the ramps themselves. And so I wanted something in the play field lights to indicate that you should shoot the ramp. And let's think about some of the modules and their ramps themselves. So let's start with Cannon Lagoon. Cannon Lagoon doesn't have lights. So you're not indicating your shots in Cannon Lagoon. Okay. Well, let's look at Cosmic Cart Racing. Cosmic Cart Racing probably has the most lights in any pinball machine. There are four strings of lights, two strings of inside, two strings of outside on both of the ramps. lamps and there's probably around 100 leds on each of those strings of which half of which are kind of the first half and so how do you create a light show generically that looks good on a curving double laned light and at the same time works on weird al where there is a single light on the left which is a insert triangle that indicates underneath inside the ramp. And so trying to rationalize both of those things. And then you have like Heist, which doesn't have indicators for the ramps and configures a whole series of environmental lights and associates them with the ramp itself. And they're kind of behind building billboards. And so they look very different if you illuminate them in like a red color. It's going to look really weird because it's shining through a gray building. And so there was a lot of actual just the variation in what you get to play with on each of these was kind of a challenge in generating something generic to begin with. Was there anything that was easier than you expected once you started digging in and, you know, once you had an initial prototype? was there something where you said oh hey this this works exactly as i thought it would everything is perfect and it kind of carried all the way through to release what i think that generally speaking it was remarkable that it just worked like that it that when you write things in a generic way so i did write the ramp lighting centered around cosmic kart racing so that if you have multiple LEDs, it will strobe across them and create a chase effect. And it looks fine when you have a single one. And it was quite remarkable once I sort of had that to drop it into the seven modules and have things just mostly work and just have to do sort of small tweaking from there. You know, the fact that when I wrote the game before when Final Resistance was announced, but before final resistance was released. And my data testers got their final resistance play field before I did. And so one of them just I sort of asked hey can you just fire this up and see what happens And it crashed Once we worked through the crashes it actually just kind of worked You know the light show just kind of worked. The ramps correctly identified themselves and spawned birds. So I am making no promises that Birdwatcher will be updated for Princess Bride. But I'm really interested to see what happens when it just drops into Princess Bride because the configuration of the modules themselves very much give The game will do something, and it probably will make sense, and it will probably look pretty close to being correct. And I could have done more work to do even more things in a module-independent way such that they would just work, but it really wasn't worth the effort. But ball launches will probably just work on Princess Bride because there will probably be a configuration that will logically cycle through. It's just going to happen because it's going to be configured to have an in-lane feed and a playfield feed. And I'm just going to cycle through them and it's probably just going to work. And so there's a lot that was really remarkable when switching between modules where if you designed it in this way, it's going to function. And it's not that surprising because Multimorphic has written barnyard and rocks and shoot and scoot to do exactly this. And this is why targets have locations. that shoot and scoot works the way it does and will work on a new module. And so it's both surprising and not surprising because they engineered it and designed it this way. But it is always eye-opening for me with each new capability that I attempt to utilize, just how well thought through a lot of these things are, like the target locations. It's useful in so many ways when you're dealing with an application which operates independently of any given module. Birdwatcher is designed to use Lexi Lightspeed Escape from Earth, Cosmic Cart Racing, Anon Lagoon, Weird Al's Museum of Natural Hilarity, Heist, and Drained on its initial release. And as you say, final resistance was added in an update that came later. But I wanted to touch on Drained for a moment. Drained is the module that my company manufactures for amusement-only games. And this is the first third-party game available on a third-party Playfield module. What made you want to support Drained with Birdwatcher? Well, one, I own a Drained. I love the game. I love the module itself. Like the, you know, I think we share an appreciation for games from the electromechanical era. and the inspiration you can see a lot in the drain design that harkens back to you know games like target pool or jungle jungle kings is that the one i'm thinking of like with the targets swooping around the back you know so the physical bell the knocker there's a lot to it and team gobble hole There's a lot to it that I love it, so I wanted to support it. But I also think that it's part of the ecosystem. And my goal was to support all of the module. And it had unique challenges. And Cannon Lagoon had unique challenges in that those are non-traditional in the way they play. So I had to adapt some of the design principles to function beyond just the fact that a bat isn't a brick. But that was challenge number one, right? But can you speak to how the game plays differently upon drained? Drained does not have returns directly to the inlanes, as you mentioned. There isn't a ramp state that will bring the ball safely back to a flipper. What were the considerations that you went through and how did you settle upon the finished design for that? Yeah, so I never actually described what the ramp, like I sort of said, you hit the ramp, the bird spawns. Oh, that's true. Yeah. But it's actually a little more. It's actually a lot more complicated than that in what I actually. So let's talk about the choreography for what actually happens. Sure. So you hit the ramp and you get a ramp completed event. And on the vast majority of the modules, this is happening either on a second switch, like it'll hit the first switch and then hit a second switch. or it could be done on a single switch where if a certain amount of time has passed and it hasn't hit the same switch again, it'll trigger the ramp complete event. But the ramp complete event is happening before the ball reaches the wire form to return to the flipper. What the game will actually do is at the point that that ramp complete event happens, it will actually shake two bushes on the playfield, which is to sort of emulate some birds rustling. and it will tell you that the bird is going to spawn out of one of those two locations. And then I use the screen tracking to detect that the ball has passed through the in lane to actually trigger the spawning of the bird so that the bird is still on the screen at the point you make the shot. So there's actually a lot of consideration that goes into hit the ramp and the bird spawns. Now, Drain doesn't have return lanes, doesn't have shots that feed the inlanes. So I'm not going to be able to use that to trigger. And it's not all that off on what to do. So the first thing I had to decide was what shots do I want to trigger birds to spawn? And I thought about setting it to be some arbitrary targets within the back of the playfield, which is certainly a possibility. I thought about having it be the left most and right most stand-up targets which are like the cape shots within drained because I sort of felt those could be appropriate but I wanted to make use of the gobble hole so I made it the gobble hole even though that makes drained the hardest module to play uh birdwatcher on because it's very difficult to spawn additional birds outside of the timer but if you shoot the gobble hole what drained will do is fire the ball out of the rear ejects, it'll bounce around a bunch, and I can't spawn the bird until I have some reasonable assumption that the player is going to be able to hit it sometime soon. I also don't want to just spawn the bird and have it be photographed on the way down as the ball is just randomly happening. I want the player to actually roll over it through skill. And so there is consideration from this perspective on how I do this. Now, it's not super complicated. Like, I end up putting a horizontal detection bar across the entirety of the screen. And after the ball has been ejected, wait till it passes beneath that to trigger the birds, which works out very well. And I suspect similar things could be done on other games that require the ball to pass by the wall before, since there is no mechanism to get the ball over the wall. So you can sort of detect when the ball's on the grid, and this will work reasonably well. So it wasn't a big challenge, but it was a design consideration that was different than other playfields. And Cannon Lagoon has similar challenges, or similar but different challenges. So Cannon Lagoon does have two launchers which feed the flippers. How did you determine which shots? There are five main shots available in Cannon Lagoon, but there are no specific targets. and there's no specific ramps. How did you make the decisions there? So on every one of the shots in, I needed to make a consideration as to what shot goes in and what shot comes out. And I don't even remember the complete mapping off at the top of my head right now. But I sort of wanted interesting patterns. I think I chose the non-in-lane shots first. I started with what I want like I wanted to shoot this and have the ball come out and make like a virtual loop and I started with those before I decided which ones were going to feed the flippers and then added the flippers in afterwards, the in lane feeds afterwards and that was sort of my design principle there but the other like really surprising thing with Cannon Lagoon was how frantic and fast and completely not the flavor I was going for, that game was on my first implementation. And I think that most people may not even realize it, but that game can feed balls incredibly quickly. I think all of the commercial games delay their launches of the balls from when the ball enters the tube, because it can detect, it's before it even hits the drain pan, it's as it's going through the tube, It has hit the two optos and determined that the ball has entered. And it can immediately fire a ball out. And it was so frantic and so on edge playing that game. And there was no rest because all you're doing is you hit it and you're just nonstop hitting into scoops and balls are just firing out. And so much like probably everyone else does, I had to introduce a pretty significant delay to give you a much more mellow feel when entering that game. And it's part of the consideration of making a game and making a commercial game is figuring out exactly how you want the player to feel as they play. And so one of the considerations that was top of your mind, it seems, and please correct me if I'm wrong, is to make a relaxing game that allows you to explore at your leisure a bit with some time pressure. But for the most part, the player is able to make consideration, take their shots and then snap photos of birds and having something just rocket balls at you. I can see that would be a challenge with that ethos in mind. So let's talk about your testing process for the game. You've mentioned that you had some testers and I was fortunate enough to be one of those and to be able to play in the beta test. But what was your testing process like? So a lot of my time was spent just at the computer. Like I would say that, and I would say probably too much, but when I was doing the tutorial, I developed a lot of the tutorial while I was away and didn't have physical access to my game. And because I had finished the tutorial and tested the tutorial, The commercial game itself was sort of in a state based on that code where it kind of worked. But I did as much as I can in the UI, in the simulation environment, because it's sort of time-consuming and difficult to move things onto the game. But as I developed some of these, like my module manager mode, which decides where to launch and makes overrides of various things for game-specific state, you know i sort of felt like i had to test all six modules i didn't have final resistance at that time and so there was very much a okay today's going to be a full module test day and i'm going to load a new version onto the machines and i'm going to play one game or two games on each module turn it off swap the modules move on to the next game you know i didn't put the glass on or anything but plow through six modules and make sure it still works before I give a release to my beta testers or something like that. There's very little risk in the way Birdwatcher does, and without using module-specific features too much, I wasn't too worried about breaking people's machines, but I didn't want crashes to be happening on modules, so there was a lot of running through everything many times. I played Birdwatcher a lot, And I will say that this is against every single thing I ever learned as a professional software developer, where I literally ran our portion of the infrastructure team for our CICD systems within the company. and so very much believe in test-driven development and CICD. And I do none of that because Unity makes it so hard. And the SDK doesn't really abstract things in a way that makes it easier. So I don't have a single test in my code. And so there's just a lot of, well, let's make sure this still works. Let's make sure this still works from that standpoint. After release, I was at a friend's house recently who had some cats And I was able to see the powerful effect this game had on their animals. It's really interesting as cats tend to ignore bird calls and TV programs from my experience. But firing up Bird Watcher, the cats were just wrapped and they came right over to the game to investigate. Have you experienced that yourself or had you heard this previously? I know there's been some chatter about it in the Discord early on after release. But what are your feelings about that? Yeah, so this definitely happened with one of my beta testers. She said the very first time. So there's two things. So one, and I apologize to everyone who had initial versions of Birdwatcher, because I actually play my P3 with headphones plugged into my streaming rig almost exclusively. And so I'm audio balancing using a mixing board. And I had no clue how loud Birdwatcher was. But Birdwatcher was really, people kind of told me it was loud. And I thought, oh, okay, it's a little loud. And they turned down the volume. But it was really loud. And I know that the very first time she loaded it, it was very loud. And I hadn't delayed the bird calls in attract mode at that point. That's one of the things I added later. So immediately it started spawning birds and started making loud bird calls. And she said that her cats just went wild as soon as that happened. It's interesting. I know that we're more of a dog household. And when our dog, when we would watch TV, it was really interesting because I would say only about 10% of shows she would react to a dog barking on. But when she did, it was like she'd start just like barking at the TV in response to the dog. And I would like my wife and I would always turn to each other and like just sort of jokingly say real dog. But there obviously is something in like how the sample rate or the compression or some sort of audio processing on how the recordings are done that makes it not sound like a real bird or real dog to animals. And that certain recordings are capturing something that is more authentic and that animals respond to. Well, it's pretty interesting to see. It was very amusing. The cats were enthralled by the game, as were all the humans who were playing it. So it was very exciting. Ian, I wanted to thank you publicly. You've mentioned that you are an owner of Drained, but you've always been such a huge supporter of mine, and not just with Drained, but with every other game that I've released, and of independent development more generally on the P3. And I wanted to thank you for that. It's such a wonderful thing to feel as an independent developer that you have people in your corner and very much feel that from you. And hopefully you feel the same from me and from others who very much support independent development on the P3 and elsewhere. So to wrap up, Birdwatcher was released on November 15th, 2023, and it's available now for $149 in the Multimorphic store. I'd highly recommend any P3 owner to pick up this game, and it's compatible with every module that's available now. You can play through the complete game start to finish, no matter which module you have installed. And for the latest releases from Ian Herwer Games, please see ianherwergames.com. So, Ian, thanks very much for coming on and for talking about Birdwatcher. Well, thanks for having me, Nick. Well, this has been For Amusement Only. My name again is Nicholas Baldridge. If you would like to reach me, you can contact me at 4amusementonlypodcast at gmail.com or call me on the bingos line. That's 724-BINGOS1, 724-246-4671. Thanks very much for listening, and I'll talk to you next time. you