Ce tutoriel est en 3 parties car il m'était impossible de le publier en une seule car il dépasse le nombre de caractères maximum autorisés pour un message.
Tutoriel 2: Transformer une ressource (Asset) en centre commercial (première partie).
Pourquoi ?
Lorsqu'un objet est défini comme "commerce" il attire des clients.
Donc, si l'on veut gagner facilement de l'argent pour se rendre dans ce commerce dans TF, il suffit de placer un arrêt de bus, de tram ou une gare à proximité de ce bâtiment pour que les usagers utilisent cet arrêt pour se rendre dans ce commerce.
De façon similaire, on peut faire en sorte que cette construction attire également des marchandises et placer à proximité un dépôt de marchandises afin que nos camions apportent ces marchandises dans ce bâtiment. Ce sera une source supplémentaire de revenus.
Comment faire?
Pour attirer des clients, nous devons déclarer cette construction comme étant un immeuble commercial et le relier à la rue où circulent les bus et les piétons.
Pour attirer des marchandises, nous devons gérer les stocks entrants dans cet immeuble.
Modèle
Pour illustrer ce tuto, j'ai utilisé l'immeuble "Lidl" créé par Sir_Bier. Vous pouvez le télécharger à l'adresse suivante:
https://www.transportfever.net…ase/index.php/Entry/4237/
J'ai utilisé ce mod car il va me permettre de vous expliquer les points les plus importants de ce tutoriel.
Si vous installez ce mod tel quel, vous verrez qu'il se situe dans le menu des ressources (Asset) et qu'il est juste un bâtiment de décoration.
Nous allons le transformer en un véritable immeuble commercial!
Etudions le fichier lidl.con
Après avoir téléchargé le mod, sauvegardez-le dans un dossier.
Toutes les modifications se font dans le fichier lidl.con qui est écrit en language LUA.
Ce fichier est situé dans \res\construction\assets\buildings\lidl.con
Ouvrez ce fichier avec votre éditeur de texte favori (moi j'utilise Notepad++).
Vous remarquez qu'il y a peu de lignes de programmation.
Nous allons en modifier certaines et en ajouter d'autres.
Etudions ce script.
----------------------
Il s'agit d'une variable qui est utilisée dans le positionnement vertical du modèle. Vous la retrouvez, plus bas, dans l'appel de la fonction result.models().
On n'y touche pas pour le moment.
C'est la fonction qui paramétrise la construction et qui se termine, comme toute fonction en langage Lua, par l'instruction END en fin de script.
C'est dans le corps de cette fonction que nous allons définir ce modèle comme immeuble commercial.
Cela indique que la construction est juste un élément de décoration et qui placée dans le menu ressources (ASSET en Anglais).
Voici les types de constructions possibles dans TF (Toujours en MAJUSCULES):
INDUSTRY -- Immeuble industriel
STREET_STATION -- Arrêt de bus/tram
RAIL_STATION -- Gare de voyageurs
AIRPORT -- Aéroport
HARBOR -- Port de voyageurs
STREET_STATION_CARGO -- Arrêt de camions de marchandises
RAIL_STATION_CARGO -- Gare de marchandises
HARBOR_CARGO -- Port de marchandises
STREET_DEPOT -- Dépôt de bus/tram
RAIL_DEPOT -- Dépôt de train
WATER_DEPOT -- Entrepôt de bâteaux
ASSET_DEFAULT -- Ressources (ASSETS). C'est ce type qui est utilisé ici comme simple élément de décoration.
ASSET_PACK -- Ensemble de ressources
TOWN_BUILDING -- Habitations
Alles anzeigen
Nous laisserons l'immeuble Lidl dans "ASSET_DEFAULT".
Vous pourrez donc le sélectionner dans ce menu durant le jeu.
Toutefois, j'ai créé un sous-menu "Commercial". Je vous en parlerai le moment venu.
description = {
name = _("Lidl"), -- c'est le nom donné à l'immeuble
description = _("Lidl_Supermarkt") -- et sa description dans le menu
},
Le nom et la description de la construction apparaissent dans le menu lorsqu'on laisse le pointeur de la souris sur l'image de cette construction.
Cette image est au format .tga (non compressé) et est située dans:
\res\rtextures\ui\constructions\assets\buildings\Lidl.tga
Remarque
------------
Vous remarquez que le nom et la description de la construction sont écrits avec le format: _("mot")
Cela est utile si vous voulez que ces mots apparaissent dans le menu dans la langue du joueur qui utilise ce mod.
Je vous expliquerai, à la fin de ce tuto, en annexe 1, comment vous pouvez faire en sorte que les mots soient traduits dans la langue du joueur.
C'est ici que l'on indique les dates auxquelles cette construction est disponible. La syntaxe est la suivante:
Par exemple, yearFrom = 1900 et YearTo = 1975, qui indique que cette construction est disponible dans le menu de 1900 à 1975.
Je précise bien "dans le menu" car ce bâtiment, une fois construit, ne disparaît pas de votre carte en 1975! Il y restera tant que vous ne l'aurez pas détruit avec le buldozer.
En outre, les fichiers qui constituent ce modèle, restent toujours dans leurs répertoires d'origine.
Cas particuliers:
Si le contenu de la liste "availability" est vide (comme ici) ou si les deux valeurs sont égales à 0, cette construction est toujours visible dans le menu.
Si "yearFrom" est omis ou égal à 0, la construction est visible depuis le début du jeu jusqu'à la date "yearTo".
De-même, si "yearTo" est omis ou égal à 0, la construction reste disponible indéfiniment dans le menu depuis "yearFrom".
Par exemple:
La cosntruction est visible depuis le début du jeu jusqu'en 1990.
Dans ce tuto, puisque "availability" est vide, la construction est toujours visible dans le menu.
Ceci indique comment est placé la construction sur la carte:
MULTI : la construction peut être placée plusieurs fois sans rouvrir le menu
SINGLE : Lorsque la construction est placée sur la carte, le menu se referme et si on veut placer une autre construction il faut rouvrir le menu contenant cette construction.
BRUSH : C'est le mode "pulvérisation", c'est-à-dire que si on laisse le bouton gauche de la souris enfoncé pendant que l'on place une construction, celle-ci se dessine plusieurs fois. C'est pratique, par exemple pour placer des arbres sur la carte.
Vous verrez dans mes modifications que j'ai mis buildmode = "SINGLE", donc on place une construction, puis le menu se referme.
La construction apparaît dans le sous-menu "buildings" du menu "ASSET_DEFAULT".
J'ai modifié cette valeur par {"commercial"} afin de créer un sous-menu où je place tous mes immeubles commerciaux.
L'image associée à cette catégorie se trouve dans:
\res\textures\ui\construction\categories\commercial.tga
L'original "buildings" défini par le créateur du bâtiment se trouve dans le même répertoire avec, évidemment, le nom "buildings.tga car le fichier .tga doit avoir le même nom que le nom utilisé dans categories sinon, on aura un petit carré bleu dans le sous-menu.
C'est une variable que peut prendre la valeur "true" ou "false". Si elle est "true", cela permet que la construction puisse entrer en collision avec un autre objet de la carte.
Si elle est "false", toute collision est interdite au moment où l'on place cette construction sur la carte.
Dans la construction modifiée, j'ai placé cette valeur à "false" afin d'éviter toute collision avec un autre objet, comme la rue par exemple.
Si ce paramètre est mis sur "true", la construction sera automatiquement supprimée en cas de collision avec un autre objet.
C'est ici que l'on écrira la liste dees paramètres qui interviennent dans le reste du script.
Ces paramètres ouvrent un boîte de dialogue pour que le joueur puisse paramétrer la construction. Par exemple, pour choisir le nombre de voies dans une gare.
Plus loin dans ce tuto, je vous expliquerai comment faire pour utiliser des paramètres pour choisir, entre autre, le nombre de personnes qui viendront dans le magasin.
C'est cette fonction qui configure la construction en tenant compte des paramètres contenus dans la table "params" ci-dessus.
Cette fonction retourne une liste de paramètres au programme principal.
Dans le fichier Lidl.con il n'y a que deux éléments dans cette liste:
result.models =
{
{id = "SB_Lidl.001.mdl", transf = { 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, zPos, 1 } }
}
id est le fichier .mdl qui représente le modèle de la construction. Ce fichier se trouve dans:
\res\models\model
Nous ajouterons deux modèles supplémentaires qui viendront compléter cette liste. Il s'agit des objets qui nous permettront de voir les marchandises qui arriveront dans notre commerce.
"transf" est une liste qui représente une matrice 4x4 permettant de modifier la position du modèle sur la carte par rapport à ses coordonnées d'origine définies par le concepteur dans le fichier .mdl.
Je vous expliquerai, en annexe 2, en quoi consiste une matrice 4x4 et comment modifier les valeurs contenues pour déplacer, faire tourner et modifier la grandeur d'un modèle.
En ce qui concerne le modèle du bâtiment principal défini dans le fichier SB_Lidl.001.mdl, nous ne changerons pas ces valeurs. Je remplacerai juste la valeur zPos par 0, puisque je ne désire pas modifier la hauteur à laquelle le bâtiment va se positionner par rapport au sol.
Mais vous pouvez très bien le laisser tel quel et voir ce qui se passe si vous changez, à la première ligne du script la valeur de la variable zPos.
L'ordre dans lequel vous agencez la liste des modèles utilisés n'a pas d'importance.
type peut accepter les valeurs : "EQUAL", "LESS" ou "GREATER"
Les valeurs contenues dans cet élément de la liste déterminent la manière dont la construction est alignée par rapport au terrain.
En principe, on ne modifie pas ces valeurs.
C'est l'instruction qui retourne au programme principal la liste "result"
Marque la fin de la fonction "updateFn"
Marque la fin de la liste "return"
Marque la fin de la fonction "data()"
Voyons maintenant comment modifier ce script pour transformer cet élément de décoration "Lidl" en centre commercial
Téléchargez mon module "ML_tuto2_1" que vous trouverez sur ce site
Ouvrez dans votre éditeur de texte le fichier:
\res\construction\ assets\buildings\lidl.con
Vous voyez pas mal de changements par rapport au fichier .con d'origine.
1. Comment faire venir des clients dans notre magasin?
Tout d'abord, dans local result = {}, on ajoute une entrée intitulée:
Il existe 3 type de parcelles dans TF:
RESIDENTIAL : indique qu'il s'agit d'une maison d'habitation
COMMERCIAL : indique qu'il s'agit d'un commerce
INDUSTRIAL : indique qu'il s'agit d'une usine
Ici, nous définissons la construction comme étant de type commercial et cela suffit pour attirer des clients vers notre commerce, pour autant que cette construction soit placée au bord d'une rue reliée à la ville (max 5 mètres).
Il faudra attendre un mois avant de voir arriver les premiers clients.
Les piétons vont s'approcher de l'immeuble commercial et, une fois arrivés à sa hauteur, il vont disparaître pour indiquer qu'ils sont dans l'immeuble. Quelques temps après ils en ressortent et poursuivent leur chemin.
C'est pareil pour les voitures car certains clients qui habitent plus loin, vont venir visiter notre commerce en voiture.
Comme pour les piétons, les voitures vont disparaître de la rue une fois en face du commerce puis vont réapparaître au même endroit quelques secondes plus tard.
Ce n'est pas du plus bel effet, je l'avoue, mais si vous regardez le jeu, vous verrez que c'est ainsi qu'a été conçu le jeu.
On pourrait donc en rester là, mais nous pouvons faire mieux.
2. Amener les piétons dans le magasin
Tout d'abord, amenons les piétons vers la porte d'entrée du bâtiment par laquelle ils entrent et sortent de ce magasin. Ce sera plus réaliste!
Pour que les clients puissent entrer et sortir du magasin, nous allons relier la construction avec une rue. Mais pas n'importe quelle rue. Je ne veux pas que les voitures puissent l'emprunter et rentrer par la porte du magasin!
Donc je vais créer une allée réservée aux piétons.
Cette allée, je l'ai appelée "special_commercial_street".
Vous la trouverez dans mon module dans le répertoire:
\res\config\street\special_commercial_street.lua
Ouvrez ce fichier dans votre éditeur de texte.
Je n'entre pas dans les détails de la construction d'une rue. Voici ce qui est important:
Tout d'abord sachez que toutes les mesures de grandeurs dans TF sont exprimées en mètres.
numLanes = 0, -- indique combien de voies de circulation comporte cette rue. Comme je ne veux aucun véhicule, je mets cette variable à 0
streetWidth = 0.01, -- c'est la largeur de la rue. Ici je ne veux pas de rue, juste des trottoirs qui feront mon allée. J'aurais pu mettre cette variable à 0, mais, malheureusement, le programme va se planter. Voilà pourquoi j'ai mis 0,01 comme largeur
sidewalkWidth = 1.0, -- c'est la largeur d'un trottoir (ici 1 mètre)
sidewalkHeight = .30, -- c'est la hauteur du trottoir par rapport au sol. J'ai mis 0.30 m (soit 30 cm) qui est la mesure générale utilisée dans TF
yearFrom = 0, -- cette rue est visible depuis le début du jeu
yearTo = 1900, -- mais on ne la retrouve plus dans le menu des rues après 1900. Si vous souhaitez voir cette rue dans le mu des rues mettez cette valeur à 0, comme je vous l'ai déjà expliqué plus haut.
Tout le reste concerne les textures des rues, trottoirs et bordures. On peut aussi paramétrer les voies de bus et de tram, ainsi que les objets qui bordent la rue (arbre, réverbères, etc)
Je vous conseille de regarder les différents fichiers de rues du jeu que vous trouverez dans le répertoire:
\Transport Fever\res\config\street\
Cela vous permettra de vous amuser à modifier certains paramètres et voir par vous-même le résultat dans le jeu.
Mais je ne vous conseille pas de modifier ces fichiers directement dans le jeu, mais bien d'en faire une copie que vous modifierez selon vos goûts et puis les intégrer au jeu en créant un mod.
Cela fera sans doute l'objet d'un prochain tuto...
Maintenant que nous avons notre allée, nous allons la relier à notre magasin et à la rue principale afin que les clients puissent entrer dans le magasin.
Voici le magasin vu de face (Fig.1) et vu de derrière en vue aérienne (Fig.2):
transportfever.net/wsc/attachment/132460/
transportfever.net/wsc/attachment/132462/
Sur la Fig.1 nous voyons l'allée par laquelle les piétons entrent et sortent du magasin. Cette allée se prolonge à l'intérieur du magasin.
L'allée va donc du point A intérieur (11.8,0.0,0.3) au point B extérieur (11.8,16.0,0.3) où elle se relie à la rue principale.
Sur la Fig.2 nous voyons que les extrémités du bâtiment principal vont de X= -27.7 (à gauche) à X= 22.3 (à droite) et de Y= -15.0 (arrière) à Y= 10.44 (avant).
Ces coordonnées sont indiquées dans le fichier situé dans:
\res\models\model\SB_LIDL.001.mdl
C'est le fichier qui définit le modèle du bâtiment principal Lidl.
Vous trouverez les coordonnées, dans ce fichier, dans la liste:
Transport Fever\res\config\street\
boundingInfo = {
bbMax = {22.30238, 10.44462, 10.40048,},
bbMin = {-27.69763, -15.04805, 0.0,},
},
Remarquez aussi les coordonnées de l'allée.
Je l'ai faite rentrer dans le bâtiment pour que les piétons entrent jusque là, ce qui donne un aspect réaliste à la situation.
Je reviendrai plus tard sur les point R et S de la Fig.2
Pour relier l'allée à la rue nous créons un nouvel élément dans la liste result:
result.edgeLists =
{
{
type = "STREET",
params =
{
type = "special_commercial_street.lua",
},
edges =
{
{ { 11.8, 0.0, 0.3}, { 0, 1, 0 } },{ { 11.8, 16.0, 0.3}, { 0, 1, 0 } },
},
snapNodes = {1}
},
}
Alles anzeigen
Il s'agit d'une liste d'objets qui s'accolent aux bords de la construction principale.
Je définis donc un objet comme étant un segment de rue avec l'expression:
type = "STREET",
On utilise "STREET" pour une rue et "TRACK" pour une voie de chemin de fer.
Ensuite, je précise de quel modèle de rue il s'agit dans
params = {type = "special_commercial_street.lua",}
Puis je donne les coordonnées du segment de rue en définissant les bords avant et arrière de ce segment par rapport au centre de la construction (0,0,0) :
Après plusieurs essais, j'obtiens les coordonnées correctes de ce segment que je renseigne dans :
edges = { { { 11.8, 0.0, 0.3}, { 0, 1, 0 } },{ { 11.8, 16.0, 0.3}, { 0, 1, 0 } }},
coord X,Y,Z bord intérieur coord X,Y,Z bord extérieur
Noeud 0 Noeud 1
Mais que représente les triplets { 0, 1, 0 } ?
En fait, ce sont les vecteurs qui donnent la direction du segment ou, on peut dire aussi les axes d'alignement du segment de route.
J'ai expliqué dans mon tuto 1 ("Création d'arrêts de bus dans une station") le concept des axes d'alignement et comment les calculer.
Comme ce segment est rectiligne, on utilise (0, 1, 0) comme axe d'alignement pour les deux bords.
Si vous voulez plus d'explications concernant les axes d'alignement, revoyez mon tuto 1.
Enfin, nous devons indiquer de quel côté mon allée va se relier à la rue principale. Cela se fait avec snapNodes = {1}, c'est-à dire le Noeud 1 du segment dans la liste edges.
Je vous rappelle que puisqu'il s'agit d'une liste, le premier élément possède l'indice 0, le deuxième l'indice 1, etc...
Si nous nous arrêtons là, les piétons arriveront bien après un mois dans notre magasin. Mais cela ne générera pas d'argent supplémentaire.
Ce que nous devons faire c'est amener ces clients depuis le centre ville vers le commerce en plaçant un arrêt de bus à proximité de celui-ci et, bien entendu, relier cet arrêt de bus par une ligne de bus.
Ainsi les clients vont utiliser cette ligne de bus pour aller au magasin et c'est à ce moment que cela va nous faire gagner de l'argent!
Vous remarquerez que j'ai placé une seconde rue, accolée à notre construction.
Je l'ai fait pour vous montrer qu'il est possible d'associer plusieurs rues à une construction.
Il s'agit d'une rue standard du jeu ("new_medium.lua") que je rajoute dans result.edgeLists. Vous la trouverez dans le répertoire:
\Transport Fever\res\config\street\new_medium.lua
Nous avons alors:
result.edgeLists =
{
{
type = "STREET",
params =
{
type = "special_commercial_street.lua",
},
edges =
{
{ { 11.8, 0.0, 0.3}, { 0, 1, 0 } },{ { 11.8, 16.0, 0.3}, { 0, 1, 0 } }
},
snapNodes = {1}
},
{
type = "STREET",
params =
{
type = "new_medium.lua",
},
edges =
{
{ { 31.0, -20.0, 0.3}, { 0, 1, 0 } },{ { 31.0, 16.0, 0.3}, { 0, 1, 0 } }
},
snapNodes = {1,0}
}
}
Alles anzeigen
Remarquez que snapNodes possède deux valeurs: {1,0}. Cela veut dire que le segment de route peut être relié des deux côtés.
Ainsi les véhicules (et les piétons) pourront utiliser cette rue pour circuler.