All In One Example Table - FizX, FLEEP, Ball Rolling, PUP SSF, DOF - Easy to add!

@TerryRed
I successfully applied your process to a "new table " and it worked very well !
Thanks !

A couple of minor suggestions and comments:
1. I noticed the Passive Ring Ornament Models that are on the demo table are not in the Models folder provided
2.It may be helpful to have the PinMechSounds in subfolders of 30 sounds, to make it easy just to copy and paste the entire contents of each folder
in one group. I found it hard copying 30 at time and remembering where I left off in the large list of sounds
3. Having a text file with the code to copy and paste would be easier than grabbing the code block out of the script.
4.copy and pasting the slingshot diverters from the demo to my table worked well...as it is the pre-existing slingshot rubber that generates the hit event in the code, it took me a while to realize the new diverters had to be recessed slightly so as to not block the slingshot rubbers.

1. Yes they are there. They are PEG models, not ornaments. They are called BumperSkirt, and they are located in the FizX Models / Bumpers folder.
2. better people know about and get used to this FP limitation / bug now at the start of their FP table editing journey. They'll most likely run into it again. :)
3. This is actually not a good thing to do, because copying the code to a text file messes up all the nice / tidy / easy to read and follow formatting of all the tale code I made. When it gets copied back from a text file to a table script again... then it doesn't look the same anymore. This happens everytime I have to copy back from any updates JLou has in a vbs text file as well :)
4. yes... all part of adding FizX to a table. (i noted this tutorial isn't going through every detail of adding FizX and all their settings). That's why I say, follow what the example table does. Not every table will have the same slingshot size / positions. When a more detailed guide by JLou is made about FizX specifically, I would link to that.

I'm actually going to do a quick video example of adding this to a table, so people can see for themselves... and I'll explain a few things as I go.
 
Last edited:
1. Yes they are there. They are PEG models, not ornaments. They are called BumperSkirt, and they are located in the FizX Models / Bumpers folder.
ok I must have looked in wrong folder
2. better people know about and get used to this FP limitation / bug now at the start of their FP table editing journey. They'll most likely run into it again. :)
Ok , just a suggestion
3. This is actually not a good thing to do, because copying the code to a text file messes up all the nice / tidy / easy to read and follow formatting of all the tale code I made. When it gets copied back from a text file to a table script again... then it doesn't look the same anymore. This happens everytime I have to copy back from any updates JLou has in a vbs text file as well :)
I just tested it on a "New table" and copy and pasting the enclosed text file below from "notepad" looks perfect.
Control - A to select all
Control - C to copy
go to script
Control - V done

I do this all the time when I am just working on code , I will upload the text file to drop box as it doesn't take as long as uploading the whole table.



4. yes... all part of adding FizX to a table. (i noted this tutorial isn't going through every detail of adding FizX and all their settings). That's why I say, follow what the example table does. Not every table will have the same slingshot size / positions. When a more detailed guide by JLou is made about FizX specifically, I would link to that.
perfect !
I'm actually going to do a quick video example of adding this to a table, so people can see for themselves... and I'll explain a few things as I go.
 
@TerryRed , @Gimli passive bumper ring model for FizX not exist. i didn't make it. Is it really needed?

I will make some tutorial details for FizX in editor to complete what Terry already make. After holidays 😉.

If anyone need more models, not a problem. You can ask it on Request section of FizX subforum 😉
 
@Gimli

2. OK... I folded on this one... :)

1672349169235.png


3. Including a separate text file just makes things more messy. I want "all" code to be in the "table" as a copy and paste example, and I will only be updating the table itself... no separate text files! That's not part of how this tutorial was intended to be used. I'm not budging on this one. So please don't post additional text files that will be quickly out of date... as I may make regular changes to the code as time goes on. (I've already done many little changes over the last two days). Again, please don't post anything like that here (you can always post ideas in a PM). I want this topic and tutorial to be consistent with what I am posting, and I don't want others getting confused as to what they should or shouldn't be using.
 
@TerryRed , @Gimli passive bumper ring model for FizX not exist. i didn't make it. Is it really needed?

I will make some tutorial details for FizX in editor to complete what Terry already make. After holidays 😉.

If anyone need more models, not a problem. You can ask it on Request section of FizX subforum 😉

I think by passive bumper ring... it was the Bumper Skirt that he was referring to (as was used in the example table).
 
@Gimli

2. OK... I folded on this one... :)

View attachment 35280
nice !
3. Including a separate text file just makes things more messy. I want "all" code to be in the "table" as a copy and paste example, and I will only be updating the table itself... no separate text files! That's not part of how this tutorial was intended to be used. I'm not budging on this one. So please don't post additional text files that will be quickly out of date... as I may make regular changes to the code as time goes on. (I've already done many little changes over the last two days). Again, please don't post anything like that here (you can always post ideas in a PM). I want this topic and tutorial to be consistent with what I am posting, and I don't want others getting confused as to what they should or shouldn't be using.
Your call, again just a suggestion.
I removed the text file example from above.
You have to scan down almost 3000 lines of code to find the "COPY ALL CODE TO ANOTHER TABLE - END HERE!"
It works but is cumbersome.

Did you try to copy and paste the text file though ? And did it look distorted ? I think it may be distorted going back and forth between VBS files but that is different.

Hopefully people will catch on to this and we all have our short cuts and ways of doing things.
 
Last edited:
nice !

Your call, again just a suggestion.
You have to scan down almost 3000 lines of code to find the "COPY ALL CODE TO ANOTHER TABLE - END HERE!"

Did you try to copy and paste the text file though ? And did it look distorted ?

I don't want to use "any" separate text files for code for any reason. Table script only. That's the only thing I will update / include / upload. That will not change for what I'm making / posting here. I'm very specific with what I do, and why I do it.

I've already spent WAY more time on this than I wanted to.
 
I don't want to use "any" separate text files for code for any reason. Table script only. That's the only thing I will update / include / upload. That will not change for what I'm making / posting here. I'm very specific with what I do, and why I do it.

I've already spent WAY more time on this than I wanted to.
I am just giving feedback but I will step back now
Thanks again for doing this for the community
 
I am just giving feedback but I will step back now
Thanks again for doing this for the community

Feedback is always appreciated. I just don't want this topic flooded with back and forths about this stuff (which is better in a PM), when I was literally ready to move on from this Example table. Everyone has their own preferred way of doing things, and I learned long ago, I can't please everyone. :)

I've always been very particular about not using / including separate files for code (since day one when talking about FizX, just ask JLou)... and when creating examples / tutorials like this... I want only "one" consistent source to be referenced / updated / uploaded / downloaded. It's easy to lose track or get confused. It's very easy to copy and paste from script to script. Holding the shift key and pressing pagedown or pageup works really well. I think everyone who works / mods tables can handle that however they want to do it. :)

I just want to get back to Silent Hill... and there is lots to be done on many other table updates before that... way beyond this example table. I'll update this topic in small bits here and there as new things come up. It's a constant WIP.

Stay tuned for my video later. It will help alot I think.
 
Uploaded new zip file with Required Fleep Sounds separated into folders with max 30 files in each folder. Makes it easier to Import them (as FP can only around import 30 files at a time).

Thanks @Gimli for the suggestion.

1672355094005.png
 
3 hours 45 mins.... probably the longest video I've recorded....

Yup... a non-stop unedited complete start to finish of updating probably one of the "oldest" FP tables (the OG) for "everything" (FizX, FLEEP, DOF, PUP SSF, Ball Rolling, etc) using this AIO Example table. I went in knowing nothing about the making of the table (but had an idea since I've done a lot of work on the mod of this table).

The only thing I didn't do were "all" the rubbers, and adding drop target walls (as that would have taken much longer). Adding the essentials and getting it working is quick and easy.... its going through adding the rest of the things specific to the table (and also for every PinMechSound event) that takes a long time. A bit of testing / trouble shooting along the way, etc. :)

That said... this video includes going through "everything". Stuff that I would normally take up to a few nights to get done in the past... I got done in over 3 hours... which is CRAZY!

I'm shocked at the before and after of how the table plays and sounds... what a difference.

I'll have chapters for each section of the tutorial and update process.... so anyone can dive into specific spots as they want.

The video is like 55 GB in 4K.... so it will take a long while to upload. :)
 
@TerryRed , just a question, how you get the ball hit coordonate when ball hit something for autogenerated hit sound?

Also, i see one line wich is in "double" that you can delete. Just before the " Sub Generic_Prehit(FizX) " , you have two line:

Code:
xBAM.Physics.AllObjectsHasGenericPreHit = False 'False by default. "True" is too huge for CPU. Need to be used with GetObjectsInfoRange from "Rav Helper Function V2"
xBAM.Physics.GenericHitMinNormalSpeed = 100 'Minimal Hit Speed along the Normal of object to enable Generic PreHit

You can delete the seconde line. It's for the Generic_Hit, and she's already just before the Generic_Hit sub. Be reassured, this "double" line not affected the game.

1672397681332.png
 
@TerryRed , just a question, how you get the ball hit coordonate when ball hit something for autogenerated hit sound?

Also, i see one line wich is in "double" that you can delete. Just before the " Sub Generic_Prehit(FizX) " , you have two line:

Code:
xBAM.Physics.AllObjectsHasGenericPreHit = False 'False by default. "True" is too huge for CPU. Need to be used with GetObjectsInfoRange from "Rav Helper Function V2"
xBAM.Physics.GenericHitMinNormalSpeed = 100 'Minimal Hit Speed along the Normal of object to enable Generic PreHit

You can delete the seconde line. It's for the Generic_Hit, and she's already just before the Generic_Hit sub. Be reassured, this "double" line not affected the game.

View attachment 35302

Got it.... will remove that duplicate line.

In Sub PinMechSound, whatever dtype is being used lets me know it came from an autogenerated hit sound from FizX.

PUPSoundX and PUPSoundY, are then calculated using the Ball position (and translated to pup's x/y).


1672409576281.png
 
Last edited:
Uploaded new Example Table file zip that removed the duplicate line as per JLou's recommendation. (use link in the tutorial)
 
Hi @xenonph , can you move this topic to the "Help Center" subforum please? :


Greating,
JLou
 
In Sub PinMechSound, whatever dtype is being used lets me know it came from an autogenerated hit sound from FizX.

PUPSoundX and PUPSoundY, are then calculated using the Ball position (and translated to pup's x/y).
Got it too ;)
 
Raaaaah!!! Sorry @TerryRed , i find another mistake on flipper sub.

it's about Flipper bouncing. On all sub, there is a condition that refer to LeftFlipper for all flipper... Instead of refer to their own.
My mistake, sorry sorry sorry sorry again. 😔
I hope it's the last mistake i find... ( Before, it was @AnonTet who find all those mistake 😅 , i feel alone without him )

It should rarely negatively affect the game but here the updated code need to C&P:

Code:
' ==============================================================================================================
' ============================================ PREHIT CODES  ===================================================

''''''''''''''''''''''''''''''''''''''''''''Left Flipper Prehit Code'''''''''''''''''''''''''''''''''''''''

Sub LeftFlipper_prehit()
OnPreHitFlipperSettings(LeftFlipperExt)

'Local Variable to have less time consuming.
    BallSpeed = Clng(xBAM.Ball.Speed)
    LFBallVSpeed = Clng(LeftFlipperExt.BallVSpeed)
    LFContactPoint = Round(LeftFlipperExt.ContactPoint,2)
    LFAngleDiff = Round(LeftFlipperExt.angleDiff,2)

'Bouncing / KineticSensivity / LiveCatch Code
    If LFAngleDiff  > ( SwingAngle + ( LiveCatchDifficulty / 50 ) ) then LeftFlipperExt.SetMaterial 0, 1, FlipperStaticFriction, FlipperKineticFriction : End If
    If ( LFAngleDiff => SwingAngle - 0.05 and LFAngleDiff =< ( SwingAngle + ( LiveCatchDifficulty / 50 ) ) ) or LeftFlipperExt.IsSolenoidOn = False then
        If LFBallVSpeed <= ( BallKineticSensivity * 10 ) Then FlipperElasticCoef = 1.1 : End If
        If LFBallVSpeed > ( BallKineticSensivity * 10 ) and LFBallVSpeed <= BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - ( FlipperBouncingFallOff * ( LFBallVSpeed / BouncingFallOffThreshold ) ) ) : End If
        If LFBallVSpeed > ( BallKineticSensivity * 10 ) and LFBallVSpeed > BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - FlipperBouncingFallOff ) : End If
        LeftFlipperExt.SetMaterial FlipperElasticCoef, 1, FlipperStaticFriction, FlipperKineticFriction
        If BallSpeed < 2 Then Exit Sub
    End If

'Anti ball passtrhough over Flipper Drop Catch + Shake Effect. ( Avoid FP Engine Issue )
    If LFContactPoint > 0 and LeftFlipperExt.IsSolenoidOn = False and LFAngleDiff < 5 and LeftFlipperExt.Hit = True and LFBallVSpeed > 200 then
        LeftFlipper.SolenoidOn
        LeftFlipper.SolenoidOff
    End If
    
'Code for Power Ramp Up and EOS
    LFRampUpOmega = CLng( ( ( ( 100^RampUpLinearity / CoilRampUp^RampUpLinearity ) * LFAngleDiff^RampUpLinearity ) / 100^RampUpLinearity ) * LFOmega ) + ( ( ( LFOmega / 100 ) * CoilRampStartPower ) - ( ( ( LFOmega / 100 ) * CoilRampStartPower ) * ( LFAngleDiff^RampUpLinearity / CoilRampUp^RampUpLinearity ) ) )
    LFOmega = Clng( BaseOmega - (LFContactPoint * ((BaseOmega - TipOmega)/1.2)))
    
    If LFContactPoint > 0 and LFAngleDiff <= CoilRampUp and LeftFlipperExt.Hit = True then LeftFlipperExt.Omega = LFRampUpOmega Else LeftFlipperExt.Omega = LFOmega : End If
    If LFContactPoint > 0 and LFAngleDiff < SwingAngle - EOSAngle and LFAngleDiff > CoilRampUp then LeftFlipperExt.Omega = LFOmega : End If   
    If LFContactPoint > 0 and LFAngleDiff => SwingAngle - EOSAngle then LeftFlipperExt.Omega = LFOmega * EOSTorque : End If

'Code to apply Velocity correction when flipper "On"
    LFMoveFriction = FlipperKineticFriction - (( LFContactPoint * FlipperKineticFriction ) * RollingEffect )
    If LeftFlipperExt.IsSolenoidOn = True and LFAngleDiff < SwingAngle - 0.05 and LFContactPoint > 0 then 'and LFContactPoint < 1.2 then
        LeftFlipperExt.SetMaterial 0, 1, FlipperStaticFriction, LFMoveFriction
        xBAM.ball.SetOmega -0.1,-0.1,-0.1
    End If
    
'Ball Spinning stop on hit
    If OverspinDeleter = 1 and LeftFlipperExt.Hit and LFContactPoint < 1 and LeftFlipperExt.IsSolenoidOn = True and LFBallVSpeed > 50 and LFAngleDiff = SwingAngle then
        xBAM.ball.SetOmega -0.1,-0.1,-0.1
        LeftFlipperExt.SetMaterial FlipperElasticCoef, 1, FlipperStaticFriction, LFMoveFriction
    End If

'AddDebugText "Hit" & LeftFlipperExt.Hit
'AddDebugText "ContactPointL" & LFContactPoint
'AddDebugText "ANGLER" & LeftFlipperExt.AngleDiff
'AddDebugText "LFBallVSpeed" & LFBallVSpeed
'AddDebugText "RampUpOmega" & LFRampUpOmega
'AddDebugText "Omega" & LeftFlipperExt.Omega
'AddDebugText "BallSpeed" & xBAM.Ball.Speed

End Sub

''''''''''''''''''''''''''''''''''''''''''''Left Flipper 2 Prehit Code'''''''''''''''''''''''''''''''''''''''

Sub LeftFlipper2_prehit()
OnPreHitFlipperSettings(LeftFlipper2Ext)

'Local Variable to have less time consuming.
    BallSpeed = Clng(xBAM.Ball.Speed)
    LF2BallVSpeed = Clng(LeftFlipper2Ext.BallVSpeed)
    LF2ContactPoint = Round(LeftFlipper2Ext.ContactPoint,2)
    LF2AngleDiff = Round(LeftFlipper2Ext.angleDiff,2)
    
'Bouncing / KineticSensivity / LiveCatch Code
    If LF2AngleDiff  > ( SwingAngleLF2 + ( LiveCatchDifficulty / 50 ) ) then LeftFlipper2Ext.SetMaterial 0, 1, LF2StaticFriction, LF2KineticFriction : End If
    If ( LF2AngleDiff => SwingAngleLF2 - 0.05 and LF2AngleDiff =< ( SwingAngleLF2 + ( LiveCatchDifficulty / 50 ) ) ) or LeftFlipper2Ext.IsSolenoidOn = False then
        If LF2BallVSpeed <= ( BallKineticSensivity * 10 ) Then FlipperElasticCoef = 1.1 : End If
        If LF2BallVSpeed > ( BallKineticSensivity * 10 ) and LF2BallVSpeed <= BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - ( FlipperBouncingFallOff * ( LF2BallVSpeed / BouncingFallOffThreshold ) ) ) : End If
        If LF2BallVSpeed > ( BallKineticSensivity * 10 ) and LF2BallVSpeed > BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - FlipperBouncingFallOff ) : End If
        LeftFlipper2Ext.SetMaterial FlipperElasticCoef, 1, LF2StaticFriction, LF2KineticFriction
        If BallSpeed < 2 Then Exit Sub
    End If

'Anti ball passtrhough over Flipper Drop Catch + Shake Effect. ( Avoid FP Engine Issue )
    If LF2ContactPoint > 0 and LeftFlipper2Ext.IsSolenoidOn = False and LF2AngleDiff < 5 and LeftFlipper2Ext.Hit = True and LF2BallVSpeed > 200 then
        LeftFlipper2.SolenoidOn
        LeftFlipper2.SolenoidOff
    End If

'Code for "Anti Backside shoot". This is to prevent ball kicking by the backside of flipper like a shoot, mainly to prevent ball drain from upper flipper with huge velocity
    If LF2ContactPoint = 0 and LeftFlipper2Ext.IsSolenoidOn = False and LF2AngleDiff < SwingAngleLF2 - 1 and BallSpeed > 20 then
        LeftFlipper2.SolenoidOn                                                                                                                                       
        LeftFlipper2.SolenoidOff
    End If

'Code for Power Ramp Up and EOS
    LF2RampUpOmega = ( ( ( ( 100^RampUpLinearity / CoilRampUp^RampUpLinearity ) * LF2AngleDiff^RampUpLinearity ) / 100^RampUpLinearity ) * LF2Omega ) + ( ( ( LF2Omega / 100 ) * CoilRampStartPower ) - ( ( ( LF2Omega / 100 ) * CoilRampStartPower ) * ( LF2AngleDiff^RampUpLinearity / CoilRampUp^RampUpLinearity ) ) )
    LF2Omega = ( BaseOmega - (LF2ContactPoint * ((BaseOmega - TipOmega)/1.2)))
    
    If LF2ContactPoint > 0 and LF2AngleDiff <= CoilRampUp and LeftFlipper2Ext.Hit = True then LeftFlipper2Ext.Omega = LF2RampUpOmega Else LeftFlipper2Ext.Omega = LF2Omega : End If
    If LF2ContactPoint > 0 and LF2AngleDiff < SwingAngleLF2 - EOSAngle and LF2AngleDiff > CoilRampUp then LeftFlipper2Ext.Omega = LF2Omega : End If
    If LF2ContactPoint > 0 and LF2AngleDiff => SwingAngleLF2 - EOSAngle then LeftFlipper2Ext.Omega = LF2Omega * EOSTorque : End If

'Code to apply Velocity correction when flipper "On"
    LF2MoveFriction = LF2KineticFriction - (( LF2ContactPoint * LF2KineticFriction ) * RollingEffectLF2 )
    If LeftFlipper2Ext.IsSolenoidOn = True and LF2AngleDiff < SwingAngleLF2 - 0.05 and LF2ContactPoint > 0 then' and LF2ContactPoint < 1.2 then
        LeftFlipper2Ext.SetMaterial 0, 1, LF2StaticFriction, LF2MoveFriction
        xBAM.ball.SetOmega -0.1,-0.1,-0.1
    End If
    
'Ball Spinning stop on hit
    If OverspinDeleter = 1 and LeftFlipper2Ext.Hit and LF2ContactPoint < 1 and LeftFlipper2Ext.IsSolenoidOn = True and LF2BallVSpeed > 50 then
        xBAM.ball.SetOmega -0.1,-0.1,-0.1
        LeftFlipper2Ext.SetMaterial FlipperElasticCoef, 1, LF2StaticFriction, LF2MoveFriction
    End If   

End Sub

''''''''''''''''''''''''''''''''''''''''''''Left Flipper 3 Prehit Code'''''''''''''''''''''''''''''''''''''''

Sub LeftFlipper3_prehit()
OnPreHitFlipperSettings(LeftFlipper3Ext)

'Local Variable to have less time consuming.
    BallSpeed = Clng(xBAM.Ball.Speed)
    LF3BallVSpeed = Clng(LeftFlipper3Ext.BallVSpeed)
    LF3ContactPoint = Round(LeftFlipper3Ext.ContactPoint,2)
    LF3AngleDiff = Round(LeftFlipper3Ext.angleDiff,2)
    
'Bouncing / KineticSensivity / LiveCatch Code
    If LF3AngleDiff  > ( SwingAngleLF3 + ( LiveCatchDifficulty / 50 ) ) then LeftFlipper3Ext.SetMaterial 0, 1, LF3StaticFriction, LF3KineticFriction : End If
    If ( LF3AngleDiff => SwingAngleLF3 - 0.05 and LF3AngleDiff =< ( SwingAngleLF3 + ( LiveCatchDifficulty / 50 ) ) ) or LeftFlipper3Ext.IsSolenoidOn = False then
        If LF3BallVSpeed <= ( BallKineticSensivity * 10 ) Then FlipperElasticCoef = 1.1 : End If
        If LF3BallVSpeed > ( BallKineticSensivity * 10 ) and LF3BallVSpeed <= BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - ( FlipperBouncingFallOff * ( LF3BallVSpeed / BouncingFallOffThreshold ) ) ) : End If
        If LF3BallVSpeed > ( BallKineticSensivity * 10 ) and LF3BallVSpeed > BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - FlipperBouncingFallOff ) : End If
        LeftFlipper3Ext.SetMaterial FlipperElasticCoef, 1, LF3StaticFriction, LF3KineticFriction
        If BallSpeed < 2 Then Exit Sub
    End If

'Anti ball passtrhough over Flipper Drop Catch + Shake Effect. ( Avoid FP Engine Issue )
    If LF3ContactPoint > 0 and LeftFlipper3Ext.IsSolenoidOn = False and LF3AngleDiff < 5 and LeftFlipper3Ext.Hit = True and LF3BallVSpeed > 200 then
        LeftFlipper3.SolenoidOn
        LeftFlipper3.SolenoidOff
    End If

'Code for "Anti Backside shoot". This is to prevent ball kicking by the backside of flipper like a shoot, mainly to prevent ball drain from upper flipper with huge velocity
    If LF3ContactPoint = 0 and LeftFlipper3Ext.IsSolenoidOn = False and LF3AngleDiff < SwingAngleLF3 - 1 and BallSpeed > 20 then
        LeftFlipper3.SolenoidOn                                                                                                                                       
        LeftFlipper3.SolenoidOff
    End If

'Code for Power Ramp Up and EOS
    LF3RampUpOmega = ( ( ( ( 100^RampUpLinearity / CoilRampUp^RampUpLinearity ) * LF3AngleDiff^RampUpLinearity ) / 100^RampUpLinearity ) * LF3Omega ) + ( ( ( LF3Omega / 100 ) * CoilRampStartPower ) - ( ( ( LF3Omega / 100 ) * CoilRampStartPower ) * ( LF3AngleDiff^RampUpLinearity / CoilRampUp^RampUpLinearity ) ) )
    LF3Omega = ( BaseOmega - (LF3ContactPoint * ((BaseOmega - TipOmega)/1.2)))
    
    If LF3ContactPoint > 0 and LF3AngleDiff <= CoilRampUp and LeftFlipper3Ext.Hit = True then LeftFlipper3Ext.Omega = LF3RampUpOmega Else LeftFlipper3Ext.Omega = LF3Omega : End If
    If LF3ContactPoint > 0 and LF3AngleDiff < SwingAngleLF3 - EOSAngle and LF3AngleDiff > CoilRampUp then LeftFlipper3Ext.Omega = LF3Omega : End If
    If LF3ContactPoint > 0 and LF3AngleDiff => SwingAngleLF3 - EOSAngle then LeftFlipper3Ext.Omega = LF3Omega * EOSTorque : End If

'Code to apply Velocity correction when flipper "On"
    LF3MoveFriction = LF3KineticFriction - (( LF3ContactPoint * LF3KineticFriction ) * RollingEffectLF3 )
    If LeftFlipper3Ext.IsSolenoidOn = True and LF3AngleDiff < SwingAngleLF3 - 0.05 and LF3ContactPoint > 0 then' and LF3ContactPoint < 1.2 then
        LeftFlipper3Ext.SetMaterial 0, 1, LF3StaticFriction, LF3MoveFriction
        xBAM.ball.SetOmega -0.1,-0.1,-0.1
    End If
    
'Ball Spinning stop on hit
    If OverspinDeleter = 1 and LeftFlipper3Ext.Hit and LF3ContactPoint < 1 and LeftFlipper3Ext.IsSolenoidOn = True and LF3BallVSpeed > 50 then
        xBAM.ball.SetOmega -0.1,-0.1,-0.1
        LeftFlipper3Ext.SetMaterial FlipperElasticCoef, 1, LF3StaticFriction, LF3MoveFriction
    End If

End Sub

''''''''''''''''''''''''''''''''''''''''''''Right Flipper Prehit Code'''''''''''''''''''''''''''''''''''''''

Sub RightFlipper_prehit()
OnPreHitFlipperSettings(RightFlipperExt)

'Local Variable to have less time consuming.
    BallSpeed = Clng(xBAM.Ball.Speed)
    RFBallVSpeed = Clng(RightFlipperExt.BallVSpeed)
    RFContactPoint = Round(RightFlipperExt.ContactPoint,2)
    RFAngleDiff = Round(RightFlipperExt.angleDiff,2)

'Bouncing / KineticSensivity / LiveCatch Code
    If RFAngleDiff  > ( SwingAngle + ( LiveCatchDifficulty / 50 ) ) then RightFlipperExt.SetMaterial 0, 1, FlipperStaticFriction, FlipperKineticFriction : End If
    If ( RFAngleDiff => SwingAngle - 0.05 and RFAngleDiff =< ( SwingAngle + ( LiveCatchDifficulty / 50 ) ) ) or RightFlipperExt.IsSolenoidOn = False then
        If RFBallVSpeed <= ( BallKineticSensivity * 10 ) Then FlipperElasticCoef = 1.1 : End If
        If RFBallVSpeed > ( BallKineticSensivity * 10 ) and RFBallVSpeed <= BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - ( FlipperBouncingFallOff * ( RFBallVSpeed / BouncingFallOffThreshold ) ) ) : End If
        If RFBallVSpeed > ( BallKineticSensivity * 10 ) and RFBallVSpeed > BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - FlipperBouncingFallOff ) : End If
        RightFlipperExt.SetMaterial FlipperElasticCoef, 1, FlipperStaticFriction, FlipperKineticFriction
        If BallSpeed < 2 Then Exit Sub
    End If

'Anti ball passtrhough over Flipper Drop Catch + Shake Effect. ( Avoid FP Engine Issue )
    If RFContactPoint > 0 and RightFlipperExt.IsSolenoidOn = False and RFAngleDiff < 5 and RightFlipperExt.Hit = True and RFBallVSpeed > 200 then
        RightFlipper.SolenoidOn
        RightFlipper.SolenoidOff
    End If
    
'Code for Power Ramp Up and EOS
    RFRampUpOmega = CLng( ( ( ( 100^RampUpLinearity / CoilRampUp^RampUpLinearity ) * RFAngleDiff^RampUpLinearity ) / 100^RampUpLinearity ) * RFOmega ) + ( ( ( RFOmega / 100 ) * CoilRampStartPower ) - ( ( ( RFOmega / 100 ) * CoilRampStartPower ) * ( RFAngleDiff^RampUpLinearity / CoilRampUp^RampUpLinearity ) ) )
    RFOmega = Clng( BaseOmega - (RFContactPoint * ((BaseOmega - TipOmega)/1.2)))
    
    If RFContactPoint > 0 and RFAngleDiff <= CoilRampUp and RightFlipperExt.Hit = True then RightFlipperExt.Omega = RFRampUpOmega Else RightFlipperExt.Omega = RFOmega : End If
    If RFContactPoint > 0 and RFAngleDiff < SwingAngle - EOSAngle and RFAngleDiff > CoilRampUp then RightFlipperExt.Omega = RFOmega : End If   
    If RFContactPoint > 0 and RFAngleDiff => SwingAngle - EOSAngle then RightFlipperExt.Omega = RFOmega * EOSTorque : End If

'Code to apply Velocity correction when flipper "On"
    RFMoveFriction = FlipperKineticFriction - (( RFContactPoint * FlipperKineticFriction ) * RollingEffect )
    If RightFlipperExt.IsSolenoidOn = True and RFAngleDiff < SwingAngle - 0.05 and RFContactPoint > 0 then 'and RFContactPoint < 1.2 then
        RightFlipperExt.SetMaterial 0, 1, FlipperStaticFriction, RFMoveFriction
        xBAM.ball.SetOmega -0.1,0.1,0.1
    End If
    
'Ball Spinning stop on hit
    If OverspinDeleter = 1 and RightFlipperExt.Hit and RFContactPoint < 1 and RightFlipperExt.IsSolenoidOn = True and RFBallVSpeed > 50 and RFAngleDiff = SwingAngle then
        xBAM.ball.SetOmega -0.1,0.1,0.1
        RightFlipperExt.SetMaterial FlipperElasticCoef, 1, FlipperStaticFriction, RFMoveFriction
    End If

'AddDebugText "ContactPointR" & RightFlipperExt.ContactPoint
'AddDebugText "ANGLER" & RightFlipperExt.AngleDiff
'AddDebugText "RF.BallVSpeed" & RightFlipperExt.BallVSpeed
'AddDebugText "PFTrajectoryCorrection= " & PFTrajectoryCorrection

End Sub

''''''''''''''''''''''''''''''''''''''''''''Right Flipper 2 Prehit Code'''''''''''''''''''''''''''''''''''''''

Sub RightFlipper2_prehit()
OnPreHitFlipperSettings(RightFlipper2Ext)

'Local Variable to have less time consuming.
    BallSpeed = Clng(xBAM.Ball.Speed)
    RF2BallVSpeed = Clng(RightFlipper2Ext.BallVSpeed)
    RF2ContactPoint = Round(RightFlipper2Ext.ContactPoint,2)
    RF2AngleDiff = Round(RightFlipper2Ext.angleDiff,2)
    
'Bouncing / KineticSensivity / LiveCatch Code
    If RF2AngleDiff  > ( SwingAngleRF2 + ( LiveCatchDifficulty / 50 ) ) then RightFlipper2Ext.SetMaterial 0, 1, RF2StaticFriction, RF2KineticFriction : End If
    If ( RF2AngleDiff => SwingAngleRF2 - 0.05 and RF2AngleDiff =< ( SwingAngleRF2 + ( LiveCatchDifficulty / 50 ) ) ) or RightFlipper2Ext.IsSolenoidOn = False then
        If RF2BallVSpeed <= ( BallKineticSensivity * 10 ) Then FlipperElasticCoef = 1.1 : End If
        If RF2BallVSpeed > ( BallKineticSensivity * 10 ) and RF2BallVSpeed <= BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - ( FlipperBouncingFallOff * ( RF2BallVSpeed / BouncingFallOffThreshold ) ) ) : End If
        If RF2BallVSpeed > ( BallKineticSensivity * 10 ) and RF2BallVSpeed > BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - FlipperBouncingFallOff ) : End If
        RightFlipper2Ext.SetMaterial FlipperElasticCoef, 1, RF2StaticFriction, RF2KineticFriction
        If BallSpeed < 2 Then Exit Sub
    End If

'Anti ball passtrhough over Flipper Drop Catch + Shake Effect. ( Avoid FP Engine Issue )
    If RF2ContactPoint > 0 and RightFlipper2Ext.IsSolenoidOn = False and RF2AngleDiff < 5 and RightFlipper2Ext.Hit = True and RF2BallVSpeed > 200 then
        RightFlipper2.SolenoidOn
        RightFlipper2.SolenoidOff
    End If

'Code for "Anti Backside shoot". This is to prevent ball kicking by the backside of flipper like a shoot, mainly to prevent ball drain from upper flipper with huge velocity
    If RF2ContactPoint = 0 and RightFlipper2Ext.IsSolenoidOn = False and RF2AngleDiff < SwingAngleRF2 - 1 and BallSpeed > 20 then
        RightFlipper2.SolenoidOn                                                                                                                                       
        RightFlipper2.SolenoidOff
    End If

'Code for Power Ramp Up and EOS
    RF2RampUpOmega = ( ( ( ( 100^RampUpLinearity / CoilRampUp^RampUpLinearity ) * RF2AngleDiff^RampUpLinearity ) / 100^RampUpLinearity ) * RF2Omega ) + ( ( ( RF2Omega / 100 ) * CoilRampStartPower ) - ( ( ( RF2Omega / 100 ) * CoilRampStartPower ) * ( RF2AngleDiff^RampUpLinearity / CoilRampUp^RampUpLinearity ) ) )
    RF2Omega = ( BaseOmega - (RF2ContactPoint * ((BaseOmega - TipOmega)/1.2)))

    If RF2ContactPoint > 0 and RF2AngleDiff <= CoilRampUp and RightFlipper2Ext.Hit = True then RightFlipper2Ext.Omega = RF2RampUpOmega Else RightFlipper2Ext.Omega = RF2Omega : End If
    If RF2ContactPoint > 0 and RF2AngleDiff < SwingAngleRF2 - EOSAngle and RF2AngleDiff > CoilRampUp then RightFlipper2Ext.Omega = RF2Omega : End If
    If RF2ContactPoint > 0 and RF2AngleDiff => SwingAngleRF2 - EOSAngle then RightFlipper2Ext.Omega = RF2Omega * EOSTorque : End If

'Code to apply Velocity correction when flipper "On"
    RF2MoveFriction = RF2KineticFriction - (( RF2ContactPoint * RF2KineticFriction ) * RollingEffectRF2 )
    If RightFlipper2Ext.IsSolenoidOn = True and RF2AngleDiff < SwingAngleRF2 - 0.05 and RF2ContactPoint > 0 then' and RF2ContactPoint < 1.2 then
        RightFlipper2Ext.SetMaterial 0, 1, RF2StaticFriction, RF2MoveFriction
        xBAM.ball.SetOmega -0.1,0.1,0.1
    End If
    
'Ball Spinning stop on hit
    If OverspinDeleter = 1 and RightFlipper2Ext.Hit and RF2ContactPoint < 1 and RightFlipper2Ext.IsSolenoidOn = True and RF2BallVSpeed > 50 then
        xBAM.ball.SetOmega -0.1,0.1,0.1
        RightFlipper2Ext.SetMaterial FlipperElasticCoef, 1, RF2StaticFriction, RF2MoveFriction
    End If

End Sub

''''''''''''''''''''''''''''''''''''''''''''Right Flipper 3 Prehit Code'''''''''''''''''''''''''''''''''''''''

Sub RightFlipper3_prehit()
OnPreHitFlipperSettings(RightFlipper3Ext)

'Local Variable to have less time consuming.
    BallSpeed = Clng(xBAM.Ball.Speed)
    RF3BallVSpeed = Clng(RightFlipper3Ext.BallVSpeed)
    RF3ContactPoint = Round(RightFlipper3Ext.ContactPoint,2)
    RF3AngleDiff = Round(RightFlipper3Ext.angleDiff,2)
    
'Bouncing / KineticSensivity / LiveCatch Code
    If RF3AngleDiff  > ( SwingAngleRF3 + ( LiveCatchDifficulty / 50 ) ) then RightFlipper3Ext.SetMaterial 0, 1, RF3StaticFriction, RF3KineticFriction : End If
    If ( RF3AngleDiff => SwingAngleRF3 - 0.05 and RF3AngleDiff =< ( SwingAngleRF3 + ( LiveCatchDifficulty / 50 ) ) ) or RightFlipper3Ext.IsSolenoidOn = False then
        If RF3BallVSpeed <= ( BallKineticSensivity * 10 ) Then FlipperElasticCoef = 1.1 : End If
        If RF3BallVSpeed > ( BallKineticSensivity * 10 ) and RF3BallVSpeed <= BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - ( FlipperBouncingFallOff * ( RF3BallVSpeed / BouncingFallOffThreshold ) ) ) : End If
        If RF3BallVSpeed > ( BallKineticSensivity * 10 ) and RF3BallVSpeed > BouncingFallOffThreshold Then FlipperElasticCoef = FlipperBouncingCoeff * ( 1 - FlipperBouncingFallOff ) : End If
        RightFlipper3Ext.SetMaterial FlipperElasticCoef, 1, RF3StaticFriction, RF3KineticFriction
        If BallSpeed < 2 Then Exit Sub
    End If

'Anti ball passtrhough over Flipper Drop Catch + Shake Effect. ( Avoid FP Engine Issue )
    If RF3ContactPoint > 0 and RightFlipper3Ext.IsSolenoidOn = False and RF3AngleDiff < 5 and RightFlipper3Ext.Hit = True and RF3BallVSpeed > 200 then
        RightFlipper3.SolenoidOn
        RightFlipper3.SolenoidOff
    End If

'Code for "Anti Backside shoot". This is to prevent ball kicking by the backside of flipper like a shoot, mainly to prevent ball drain from upper flipper with huge velocity
    If RF3ContactPoint = 0 and RightFlipper3Ext.IsSolenoidOn = False and RF3AngleDiff < SwingAngleRF3 - 1 and BallSpeed > 20 then
        RightFlipper3.SolenoidOn                                                                                                                                       
        RightFlipper3.SolenoidOff
    End If

'Code for Power Ramp Up and EOS
    RF3RampUpOmega = ( ( ( ( 100^RampUpLinearity / CoilRampUp^RampUpLinearity ) * RF3AngleDiff^RampUpLinearity ) / 100^RampUpLinearity ) * RF3Omega ) + ( ( ( RF3Omega / 100 ) * CoilRampStartPower ) - ( ( ( RF3Omega / 100 ) * CoilRampStartPower ) * ( RF3AngleDiff^RampUpLinearity / CoilRampUp^RampUpLinearity ) ) )
    RF3Omega = ( BaseOmega - (RF3ContactPoint * ((BaseOmega - TipOmega)/1.2)))

    If RF3ContactPoint > 0 and RF3AngleDiff <= CoilRampUp and RightFlipper3Ext.Hit = True then RightFlipper3Ext.Omega = RF3RampUpOmega Else RightFlipper3Ext.Omega = RF3Omega : End If
    If RF3ContactPoint > 0 and RF3AngleDiff < SwingAngleRF3 - EOSAngle and RF3AngleDiff > CoilRampUp then RightFlipper3Ext.Omega = RF3Omega : End If
    If RF3ContactPoint > 0 and RF3AngleDiff => SwingAngleRF3 - EOSAngle then RightFlipper3Ext.Omega = RF3Omega * EOSTorque : End If

'Code to apply Velocity correction when flipper "On"
    RF3MoveFriction = RF3KineticFriction - (( RF3ContactPoint * RF3KineticFriction ) * RollingEffectRF3 )
    If RightFlipper3Ext.IsSolenoidOn = True and RF3AngleDiff < SwingAngleRF3 - 0.05 and RF3ContactPoint > 0 then' and RF3ContactPoint < 1.2 then
        RightFlipper3Ext.SetMaterial 0, 1, RF3StaticFriction, RF3MoveFriction
        xBAM.ball.SetOmega -0.1,0.1,0.1
    End If
    
'Ball Spinning stop on hit
    If OverspinDeleter = 1 and RightFlipper3Ext.Hit and RF3ContactPoint < 1 and RightFlipper3Ext.IsSolenoidOn = True and RF3BallVSpeed > 50 then
        xBAM.ball.SetOmega -0.1,0.1,0.1
        RightFlipper3Ext.SetMaterial FlipperElasticCoef, 1, RF3StaticFriction, RF3MoveFriction
    End If

End Sub


' ============================================ END OF PREHIT CODES  ============================================
' ==============================================================================================================
 
I'm missing the action too mate.
It feels like I have to relearn everything again :( when I come back
 
I'm missing the action too mate.
It feels like I have to relearn everything again :( when I come back

In my tutorial video... (which I'll hold off posting until I update and test the table with the new fixes).... I tell everyone be like Yoda. "You must UN-Learn what you have learned".
 
Last edited:
I would say I had to UN-Learn more than any of you guys. I had to unlearn everything I knew about physics.
 
I would say I had to UN-Learn more than any of you guys. I had to unlearn everything I knew about physics.

That's not a bad thing... and it's not just you.

It was a bit easier for me to grasp because I was familiar with nFozzy and how VP tables are updated... but... I still had to unlearn what I was used to doing with FP... and needed JLou and Anontet to help me understand how the new physics settings all worked. It was not a quick process for me to grasp. :) (I'm good with working examples and simple explanations)

I still don't fully understand all the settings.... but what this Example table (and my video I'll post) shows is that you don't have to if you want to get a FP table to play much better using FizX now.
 
You need to add yoda to beginning of the video saying "You must UN-Learn what you have learned"!!
Great work all!!

Edit:
Just re-read your post and looks like you added that to video already!!
Love your videos Terry!!
 
That's not a bad thing... and it's not just you.

It was a bit easier for me to grasp because I was familiar with nFozzy and how VP tables are updated... but... I still had to unlearn what I was used to doing with FP... and needed JLou and Anontet to help me understand how the new physics settings all worked. It was not a quick process for me to grasp. :) (I'm good with working examples and simple explanations)

I still don't fully understand all the settings.... but what this Example table (and my video I'll post) shows is that you don't have to if you want to get a FP table to play much better using FizX now.
I had a concept based on hockey , baseball , racket sports etc… that I used for DF1 and I loved it and then went to a real pinball arcade and was surprised by the wrong concept of pinball physics that I had. I just had to accept it and try to learn it for what it was.

Unlike “real” sports , pinball has a rubberized electromechanical gizmo (flipper) between you and the ball .

And that gizmo has been conventionalized over the years and at least to me doesn’t correspond to the immediate physics of whacking an object with a stick.

Also the nuanced body-brain connection of using your own limbs as the actuator is different than the cold reality of an indifferent analogue switch.

So I had to suspend my expectations and embrace pinball as unique terrarium of its own
 
Last edited:
I had a concept based on hockey , baseball , racket sports etc… that I used for DF1 and I loved it and then went to a real pinball arcade and was surprised by the wrong concept of pinball physics.

Unlike “real” sports , pinball has a rubberized electromechanical gizmo (flipper) between you and the ball .

And that gizmo has been conventionalized over the years and at least to me doesn’t correspond to the immediate physics of whacking an object with a stick

So I had to suspend my expectations and embrace pinball as unique terrarium of its own

I was the same way. After not playing any real pinball for 20+ years, and playing FP for years... I "hated" playing VPX at first as it was so different to me. It wasn't until I finally had the chance to play some real pinball again that I realized just how wonky FP's physic were (though for older EM's it wasn't too bad), and how much more accurate VP's physics were.

Today, that difference is much more minimal now than it ever has been.... and we have lots of choices to make as easy or realistic as we want it to be in FP.
 
I was the same way. After not playing any real pinball for 20+ years, and playing FP for years... I "hated" playing VPX at first as it was so different to me. It wasn't until I finally had the chance to play some real pinball again that I realized just how wonky FP's physic were (though for older EM's it wasn't too bad), and how much more accurate VP's physics were.

Today, that difference is much more minimal now than it ever has been.... and we have lots of choices to make as easy or realistic as we want it to be in FP.
I have been reading people’s responses to fizx and pinevent tables and it is clear this is the right path

It’s an entirely subjective ethereal consensus like just about everything else in life so what the heck, I am in !

I am looking forward to trying a real machine again to see how we are doing and I guess that is the “gold standard “
 
Last edited:
General chit-chat
Help Users
You can interact with the ChatGPT Bot in any Chat Room and there is a dedicated room. The command is /ai followed by a space and then your ? or inquiry.
ie: /ai What is a EM Pinball Machine?
  • No one is chatting at the moment.
      Chat Bot Mibs Chat Bot Mibs: dizzeee has left the room.
      Back
      Top