A new week is kicking off, which hopefully means lots of exciting changes to come for PINBOT 2.0 over the next seven days. I’ve decided to start putting together a small “developer diary” of the progress for people to read and follow along with. Sometimes there will be images or videos to share. While at other times it will just be text. I don’t have any planned format for what I share – only that it will be broken down into the days of the week, where I document progress for each day. Ideally I’d love to be able to put up a post each week, but there will be periods where little to no work on the project is done. This means some posts may span several weeks – I’ll just see how it goes.
First thing to look at today was adding flashers to the lamp shows in both the high score and bonus modes. I’ve opted to go with a simple top to bottom sequence for the high score mode. This repeats every 5 seconds. The bonus mode sequence will work in reverse, with the flashers activating from the bottom of the playfield to the top and sync with the insert light show that plays.
A somewhat boring task today was creating a script that packages together the “pinbot-recoded” folder for deployment to the production machine. Up until now, it’s been a manual process of deleting the old folder from a USB stick and copying the required folders across. It would be so much easier to just run a single command line (like “packagepb” for example), which did everything and removed all manual steps. I’m often using either LUA or PHP for my scripting since those are what I’m most familiar with. I decided to go with PHP in this case. The script didn’t take long to create and has a reasonable amount of logging and error handling for when things fail. I expect this will evolve as the project goes on.
After catching up with a friend last week, I’ve been toying with the idea of including a “Bride of PINBOT” mode in the game. I’m not sure if this will be one of the planet modes, a stand alone mode or even a secret mode. I like the idea of secret modes and features for players to find. I can’t call it a retro mode since BoP came out after PINBOT. It’s more like a “Next Gen” mode – but that name doesn’t have the same appeal to it. Anyway, I came up with some ideas on how this small mode would play out and made some initial design notes. It will basically include references to BoP with some sounds, music and a goal. I’ll look to develop the design notes further over the coming weeks. This also has me interested in adding a small “Jackbot” mode too.
From testing the game today, I managed to put up a score of over 18 million points. My previous best was just over 5 million. A lot of the points came from maxing out my program upgrades. At present there isn’t a whole lot else to do in the game (besides skill shot, hurry up modes, super pops, and eject boosters), so it makes sense that I’m focusing on upgrading the programs while playing. Once I add playable planet modes, the focus of play will shift more to those. But I think I’ll drop the points awarded for some aspects around program upgrading as it currently feels too high. I’ve made a note to look at this later in the week. I’m expecting that point balancing is something that will continue on for the entire project.
The final task for today was syncing up the flashing inserts on the chest matrix that represent the upgrade progress on the 5 programs. From the first day the upgrades were added to the game, the 5 active inserts would flash slightly out of sync due to small gaps in milliseconds when each light show was instructed to start. MPF has a “sync_ms” setting as part of the “show_player” that’s designed to help sync up different shows within a mode (or even across modes). The value for “sync_ms” should be 1 full iteration of the show. So in this case, the inserts remain lit for 300ms and then off for 100ms – which makes 400ms. This setting was applied to each show across the 5 programs and now the inserts blink together in sync.
A small task to start today off – adding flashers to the super skill shot success light show. Actually, there are no other lights currently animating as part of a successful skill shot. I’d like to animate the inserts for this and have made a note to add something. Maybe later this week. For now though, the flashers animate top to bottom. PINBOT has several cases where flashers on the playfield are combined with the topper. It also has some cases where 2 flashers on the playfield are linked too. That means I can’t just activate one of these flashers – they are all linked to the same coil. This limits the animation you can perform with them sadly. For example, all four flashers marked here will activate when coil 05-C is pulsed. Also, this is the outside worlds first glimpse of a screen from the service menu!
One issue I keep running into with the flashers is they can lock on. This is due to how the System 11 set up works, where many of the flashers are on the same transistor as a coil. For example, the ramp release coil is on the A side, while the lower flashers are on the C side. There’s an A/C relay that toggles between the active side, giving preference to the A side where the important coils are. If both attempt to fire at once, this can cause the flashers to remain locked on. I think this is something that could be fixed in the MPF framework, but is currently beyond me to look at. I encountered the issue again today during the bonus mode where the drop target bank reset coil was being triggered at the same time as one of the flashers during the bonus light show. This needed some tweaking to ensure the coil pulses don’t overlap.
During the bonus mode, the group of flashers below the large solar insert activate when awarding the solar pops component of the bonus. They were activating 25% faster than other lights, so I’ve slowed them down to match all other lights during the bonus mode. It’s the sort of thing no one would probably notice except for me.
When the ball is released from the single eject (located to the left of the visor), it had a large time out of 10 seconds configured. This value tells MPF to wait for a period of time for the ball to hit a switch (after ejecting) before it considers the eject action a failure and attempts to kick the ball out again. It is possible during play to hit the ball straight back into the saucer with no playfield switches being triggered. It’s not common, but it does happen. This results in the game sitting still until the 10 seconds are up and the saucer attempts to eject again. This value needs to be high enough to allow for cases where a player doesn’t activate a target switch straight away, but not too long that the player is kept waiting if they hit the ball straight back in. I decided to lower this timeout to 6 seconds and see how it goes. By my calculation, in the worst case scenario, the player should only be left waiting around 3 seconds (instead of 7) if they shoot the ball straight back in.
Something exciting I started today is a new mode which I think will be the first planet mode. It’s called virus core and essentially will turn the 5×5 lamp matrix into a space invaders type mode. Where lit inserts will advance towards the player and they have to hit the lit targets to destroy the infections. I’m going to dive into the python level a bit with this mode too, which I think will be a good exercise in learning how to move some of the YAML complexity when creating a mode into simpler python code. I’m expecting this mode will be my primary focus for the next week or so as it evolves.
I finally published the latest blog post for the PINBOT 2.0 project today. It’s been sitting half complete for months, so glad to finally get it out there.
An interesting stat from my code repository today shows there have been 35 commits so far for the month of November. This consists of many tweaks, bug fixes, improvements and documentation changes. In October there were 49 commits and September had 25. So it’s looking like my activity on the project is building, which is good to see.
I’ve been toying with the idea of having a mystery feature in the game for awhile now. Originally I had planned to have it as one of the 5 upgrade programs the player shoots for on the chest matrix. But I felt it was less important than the other upgrades that now reside there. PINBOT has 3 “10 point” switches spread across the playfield which I’m now considering using as a way to activate mystery. There’s one at the lower exit of the pop bumpers, another on the left of the single eject shot and the last one is just below the drop targets. These switches don’t have any inserts assigned to them, but I’m thinking I could repurpose them for a mystery feature. For example, hit all 3 to enable mystery at the single eject saucer. For now, I’ve set up a new mode folder and skeleton config in the project which I’ll play with when I want a break from other features. The location of the 3 switches are marked here:
I’m thinking about the possibility of using the lift ramp as something of a soft lock at certain points of the game. There is a target right at the back under the ramp which could have multiple uses. It has 2 inserts assigned and is already used to score the solar hurry up jackpot and energy value hurry up jackpot. I’m considering using it to also lock a ball up (by lowering the ramp). This needs some more thought.
I started putting together a list of animation frames for the chest matrix. Some will be used while others will never make it into a light show file. I think it’s a good way to record the animation ideas for future reference. The “WELL DONE” frames are currently used on the high score entry mode. They smoothly scroll from left to right (instead of just flashing up each individual frame).
No time spent today on the new virus core mode as I had hoped. Instead I wanted to try and solve an issue in the service menu. For now you can use one of the buttons on the service panel inside the coin door as “enter” or “select” when navigating the service menu. I want have this ability with the credit button on the front of the cabinet. The problem is though MPF will start a new game when the credit button is pressed. I had a few attempts at trying to override this today, even heading down into the python layer but without any success.
An interesting stat for today is the current uncompressed package size for the game is 61MB. Of that, 58.3MB is music and SFX.
Kicking off Thursday with a bang! I finally ordered my own P-ROC board from Multimorphic!! The one I’ve been using has been on loan from a mate and has really helped me get this project going. I’m happy with the progress I’ve made and convinced it’s something I’ll be working on for some time to come. I also view this project as a lead up to making my own game from scratch, which will be built around the P-ROC platform. So ordering one now makes sense. I’m looking forward to receiving it!
Earlier in the week I noted that scoring on the upgrade programs was a little too high, so I’ve halved the points. You can think of these upgrades as “supers”, where they boost the value on other features of the game. They are intended to help the player boost scoring opportunities in different areas of the game and not be a primary point scoring feature themselves.
Back onto that service menu issue from yesterday, with some extra info about how you use the service menu. PINBOT has 3 buttons inside the coin door “Advance”, “Manual/Auto” and “Highscore Reset”. You can access the service menu in PINBOT 2.0 pressing the “Advance” button. This same button can also be used to select options from within the service menu. The “Highscore reset” button is used to exit out of the current sub menu or exit the service menu if you’re at the root level. The “Manual/Auto” button isn’t much use to me as it’s a state button that’s either pressed in or out. You use the flipper buttons to cycle left and right through the service menu options (thanks to the 2 AUX flipper switches I installed into unused switch matrix slots). Now to get that credit button working in the service menu. It feels far more natural to press the credit button to select than have to reach down to the coin door. There is a problem however (isn’t there always?). By default, MPF will see the credit button press as a request to start the game. Under the hood, MPF sends out a boolean event “request_to_start_game”. Because this is a boolean event, if any event handler listening for this event returns false, the request will be denied. At the YAML configuration level, there’s no way to return false for an event. So the solution is to create a small python script for the Service Menu mode that handles this. I can now use the credit button as select while navigating the service menu. It ended up being a simple issue to solve and a nice little intro to working at the python level in MPF.
The time I spent making the packager script on Monday is already paying off. With lots a small tweaks to things over the last few days, it’s really simplified the process of getting a new build ready. I’m annoyed I didn’t set aside the time to create it weeks ago.
A little bit of bug fixing today. I found the service menu change I added yesterday for the credit button wasn’t quite right. I was adding an event handler in the mode_init() function when it should have been in the mode_start() function. This lead to a few unintended side effects. Thankfully it was quite straight forward to fix.
Second bug today came from play testing. When you complete an upgrade, you’re awarded points (50,000 for levels 2 to 4 and 125,000 for level 5). This value is then multiplied by an upgrade boost which should only reach 4x but was allowed to reach 5x. Another simple fix.
Not much else to report from today other than playing the game.
I set aside time today to improve the out lane ball save feature. In it’s current state, you can enable both left and right “extra ball” out lane inserts by collecting the “lite extra ball” award from the single eject saucer. This would then activate a ball save if the player was to drain via either out lane. It was also designed to only be active on the current ball, meaning if you drained via the center, then it would be lost for the next ball. This feature was updated today to only activate 1 of the out lane extra ball inserts. If you collect “lite extra ball” from the single eject a second time, this can stack and you can once again have both extra ball inserts lit. When the player has only 1 insert lit, the sling shots and pop bumpers will toggle which out lane is lit. The player can also toggle the lit insert between the left and right out lanes using the flipper buttons. The ball save now persists between balls too. So I’ve taken a little bit away from the player by only activating 1 insert at first. But if the player is good enough they can stack two. In return, I’ve now given the player the ability to persist the feature between balls which makes it more useful. Having the lit insert toggle based on pop bumpers, sling shots and flippers buttons also makes it more exciting to use.
The drop targets currently serve two purposes. The first is to collect the letters of ENERGY to activate the Energy Value Hurry Up mode. To collect a letter, the player simply needs to complete the drop target bank. The second purpose is to activate planet modes. This has a timer however (similar to the original PINBOT), so the player must drop all 3 targets within 14 seconds to open up the next planet mode. The round insert in front of the drop targets will flash during this timer. It will flash slowly for the first 7 seconds and then fast for the final 7 seconds. Today I added new sound effects for both of these timers to help convey the urgency to the player.
During some play testing in the morning, I found a bug with the out lane ball save updates I implemented yesterday. In a certain scenario it was possible to have both outlane saves enable, but one would fail if activated. This turned out to be a simple condition check I had wrong, so was fixed easily.
A friend of mine dropped by for an afternoon catch up and we put quite a few games into PINBOT 2.0. This was his second session on the game and some excellent feedback was obtained. Some new ideas, improvement suggestions and sadly a few bugs to sort out. The perfect lead into a new week!