- View New Content
-
Getting Started
-
Tutorials
Tutorial Categories
Tutorials Main Page Installation and Setup Downloadable TutorialsROM Adjustments
Number of Balls Adjustments Volume Adjustments
-
Visual Pinball Tables
VP 8 Desktop Tables
All VPM Recreations VP Recreations VP/VPM MODs VP Originals ROMsVP 9 Desktop Tables
All VPM Recreations VP Recreations VP/VPM MODs VP Originals ROMsVP9 Cabinet Tables
All Full Screen Cabinet Full Screen B2S Cabinet Spanned Cabinet Tables Media Packs ROMsVPX Tables
All VPinMAME Recreations VPX- - /VPinMAME - MOD Tables VPX Recreations VPX Originals Media Packs ROMs VR
-
Frontend Media & Backglass
Media Packs
Complete Media Packs Wheel Logos VideosBackglasses
dB2S Animated Backglasses UVP Animated Backglasses Topper Images
- Future Pinball Tables
-
Design Resources
Main Resources
Table Templates Playfield Images Image Library Sound Library Key CodesVP Guides
VP8 Guide - English VP8 Guide - Deutsch VP9 Guide - English VP9.1.x Guide - English VP Object Guide VPM DocumentationFuture Pinball Resources
Playfield Images 3D Model LibraryFuture Pinball Guides
FP Script Guide Big Draco Script Guide FP Table Design Guide FP DMD Guide
- Other Features
- Bug Tracker
- Image Gallery
- Blogs
-
More
Luck Smile (Inder 1976)[Visual Pinball X]
Started By
jpsalas
, Dec 05 2021 06:41 PM
luck smile inder 1976
35 replies to this topic
#23
Posted 07 December 2021 - 09:27 AM
Really nice looking, sounding and playing table as usual.
Ball speed seems fine overall, only the flippers may be a bit on the powerful side but I believe that is a conscious decision by JP Salas to allow certain techniques.
Luck Smile seems a very generous design though, is it really correct that every "special" hit results in a free game?
It's also very easy to score high by lighting the bumpers through the left rollover lane, I just got a 1.7M on the board which is a lot higher than the blokes in the video score.
Perhaps this VPX version is a bit on the forgiving side?
#24
Posted 07 December 2021 - 10:41 AM
Really nice looking, sounding and playing table as usual.
Ball speed seems fine overall, only the flippers may be a bit on the powerful side but I believe that is a conscious decision by JP Salas to allow certain techniques.
Luck Smile seems a very generous design though, is it really correct that every "special" hit results in a free game?
It's also very easy to score high by lighting the bumpers through the left rollover lane, I just got a 1.7M on the board which is a lot higher than the blokes in the video score.
Perhaps this VPX version is a bit on the forgiving side?
Yes, the rules are just like in the original pinball machine. But as I said the Inder tables were very fast, just check the video akiles50000 posted
I guess the VPX version still isn't as fast as the original ![]()
If you want to check my latest uploads then click on the image below:
Next table? A tribute table to Stern's Foo Fighters
#26
Posted 07 December 2021 - 11:58 AM
The match number on the backglass is always visible.
Fix:
Sub Clear_Match()
MatchReel.SetValue 10
MatchReel2.SetValue 10
If B2SOn then
Controller.B2SSetMatch 0 <CHANGE THIS LINE
end if
End Sub
Thanks Albert ![]()
If you want to check my latest uploads then click on the image below:
Next table? A tribute table to Stern's Foo Fighters
#27
Posted 07 December 2021 - 02:26 PM
Really nice looking, sounding and playing table as usual.
Ball speed seems fine overall, only the flippers may be a bit on the powerful side but I believe that is a conscious decision by JP Salas to allow certain techniques.
Luck Smile seems a very generous design though, is it really correct that every "special" hit results in a free game?
It's also very easy to score high by lighting the bumpers through the left rollover lane, I just got a 1.7M on the board which is a lot higher than the blokes in the video score.
Perhaps this VPX version is a bit on the forgiving side?
I guess the VPX version still isn't as fast as the original
I personally think the speed is fine; one difference I've noted is that on the real table the kickout holes in the horseshoe eject the ball towards the slingshots rather than the flippers as in this VPX version.
This might make for a little more random behaviour and less ball control.
Two other LM videos on YT that show ball speed on your recreation seems accurate (i.e. not too low) and the kickout behaviour.
#28
Posted 07 December 2021 - 03:41 PM
I didn't saw where the kickers shot the ball. I'm so used that the kickers kick the ball to the flippers that I didn't checked that
But kicking the ball to the slingshots, that's evil! ![]()
If you want to check my latest uploads then click on the image below:
Next table? A tribute table to Stern's Foo Fighters
#29
Posted 07 December 2021 - 03:54 PM
To make the table a little more evil, how about something like that...
Dim vario1
Dim vario2
Sub ExitLeftHole
min =143
max =145
vario1=(Int((max-min+1)*Rnd+min))
min =15
max =22
vario2=(Int((max-min+1)*Rnd+min))
PlaySoundAt SoundFXDOF("fx_kicker", 111, DOFPulse, DOFContactors), LeftHole
LeftHole.kick vario1, vario2
End Sub
Sub ExitCenterHole
min =163
max =165
vario1=(Int((max-min+1)*Rnd+min))
min =15
max =22
vario2=(Int((max-min+1)*Rnd+min))
PlaySoundAt SoundFXDOF("fx_kicker", 112, DOFPulse, DOFContactors), LeftHole
CenterHole.kick vario1, vario2
End Sub
Sub ExitRightHole
min =209
max =211
vario1=(Int((max-min+1)*Rnd+min))
min =15
max =22
vario2=(Int((max-min+1)*Rnd+min))
PlaySoundAt SoundFXDOF("fx_kicker", 113, DOFPulse, DOFContactors), RightHole
RightHole.kick vario1, vario2
End Sub
#31
Posted 07 December 2021 - 08:12 PM
Actually just wanted to say a quick thank you for the new creation.
Unfortunately i have a little problem and i don't know if it's because of my beta Vpx10.7 version.
The ball is very fast and moves partly like a rubber ball.
Any idea what I need to set differently?
I do not have this problem with other tables.
After watching akiles50000 video I know what bothered me a bit about the ball behavior.
In the area of the red circle the ball goes to the flippers (in the video)
In the area of the red circle the ball goes with much speed into the upper playing field (in Vpx)
But the longer I play this beautiful table the less that bothers me
#32
Posted 08 December 2021 - 12:06 PM
Luck Smile seems a very generous design though, is it really correct that every "special" hit results in a free game?
In the 8 minute video posted here only one special light is lit. Indeed had the original machine an "alternating special relay". At least that would make it harder to get sometimes almost 10 free games per ball. I haven't found out yet if there were a limitation to one "Special" per ball.
#34
Posted 17 October 2022 - 12:13 PM
UPDATE
4.0.0 Updated 17.10.2022
- Updated to my VPX7 physics
- Updated my mechanical set of sounds to a more "under the glass" sound.
- Some small script updates, like the Rolling sound and PlaySoundAt routines.
- cleaned up and deleted unused graphics & reduced the size of the table
- Added my VPX7 LUT changer to darken the table (hold down LEFT CTRL while change with RIGHT CTRL).
- Changed the Environment image to enhance a little the object shadows.
- Made the light inserts warmer.
If you want to check my latest uploads then click on the image below:
Next table? A tribute table to Stern's Foo Fighters
#35
Posted 16 June 2024 - 12:47 PM
It doesn't seem like Outthere's DOF info was ever added to the Table Configs - when I go to view them, every entry is blank.
I did notice that his DOF setup for this table is very similar (but not exact) to what he used for Little Chief.
What I've done is I've directed the table to the "Little Chief" table config (this hopefully was done in a way that shouldn't impact high scores!)
I also made a few adjustments in the table script itself, so that way the kicker assignments match how it was done in Little Chief. Basically, I redirected the 3 kickers to the middle solenoid and the bonus kicker to the right bumper solenoid. This seems to have the desired feedback.
Just copy and paste this into jpsalas's version 4 of the 4 player table and you will have working DOF
' ***********************************************************************
' VISUAL PINBALL X EM Script by JPSalas
' Basic EM script up to 4 players
' uses core.vbs for extra functions
' Luck Smile / IPD No. 3886 / INDER 1976 / 4 Players
' ***********************************************************************
'DOF Config by Outhere
'101 Left Flipper
'102 Right Flipper
'103 Left Slingshot
'104
'105 Right Slingshot
'106
'107 Bumper Left
'108
'109 Bumper Right
'110 Ball Release
'111 kicker Left Hole
'111 kicker Center Hole
'111 kicker Right Hole
'109 Kicker Bonus
'115 Chimes
'116 Chimes
'117 Chimes
'118 Chimes
'119 Bell
Option Explicit
Randomize
' core.vbs constants
Const BallSize = 50 ' 50 is the normal size
Const BallMass = 1 ' 1 is the normal ball mass.
' load extra vbs files
LoadCoreFiles
Sub LoadCoreFiles
On Error Resume Next
ExecuteGlobal GetTextFile("core.vbs")
If Err Then MsgBox "Can't open core.vbs"
On Error Resume Next
ExecuteGlobal GetTextFile("controller.vbs")
If Err Then MsgBox "Can't open controller.vbs"
End Sub
' Valores Constants
Const cGameName = "littlechief_lucksmile4" ' B2S name
Const MaxPlayers = 4 ' 1 to 4 can play
Const MaxMultiplier = 3 ' limit bonus multiplier
Const BallsPerGame = 3 ' 3 or 5
Const FreePlay = False ' Free play or coins
Const Special1 = 690000 ' extra ball or credit
Const Special2 = 920000
'Const Special3 = 920000
' Global variables
Dim PlayersPlayingGame
Dim CurrentPlayer
Dim Credits
Dim Bonus
Dim BallsRemaining(4)
Dim BonusMultiplier
Dim ExtraBallsAwards(4)
Dim Special1Awarded(4)
Dim Special2Awarded(4)
'Dim Special3Awarded(4)
Dim Score(4)
Dim HighScore
Dim Match
Dim Tilt
Dim TiltSensitivity
Dim Tilted
Dim Add10
Dim Add100
Dim Add1000
Dim Add10000
Dim x
' Control variables
Dim BallsOnPlayfield
' Boolean variables
Dim bAttractMode
Dim bFreePlay
Dim bGameInPlay
Dim bOnTheFirstBall
Dim bExtraBallWonThisBall
Dim bJustStarted
Dim bBallInPlungerLane
Dim bBallSaverActive
' core.vbs variables
' *********************************************************************
' Common rutines to all the tables
' *********************************************************************
Sub Table1_Init()
Dim x
' Init som objects, like walls, targets
VPObjects_Init
LoadEM
' load highscore
Loadhs
ScoreReel1.SetValue HSScore(1)
If B2SOn then
Controller.B2SSetScorePlayer 1, HSScore(1)
End If
UpdateCredits
' init all the global variables
bFreePlay = FreePlay
bAttractMode = False
bOnTheFirstBall = False
bGameInPlay = False
bBallInPlungerLane = False
BallsOnPlayfield = 0
Tilt = 0
TiltSensitivity = 6
Tilted = False
Match = 0
bJustStarted = True
Add10 = 0
Add100 = 0
Add1000 = 0
' setup table in game over mode
EndOfGame
'turn on GI lights
vpmtimer.addtimer 1000, "GiOn '"
' Remove desktop items in FS mode
If Table1.ShowDT then
For each x in aReels
x.Visible = 1
Next
Else
For each x in aReels
x.Visible = 0
Next
End If
' Start the RealTime timer
RealTime.Enabled = 1
' Load table color
LoadLut
End Sub
'******
' Keys
'******
Sub Table1_KeyDown(ByVal Keycode)
If EnteringInitials then
CollectInitials(keycode)
Exit Sub
End If
If keycode = LeftMagnaSave Then bLutActive = True: Lutbox.text = "level of darkness " & LUTImage + 1
If keycode = RightMagnaSave Then
If bLutActive Then NextLUT:End If
End If
' add coins
If Keycode = AddCreditKey Then
If(Tilted = False)Then
AddCredits 1
PlaySound "fx_coin"
End If
End If
' plunger
If keycode = PlungerKey Then
Plunger.Pullback
PlaySoundAt "fx_plungerpull", plunger
End If
' tilt keys
If keycode = LeftTiltKey Then Nudge 90, 8:PlaySound "fx_nudge", 0, 1, -0.1, 0.25:CheckTilt
If keycode = RightTiltKey Then Nudge 270, 8:PlaySound "fx_nudge", 0, 1, 0.1, 0.25:CheckTilt
If keycode = CenterTiltKey Then Nudge 0, 9:PlaySound "fx_nudge", 0, 1, 1, 0.25:CheckTilt
' keys during game
If bGameInPlay AND NOT Tilted Then
If keycode = LeftFlipperKey Then SolLFlipper 1
If keycode = RightFlipperKey Then SolRFlipper 1
If keycode = StartGameKey Then
If((PlayersPlayingGame <MaxPlayers)AND(bOnTheFirstBall = True))Then
If(bFreePlay = True)Then
PlayersPlayingGame = PlayersPlayingGame + 1
UpdatePlayersPlaying
'PlaySound "so_fanfare1"
Else
If(Credits> 0)then
PlayersPlayingGame = PlayersPlayingGame + 1
Credits = Credits - 1
UpdateCredits
UpdateBallInPlay
UpdatePlayersPlaying
Else
' Not Enough Credits to start a game.
'PlaySound "so_nocredits"
End If
End If
End If
End If
Else
If keycode = StartGameKey Then
If(bFreePlay = True)Then
If(BallsOnPlayfield = 0)Then
ResetScores
ResetForNewGame()
End If
Else
If(Credits> 0)Then
If(BallsOnPlayfield = 0)Then
Credits = Credits - 1
UpdateCredits
ResetScores
ResetForNewGame()
End If
Else
' Not Enough Credits to start a game.
'PlaySound "so_nocredits"
End If
End If
End If
End If ' If (GameInPlay)
End Sub
Sub Table1_KeyUp(ByVal keycode)
If EnteringInitials then
Exit Sub
End If
If keycode = LeftMagnaSave Then bLutActive = False: LutBox.text = ""
If bGameInPlay AND NOT Tilted Then
' teclas de los flipers
If keycode = LeftFlipperKey Then SolLFlipper 0
If keycode = RightFlipperKey Then SolRFlipper 0
End If
If keycode = PlungerKey Then
Plunger.Fire
If bBallInPlungerLane Then
PlaySoundAt "fx_plunger", plunger
Else
PlaySoundAt "fx_plunger_empty", plunger
End If
End If
End Sub
'******************
' Table stop/pause
'******************
Sub table1_Paused
End Sub
Sub table1_unPaused
End Sub
Sub table1_Exit
Savehs
'Controller.Stop
End Sub
'********************
' Flippers
'********************
Sub SolLFlipper(Enabled)
If Enabled Then
PlaySoundAt SoundFXDOF("fx_flipperup", 101, DOFOn, DOFFlippers), LeftFlipper
LeftFlipper.EOSTorque = 0.65:LeftFlipper.RotateToEnd
Else
PlaySoundAt SoundFXDOF("fx_flipperdown", 101, DOFOff, DOFFlippers), LeftFlipper
LeftFlipper.EOSTorque = 0.15:LeftFlipper.RotateToStart
End If
End Sub
Sub SolRFlipper(Enabled)
If Enabled Then
PlaySoundAt SoundFXDOF("fx_flipperup", 102, DOFOn, DOFFlippers), RightFlipper
RightFlipper.EOSTorque = 0.65:RightFlipper.RotateToEnd
Else
PlaySoundAt SoundFXDOF("fx_flipperdown", 102, DOFOff, DOFFlippers), RightFlipper
RightFlipper.EOSTorque = 0.15:RightFlipper.RotateToStart
End If
End Sub
' flippers hit Sound
Sub LeftFlipper_Collide(parm)
PlaySound "fx_rubber_flipper", 0, Vol(ActiveBall), pan(ActiveBall), 0.2, 0, 0, 0, AudioFade(ActiveBall)
End Sub
Sub RightFlipper_Collide(parm)
PlaySound "fx_rubber_flipper", 0, Vol(ActiveBall), pan(ActiveBall), 0.2, 0, 0, 0, AudioFade(ActiveBall)
End Sub
'***********
' GI lights
'***********
Sub GiOn
Dim bulb
PlaySound"fx_gion"
For each bulb in aGiLights
bulb.State = 1
Next
End Sub
Sub GiOff
Dim bulb
PlaySound"fx_gioff"
For each bulb in aGiLights
bulb.State = 0
Next
End Sub
'**************
' TILT
'**************
Sub CheckTilt
Tilt = Tilt + TiltSensitivity
TiltDecreaseTimer.Enabled = True
If Tilt> 15 Then
Tilted = True
TiltReel.SetValue 1
If B2SOn then
Controller.B2SSetTilt 1
end if
DisableTable True
' BallsRemaining(CurrentPlayer) = 0 'player looses the game
TiltRecoveryTimer.Enabled = True 'wait for all the balls to drain
End If
End Sub
Sub TiltDecreaseTimer_Timer
If Tilt> 0 Then
Tilt = Tilt - 0.1
Else
TiltDecreaseTimer.Enabled = False
End If
End Sub
Sub DisableTable(Enabled)
If Enabled Then
GiOff
LeftFlipper.RotateToStart
RightFlipper.RotateToStart
Bumper001.Threshold = 100
Bumper002.Threshold = 100
LeftSlingshot.Disabled = 1
RightSlingshot.Disabled = 1
Else
GiOn
Bumper001.Threshold = 1
Bumper002.Threshold = 1
LeftSlingshot.Disabled = 0
RightSlingshot.Disabled = 0
End If
End Sub
Sub TiltRecoveryTimer_Timer()
' all the balls have drained
If(BallsOnPlayfield = 0)Then
EndOfBall()
TiltRecoveryTimer.Enabled = False
End If
' otherwise repeat
End Sub
'***************************************************************
' Supporting Ball & Sound Functions v4.0
'***************************************************************
Dim TableWidth, TableHeight
TableWidth = Table1.width
TableHeight = Table1.height
Function Vol(ball) ' Calculates the Volume of the sound based on the ball speed
Vol = Csng(BallVel(ball) ^2 / 2000)
End Function
Function Pan(ball) ' Calculates the pan for a ball based on the X position on the table. "table1" is the name of the table
Dim tmp
tmp = ball.x * 2 / TableWidth-1
If tmp > 0 Then
Pan = Csng(tmp ^10)
Else
Pan = Csng(-((- tmp) ^10))
End If
End Function
Function Pitch(ball) ' Calculates the pitch of the sound based on the ball speed
Pitch = BallVel(ball) * 20
End Function
Function BallVel(ball) 'Calculates the ball speed
BallVel = (SQR((ball.VelX ^2) + (ball.VelY ^2)))
End Function
Function AudioFade(ball) 'only on VPX 10.4 and newer
Dim tmp
tmp = ball.y * 2 / TableHeight-1
If tmp > 0 Then
AudioFade = Csng(tmp ^10)
Else
AudioFade = Csng(-((- tmp) ^10))
End If
End Function
Sub PlaySoundAt(soundname, tableobj) 'play sound at X and Y position of an object, mostly bumpers, flippers and other fast objects
PlaySound soundname, 0, 1, Pan(tableobj), 0.2, 0, 0, 0, AudioFade(tableobj)
End Sub
Sub PlaySoundAtBall(soundname) ' play a sound at the ball position, like rubbers, targets, metals, plastics
PlaySound soundname, 0, Vol(ActiveBall), pan(ActiveBall), 0.2, Pitch(ActiveBall) * 10, 0, 0, AudioFade(ActiveBall)
End Sub
Function RndNbr(n) 'returns a random number between 1 and n
Randomize timer
RndNbr = Int((n * Rnd) + 1)
End Function
'***********************************************
' JP's VP10 Rolling Sounds + Ballshadow v4.0
' uses a collection of shadows, aBallShadow
'***********************************************
Const tnob = 19 'total number of balls
Const lob = 0 'number of locked balls
Const maxvel = 34 'max ball velocity
ReDim rolling(tnob)
InitRolling
Sub InitRolling
Dim i
For i = 0 to tnob
rolling(i) = False
Next
End Sub
Sub RollingUpdate()
Dim BOT, b, ballpitch, ballvol, speedfactorx, speedfactory
BOT = GetBalls
' stop the sound of deleted balls
For b = UBound(BOT) + 1 to tnob
rolling(b) = False
StopSound("fx_ballrolling" & b)
aBallShadow(b).Y = 3000
Next
' exit the sub if no balls on the table
If UBound(BOT) = lob - 1 Then Exit Sub 'there no extra balls on this table
' play the rolling sound for each ball and draw the shadow
For b = lob to UBound(BOT)
aBallShadow(b).X = BOT(b).X
aBallShadow(b).Y = BOT(b).Y
aBallShadow(b).Height = BOT(b).Z -Ballsize/2
If BallVel(BOT(b))> 1 Then
If BOT(b).z <30 Then
ballpitch = Pitch(BOT(b))
ballvol = Vol(BOT(b))
Else
ballpitch = Pitch(BOT(b)) + 50000 'increase the pitch on a ramp
ballvol = Vol(BOT(b)) * 10
End If
rolling(b) = True
PlaySound("fx_ballrolling" & b), -1, ballvol, Pan(BOT(b)), 0, ballpitch, 1, 0, AudioFade(BOT(b))
Else
If rolling(b) = True Then
StopSound("fx_ballrolling" & b)
rolling(b) = False
End If
End If
' rothbauerw's Dropping Sounds
If BOT(b).VelZ <-1 and BOT(b).z <55 and BOT(b).z> 27 Then 'height adjust for ball drop sounds
PlaySound "fx_balldrop", 0, ABS(BOT(b).velz) / 17, Pan(BOT(b)), 0, Pitch(BOT(b)), 1, 0, AudioFade(BOT(b))
End If
' jps ball speed control
If BOT(b).VelX AND BOT(b).VelY <> 0 Then
speedfactorx = ABS(maxvel / BOT(b).VelX)
speedfactory = ABS(maxvel / BOT(b).VelY)
If speedfactorx <1 Then
BOT(b).VelX = BOT(b).VelX * speedfactorx
BOT(b).VelY = BOT(b).VelY * speedfactorx
End If
If speedfactory <1 Then
BOT(b).VelX = BOT(b).VelX * speedfactory
BOT(b).VelY = BOT(b).VelY * speedfactory
End If
End If
Next
End Sub
'*****************************
' Ball 2 Ball Collision Sound
'*****************************
Sub OnBallBallCollision(ball1, ball2, velocity)
PlaySound("fx_collide"), 0, Csng(velocity) ^2 / 2000, Pan(ball1), 0, Pitch(ball1), 0, 0, AudioFade(ball1)
End Sub
'************************************
' Diverse Collection Hit Sounds v3.0
'************************************
Sub aMetals_Hit(idx):PlaySoundAtBall "fx_MetalHit":End Sub
Sub aMetalWires_Hit(idx):PlaySoundAtBall "fx_MetalWire":End Sub
Sub aRubber_Bands_Hit(idx):PlaySoundAtBall "fx_rubber_band":End Sub
Sub aRubber_LongBands_Hit(idx):PlaySoundAtBall "fx_rubber_longband":End Sub
Sub aRubber_Posts_Hit(idx):PlaySoundAtBall "fx_rubber_post":End Sub
Sub aRubber_Pins_Hit(idx):PlaySoundAtBall "fx_rubber_pin":End Sub
Sub aRubber_Pegs_Hit(idx):PlaySoundAtBall "fx_rubber_peg":End Sub
Sub aPlastics_Hit(idx):PlaySoundAtBall "fx_PlasticHit":End Sub
Sub aGates_Hit(idx):PlaySoundAtBall "fx_Gate":End Sub
Sub aWoods_Hit(idx):PlaySoundAtBall "fx_Woodhit":End Sub
'************************************************************************************************************************
' Only for VPX 10.2 and higher.
' FlashForMs will blink light or a flasher for TotalPeriod(ms) at rate of BlinkPeriod(ms)
' When TotalPeriod done, light or flasher will be set to FinalState value where
' Final State values are: 0=Off, 1=On, 2=Return to previous State
'************************************************************************************************************************
Sub FlashForMs(MyLight, TotalPeriod, BlinkPeriod, FinalState)
If TypeName(MyLight) = "Light" Then
If FinalState = 2 Then
FinalState = MyLight.State
End If
MyLight.BlinkInterval = BlinkPeriod
MyLight.Duration 2, TotalPeriod, FinalState
ElseIf TypeName(MyLight) = "Flasher" Then
Dim steps
steps = Int(TotalPeriod / BlinkPeriod + .5)
If FinalState = 2 Then
FinalState = ABS(MyLight.Visible)
End If
MyLight.UserValue = steps * 10 + FinalState
MyLight.TimerInterval = BlinkPeriod
MyLight.TimerEnabled = 0
MyLight.TimerEnabled = 1
ExecuteGlobal "Sub " & MyLight.Name & "_Timer:" & "Dim tmp, steps, fstate:tmp=me.UserValue:fstate = tmp MOD 10:steps= tmp\10 -1:Me.Visible = steps MOD 2:me.UserValue = steps *10 + fstate:If Steps = 0 then Me.Visible = fstate:Me.TimerEnabled=0:End if:End Sub"
End If
End Sub
'****************************************
' Init table for a new game
'****************************************
Sub ResetForNewGame()
'debug.print "ResetForNewGame"
Dim i
bGameInPLay = True
bBallSaverActive = False
StopAttractMode
If B2SOn then
Controller.B2SSetGameOver 0
end if
GiOn
CurrentPlayer = 1
PlayersPlayingGame = 1
UpdatePlayersPlaying
bOnTheFirstBall = True
For i = 1 To MaxPlayers
Score(i) = 0
ExtraBallsAwards(i) = 0
Special1Awarded(i) = False
Special2Awarded(i) = False
'Special3Awarded(i) = False
BallsRemaining(i) = BallsPerGame
Next
BonusMultiplier = 1
Bonus = 0
UpdateBallInPlay
Clear_Match
' init other variables
Tilt = 0
' init game variables
Game_Init()
' start a music?
' first ball
vpmtimer.addtimer 2000, "FirstBall '"
End Sub
Sub FirstBall
'debug.print "FirstBall"
' reset table for a new ball, rise droptargets ++
ResetForNewPlayerBall()
CreateNewBall()
End Sub
' (Re-)init table for a new ball or player
Sub ResetForNewPlayerBall()
'debug.print "ResetForNewPlayerBall"
AddScore 0
' reset multiplier to 1x
' turn on lights, and variables
bExtraBallWonThisBall = False
ResetNewBallLights
ResetNewBallVariables
End Sub
' Crete new ball
Sub CreateNewBall()
BallRelease.CreateSizedBallWithMass BallSize / 2, BallMass
BallsOnPlayfield = BallsOnPlayfield + 1
UpdateBallInPlay
UpdateCurrentPlayer
PlaySoundAt SoundFXDOF("fx_Ballrel", 110, DOFPulse, DOFContactors), BallRelease
BallRelease.Kick 90, 4
End Sub
' player lost the ball
Sub EndOfBall()
'debug.print "EndOfBall"
' Lost the first ball, now it cannot accept more players
bOnTheFirstBall = False
'No bonus count in this table
' StartBonusCount
vpmtimer.addtimer 400, "EndOfBall2 '"
End Sub
' After bonus count go to the next step
'
Sub EndOfBall2()
'debug.print "EndOfBall2"
Tilted = False
Tilt = 0
TiltReel.SetValue 0
If B2SOn then
Controller.B2SSetTilt 0
end if
DisableTable False
' win extra ball?
If(ExtraBallsAwards(CurrentPlayer)> 0)Then
'debug.print "Extra Ball"
' if so then give it
ExtraBallsAwards(CurrentPlayer) = ExtraBallsAwards(CurrentPlayer)- 1
' turn off light if no more extra balls
If(ExtraBallsAwards(CurrentPlayer) = 0)Then
XtraBall.SetValue 0
If B2SOn then
Controller.B2SSetShootAgain 0
End If
End If
' extra ball sound?
' reset as in a new ball
ResetForNewPlayerBall()
CreateNewBall()
Else ' no extra ball
BallsRemaining(CurrentPlayer) = BallsRemaining(CurrentPlayer)- 1
' last ball?
If(BallsRemaining(CurrentPlayer) <= 0)Then
CheckHighScore()
End If
' this is not the last ball, chack for new player
EndOfBallComplete()
End If
End Sub
Sub EndOfBallComplete()
'debug.print "EndOfBallComplete"
Dim NextPlayer
' other players?
If(PlayersPlayingGame> 1)Then
NextPlayer = CurrentPlayer + 1
' if it is the last player then go to the first one
If(NextPlayer> PlayersPlayingGame)Then
NextPlayer = 1
End If
Else
NextPlayer = CurrentPlayer
End If
'debug.print "Next Player = " & NextPlayer
' end of game?
If((BallsRemaining(CurrentPlayer) <= 0)AND(BallsRemaining(NextPlayer) <= 0))Then
' match if playing with coins
If bFreePlay = False Then
Verification_Match
End If
' end of game
EndOfGame()
Else
' next player
CurrentPlayer = NextPlayer
' update score
AddScore 0
' reset table for new player
ResetForNewPlayerBall()
CreateNewBall()
End If
End Sub
' Called at the end of the game
Sub EndOfGame()
'debug.print "EndOfGame"
bGameInPLay = False
bJustStarted = False
GameOverR.SetValue 1
If B2SOn then
Controller.B2SSetGameOver 1
Controller.B2SSetBallInPlay 0
Controller.B2SSetPlayerUp 0
Controller.B2SSetCanPlay 0
end if
' turn off flippers
SolLFlipper 0
SolRFlipper 0
' start the attract mode
StartAttractMode
End Sub
' Fuction to calculate the balls left
Function Balls
Dim tmp
tmp = BallsPerGame - BallsRemaining(CurrentPlayer) + 1
If tmp> BallsPerGame Then
Balls = BallsPerGame
Else
Balls = tmp
End If
End Function
'******************
' Match
'******************
Sub Verification_Match()
PlaySound "fx_match"
Match = INT(RND(1) * 10) * 10 ' random between 10 and 90
Display_Match
If(Score(CurrentPlayer)MOD 100) = Match Then
PlaySound "fx_knocker"
AddCredits 1
End If
End Sub
Sub Clear_Match()
MatchReel.SetValue 10 'this is ¿?
MatchReel2.SetValue 10
If B2SOn then
Controller.B2SSetMatch 10
end if
End Sub
Sub Display_Match()
MatchReel.SetValue(Match \ 11) + 1
MatchReel2.SetValue(Match \ 11) + 1
If B2SOn then
If Match = 0 then
Controller.B2SSetMatch 100
else
Controller.B2SSetMatch Match
end if
end if
End Sub
' *********************************************************************
' Drain / Plunger Functions
' *********************************************************************
Sub Drain_Hit()
Drain.DestroyBall
BallsOnPlayfield = BallsOnPlayfield - 1
PlaySoundAt "fx_drain", Drain
'tilted?
If Tilted Then
StopEndOfBallMode
End If
' if still playing and not tilted
If(bGameInPLay = True)AND(Tilted = False)Then
' ballsaver?
If(bBallSaverActive = True)Then
CreateNewBall()
Else
' last ball?
If(BallsOnPlayfield = 0)Then
StopEndOfBallMode
vpmtimer.addtimer 500, "EndOfBall '"
Exit Sub
End If
End If
End If
End Sub
Sub swPlungerRest_Hit()
bBallInPlungerLane = True
End Sub
Sub swPlungerRest_UnHit()
bBallInPlungerLane = False
End Sub
' ****************************************
' Score functions
' ****************************************
Sub AddScore(Points)
If Tilted Then Exit Sub
Select Case Points
Case 10, 100, 1000, 10000
Score(CurrentPlayer) = Score(CurrentPlayer) + points
UpdateScore points
' sounds
If Points = 1000 AND(Score(CurrentPlayer)MOD 10000) \ 1000 = 0 Then 'new reel 10000
PlaySound SoundFXDOF("bell10000", 115, DOFPulse, DOFChimes)
ElseIf Points = 100 AND(Score(CurrentPlayer)MOD 1000) \ 100 = 0 Then 'new reel 1000
PlaySound SoundFXDOF("bell1000", 116, DOFPulse, DOFChimes)
ElseIf Points = 10 AND(Score(CurrentPlayer)MOD 100) \ 10 = 0 Then 'new reel 100
PlaySound SoundFXDOF("bell100", 117, DOFPulse, DOFChimes)
Else
PlaySound SoundFXDOF("bell", 118, DOFPulse, DOFChimes) &Points
End If
Case 20, 30, 40, 50, 60, 70, 80, 90
Add10 = Add10 + Points \ 10
AddScore10Timer.Enabled = TRUE
Case 200, 300, 400, 500, 600, 700, 800, 900
Add100 = Add100 + Points \ 100
AddScore100Timer.Enabled = TRUE
Case 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000
Add1000 = Add1000 + Points \ 1000
AddScore1000Timer.Enabled = TRUE
Case 20000, 30000, 40000, 50000, 60000, 70000, 80000, 90000
Add10000 = Add10000 + Points \ 10000
AddScore10000Timer.Enabled = TRUE
End Select
' check for higher score and specials
If Score(CurrentPlayer) >= Special1 AND Special1Awarded(CurrentPlayer) = False Then
AwardSpecial
Special1Awarded(CurrentPlayer) = True
End If
If Score(CurrentPlayer) >= Special2 AND Special2Awarded(CurrentPlayer) = False Then
AwardSpecial
Special2Awarded(CurrentPlayer) = True
End If
' If Score(CurrentPlayer) >= Special3 AND Special3Awarded(CurrentPlayer) = False Then
' AwardSpecial
' Special3Awarded(CurrentPlayer) = True
' End If
End Sub
'************************************
' Score sound Timers
'************************************
Sub AddScore10Timer_Timer()
if Add10> 0 then
AddScore 10
Add10 = Add10 - 1
Else
Me.Enabled = FALSE
End If
End Sub
Sub AddScore100Timer_Timer()
if Add100> 0 then
AddScore 100
Add100 = Add100 - 1
Else
Me.Enabled = FALSE
End If
End Sub
Sub AddScore1000Timer_Timer()
if Add1000> 0 then
AddScore 1000
Add1000 = Add1000 - 1
Else
Me.Enabled = FALSE
End If
End Sub
Sub AddScore10000Timer_Timer()
if Add10000> 0 then
AddScore 10000
Add10000 = Add10000 - 1
Else
Me.Enabled = FALSE
End If
End Sub
'*******************
' BONUS
'*******************
Sub AddBonus(bonuspoints)
If(Tilted = False)Then
Bonus = Bonus + bonuspoints
'PlaySound "Bell2"
If Bonus> 10 Then
Bonus = 10
End If
UpdateBonusLights
End if
End Sub
Sub AddBonusMultiplier(multi)
If(Tilted = False)Then
BonusMultiplier = BonusMultiplier + multi
If BonusMultiplier> MaxMultiplier Then
BonusMultiplier = MaxMultiplier
End If
UpdateMultiplierLights
End if
End Sub
Sub UpdateMultiplierLights
Select Case BonusMultiplier
'Case 1:li2.State = 1:li3.State = 0:li4.State = 0
'Case 2:li2.State = 0:li3.State = 1:li4.State = 0
'Case 3:li2.State = 0:li3.State = 0:li4.State = 1
End Select
End Sub
Sub StartBonusCount
' prevent the ball from draining
Post2.IsDropped = 0
Select Case BonusMultiplier
Case 1:BonusCountTimer.Interval = 250
Case 2:BonusCountTimer.Interval = 400
Case 3:BonusCountTimer.Interval = 650
End Select
BonusCountTimer.Enabled = 1
End Sub
Sub BonusCountTimer_Timer
'debug.print "BonusCount_Timer"
If Bonus> 0 Then
Bonus = Bonus -1
AddScore 10000 * BonusMultiplier
UpdateBonusLights
Else
BonusCountTimer.Enabled = 0
'Enable the drain again
Post2.IsDropped = 1
'set bonus to 1
Addbonus 1
If BallinBonusKicker Then
vpmtimer.addtimer 1000, "BonusKickOut '"
End If
'vpmtimer.addtimer 1000, "EndOfBall2 '"
End If
End Sub
Sub UpdateBonusLights
Select Case Bonus
Case 0:bl1.State = 0:bl2.State = 0:bl3.State = 0:bl4.State = 0:bl5.State = 0:bl6.State = 0:bl7.State = 0:bl8.State = 0:bl9.State = 0:bl10.State = 0
Case 1:bl1.State = 1:bl2.State = 0:bl3.State = 0:bl4.State = 0:bl5.State = 0:bl6.State = 0:bl7.State = 0:bl8.State = 0:bl9.State = 0:bl10.State = 0
Case 2:bl1.State = 0:bl2.State = 1:bl3.State = 0:bl4.State = 0:bl5.State = 0:bl6.State = 0:bl7.State = 0:bl8.State = 0:bl9.State = 0:bl10.State = 0
Case 3:bl1.State = 0:bl2.State = 0:bl3.State = 1:bl4.State = 0:bl5.State = 0:bl6.State = 0:bl7.State = 0:bl8.State = 0:bl9.State = 0:bl10.State = 0
Case 4:bl1.State = 0:bl2.State = 0:bl3.State = 0:bl4.State = 1:bl5.State = 0:bl6.State = 0:bl7.State = 0:bl8.State = 0:bl9.State = 0:bl10.State = 0
Case 5:bl1.State = 0:bl2.State = 0:bl3.State = 0:bl4.State = 0:bl5.State = 1:bl6.State = 0:bl7.State = 0:bl8.State = 0:bl9.State = 0:bl10.State = 0
Case 6:bl1.State = 0:bl2.State = 0:bl3.State = 0:bl4.State = 0:bl5.State = 0:bl6.State = 1:bl7.State = 0:bl8.State = 0:bl9.State = 0:bl10.State = 0
Case 7:bl1.State = 0:bl2.State = 0:bl3.State = 0:bl4.State = 0:bl5.State = 0:bl6.State = 0:bl7.State = 1:bl8.State = 0:bl9.State = 0:bl10.State = 0
Case 8:bl1.State = 0:bl2.State = 0:bl3.State = 0:bl4.State = 0:bl5.State = 0:bl6.State = 0:bl7.State = 0:bl8.State = 1:bl9.State = 0:bl10.State = 0
Case 9:bl1.State = 0:bl2.State = 0:bl3.State = 0:bl4.State = 0:bl5.State = 0:bl6.State = 0:bl7.State = 0:bl8.State = 0:bl9.State = 1:bl10.State = 0
Case 10:bl1.State = 0:bl2.State = 0:bl3.State = 0:bl4.State = 0:bl5.State = 0:bl6.State = 0:bl7.State = 0:bl8.State = 0:bl9.State = 0:bl10.State = 1
End Select
End Sub
'**********************************
' Score EM reels
'**********************************
Sub UpdateScore(playerpoints)
Select Case CurrentPlayer
Case 1:ScoreReel1.Addvalue playerpoints
Case 2:ScoreReel2.Addvalue playerpoints
Case 3:ScoreReel3.Addvalue playerpoints
Case 4:ScoreReel4.Addvalue playerpoints
End Select
If B2SOn then
Controller.B2SSetScorePlayer CurrentPlayer, Score(CurrentPlayer)
end if
End Sub
Sub ResetScores
ScoreReel1.ResetToZero
ScoreReel2.ResetToZero
ScoreReel3.ResetToZero
ScoreReel4.ResetToZero
If B2SOn then
Controller.B2SSetScorePlayer1 0
Controller.B2SSetScoreRolloverPlayer1 0
Controller.B2SSetScorePlayer2 0
Controller.B2SSetScoreRolloverPlayer2 0
Controller.B2SSetScorePlayer3 0
Controller.B2SSetScoreRolloverPlayer3 0
Controller.B2SSetScorePlayer4 0
Controller.B2SSetScoreRolloverPlayer4 0
end if
End Sub
Sub AddCredits(value) 'limit to 15 credits
If Credits <15 Then
Credits = Credits + value
CreditsReel.SetValue Credits
UpdateCredits
end if
End Sub
Sub UpdateCredits
PlaySound "fx_relay"
CreditsReel.SetValue credits
CreditsReel2.SetValue credits
If B2SOn then
Controller.B2SSetCredits Credits
end if
End Sub
Sub UpdateBallInPlay
Select Case Balls
Case 0:bip1.State = 0:bip2.State = 0:bip3.State = 0:bip4.State = 0:bip5.State = 0
Case 1:bip1.State = 1:bip2.State = 0:bip3.State = 0:bip4.State = 0:bip5.State = 0
Case 2:bip1.State = 0:bip2.State = 1:bip3.State = 0:bip4.State = 0:bip5.State = 0
Case 3:bip1.State = 0:bip2.State = 0:bip3.State = 1:bip4.State = 0:bip5.State = 0
Case 4:bip1.State = 0:bip2.State = 0:bip3.State = 0:bip4.State = 1:bip5.State = 0
Case 5:bip1.State = 0:bip2.State = 0:bip3.State = 0:bip4.State = 0:bip5.State = 1
End Select
If B2SOn then
Controller.B2SSetBallInPlay Balls
end if
End Sub
Sub UpdatePlayersPlaying
Select Case PlayersPlayingGame
Case 0:cp1.State = 0:cp2.State = 0:cp3.State = 0:cp4.State = 0
Case 1:cp1.State = 1:cp2.State = 0:cp3.State = 0:cp4.State = 0
Case 2:cp1.State = 1:cp2.State = 1:cp3.State = 0:cp4.State = 0
Case 3:cp1.State = 1:cp2.State = 1:cp3.State = 1:cp4.State = 0
Case 4:cp1.State = 1:cp2.State = 1:cp3.State = 1:cp4.State = 1
End Select
If B2SOn then
Controller.B2SSetCanPLay PlayersPlayingGame
end if
End Sub
Sub UpdateCurrentPlayer
Select Case CurrentPlayer
Case 0:pl1.State = 0:pl2.State = 0:pl3.State = 0:pl4.State = 0
Case 1:pl1.State = 1:pl2.State = 0:pl3.State = 0:pl4.State = 0
Case 2:pl1.State = 0:pl2.State = 1:pl3.State = 0:pl4.State = 0
Case 3:pl1.State = 0:pl2.State = 0:pl3.State = 1:pl4.State = 0
Case 4:pl1.State = 0:pl2.State = 0:pl3.State = 0:pl4.State = 1
End Select
If B2SOn then
Controller.B2SSetPLayerUp CurrentPlayer
end if
End Sub
'*************************
' Specials
'*************************
Sub AwardExtraBall()
If NOT bExtraBallWonThisBall Then
PlaySound "fx_knocker"
ExtraBallsAwards(CurrentPlayer) = ExtraBallsAwards(CurrentPlayer) + 1
bExtraBallWonThisBall = True
XtraBall.SetValue 1
Else
Addscore 5000
END If
End Sub
Sub AwardSpecial()
PlaySound "fx_knocker"
AddCredits 1
End Sub
Sub AwardAddaBall()
If BallsRemaining(CurrentPlayer) <11 Then
PlaySound "fx_knocker"
BallsRemaining(CurrentPlayer) = BallsRemaining(CurrentPlayer) + 1
UpdateBallInPlay
End If
End Sub
' ********************************
' Attract Mode
' ********************************
' use the"Blink Pattern" of each light
Sub StartAttractMode()
Dim x
bAttractMode = True
For each x in aLights
x.State = 2
Next
GameOverR.SetValue 1
'update current player and balls
End Sub
Sub StopAttractMode()
Dim x
bAttractMode = False
TurnOffPlayfieldLights
ResetScores
GameOverR.SetValue 0
End Sub
'*************************************
' Highscore Routines
' Based og Black's and GNMOD's code
'*************************************
Dim EnteringInitials
EnteringInitials = False
Dim SelectedChar ' character under the "cursor" when entering initials
Dim HSTimerCount: HSTimerCount = 0
Dim InitialString ' the string holding the player's initials as they're entered
Dim AlphaString: AlphaString = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_<"
Dim AlphaStringPos ' pointer to AlphaString, move Forward and backward with flipper keys
Dim HSNewHigh ' The new score to be recorded
Dim HSScore(5) ' High Scores read in from config file
Dim HSName(5) ' High Score Initials read in from config file
' default high scores
HSScore(1) = 250000
HSScore(2) = 240000
HSScore(3) = 230000
HSScore(4) = 220000
HSScore(5) = 210000
HSName(1) = "AAA"
HSName(2) = "ZZZ"
HSName(3) = "XXX"
HSName(4) = "ABC"
HSName(5) = "BBB"
' Load Highscores
Sub Loadhs
Dim FileObj
Dim ScoreFile, TextStr
Dim check0, x
Set FileObj = CreateObject("Scripting.FileSystemObject")
If Not FileObj.FolderExists(UserDirectory)then
Credits = 0
Exit Sub
End If
If Not FileObj.FileExists(UserDirectory & cGameName& ".txt")then
Credits = 0
Exit Sub
End If
Set ScoreFile = FileObj.GetFile(UserDirectory & cGameName& ".txt")
Set TextStr = ScoreFile.OpenAsTextStream(1, 0)
If(TextStr.AtEndOfStream = True)then
Exit Sub
End If
check0 = Int(textStr.readLine)
If check0 = 0 then
Credits = Int(textstr.readline)
For x = 1 to 5
HSScore(x) = Int(textstr.readline)
Next
For x = 1 to 5
HSName(x) = textstr.readline
Next
End If
TextStr.Close
Set ScoreFile = Nothing
Set FileObj = Nothing
SortHighscore 'added to fix a previous error
End Sub
' Save Highscores
Sub Savehs
Dim FileObj
Dim ScoreFile
Dim x
Set FileObj = CreateObject("Scripting.FileSystemObject")
If Not FileObj.FolderExists(UserDirectory)then
Exit Sub
End If
Set ScoreFile = FileObj.CreateTextFile(UserDirectory & cGameName& ".txt", True)
ScoreFile.WriteLine 0
ScoreFile.WriteLine Credits
For x = 1 to 5
scorefile.writeline HSScore(x)
Next
For x = 1 to 5
scorefile.writeline HSName(x)
Next
ScoreFile.Close
Set ScoreFile = Nothing
Set FileObj = Nothing
End Sub
' Sort Highscores
Sub SortHighscore
Dim tmp, tmp2, i, j
For i = 1 to 5
For j = 1 to 4
If HSScore(j) <HSScore(j + 1)Then
tmp = HSScore(j + 1)
tmp2 = HSName(j + 1)
HSScore(j + 1) = HSScore(j)
HSName(j + 1) = HSName(j)
HSScore(j) = tmp
HSName(j) = tmp2
End If
Next
Next
End Sub
' check for new highscore
Sub CheckHighscore
HighScoreTimer.Enabled = 1
'If Score(CurrentPlayer)> HSSCore(1)Then
' AwardSpecial
'End I
If Score(CurrentPlayer)> HSSCore(5)Then
NewHighScore Score(CurrentPlayer), CurrentPlayer
End If
End Sub
' Highscore Timer
Sub HighScoreTimer_Timer
If EnteringInitials then
SetHSLine 3, InitialString & MID(AlphaString, AlphaStringPos, 1)
ElseIf bGameInPlay then
SetHSLine 1, "HIGH SCORE"
SetHSLine 2, HSScore(1)
SetHSLine 3, HSName(1)
Me.Enabled = 0
Else
' cycle through high scores
SetHSLine 1, "HIGH SCORE" & (HSTimerCount + 1)
SetHSLine 2, HSScore(HSTimerCount + 1)
SetHSLine 3, HSName(HSTimerCount + 1)
HSTimerCount = (HSTimerCount + 1)MOD 5
End If
End Sub
' Enter Highscore initials
Function GetHSChar(String, Index)
Dim ThisChar
Dim FileName
ThisChar = Mid(String, Index, 1)
FileName = "PostIt"
If ThisChar = " " or ThisChar = "" then
FileName = FileName & "BL"
ElseIf ThisChar = "<" then
FileName = FileName & "LT"
ElseIf ThisChar = "_" then
FileName = FileName & "SP"
Else
FileName = FileName & ThisChar
End If
GetHSChar = FileName
End Function
Sub SetHsLine(LineNo, String)
Dim StrLen
Dim Index
Dim StartHSArray
Dim EndHSArray
Dim xFor
StartHSArray = array(0, 1, 12, 22)
EndHSArray = array(0, 11, 21, 31)
StrLen = len(string)
Index = 1
For xFor = StartHSArray(LineNo)to EndHSArray(LineNo)
Eval("HS" &xFor).imageA = GetHSChar(String, Index)
Index = Index + 1
Next
End Sub
Sub NewHighScore(NewScore, PlayNum)
If NewScore> HSScore(5)then
HighScoreTimer.interval = 500
AlphaStringPos = 1 ' start with first character "A"
EnteringInitials = true ' intercept the control keys while entering initials
InitialString = "" ' initials entered so far, initialize to empty
SetHSLine 1, "PLAYER " + FormatNumber(PlayNum, 0)
SetHSLine 2, "ENTER NAME"
SetHSLine 3, MID(AlphaString, AlphaStringPos, 1)
HSNewHigh = NewScore
End If
End Sub
Sub CollectInitials(keycode)
Dim i
If keycode = LeftFlipperKey Then
' back up to previous character
AlphaStringPos = AlphaStringPos - 1
If AlphaStringPos <1 then
AlphaStringPos = len(AlphaString) ' handle wrap from beginning to End
If InitialString = "" then
' Skip the backspace If there are no characters to backspace over
AlphaStringPos = AlphaStringPos - 1
End If
End If
SetHSLine 3, InitialString & MID(AlphaString, AlphaStringPos, 1)
PlaySound "fx_Previous"
ElseIf keycode = RightFlipperKey Then
' advance to Next character
AlphaStringPos = AlphaStringPos + 1
If AlphaStringPos> len(AlphaString)or(AlphaStringPos = len(AlphaString)and InitialString = "")then
' Skip the backspace If there are no characters to backspace over
AlphaStringPos = 1
End If
SetHSLine 3, InitialString & MID(AlphaString, AlphaStringPos, 1)
PlaySound "fx_Next"
ElseIf keycode = StartGameKey or keycode = PlungerKey Then
SelectedChar = MID(AlphaString, AlphaStringPos, 1)
If SelectedChar = "_" then
InitialString = InitialString & " "
PlaySound("fx_Esc")
ElseIf SelectedChar = "<" then
InitialString = MID(InitialString, 1, len(InitialString)- 1)
If len(InitialString) = 0 then
' If there are no more characters to back over, don't leave the < displayed
AlphaStringPos = 1
End If
PlaySound("fx_Esc")
Else
InitialString = InitialString & SelectedChar
PlaySound("fx_Enter")
End If
If len(InitialString) <3 then
SetHSLine 3, InitialString & SelectedChar
End If
End If
If len(InitialString) = 3 then
EnteringInitials = False
HSScore(5) = HSNewHigh
HSName(5) = InitialString
SortHighScore
HighScoreTimer.interval = 2000
End If
End Sub
'*******************
' Realtime updates
'*******************
Sub RealTime_Timer
RollingUpdate
LeftFlipperTop.RotZ = LeftFlipper.CurrentAngle
RightFlipperTop.RotZ = RightFlipper.CurrentAngle
End Sub
'***************************
' LUT - Darkness control
'***************************
Dim bLutActive, LUTImage
Sub LoadLUT
bLutActive = False
x = LoadValue(cGameName, "LUTImage")
If(x <> "")Then LUTImage = x Else LUTImage = 0
UpdateLUT
End Sub
Sub SaveLUT
SaveValue cGameName, "LUTImage", LUTImage
End Sub
Sub NextLUT:LUTImage = (LUTImage + 1)MOD 15:UpdateLUT:SaveLUT:Lutbox.text = "level of darkness " & LUTImage + 1:End Sub
Sub UpdateLUT
Select Case LutImage
Case 0:table1.ColorGradeImage = "LUT0":GiIntensity = 1:ChangeGIIntensity 1
Case 1:table1.ColorGradeImage = "LUT1":GiIntensity = 1.05:ChangeGIIntensity 1
Case 2:table1.ColorGradeImage = "LUT2":GiIntensity = 1.1:ChangeGIIntensity 1
Case 3:table1.ColorGradeImage = "LUT3":GiIntensity = 1.15:ChangeGIIntensity 1
Case 4:table1.ColorGradeImage = "LUT4":GiIntensity = 1.2:ChangeGIIntensity 1
Case 5:table1.ColorGradeImage = "LUT5":GiIntensity = 1.25:ChangeGIIntensity 1
Case 6:table1.ColorGradeImage = "LUT6":GiIntensity = 1.3:ChangeGIIntensity 1
Case 7:table1.ColorGradeImage = "LUT7":GiIntensity = 1.35:ChangeGIIntensity 1
Case 8:table1.ColorGradeImage = "LUT8":GiIntensity = 1.4:ChangeGIIntensity 1
Case 9:table1.ColorGradeImage = "LUT9":GiIntensity = 1.45:ChangeGIIntensity 1
Case 10:table1.ColorGradeImage = "LUT10":GiIntensity = 1.5:ChangeGIIntensity 1
Case 11:table1.ColorGradeImage = "LUT11":GiIntensity = 1.55:ChangeGIIntensity 1
Case 12:table1.ColorGradeImage = "LUT12":GiIntensity = 1.6:ChangeGIIntensity 1
Case 13:table1.ColorGradeImage = "LUT13":GiIntensity = 1.65:ChangeGIIntensity 1
Case 14:table1.ColorGradeImage = "LUT14":GiIntensity = 1.7:ChangeGIIntensity 1
End Select
End Sub
Dim GiIntensity
GiIntensity = 1 'used by the LUT changing to increase the GI lights when the table is darker
Sub ChangeGiIntensity(factor) 'changes the intensity scale
Dim bulb
For each bulb in aGiLights
bulb.IntensityScale = GiIntensity * factor
Next
End Sub
'***********************************************************************
' *********************************************************************
' ********* G A M E C O D E S T A R T S H E R E *********
' *********************************************************************
'***********************************************************************
Sub VPObjects_Init 'init objects
TurnOffPlayfieldLights()
DropPost
Post2.IsDropped = 1
End Sub
' Dim all the variables
Sub Game_Init() 'called at the start of a new game
'Start music?
'Init variables?
'Start or init timers
'Init lights?
TurnOffPlayfieldLights()
Bonus = 0
AddBonus 1
DropPost
End Sub
Sub StopEndOfBallMode() 'called when the last ball is drained
End Sub
Sub ResetNewBallVariables() 'init variables new ball/player
BonusMultiplier = 1
DropPost
End Sub
Sub ResetNewBallLights() 'init lights for new ball/player
TurnOffPlayfieldLights()
XtraBall.SetValue 0
li012.State = 1
li032.State = 1
li033.State = 1
li009.State = 1
li003.State = 1
li011.State = 1
li001.State = 1
End Sub
Sub TurnOffPlayfieldLights()
Dim a
For each a in aLights
a.State = 0
Next
End Sub
' *********************************************************************
' Table Object Hit Events
' *********************************************************************
' Any target hit Sub will do this:
' - play a sound
' - do some physical movement
' - add a score, bonus
' - check some variables/modes this trigger is a member of
' - set the "LastSwicthHit" variable in case it is needed later
' *********************************************************************
' Slingshots
Dim LStep, RStep
Sub LeftSlingShot_Slingshot
If Tilted Then Exit Sub
PlaySoundAt SoundFXDOF("fx_slingshot", 103, DOFPulse, DOFContactors), Lemk
LeftSling004.Visible = 1
Lemk.RotX = 26
LStep = 0
LeftSlingShot.TimerEnabled = True
' add points
AddScore 100
' some effect?
End Sub
Sub LeftSlingShot_Timer
Select Case LStep
Case 1:LeftSLing004.Visible = 0:LeftSLing003.Visible = 1:Lemk.RotX = 14
Case 2:LeftSLing003.Visible = 0:LeftSLing002.Visible = 1:Lemk.RotX = 2
Case 3:LeftSLing002.Visible = 0:Lemk.RotX = -20:LeftSlingShot.TimerEnabled = 0
End Select
LStep = LStep + 1
End Sub
Sub RightSlingShot_Slingshot
If Tilted Then Exit Sub
PlaySoundAt SoundFXDOF("fx_slingshot", 105, DOFPulse, DOFContactors), Remk
RightSling004.Visible = 1
Remk.RotX = 26
RStep = 0
RightSlingShot.TimerEnabled = True
' add points
AddScore 100
' add effect?
End Sub
Sub RightSlingShot_Timer
Select Case RStep
Case 1:RightSLing004.Visible = 0:RightSLing003.Visible = 1:Remk.RotX = 14
Case 2:RightSLing003.Visible = 0:RightSLing002.Visible = 1:Remk.RotX = 2
Case 3:RightSLing002.Visible = 0:Remk.RotX = -20:RightSlingShot.TimerEnabled = 0
End Select
RStep = RStep + 1
End Sub
'**************
' Rubbers
'**************
Sub rsband001_Hit
If Tilted then Exit Sub
AddScore 10
End Sub
Sub rsband002_Hit
If Tilted then Exit Sub
AddScore 10
End Sub
'*********
' Bumpers
'*********
Sub Bumper001_Hit
If Tilted Then Exit Sub
PlaySoundAt SoundFXDOF("fx_Bumper", 107, DOFPulse, DOFContactors), bumper001
AddScore 1000 + 9000 * LBumper1a.State
End Sub
Sub Bumper002_Hit
If Tilted Then Exit Sub
PlaySoundAt SoundFXDOF("fx_Bumper", 109, DOFPulse, DOFContactors), bumper002
AddScore 1000 + 9000 * LBumper2a.State
End Sub
Sub BumpersOn
LBumper1a.State = 1
LBumper1b.State = 1
LBumper2a.State = 1
LBumper2b.State = 1
End Sub
Sub BumpersOff
LBumper1a.State = 0
LBumper1b.State = 0
LBumper2a.State = 0
LBumper2b.State = 0
End Sub
'*****************
' Lanes
'*****************
' inlanes & outlanes
Sub Trigger001_Hit
PlaySoundAt "fx_sensor", Trigger001
If Tilted Then Exit Sub
AddScore 5000
If li002.State Then AwardExtraBall
End Sub
Sub Trigger002_Hit
PlaySoundAt "fx_sensor", Trigger002
If Tilted Then Exit Sub
AddScore 1000
AddBonus 1
BumpersOn
End Sub
Sub Trigger003_Hit
PlaySoundAt "fx_sensor", Trigger003
If Tilted Then Exit Sub
AddScore 5000
If li004.State Then AwardExtraBall
End Sub
Sub Trigger004_Hit
PlaySoundAt "fx_sensor", Trigger004
If Tilted Then Exit Sub
Post2.IsDropped = 0
StartBonusCount
End Sub
' top lanes
Sub Trigger005_Hit
PlaySoundAt "fx_sensor", Trigger005
If Tilted Then Exit Sub
AddScore 5000
BumpersOn
End Sub
Sub Trigger006_Hit
PlaySoundAt "fx_sensor", Trigger006
If Tilted Then Exit Sub
AddScore 500 + 4500 * li012.State
If li012.State Then
li010.State = 1
li009.State = 0
li012.State = 0
BonusMultiplier = 3
End If
End Sub
Sub Trigger007_Hit
PlaySoundAt "fx_sensor", Trigger007
If Tilted Then Exit Sub
AddScore 5000
End Sub
Sub Trigger008_Hit
PlaySoundAt "fx_sensor", Trigger008
If Tilted Then Exit Sub
AddScore 3000
AddBonus 3
End Sub
'************************
' Targets
'************************
Sub Target001_hit
PlaySoundAtBall "fx_target"
If Tilted Then Exit Sub
AddScore 10
BumpersOff
End Sub
Sub Target002_hit
PlaySoundAtBall "fx_target"
If Tilted Then Exit Sub
AddScore 10
BumpersOff
End Sub
Sub Target003_hit
PlaySoundAtBall "fx_target"
If Tilted Then Exit Sub
AddScore 5000 + 45000 * li008.State
End Sub
Sub Target004_hit
PlaySoundAtBall "fx_target"
If Tilted Then Exit Sub
AddScore 500
If li005.State Then AwardSpecial
End Sub
Sub Target005_hit
PlaySoundAtBall "fx_target"
If Tilted Then Exit Sub
AddScore 5000 + 45000 * li007.State
End Sub
Sub Target006_hit
PlaySoundAtBall "fx_target"
If Tilted Then Exit Sub
AddScore 500
If li006.State Then AwardSpecial
End Sub
'*****************
' kickers
'*****************
' left yellow bumper
Sub LeftHole_Hit
PlaySoundAt "fx_kicker_enter", LeftHole
If NOT Tilted Then
Addscore 500
li003.State = 0
li013.State = 1
li015.State = 1
li021.State = 1
CheckBells
End If
vpmtimer.addtimer 1000, "ExitLeftHole '"
End Sub
Sub ExitLeftHole
PlaySoundAt SoundFXDOF("fx_kicker", 111, DOFPulse, DOFContactors), LeftHole
LeftHole.kick 164, 18
End Sub
' center red bumper
Sub CenterHole_Hit
PlaySoundAt "fx_kicker_enter", CenterHole
If NOT Tilted Then
Addscore 500
li011.State = 0
li014.State = 1
li017.State = 1
li020.State = 1
CheckBells
End If
vpmtimer.addtimer 1000, "ExitCenterHole '"
End Sub
Sub ExitCenterHole
PlaySoundAt SoundFXDOF("fx_kicker", 111, DOFPulse, DOFContactors), LeftHole
CenterHole.kick 170, 18
End Sub
' right green bumper
Sub RightHole_Hit
PlaySoundAt "fx_kicker_enter", RightHole
If NOT Tilted Then
Addscore 500
li001.State = 0
li016.State = 1
li018.State = 1
li019.State = 1
CheckBells
End If
vpmtimer.addtimer 1000, "ExitRightHole '"
End Sub
Sub ExitRightHole
PlaySoundAt SoundFXDOF("fx_kicker", 111, DOFPulse, DOFContactors), RightHole
RightHole.kick 195, 18
End Sub
Sub CheckBells
If li013.State AND li014.State Then RisePost
If li015.State Then li009.State = 0:li010.State = 1:li012.State = 0: BonusMultiplier = 3 ' lite tripple bonus
If li015.State AND li016.State Then li002.State = 1:li004.State = 1 ' lite extra ball
If li017.State AND li018.State Then li007.State = 1:li008.State = 1 ' lite 50,000 points
If li021.State AND li020.State AND li019.State Then li005.State = 1:li006.State = 1 ' lite Special
End Sub
' Bonus kicker hole
Dim BallinBonusKicker
BallinBonusKicker = False
Sub BonusKicker_Hit
PlaySoundAt "fx_kicker_enter", BonusKicker
DOF 117, DOFPulse
If NOT Tilted Then
BallinBonusKicker = True
StartBonusCount
Else
BonusKickOut
End If
End Sub
Sub BonusKickOut
PlaySoundAt SoundFXDOF("fx_kicker", 109, DOFPulse, DOFContactors), BonusKicker
BallinBonusKicker = False
BonusKicker.kick 190, 14
End Sub
'***************
' POST
'***************
Sub RisePost
PlaySoundAt "fx_SolenoidOn", Primitive011
Post.IsDropped = 0
End Sub
Sub DropPost
PlaySoundAt "fx_SolenoidOff", Primitive011
Post.IsDropped = 1
End Sub
'**************
' Buttons
'**************
Sub Button001_Hit
PlaySoundAt "fx_sensor", Button001
Addscore 10
AddBonus 1
End Sub
Sub Button002_Hit
PlaySoundAt "fx_sensor", Button002
Addscore 10
AddBonus 1
End Sub
Edited by Abhcoide, 16 June 2024 - 12:47 PM.
#36
Posted 16 February 2026 - 04:35 PM
UPDATE
6.0.1 Updated 16.02.2026
- Updated some more DOF commands, by pedator.
The update is for people using DOF as it adds a few more effects
Otherwise nothing else changed.
If you want to check my latest uploads then click on the image below:
Next table? A tribute table to Stern's Foo Fighters
Also tagged with one or more of these keywords: luck, smile, inder, 1976
Future Pinball →
Future Pinball - New Releases →
Up away (Inder 1975) 1EM [Future Pinball]Started by eduguitar72 , 25 May 2026 |
|
||
Visual Pinball →
VP Cabinet Tables - New Releases →
Topaz (Inder 1979) 4 EM [VP 9.x Cabinet FS]Started by eduguitar72 , 09 Apr 2026 |
|
||
Virtual Pinball →
Frontends and Addons →
Tasty Samba (Inder 1977)Started by Flying Dutchman , 08 Mar 2026 |
|
||
Visual Pinball →
VP Recreations - New Releases →
Tasty Samba (INDER 1977)[Visual Pinball X]Started by jpsalas , 08 Mar 2026 |
|
||
Visual Pinball →
VR Discussion →
Visual Pinball VR - New Releases →
Lap by Lap (Inder 1986) JP v6.0.0 DT-FS-VR-MR Ext2k Conversion [VR Room VPX]Started by Ext2k , 11 Oct 2025 |
|



Top

















are all trademarks of VPFORUMS.