Je me lance sur un espèce de tuto/bonne pratique pour l'amélioration des tables Electro-Mécaniques (EM) et originale sur VPX (tables sans ROM).
Il est fort possible que cela soit super décousu (et ultra long) au moins dans un premier temps, je pourrais ré-ajuster dans un deuxième temps.
Avant tout amis lecteurs, comprenez qu'ici je ne suis pas un spécialiste.
Je vais essayer de rapporter et condenser toutes les infos qui nous ont été livrées par les vrais pros.
Pour le DOF, nous avons ici
@arngrim sur le forum, qui a développé une bonne partie du DOF actuel (et dofé des centaines et des centaines de tables), et qui a formé une petite équipe sur le DOF des tables EM. Une fois de plus milles merci à lui.
Pour le SSF je vous transmet des infos de
@Thalamus et TerryRed.
Je ne suis moi même pas du tout développeur, et donc je ne comprends même pas la moitié de ce que je fais !
Donc je vais probablement écrire des boulettes. Ce sera corrigé au fur et à mesure que les pros me reprendrons !
J'en profite pour remercier (pour la postérité) de nouveau
@arngrim pour la formation et le suivi dinguo fait sur le sujet,
@foxyt pour s'être lancé dans la galère en même temps que moi
, et
@ebor et
@actarus qui nous accompagnent régulièrement sur nos questionnements.
J'espère que d'autres gogols se joindrons à nous dans l'aventure.
Il faut également savoir qu'il y a déjà une vraie documentation pour le DOF.
Suivez le lien ici.
C'est ultra complet mais ça se focalise surtout sur la mise en place du DOF dans nos pincab et sur le code indispensable pour faire fonctionner tout ça.
Pourquoi parler du DOF et du SSF en même temps ?
Car une bonne partie des fonctions sont imbriquées ! Tant qu'à améliorer une table avec du DOF, autant prendre un petit peu de temps en plus pour inclure du SSF.
Le DOFLe principe ?
On colle une info dans le script côté VPX, qui va communiquer
par l'intermédiaire du B2s (c'est important, on reviendra dessus) avec le logiciel DOF installé sur votre pincab. Normalement si vous débarquez ici vous avez déjà installé/configuré votre DOF, vous savez à peu près de quoi on parle.
Ce DOF installé dans votre pincab est configuré par l'intermédiaire du
DOF Config-Tool. Attention ce DOF config-tool est partagé par toute la communauté (c'est important également, on va y revenir).
On va donc travailler dans le script côté VPX, et dans le config-tool en ligne.
Quand on DOF, on passe constamment de l'un à l'autre.
Pour simplifier le boulot, le mieux est de travailler sur un fichier en dehors du logiciel VPX !
On copie/colle l'intégralité du script dans un fichier .vbs au nom exact de la table, et on enregistre ce fichier dans le dossier où est installé la table.
Quand VPX se lance, il vient lire en priorité le script du fichier .vbs, comme ça vous ne touchez pas (dans un premier temps) le script original.
Exemple.
Mon fichier de table VPX s'appelle
Teacher_s Pet (Williams 1965).vpxJe créer un fichier
Teacher_s Pet (Williams 1965).vbs, je colle le script complet dedans et j'enregistre le fichier dans le même dossier que la table.
Pour travailler sur le script, utilisez un petit programme fait exprès (le notepad fonctionne mais on ne voit pas grand-chose), exemple celui-ci qui est très bien et gratuit : Visual Studio code
La base de la basePour que ma table soit comprise, elle a une identité unique (le plus souvent) sur le DOF.
Cette identité est utilisé par le B2s et par le DOF.
Cette info, côté script, c'est la fonction cgamename.
Exemple côté script :
- Code:
-
Const cGameName = "TeachersPet_1965"
Côté config-tool :
Si la table n'existe pas dans la liste, si elle n'a pas été entré, il faudra en demander la création à Arngrim, en donnant l'intitulé
exact du cgamename.
Si la table existe déjà ET que vous voyez des entrées déjà configurées : fuyez, pauvres fous ! Si vous vous attaquez à un chantier déjà public ATTENTION ! Vous n'avez pas le droit de modifier le nom des entrées déjà présentes, sinon vous allez casser tous les DOF précédents (et là on ne peut plus rien pour vous, ce sera la lapidation).
Il y a des exceptions pour les tables très ressemblantes, exemple une version 1 joueur et 4 joueur.
Nous aurons une seule entrée config-tool, avec différents alias correspondants aux différents cgamename. Comme ça on ne fait qu'un seul config-tool. Cela veut dire que si on se lance dans le DOF d'une table qui a une jumelle (une version add a ball, ou une version 4 joueurs par exemple), et bien on se lance dans les 2 (ou 3) tables en même temps pour éviter les erreurs !
Ensuite, si je veux discuter avec mon DOF, je vais appeler un numéro d'évènement dans le script, qui aura une correspondance dans mon config-tool.
Exemple :
Côté script, j'écris
- Code:
-
DOF 101, fonction
Côté config-tool, je vais avoir un E
101 (E comme évènement).
Ici on voit que les flippers gauche et droit sont respectivement E101 et E102, et que les slinghots sont nommés E103 et E104.
Qu''est-ce qu'on a comme fonction de disponibles ?
Voici celles de base :
-
DOFPulse -> envoie une impulsion
-
DOFOn -> allume "définitivement" l'évènement associé
-
DOFOff -> éteint "définitivement" l'objet associé
Avec ces 3 fonctions on peut gérer l'intégralité d'une table EM.
Voici donc un script valide qui sera compris :
- Code:
-
DOF 101, DOFOn
J'allume simplement le E101 côté config-tool.
Si dans un script vous trouvez quelque-chose comme :
- Code:
-
DOF 101, 2
C'est du vieux dof, il faut le mettre à jour !
Côté config-tool, nous pouvons ajouter des infos supplémentaires.
Sur les contacteurs/solenoids, ce sera un simple E101 pour flipper et slingshot, pour les targets et droptargets, nous devons ajouter @t@ (target) et @dt@ (droptarget). Cela permet de gérer finement le DOF et de faire fonctionner différement les contacteurs lorsqu'il s'agit de target ou de droptarget.
Exemple ici :
Nous avons les flipper et slingshot en EXXX, puis des contacteurs en EXXX @t@ ou EXXX @dt@
Si vous avez bien compris, dans l'exemple le contacteur "bumper middle center" peut être apellé dans le script par un DOF 105 et un DOF 110. Ce contacteur servira pour 2 fonctions du script.
Notez que chaque éléments est séparé par un "/" sur une ligne.
IMPORTANT : ne jamais finir une ligne par "/"
IMPORTANT : ne jamais mettre d'espace en tropExemple de code doublement foireux côté config-tool :
- Code:
-
E101 @t@/E102/
Personnellement je nomme ainsi dans le config-tool
- E1XX les contacteurs/solenoids
- E2XX les lumières, strobe
- E3XX les gros toys, comme le knocker ou les chimes.
Comme ça en un coup d'oeil dans le script on sait à quel type d'évènement on fait appel.
Pour les lumières, nous avons des possibilités supplémentaires côté config-tool.
Nous pouvons ajouter une couleur.
Il y a un tableau de couleur sur le tool, si on clique dessus cela nous rapporte la bonne couleur dans la ligne sélectionnée.
Dans une ligne je peux donc avoir :
- Code:
-
E201 White
La lumière associée va s'allumer en blanc pendant 60 millisecondes (c'est le temps par défaut)
Côté script :
- Code:
-
DOF 201, DOFPulse
Autres fonctions pour les lumières :
- 300 -> un nombre, ce sera le temps d'allumage (exemple E230 300 allume le strobe 230 pendant 300 millisecondes)
- w150 -> un délais de 150 millisecondes avant que cela s'allume(cela peut être le chiffre que vous voulez), très utile pour les "animations"
- f200 -> fade-up et fade-down (sur 200 ms ici). La lumière s'allume et s'éteint progressivement.
- fu200 -> fade up
- fd200 -> fade down
Voici un exemple de config-tool rempli côté flashboard :
Cela peut faire peur surtout que nous ne voyons pas toute la ligne, ça défile encore à droite ! Mais en fait on le remplis au fur et à mesure que l'on renseigne le script.
Il faudra faire vraiment attention avec les espaces et les "/". Pas le droit à l'erreur !
Où mettre des effets DOF, qu'est-ce que l'on peut activer ?Ici je vais proposer ce qu'il "faudrait" faire pour les tables EM.
Nous avons tous nos idées sur le sujet, mais il y a des bonnes pratiques qui sont mise en place par la communauté depuis plusieurs années, et nous allons essayer de suivre tout ça, pour que le DOF des tables EM soit homogène et sobre.
Nous verrons plus loin que pour les créatifs ou les dinguos du clignotement, nous avons une solution !
Voilà pour le fonctionnement de base.
Maintenant nous allons voir que pour chaque éléments, cela est géré différemment.
Il n'y aura pas de gros changement pour les lumières, côté script ce sera souvent un
- Code:
-
E201, DOFPulse
Mais pour le reste, tout change (oui sinon ce serait trop simple) !!!!
La théorieLa base du DOF, nous allons activer les solenoides/contacteurs sur :
- les flippers
- les slingshots
- les bumpers
- les cibles tombantes et non tombantes (Targets et Droptargets) pendant le choc et lorsque les cibles remontent (EXXX @t@ et EXXX @dt@)
- les eject holes au moment du kick
- le slingshot droit au moment de la "ballrelease"
-
on COUPE les contacteurs des flippers en cas de tiltCôté lumière
- On allume ou éteint le "start button" en fonction de la présence de crédit (
EXXX Blink fu500 fd600)
- On allume l'undercab quand on lance la table, on l'éteint quand la partie est terminée
(EXXX couleur)- Pulse sur une lumière flashboard pour chaque bumper
(EXXX couleur)- Pulse long pour les passages de la bille sur les roll-over
(EXXX couleur f200)- Pulse très long pour les passages de la bille dans les outlanes
(EXXX couleur f400)- Pulse lorsque le spinner tourne (EXXX couleur f200)
- Pulse lors du drain
(EXXX couleur fd800)- Pulse sur kick d'eject hole + strobe
- Bonus : on ajoute une animation flashboard lorsque la bille entre en jeu
- Bonus : on ajoute une animation flashboard en début et fin de partie
Autres toys
- Knocker + strobe quand ça claque (strobe en 300 ms)
- Chimes à gérer
Si vous en voulez plus
SUR LES TABLES EM, notamment côté lumière (exemple une lumière au moment où on touche une cible), nous gèrerons ça avec une option (je l'appelle epileptikdof sur mes DOF). Nous verrons ça en bonus.
SUR LES TABLES ORIGINALES : vous faites ce que vous voulez côté lumière !
Nous allons prendre chaque éléments un par un.
Les flippersScript d'origine sur une table non-dofée de Loserman76 :
- Code:
-
If keycode = LeftFlipperKey and InProgress=true and TableTilted=false Then
LeftFlipper.RotateToEnd
PlaySound "FlipperUp"
PlaySound "buzzL",-1
End If
Nous allons intégrer le DOF sur le son qui est apellé (playsound "FlipperUp").
Ici FlipperUp est tout simplement le nom du fichier son (souvent un wav) !
Vous pouvez le retrouver dans le sound manager de VPX et le jouer pour tester.
Script après DOF :
- Code:
-
If keycode = LeftFlipperKey and InProgress=true and TableTilted=false Then
LeftFlipper.RotateToEnd
PlaySound SoundFXDOF("FlipperUp",201,DOFOn,DOFContactors)
PlaySound "buzzL",-1
End If
On a bien notre 201, DOFOn que nous connaissons, mais nous utilisons la fonction SoundFXDOF qui permet de joueur le son + d'appeller un évènement DOF. Nous appellons un contacteur/solenoids, donc ce sera DOFContactors.
Et donc on appelle le E201 situé sur "Flipper Left" dans le config-tool.
Et là on stoppe tout car nous allons introduire le...
SSFEt oui, car même si on ne maîtrise pas encore le DOF, les fonctions SSF s'intègrent au milieu de tout ça.
Donc autant avancer en même temps.
Comment fonctionne le SSF, très grossièrement ?
Quand le script joue un son, on va lui dire : ok tu joue ce son, mais à endroit précis.
Cet endroit n'est pas une coordonnée, mais un objet de la table (cela peut-être absolument n'importe quoi SAUF les walls et rubbers, qui n'ont pas de coordonnées X,Y dans VPX).
Pour que nous puissions utiliser les fonctions SSF, il va falloir les intégrer au script. Nous verrons ça dans une deuxième partie.
Reprenons....
Les flippersVoici le code avec SSF :
- Code:
-
If keycode = LeftFlipperKey and InProgress=true and TableTilted=false Then
LeftFlipper.RotateToEnd
PlaySoundAtVol SoundFXDOF ("FlipperUp",101,DOFOn,DOFContactors), LeftFlipper, 1
PlayLoopSoundAtVol "buzzL", LeftFlipper, 1
End If
Au lieu de Playsound, nous avons
PlaysoundAtVol, puis, après la parenthèse son et DOF, LefFlipper, 1
- LeftFlipper, c'est l'objet où on doit jouer le son !
- 1 c'est le volume !
Pour le buzz, on utilise une fonction SSF loop (
PlayLoopSoundAtVol), toujours sur l'objet LeftFlipper, et toujours à volume 1.
Concernant le Volume, vous pouvez aller de 0,1 à 1.
Si vous voulez un son plus fort il faudra l'exporter de la table, le modifier en externe et le ré-importer dans la table.
Si je récapitule ce script, on voit que lorsque le bouton lefflipper est enclenché, Loserman fait tourner l'objet leftflipper à fond, puis on joue le son FlipperUp à volume 1, à l'endroit où se trouve l'objet LefFlipper.
Ensuite on fait tourner en boucle le son "buzzL" (le buzz des solenoids de l'époque), toujours à volume 1 et à l'endroit précis de l'objet LefFlipper.
Et voilà, félicitation, vous savez gérer le DOF + le SSF !
Je vais continuer élément par élément, mais l'idée sera la même partout, ça va même se simplifier quand on va arriver aux lumières.
Pour les flippers ce n'est pas terminé.
On l'a fait pour le flipper gauche, faut le faire pour le flipper droit :
- Code:
-
If keycode = RightFlipperKey and InProgress=true and TableTilted=false Then
RightFlipper.RotateToEnd
PlaySoundAtVol SoundFXDOF ("FlipperUp",102,DOFOn,DOFContactors), RightFlipper, 1
PlayLoopSoundAtVol "buzz", RightFlipper, 1
End If
Ensuite il faut qu'ils se coupent quand on relâche le bouton.
Voici un code d'origine sans DOF :
- Code:
-
If keycode = RightFlipperKey and InProgress=true and TableTilted=false Then
RightFlipper.RotateToStart
StopSound "buzz"
PlaySound "FlipperDown"
End If
Voici le code à mettre pour DOF+SSF lorsque l'on relâche :
- Code:
-
If keycode = LeftFlipperKey and InProgress=true and TableTilted=false Then
LeftFlipper.RotateToStart
PlaySoundAtVol SoundFXDOF ("FlipperDown",101,DOFOff,DOFContactors), LeftFlipper, 1
StopSound "buzzL"
End If
Et "idem" côté droit bien entendu.
IMPORTANT
Notez qu'on a un morceau de script qui vérifie que la table ne soit pas tiltée.
Si c'est tilté, il ne se passe rien.
Imaginez que vous avez le bouton enfoncé, et que vous tiltez la table... Il se passe quoi ? Le E101 reste sur DOFOn.... En gros vous allez cramer votre solenoid ou votre contacteur !
Donc quand on DOF une table, dès que l'on a fait les flippers, on cherche l'endroit du script qui gère le tilt, et on ajoute :
- Code:
-
DOF 101, DOFOff
DOF 102, DOFOff
Exemple chez Loserman :
- Code:
-
Sub TiltIt()
TiltCount = TiltCount + 1
if TiltCount = 3 then
TableTilted=True
PlasticsOff
BumpersOff
LeftFlipper.RotateToStart
RightFlipper.RotateToStart
DOF 101, DOFOff
DOF 102, DOFOff
TiltReel.SetValue(1)
[...]
Petit détail : s'il y a plus de 2 flippers sur la table (par exemple des flippers en haut de table), on ne s'embête pas à activer des contacteurs pour ça. ça fait un bordel monstre et en plus cela pourrait nous bloquer pour l'utilisation des bumpers ou des targets qui seraient pas loin sur la table.
Les slingshotsUn code de slingshot vide :
- Code:
-
Sub LeftSlingShot_Slingshot
playsound "left_slingshot",0,1,-0.05,0.05
LSling0.Visible = 0
LSling1.Visible = 1
sling2.TransZ = -20
LStep = 0
LeftSlingShot.TimerEnabled = 1
AddScore(1)
End Sub
Oula, il y a des chiffres bizarres derrière le son joué.... On pourrait les récupérer mais... Ce sont des coordonnées pour le son qui ne nous servent à rien. Voici donc un script DOfé et SSFisé :
- Code:
-
Sub LeftSlingShot_Slingshot
playsoundAtVol SoundFXDOF ("left_slingshot",103,DOFPulse,DOFContactors), sling2, 1
DOF 203, DOFPulse
If Epileptikdof = True Then DOF 204, DOFPulse End If
If Epileptikdof = True Then DOF 202, DOFPulse End If
LSling0.Visible = 0
LSling1.Visible = 1
sling2.TransZ = -20
LStep = 0
LeftSlingShot.TimerEnabled = 1
AddScore(1)
End Sub
Ah ça prend de l'ampleur !
On joue le son "left_slingshot" au volume 1 sur l'objet sling2 (SSF), et on active le E103 (DOF config-tool)
Ensuite, ligne suivante, on allume le E203 avec un pulse.
Ce E203 c'est une couleur, si possible positionnée sur "5 Flasher Outside Left" (oui on est sur le slingshot de gauche). Pas de trucs en plus, ça doit être vif, donc
E203 Red par exemple.
En dessous apparait pour la première fois mon option epileptikdof.
Si elle a été activée en début de script, je lance en plus :
- un E204 qui correspond au PF Left Flashers MX : E204 Red AT0 AL20 AW10 AH100
- un E202 qui est l'undercab suivant : E202 White -> à chaque slingshot l'undercab clignote "comme un strobe en plus léger".
Les bumpersUn code de bumper vide :
- Code:
-
Sub Bumper1_Hit
If TableTilted=false then
PlaySound SoundFXDOF("bumper1",208,DOFPulse,DOFContactors)
DOF 209,2
bump1 = 1
If Bumper1Light.state=1 then
AddScore(10)
else
AddScore(10)
End If
end if
End Sub
Un code de bumper mis à jour :
- Code:
-
Sub Bumper1_Hit
If TableTilted=false then
PlaySoundAtVol SoundFXDOF ("bumper1",105,DOFPulse,DOFContactors), ActiveBall, 1
DOF 207, DOFPulse
If Epileptikdof = True Then DOF 202, DOFPulse End If
bump1 = 1
If Bumper1Light.state=1 then
AddScore(10)
else
AddScore(10)
End If
end if
End Sub
Ah une petit subtilité sur le SSF !
On va jouer le son sur la bille directement. A priori le SSF se débrouille mieux comme ça, surtout dès qu'il y a plusieurs billes !
Le DOF 207, Pulse est une lumière de la flashboard, si possible "en face" du bumper, et de la même couleur.
E207 Green par exemple.
Si epileptikdof est activée, je fais encore clignoter l'undercab. Kiffant sur les tables à 5 bumpers, j'ai retrouvé des personnes convulsant au pied de mon pincab !
Les cibles non-tombantes et cibles tombantes (targets et droptargets) On cherche une fois de plus le son des target touchées.
Exemple facile :
- Code:
-
Sub TopTargetLeft_Hit()
if TableTilted=false then
Playsound "target"
AddScore(10)
If LightLeftTarget.state=1 then
LightLeftTarget.state=0
LetterLight003.state=1
If B2SOn then Controller.B2SSetData 53,1
CheckTeacher
end if
end if
end sub
Complet :
- Code:
-
Sub TopTargetLeft_Hit()
if TableTilted=false then
PlaysoundAtVol SoundFXDOF ("target",108, DOFPulse, DOFTargets), TopTargetLeft, 1
If Epileptikdof = True Then DOF 212, DOFPulse End If
AddScore(10)
If LightLeftTarget.state=1 then
LightLeftTarget.state=0
LetterLight003.state=1
If B2SOn then Controller.B2SSetData 53,1
CheckTeacher
end if
end if
end sub
On oublie pas sur le config-tool :
E108 @t@Et si possible on place ce E108 sur le contacteur le plus proche "géographiquement" de l'emplacement de la cible.
On note ici que la commande DOF est bien "
DOFTargets" (et pas
DOFContactors) et que la lumière E212 ne s'active que si ma fonction epileptikdof est activée.
Si nous avons affaire à une DropTarget, 2 différences.
Côté script :
PlaysoundAtVol SoundFXDOF ("target",108, DOFPulse,
DOFDropTargets), TopTargetLeft, 1 (on utilise la fonction DOFDroptargets)
Côté config-tool :
E108 @dt@
Alors par contre des fois les cibles, c'est la grosse galère !
Très régulièrement, on a le son géré dans une "collection", et le code "hit" à côté.
Exemple :
- Code:
-
Sub Targets_Hit (idx)
PlaySound "target", 0, Vol(ActiveBall), AudioPan(ActiveBall), 0, Pitch(ActiveBall), 0, 0, AudioFade(ActiveBall)
End Sub
Ici les cibles font partie d'une collection et suivant leur "idx", leur numéro dans la liste, un son sera joué (le son "target").
Plus loin on a :
- Code:
-
Sub LowerTargetRight_Hit
if TableTilted=false then
LowerTargetRight.IsDropped=true
[...]
end sub
Je vais coller ce que je ferais, mais cette partie va devoir attendre l'intervention d'Arngrim pour être confirmée.
Version Dofée :
- Code:
-
Sub Targets_Hit (idx)
PlaySound SoundFX ("target", DOFPulse, DOFDropTargets), 0, Vol(ActiveBall), AudioPan(ActiveBall), 0, Pitch(ActiveBall), 0, 0, AudioFade(ActiveBall)
End Sub
- Code:
-
Sub LowerTargetRight_Hit
if TableTilted=false then
DOF 110, DOFPulse
If Epileptikdof = True Then DOF 228, DOFPulse End If
LowerTargetRight.IsDropped=true
[...]
end if
end sub
DOF 110 étant un E110 @dt@
Sur les Droptargets, il faut gérer quand ça se relève, re-mettre un coup de contacteur + SSF.
Il faut trouver le code associé.
Des fois c'est juste en dessous, et ça se fait cible par cilbe, des fois c'est une fonction qui englobe toutes les cibles.
- Code:
-
Sub ResetDrops()
LowerTargetLeft.IsDropped=false
LowerTargetRight.IsDropped=false
playsound "droptargetreset"
End Sub
Code avec DOF et SSF :
- Code:
-
Sub ResetDrops()
LowerTargetLeft.IsDropped=false
LowerTargetRight.IsDropped=false
PlaySoundAtVol SoundFXDOF ("droptargetreset", 110, DOFPulse, DOFDropTargets), Button002, 1
End Sub
Regardez bien, avec le SSF on joue le son sur un objet Button002. Pourquoi ?
Parce-que nous n'avons qu'un seul son pour les 2 cibles qui remontent. Elles sont assez proche, et entre les deux il y a cet objet.
Donc on joue le son sur cet objet, le plus proche des 2 cibles. Cette astuce vous est fournie par Thalamus@corporation.
Les eject-holes (ou kickers)A priori sur une table EM on ne met rien en entrée de bille.
Par contre, quand la bille est éjectée, il faut réveiller le joueur.
En plus de l'effet du contacteur, on va coller une lumière de la flashboard ("en face" du kickers) + un coup de strobe (réglé par défaut à 300 ms).
Vieux code :
- Code:
-
Sub Kicker003_Timer()
[...]
PlaySound "scoopexit"
[...]
Nouveau code :
- Code:
-
Sub Kicker003_Timer()
[...]
case 6:
PlaySoundAtVol SoundFXDOF ("scoopexit",112,DOFPulse,DOFContactors), PKickarm003, 1
DOF 217, DOFPulse
DOF 230, DOFPulse
[...]
J'active un
E217 qui est une couleur en face de l'eject hole + le
E230 300 qui est le strobe en 300ms.
La ball-releaseQuand une bille entre en jeu, on active un contacteur, le plus proche possible.
Nous ne prenons pas le contacteur du flipper droit, qui serait le plus proche, car plein de pincab on des solenoids/contacteurs différents entre ceux des flippers, et le reste du plateau. On prend donc celui du slingshot droit, noté E104 dans mon exemple depuis le départ.
Code très courant :
- Code:
-
PlaySound "Ballrel"
Code complet avec la totale :
- Code:
-
PlaySoundAtVol SoundFXDOF ("Ballrel", 104, DOFPulse, DOFContactors), Plunger, 1
If Epileptikdof = True Then DOF 224, DOFPulse End If
On joue le son SSF du côté du plunger tant qu'à faire.
Et oui, sur ma version epileptik, j'aime bien interpeller le joueur en ajoutant un petit flash sur le 5 Flasher Outside Right (config-too E224 Red f200 par exemple)
Les lumièresLe bouton startNoté Start Button dans le config-tool.
Un gros standard : E200 Blink fu500 fd600
ça clignote doucement une fois que c'est ON, avec un fadeup de 500ms et un fd de 600ms.
Côté script de VPX, il va falloir trouver où activer et désactiver ce E200.
Quand on met des crédits :
DOF 200, DOFOn
Quand il n'y a pus de crédit :
DOF 200, DOFOff
Raconté comme ça, c'est tout simple, mais souvent partir à la recherche de tous les endroits où ça doit être pris en compte, cela peut-être long.
Chez Loserman c'est plutôt bien fait, souvent on met très peu d'entrée.
Exemple sur Teacher's pet
- Code:
-
Sub Table1_init()
[...]
If Credits > 0 Then DOF 200, DOFOn End If
[...]
- Code:
-
'END GNMODthen
Credits=Credits-1
If Credits < 1 Then DOF 200, DOFOff
CreditsReel.SetValue(Credits)
[...]
- Code:
-
Sub AddSpecial()
[...]
Credits=Credits+1
DOF 200, DOFOn
if Credits>15 then Credits=15
[...]
CreditsReel.SetValue(Credits)
End Sub
- Code:
-
Sub AddSpecial2()
PlaySound"click"
Credits=Credits+1
DOF 200, DOFOn
if Credits>15 then Credits=15
[...]
CreditsReel.SetValue(Credits)
End Sub
Les lumièresL'undercabLe top est de l'allumer quand la table se lance, puis de l'éteindre en fin de partie (et bien entendu de le rallumer quand on recommence une partie).
Côté script on a un DOF 201, DOFOn dans la routine "table1_ini" et "newgame"
Et un DOF 201, DOFOff dans la routine "engame"
Dans le config-tool, c'est
E201 couleurLes noms des routines sont données à titre indicatif et peuvent changer d'un auteur à l'autre bien entendu.
Les lumièresLes Roll-overToutes les inlane, out-lane, tous ces machins où la bille roule et donne des points.
On va gérer du SSF et un Pulse sur une lumière de la flashboard.
Exemple :
- Code:
-
Sub TriggerLeftOutlane_Hit()
If TableTilted=false then
PlaySound "sensor"
AddScore(100)
[...]
Nouveau code :
- Code:
-
Sub TriggerLeftOutlane_Hit()
If TableTilted=false then
PlaySoundAtVol "sensor", ActiveBall, 1
DOF 222, DOFPulse
AddScore(100)
[...]
Le SSF s'enclenche sur l'objet de la bille active, volume 1.
On fait un Pulse sur le E222.
Sur tous les roll-over, on considère qu'il faut du f200.
E222 f200
Sur les outlane, pour bien montrer que la bille est perdue, on peut mettre en 400
E222 f400
Les lumièresLe SpinnerJe n'ai pas encore d'exemple.
On colle un
EXXX couleur f200 et ça fonctionne super bien (la lumière va flasher à chaque tour de spinner) !
Côté SSF, on fait la tamlbouille habituelle.
Je reviens ici avec un exemple de code dès que possible.
Les lumièresLe drainVous perdez la bille, vous petes dégouté, il faut appuyer ça avec un petit pulse qui montre que vous petes vraiment un losser !
- Code:
-
ub Drain_Hit()
Drain.DestroyBall
PlaySound "fx_drain"
DOF 225, DOFPulse
If Epileptikdof = True Then DOF 226, DOFPulse End If
' AddBonus
Pause4Bonustimer.enabled=true
End Sub
Ici pas de SSF, pourtant on pourrait l'activer sur le bas de la table. Je regarderais quel objet serait le plus proche.
On ne peut pas l'activer sur "activeball" car elle disparait du jeu (non elle ne tombe pas dans votre pincab, ça c'est sur les vrais pinball)
DOF 225 = E225 Red fd800 (pax emple). On utilise un looong fade down.. C'est bon vous avez compris que vous êtes nul ?
Moi j'ajoute en plus un effet d'animation avec mon E226 lié à la fonction epileptikdof.
Prenons cet exemple pour apprendre une "animation" simple sur la flashboard.
Voici ce que nous avons sur le config-tool :
5 Flasher Left : E226 Red w150 f200
5 Flasher Center : E225 Red fd800
5 Flasher right : E226 Red w150 f200
Après 150 ms d'attente, les flashers droit et gauche s'enclenche pendant 200ms. Cela donne un petit effet d'onde bien sympa.
Juste après, on va l'utiliser mais sur toute la flashboard.
Les lumièresNouvelle partie et fin de partiePerso quand on lance une nouvelle partie je met une petite animation, et quand on perd toutes les billes également.
Côté script c'est un simple DOFPulse à placer au bon endroit (souvent subroutine newgame et endgame)
DOF 250, DOFPulse
Côté config-tool, je vais avoir ça :
5 Flasher Outside Left : E250 Red w300 f200
5 Flasher Left : E250 Red w150 f200
5 Flasher Center : E250 Red f200
5 Flasher right : E250 Red w150 f200
5 Flasher Outside Right : E250 Red w300 f200
Vous suivez ? Cela fait un effet d'onde très sympa ! Le top étant de jouer avec les dégradés de couleur qu'on a sur la table par exemple, ici tout est rouge (ça fonctionne aussi).
Les lumièresAnimation ball entranceC'est quoi ça encore ?
Une belle animation de suivie de la bille sur la flashboard : les lumières vont s'allumer de droite à gauche lorsque la bille entre en jeu.
Voici un exemple de code que vous insérez où vous voulez :
- Code:
-
'******************************
' DOF lights ball entrance
'******************************
'
Sub Trigger004_Hit
DOF 250, DOFPulse
End sub
Il vous manque un Trigger (ici 004) sur la table.
On ouvre la table sur VPX, et on sélectionne l'outils trigger à gauche (une étoile). Vous la positionnez en sortie de rampe, et vous décochez bien "visible". Il faut que ce trigger soit invisible.
En fonction de la table, VPX va lui attribuer un nom automatique : Trigger001, ou Trigger009... A vous de reporter ce nom ici, suivi de
_hitCôté config-tool, un exemple d'animation qui marche très bien !
5 Flasher Outside Left : E250 Red w600 f200
5 Flasher Left : E250 Red w450 f200
5 Flasher Center : E250 Red w300 f200
5 Flasher right : E250 Red w150 f200
5 Flasher Outside Right : E250 Red f200
On décale à chaque fois de 150ms l'allumage, et ça fait un effet de suivi super sympa. Le top est de faire des dégradés de couleur en fonction de ce que l'on a sur la table (pour l'exemple tout est rouge)
Les exceptionsQuelquefois, ça ne fonctionne pas aussi simplement.
On a déjà évoqué les "idx".
En gros l'auteur colle une série de roll-over (par exemple), dans une "collection" sur VPX.
Pour voir les collections, c'est menu TABLE->COLLECTION MANAGER
Chaque objet dans une collection possède comme numéro sa place dans la liste.
Imaginons une collection de trigger.
Le premier de la liste s'apelle Trigger0, le deuxième Trigger1, etc...
On peut donc faire du DOF rapide (côté script) pour gérer ça.
Si vous avez :
- Code:
-
'************************************
' Rollover lanes
'************************************
Sub TriggerCollection_Hit(idx)
If TableTilted=false then
[...]
On peut lancer des évènements DOF comme ceci :
- Code:
-
'************************************
' Rollover lanes
'************************************
Sub TriggerCollection_Hit(idx)
DOF 240+idx, DOFPulse
If TableTilted=false then
[...]
Et ensuite dans le config-tool, le premier trigger sera E240 (240+0), le deuxième trigger sera E241 (240+1) etc...
ça semble une super idée sauf que c'est très difficile de suivre ce que l'on fait, puisque l'info n'apparait pas dans le script.
Activer la fonction epileptikdofNous avons vu que nous pouvons mettre tous les effets que npus voulions sur cette fonction.
Pour qu'elle soit prise en compte, il faut la déclarer, en début de script, après "randomize"
Voici ce que j'intègre en tout début de script
- Code:
-
' Option for more lights effects with DOF (Undercab effects on bumpers and slingshots)
' "True" to activate (False by default)
Const Epileptikdof = False
Big toysLe knockerVous gagnez une partie !
CLAC et strobe dans la gueule !
Le plus simple la plupart du temps, trouver le son "knocker" dans le script.
- Code:
-
Sub AddSpecial()
PlaySound SoundFXDOF ("knocker",300,DOFPulse,DOFContactors)
DOF 230, DOfPulse
Credits=Credits+1
DOF 200, DOFOn
if Credits>15 then Credits=15
If B2SOn Then
Controller.B2SSetCredits Credits
End If
CreditsReel.SetValue(Credits)
End Sub
Ici le knocker est E300 dans le config-tool
E230 c'est le strobe !
On remarque que comme le script donne un crédit, on allume en plus le E200 qui est notre start button.
Big toysLes chimes, les carillons, ou clochesDING DING DING, le son bien typique des bonnes vieilles tables EM.
Certains pincab ont de vrais cloches, dont il faut les gérer aussi.
Vous allez devoir repérer les différentes tonalités pour associer un EXXX différent à chaque fois.
Exemple pour du faible point :
- Code:
-
If LastChime10=1 Then
PlaySound "SJ_Chime_10a"
LastChime10=0
Le nouveau code avec du DOF :
- Code:
-
If LastChime10=1 Then
PlaySound SoundFXDOF ("SJ_Chime_10a",301,DOFPulse,DOFChimes)
LastChime10=0
Notez qu'on distingue le DOF avec un
DOFChimes ici !
Si vous avez un doute sur la tonalitée du son qui est joué, dans VPX -> option -> sound manager et vous lisez le son associé (ici SJ_Chime_10a).
Comme ça vous placez correctement vos E301, E302 et E303 (par exemple) dans le config-tool.
Notez également que la table peut avoir 2, 3 ou 4 tonalités (et donc autant d'entrées config-tool différentes).
Je ne parle pas volontairement des autres toys (moteur et shaker) car je ne sais pas les placer sur une table EM.
Enregistrer son travailMaintenant on oublie pas d'enregistrer son travail sur le config-tool.
Voici ce que vous avez en bas de page.
Saves changes, vous le faites dès que vous faite une modification. Comme ça en cas de déconnexion, vous ne perdez pas votre travail.
Revert vous devez connaitre, attention si vous faites ça sur une table vide, vous perdez TOUTE la config de la table.
Submit vous cliquerez dessus quand vous aurez testé la table 10 fois.
Save and create, cela génère automatiquement le MX flashboard et le MX strobe ! Et heureusement, car c'est imbuvable (il y a des experts ici mais perso je préfère ne pas toucher).
Generate vous devez déjà connaitre, puisque ça vous sortira les fichiers nécessaire à la mise à jour du config-tool (indispensable pour tester votre nouveau dOF).
Côté script, pour l'instant, vous avez un fichier script (.vbs), et une table d'origine en fichier .vpx
Quand tout est super clean (multiples essais), vous pouvez fusionner les deux en sauvegardant la table.
VPX vous propose alors d'enregistrer le script externe.
SSF peaufinageBon et vous pensiez que c'était fini !
Non, le SSF demande quelques petits ajouts !
Partout sur la table où un son est joué, et qu'il doit être localisé, on ajoute le SSF !
Exemple :
- Code:
-
PlaySound"plungerrelease"
devient :
- Code:
-
PlaySoundAtVol "plungerrelease", Plunger, 1
- Code:
-
PlaySound"sensor"
devient :
- Code:
-
PlaySoundAtVol "sensor", ActiveBall, 1
- Code:
-
playsound "postup"
devient
- Code:
-
playsoundAtVol "postup", primgate, 1
etc etc....
Vous aurez compris, on fait le tour des "playsound" restant et on regarde si le son doit être positionné ou pas.
Et là vous êtes super fier de vous, ça fait des heures que vous bossez là-dessus, génial !
Vous lancez la table (après avoir mis à jour le config-tool perso)!
BING !
Erreur de script !
C'est normal ! N'allez pas vous pendre tout de suite.
Rapellez vous, on a utilisé de nouvelles fonctions !
Il faut les déclarer dans le script.
Ici je ne vous demande pas de comprendre, faut faire comme moi, un gros copié/collé sans rien regarder.
Il vous faut ça dans le script, là où on a le
Positional Sound Playback Functions (vous pouvez tout remplacer si une version précédente existe):
- Code:
-
' *******************************************************************************************************
' Positional Sound Playback Functions by DJRobX, Rothbauerw, Thalamus and Herweh
' PlaySound sound, 0, Vol(ActiveBall), AudioPan(ActiveBall), 0, Pitch(ActiveBall), 0, 1, AudioFade(ActiveBall)
' *******************************************************************************************************
' Play a sound, depending on the X,Y position of the table element (especially cool for surround speaker setups, otherwise stereo panning only)
' parameters (defaults): loopcount (1), volume (1), randompitch (0), pitch (0), useexisting (0), restart (1))
' Note that this will not work (currently) for walls/slingshots as these do not feature a simple, single X,Y position
Sub PlayXYSound(soundname, tableobj, loopcount, volume, randompitch, pitch, useexisting, restart)
PlaySound soundname, loopcount, volume, AudioPan(tableobj), randompitch, pitch, useexisting, restart, AudioFade(tableobj)
End Sub
' Set position as table object (Use object or light but NOT wall) and Vol to 1
Sub PlaySoundAt(soundname, tableobj)
PlaySound soundname, 1, 1, AudioPan(tableobj), 0,0,0, 1, AudioFade(tableobj)
End Sub
' set position as table object and Vol + RndPitch manually
Sub PlaySoundAtVolPitch(sound, tableobj, Vol, RndPitch)
PlaySound sound, 1, Vol, AudioPan(tableobj), RndPitch, 0, 0, 1, AudioFade(tableobj)
End Sub
'Set all as per ball position & speed.
Sub PlaySoundAtBall(soundname)
PlaySoundAt soundname, ActiveBall
End Sub
'Set position as table object and Vol manually.
Sub PlaySoundAtVol(sound, tableobj, Volume)
PlaySound sound, 1, Volume, AudioPan(tableobj), 0,0,0, 1, AudioFade(tableobj)
End Sub
'Set all as per ball position & speed, but Vol Multiplier may be used eg; PlaySoundAtBallVol "sound",3
Sub PlaySoundAtBallVol(sound, VolMult)
PlaySound sound, 0, Vol(ActiveBall) * VolMult, AudioPan(ActiveBall), 0, Pitch(ActiveBall), 0, 1, AudioFade(ActiveBall)
End Sub
Sub PlaySoundAtBallAbsVol(sound, VolMult)
PlaySound sound, 0, VolMult, AudioPan(ActiveBall), 0, Pitch(ActiveBall), 0, 1, AudioFade(ActiveBall)
End Sub
' requires rampbump1 to 7 in Sound Manager
Sub RandomBump(voladj, freq)
Dim BumpSnd:BumpSnd= "rampbump" & CStr(Int(Rnd*7)+1)
PlaySound BumpSnd, 0, Vol(ActiveBall)*voladj, AudioPan(ActiveBall), 0, freq, 0, 1, AudioFade(ActiveBall)
End Sub
' set position as bumperX and Vol manually. Allows rapid repetition/overlaying sound
Sub PlaySoundAtBumperVol(sound, tableobj, Vol)
PlaySound sound, 1, Vol, AudioPan(tableobj), 0,0,1, 1, AudioFade(tableobj)
End Sub
Sub PlaySoundAtBOTBallZ(sound, BOT)
PlaySound sound, 0, ABS(BOT.velz)/17, Pan(BOT), 0, Pitch(BOT), 1, 0, AudioFade(BOT)
End Sub
' play a looping sound at a location with volume
Sub PlayLoopSoundAtVol(sound, tableobj, Vol)
PlaySound sound, -1, Vol, AudioPan(tableobj), 0, 0, 1, 0, AudioFade(tableobj)
End Sub
+ Le code supporting ball - Code:
-
'*********************************************************************
' Supporting Ball, Sound Functions and Math
'*********************************************************************
Function RndNum(min, max)
RndNum = Int(Rnd() * (max-min + 1) ) + min ' Sets a random number between min and max
End Function
Const Pi = 3.1415927
Function dSin(degrees)
dsin = sin(degrees * Pi/180)
End Function
Function dCos(degrees)
dcos = cos(degrees * Pi/180)
End Function
Function AudioFade(tableobj) ' Fades between front and back of the table (for surround systems or 2x2 speakers, etc), depending on the Y position on the table. "table1" is the name of the table
Dim tmp
On Error Resume Next
tmp = tableobj.y * 2 / table1.height-1
If tmp > 0 Then
AudioFade = Csng(tmp ^10)
Else
AudioFade = Csng(-((- tmp) ^10) )
End If
End Function
Function AudioPan(tableobj) ' Calculates the pan for a tableobj based on the X position on the table. "table1" is the name of the table
Dim tmp
On Error Resume Next
tmp = tableobj.x * 2 / table1.width-1
If tmp > 0 Then
AudioPan = Csng(tmp ^10)
Else
AudioPan = Csng(-((- tmp) ^10) )
End If
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
On Error Resume Next
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 Vol(ball) ' Calculates the Volume of the sound based on the ball speed
Vol = Csng(BallVel(ball) ^2 / 2000)
End Function
Function VolMulti(ball,Multiplier) ' Calculates the Volume of the sound based on the ball speed
VolMulti = Csng(BallVel(ball) ^2 / 150 ) * Multiplier
End Function
Function DVolMulti(ball,Multiplier) ' Calculates the Volume of the sound based on the ball speed
DVolMulti = Csng(BallVel(ball) ^2 / 150 ) * Multiplier
debug.print DVolMulti
End Function
Function BallRollVol(ball) ' Calculates the Volume of the sound based on the ball speed
BallRollVol = Csng(BallVel(ball) ^2 / (80000 - (79900 * Log(RollVol) / Log(100))))
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 = INT(SQR((ball.VelX ^2) + (ball.VelY ^2) ) )
End Function
Function BallVelZ(ball) 'Calculates the ball speed in the -Z
BallVelZ = INT((ball.VelZ) * -1 )
End Function
Function VolZ(ball) ' Calculates the Volume of the sound based on the ball speed in the Z
VolZ = Csng(BallVelZ(ball) ^2 / 200)*1.2
End Function
'*** Determines if a Points (px,py) is inside a 4 point polygon A-D in Clockwise/CCW order
Function InRect(px,py,ax,ay,bx,by,cx,cy,dx,dy)
Dim AB, BC, CD, DA
AB = (bx*py) - (by*px) - (ax*py) + (ay*px) + (ax*by) - (ay*bx)
BC = (cx*py) - (cy*px) - (bx*py) + (by*px) + (bx*cy) - (by*cx)
CD = (dx*py) - (dy*px) - (cx*py) + (cy*px) + (cx*dy) - (cy*dx)
DA = (ax*py) - (ay*px) - (dx*py) + (dy*px) + (dx*ay) - (dy*ax)
If (AB <= 0 AND BC <=0 AND CD <= 0 AND DA <= 0) Or (AB >= 0 AND BC >=0 AND CD >= 0 AND DA >= 0) Then
InRect = True
Else
InRect = False
End If
End Function
+
Un ajout sur le JPball rolling sound (ici le code complet, ça ajoute simplement à la fin une fonction pour un son de bille qui décolle et retombe).
Il faudra uploader ce son dans votre table bien entendu.
Le son s'appelle
fx_ball_drop, je le mettrais en téléchargement ici :
- Code:
-
'*****************************************
' JP's VP10 Rolling Sounds
'*****************************************
Const tnob = 5 ' total number of balls
ReDim rolling(tnob)
InitRolling
Sub InitRolling
Dim i
For i = 0 to tnob
rolling(i) = False
Next
End Sub
Sub RollingSoundTimer_Timer()
Dim BOT, b
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) = -1 Then Exit Sub
' play the rolling sound for each ball
For b = 0 to UBound(BOT)
If BallVel(BOT(b) ) > 1 AND BOT(b).z < 30 Then
rolling(b) = True
PlaySound("fx_ballrolling" & b), -1, Vol(BOT(b)), AudioPan(BOT(b)), 0, Pitch(BOT(b)), 1, 0, AudioFade(BOT(b))
Else
If rolling(b) = True Then
StopSound("fx_ballrolling" & b)
rolling(b) = False
End If
End If
If BOT(b).VelZ < -1 and BOT(b).z < 55 and BOT(b).z > 27 Then 'height adjust for ball drop sounds
PlaySoundAtBOTBallZ "fx_ball_drop" & b, BOT(b)
End If
Next
End Sub
Et ne partez pas, ce n'est toujours pas fini !
BONUSVoici un dossier avec quelques ressouces pour vous aider pour la suite :
https://drive.google.com/drive/folders/12e-WgW0_SqsFb2zis-8S1mpHbE8yRZrZ?usp=sharing
15th WallLà normalement vous ouvrez des grands yeux. C'est quoi ce truc ?
C'est spécifique aux tables de Loserman76.
Il utilisait le même modèle, et il y a un "mur" invisible mal placé, qui retient la bille trop basse lorsque l'on tire le plunger.
Dans VPX, on sélectionne ce wall15 (il pourrait avoir un autre nom), et on le déplace avec le clavier de 16 flêches vers le haut !
On appuie
16 fois sur la touche "flèche haut du clavier".
En gros on le remonte.
Voici une capture avant/après pour bien comprendre :
Le wall15 c'est l'objet à la forme étrange sélectionné en bleu sur la table corrigée.
On voit bien la différence de "hauteur" entre gauche et droite, par rapport au plunger.
Vous ferez la joie de pleins de mecs de la communauté en faisant ça, qui sont apparemment traumatisés par ce détail !
LUT et luminositéIci nous allons aborder la version rapide.
Pour améliorer les tables de façon un peu plus sympa, il faudra passer par l'étape "Blender" avec la création de plusieurs masques d'ombres.
Tuto en cours.
Toujours sur les tables de Loserman76.
Toutes ses tables sont trop claires pour le pincab.
L'idée va être de faire ressortir les lampes sous les objets de la table.
Première étape, on diminue la luminosité, grâce au petit slider. Entre 3 et 4 crans ça semble pas mal.
Par défaut ce curseur sera au milieu.
Ensuite, vous allez appliquer un LUT, une colorimétrie toute prête.
Dans le dossier de téléchargement, vous en trouverez 2.
Il faut dans un premier temps les charger dans la table. Menu TABLE/IMAGES MANAGER !
Une fois les images chargées, pour en appliquer un, dans VPX vous allez :
Voici le avant/après
Même si ce n'est pas parfait, on a déjà plus l'impression que les lumières éclairent vraiment la table et les objets. Sur le pincab c'est encore plus flagrant.
Ball shadowThalamus propose également d'améliorer la fonction ball shadow sur les tables de Loserman
Dans la partie conssacrée au code "nizzuzu ball shadow"
Code original :
- Code:
-
If BOT(b).X < Table1.Width/2 Then
BallShadow(b).X = ((BOT(b).X) - (Ballsize/6) + ((BOT(b).X - (Table1.Width/2))/7)) + 6
Else
BallShadow(b).X = ((BOT(b).X) + (Ballsize/6) + ((BOT(b).X - (Table1.Width/2))/7)) - 6
End If
ballShadow(b).Y = BOT(b).Y + 12
Code modifié :
- Code:
-
BallShadow(b).X = ((BOT(b).X) - (Ballsize/6) + ((BOT(b).X - (Table1.Width/2))/21)) + 6
Else
BallShadow(b).X = ((BOT(b).X) + (Ballsize/6) + ((BOT(b).X - (Table1.Width/2))/21)) - 6
End If
ballShadow(b).Y = BOT(b).Y + 4
Simplement quelques valeurs qui changent en fin de lignes.
Ball rolling soundEn cours de négociation
Je voudrais remplacer le son de la bille qui arrache les oreilles par ceux de JPSalas qui ont plus de basses et qu'on sent mieux avec le SSF.
Si on regarde le code pour le rolling sound de JP, on a ça :
- Code:
-
PlaySound("fx_ballrolling" & b)
Le "b" c'est le numéro de la bille !
Et si vous regardez vos fichiers sons pour la table, vous aurez un fichier fx_ballrolling0, un fichier fx_ballrolling1, fx_ballrolling2 etc...
Il faudra un son de bille pour chaque bille prévue sur la table (en multibille).
Sur les tables de Loserman76, on trouve des fois 14 itérations du même fichier. Bon... Je ne crois pas qu'il y ait de tables EM avec 14 multibilles.... ça peut s'épurer au moins jusqu'à 5 (si on charge 5 billes d'un coup), cela permet d'alléger le fichier final sur VPX.
Résumé code DOF + SSF en exemple
Script
Config-ToolLumières DOF 200, DOFPulse
DOF 200, DOFOn
DOF 200, DOFOff
E200/E200 Red/E200 Red f200/E200 Red w150 f200/E200 Red fd800
FlippersPlaySoundAtVol SoundFXDOF ("FlipperUp",101,DOFOn,DOFContactors), LeftFlipper, 1
PlayLoopSoundAtVol "buzzL", LeftFlipper, 1
E101
SlingshotsPlaysoundAtVol SoundFXDOF ("left_slingshot",103,DOFPulse,DOFContactors), sling2, 1
E103
BumpersPlaySoundAtVol SoundFXDOF ("bumper1",105,DOFPulse,DOFContactors), ActiveBall, 1
E105
TargetsPlaySoundAtVol SoundFXDOF ("target",108,DOFPulse,DOFTargets), ActiveBall, 1
E108 @t@
DropTargetsPlaySoundAtVol SoundFXDOF ("target",108,DOFPulse,DOFDropTargets), ActiveBall, 1
E108 @dt@
KickersPlaySoundAtVol SoundFXDOF ("scoopexit",112,DOFPulse,DOFContactors), PKickarm003, 1
E112
Ball releasePlaySoundAtVol SoundFXDOF ("Ballrel", 104, DOFPulse, DOFContactors), Plunger, 1
E104
A améliorer mais on a déjà une bonne base !
C'est super dense et pas super bien présenté. Mais on pourra répondre à toutes les questions sur ce sujet !