L'atelier des scripto-rameurs

Tout sur les scripts et les mods pour X², X³, X³TC et X³AP.

Moderator: Modérateurs pour les forum Français

Post Reply
User avatar
Bléral
Posts: 697
Joined: Wed, 31. Mar 04, 00:37
x2

L'atelier des scripto-rameurs

Post by Bléral » Tue, 7. Sep 04, 15:34

Comme son nom l'indique vaguement, je propose d'utiliser ce topic pour les gens qui ont du mal avec l'éditeur de scripts et qui rament un peu avec des scripts pas trop compliqués. A moins que je sois le seul à en chier :roll: ?

Et pour commencer la fête, je chope des migraines avec un script devant permettre le réapprovisionnement automatisé d'escadre -en tous cas avec la première partie de celui-ci, càd la plus simple: en résumé, trouve la station, vas-y en utilisant éventuellement le jumpdrive, reforme l'escadre et va t'amarrer. J'ai quasiment recopié un autre script que j'avais bricolé il y a quelques jours, et qui fonctionne très bien; j'y ai juste apporté quelques petites améliorations mineures, pour assurer que l'escadre ne se sépare pas (ils sautent tous ou pas du tout, le leader attend ses ailiers une fois dans le bon secteur) et pour éviter que l'escadre ne poursuive pendant trois jours un vaisseau porteur sans arriver à le rattraper.

Voilà donc la première partie de ce script, celle qui était censée ne poser aucun problème:

Code: Select all

Description
rearmer escadre


Arguments
1: stationcible , Var/Station/Carrier to dock at , 'destination' 
2: quantite , Var/Number , 'quantite' 
3: matos , Var/Ware , 'ware' 


Source Text


001   $testage = 1
002   
003   * 1- identifier la station et s y amarrer
004   
005   if [THIS] -> is docked
006    if [DOCKEDAT] == $destination
007     goto label DebutChargt
008    else
009 @   = [THIS] -> call script '!move.undock' : 
010    end
011   end
012   
013   Restart:
014   while not [THIS] -> is in same sector as $destination
015    
016   * Si la station est eloignee, regrouper l escadre pour le saut
017    skip if not $testage == 1
018     write to player logbook 'Calcul de la trajectoire...'
019    
020    $SecteurDestination = $destination -> get sector
021    $Nombresauts = get jumps from sector [SECTOR] to sector $SecteurDestination
022    if $Nombresauts > 1
023 @   $EscadreJumpOK = [THIS] -> call script 'Escadre.prepare.for.jump' :  Secteur de 
            destination=$SecteurDestination
024     if $EscadreJumpOK
025      
026      skip if not $testage == 1
027       write to player logbook 'Jump Device charging...'
028 @    = wait randomly from 4000 to 8000 ms
029 @    $PortailDest = [THIS] -> call script 'baseperso.trouver.portail' :  
             destination=$destination
030 @    = [THIS] -> call script '!move.jump' :  gate or 
             sector=$PortailDest  followers should jump too=[TRUE]
031     end
032    end
033    
034   * Si le saut est impossible ou la station proche, y aller a pattes
035 @  = [THIS] -> fly to sector $SecteurDestination
036   end
037   
038   if [THIS] -> is in same sector as $destination
039    
040    skip if not $testage == 1
041     write to player logbook 'On est a cote, on y va!'
042    skip if not $destination -> is of class Vaisseau Porteur 
043     $destination -> interrupt with script 'baseperso.attendre.arrimage' 
           and prio 50: arg1=[THIS] arg2=null arg3=null arg4=null
044    
045 @  = [THIS] -> call script 'Escadre.attend.formation' : 
046 @  = [THIS] -> fly to station $destination
047   end
048   
049   skip if not $testage == 1
050    write to player logbook 'On est arrives.'
051   
c'est un peu long, désolé, mais ça me paraît assez explicite.
J'ai enlevé ici les vérifications classiques "is docking allowed"/ "is docking possible" (des fois que), mais ça marchait pas non plus avec. La variable "$testage" et les couples de lignes qui y font référence sont juste là pour m'aider à suivre où on en est, et là aussi j'ai essayé de les enlever à tout hasard, ça ne résout évidemment pas le pb.
Les autres scripts auxquels je fais appel ('Escadre.prepare.for.jump', 'baseperso.attendre.arrimage' , 'baseperso.trouver.portail') sont très courts, ont été abondamment testés, et je suis à 99% sûr qu'ils ne posent pas de pb...
Enfin, j'appelle le script depuis les commandes de "THIS" (le leader) via une commande personnalisée, qui fonctionne très bien si je l'utilise pour tester d'autres scripts.

DONC, voilà où ça cloche: où que soit $destination (station ou vaisseau cible), dans le même secteur que THIS ou à perpète, THIS se met en route vers Kingdom End, l'origine de la carte. Il n'utilise pas son moteur de saut pour aller jusque là-bas (ce qui est logique, si on veut), mais m'envoie toujours les messages de vérifications que j'ai placés.

C'est d'autant plus bizarre que, si vous regardez le script, il ne devrait pas en passer par là s'il est dans le même secteur que $destination (il devrait aller directement à la ligne 038 pour s'amarrer) -or même dans ce cas, il se barre vers Kingdom End et m'envoie "calcul de la trajectoire...". Il prend donc tout le "while" de la ligne 14 à la ligne 38, ignorant apparemment la condition "while not [THIS] -> is in same sector as $destination" (au lieu d'aller directement après cette boucle à "if this in the same sector...").

Ca suggère donc, si mon cerveau n'est pas complètement HS, que le bug est dès le début du script, mais franchement je vois pas ce qui cloche...

Y'a pas grand monde sur le forum ces temps-ci (tout le monde n'est pas en attente de contrat, je sais!), mais par pitié si quelqu'un a une suggestion, allez-y, parce que moi je sèche méchamment...
L'hypertrophie de louveteau se palpe.
Tiens, mais ne serait-ce pas une fonction de Recherche ?

PrizzZ
Posts: 2351
Joined: Sun, 28. Mar 04, 15:56
x3tc

Post by PrizzZ » Wed, 8. Sep 04, 15:26

Bon rapidos une petite faute trouvée :

Code: Select all

Arguments 
1: stationcible , Var/Station/Carrier to dock at , 'destination' 

Code: Select all

if [DOCKEDAT] == $destination 
et puis tous les $destination de la suite :
l'erreur est la suivante : dans ton argument, la variable s'appelle "station cible", et destination n'est que le nom qui s'affichera dans l'ecran de demande ou lors de l'appelle de ce script ... bref, $destination ne contient rien, essaye en remplacant dans les arguments

Code: Select all

Arguments 
1: stationcible , Var/Station/Carrier to dock at , 'destination' 
par

Code: Select all

Arguments 
1: destination , Var/Station/Carrier to dock at , 'destination' 
Si c'est pas ca, je reessayerai avec plus de temps et d'attention un jour ou j'aurai du temps ( là y DM en attente ... :D )
Bonne chance Bléral !

User avatar
Bléral
Posts: 697
Joined: Wed, 31. Mar 04, 00:37
x2

Post by Bléral » Wed, 8. Sep 04, 19:10

Mais quel abruti... ça devait être ça, bien sûr, je me suis emmêlé les pinceaux! Entretemps vu que je trouvais pas où était le problème, j'ai tout réécrit proprement, et il marche très bien jusqu'au bout - mais comme ça à l'avenir je ferais un peu plus gaffe à mes arguments! Merci RePrizzZ...
L'hypertrophie de louveteau se palpe.
Tiens, mais ne serait-ce pas une fonction de Recherche ?

PrizzZ
Posts: 2351
Joined: Sun, 28. Mar 04, 15:56
x3tc

Post by PrizzZ » Wed, 8. Sep 04, 20:07

Pas de problème, hesite pas si t'en a d'autre du genre ... et puis entre Nantais faut s'entraider :D !!! ( Si vous êtes pas Nantais ca marche aussi ... )

User avatar
Bléral
Posts: 697
Joined: Wed, 31. Mar 04, 00:37
x2

Post by Bléral » Fri, 10. Sep 04, 20:55

Tu l'auras voulu... J'ai une série de questions basiques, sans doute un peu con-con mais bon:
- le nom d'une variable locale, ça se met bien en tant que "string", et pas une variable? (Par exemple, [THIS]->set local variable: name= nom value= $nom.de.cet.abruti)

- "infinite loop=TRUE", c'est grave docteur? j'ai un script qui est constitué d'un "While 1 ... " sur 160 lignes à peu près, et qui doit être actif en permanence sur chacun des ailiers d'une escadre: j'ai peur que ça soit bourrin, et que ça bouffe des ressources, m'enfin c'est peut-être négligeable?

- les "flags", je pige pas complètement comment on s'en sert...?

- je trouve pas de constante [PLAYER]: pour spécifier la race du joueur, j'imagine qu'il faut pas utiliser [PLAYERSHIP], mais alors quoi? Si je spécifie "ma" race, çàd le nom de mon perso ("Luke Jeusuitonpair", y'a que moi que ça fait rire), ça posera pas de pbs pour être utilisé par un autre joueur?

- ah un dernier pour la route: à quoi sert de commencer une ligne "call script..." par "START"? Je trouve ça dans certains scripts, mais je vois pas la différence...

:roll:
L'hypertrophie de louveteau se palpe.
Tiens, mais ne serait-ce pas une fonction de Recherche ?

PrizzZ
Posts: 2351
Joined: Sun, 28. Mar 04, 15:56
x3tc

Post by PrizzZ » Sat, 11. Sep 04, 13:19

1. Le nom d'une variable locale est bien un string ... n'est ce pas KAHR-SIDIUS :roll: ?

2. Les boucles infinies, ca bouffe un peu de ressources, mais il me semble qu'il y a a peu pres dans les 4000 scripts EGOSOFT tournant sur le jeu en standard, donc si tu pousses pas trop ...

3. Flags, connait pas ... :(

4. La race du joueur est "Player", trouvé dans les constantes "race", sous le nom de ton perso, mais qui prendra directement la valeur Player dans le script, même si tu decides de l'afficher, ce qui fait que ca marchera pour les autres joueurs, même si ils ne s'appelle pas "Luke Jesuitonpair". Pour afficher le nom du joueur, j'utilise PLAYERSHIP -> get pilote name.

5. Le START avant le call script permet de lancer le script en parallèle, c'est a dire que le script continue apres l'appelle du deuxième script sans attendre que celui ci se termine. Très utile ... mais plante de temps en temps ... :D

User avatar
Bléral
Posts: 697
Joined: Wed, 31. Mar 04, 00:37
x2

Post by Bléral » Sat, 11. Sep 04, 17:37

AAAAAAAHHHHHH! Compris, le "START", c'est exactement ce qu'il me fallait...! J'ai passé la moitié de la nuit à essayer de faire marcher un script récalcitrant - j'ai finalement réussi en utilisant ce truc (START $truc->call script 'machin' etc), mais je comprenais pas pourquoi...

Pour les Flags, j'ai ça (traduit de l'allemand, donc approximatif):

A la plupart des fonctions "search" on peut associer des "flags", qui peuvent être une de ces constantes ou une combinaison:

[Find.Enemy]
Cherche un objet aligné "ennemi" envers <refobj>

[Find.Friend]
...

[Find.Neutral]
...

[Find.ExactJumps]
(à tester…!!)


[Find.Multiple]
Avec celui-ci il est possible de trouver plusieurs objets, restitués en tant qu'array ("tableau" dans le SE). Sa taille maximale est définie par <maxnum>

[Find.ForceUsePos]
Précise à la fonction d'utiliser <refpos> comme position de référence, à partir de laquelle considérer le flag [find.nearest]

[Find.Nearest]
Trouve l'objet le plus proche de <refobj> (ou de <refpos> si le flag précédent est employé)

[Find.Random]
un objet au pif

[Find.IllegalWare]
bref

Les Flags peuvent être combinés en ordre binaire, de façon à ce qu'ils soient représentés par un | dans le Script Editeur : par exemple, $flags = [Find.Enemy] | [Find.Multiple]


DONC ça m'a l'air vachement utile, mais j'ai un peu de mal à en saisir l'utilisation exacte... 'fin je vais tester ça pour me clarifier les idées.
L'hypertrophie de louveteau se palpe.
Tiens, mais ne serait-ce pas une fonction de Recherche ?

PrizzZ
Posts: 2351
Joined: Sun, 28. Mar 04, 15:56
x3tc

Post by PrizzZ » Sat, 11. Sep 04, 20:02

Ah d'accord c'est ca les flags ... :D j'en utilise plein ( en particulier le [find.multiple] et je sais même pas comment ca s'appelle !!!

User avatar
Bléral
Posts: 697
Joined: Wed, 31. Mar 04, 00:37
x2

Post by Bléral » Sat, 11. Sep 04, 20:52

euh... ben moi c'est le contraire :roll:
L'hypertrophie de louveteau se palpe.
Tiens, mais ne serait-ce pas une fonction de Recherche ?

User avatar
KAHR-SIDIUS
Posts: 501
Joined: Fri, 2. Apr 04, 18:59
x3tc

Post by KAHR-SIDIUS » Sun, 12. Sep 04, 11:52

RePrizzZ wrote:1. Le nom d'une variable locale est bien un string ... n'est ce pas KAHR-SIDIUS :roll: ?

:D
tout à fait Reprizz,

Et pour info La variable Global sert pour le script lui meme sans faire de disctinction entre les differents vaisseaux qui l'utilise...


Bléral
Désolé de pas t'avoir repondu, j'avait commencé mais c'etait lors du plantage du forum pour poster, et j'ai plus pensé le re-taper ensuite.. :doh:

@+
KAHR-SIDIUS

Salutations

_________________
Utilisez la fonction de Recherche....

Flo2K
Posts: 77
Joined: Fri, 21. May 04, 20:01
x2

Post by Flo2K » Sun, 12. Sep 04, 15:49

Je rame avec se script:

Code: Select all

001   $pos = $sta -> get ship array from sector/ship/station
002   $unnbr = 0
003   $denbr = 0
004   write to player logbook $pos
005   un:
006   $denbr = $denbr + 1
007   skip if $denbr <= 15
008    goto label fin
009   $tryship = $pos[$unnbr]
010   if not $tryship == Petit Transporteur TS 
011    remove element from array $pos at index $unnbr
012   else
013    $unnbr = $unnbr + 1
014   end
015   goto label un
016   fin:
017   write to player logbook $pos
018   return null
$sta est le seul argument, il designe une station.
Le but du jeu, c'est de garder que les TS appartenant au joueur.
Je viens d'y apsser 4H de suite :headbang: :headbang: et pas la moindre solution.

PrizzZ
Posts: 2351
Joined: Sun, 28. Mar 04, 15:56
x3tc

Post by PrizzZ » Sun, 12. Sep 04, 19:33

En fait ton code est deja assez maladroit, puisque tu ne verifies pas si l'objet $tryship a une chance d'exister : je te conseille plutot une boucle faisant intervenir la taille de la matrice $pos :

Code: Select all

$compteur=0
$size= size of array $pos
while $compteur < $size
 $tryship = $pos[$compteur]
 if $tryship is of class  Petit Transporteur TS  
note bien le "is of class" ...

Code: Select all

  inc $compteur 
plus pratique que $compteur = $compteur + 1

Code: Select all

 else
  remove element from array $pos at index $compteur
  dec $size
 end
end


Normalement avec ca tu as la reponse a toute tes questions, sinon envoie nous ce qui est marque dans ton logbook, pour essayer de comprendre.

User avatar
KAHR-SIDIUS
Posts: 501
Joined: Fri, 2. Apr 04, 18:59
x3tc

Post by KAHR-SIDIUS » Sun, 12. Sep 04, 19:48

Ouah le rapide :)
KAHR-SIDIUS

Salutations

_________________
Utilisez la fonction de Recherche....

Flo2K
Posts: 77
Joined: Fri, 21. May 04, 20:01
x2

Post by Flo2K » Sun, 12. Sep 04, 20:07

1 C'est du bricolage, je comptais ameliorer l'esthetique plus tard en l'integrant dans son script de destination.
2 T'as pas repondu à tout. :P
Le but du jeu, c'est de garder que les TS appartenant au joueur.
Ta soluce prend en compte les TS de l'IA qui serait docker


Merci pour le "is of class...", je l'avait pas vu.

User avatar
KAHR-SIDIUS
Posts: 501
Joined: Fri, 2. Apr 04, 18:59
x3tc

Post by KAHR-SIDIUS » Sun, 12. Sep 04, 22:02

Simple, il faut que tu utilise la commande

Code: Select all

$Race=$TryShip->Get Owner race
Cette commande donne la Race ($Race) du Vaisseau ($TryShip)

enuite

Code: Select all


$Race=$TryShip->Get Owner race

if $Race=[Race_du_joueur]

append $TryShip to $Tableau 

end
Je te laisse paramettrer la taille des tableaux, ce code est a adapter au tient, va pas tout te macher :D

$Tableau est à creer comme Tableau de destiantion

avec cela tu pourra identifier tes propre TS parmit ceux que tu as deja enregistrer dans un pemier tableau ou provenant d'une recherche...

@+
KAHR-SIDIUS

Salutations

_________________
Utilisez la fonction de Recherche....

User avatar
KAHR-SIDIUS
Posts: 501
Joined: Fri, 2. Apr 04, 18:59
x3tc

Post by KAHR-SIDIUS » Sun, 12. Sep 04, 22:14

Par contre j'ai un petit probleme :gruebel:

Dans une boucle

Code: Select all

While EnemieGlobal

Je veut lancer une attaque par un autre vaisseau sur ma cible

START:$AutreVaisseau->CallScript !Shipattack.pl prio=0 arg1=EnemieGlobal

Recherche de nouveau  de EnemieGlobal

End

Le probleme c'est que ca se bloque aussitot que je fait reference a un vaisseau exterieur à celui qui execute le script..... :headbang:

Merçi pour votre Aide... :lol:
KAHR-SIDIUS

Salutations

_________________
Utilisez la fonction de Recherche....

User avatar
Bléral
Posts: 697
Joined: Wed, 31. Mar 04, 00:37
x2

Post by Bléral » Sun, 12. Sep 04, 23:47

Y'a quoi dans ton "!Shipattack.pl"? Ce que tu décris ressemble à une loop qui plante les calculs... -> rajouter des "wait..."?

Ah mais non chuis con, je crois que j'ai trouvé: tu lui envoies un million de fois le script à exécuter en même temps, avec autant de cibles simultanées, à ton pépère! Vire le START devant le call script, et ça devrait marcher, tu penses pas?
tu vois ce que je veux dire? tel que tu l'as écrit, si je comprends bien, il lance le script !Shipattack.pl en parallèle, puis continue en même temps le While, désigne une autre cible, relance le même !Shipattack.pl, etc....
(enfin à tous les coups d'ici à ce que tu lises ça tu auras résolu ton pb, mais tant pis)

Bon après je suis mal placé pour donner des conseils, parce que si je viens sur le forum au lieu de "bosser" sur ce putain de script d'escadres, c'est que je suis à deux doigts de pêter les plombs... la moitié des scripts que j'avais fignolé ces derniers jours et qui étaient censés être au poil ne répondent même plus ou marchent de traviole... :evil:


CA M'ENERVE .
L'hypertrophie de louveteau se palpe.
Tiens, mais ne serait-ce pas une fonction de Recherche ?

Flo2K
Posts: 77
Joined: Fri, 21. May 04, 20:01
x2

Post by Flo2K » Mon, 13. Sep 04, 08:46

Une bonne partie des scripts existe en deux version *.pl et *.std, y a une différence?

PrizzZ
Posts: 2351
Joined: Sun, 28. Mar 04, 15:56
x3tc

Post by PrizzZ » Mon, 13. Sep 04, 17:25

. autre méthode pour le script de Flo2K : au lieu de creer un autre tableau, supprimer dans le tableau existant les vaisseaux qui ne sont pas au joueur, de la même facon que l'on supprime les vaisseaux qui sont pas des TS, mais apres ceci n'est qu'un detail de redaction :) .

. Pour le script de Kahr-Sidius : comme Bléral, c'est le START qui plante tout. D'ailleur a ce propos, des que je scripte une boucle while, je rajoute systematiquement un wait 10 ms, pour eviter de tout planter : ca coute rien et ce aide beacoup ( une fois une boucle a la con m'a couté un format C:, depuis je fais mega super gaffe ... :D ) ...

Par contre pas trop d'idée de la difference entre .std et .pl. Juste une hypothèse que j'avais emis : std pour petit vaisseaux, pl pour vaisseau capitaux, etant donné que pour le script attacktarget, le .pl n'a pas l'option " follow in next sector" ou un truc du genre.

User avatar
KAHR-SIDIUS
Posts: 501
Joined: Fri, 2. Apr 04, 18:59
x3tc

Post by KAHR-SIDIUS » Mon, 13. Sep 04, 18:55

J'y avait pas pensé au wait, sinon tu as reseau le start doit planté dans la boucle, mais je peut pas utiliser la commande sans le start sinon le script s'arrete et lance celui qui est utlisé pour le premier vaisseau et les autres doivent attendre la fin du combat :evil:


en verité j'ai eu une idée cette apres midi

Code: Select all

Debut:

Je lance par des START les script pour les autres vaisseau

ensuite un while EnemieGlobal qui permet de remettre a jour les enemies, dedans je lance le script pour les Vaisseau qui gere le script

je fait une mise a jour de EnemieGlobal dans la boucle,

Si celui ci change alors je fait un goto à Debut
vait essayé tient


Pour info, le bc dans certain script signifie que cest un tableau qu'on lui fournit comme variable

Le pl appelle dans sont script le script avec le std
Y'a quoi dans ton "!Shipattack.pl"? Ce que tu décris ressemble à une loop qui plante les calculs... -> rajouter des "wait..."?
C'est le script !Ship.cmd.attack.pl.pck, commande standard d'attaque
KAHR-SIDIUS

Salutations

_________________
Utilisez la fonction de Recherche....

Post Reply

Return to “Script et Modding pour la Trilogie X”