- 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
Submitter
SUPPORT TOPIC File Information
- Submitted: Dec 06 2019 02:24 PM
- Last Updated: Dec 06 2019 02:24 PM
- File Size: 120.26MB
- Views: 11392
- Downloads: 1,707
-
Author(s):
ivantba
Jpsalas - Permission to MOD?: Unspecified
Download Police Academy (TBA 2019) 1.0
19 Votes
The first installment of the Police Academy, in addition to ticking off each of the 7 full-length movie versions in terms of revenue, was also a genius comedy of its era. This piece of art can be great fun for many generations.
I was a teenager when I saw the first episodes and I was impressed by this great comedy.
Over time, as the sequels have continued to gain popularity, the series has unfortunately lost its appeal. Anyway, I thought it was time to create a tribute board ...
Video of the gameplay:
https://youtu.be/SdpkRe3y6Tw
So, a complete multimedia package is included with the compressed file. Among others, the backglass (directb2s) file. PinballX desktop and cabinet files (audio, pictures, flyers, instruction cards, wheel, etc.)
Original (my resource) table:
Miraculous v1.0.0
Author(s): Jpsalas
Thank you very much to JPSalas for allowing me to modify, re-theme his superb tables!
I was a teenager when I saw the first episodes and I was impressed by this great comedy.
Over time, as the sequels have continued to gain popularity, the series has unfortunately lost its appeal. Anyway, I thought it was time to create a tribute board ...
Video of the gameplay:
https://youtu.be/SdpkRe3y6Tw
So, a complete multimedia package is included with the compressed file. Among others, the backglass (directb2s) file. PinballX desktop and cabinet files (audio, pictures, flyers, instruction cards, wheel, etc.)
Original (my resource) table:
Miraculous v1.0.0
Author(s): Jpsalas
Thank you very much to JPSalas for allowing me to modify, re-theme his superb tables!
Nice wheel, as always! Thanks MajorFrenchy!
Thank you for another nice original table Ivan.
Download link: https://www.vpforums...&showfile=14493
See all my Wheels: Hosted on MEGA
Thanks IvanTba looks great. Nice to relive the 80's
Would be cool to see a BeverlyHills Cop table.
Thanks
Thanks a lot, again. Nice to see these quality originals. This table plays superb! Great work, Ivan.
nice work to bad almost impossible to work on a cab because of the dmd
Petit bijou
Thanks a lot,
Would be very cool with the FlexDMD feature option like the JPSalas Miraculous table!
Thanks a lot,
Would be very cool with the FlexDMD feature option like the JPSalas Miraculous table!
yes on effect there is no wy to position correctly dmd!
Fun table and a nice artwork with fine sound. Thank you.
nice work to bad almost impossible to work on a cab because of the dmd
Follow script to resolve dmd. copy and paste in place of the original script. enjoy
' ****************************************************************
' VISUAL PINBALL X
' JPSalas Original Miraculous Script
' Marcade MODs adjustments for Last Unicorn
' plain VPX script using core.vbs for supporting functions
' Version 1.0.0
' ****************************************************************
Option Explicit
Randomize
Const BallSize = 50 ' 50 is the normal size used in the core.vbs, VP kicker routines uses this value divided by 2
Const BallMass = 1
Const SongVolume = 1 ' 1 is full volume. Value is from 0 to 1
' Load the core.vbs for supporting Subs and functions
LoadCoreFiles
Sub LoadCoreFiles
On Error Resume Next
ExecuteGlobal GetTextFile("core.vbs")
If Err Then MsgBox "Can't open core.vbs"
ExecuteGlobal GetTextFile("controller.vbs")
If Err Then MsgBox "Can't open controller.vbs"
On Error Goto 0
End Sub
' Define any Constants
Const cGameName = "police academy"
Const TableName = "police academy"
Const myVersion = "1.0.0"
Const MaxPlayers = 4 ' from 1 to 4
Const BallSaverTime = 20 ' in seconds
Const MaxMultiplier = 3 ' limit to 3x in this game, both bonus multiplier and playfield multiplier
Const BallsPerGame = 5 ' usually 3 or 5
Const Special1 = 100000 ' High score to obtain an extra ball/game
Const Special2 = 200000
Const Special3 = 300000
' Define Global Variables
Dim PlayersPlayingGame
Dim CurrentPlayer
Dim Credits
Dim BonusPoints(4)
Dim BonusMultiplier(4)
Dim bBonusHeld
Dim BallsRemaining(4)
Dim ExtraBallsAwards(4)
Dim Special1Awarded(4)
Dim Special2Awarded(4)
Dim Special3Awarded(4)
Dim Score(4)
Dim HighScore(4)
Dim HighScoreName(4)
Dim Tilt
Dim TiltSensitivity
Dim Tilted
Dim TotalGamesPlayed
Dim bAttractMode
' Define Game Control Variables
Dim BallsOnPlayfield
' Define Game Flags
Dim bFreePlay
Dim bGameInPlay
Dim bOnTheFirstBall
Dim bBallInPlungerLane
Dim bBallSaverActive
Dim bBallSaverReady
Dim bMusicOn
Dim bJustStarted
Dim bJackpot
' core.vbs variables
' *********************************************************************
' Visual Pinball Defined Script Events
' *********************************************************************
Sub Table1_Init()
LoadEM
' Misc. VP table objects Initialisation, droptargets, animations...
VPObjects_Init
' load saved values, highscore, names, jackpot
Loadhs
' Initalise the DMD display
DMD_Init
' freeplay or coins
bFreePlay = False 'we don't want coins
if bFreePlay Then DOF 125, DOFOn
' Init main variables and any other flags
bAttractMode = False
bOnTheFirstBall = False
bBallInPlungerLane = False
bBallSaverActive = False
bBallSaverReady = False
bGameInPlay = False
bMusicOn = True
BallsOnPlayfield = 0
Tilt = 0
TiltSensitivity = 6
Tilted = False
bJustStarted = True
' set any lights for the attract mode
GiOff
StartAttractMode
End Sub
'****************************************
' Real Time updatess using the GameTimer
'****************************************
'used for all the real time updates
Sub GameTimer_Timer
RollingUpdate
' add any other real time update subs, like gates or diverters
LeftFlipperTop.Rotz = LeftFlipper.CurrentAngle
RightFlipperTop.Rotz = RightFlipper.CurrentAngle
End Sub
'******
' Keys
'******
Sub Table1_KeyDown(ByVal Keycode)
If Keycode = AddCreditKey Then
Credits = Credits + 1
if bFreePlay = False Then
DOF 125, DOFOn
If(Tilted = False) Then
DMDFlush
DMD "_", CL(1, "CREDITS: " & Credits), "", eNone, eNone, eNone, 500, True, "fx_coin"
End If
End If
End If
If keycode = PlungerKey Then
Plunger.Pullback
PlaySoundAt "fx_plungerpull", plunger
PlaySoundAt "fx_reload", plunger
End If
If hsbModeActive Then
EnterHighScoreKey(keycode)
Exit Sub
End If
' Normal flipper action
If bGameInPlay AND NOT Tilted Then
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
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
TotalGamesPlayed = TotalGamesPlayed + 1
DMD "_", CL(1, PlayersPlayingGame & " PLAYERS"), "", eNone, eBlink, eNone, 500, True, "so_fanfare1"
Else
If(Credits> 0) then
PlayersPlayingGame = PlayersPlayingGame + 1
TotalGamesPlayed = TotalGamesPlayed + 1
Credits = Credits - 1
DMD "_", CL(1, PlayersPlayingGame & " PLAYERS"), "", eNone, eBlink, eNone, 500, True, "so_fanfare1"
If Credits <1 And bFreePlay = False Then DOF 125, DOFOff
Else
' Not Enough Credits to start a game.
DMD CL(0, "CREDITS " & Credits), CL(1, "INSERT COIN"), "", eNone, eBlink, eNone, 500, True, "so_nocredits"
End If
End If
End If
End If
Else ' If (GameInPlay)
If keycode = StartGameKey Then
If(bFreePlay = True) Then
If(BallsOnPlayfield = 0) Then
ResetForNewGame()
End If
Else
If(Credits> 0) Then
If(BallsOnPlayfield = 0) Then
Credits = Credits - 1
If Credits <1 And bFreePlay = False Then DOF 125, DOFOff
ResetForNewGame()
End If
Else
' Not Enough Credits to start a game.
DMD CL(0, "CREDITS " & Credits), CL(1, "INSERT COIN"), "", eNone, eBlink, eNone, 500, True, "so_nocredits"
End If
End If
End If
End If ' If (GameInPlay)
'table keys
If keycode = RightMagnaSave or keycode = LeftMagnasave Then ShowPost
End Sub
Sub Table1_KeyUp(ByVal keycode)
If keycode = PlungerKey Then
Plunger.Fire
PlaySoundAt "fx_plunger", plunger
If bBallInPlungerLane Then PlaySoundAt "fx_fire", plunger
End If
If hsbModeActive Then
Exit Sub
End If
' Table specific
If bGameInPLay AND NOT Tilted Then
If keycode = LeftFlipperKey Then
SolLFlipper 0
End If
If keycode = RightFlipperKey Then
SolRFlipper 0
End If
End If
End Sub
'*************
' Pause Table
'*************
Sub table1_Paused
End Sub
Sub table1_unPaused
End Sub
Sub Table1_Exit
Savehs
If Not FlexDMD is Nothing Then FlexDMD.Run = False
If B2SOn = true Then Controller.Stop
End Sub
'********************
' Flippers
'********************
Sub SolLFlipper(Enabled)
If Enabled Then
PlaySoundAt SoundFXDOF("fx_flipperup", 101, DOFOn, DOFFlippers), LeftFlipper
LeftFlipper.RotateToEnd
Else
PlaySoundAt SoundFXDOF("fx_flipperdown", 101, DOFOff, DOFFlippers), LeftFlipper
LeftFlipper.RotateToStart
End If
End Sub
Sub SolRFlipper(Enabled)
If Enabled Then
PlaySoundAt SoundFXDOF("fx_flipperup", 102, DOFOn, DOFFlippers), RightFlipper
RightFlipper.RotateToEnd
Else
PlaySoundAt SoundFXDOF("fx_flipperdown", 102, DOFOff, DOFFlippers), RightFlipper
RightFlipper.RotateToStart
End If
End Sub
' flippers hit Sound
Sub LeftFlipper_Collide(parm)
PlaySound "fx_rubber_flipper", 0, parm / 10, pan(ActiveBall), 0, Pitch(ActiveBall), 0, 0, AudioFade(ActiveBall)
End Sub
Sub RightFlipper_Collide(parm)
PlaySound "fx_rubber_flipper", 0, parm / 10, pan(ActiveBall), 0, Pitch(ActiveBall), 0, 0, AudioFade(ActiveBall)
End Sub
'*********
' TILT
'*********
'NOTE: The TiltDecreaseTimer Subtracts .01 from the "Tilt" variable every round
Sub CheckTilt 'Called when table is nudged
Tilt = Tilt + TiltSensitivity 'Add to tilt count
TiltDecreaseTimer.Enabled = True
If(Tilt> TiltSensitivity) AND(Tilt <15) Then 'show a warning
DMD "_", CL(1, "CAREFUL!"), "_", eNone, eBlinkFast, eNone, 500, True, ""
End if
If Tilt> 15 Then 'If more that 15 then TILT the table
Tilted = True
'display Tilt
DMDFlush
DMD "", "", "TILT", eNone, eNone, eBlink, 200, False, ""
DisableTable True
TiltRecoveryTimer.Enabled = True 'start the Tilt delay to check for all the balls to be drained
End If
End Sub
Sub TiltDecreaseTimer_Timer
' DecreaseTilt
If Tilt> 0 Then
Tilt = Tilt - 0.1
Else
TiltDecreaseTimer.Enabled = False
End If
End Sub
Sub DisableTable(Enabled)
If Enabled Then
'turn off GI and turn off all the lights
GiOff
LightSeqTilt.Play SeqAllOff
'Disable slings, bumpers etc
LeftFlipper.RotateToStart
RightFlipper.RotateToStart
Bumper1.Force = 0
Bumper2.Force = 0
LeftSlingshot.Disabled = 1
RightSlingshot.Disabled = 1
Else
'turn back on GI and the lights
GiOn
LightSeqTilt.StopPlay
Bumper1.Force = 10
Bumper2.Force = 10
LeftSlingshot.Disabled = 0
RightSlingshot.Disabled = 0
'clean up the buffer display
DMDFlush
End If
End Sub
Sub TiltRecoveryTimer_Timer()
' if all the balls have been drained then..
If(BallsOnPlayfield = 0) Then
' do the normal end of ball thing (this doesn't give a bonus if the table is tilted)
EndOfBall()
TiltRecoveryTimer.Enabled = False
End If
' else retry (checks again in another second or so)
End Sub
'********************
' Music as wav sounds
'********************
Dim Song
Song = ""
Sub PlaySong(name)
If bMusicOn Then
If Song <> name Then
StopSound Song
Song = name
PlaySound Song, -1, SongVolume
End If
End If
End Sub
Sub StopSong
If bMusicOn Then
StopSound Song
Song = ""
End If
End Sub
Sub ChangeSong
Dim tmp
If(BallsOnPlayfield = 0) Then
PlaySong "m_end"
Exit Sub
End If
If bAttractMode Then
PlaySong "m_Attract"
Exit Sub
End If
tmp = INT(RND * 4)
Select Case tmp
Case 0:PlaySong "m_main1"
Case 1:PlaySong "m_main2"
Case 2:PlaySong "m_main3"
Case 3:PlaySong "m_main4"
End Select
End Sub
'**********************
' GI effects
' independent routine
' it turns on the gi
' when there is a ball
' in play
'**********************
Dim OldGiState
OldGiState = -1 'start witht the Gi off
Sub ChangeGi(col) 'changes the gi color
Dim bulb
For each bulb in aGILights
SetLightColor bulb, col, -1
Next
End Sub
Sub GIUpdateTimer_Timer
Dim tmp, obj
tmp = Getballs
If UBound(tmp) <> OldGiState Then
OldGiState = Ubound(tmp)
If UBound(tmp) = 1 Then 'we have 2 captive balls on the table (-1 means no balls, 0 is the first ball, 1 is the second..)
GiOff ' turn off the gi if no active balls on the table, we could also have used the variable ballsonplayfield.
Else
Gion
End If
End If
End Sub
Sub GiOn
DOF 118, DOFOn
Dim bulb
For each bulb in aGiLights
bulb.State = 1
Next
For each bulb in aBumperLights
bulb.State = 1
Next
' table1.ColorGradeImage = "ColorGradeLUT256x16_HalfSat"
End Sub
Sub GiOff
DOF 118, DOFOff
Dim bulb
For each bulb in aGiLights
bulb.State = 0
Next
For each bulb in aBumperLights
bulb.State = 0
Next
' table1.ColorGradeImage = "ColorGradeLUT256x16_HalfSat-dark"
End Sub
' GI, light & flashers sequence effects
Sub GiEffect(n)
Dim ii
Select Case n
Case 0 'all off
LightSeqGi.Play SeqAlloff
Case 1 'all blink
LightSeqGi.UpdateInterval = 10
LightSeqGi.Play SeqBlinking, , 15, 10
Case 2 'random
LightSeqGi.UpdateInterval = 10
LightSeqGi.Play SeqRandom, 50, , 1000
Case 3 'all blink fast
LightSeqGi.UpdateInterval = 10
LightSeqGi.Play SeqBlinking, , 10, 10
Case 4 'all blink once
LightSeqGi.UpdateInterval = 10
LightSeqGi.Play SeqBlinking, , 4, 1
End Select
End Sub
Sub LightEffect(n)
Select Case n
Case 0 ' all off
LightSeqInserts.Play SeqAlloff
Case 1 'all blink
LightSeqInserts.UpdateInterval = 10
LightSeqInserts.Play SeqBlinking, , 15, 10
Case 2 'random
LightSeqInserts.UpdateInterval = 10
LightSeqInserts.Play SeqRandom, 50, , 1000
Case 3 'all blink fast
LightSeqInserts.UpdateInterval = 10
LightSeqInserts.Play SeqBlinking, , 10, 10
Case 4 'up 1 time
LightSeqInserts.UpdateInterval = 4
LightSeqInserts.Play SeqUpOn, 8, 1
Case 5 'up 2 times
LightSeqInserts.UpdateInterval = 4
LightSeqInserts.Play SeqUpOn, 8, 2
Case 6 'down 1 time
LightSeqInserts.UpdateInterval = 4
LightSeqInserts.Play SeqDownOn, 8, 1
Case 7 'down 2 times
LightSeqInserts.UpdateInterval = 4
LightSeqInserts.Play SeqDownOn, 8, 2
End Select
End Sub
' *********************************************************************
' Supporting Ball & Sound Functions
' *********************************************************************
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 / table1.width-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 / Table1.height-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.06, 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, 0, 0, 0, AudioFade(ActiveBall)
End Sub
'********************************************
' JP's VP10 Rolling Sounds + Ballshadow
' uses a collection of shadows, aBallShadow
'********************************************
Const tnob = 20 ' total number of balls
Const lob = 0 'number of locked balls
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
BOT = GetBalls
' stop the sound of deleted balls
For b = UBound(BOT) + 1 to tnob
rolling(b) = False
StopSound("fx_ballrolling" & b)
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
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) ) + 25000 '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
Next
End Sub
'**********************
' 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
'******************************
Sub aMetals_Hit(idx):PlaySoundAtBall "fx_MetalHit":End Sub
Sub aRubber_Bands_Hit(idx):PlaySoundAtBall "fx_rubber_band":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 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
' *********************************************************************
' User Defined Script Events
' *********************************************************************
' Initialise the Table for a new Game
'
Sub ResetForNewGame()
Dim i
bGameInPLay = True
'resets the score display, and turn off attract mode
StopAttractMode
GiOn
TotalGamesPlayed = TotalGamesPlayed + 1
CurrentPlayer = 1
PlayersPlayingGame = 1
bOnTheFirstBall = True
For i = 1 To MaxPlayers
Score(i) = 0
BonusPoints(i) = 0
BonusMultiplier(i) = 1
BallsRemaining(i) = BallsPerGame
ExtraBallsAwards(i) = 0
Special1Awarded(i) = False
Special2Awarded(i) = False
Special3Awarded(i) = False
Next
' initialise any other flags
Tilt = 0
' initialise Game variables
Game_Init()
' you may wish to start some music, play a sound, do whatever at this point
vpmtimer.addtimer 1500, "FirstBall '"
End Sub
' This is used to delay the start of a game to allow any attract sequence to
' complete. When it expires it creates a ball for the player to start playing with
Sub FirstBall
' reset the table for a new ball
ResetForNewPlayerBall()
' create a new ball in the shooters lane
CreateNewBall()
End Sub
' (Re-)Initialise the Table for a new ball (either a new ball after the player has
' lost one or we have moved onto the next player (if multiple are playing))
Sub ResetForNewPlayerBall()
' make sure the correct display is upto date
AddScore 0
' set the current players bonus multiplier back down to 1X
BonusMultiplier(CurrentPlayer) = 1
UpdateBonusXLights
' reset any drop targets, lights, game Mode etc..
BonusPoints(CurrentPlayer) = 0
'Reset any table specific
ResetNewBallVariables
ResetNewBallLights()
End Sub
' Create a new ball on the Playfield
Sub CreateNewBall()
' create a ball in the plunger lane kicker.
BallRelease.CreateSizedBallWithMass BallSize / 2, BallMass
' There is a (or another) ball on the playfield
BallsOnPlayfield = BallsOnPlayfield + 1
' kick it out..
PlaySoundAt SoundFXDOF("fx_Ballrel", 123, DOFPulse, DOFContactors), BallRelease
BallRelease.Kick 90, 4
'only this table
ChangeBallImage
End Sub
' The Player has lost his ball (there are no more balls on the playfield).
' Handle any bonus points awarded
Sub EndOfBall()
' the first ball has been lost. From this point on no new players can join in
bOnTheFirstBall = False
' only process any of this if the table is not tilted. (the tilt recovery
' mechanism will handle any extra balls or end of game)
If NOT Tilted Then
BonusCountTimer.Interval = 300
BonusCountTimer.Enabled = 1
Else 'Si hay falta simplemente espera un momento y va directo a la segunta parte después de perder la bola
vpmtimer.addtimer 400, "EndOfBall2 '"
End If
End Sub
Sub BonusCountTimer_Timer 'Add bonus and update the bonus lights
'debug.print "BonusCount_Timer"
If BonusPoints(CurrentPlayer)> 0 Then
BonusPoints(CurrentPlayer) = BonusPoints(CurrentPlayer) -1
AddScore 1000 * BonusMultiplier(CurrentPlayer)
UpdateBonusLights
Else
' end of bonus, go to end of ball
BonusCountTimer.Enabled = 0
vpmtimer.addtimer 1000, "EndOfBall2 '"
End If
End Sub
Sub UpdateBonusLights 'enciende o apaga las luces de los bonos según el valor de BonusPoints(CurrentPlayer)
Select Case BonusPoints(CurrentPlayer)
Case 0:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 0
Case 1:li004.State = 1:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 0
Case 2:li004.State = 0:li005.State = 1:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 0
Case 3:li004.State = 0:li005.State = 0:li006.State = 1:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 0
Case 4:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 1:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 0
Case 5:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 1:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 0
Case 6:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 1:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 0
Case 7:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 1:li011.State = 0:li012.State = 0:li003.State = 0
Case 8:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 1:li012.State = 0:li003.State = 0
Case 9:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 1:li003.State = 0
Case 10:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 1
Case 11:li004.State = 1:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 1
Case 12:li004.State = 0:li005.State = 1:li006.State = 0:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 1
Case 13:li004.State = 0:li005.State = 0:li006.State = 1:li007.State = 0:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 1
Case 14:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 1:li008.State = 0:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 1
Case 15:li004.State = 0:li005.State = 0:li006.State = 0:li007.State = 0:li008.State = 1:li009.State = 0:li010.State = 0:li011.State = 0:li012.State = 0:li003.State = 1
End Select
End Sub
' The Timer which delays the machine to allow any bonus points to be added up
' has expired. Check to see if there are any extra balls for this player.
' if not, then check to see if this was the last ball (of the CurrentPlayer)
'
Sub EndOfBall2()
' if were tilted, reset the internal tilted flag (this will also
' set TiltWarnings back to zero) which is useful if we are changing player LOL
Tilted = False
Tilt = 0
DisableTable False 'enable again bumpers and slingshots
' has the player won an extra-ball ? (might be multiple outstanding)
If(ExtraBallsAwards(CurrentPlayer) <> 0) Then
'debug.print "Extra Ball"
' yep got to give it to them
ExtraBallsAwards(CurrentPlayer) = ExtraBallsAwards(CurrentPlayer) - 1
' if no more EB's then turn off any shoot again light
If(ExtraBallsAwards(CurrentPlayer) = 0) Then
LightShootAgain.State = 0
End If
' You may wish to do a bit of a song AND dance at this point
DMD CL(0, "EXTRA BALL"), CL(1, "SHOOT AGAIN"), "", eNone, eNone, eBlink, 1000, True, ""
' reset the playfield for the new ball
ResetForNewPlayerBall()
' Create a new ball in the shooters lane
CreateNewBall()
Else ' no extra balls
BallsRemaining(CurrentPlayer) = BallsRemaining(CurrentPlayer) - 1
' was that the last ball ?
If(BallsRemaining(CurrentPlayer) <= 0) Then
'debug.print "No More Balls, High Score Entry"
' Submit the CurrentPlayers score to the High Score system
CheckHighScore()
' you may wish to play some music at this point
Else
' not the last ball (for that player)
' if multiple players are playing then move onto the next one
EndOfBallComplete()
End If
End If
End Sub
' This function is called when the end of bonus display
' (or high score entry finished) AND it either end the game or
' move onto the next player (or the next ball of the same player)
'
Sub EndOfBallComplete()
Dim NextPlayer
'debug.print "EndOfBall - Complete"
' are there multiple players playing this game ?
If(PlayersPlayingGame> 1) Then
' then move to the next player
NextPlayer = CurrentPlayer + 1
' are we going from the last player back to the first
' (ie say from player 4 back to player 1)
If(NextPlayer> PlayersPlayingGame) Then
NextPlayer = 1
End If
Else
NextPlayer = CurrentPlayer
End If
'debug.print "Next Player = " & NextPlayer
' is it the end of the game ? (all balls been lost for all players)
If((BallsRemaining(CurrentPlayer) <= 0) AND(BallsRemaining(NextPlayer) <= 0) ) Then
' you may wish to do some sort of Point Match free game award here
' generally only done when not in free play mode
' set the machine into game over mode
EndOfGame()
' you may wish to put a Game Over message on the desktop/backglass
Else
' set the next player
CurrentPlayer = NextPlayer
' make sure the correct display is up to date
DMDScoreNow
' reset the playfield for the new player (or new ball)
ResetForNewPlayerBall()
' AND create a new ball
CreateNewBall()
' play a sound if more than 1 player
If PlayersPlayingGame> 1 Then
PlaySound "vo_player" &CurrentPlayer
DMD "_", CL(1, "PLAYER " &CurrentPlayer), "_", eNone, eNone, eNone, 800, True, ""
End If
End If
End Sub
' This function is called at the End of the Game, it should reset all
' Drop targets, AND eject any 'held' balls, start any attract sequences etc..
Sub EndOfGame()
'debug.print "End Of Game"
bGameInPLay = False
' just ended your game then play the end of game tune
If NOT bJustStarted Then
ChangeSong
End If
bJustStarted = False
' ensure that the flippers are down
SolLFlipper 0
SolRFlipper 0
' terminate all Mode - eject locked balls
' most of the Mode/timers terminate at the end of the ball
' set any lights for the attract mode
GiOff
StartAttractMode
' you may wish to light any Game Over Light you may have
End Sub
Function Balls
Dim tmp
tmp = BallsPerGame - BallsRemaining(CurrentPlayer) + 1
If tmp> BallsPerGame Then
Balls = BallsPerGame
Else
Balls = tmp
End If
End Function
' *********************************************************************
' Drain / Plunger Functions
' *********************************************************************
' lost a ball ;-( check to see how many balls are on the playfield.
' if only one then decrement the remaining count AND test for End of game
' if more than 1 ball (multi-ball) then kill of the ball but don't create
' a new one
'
Sub Drain_Hit()
' Destroy the ball
Drain.DestroyBall
BallsOnPlayfield = BallsOnPlayfield - 1
' pretend to knock the ball into the ball storage mech
PlaySoundAt "fx_drain", Drain
'if Tilted then end Ball Mode
If Tilted Then
StopEndOfBallMode
End If
' if there is a game in progress AND it is not Tilted
If(bGameInPLay = True) AND(Tilted = False) Then
' is the ball saver active,
If(bBallSaverActive = True) Then
' yep, create a new ball in the shooters lane
' we use the Addmultiball in case the multiballs are being ejected
CreateNewBall()
' you may wish to put something on a display or play a sound at this point
DMD CL(0, "BALL SAVED"), CL(1, "SHOOT AGAIN"), "_", eBlink, eBlink, eNone, 800, True, ""
Else
' was that the last ball on the playfield
If(BallsOnPlayfield = 0) Then
' End Mode and timers
StopSong
PlaySound "m_endball"
'vpmtimer.addtimer 3000, "ChangeSong '"
' Show the end of ball animation
' and continue with the end of ball
' DMD something?
StopEndOfBallMode
vpmtimer.addtimer 200, "EndOfBall '" 'the delay is depending of the animation of the end of ball, since there is no animation then move to the end of ball
End If
End If
End If
End Sub
' The Ball has rolled out of the Plunger Lane and it is pressing down the trigger in the shooters lane
' Check to see if a ball saver mechanism is needed and if so fire it up.
Sub swPlungerRest_Hit()
StopSong
DMDScoreNow
bBallInPlungerLane = True
End Sub
' The ball is released from the plunger
Sub swPlungerRest_UnHit()
bBallInPlungerLane = False
LightEffect 4
ChangeSong
End Sub
' swPlungerRest timer to show the "launch ball" if the player has not shot the ball during 6 seconds
Sub swPlungerRest_Timer
DMD "_", CL(1, "SHOOT THE BALL"), "_", eNone, eBlink, eNone, 800, True, ""
swPlungerRest.TimerEnabled = 0
End Sub
' *********************************************************************
' Supporting Score Functions
' *********************************************************************
' Add points to the score AND update the score board
Sub AddScore(points)
If Tilted Then Exit Sub
' add the points to the current players score variable
Score(CurrentPlayer) = Score(CurrentPlayer) + points
' play a sound for each score
PlaySound "tone"&points
' you may wish to check to see if the player has gotten an extra ball by a high score
If Score(CurrentPlayer) >= Special1 AND Special1Awarded(CurrentPlayer) = False Then
AwardExtraBall
Special1Awarded(CurrentPlayer) = True
End If
If Score(CurrentPlayer) >= Special2 AND Special2Awarded(CurrentPlayer) = False Then
AwardExtraBall
Special2Awarded(CurrentPlayer) = True
End If
If Score(CurrentPlayer) >= Special3 AND Special3Awarded(CurrentPlayer) = False Then
AwardExtraBall
Special3Awarded(CurrentPlayer) = True
End If
End Sub
' Add bonus to the bonuspoints AND update the score board
Sub AddBonus(points) 'not used in this table, since there are many different bonus items.
If Tilted Then Exit Sub
' add the bonus to the current players bonus variable
BonusPoints(CurrentPlayer) = BonusPoints(CurrentPlayer) + points
If BonusPoints(CurrentPlayer)> 15 Then
BonusPoints(CurrentPlayer) = 15
End If
' Update the lights
UpdateBonusLights
End Sub
Sub UpdateBonusXLights
' Update the lights
Select Case BonusMultiplier(CurrentPlayer)
Case 1:li002.State = 0:li001.State = 0
Case 2:li002.State = 1:li001.State = 0
Case 3:li002.State = 0:li001.State = 1
End Select
End Sub
Sub AwardExtraBall()
DMD "_", CL(1, ("EXTRA BALL WON") ), "_", eNone, eBlink, eNone, 1000, True, SoundFXDOF("fx_Knocker", 122, DOFPulse, DOFKnocker)
DOF 121, DOFPulse
ExtraBallsAwards(CurrentPlayer) = ExtraBallsAwards(CurrentPlayer) + 1
LightShootAgain.State = 1
LightEffect 2
End Sub
'*****************************
' Load / Save / Highscore
'*****************************
Sub Loadhs
Dim x
x = LoadValue(TableName, "HighScore1")
If(x <> "") Then HighScore(0) = CDbl(x) Else HighScore(0) = 100000 End If
x = LoadValue(TableName, "HighScore1Name")
If(x <> "") Then HighScoreName(0) = x Else HighScoreName(0) = "AAA" End If
x = LoadValue(TableName, "HighScore2")
If(x <> "") then HighScore(1) = CDbl(x) Else HighScore(1) = 100000 End If
x = LoadValue(TableName, "HighScore2Name")
If(x <> "") then HighScoreName(1) = x Else HighScoreName(1) = "BBB" End If
x = LoadValue(TableName, "HighScore3")
If(x <> "") then HighScore(2) = CDbl(x) Else HighScore(2) = 100000 End If
x = LoadValue(TableName, "HighScore3Name")
If(x <> "") then HighScoreName(2) = x Else HighScoreName(2) = "CCC" End If
x = LoadValue(TableName, "HighScore4")
If(x <> "") then HighScore(3) = CDbl(x) Else HighScore(3) = 100000 End If
x = LoadValue(TableName, "HighScore4Name")
If(x <> "") then HighScoreName(3) = x Else HighScoreName(3) = "DDD" End If
x = LoadValue(TableName, "Credits")
If(x <> "") then Credits = CInt(x) Else Credits = 0:If bFreePlay = False Then DOF 125, DOFOff:End If
x = LoadValue(TableName, "TotalGamesPlayed")
If(x <> "") then TotalGamesPlayed = CInt(x) Else TotalGamesPlayed = 0 End If
End Sub
Sub Savehs
SaveValue TableName, "HighScore1", HighScore(0)
SaveValue TableName, "HighScore1Name", HighScoreName(0)
SaveValue TableName, "HighScore2", HighScore(1)
SaveValue TableName, "HighScore2Name", HighScoreName(1)
SaveValue TableName, "HighScore3", HighScore(2)
SaveValue TableName, "HighScore3Name", HighScoreName(2)
SaveValue TableName, "HighScore4", HighScore(3)
SaveValue TableName, "HighScore4Name", HighScoreName(3)
SaveValue TableName, "Credits", Credits
SaveValue TableName, "TotalGamesPlayed", TotalGamesPlayed
End Sub
Sub Reseths
HighScoreName(0) = "AAA"
HighScoreName(1) = "BBB"
HighScoreName(2) = "CCC"
HighScoreName(3) = "DDD"
HighScore(0) = 100000
HighScore(1) = 110000
HighScore(2) = 120000
HighScore(3) = 130000
Savehs
End Sub
' ***********************************************************
' High Score Initals Entry Functions - based on Black's code
' ***********************************************************
Dim hsbModeActive
Dim hsEnteredName
Dim hsEnteredDigits(3)
Dim hsCurrentDigit
Dim hsValidLetters
Dim hsCurrentLetter
Dim hsLetterFlash
Sub CheckHighscore()
Dim tmp
tmp = Score(1)
If Score(2)> tmp Then tmp = Score(2)
If Score(3)> tmp Then tmp = Score(3)
If Score(4)> tmp Then tmp = Score(4)
'If tmp > HighScore(1)Then 'add 1 credit for beating the highscore
' Credits = Credits + 1
' DOF 125, DOFOn
'End If
If tmp> HighScore(3) Then
PlaySound SoundFXDOF("fx_Knocker", 122, DOFPulse, DOFKnocker)
DOF 121, DOFPulse
HighScore(3) = tmp
'enter player's name
HighScoreEntryInit()
Else
EndOfBallComplete()
End If
End Sub
Sub HighScoreEntryInit()
hsbModeActive = True
ChangeSong
hsLetterFlash = 0
hsEnteredDigits(0) = " "
hsEnteredDigits(1) = " "
hsEnteredDigits(2) = " "
hsCurrentDigit = 0
hsValidLetters = " ABCDEFGHIJKLMNOPQRSTUVWXYZ'<>*+-/=\^0123456789`" ' ` is back arrow
hsCurrentLetter = 1
DMDFlush()
HighScoreDisplayNameNow()
HighScoreFlashTimer.Interval = 250
HighScoreFlashTimer.Enabled = True
End Sub
Sub EnterHighScoreKey(keycode)
If keycode = LeftFlipperKey Then
playsound "fx_Previous"
hsCurrentLetter = hsCurrentLetter - 1
if(hsCurrentLetter = 0) then
hsCurrentLetter = len(hsValidLetters)
end if
HighScoreDisplayNameNow()
End If
If keycode = RightFlipperKey Then
playsound "fx_Next"
hsCurrentLetter = hsCurrentLetter + 1
if(hsCurrentLetter> len(hsValidLetters) ) then
hsCurrentLetter = 1
end if
HighScoreDisplayNameNow()
End If
If keycode = PlungerKey Then
if(mid(hsValidLetters, hsCurrentLetter, 1) <> "`") then
playsound "fx_Enter"
hsEnteredDigits(hsCurrentDigit) = mid(hsValidLetters, hsCurrentLetter, 1)
hsCurrentDigit = hsCurrentDigit + 1
if(hsCurrentDigit = 3) then
HighScoreCommitName()
else
HighScoreDisplayNameNow()
end if
else
playsound "fx_Esc"
hsEnteredDigits(hsCurrentDigit) = " "
if(hsCurrentDigit> 0) then
hsCurrentDigit = hsCurrentDigit - 1
end if
HighScoreDisplayNameNow()
end if
end if
End Sub
Sub HighScoreDisplayNameNow()
HighScoreFlashTimer.Enabled = False
hsLetterFlash = 0
HighScoreDisplayName()
HighScoreFlashTimer.Enabled = True
End Sub
Sub HighScoreDisplayName()
Dim i
Dim TempTopStr
Dim TempBotStr
TempTopStr = "YOUR NAME:"
dLine(0) = ExpandLine(TempTopStr, 0)
DMDUpdate 0
TempBotStr = " > "
if(hsCurrentDigit> 0) then TempBotStr = TempBotStr & hsEnteredDigits(0)
if(hsCurrentDigit> 1) then TempBotStr = TempBotStr & hsEnteredDigits(1)
if(hsCurrentDigit> 2) then TempBotStr = TempBotStr & hsEnteredDigits(2)
if(hsCurrentDigit <> 3) then
if(hsLetterFlash <> 0) then
TempBotStr = TempBotStr & "_"
else
TempBotStr = TempBotStr & mid(hsValidLetters, hsCurrentLetter, 1)
end if
end if
if(hsCurrentDigit <1) then TempBotStr = TempBotStr & hsEnteredDigits(1)
if(hsCurrentDigit <2) then TempBotStr = TempBotStr & hsEnteredDigits(2)
TempBotStr = TempBotStr & " < "
dLine(1) = ExpandLine(TempBotStr, 1)
DMDUpdate 1
End Sub
Sub HighScoreFlashTimer_Timer()
HighScoreFlashTimer.Enabled = False
hsLetterFlash = hsLetterFlash + 1
if(hsLetterFlash = 2) then hsLetterFlash = 0
HighScoreDisplayName()
HighScoreFlashTimer.Enabled = True
End Sub
Sub HighScoreCommitName()
HighScoreFlashTimer.Enabled = False
hsbModeActive = False
ChangeSong
hsEnteredName = hsEnteredDigits(0) & hsEnteredDigits(1) & hsEnteredDigits(2)
if(hsEnteredName = " ") then
hsEnteredName = "YOU"
end if
HighScoreName(3) = hsEnteredName
SortHighscore
EndOfBallComplete()
End Sub
Sub SortHighscore
Dim tmp, tmp2, i, j
For i = 0 to 3
For j = 0 to 2
If HighScore(j) <HighScore(j + 1) Then
tmp = HighScore(j + 1)
tmp2 = HighScoreName(j + 1)
HighScore(j + 1) = HighScore(j)
HighScoreName(j + 1) = HighScoreName(j)
HighScore(j) = tmp
HighScoreName(j) = tmp2
End If
Next
Next
End Sub
' *************************************************************************
' JP's Reduced Display Driver Functions (based on script by Black)
' only 5 effects: none, scroll left, scroll right, blink and blinkfast
' 3 Lines, treats all 3 lines as text. 3rd line is just 1 character
' Example format:
' DMD "text1","text2","backpicture", eNone, eNone, eNone, 250, True, "sound"
' Short names:
' dq = display queue
' de = display effect
' *************************************************************************
Const eNone = 0 ' Instantly displayed
Const eScrollLeft = 1 ' scroll on from the right
Const eScrollRight = 2 ' scroll on from the left
Const eBlink = 3 ' Blink (blinks for 'TimeOn')
Const eBlinkFast = 4 ' Blink (blinks for 'TimeOn') at user specified intervals (fast speed)
Const dqSize = 64
Dim dqHead
Dim dqTail
Dim deSpeed
Dim deBlinkSlowRate
Dim deBlinkFastRate
Dim dCharsPerLine(2)
Dim dLine(2)
Dim deCount(2)
Dim deCountEnd(2)
Dim deBlinkCycle(2)
Dim dqText(2, 64)
Dim dqEffect(2, 64)
Dim dqTimeOn(64)
Dim dqbFlush(64)
Dim dqSound(64)
Dim FlexDMD
Dim DMDScene
Sub DMD_Init() 'default/startup values
Set FlexDMD = CreateObject("FlexDMD.FlexDMD")
If Not FlexDMD is Nothing Then
FlexDMD.TableFile = Table1.Filename & ".vpx"
FlexDMD.RenderMode = 2
FlexDMD.Width = 128
FlexDMD.Height = 36
FlexDMD.Clear = True
FlexDMD.GameName = cGameName
FlexDMD.Run = True
Set DMDScene = FlexDMD.NewGroup("Scene")
DMDScene.AddActor FlexDMD.NewImage("Back", "VPX.bkempty")
DMDScene.GetImage("Back").SetSize FlexDMD.Width, FlexDMD.Height
DigitsBack(0).Visible = False
For i = 0 to 35
DMDScene.AddActor FlexDMD.NewImage("Dig" & i, "VPX.dempty&dmd=2")
Digits(i).Visible = False
Next
For i = 0 to 19 ' Bottom
DMDScene.GetImage("Dig" & i).SetBounds 4 + i * 6, 3 + 16 + 2, 8, 8
Next
For i = 20 to 35 ' Top
DMDScene.GetImage("Dig" & i).SetBounds (i - 20) * 8, 3, 8, 16
Next
FlexDMD.LockRenderThread
FlexDMD.Stage.AddActor DMDScene
FlexDMD.UnlockRenderThread
End If
Dim i, j
DMDFlush()
deSpeed = 20
deBlinkSlowRate = 5
deBlinkFastRate = 2
dCharsPerLine(0) = 16 'characters lower line
dCharsPerLine(1) = 20 'characters top line
dCharsPerLine(2) = 1 'characters back line
For i = 0 to 2
dLine(i) = Space(dCharsPerLine(i) )
deCount(i) = 0
deCountEnd(i) = 0
deBlinkCycle(i) = 0
dqTimeOn(i) = 0
dqbFlush(i) = True
dqSound(i) = ""
Next
For i = 0 to 2
For j = 0 to 64
dqText(i, j) = ""
dqEffect(i, j) = eNone
Next
Next
DMD dLine(0), dLine(1), dLine(2), eNone, eNone, eNone, 25, True, ""
End Sub
Sub DMDFlush()
Dim i
DMDTimer.Enabled = False
DMDEffectTimer.Enabled = False
dqHead = 0
dqTail = 0
For i = 0 to 2
deCount(i) = 0
deCountEnd(i) = 0
deBlinkCycle(i) = 0
Next
End Sub
Sub DMDScore()
Dim tmp, tmp1, tmp2
if(dqHead = dqTail) Then
tmp = RL(0, FormatScore(Score(Currentplayer) ) )
tmp1 = CL(1, "PLAYER " & CurrentPlayer & " BALL " & Balls)
tmp2 = "bkborder"
End If
DMD tmp, tmp1, tmp2, eNone, eNone, eNone, 25, True, ""
End Sub
Sub DMDScoreNow
DMDFlush
DMDScore
End Sub
Sub DMD(Text0, Text1, Text2, Effect0, Effect1, Effect2, TimeOn, bFlush, Sound)
if(dqTail <dqSize) Then
if(Text0 = "_") Then
dqEffect(0, dqTail) = eNone
dqText(0, dqTail) = "_"
Else
dqEffect(0, dqTail) = Effect0
dqText(0, dqTail) = ExpandLine(Text0, 0)
End If
if(Text1 = "_") Then
dqEffect(1, dqTail) = eNone
dqText(1, dqTail) = "_"
Else
dqEffect(1, dqTail) = Effect1
dqText(1, dqTail) = ExpandLine(Text1, 1)
End If
if(Text2 = "_") Then
dqEffect(2, dqTail) = eNone
dqText(2, dqTail) = "_"
Else
dqEffect(2, dqTail) = Effect2
dqText(2, dqTail) = Text2 'it is always 1 letter in this table
End If
dqTimeOn(dqTail) = TimeOn
dqbFlush(dqTail) = bFlush
dqSound(dqTail) = Sound
dqTail = dqTail + 1
if(dqTail = 1) Then
DMDHead()
End If
End If
End Sub
Sub DMDHead()
Dim i
deCount(0) = 0
deCount(1) = 0
deCount(2) = 0
DMDEffectTimer.Interval = deSpeed
For i = 0 to 2
Select Case dqEffect(i, dqHead)
Case eNone:deCountEnd(i) = 1
Case eScrollLeft:deCountEnd(i) = Len(dqText(i, dqHead) )
Case eScrollRight:deCountEnd(i) = Len(dqText(i, dqHead) )
Case eBlink:deCountEnd(i) = int(dqTimeOn(dqHead) / deSpeed)
deBlinkCycle(i) = 0
Case eBlinkFast:deCountEnd(i) = int(dqTimeOn(dqHead) / deSpeed)
deBlinkCycle(i) = 0
End Select
Next
if(dqSound(dqHead) <> "") Then
PlaySound(dqSound(dqHead) )
End If
DMDEffectTimer.Enabled = True
End Sub
Sub DMDEffectTimer_Timer()
DMDEffectTimer.Enabled = False
DMDProcessEffectOn()
End Sub
Sub DMDTimer_Timer()
Dim Head
DMDTimer.Enabled = False
Head = dqHead
dqHead = dqHead + 1
if(dqHead = dqTail) Then
if(dqbFlush(Head) = True) Then
DMDScoreNow()
Else
dqHead = 0
DMDHead()
End If
Else
DMDHead()
End If
End Sub
Sub DMDProcessEffectOn()
Dim i
Dim BlinkEffect
Dim Temp
BlinkEffect = False
For i = 0 to 2
if(deCount(i) <> deCountEnd(i) ) Then
deCount(i) = deCount(i) + 1
select case(dqEffect(i, dqHead) )
case eNone:
Temp = dqText(i, dqHead)
case eScrollLeft:
Temp = Right(dLine(i), dCharsPerLine(i) - 1)
Temp = Temp & Mid(dqText(i, dqHead), deCount(i), 1)
case eScrollRight:
Temp = Mid(dqText(i, dqHead), (dCharsPerLine(i) + 1) - deCount(i), 1)
Temp = Temp & Left(dLine(i), dCharsPerLine(i) - 1)
case eBlink:
BlinkEffect = True
if((deCount(i) MOD deBlinkSlowRate) = 0) Then
deBlinkCycle(i) = deBlinkCycle(i) xor 1
End If
if(deBlinkCycle(i) = 0) Then
Temp = dqText(i, dqHead)
Else
Temp = Space(dCharsPerLine(i) )
End If
case eBlinkFast:
BlinkEffect = True
if((deCount(i) MOD deBlinkFastRate) = 0) Then
deBlinkCycle(i) = deBlinkCycle(i) xor 1
End If
if(deBlinkCycle(i) = 0) Then
Temp = dqText(i, dqHead)
Else
Temp = Space(dCharsPerLine(i) )
End If
End Select
if(dqText(i, dqHead) <> "_") Then
dLine(i) = Temp
DMDUpdate i
End If
End If
Next
if(deCount(0) = deCountEnd(0) ) and(deCount(1) = deCountEnd(1) ) and(deCount(2) = deCountEnd(2) ) Then
if(dqTimeOn(dqHead) = 0) Then
DMDFlush()
Else
if(BlinkEffect = True) Then
DMDTimer.Interval = 10
Else
DMDTimer.Interval = dqTimeOn(dqHead)
End If
DMDTimer.Enabled = True
End If
Else
DMDEffectTimer.Enabled = True
End If
End Sub
Function ExpandLine(TempStr, id) 'id is the number of the dmd line
If TempStr = "" Then
TempStr = Space(dCharsPerLine(id) )
Else
if(Len(TempStr)> Space(dCharsPerLine(id) ) ) Then
TempStr = Left(TempStr, Space(dCharsPerLine(id) ) )
Else
if(Len(TempStr) <dCharsPerLine(id) ) Then
TempStr = TempStr & Space(dCharsPerLine(id) - Len(TempStr) )
End If
End If
End If
ExpandLine = TempStr
End Function
Function FormatScore(ByVal Num) 'it returns a string with commas (as in Black's original font)
dim i
dim NumString
NumString = CStr(abs(Num) )
For i = Len(NumString) -3 to 1 step -3
if IsNumeric(mid(NumString, i, 1) ) then
NumString = left(NumString, i-1) & chr(asc(mid(NumString, i, 1) ) + 48) & right(NumString, Len(NumString) - i)
end if
Next
FormatScore = NumString
End function
Function CL(id, NumString)
Dim Temp, TempStr
Temp = (dCharsPerLine(id) - Len(NumString) ) \ 2
TempStr = Space(Temp) & NumString & Space(Temp)
CL = TempStr
End Function
Function RL(id, NumString)
Dim Temp, TempStr
Temp = dCharsPerLine(id) - Len(NumString)
TempStr = Space(Temp) & NumString
RL = TempStr
End Function
'**************
' Update DMD
'**************
Sub DMDUpdate(id)
Dim digit, value
If Not FlexDMD is Nothing Then FlexDMD.LockRenderThread
Select Case id
Case 0 'top text line
For digit = 20 to 35
DMDDisplayChar mid(dLine(0), digit-19, 1), digit
Next
Case 1 'bottom text line
For digit = 0 to 19
DMDDisplayChar mid(dLine(1), digit + 1, 1), digit
Next
Case 2 ' back image - back animations
If dLine(2) = "" OR dLine(2) = " " Then dLine(2) = "bkempty"
DigitsBack(0).ImageA = dLine(2)
If Not FlexDMD is Nothing Then DMDScene.GetImage("Back").Bitmap = FlexDMD.NewImage("", "VPX." & dLine(2) & "&dmd=2").Bitmap
End Select
If Not FlexDMD is Nothing Then FlexDMD.UnlockRenderThread
End Sub
Sub DMDDisplayChar(achar, adigit)
If achar = "" Then achar = " "
achar = ASC(achar)
Digits(adigit).ImageA = Chars(achar)
If Not FlexDMD is Nothing Then DMDScene.GetImage("Dig" & adigit).Bitmap = FlexDMD.NewImage("", "VPX." & Chars(achar) & "&dmd=2&add").Bitmap
End Sub
'****************************
' JP's new DMD using flashers
'****************************
Dim Digits, DigitsBack, Chars(255), Images(255)
DMDInit
Sub DMDInit
Dim i
Digits = Array(digit0, digit1, digit2, digit3, digit4, digit5, digit6, digit7, digit8, digit9, digit10, digit11, _
digit12, digit13, digit14, digit15, digit16, digit17, digit18, digit19, digit20, digit21, digit22, digit23, digit24, digit25, _
digit26, digit27, digit28, digit29, digit30, digit31, digit32, digit33, digit34, digit35)
DigitsBack = Array(digit36)
For i = 0 to 255:Chars(i) = "dempty":Images(i) = "dempty":Next
Chars(32) = "dempty"
' Chars(34) = '"
' Chars(36) = '$
' Chars(39) = ''
' Chars(42) = '*
' Chars(43) = '+
' Chars(45) = '-
' Chars(47) = '/
Chars(48) = "d0" '0
Chars(49) = "d1" '1
Chars(50) = "d2" '2
Chars(51) = "d3" '3
Chars(52) = "d4" '4
Chars(53) = "d5" '5
Chars(54) = "d6" '6
Chars(55) = "d7" '7
Chars(56) = "d8" '8
Chars(57) = "d9" '9
Chars(60) = "dless" '<
Chars(61) = "dequal" '=
Chars(62) = "dgreater" '>
' Chars(64) = '@
Chars(65) = "da" 'A
Chars(66) = "db" 'B
Chars(67) = "dc" 'C
Chars(68) = "dd" 'D
Chars(69) = "de" 'E
Chars(70) = "df" 'F
Chars(71) = "dg" 'G
Chars(72) = "dh" 'H
Chars(73) = "di" 'I
Chars(74) = "dj" 'J
Chars(75) = "dk" 'K
Chars(76) = "dl" 'L
Chars(77) = "dm" 'M
Chars(78) = "dn" 'N
Chars(79) = "do" 'O
Chars(80) = "dp" 'P
Chars(81) = "dq" 'Q
Chars(82) = "dr" 'R
Chars(83) = "ds" 'S
Chars(84) = "dt" 'T
Chars(85) = "du" 'U
Chars(86) = "dv" 'V
Chars(87) = "dw" 'W
Chars(88) = "dx" 'X
Chars(89) = "dy" 'Y
Chars(90) = "dz" 'Z
'Chars(91) = "dball" '[
'Chars(92) = "dcoin" '|
'Chars(93) = "dpika" ']
' Chars(94) = '^
' Chars(95) = '_
Chars(96) = "d0a" '0.
Chars(97) = "d1a" '1.
Chars(98) = "d2a" '2.
Chars(99) = "d3a" '3.
Chars(100) = "d4a" '4.
Chars(101) = "d5a" '5.
Chars(102) = "d6a" '6.
Chars(103) = "d7a" '7.
Chars(104) = "d8a" '8.
Chars(105) = "d9a" '9
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) 'thanks gtxjoe for the first version
If TypeName(MyLight) = "Light" Then
If FinalState = 2 Then
FinalState = MyLight.State 'Keep the current light state
End If
MyLight.BlinkInterval = BlinkPeriod
MyLight.Duration 2, TotalPeriod, FinalState
ElseIf TypeName(MyLight) = "Flasher" Then
Dim steps
' Store all blink information
steps = Int(TotalPeriod / BlinkPeriod + .5) 'Number of ON/OFF steps to perform
If FinalState = 2 Then 'Keep the current flasher state
FinalState = ABS(MyLight.Visible)
End If
MyLight.UserValue = steps * 10 + FinalState 'Store # of blinks, and final state
' Start blink timer and create timer subroutine
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
' ********************************
' Table info & Attract Mode
' ********************************
Sub ShowTableInfo
Dim ii
'info goes in a loop only stopped by the credits and the startkey
If Score(1) Then
DMD CL(0, "LAST SCORE"), CL(1, "PLAYER 1 " &FormatScore(Score(1) ) ), "", eNone, eNone, eNone, 3000, False, ""
End If
If Score(2) Then
DMD CL(0, "LAST SCORE"), CL(1, "PLAYER 2 " &FormatScore(Score(2) ) ), "", eNone, eNone, eNone, 3000, False, ""
End If
If Score(3) Then
DMD CL(0, "LAST SCORE"), CL(1, "PLAYER 3 " &FormatScore(Score(3) ) ), "", eNone, eNone, eNone, 3000, False, ""
End If
If Score(4) Then
DMD CL(0, "LAST SCORE"), CL(1, "PLAYER 4 " &FormatScore(Score(4) ) ), "", eNone, eNone, eNone, 3000, False, ""
End If
DMD "", "", "gameover", eNone, eNone, eBlink, 2000, False, ""
If bFreePlay Then
DMD "", CL(1, "FREE PLAY"), "", eNone, eNone, eNone, 2000, False, ""
Else
If Credits> 0 Then
DMD CL(0, "CREDITS " & Credits), CL(1, "PRESS START"), "", eNone, eBlink, eNone, 2000, False, ""
Else
DMD CL(0, "CREDITS " & Credits), CL(1, "INSERT COIN"), "", eNone, eBlink, eNone, 2000, False, ""
End If
End If
DMD "", "", "jppresents", eNone, eNone, eNone, 3000, False, ""
DMD "", "", "miraculous", eNone, eNone, eNone, 4000, False, ""
DMD CL(0, "HIGHSCORES"), Space(dCharsPerLine(1) ), "", eScrollLeft, eScrollLeft, eNone, 20, False, ""
DMD CL(0, "HIGHSCORES"), "", "", eBlinkFast, eNone, eNone, 1000, False, ""
DMD CL(0, "HIGHSCORES"), "1> " &HighScoreName(0) & " " &FormatScore(HighScore(0) ), "", eNone, eScrollLeft, eNone, 2000, False, ""
DMD "_", "2> " &HighScoreName(1) & " " &FormatScore(HighScore(1) ), "", eNone, eScrollLeft, eNone, 2000, False, ""
DMD "_", "3> " &HighScoreName(2) & " " &FormatScore(HighScore(2) ), "", eNone, eScrollLeft, eNone, 2000, False, ""
DMD "_", "4> " &HighScoreName(3) & " " &FormatScore(HighScore(3) ), "", eNone, eScrollLeft, eNone, 2000, False, ""
DMD Space(dCharsPerLine(0) ), Space(dCharsPerLine(1) ), "", eScrollLeft, eScrollLeft, eNone, 500, False, ""
End Sub
Sub StartAttractMode
ChangeSong
StartLightSeq
DMDFlush
ShowTableInfo
End Sub
Sub StopAttractMode
LightSeqAttract.StopPlay
DMDScoreNow
End Sub
Sub StartLightSeq()
'lights sequences
LightSeqAttract.UpdateInterval = 25
LightSeqAttract.Play SeqBlinking, , 5, 150
LightSeqAttract.Play SeqRandom, 40, , 4000
LightSeqAttract.Play SeqAllOff
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 50, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqCircleOutOn, 15, 2
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 25, 1
LightSeqAttract.UpdateInterval = 10
LightSeqAttract.Play SeqCircleOutOn, 15, 3
LightSeqAttract.UpdateInterval = 5
LightSeqAttract.Play SeqRightOn, 50, 1
LightSeqAttract.UpdateInterval = 5
LightSeqAttract.Play SeqLeftOn, 50, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqRightOn, 50, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 50, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqRightOn, 40, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 40, 1
LightSeqAttract.UpdateInterval = 10
LightSeqAttract.Play SeqRightOn, 30, 1
LightSeqAttract.UpdateInterval = 10
LightSeqAttract.Play SeqLeftOn, 30, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqRightOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqRightOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 15, 1
LightSeqAttract.UpdateInterval = 10
LightSeqAttract.Play SeqCircleOutOn, 15, 3
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqRightOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 25, 1
LightSeqAttract.UpdateInterval = 5
LightSeqAttract.Play SeqStripe1VertOn, 50, 2
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqCircleOutOn, 15, 2
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqStripe1VertOn, 50, 3
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqRightOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqCircleOutOn, 15, 2
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqStripe2VertOn, 50, 3
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqRightOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 25, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqStripe1VertOn, 25, 3
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqStripe2VertOn, 25, 3
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqUpOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqDownOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqRightOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqRightOn, 15, 1
LightSeqAttract.UpdateInterval = 8
LightSeqAttract.Play SeqLeftOn, 15, 1
End Sub
Sub LightSeqAttract_PlayDone()
StartLightSeq()
End Sub
Sub LightSeqTilt_PlayDone()
LightSeqTilt.Play SeqAllOff
End Sub
'***********************************************************************
' *********************************************************************
' Table Specific Script Starts Here
' *********************************************************************
'***********************************************************************
Dim bFlipperPost
Dim bRedBall
' droptargets, animations, etc
Sub VPObjects_Init
End Sub
' tables variables and Mode init
Sub Game_Init() 'called at the start of a new game
Dim i, j
'Play some Music
ChangeSong
'Init Variables
bFlipperPost = True
bRedBall = False
'Init Delays/Timers
'MainMode Init()
'Init lights
TurnOffPlayfieldLights()
End Sub
Sub StopEndOfBallMode() 'this sub is called after the last ball is drained
End Sub
Sub ResetNewBallVariables() 'reset variables for a new ball or player
End Sub
Sub ResetNewBallLights() 'turn on or off the needed lights before a new ball is released
TurnOffPlayfieldLights
li016.State = 1
li017.State = 1
li018.State = 1
li019.State = 1
End Sub
Sub TurnOffPlayfieldLights()
Dim a
For each a in aLights
a.State = 0
Next
End Sub
Sub ShowPost
If bFlipperPost Then
bFlipperPost=False
post.Visible = 0
postrubber.Visible = 0
postwall.collidable = 0
Else
bFlipperPost=True
post.Visible = 1
postrubber.Visible = 1
postwall.collidable = 1
End If
End Sub
Sub ChangeBallImage()
Dim BOT, b
BOT = GetBalls
' exit the Sub if no balls on the table
If UBound(BOT) = -1 Then Exit Sub
' change the ball color
bRedBall = NOT bRedBall
' change the image for each ball
For b = 0 to UBound(BOT)
If bRedBall Then
BOT(b).FrontDecal = "Red"
Else
BOT(b).FrontDecal = "White"
End If
Next
End Sub
' *********************************************************************
' Table Object Hit Events
'
' Any target hit Sub should do something like this:
' - play a sound
' - do some physical movement
' - add a score, bonus
' - check some variables/Mode this trigger is a member of
' - set the "LastSwitchHit" 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
DOF 105, DOFPulse
GiEffect 4
LeftSling4.Visible = 1
Lemk.RotX = 26
LStep = 0
LeftSlingShot.TimerEnabled = True
' add some points
AddScore 100
End Sub
Sub LeftSlingShot_Timer
Select Case LStep
Case 1:LeftSLing4.Visible = 0:LeftSLing3.Visible = 1:Lemk.RotX = 14
Case 2:LeftSLing3.Visible = 0:LeftSLing2.Visible = 1:Lemk.RotX = 2
Case 3:LeftSLing2.Visible = 0:Lemk.RotX = -10:LeftSlingShot.TimerEnabled = 0
End Select
LStep = LStep + 1
End Sub
Sub RightSlingShot_Slingshot
If Tilted Then Exit Sub
PlaySoundAt SoundFXDOF("fx_slingshot", 104, DOFPulse, DOFcontactors), Remk
DOF 106, DOFPulse
GiEffect 4
RightSling4.Visible = 1
Remk.RotX = 26
RStep = 0
RightSlingShot.TimerEnabled = True
' add some points
AddScore 100
End Sub
Sub RightSlingShot_Timer
Select Case RStep
Case 1:RightSLing4.Visible = 0:RightSLing3.Visible = 1:Remk.RotX = 14
Case 2:RightSLing3.Visible = 0:RightSLing2.Visible = 1:Remk.RotX = 2
Case 3:RightSLing2.Visible = 0:Remk.RotX = -10:RightSlingShot.TimerEnabled = 0
End Select
RStep = RStep + 1
End Sub
'*********
' Bumpers
'*********
Sub Bumper1_Hit
If NOT Tilted Then
PlaySoundAt SoundFXDOF("fx_bumper", 109, DOFPulse, DOFContactors), Bumper1
DOF 138, DOFPulse
GiEffect 4
' add some points
AddScore 100
End If
End Sub
Sub Bumper2_Hit
If NOT Tilted Then
PlaySoundAt SoundFXDOF("fx_bumper", 110, DOFPulse, DOFContactors), Bumper2
DOF 140, DOFPulse
GiEffect 4
' add some points
AddScore 100
End If
End Sub
'*********
' Rubbers
'*********
'50 points
Sub RubberBand003_Hit:Addscore 50:End Sub
Sub RubberBand006_Hit:Addscore 50:End Sub
'10 points
Sub RubberBand007_Hit:Addscore 10:End Sub
Sub RubberBand008_Hit:Addscore 10:End Sub
'************
' ABCD Lanes
'************
Sub Trigger005_Hit
PlaySoundAt "fx_sensor", Trigger005
If Tilted Then Exit Sub
li016.State = 0
AddScore 1000
AddBonus 1
CheckABCD
End Sub
Sub Trigger006_Hit
PlaySoundAt "fx_sensor", Trigger006
If Tilted Then Exit Sub
li017.State = 0
AddScore 1000
AddBonus 1
CheckABCD
End Sub
Sub Trigger007_Hit
PlaySoundAt "fx_sensor", Trigger007
If Tilted Then Exit Sub
li018.State = 0
AddScore 1000
AddBonus 1
CheckABCD
End Sub
Sub Trigger008_Hit
PlaySoundAt "fx_sensor", Trigger008
If Tilted Then Exit Sub
li019.State = 0
AddScore 1000
AddBonus 1
CheckABCD
End Sub
Sub CheckABCD
Dim tmp
tmp = li016.State + li017.State + li018.State + li019.State 'all upper lanes are off
If tmp = 0 Then
AddScore 25000
LightEffect 7
li020.State = 1 'turn on extra ball lights
li021.State = 1
End If
End Sub
'***********************
' Outlanes - Extra Ball
'***********************
Sub Trigger001_Hit
PlaySoundAt "fx_sensor", Trigger001
If Tilted Then Exit Sub
If li020.State Then
AwardExtraBall
End If
AddScore 500
End Sub
Sub Trigger004_Hit
PlaySoundAt "fx_sensor", Trigger004
If Tilted Then Exit Sub
If li021.State Then
AwardExtraBall
End If
AddScore 500
End Sub
'**********
' Inlanes
'**********
Sub Trigger002_Hit
PlaySoundAt "fx_sensor", Trigger002
If Tilted Then Exit Sub
AddScore 500
AddBonus 1
End Sub
Sub Trigger003_Hit
PlaySoundAt "fx_sensor", Trigger003
If Tilted Then Exit Sub
AddScore 500
AddBonus 1
End Sub
'*********
' Targets
'*********
Sub Target001_Hit
PlaySoundAt "fx_target", Target001
If Tilted Then Exit Sub
AddScore 500
AddBonus 2
li013.State = 1
CheckBonusX
End Sub
Sub Target002_Hit
PlaySoundAt "fx_target", Target002
If Tilted Then Exit Sub
AddScore 500
AddBonus 2
li014.State = 1
CheckBonusX
End Sub
Sub Target003_Hit
PlaySoundAt "fx_bull", Target003
If Tilted Then Exit Sub
AddScore 1000
li015.State = 1
CheckBonusX
End Sub
Sub CheckBonusX
Dim tmp
tmp = li013.State + li014.State + li015.State 'all upper lanes are off
If tmp = 3 Then
'turn on 3x bonus light
BonusMultiplier(CurrentPlayer) = 3
UpdateBonusXLights
End If
If tmp = 2 AND li015.State = 0 Then
'turn on 2x bonus light
BonusMultiplier(CurrentPlayer) = 2
UpdateBonusXLights
End If
End Sub
'***********
' Spinners
'***********
Sub Spinner001_Spin
PlaySoundAt "fx_spinner", Spinner001
If Tilted Then Exit Sub
Addscore 100
End Sub
Sub Spinner002_Spin
PlaySoundAt "fx_spinner", Spinner002
If Tilted Then Exit Sub
Addscore 100
End Sub
Other files you may be interested in ..
- 18,376 Total Files
- 57 Total Categories
- 873 Total Authors
- 25,427,428 Total Downloads
- Operation Thunder (Gottlieb 1992)_Bigus(MOD) Latest File
- bigus1 Latest Submitter
user(s) are online (in the past 15 minutes)
members, guests, anonymous users










are all trademarks of VPFORUMS.
Thank you for another nice original table Ivan.
Download link: https://www.vpforums...&showfile=14493
See all my Wheels: Hosted on MEGA