• TRADUCTION : SKULLSTONE, level design

    Dans cet article, nous décrivons quelques solutions intéressantes que nous avons utilisées pour créer des niveaux dans Skullstone.

    TRADUCTION : SKULLSTONE, level design

    La conception des niveaux est l'une des dernières étapes de l'élaboration d'un jeu. Elle consiste à créer des cartes/terrains et à les remplir avec des objets, des PNJ, des obstacles, des ennemis, etc. La plupart de ces éléments ne sont que décoratifs ou sont placés de manière à constituer un challenge facile. Ce sont de simples objets graphiques équipés de collisionneurs* ou définis par un volume spécifique d'une carte.
    Toutefois, les autres éléments nécessitent un peu plus d'attention (et d'efforts) de la part des concepteurs. Les adversaires doivent être pilotés par l'IA, les PNJ doivent avoir leurs lignes de dialogue configurées et les objets interactifs doivent être correctement scénarisés. Nous ne codons pas ces choses en dur car les bricoler est plus simple. 
    Des systèmes de dialogue simples permettent d'organiser les textes en structures arborescentes avec la possibilité d'ajouter une fonction prédéfinie dans le code du jeu. Par exemple, il peut débloquer une certaine fonction, donner au joueur une récompense (objet), accorder de l'expérience ou activer une sous-quête.
    L'IA concerne généralement des algorithmes plus ou moins compliqués qui analysent la situation sur la carte et décident de l'action à prendre. C'est souvent le cas, lorsqu'elle est configurable avec seulement quelques paramètres tels que le niveau d'agression, l'affectation à un groupe particulier ou... la capacité de tricher (ouais, l'IA prend souvent la facilité et ne suit pas les règles du joueur humain). Des systèmes plus avancés offrent la possibilité d'adapter précisément un comportement particulier à une situation donnée et de sélectionner les paramètres de l'environnement de jeu qui influencent le comportement du bot. Un exemple parfait d'une telle solution avancée est notre système polonais appelé Grail.
    L'ensemble du processus de création d'une carte et de placement des objets peut être abordé de plusieurs manières. Si nous utilisons le moteur Unity, le plus simple est d'utiliser l'éditeur de scènes intégré. Il permet de placer dans l'espace des objets fabriqués à partir de préfabriqués préparés auparavant. Souvent, cependant, les programmeurs mettent en œuvre leur propre éditeur, ce qui peut énormément stimuler le travail des concepteurs. C'était notre approche avec Skullstone.
    Les scènes souterraines ont pu être créées très rapidement grâce à leur nature spécifique. La carte est une grille dans laquelle nous marquons les cases qui sont des couloirs. Les murs, le sol et le toit sont générés automatiquement. De plus, chaque case peut contenir un objet (qu'il soit interactif ou non) sur le sol et sur chacun de ses bords. Nous cliquons sur la case pour sélectionner un des éléments prédéfinis dans une liste, par exemple un levier, un bouton, une porte, une toile d'araignée... La structure (représentation) d'une telle carte est également simple. Elle contient les identificateurs des types d'objets et leur emplacement - qui est - x,y et l'orientation. Ce que vous voyez à l'écran est créé dynamiquement sur la base d'une telle représentation.

    TRADUCTION : SKULLSTONE, level design

    Au cours d'une partie, le joueur peut déposer un objet sur le sol et nous avons tenu compte de cette possibilité pour créer des niveaux. Il n'était pas nécessaire de reproduire un mécanisme déjà existant dans le jeu, donc l'un des aspects de la création d'un niveau consiste à survoler la carte en "mode dieu" et à placer des objets que le joueur pourra trouver plus tard. Placer des ennemis est encore plus simple : il suffit de choisir le type d'ennemi dans une liste et de cliquer sur le bouton correspondant dans l'éditeur. Le monstre apparaît dans la case directement devant le personnage du joueur. Nous pouvons sélectionner le monstre dans la liste de tous les monstres du niveau actuel et définir ses propriétés supplémentaires telles que le groupe auquel il appartient ou son comportement initial (sommeil, garde).
    D'accord, mais que dois-je faire pour que tout semble "vivant" : comment mettre en œuvre la logique du jeu ? Comment relier la serrure et la porte ? Comment faire pour que le levier ferme la trappe ? La réponse la plus évidente semble être : écrire le scénario pour chacun de ces comportements. Dans Unity, nous créerions et ajouterions un composant dédié qui détecterait si l'interrupteur est enclenché et exécuterait l'action sur l'objet de la scène qu'il actionne. Des langages tels que Lua ou Python permettent d'écrire des scripts d'objets de la même manière. Cela nécessite que ces langages soient chargés par le moteur de jeu et correctement configurés pour fonctionner avec lui.
    Nous l'avons fait de manière beaucoup plus simple dans Skullstone. Chaque objet a deux états booléens** : ouvert/fermé, marche/arrêt, vie/mort, etc. Nous les traitons comme nous traiterions avec une machine avec deux états possibles. La chose la plus attendue est alors de transférer l'état d'un objet à un autre. Comme nous l'avons mentionné précédemment, chaque objet est représenté par sa catégorie, son position et sa direction, ce qui permet de les situer facilement. Pour contrôler une trappe par un levier, il suffit de transférer l'état d'un objet à l'autre. C'est dans ce but que nous avons conçu notre propre langage pour le représenter. L'instruction de base est constituée de l'adresse de l'objet sur lequel l'action agit, du type d'action (transfert d'état, verrouillage, temporisateur, etc.) ainsi que des paramètres. Dans le cas du transfert d'état, l'un des paramètres est l'adresse de l'objet de destination et la valeur qui indique s'il doit être annulé ou non.

    TRADUCTION : SKULLSTONE, level design

    À un moment donné, il est devenu évident qu'un script peut également être utilisé pour définir une propriété particulière d'un objet et pas seulement pour opérer sur des états. De cette façon, nous attachons des textes aux signes sur le mur et nous configurons des autels (vous les verrez dans le jeu).
    Et si nous voulions définir un comportement plus sophistiqué ? Et si nous devions stocker des données et exécuter une séquence d'événements ? Des memory cells sont nécessaires et nous les avons. Chaque objet à deux états avec une valeur mémoire .... Par exemple : une porte, qui ne peut être ouverte ou fermée qu'un certain nombre de fois, avant qu'elle ne soit verrouillée définitivement. Joli piège, n'est-ce pas ? Surtout s'il y a une meute de créatures assoiffées de sang qui attendent derrière la porte.
    Il y a quelque temps, nous avons enregistré une vidéo dans laquelle nous présentions nos solutions. Je pense que ce sera un bel ajout à cet article
     
    J'espère vraiment que vous aimerez notre vision non conventionnelle et peut-être que cela inspirera quelqu'un à créer quelque chose d'intéressant aussi. Nous sommes impatients de le découvrir.
    Frozenshade
    ______
    * collisionneur : Accélérateur de particules sans cible fixe, où se produisent des collisions frontales
    ** En programmation informatique, un booléen est un type de variable à deux états (généralement notés vrai et faux).

    Le souci avec Skullstone, avec tout ce que l'on a pu voir, c'est qu'on a l'impression d'être face à un mod pour Legend of Grimrock. On ne veut pas être médisants, mais avec tous les mods et niveaux existants gratuits que l'on peut trouver sur la toile pour ce dernier, qu'est ce que Skullstone, produit payant, apportera de novateur ?

    Contrairement à Operencia : the Stolen Sun ou The Bard's Tale IV : Barrows Deep voir même Vaporum, il manque cruellement d'une identité propre, d'une personnalité différente. Alors on espère que ces retards répétés vont lui permettre de nous faire mentir et l'habiller d'inédits, de nouveautés. Oui, on espère ...

     


    Tags Tags : , , , , , ,