This topic contains 25 replies, has 5 voices, and was last updated by  LynnInDenver 1 day, 4 hours ago.

Viewing 20 posts - 1 through 20 (of 26 total)
  • Author
    Posts
  • #86515
     LynnInDenver 
    Participant

    I’m more looking for input from the more experienced programmers here. I decided I wanted a table “frame” on which I could actually build a table, without having to worry about setting up the player counting and ball tracking on later. Here’s what I’ve put on the default “template” provided with VPX 10.5:

    Rudimentary Scoring. I know this I really do need to clean up a bit, putting the math part into a more proper subroutine so I just have one call when I add to score. Scoring values are controlled through a set of constants at the top of the script.

    Player Count Tracking, with Freeplay option. Basically, I can add credits, or set to freeplay in the script, and actually run a real game.

    Ball Save and Extra Ball. A timer on the table controls the time of the ball save, and currently I can use the right Magnasave to add extra balls for testing.

    Test Mode. More or less simulates the original template behavior, kicks a ball out, lets you flip, doesn’t track ball or player counts.

    Autoplunge of multiball. Right now, just an added plunger overlaid on the manual plunger, I haven’t figured out how to have manual mechanical control and multiball autofire off one plunger. I’ve also got the left Magnasave set to trigger the autofire plunger for testing.

    I’m curious if there’s any improvements/cleanups I can make to this table framework before I make this my template for building brand new tables off of in the future. Plus, who knows, it might prove useful to others.


    Some users who have liked this topic:

    • avatar
    Attachments:
    #86522
     gtxjoe 
    Participant

    Take a look at JP’s Ghostbuster Slimer table for more ideas.

    The top half of the script is essentially a template with tons of additional support:  Tilt, High Score, Instant Info, Music, Lighting, Flasher effects, Multiball, Bonus scoring, Jackpot, Modes, Wizard Mode, Attract mode

     

    1 user thanked author for this post.
    #86690
     TerryRed 
    Moderator
    MemberContributorModerator

    Look into ScottyWic’s “Orbital Pinball” framework template. I’m not sure if he posted it here yet, but the first version is available.

    1 user thanked author for this post.
    #86713
     LynnInDenver 
    Participant

    gtxjoe: I pulled the attract mode out of that table. Looks fairly cut and dried. I’m not finding much else of use without learning more about someone else’s coding style.

    TerryRed: I was looking for that and don’t see where he might have posted it. Certainly not any of the regular places. Looks like it’s only really available in his first Stranger Things table, so I might just have to message him and see where things are at.

    In other news, I’ve implemented a bonus system (just to have one in place), with multiplier (light the three standup targets to increase) cleaned up the scoring and update mechanisms a bit, added a “reset the lights” between players, and even got an extra ball earner (walk the top rollovers) just because. The one thing I’m actually having trouble on is getting a delay added on the “add the bonus to score” stepping at the end of the ball (like the old Gottlieb Sysy1 machines). I can either add it all in one go, or the resulting timer doesn’t delay start of next ball, which does funky things to the bonus and cuts the ball save short. The new file is attached. It actually feels like it could be a playable table, albeit there’s some really, really challenging things to collect because of the layout…

    • This reply was modified 3 weeks, 1 day ago by  LynnInDenver.
    Attachments:
    #86727
     shiva 
    Participant

    If you like, I can always send you a copy of shivaengine 4 for vpx. It’s unfinished as there were a lot more features and upgrades needed to be added, but it’s fully functioning except for maybe the odd minor bug here and there. It’s mostly engine code and not too much hit code or exclusive code for a single table. It’s a very different structure scriptwise than anything else, but there are several things there that might help you without having to go through tons of table specific coding, it’s mostly engine.

    • This reply was modified 3 weeks, 1 day ago by  shiva.
    #86732
     LynnInDenver 
    Participant

    I’d definitely be interested in taking a look at that, thanks. :yes:

    #86804
     shiva 
    Participant

    If you dont mind, I will send it tomorrow, or as soon as I have the proper internet access to access my website.

    1 user thanked author for this post.
    #86816
     LynnInDenver 
    Participant

    Yeah, that should work fine. I won’t have time to even fiddle with that tonight anyway.

    #86965
     LynnInDenver 
    Participant

    OK, so I’ll admit to being more than a little stumped as to how to use Timers to create a bonus countdown like, say, Gottlieb’s Solar Ride table. So far, all my efforts have resulted in, at best, counting the bonus… but for all intents and purposes it gets 100% added as a lump sum value, after waiting for whatever I set the timer for, no updates to lights or score displays during the individual steps. At worst, it’s still trying to add up the bonus while it loads the next ball, resulting in serious shenanigans with the bonus system, particularly when I’m trying to get through multiple timers. (My tiny epic kingdom for a proper delay, I know it’s a state machine and doesn’t really do those.) The intended operation is like this:

    Take the Bonus Count. Each “level” of the bonus count, count it each time for the multiplier (*beep beep beep beep* for, say, 4X, quarter second between beeps and scores, updates scoreboard). Switch that light off. Move to the next lower level. Wait a half second. Repeat. Once Bonus Count has hit zero, reset back to one, kick fresh ball into shooter lane or end game.

    I’m probably missing something pretty important in order to get this to work correctly.

    Sub UpdateScore
    ScoreText1.Text = Score(1)
    ScoreText2.Text = Score(2)
    ScoreText3.Text = Score(3)
    ScoreText4.Text = Score(4)
    CreditText.Text = Credits
    BallText.Text = CurrentBall
    ExtraBallCountText.Text = ExtraBall
    PlayerCountText.Text = PlayerCount
    If BonusCount => 1 then LM1.state = 1 Else LM1.state = 0: End If
    If BonusCount => 2 then LM2.state = 1 Else LM2.state = 0: End If
    If BonusCount => 3 then LM3.state = 1 Else LM3.state = 0: End If
    If BonusCount => 4 then LM4.state = 1 Else LM4.state = 0: End If
    If BonusCount => 5 then LM5.state = 1 Else LM5.state = 0: End If
    If BonusCount => 6 then LM6.state = 1 Else LM6.state = 0: End If
    If BonusCount => 7 then LM7.state = 1 Else LM7.state = 0: End If
    If BonusCount => 8 then LM8.state = 1 Else LM8.state = 0: End If
    If BonusCount => 9 then LM9.state = 1 Else LM9.state = 0: End If
    If BonusCount => 10 then LM10.state = 1 Else LM10.state = 0: End If
    If BonusCount => 11 then LM11.state = 1 Else LM11.state = 0: End If
    If BonusCount => 12 then LM12.state = 1 Else LM12.state = 0: End If
    If BonusCount => 13 then LM13.state = 1 Else LM13.state = 0: End If
    If BonusCount => 14 then LM14.state = 1 Else LM14.state = 0: End If
    If BonusCount => 15 then LM15.state = 1 Else LM15.state = 0: End If
    If BonusCount => 16 then LM16.state = 1 Else LM16.state = 0: End If
    If L11.state + l12.state + l13.state = 3 then BonusMultiplier = BonusMultiplier + 1:L11.state = 0:L12.state = 0:l13.state = 0:End If
    If BonusMultiplier =>2 then LBonus2.state = 1
    If BonusMultiplier =>3 then LBonus3.state = 1
    If BonusMultiplier =>4 then LBonus4.state = 1
    If BonusMultiplier =>5 then LBonus5.state = 1
    If ExtraBall => 1 then ShootAgainLight.state = 1:End If
    If BallSaveActive = 1 then ShootAgainLight.state = 2:End If
    End Sub

    Sub Drain_Hit()
    PlaySound “drain”,0,1,AudioPan(Drain),0.25,0,0,1,AudioFade(Drain)
    Drain.DestroyBall
    BIP = BIP – 1
    If BIP = 0 then
    If TestMode = False Then
    If BallSaveActive = 0 Then
    Me.TimerInterval=750
    Me.TimerEnabled = True
    End If
    End If
    UpdateScore
    End If
    End Sub

    Sub Drain_Timer()
    For ii = 1 to BonusCount
    For i = 1 to BonusMultiplier
    Me.TimerInterval = 400
    AddScore(ScoreBonus):UpdateScore
    Next
    Me.TimerInterval = 800
    BonusCount = BonusCount – 1:UpdateScore
    Next
    Me.TimerEnabled = False
    Call BonusEnded
    End Sub

    Sub BonusEnded
    If ExtraBall = 0 Then
    ActivePlayer = ActivePlayer + 1
    If ActivePlayer > PlayerCount Then ActivePlayer = 1:CurrentBall = CurrentBall + 1: End If
    If CurrentBall > GameBalls Then Game_Over = True:CurrentBall = 0:PlayerCount = 0:ActivePlayer = 0:FirstSwitchHit = 0:StartAttractMode 1: End If
    If ActivePlayer = 0 Then PlayerActive1.State = 0: PlayerActive2.State = 0: PlayerActive3.State = 0: PlayerActive4.State = 0:End If
    If ActivePlayer = 1 Then PlayerActive1.State = 1: PlayerActive2.State = 0: PlayerActive3.State = 0: PlayerActive4.State = 0:End If
    If ActivePlayer = 2 Then PlayerActive1.State = 0: PlayerActive2.State = 1: PlayerActive3.State = 0: PlayerActive4.State = 0:End If
    If ActivePlayer = 3 Then PlayerActive1.State = 0: PlayerActive2.State = 0: PlayerActive3.State = 1: PlayerActive4.State = 0:End If
    If ActivePlayer = 4 Then PlayerActive1.State = 0: PlayerActive2.State = 0: PlayerActive3.State = 0: PlayerActive4.State = 1:End If
    Else ExtraBall = ExtraBall – 1: BallSaveActive = 0
    End If
    ResetMatrixLights
    BonusCount = 1
    BonusMultiplier = 1
    l6.state = 1
    If Game_Over = False Then
    ‘Plunger.CreateBall
    BallRelease.CreateBall
    BallRelease.Kick 90, 7
    PlaySound SoundFX(“ShooterLaneKickoutt”,DOFContactors), 0,1,AudioPan(BallRelease),0.25,0,0,1,AudioFade(BallRelease)
    BIP = BIP + 1
    If BallSaveActive = 0 then BallSaveTimer.Enabled = True : ShootAgainLight.State = 2:BallSaveActive = 1 else BallSaveActive = 0:ShootAgainLight.state = 0: End If
    End If
    UpdateScore
    End Sub

    Sub AddScore(ScoreValue)
    Score(ActivePlayer) = Score(ActivePlayer) + ScoreValue
    FirstSwitchHit = 1
    UpdateScore
    End Sub

    #86968
     BorgDog 
    Participant
    MemberContributorvip

    sounds like a lot of em tables bonus count is what you are looking for.  check out some of loserman’s em tables to see how he does it, or check out my Gemini table (has my more recent way of doing it that I like better than my older em tables)

    1 user thanked author for this post.
    #86970
     LynnInDenver 
    Participant

    Thanks, Borg, that did the trick! :good: Granted, I just looked at yours and basically rewrote the code to match my own setup, but I’ve now got a fully and correctly functional EM/Early Gottlieb SS style bonus countdown functioning. :yahoo:

    Latest version is now attached.

    The last thing I will probably be adding is going to need to be the tilt functionality.

    Attachments:
    #86976
     shiva 
    Participant

    Here you go. Open to anyone to use if they need it. A project just to see what VPX was about, but decided to stick with FP for my tables. Had to remove a couple things, and did a rough and dirty job of changing the lighting and the glow of the lights as my settings were customized to the table graphic I had. I swapped the pf with my Playboy one.

    This was me just experimenting with things, so it’s not a normal way, but the concepts should be understandable as I tend to do things the exact same way as much as possible. It’s a decent template, pretty feature loaded already, maybe someone can give it some love and finish it off.

    http://shiva.pinballnirvana.com/uploads/vpxTemplate.zip

    #87060
     LynnInDenver 
    Participant

    Thanks for posting it, Shiva. I’ll have to dig into that one as well.

    I might be spending some time cleaning up my existing code before I look at the next “feature” to implement.

    #87225
     LynnInDenver 
    Participant

    So I’ve been a reasonably busy bee. Got a drop reset working that isn’t the “reset the individual five seconds after dropping”, that adds one to the kickback when all three are dropped, then the drops reset.

    Yes, I now have a left lane kickback installed. Default for each ball is kickback is already activated. So the table now has three plungers in it. If I need one for each outlane, I can always duplicate the objects and scripting. I also added some sounds (credited in the script). Rollover stars are now in the left passage, and are activated with the bonus multipliers. And the apron cards (with “for position only” textures) will rotate depending on Free Play and Test Mode (for the moment) being set to true.

    Attachments:
    #87232
     BorgDog 
    Participant
    MemberContributorvip

    just took a quick peak at the frame, seems to be coming along.  I didn’t see anything that jumped out at me as multiball handling?

    also, even though we are just playing in virtual when I make tables, original or recreations, I try to make them so they act like real tables and could be built as real tables.  One of the big parts of that I jokingly call “save the balls!”, and is basically no destroying of balls, no magic holes where it disappears and reappears somewhere else unless that can actually be accomplished in the real world by subways, or whatever.  the first part of that is setting up a trough system in the table and only creating balls at table init.  just a thought.

    #87238
     LynnInDenver 
    Participant

    Yeah, I’ve just been working at getting other things handled. I’m not sure I’m going to go so far (yet) as to set up a proper trough. But I take your point with that, so far I’m working to maintain things within limits of what can be done normally on a real table, even if I’m not actually moving hidden balls under the apron. Although, I’ve got ideas for a future original table with a multiball mode where I’ll want to generate five balls of five different colors (mix of Sentai and Voltron tropes), which might be doable in a real table but would be a colossal, complicated and expensive pain of a trough, subway, vuk and sensor system to actually implement.

    Regarding multiball, I am still using the template “multiball”, although I’ve deliberately limited it to five balls with some extra logic. Partly because the table will crash if it generates a sixth ball, which appears to be related to the ball shadow handling. I may fiddle with that to see if I can squeeze a sixth ball out of it.

    In the next couple of days, I will probably be looking at creating a captive ball assembly somewhere on the table. I might have to move the multiball kicker over and edit the surroundings to make room for it.

    #87354
     LynnInDenver 
    Participant

    OK, got the captive ball installed today (installed in place of the far left bumper), all that was an issue was tweaking position because I should add a “clear the Extra Ball variable” to the game start script. It does work, but it reminds me of my difficulty hitting shots precisely, but I can hit it and it adds an extra ball with every (good) hit. I also fiddled around with decals for lighting inserts (thanks Shiva and scottywic) and meddled a bit in Materials land. I also found I had some bugs in my test mode code, and fixing that I introduced (and fixed) a ball count issue.

    I think I know what my next task should be… and that’s setting up a B2S on my frame.

    Attachments:
    #87361
     shiva 
    Participant

    nice. looks like I have a little time to play the latest version, so see what you have. BTW the engine is part of the shivaEngine series, so there’s a lot of things in there like ball to ball player memory, and also features like Bonus held over and bonus collect in case you decide to do that. It also has a sound system set up for both EM and SS type games, as the engine can be used for pretty much any game from 1960’s EM up to System 11. If you have any problems understanding the code just ask (some things were removed like Multiball to be rewritten, other things like the Musicset feature were just put in roughly and is non functional) It’s still pretty damn powerful, maybe a bit too much, but certainly good enough to learn from and take bits of code as you need it.

    #87363
     LynnInDenver 
    Participant

    I’ll have to tuck into your engine template here sometime this week; various memory functions are something I’ll need to think about in terms of what I’ll need for most tables.

    I also have to think about whether or not I’m going to try to bake in UltraDMD and PUP features, or leave those for when I tackle actual table builds.

    #87404
     shiva 
    Participant

    Yeah good. It always screws up beginning coders, but this system is very simple.Most coders make this far more complicated than is needed, mine just uses light state. It takes a snapshot of which lights are on/off/blinking that you define using Set MemorySlot(x) and has 3 subroutines. MemorySave() takes the snapshot (like at the drain before the bonus countdown starts, MemoryLoad() will reload the lights (like at the start of a new ball) and MemoryReset() clears out all lights for each player. In my template, I just have the center targets done, they will remember the light state from the previous ball. Define each light you want to store the memory like this

     Set MemorySlot(1)=LightCTarget1
    Set MemorySlot(2)=LightCTarget2
    Set MemorySlot(3)=LightCTarget3
    Set MemorySlot(4)=LightCTarget4

    Now all you have to do is add the code for what the lights do depending on their state in the new ball subroutine. (which I never did yet…oops)  I’ve been using this for 16 years, once in it’s pretty much foolproof, hasn’t messed up once.

    Here’s a copy of the complete code

    ' *******************************************************
    ' ***                    Player Memory by shiva                               ***
    ' *******************************************************

    ' here's where you set the lights you want for Memory feature. You can have up to 99 lights, as it's preset
    ' in the engine.. Will Handle both LightStateOn and LightStateFlashing as well.

    Dim slot 'Purely for Looping purposes (unless you like to type a lot...)
    slot=99 'should be the same number as values for KeyMemorySlot and last value in KeyMemory
    'variable to set lights to memory, make sure the number matches with the last number in the Set MemorySlot code
    Dim MemorySlot(99)
    ' variable matched to KeyMemorySlot. First value=amount of players, the second should match KeyMemorySlot
    Dim Memory(4,99)

    ' Save Memory states
    Sub MemorySave()
    dim p
    for p = 1 to Slot
    On Error Resume Next
    Select Case Player
    Case 1
    if MemorySlot(p).State=0 Then Memory(1,(p)) = 0
    if MemorySlot(p).State=1 Then Memory(1,(p)) = 1
    if MemorySlot(p).State=2 Then Memory(1,(p)) = 2
    Case 2
    if MemorySlot(p).State=0 Then Memory(2,(p)) = 0
    if MemorySlot(p).State=1 Then Memory(2,(p)) = 1
    if MemorySlot(p).State=2 Then Memory(2,(p)) = 2
    Case 3
    if MemorySlot(p).State=0 Then Memory(3,(p)) = 0
    if MemorySlot(p).State=1 Then Memory(3,(p)) = 1
    if MemorySlot(p).State=2 Then Memory(3,(p)) = 2
    Case 4
    if MemorySlot(p).State=0 Then Memory(4,(p)) = 0
    if MemorySlot(p).State=1 Then Memory(4,(p)) = 1
    if MemorySlot(p).State=2 Then Memory(4,(p)) = 2
    End Select
    next
    end sub

    ' Load Memory states
    sub MemoryLoad()
    dim p
    for p = 1 to slot
    On Error Resume Next
    Select Case Player
    Case 1
    if Memory(1,(p)) = 0 then MemorySlot(p).State=0:end if
    if Memory(1,(p)) = 1 then MemorySlot(p).State=1:end if
    if Memory(1,(p)) = 2 then MemorySlot(p).State=2:end if
    Case 2
    if Memory(2,(p)) = 0 then MemorySlot(p).State=0:end if
    if Memory(2,(p)) = 1 then MemorySlot(p).State=1:end if
    if Memory(2,(p)) = 2 then MemorySlot(p).State=2:end if
    Case 3
    if Memory(3,(p)) = 0 then MemorySlot(p).State=0:end if
    if Memory(3,(p)) = 1 then MemorySlot(p).State=1:end if
    if Memory(3,(p)) = 2 then MemorySlot(p).State=2:end if
    Case 4
    if Memory(4,(p)) = 0 then MemorySlot(p).State=0:end if
    if Memory(4,(p)) = 1 then MemorySlot(p).State=1:end if
    if Memory(4,(p)) = 2 then MemorySlot(p).State=2:end if
    End Select
    next
    end sub

     

    ' Reset Memory States
    Sub MemoryReset()
    dim p
    On Error Resume Next
    for p=1 to slot:Memory(1,p)=0:Memory(2,p)=0:Memory(3,p)=0:Memory(4,p)=0:next
    End Sub

    Set MemorySlot(1)=LightCTarget1
    Set MemorySlot(2)=LightCTarget2
    Set MemorySlot(3)=LightCTarget3
    Set MemorySlot(4)=LightCTarget4

    ' *** END ***

    • This reply was modified 2 weeks, 2 days ago by  shiva.

    Some users who have liked this topic:

    • avatar
Viewing 20 posts - 1 through 20 (of 26 total)

You must be logged in to reply to this topic.

©2018 VPinBall.com

WP Facebook Auto Publish Powered By : XYZScripts.com

Log in with your credentials

or    

Forgot your details?

Create Account