Code/Example Tutorial FizX Lite FizX 3.0 Lite Edition - A Simple Way to Add Physics to a Future Pinball Table (Novices Included)

Coding and examples for future Pinball and BAM
The same things is possible with FizX and Terry's new ball rolling sound.

But even if it work great in the most case, i'm agree with him that you could also have bad sound behavior. And finally it will more simple to use trigger than searching for what's going wrong if it's the case.


I'd be happier if the AIO just turned the ball rolling sound off when the ball hits a ramp. ...Or how you make this trigger work exactly with the existing code?
 
it's just a variable i can add.

for exemple, if ball hit PF material, this variable is 1, if plastic is 2, wood 3 etc etc..

Then if you combine this to ball height condition you can assume that ball is rolling on PF or in plastic or metal ramp.
It also work on upper playfield because upperplayfield use PF material.
 
For the PUP SSF side of things.... you can't change the ball rolling "sound file" for different table events. You can only change its volume. This is because pup is hard coded to look for specifically named sound files for ball rolling only, and that is preloaded on table startup, and different sound files can't be changed to work with 3d positional tracking (ball rolling works different than all other ssf).
 
Last edited:
How about we implement it and just not make it work on PUP SSF (or make it work differently on PUP SSF)? ...Or just add what JLou suggests to FizX Lite (possibly as optional) since it does not have PUP. In fact, I was thinking about posting a new revision to FizX Lite where FizX bumpers are an optional addition.
 
Last edited:
@GeorgeH you mean you want the variable depend on what material is the ball?
 
Last edited:
okey.. But i also don't want FizX go on multiple direction.
It take a good direction with the help from @TerryRed and his work for AIO, and I'm for his new Rolling script instead of Smoke.

I have in my mind that FizX-Lite is FizX with less stuff.... not different Stuff.. And Terry's Sound system is for me a must that shouldn't be bypass IMO

So i will add this variable.. But I ask myself about the "FizX-Lite" name is appropriate
 
okey.. But i also don't want FizX go on multiple direction.
It take a good direction with the help from @TerryRed and his work for AIO, and I'm for his new Rolling script instead of Smoke.

I have in my mind that FizX-Lite is FizX with less stuff.... not different Stuff.. And Terry's Sound system is for me a must that shouldn't be bypass IMO

So i will add this variable.. But I ask myself about the "FizX-Lite" name is appropriate

It doesn't seem to be a big change so I think it will be OK.
 
I don't think this change will go too far in a different direction. It would still be a pretty close match to the AIO. If desired, a switch could probably be added to the AIO so it switches between the PUP SSF method and your method.
 
Last edited:
@GeorgeH , here the updated code with variable added depend what ball hit

Code:
Dim MaterialTouch ' 1= Playfield, 2 = Plastic, 3 = Metal, 4 = Wood, 5 = Rubber

xBAM.Physics.GenericHitIgnoreHit = XML_Fps/4 ' How many Engine fps after fisrt hit, Generic Hit is active again
xBAM.Physics.GenericHitMinNormalSpeed = 100 ' Minimal Hit Speed along the Normal of object to enable Generic Hit
xBAM.Physics.AllObjectsHasGenericHit = True 'False : Only object that found with GetObjectsInfoRange from "Rav Helper Function V2" have Generic Hit / True : All object have automaticaly Generic Hit with the  "IsGeneric" property
FizXRubberHitEvent = 1 ' Initialize FizXRubberHitEvent variable. Needed to prevent Flipper Rubber Hit that could interefe with Auto-Generated Rubber Hit Sound when it's used.

Sub Generic_Hit(FizX, hitSpeed, material) 'Scatter Bounce and Hit Event

    'AddDebugText "Ball_Hit_X" & xBAM.Ball.position.x
    'AddDebugText "Ball_Hit_Y" & xBAM.Ball.position.y
   'AddDebugText "Ball_Hit_Y" & xBAM.Ball.position.z
   'AddDebugText "Ball.Velocity.z" & xBAM.Ball.Velocity.z
   'AddDebugText "Material" & MaterialTouch
   'AddDebugText "hitSpeed" & hitSpeed

    'Manual/More Accurate Trigger Hit Script
    If FizX.ExtInt1 = IsRbPost then : PFTrajectoryCorrection = 1 : ScatterAngle = ScatterRubber : FizXRubberPostHitEvent() : MaterialTouch = 5 : End If 'Scatter bounce + Sound For RubberPost Hit : Need to have Surface/Wall/DiverterModel element named in editor as : RubberPost1, RubberPost2, RubberPost3 etc etc

    If FizX.ExtInt1 = IsRbBand then : PFTrajectoryCorrection = 1 : ScatterAngle = ScatterRubber : FizXRubberBandHitEvent() : MaterialTouch = 5 : End If 'Scatter bounce + Sound For RubberBand Hit : Need to have Surface/Wall/DiverterModel element named in editor as : RubberBand1, RubberBand2, RubberBand3 etc etc

    If FizX.ExtInt1 = IsDTWall then : PFTrajectoryCorrection = 1 : ScatterAngle = ScatterDT : FizXTargetHitEvent() : End If 'Scatter bounce + Sound For Target Hit : Need to have wall element named in editor as : DT1, DT2, DT3 etc etc
 
    If FizX.ExtInt1 = IsMtl then : FizXMetalHitEvent() : MaterialTouch = 3 : End If 'Sound For Metal Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Metal1, Metal2, Metal3 etc etc

    If FizX.ExtInt1 = IsWd then : FizXWoodHitEvent() : MaterialTouch = 4 : End If 'Sound For Wood Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Wood1, Wood2, Wood3 etc etc

    If FizX.ExtInt1 = IsApron then : FizXApronHitEvent() : End If 'Sound For Apron Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Apron1, Apron2, Apron3 etc etc
  
    If FizX.ExtInt1 = IsPlastic then : FizXPlasticHitEvent() : MaterialTouch = 2 : End If 'Sound For Plastic Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Plastic1, Plastic2, Plastic3 etc etc

    'Auto_Generated Trigger Hit Script 
    If FizX.IsGeneric and Auto_Generate_Hit_Sound = 1 Then 'Automatic Hit sound for "No-Named" element working with their material caracteristic
        If material = 20 and hitSpeed > 150 and Auto_Generate_Hit_Sound_Plastic = 1 Then FizXPlasticHitEvent() : MaterialTouch = 2 : End If 'plastic
        If material = 12 and hitSpeed > 150 and Auto_Generate_Hit_Sound_Metal = 1 Then FizXMetalHitEvent() : MaterialTouch = 3 : End If 'Metal
        If material = 16 and hitSpeed > 150 and Auto_Generate_Hit_Sound_Wood = 1 Then FizXWoodHitEvent() : MaterialTouch = 4 : End If 'Wood
        If material = 24 and hitSpeed > 150 and Auto_Generate_Hit_Sound_RubberHard = 1 and FizXRubberHitEvent = 1 Then FizXRubberPostHitEvent() : MaterialTouch = 5 : End If 'Rubber Hard
        If material = 28 and hitSpeed > 150 and Auto_Generate_Hit_Sound_RubberMedium = 1 and FizXRubberHitEvent = 1 Then FizXRubberPostHitEvent() : MaterialTouch = 5 : End If 'Rubber Medium
        If material = 32 and hitSpeed > 150 and Auto_Generate_Hit_Sound_RubberSoft = 1 and FizXRubberHitEvent = 1 Then FizXRubberPostHitEvent() : MaterialTouch = 5 : End If 'Rubber Soft
        If material = 3  and hitSpeed > 100  and xBAM.Ball.position.z => 12.5 and Auto_Generate_Hit_Sound_PF = 1 Then FizXPFHitEvent() : MaterialTouch = 1 : End If 'Playfield
    End If
  
   'AddDebugText "it works..." & hitSpeed 
   'AddDebugText "FizX.IsGeneric " & FizX.IsGeneric

    'Scatter Formula to randomize bouncing when "hit" method is used
    If HitSpeed > 10 then
        ScatterHit = CLng((( ScatterAngle * 2 ) * Rnd - ScatterAngle ))
        xBAM.ball.ExtInt3 = 1
        'xBAM.Ball.ExtFloat1 = ScatterHit
    Else
        PFTrajectoryCorrection = 0
        'xBAM.Ball.ExtFloat1 = 0
        ScatterHit = 0
    End If

End Sub

Now you have the variable MaterialTouch = 1, 2, 3, 4 or 5 depend what ball hit. Combinate to ball height you probably make what you want
 
@GeorgeH , here the updated code with variable added depend what ball hit

Code:
Dim MaterialTouch ' 1= Playfield, 2 = Plastic, 3 = Metal, 4 = Wood, 5 = Rubber

xBAM.Physics.GenericHitIgnoreHit = XML_Fps/4 ' How many Engine fps after fisrt hit, Generic Hit is active again
xBAM.Physics.GenericHitMinNormalSpeed = 100 ' Minimal Hit Speed along the Normal of object to enable Generic Hit
xBAM.Physics.AllObjectsHasGenericHit = True 'False : Only object that found with GetObjectsInfoRange from "Rav Helper Function V2" have Generic Hit / True : All object have automaticaly Generic Hit with the  "IsGeneric" property
FizXRubberHitEvent = 1 ' Initialize FizXRubberHitEvent variable. Needed to prevent Flipper Rubber Hit that could interefe with Auto-Generated Rubber Hit Sound when it's used.

Sub Generic_Hit(FizX, hitSpeed, material) 'Scatter Bounce and Hit Event

    'AddDebugText "Ball_Hit_X" & xBAM.Ball.position.x
    'AddDebugText "Ball_Hit_Y" & xBAM.Ball.position.y
   'AddDebugText "Ball_Hit_Y" & xBAM.Ball.position.z
   'AddDebugText "Ball.Velocity.z" & xBAM.Ball.Velocity.z
   'AddDebugText "Material" & MaterialTouch
   'AddDebugText "hitSpeed" & hitSpeed

    'Manual/More Accurate Trigger Hit Script
    If FizX.ExtInt1 = IsRbPost then : PFTrajectoryCorrection = 1 : ScatterAngle = ScatterRubber : FizXRubberPostHitEvent() : MaterialTouch = 5 : End If 'Scatter bounce + Sound For RubberPost Hit : Need to have Surface/Wall/DiverterModel element named in editor as : RubberPost1, RubberPost2, RubberPost3 etc etc

    If FizX.ExtInt1 = IsRbBand then : PFTrajectoryCorrection = 1 : ScatterAngle = ScatterRubber : FizXRubberBandHitEvent() : MaterialTouch = 5 : End If 'Scatter bounce + Sound For RubberBand Hit : Need to have Surface/Wall/DiverterModel element named in editor as : RubberBand1, RubberBand2, RubberBand3 etc etc

    If FizX.ExtInt1 = IsDTWall then : PFTrajectoryCorrection = 1 : ScatterAngle = ScatterDT : FizXTargetHitEvent() : End If 'Scatter bounce + Sound For Target Hit : Need to have wall element named in editor as : DT1, DT2, DT3 etc etc
 
    If FizX.ExtInt1 = IsMtl then : FizXMetalHitEvent() : MaterialTouch = 3 : End If 'Sound For Metal Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Metal1, Metal2, Metal3 etc etc

    If FizX.ExtInt1 = IsWd then : FizXWoodHitEvent() : MaterialTouch = 4 : End If 'Sound For Wood Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Wood1, Wood2, Wood3 etc etc

    If FizX.ExtInt1 = IsApron then : FizXApronHitEvent() : End If 'Sound For Apron Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Apron1, Apron2, Apron3 etc etc
 
    If FizX.ExtInt1 = IsPlastic then : FizXPlasticHitEvent() : MaterialTouch = 2 : End If 'Sound For Plastic Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Plastic1, Plastic2, Plastic3 etc etc

    'Auto_Generated Trigger Hit Script
    If FizX.IsGeneric and Auto_Generate_Hit_Sound = 1 Then 'Automatic Hit sound for "No-Named" element working with their material caracteristic
        If material = 20 and hitSpeed > 150 and Auto_Generate_Hit_Sound_Plastic = 1 Then FizXPlasticHitEvent() : MaterialTouch = 2 : End If 'plastic
        If material = 12 and hitSpeed > 150 and Auto_Generate_Hit_Sound_Metal = 1 Then FizXMetalHitEvent() : MaterialTouch = 3 : End If 'Metal
        If material = 16 and hitSpeed > 150 and Auto_Generate_Hit_Sound_Wood = 1 Then FizXWoodHitEvent() : MaterialTouch = 4 : End If 'Wood
        If material = 24 and hitSpeed > 150 and Auto_Generate_Hit_Sound_RubberHard = 1 and FizXRubberHitEvent = 1 Then FizXRubberPostHitEvent() : MaterialTouch = 5 : End If 'Rubber Hard
        If material = 28 and hitSpeed > 150 and Auto_Generate_Hit_Sound_RubberMedium = 1 and FizXRubberHitEvent = 1 Then FizXRubberPostHitEvent() : MaterialTouch = 5 : End If 'Rubber Medium
        If material = 32 and hitSpeed > 150 and Auto_Generate_Hit_Sound_RubberSoft = 1 and FizXRubberHitEvent = 1 Then FizXRubberPostHitEvent() : MaterialTouch = 5 : End If 'Rubber Soft
        If material = 3  and hitSpeed > 100  and xBAM.Ball.position.z => 12.5 and Auto_Generate_Hit_Sound_PF = 1 Then FizXPFHitEvent() : MaterialTouch = 1 : End If 'Playfield
    End If
 
   'AddDebugText "it works..." & hitSpeed
   'AddDebugText "FizX.IsGeneric " & FizX.IsGeneric

    'Scatter Formula to randomize bouncing when "hit" method is used
    If HitSpeed > 10 then
        ScatterHit = CLng((( ScatterAngle * 2 ) * Rnd - ScatterAngle ))
        xBAM.ball.ExtInt3 = 1
        'xBAM.Ball.ExtFloat1 = ScatterHit
    Else
        PFTrajectoryCorrection = 0
        'xBAM.Ball.ExtFloat1 = 0
        ScatterHit = 0
    End If

End Sub

Now you have the variable MaterialTouch = 1, 2, 3, 4 or 5 depend what ball hit. Combinate to ball height you probably make what you want

The code appears to be the same as the "Sub Generic_Hit" code that is already in FizX. I don't see anything for ball-rolling.
 
i added a variable.
So now, make your own update of rolling sound
 
I get an error immediately the ball is ejected into the plunger lane

Variable undefined: "IsRbPost"
 
I get an error immediately the ball is ejected into the plunger lane

Variable undefined: "IsRbPost"

JLou left the rubber and drop target code which was not added to FizX Lite. This is actually the FizX code that needs to be replaced:
Code:
Dim MaterialTouch ' 1= Playfield, 2 = Plastic, 3 = Metal, 4 = Wood, 5 = Rubber

xBAM.Physics.GenericHitIgnoreHit = XML_Fps/4 ' How many Engine fps after fisrt hit, Generic Hit is active again
xBAM.Physics.GenericHitMinNormalSpeed = 100 ' Minimal Hit Speed along the Normal of object to enable Generic Hit
xBAM.Physics.AllObjectsHasGenericHit = True 'False : Only object that found with GetObjectsInfoRange from "Rav Helper Function V2" have Generic Hit / True : All object have automaticaly Generic Hit with the  "IsGeneric" property
FizXRubberHitEvent = 1 ' Initialize FizXRubberHitEvent variable. Needed to prevent Flipper Rubber Hit that could interefe with Auto-Generated Rubber Hit Sound when it's used.

Sub Generic_Hit(FizX, hitSpeed, material) 'Scatter Bounce and Hit Event

    If FizX.ExtInt1 = IsMtl then : FizXMetalHitEvent() : MaterialTouch = 3 : End If 'Sound For Metal Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Metal1, Metal2, Metal3 etc etc

    If FizX.ExtInt1 = IsWd then : FizXWoodHitEvent() : MaterialTouch = 4 : End If 'Sound For Wood Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Wood1, Wood2, Wood3 etc etc

    If FizX.ExtInt1 = IsApron then : FizXApronHitEvent() : End If 'Sound For Apron Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Apron1, Apron2, Apron3 etc etc
 
    If FizX.ExtInt1 = IsPlastic then : FizXPlasticHitEvent() : MaterialTouch = 2 : End If 'Sound For Plastic Hit : Need to have Surface/Wall/DiverterModel element named in editor as : Plastic1, Plastic2, Plastic3 etc etc

    'Auto_Generated Trigger Hit Script
    If FizX.IsGeneric and Auto_Generate_Hit_Sound = 1 Then 'Automatic Hit sound for "No-Named" element working with their material caracteristic
        If material = 20 and hitSpeed > 150 and Auto_Generate_Hit_Sound_Plastic = 1 Then FizXPlasticHitEvent() : MaterialTouch = 2 : End If 'plastic
        If material = 12 and hitSpeed > 150 and Auto_Generate_Hit_Sound_Metal = 1 Then FizXMetalHitEvent() : MaterialTouch = 3 : End If 'Metal
        If material = 16 and hitSpeed > 150 and Auto_Generate_Hit_Sound_Wood = 1 Then FizXWoodHitEvent() : MaterialTouch = 4 : End If 'Wood
        If material = 3  and hitSpeed > 100  and xBAM.Ball.position.z => 12.5 and Auto_Generate_Hit_Sound_PF = 1 Then FizXPFHitEvent() : MaterialTouch = 1 : End If 'Playfield
    End If

Unfortunately, I don't know anything about TerryRed's ball-rolling code so I don't know how to update it. I'll just continue using Smoke's code and forget about it.
 
Some tables benefit alot from the rubber hit sounds. Electromechanicals in particular. Including them in the next FizX Lite release might be a good idea.

The flipper code is good and IMO is what makes or breaks a pin simulation, followed by hit sounds. Practically every pin sim in the past 20 years or so has had decent hit sounds, and this is one area that Future Pinball in its default state is sorely lacking in.
 
okey.. But i also don't want FizX go on multiple direction.
It take a good direction with the help from @TerryRed and his work for AIO, and I'm for his new Rolling script instead of Smoke.

I have in my mind that FizX-Lite is FizX with less stuff.... not different Stuff.. And Terry's Sound system is for me a must that shouldn't be bypass IMO

So i will add this variable.. But I ask myself about the "FizX-Lite" name is appropriate

If you don't have a cabinet setup, the DOF code can be tough to work around and does cause problems. You can't just drag and drop it into a table like you can with FizX Lite. I can put FizX Lite into a table in a couple of minutes. Implementing FizX is much more of an undertaking.

I get the feeling FizX Lite is aimed largely at people making small modifications for personal use, similar to the DF1 flipper code.
 
If you don't have a cabinet setup, the DOF code can be tough to work around and does cause problems. You can't just drag and drop it into a table like you can with FizX Lite. I can put FizX Lite into a table in a couple of minutes. Implementing FizX is much more of an undertaking.

I get the feeling FizX Lite is aimed largely at people making small modifications for personal use, similar to the DF1 flipper code.

I don't have a cabinet setup either. For me, the DOF code in the AIO is just something to ignore. From what I have seen, it doesn't appear to get in the way.

I approached JLou to create the tutorial for FizX Lite so the average person could add it for their own personal use. I know there is a demand for it. I wrote it with more detail than I would for experienced users so the average person could add it without much knowledge of Future Pinball. That is why it is a bit long.

But JLou decided it could be published as long as it is identified as the Lite Edition. It allows table developers to not spend quite as much time adding it but retain the best parts of it.

So it basically serves a dual purpose.
 
I don't have a cabinet setup either. For me, the DOF code in the AIO is just something to ignore. From what I have seen, it doesn't appear to get in the way.

I approached JLou to create the tutorial for FizX Lite so the average person could add it for their own personal use. I know there is a demand for it. I wrote it with more detail than I would for experienced users so the average person could add it without much knowledge of Future Pinball. That is why it is a bit long.

But JLou decided it could be published as long as it is identified as the Lite Edition. It allows table developers to not spend quite as much time adding it but retain the best parts of it.

So it basically serves a dual purpose.

I get errors, like missing FizX.DMD (I presume used by the FizX tweaker).
 
I get errors, like missing FizX.DMD (I presume used by the FizX tweaker).

Follow the actual "written" AIO Example Tutorial, and do it in order (video tutorial is a reference example, only, but always out of date). Then you won't have problems. Trying to skip this and that, and taking shortcuts, or only copying the bits you think you want is not how these AIO Example tables and tutorials are designed to be used.

For the AIO Example table, It takes "minutes", to do a copy and paste of the AIO Code, Add a Timer, add a HUD DMD, add the models, add the sounds, add the textures.... etc. The only thing that takes extra time is adding rubber diverters, sling diverters, Bumpers, etc. Drop target walls are optional. Sling and rubber updates are not optional.

The AIO Example does not... I repeat... does NOT require you to do anything related to DOF, PUP, or PinMechSound. Those are "optional"... but the code used with PinMachSound is self-contained and complete that covers everyone's setup, if you take the extra time to add it to table events. You also get the benefit of Fleep sound for everything. Ball Rolling code works automatically for most tables. I just added it to a table with captive balls on the table... and it just worked (even though there are 3 other balls always on the table).... including before and after each multiball, etc. (this table previously have smoke ball rolling, which I removed)

FizX Lite is for the bare bones of FizX and Flippers. Not much more. It's meant for people who don't want to put in the effort to update a table completely, and it will get them by with the bare minimum.

Trying to add this and that to FizX Lite.... you are wasting time. If you want more than what the FizX Lite example has.... then do things the right way, and use the AIO Example code and follow its tutorial, and have a completely updated table done properly, without issues. I've added it to many tables already.... and have had no problems.
 
Last edited:
Follow the actual "written" AIO Example Tutorial, and do it in order (video tutorial is a reference example, only, but always out of date). Then you won't have problems. Trying to skip this and that, and taking shortcuts, or only copying the bits you think you want is not how these AIO Example tables and tutorials are designed to be used.

For the AIO Example table, It takes "minutes", to do a copy and paste of the AIO Code, Add a Timer, add a HUD DMD, add the models, add the sounds, add the textures.... etc. The only thing that takes extra time is adding rubber diverters, sling diverters, Bumpers, etc. Drop target walls are optional. Sling and rubber updates are not optional.

The AIO Example does not... I repeat... does NOT require you to do anything related to DOF, PUP, or PinMechSound. Those are "optional"... but the code used with PinMachSound is self-contained and complete that covers everyone's setup, if you take the extra time to add it to table events. You also get the benefit of Fleep sound for everything. Ball Rolling code works automatically for most tables. I just added it to a table with captive balls on the table... and it just worked (even though there are 3 other balls always on the table).... including before and after each multiball, etc. (this table previously have smoke ball rolling, which I removed)

FizX Lite is for the bare bones of FizX and Flippers. Not much more. It's meant for people who don't want to put in the effort to update a table completely, and it will get them by with the bare minimum.

Trying to add this and that to FizX Lite.... you are wasting time. If you want more than what the FizX Lite example has.... then do things the right way, and use the AIO Example code and follow its tutorial, and have a completely updated table done properly, without issues. I've added it to many tables already.... and have had no problems.
Terrys at a pro level though... lol
You usually dont have to change any code from the table?
Elmstreet and I see other tables have kicker up issues when dropping from 7 to 5 or 6 slope, lowering or raising the power of the kicker doesnt work and if you change the gravity or mass of the ball then playability sucks, any ideas?
also what causes the "" slipping"" effect? you wont notice it at full screen but in scroll mode it very noticible, I think it may be caused by conflicting or 2 sounds playing at the same time for example some tables already use the sounds for table items but I find with the flippers and the names being LeftFlipper / RightFlipper, there arent any sounds with fizx, i have only had 1 table work with flipper sounds out of 4.
ill try and post a video of the slipping motion.
 
Just writing to say you DO NOT want to change either gravity or ball mass for FizX.
 
Just writing to say you DO NOT want to change either gravity or ball mass for FizX.
i didnt think we were supposed to, its all in a series of events.

Maybe one of you guys could write what can be changed and what cannot.
Materials? default material, metal, wood?
I remember reading , but a list of do's and do not's would be helpful for a lot of people, including myself.
 
Changing gravity or mass can cause the ball to go through the flippers.

You can change the FPS the physics runs at, dividing it in half. It will still run, though the ball might not behave completely the same, it's still playable. Personally, I did not notice much difference. It does reduce CPU usage by about 25-35 percent.
 
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.
      JonPurpleHaze @ JonPurpleHaze: Heard a different Aaron Neville song earlier, saw him in New Orleans...
      • Like
      Reactions: xenonph
      Back
      Top