[WeiDU] Recherche un algorithme pour modifier le fichier WED
- Freddy_Gwendo
- Adepte de Grondemarteau
- Orbe ancien
- Messages : 5877
- Enregistré le : sam. 23 avr. 2011, 00:26
- Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
- Statut : Hors ligne
[WeiDU] Recherche un algorithme pour modifier le fichier WED
.
Je suis en train d'écrire une fonction WeiDU qui ajoute automatiquement une porte dans une carte existante.
Le code modifiant le fichier ARE fonctionne parfaitement. En revanche, celui modifiant le fichier WED n'est pas encore au point. En fait, il fonctionne parfaitement, sauf une partie que j'ai mis du temps à identifier.
Le fichier wed contient les informations sur les overlays, les portes, les polygones et.... les wallgroups.
Chaque carte est découpée en wallgroups de 640 x 480 pixels regroupant les index des polygones compris dans cette surface. Lorsque j'ajoute un polygone pour la porte ouverte, je dois mettre à jour l'index des wallgroups. Et c'est là que ça se complique.
Comme un bon dessin vaut mieux que de longs discours :
Les numéros représentent les wallgroups, les lettres des polygones.
Si j'ajoute le polygone A dans le fichier WED, il me suffit de lire sa bounding box pour pouvoir l'insérer dans le wallgroup 4 et réindexer le fichier.
En revanche, ça se complique pour trouver un algorithme calculant automatiquement que le polygone B doit être ajouté aux wallgroups 1, 4 et 7 ; et le polygone C aux wallgroups 0,1, 4, 5 et 7.
Pour info, je connais les bornes gauche, droite, haute et basse de chaque wallgroup et de chaque polygone.
Si quelqu'un a une idée, ça me permettrait de gagner un temps fou.
Le code modifiant le fichier ARE fonctionne parfaitement. En revanche, celui modifiant le fichier WED n'est pas encore au point. En fait, il fonctionne parfaitement, sauf une partie que j'ai mis du temps à identifier.
Le fichier wed contient les informations sur les overlays, les portes, les polygones et.... les wallgroups.
Chaque carte est découpée en wallgroups de 640 x 480 pixels regroupant les index des polygones compris dans cette surface. Lorsque j'ajoute un polygone pour la porte ouverte, je dois mettre à jour l'index des wallgroups. Et c'est là que ça se complique.
Comme un bon dessin vaut mieux que de longs discours :
Les numéros représentent les wallgroups, les lettres des polygones.
Si j'ajoute le polygone A dans le fichier WED, il me suffit de lire sa bounding box pour pouvoir l'insérer dans le wallgroup 4 et réindexer le fichier.
En revanche, ça se complique pour trouver un algorithme calculant automatiquement que le polygone B doit être ajouté aux wallgroups 1, 4 et 7 ; et le polygone C aux wallgroups 0,1, 4, 5 et 7.
Pour info, je connais les bornes gauche, droite, haute et basse de chaque wallgroup et de chaque polygone.
Si quelqu'un a une idée, ça me permettrait de gagner un temps fou.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Moddeur qui s'arrache les cheveux...
... avec Menace sur le Royaume de Diamant Éternel.
-
- Adepte de Grondemarteau
- Ogre mage
- Messages : 1328
- Enregistré le : dim. 21 mars 2010, 12:03
- Localisation : Paris
- Contact :
- Statut : Hors ligne
.
Freddy, tu réfléchis trop.
Pourquoi vouloir créer des portes en auto dans une carte. Pour connaitre ses coordonnées, il faut bien ouvrir la carte, la regarder et déterminer ses points?
En auto sans voir la carte avant? Je ne comprends pas tout. (je ne réflechis p.e pas assez MDR).
Cherchez l'erreur (je te charrie un peu) mais sur le coup j'ai bloqué 2 sec.
Pour l'algorithme, ça s'écrit mais ensuite il faut l'utiliser dans une langage. Tu as lequel à dispo? Weidu sait faire des boucles et tester des coordonnées? Déterminer le nb de WallGroup dans la carte et les parcourir?
Pour moi, il faut tester la coordonnée de chaque point de ton polygone par rapport à chaque zone de ton WALLGROUP pour déterminer si il en fait partie. On s'arrête lorsqu'on a trouvé son WallGroup et on passe au point suivant.
Wallgroup 1
X=0 -> 640
Y=0 -> 480
Wallgroup 2
X=641 -> 1280
Y=481 -> 960
Si j'ai un point avec la coordonnée, [200 - 95]:
0< Xpoint < 640
0< Ypoint < 481
J'ai statué sur ce point, il est dans le WG 1. Je passe au point suivant.
Dans ton dessin, tu as matérialisé les bornes? (j'ignore qu'il y en avait et à quoi elles servent) Sinon tes WallGroup n'ont pas la même taille.
Cocrane
Pourquoi vouloir créer des portes en auto dans une carte. Pour connaitre ses coordonnées, il faut bien ouvrir la carte, la regarder et déterminer ses points?
En auto sans voir la carte avant? Je ne comprends pas tout. (je ne réflechis p.e pas assez MDR).
Code : Tout sélectionner
"Les numéros représentent les wallgroups, les chiffres des polygones."
Pour l'algorithme, ça s'écrit mais ensuite il faut l'utiliser dans une langage. Tu as lequel à dispo? Weidu sait faire des boucles et tester des coordonnées? Déterminer le nb de WallGroup dans la carte et les parcourir?
Pour moi, il faut tester la coordonnée de chaque point de ton polygone par rapport à chaque zone de ton WALLGROUP pour déterminer si il en fait partie. On s'arrête lorsqu'on a trouvé son WallGroup et on passe au point suivant.
Wallgroup 1
X=0 -> 640
Y=0 -> 480
Wallgroup 2
X=641 -> 1280
Y=481 -> 960
Si j'ai un point avec la coordonnée, [200 - 95]:
0< Xpoint < 640
0< Ypoint < 481
J'ai statué sur ce point, il est dans le WG 1. Je passe au point suivant.
Dans ton dessin, tu as matérialisé les bornes? (j'ignore qu'il y en avait et à quoi elles servent) Sinon tes WallGroup n'ont pas la même taille.
Cocrane
- Freddy_Gwendo
- Adepte de Grondemarteau
- Orbe ancien
- Messages : 5877
- Enregistré le : sam. 23 avr. 2011, 00:26
- Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
- Statut : Hors ligne
.
Le but du jeu est d'ajouter des portes dans une carte du jeu tout en préservant la compatibilité du mod, donc patchage du fichier wed.
Je sais déterminer l'aire de chaque wallgroup et la comparer avec la bounding box d'un polygone pour déterminer s'il doit être ajouté à ce wallgroup. Le problème concerne les polygones situés à cheval sur plusieurs wallgroups : il faut impérativement les renseigner dans chaque wallgroup concerné. C'est facile visuellement, mais ça devient l'enfer pour prévoir tous les cas de figure avec WeiDU...
PS : J'ai volontairement réduit la taille de certains wallgroups car une image 1920x1920 passe moyennement sur le fofo. Et j'ai corrigé l'erreur de frappe.
Je sais déterminer l'aire de chaque wallgroup et la comparer avec la bounding box d'un polygone pour déterminer s'il doit être ajouté à ce wallgroup. Le problème concerne les polygones situés à cheval sur plusieurs wallgroups : il faut impérativement les renseigner dans chaque wallgroup concerné. C'est facile visuellement, mais ça devient l'enfer pour prévoir tous les cas de figure avec WeiDU...
PS : J'ai volontairement réduit la taille de certains wallgroups car une image 1920x1920 passe moyennement sur le fofo. Et j'ai corrigé l'erreur de frappe.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Moddeur qui s'arrache les cheveux...
... avec Menace sur le Royaume de Diamant Éternel.
- Isaya
- Adepte de Grondemarteau
- Planaire
- Messages : 6990
- Enregistré le : mar. 22 juil. 2003, 21:03
- Localisation : Plaisir
- Contact :
- Statut : Hors ligne
.
Cocrane, je pense que ta comparaison de coordonnées sera trop basique si tu la limites aux coordonnées des segments des polygones (je n'ai pas su déterminer si ton point de coordonnées [200, -95] est forcément une des extrémités du polygone). Il faudrait travailler sur les intersections de surface ou au moins parcourir les segments pour voir au dessus de quels wallgroups ils passent. Par exemple, si le point en haut à gauche du polygone C était un peu plus à gauche, le polygone recouvrirait aussi légèrement le wallgroup 3 sans qu'aucune extrémité du polygone ne s'y trouve.
Question bête, Freddy : sais-tu si cela pose un problème si tu déclares qu'un polygone couvre un wallgroup alors qu'il n'y a pas d'intersection ?
Dans le cas contraire, tu prends les coordonnées maximum dans les 4 directions (rectangle englobant ton polygone) et tu considères tous les wallgroups couverts. Ainsi le polygone C couvrait tous les wallgroups de ton extrait.
Question bête, Freddy : sais-tu si cela pose un problème si tu déclares qu'un polygone couvre un wallgroup alors qu'il n'y a pas d'intersection ?
Dans le cas contraire, tu prends les coordonnées maximum dans les 4 directions (rectangle englobant ton polygone) et tu considères tous les wallgroups couverts. Ainsi le polygone C couvrait tous les wallgroups de ton extrait.
:!: Peu disponible
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
Guide d'installation (et FAQ) de Baldur's Gate, Baldur's Gate II, Baldur's Gate Trilogy (BGT), BG1Tutu, Widescreen, BGEE
Pensez à utiliser à la fonction Recherche pour trouver une réponse à votre question !
- Freddy_Gwendo
- Adepte de Grondemarteau
- Orbe ancien
- Messages : 5877
- Enregistré le : sam. 23 avr. 2011, 00:26
- Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
- Statut : Hors ligne
.
Malheureusement, je ne pense pas que ça fonctionnerait.
En effet, mon problème est que le polygone de porte ouverte ne fonctionne pas (ne rend pas les créatures transparentes) s'il n'est pas renseigné dans le(s) wallgroup(s) concernés par son aire. C'est comme ça que je me suis aperçu qu'il manquait quelque chose à mon code.
Problème qui ne se pose pas quand on ajoute le polygone avec DLTCEP (ce dernier recalcule le tout en sauvegardant).
J'ai pensé utiliser le centre du polygone en plus des coordonnées de la bounding box, mais je crains que ça ne couvre pas tous les cas de figure.
En effet, mon problème est que le polygone de porte ouverte ne fonctionne pas (ne rend pas les créatures transparentes) s'il n'est pas renseigné dans le(s) wallgroup(s) concernés par son aire. C'est comme ça que je me suis aperçu qu'il manquait quelque chose à mon code.
Problème qui ne se pose pas quand on ajoute le polygone avec DLTCEP (ce dernier recalcule le tout en sauvegardant).
J'ai pensé utiliser le centre du polygone en plus des coordonnées de la bounding box, mais je crains que ça ne couvre pas tous les cas de figure.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Moddeur qui s'arrache les cheveux...
... avec Menace sur le Royaume de Diamant Éternel.
-
- Adepte de Grondemarteau
- Ogre mage
- Messages : 1328
- Enregistré le : dim. 21 mars 2010, 12:03
- Localisation : Paris
- Contact :
- Statut : Hors ligne
.
Ok pour l'explication. Même si pour moi à un moment donné, le joueur doit faire un choix. A vouloir installer tous les mods de la terre, il finit par avoir des pb. C'est déjà une méga charge de temps et d'énergie pour un moddeur de faire une histoire et de la coder. Dc perso, je fais le mini sur ce point.
Pour en revenir à ton pb. Oui effectivement si sur la droite passant entre 2 points du polygone, tu as plusieurs WallGroup à traverser, c'est plus chiant à gérer.
J'écris à chaud
1-
Tu fais plein de points pour minimiser le risque sachant qu'une porte, ca reste de taille raisonnable par rapport à un wallgroup. (ça me semble le plus simple). Mais ça va pas te plaire. Car tu veux un script qui gère tous les cas. :-p
2-
Quand tu passes d'un indice de wallgroup "1 à 3" pour 2 points qui se suivent c'est que fatalement le 2 est impacté. Il faut gérer l'horizontale et la verticale plus les diagonales. Ca me semble être une usine à gaz. :-)
3-
Pour une carte, on a finalement des lignes et des colonnes de Wallgroup = tableau. J'ignore si tu peux avoir moyen d'avoir l'équivalent de ce quadrillage.
Entre deux points, on est soit sur la même ligne. Soit sur la ligne du dessus ou du dessous. Si ce n'est pas le cas, il y a des Wallgroup impactés non identifiés.
4-
En gros, savoir pour chaque Wallgroup par quel autre wallgroup il est entouré. Si le 2nd WallGroup n'en fait pas parti alors c'est qu'il faut le déduire.
5-
Déduire la trajectoire de chaque droite entre 2 points de tes polygones (ca me fait penser aux équations du lycée) et ajouter des points réguliers pour les tester ensuite.
Si j'ai d'autres idées farfelues, promis je reviens hanter ton post. :
Cocrane qui n'a pas envie de modder ce soir.
Pour en revenir à ton pb. Oui effectivement si sur la droite passant entre 2 points du polygone, tu as plusieurs WallGroup à traverser, c'est plus chiant à gérer.
J'écris à chaud
1-
Tu fais plein de points pour minimiser le risque sachant qu'une porte, ca reste de taille raisonnable par rapport à un wallgroup. (ça me semble le plus simple). Mais ça va pas te plaire. Car tu veux un script qui gère tous les cas. :-p
2-
Quand tu passes d'un indice de wallgroup "1 à 3" pour 2 points qui se suivent c'est que fatalement le 2 est impacté. Il faut gérer l'horizontale et la verticale plus les diagonales. Ca me semble être une usine à gaz. :-)
3-
Pour une carte, on a finalement des lignes et des colonnes de Wallgroup = tableau. J'ignore si tu peux avoir moyen d'avoir l'équivalent de ce quadrillage.
Entre deux points, on est soit sur la même ligne. Soit sur la ligne du dessus ou du dessous. Si ce n'est pas le cas, il y a des Wallgroup impactés non identifiés.
4-
En gros, savoir pour chaque Wallgroup par quel autre wallgroup il est entouré. Si le 2nd WallGroup n'en fait pas parti alors c'est qu'il faut le déduire.
5-
Déduire la trajectoire de chaque droite entre 2 points de tes polygones (ca me fait penser aux équations du lycée) et ajouter des points réguliers pour les tester ensuite.
Si j'ai d'autres idées farfelues, promis je reviens hanter ton post. :
Cocrane qui n'a pas envie de modder ce soir.
- Freddy_Gwendo
- Adepte de Grondemarteau
- Orbe ancien
- Messages : 5877
- Enregistré le : sam. 23 avr. 2011, 00:26
- Localisation : Égaré dans un vortex entre Féérune et le Royaume de Diamant Éternel
- Statut : Hors ligne
.
Des nouvelles du front : Pour chaque wallgroup, je vérifie que la bounding box de tous les polygones est contenue dans l'aire du wallgroup.
1. Si oui, j'intègre les polygones au wallgroup concerné.
2. Sinon, je lis chaque segment de chaque polygone et intègre les polygones aux wallgroups quand nécessaire.
Ça couvre entre 95 et 98 % des cas sur une dizaine de cartes testées.
Comme WeiDU ne sait pas lire les fractions, c'est compliqué de calculer la trajectoire d'un segment... Du coup, je cale pour les cas restants à traiter.
1. Si oui, j'intègre les polygones au wallgroup concerné.
2. Sinon, je lis chaque segment de chaque polygone et intègre les polygones aux wallgroups quand nécessaire.
Ça couvre entre 95 et 98 % des cas sur une dizaine de cartes testées.
Comme WeiDU ne sait pas lire les fractions, c'est compliqué de calculer la trajectoire d'un segment... Du coup, je cale pour les cas restants à traiter.
CARPE DIEM...Co-modérateur de La Forge et de La Chambre des Scribes
Moddeur qui s'arrache les cheveux...
Moddeur qui s'arrache les cheveux...
... avec Menace sur le Royaume de Diamant Éternel.
Qui est en ligne
Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 0 invité