Catégorie : games

ShootMania : l’après TrackMania

Vous pouvez voir la vidéo de Shootmania ici :

Présentation de shootmania

C’est vraiment impressionnant.

Mon petit nez me disait que du côté du scripting ils avaient fait quelque chose de fort.
Je me suis trompé : ça n’est pas fort, c’est exceptionnellement fort.

En fait leur moteur de scripting, tenez vous bien, intègre un compilateur qui génère du code machine : oui, vous avez bien lu, le code est compilé à la volée !

C’est ce qui se produit déjà dans Trackmania 2 et mon petit nez me disait qu’ils avaient fait un boulot énorme, au vu de la rapidité avec laquelle mon script de labyrinthes était compilé puis exécuté.

Vivement que je puisse mettre la main dessus pour faire les maps MOBA de labyrinthes 🙂

Steam : d’où l’intérêt de travailler avec des gens compétents

Je vous fais part du message du directeur de steam, à vous d’en penser ce que vous voulez :

10 février 2012
Chers utilisateurs Steam et des forums Steam :

Des investigations sont en cours avec l’aide d’experts en sécurité informatique depuis l’intrusion dont nous avons été victime l’année dernière. Dans ma dernière communication à ce sujet, je décrivais comment les intrus avaient pu accéder à notre base de données Steam sans avoir trouvé d’évidence sur une captation d’information à partir de cette base de données.

Récemment, nous avons appris qu’il est probable que les intrus aient obtenu une copie du fichier de sauvegarde contenant les transactions effectuées sur Steam entre 2004 et 2008. Ce fichier de sauvegarde contenait les noms d’utilisateurs, les adresses email, les adresses encryptées de facturation et les informations encryptées des cartes bancaires. Ce fichier ne contenait pas les mots de passe Steam.

Nous n’avons aucune évidence nous permettant de penser que les informations bancaires encryptées ou que les adresses de facturation (également encryptées) aient été compromises. Cependant, comme je vous en informais en novembre, il convient de surveiller l’activité de vos cartes bancaires et/ou de crédit. Il est également une bonne idée d’activer Steam Guard sur votre compte Steam.

L’enquête poursuit son cours et nous travaillons avec les autorités compétentes. Certains états nécessitent un mode de communication plus formel et vous recevrez l’information en conséquence mais je souhaitais vous tenir informé de l’évolution de la situation.

Gabe

Trackmania 2 : labyrinthe, C et scripts Nadeo

J’ai crée un générateur de labyrinthes en BASIC.

Puis je l’ai ré-écrit. En Delphi (Pascal Orienté Objet, plus facile que tous ses concurrents (C++, Java, etc)).

Il générait des scripts « JavaScript » pour Photoshop. J’ai ainsi pu générer des labyrinthes immenses avec du Scripting Photoshop, mais j’ai rapidement vu les limites de ce dernier.

Alors je l’ai ré-écrit. En mieux, et beaucoup, beaucoup, beaucoup plus évolué. Plusieurs étapes de génération. Générateur de labyrinthes en C sous Linux, tout en ligne de commandes. J’ai donc dû apprendre vim, et je ne regrette rien, bien au contraire !

A partir de là, j’ai pu générer beaucoup de types de script :

  • J’ai commencé à générer des scripts Autohotkey pour Trackmania 1 : ici et ici.
  • Puis généré un petit jeu de mémoire, que vous pouvez voir ici.
  • Puis est sorti Trackmania 2. J’ai donc modifié mon générateur pour faire des scripts complets Trackmania : ici

Et comme pas mal de personnes ont trouvé ça sympa, voire certains ont carrément essayé de les terminer (plus de deux heures de route pour l’un), une personne a fait un petit article sur moi ici.

Voici la vidéo qui est originale, et vous pourrez voir évoluer mon script :

Trackmania 2 / ManiaScript, ManiaPlanet et Labyrinthes : génération automatique

Vous avez peut-être vu que j’avais écrit un générateur de labyrinthes en C, qui créait en bout de course un fichier Autohotkey (là aussi je vous laisse vous renseigner). Ce fichier Autohotkey lançait Trackmania United Forever et automatisait la pose de blocs, et au final il y avait une course dans… un labyrinthe de blocs de course. J’avais donc modifié Trackmania afin d’en faire un outil pour jouer dans des labyrinthes !

Trackmania 2 est sorti, en version bêta, avec achat pour 0.01 € de moins.
Comme c’était une offre extraordinaire, j’ai sauté sur l’occasion.

Et dans Trackmania 2, ils ont fait très fort (même si ça n’est pas encore 100 % terminé, c’est déjà très abouti) : dans leur éditeur de maps, ils ont fait un langage de programmation qui leur est propre, une sorte de fils caché entre le JavaScript et XML, avec quelques attouchements de C et de « principes objet ».
Je trouve que ça n’est pas très lisible, et encore moins maintenable, mais bon, c’est pour un jeu, alors il faut pas en demander trop, surtout quand on voit qu’on n’est pas que joueur, mais qu’on peut être acteur !
Ce pseudo-langage de programmation s’appelle «ManiaScript».

Je me suis dit : je vais refaire mon générateur de labyrinthes, mais pour «ManiaScript».
J’ai donc commencé à préparer le terrain en «ManiaScript» : j’ai préparé des routines de poses de blocs, des routines pour poser les montées, etc. J’en ai profité pour faire une petite copie d’écran que je vous livre avec plaisir (cliquez dessus pour agrandir) :

Image Trackmania de Labyrinthes

Puis j’en ai profité pour me repencher sur mon ancien générateur, et je me suis dit : je vais le reprendre, afin de lui faire générer des scripts «ManiaScript».

C’est ce que j’ai fait, et au bout de deux soirées passées à tout ré-analyser ce que j’avais fait (même si je mets des tonnes de commentaires, mon générateur est en C pur, donc c’est très dur (pour moi en tous les cas) de me replonger dans le bain), j’ai enfin pu recompiler et générer quelque chose. J’en ai donc fait une copie d’écran que je vous livre avec plaisir (cliquez dessus pour agrandir) :

Image Trackmania de Labyrinthes

Et puis j’ai repassé toute une soirée à réussir à lier les deux. Le plus gros problème vient du fait que je prends les repères mathématiques «classiques» c’est à dire en vertical, Y, à l’horizontal X, et en profondeur Z. Dans Trackmania, le Y et Z sont inversés. Bonjour le casse tête mais je n’étais pas à ça près. J’ai donc réussi : j’ai fait une copie d’écran que je vous livre avec un bien plus grand plaisir que les deux précédents (cliquez dessus pour agrandir) :

Image Trackmania de Labyrinthes

La pose des montées se fait avant la pose des blocs principaux. C’est assez marrant à voir, et comme je suis gentil, je vous ai même fait une copie d’écran (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Ensuite, j’ai voulu tester les limites de ma machine, et j’ai crée le plus grand labyrinthe possible pour Trackmania 2, et à mon grand plaisir, le jeu n’a pas explosé, comme il le faisait pour Trackmania United. Mattez moi ça (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Trackmania 2 a une nouveauté extraordinaire : ils précalculent les ombres avec un réalisme époustouflant, et j’ai donc demandé de précalculer avec le maximum de précision (il y a six niveaux, et le plus détaillé prend plusieurs heures de calcul), et voilà ce que ça a donné (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Ensuite, je me suis dit que les labyrinthes c’est bien joli, mais uniquement des blocs carrés, c’est pas très marrant. Donc j’ai décidé d’améliorer le tout, et j’ai trouvé un truc : après que le labyrinthe ait été posé par le script, j’ai imaginé rajouter en «ManiaScript» du code qui « décore » le labyrinthe. Par exemple, pour les tournants, j’ai mis des blocs de type « route », et j’ai ajouté un bloc « carré » pour terminer tous les cul-de-sac (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Et puis je me suis aperçu que les blocs avaient la possibilité d’avoir des néons incrustés, et que les tournants étaient éclairés, j’ai essayé de voir ce que ça donnait en mode nuit, et c’est vraiment beau (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

J’ai recalculé le même labyrinthe afin que vous puissiez comparer avec et sans les améliorations (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes
Image Trackmania de Labyrinthes

Et le même labyrinthe en mode nuit (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Ensuite, j’ai trouvé d’autres types de blocs dont j’ai pu me servir pour améliorer encore le rendu, et faire des tunnels. Le rendu de nuit des tunnels est encore plus joli (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Et puis les dernières captures, qui concernent le seul circuit que j’ai entièrement validé, sur douze étages (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Et comble de joie, le dernier étage a en plus le tout dernier type de tunnels que j’avais implémenté, mais il ne sort que très rarement sur les labyrinthes qui ne sont pas très larges (celui ci fait 4×4) (cliquez dessus pour agrandir) :
Image Trackmania de Labyrinthes

Gemcraft nouvelle version : Gemcraft Labyrinth

Mon jeu / Casse tête favori est de retour !
Bien évidemment avec plein de nouveautés et une durée de vie encore démultipliée, ce qui va en faire des nuits blanches (car la nuit est bien la seule chose qui me reste avec mes deux petits ><)

Pour ceux qui ne savent pas ce qu’est ce petit casse tête génial du type « Tower defence », je vous renvoie à ma petite page d’explications ici.

Gemcraft Labyrinth - page de présentation

Tout d’abord, la taille de tous les labyrinthes à résoudre : 13×13 = 169. Oui oui vous avez bien lu, cent soixante neuf niveaux, ce qui, rien que le temps de les faire d’affilée, donne déjà une bonne trentaine d’heures. Voici la carte principale lorsqu’on débute (je les ai presque tous terminé, mais je ne vais pas vous montrer la carte entièrement remplie :!) :
Gemcraft Labyrinth - page de la carte des labyrinthes

Ensuite, pour chaque niveaux, pas grand chose de changé visuellement, et on en est bien content, car c’était déjà tellement bien qu’il n’y avait presque rien à améliorer :
Gemcraft Labyrinth - page d'un niveau à résoudre

Mais là où ça commence déjà à démultiplier la durée de vie, qui je vous le rappelle, de base, est déjà d’une bonne trentaine d’heures, c’est que pour chaque niveau, il est possible de le résoudre en y ajoutant des difficultés supplémentaires, qui vont rendre le niveau à la fois plus dur, mais qui va vous apporter de l’expérience supplémentaire afin de vous faire progresser :
Gemcraft Labyrinth - challenges possibles à résoudre

Vous pouvez changez, pour chaque niveau :

  • Le nombre de monstres ;
  • La résistance des monstres ;
  • La composition des vagues de monstres ;
  • Le nombre de vagues de monstres ;
  • Des challenges qui rajoutent encore à la difficulté.

Le plus grand changement

Il est maintenant possible de « construire » le chemin en posant des tours et autres là où on veut, de manière à former un chemin.
Ça ajoute un élément énorme au gameplay et on a envie d’y jouer encore plus longtemps !
Je ne sais pas si je me suis bien exprimé, alors deux images valent mieux de des tonnes d’explications :

Voici une carte à faire, au début, complètement vide :
Gemcraft Labyrinth - challenges possibles à résoudre

Et voici la carte pendant le jeu :
Gemcraft Labyrinth - challenges possibles à résoudre

Il est donc possible de faire des chemins comme on veut, de « couper la route » afin de faire passer les vagues de monstre uniquement par des endroits que l’on désire.

Et je ne parle pas de toutes les petites améliorations qui sont subtiles mais qui augmentent encore le plaisir de jeu : par exemple, le fait que les cartes démarrent en mode pause et qu’on peut ainsi tranquillement réfléchir et poser les éléments et se préparer tranquillement. Le fait qu’on puisse cliquer sur un monstre pour dire « tout le monde sur lui » et donc les tours essaieront en priorité de le descendre. Il y en a encore et encore, mais cet article est déjà suffisamment long pour, je l’espère, vous avoir donné l’eau à la bouche.

Y a-t-il des défauts ? Très honnêtement je n’en ai pas trouvé. Il semblerait même que du point de vue de la vitesse, tout ait été encore plus optimisé que la version précédente. Bref, que du tout bon. Et pour quelque chose de misérable comme 5 euros, vraiment, un seul conseil : précipitez vous dessus et faites comme moi : payez ceux qui le méritent !

Traduction d’une épopée de Dwarf

Traduction d’un extrait de l’article qui relate l’histoire d’un héros.

11/07/2010 : Le paysan m’a demandé de tuer le conjoint du « Monstre Fantôme ». La tanière était un peu dégoûtante, mais en fouinant un peu,  j’ai pu trouver quelques pièces de monnaie sur les restes des humains et des gobelins qui avaient été envoyés, respectivement par la Nation des Lapins et le Tic de la Construction. Le conjoint lui-même avait été expédié avec le une relative facilité. Je suis allé directement au château surplombant la rivière annoncer mes actes. Le seigneur de céans m’a envoyé pour tuer l’épouse de la créature sombre à laquelle cette dernière venait de se marier. J’ai pris une fine lame avec moi et je suis parti.

La rivière longeait les portes du château, et quand je suis sorti, nous avons eu quelques ennuis avec un alligator. En fait, c’est surtout  la fine lame qui a eu plus d’ennuis que moi, et a fini au beau milieu de la rivière, à un endroit d’où je ne pouvais l’aider. L’alligator est devenu Skinnyrends et je suis reparti sur ma recherche. J’ai trouvé un bronze pectoral dans la première chambre, sans aucun signe du jeune marié autre que le désordre. Je l’ai tout de même trouvé dans la pièce suivante et j’ai coupé sa tête avec ma hache. Trop facile. Il n’était pas seul cependant. La créature sombre vivait toujours là ! Ça s’annonçait plus corsé que prévu. Après avoir réussi à planter mon arme dans son épaule, elle m’a mordu le bras et s’est mise à le secouer violemment. J’ai réussi à me libérer après avoir perdu beaucoup de sang, et c’est juste à ce moment qu’elle a décidé de prendre son hachoir à viande et me l’a planté sur le pied. Je suis parti en courant, en laissant ma hache et mon orteil derrière moi.

J’ai continué ainsi jusqu’à un marché et là un marchand généreux m’a laissé dormir sur son plancher toute la nuit. Au petit matin, j’ai troqué mes pièces, ma cuirasse et la moitié de mes vêtements contre une grande hache de bronze. Mon bras droit était encore inutile, mais je ne pouvais gérer l’arme d’une main. Je suis retourné au château près de la rivière, afin de raconter mon succès… un succès technique, de toute façon, car la recherche concernait l’époux. Alors que je longeais pas à pas les portes du donjon, j’ai assisté à une scène d’horreur. L’alligator Skinnyrends était à l’intérieur et le seigneur était à côté de sa tête sur le sol de pierre ensanglanté. L’un des soldats du seigneur tenait tête, mais j’ai réussi à mater la bête assassine moi-même. J’ai rapporté la mauvaise nouvelle à la femme du soldat, et les rumeurs sur mon dernier exploit m’ont rapidement transformé en un personnage très respecté.

Malheureusement, j’aurai besoin de voyager jusqu’à un autre château bien plus éloigné pour avoir une renommée encore plus grande. En faisant un tour dans le donjon du château, j’ai remarqué un elfe prisonnier. J’ai aussi remarqué qu’il lui manquait un nez. Après un examen minutieux du donjon j’ai fini par trouver son nez parmi les débris. J’avais besoin de quelqu’un pour m’accompagner lors de mon voyage. Quelqu’un qui m’aide à éviter les attaques, principalement de nuit. J’ai donc invité ce prisonnier. Nous avons réussi à atteindre le second château sans problème et nous avons dormi dans une de ses tours.

Au petit matin, la rumeur du personnage très respecté que je suis avait été répandue, et la dirigeante du château m’a demandé, au nom de la Nation des Lapins, de traquer un goblin hors la loi qui ne faisait plus parti du Tic de la Construction, mais était toujours le leader d’un gros groupe….

Etc etc. Vraiment impressionnant.

mes pièces, ma cuirasse et la moitié de mes vêtements pour obtenir une grande hache de bronze. Mon bras droit était encore inutile, mais je ne pouvais gérer l’arme d’une main. Je suis retourné au château par la rivière pour le rapport de mon succès … un succès technique, de toute façon, car la recherche a été l’époux. Comme je l’ai suivi pas à pas les portes du donjon, j’ai assisté à une scène d’horreur. Le Skinnyrends alligator était à l’intérieur, et le seigneur était à côté de sa tête sur le sol de pierre sanglante. L’un des soldats du seigneur tenait tête, mais j’ai réussi à mater la bête meurtrière moi-même. J’ai rapporté de mes nouvelles du conjoint pour le soldat, et avec mon secours à la fin de la garder, je suis devenu un personnage très respecté. Malheureusement, j’aurais besoin de Voyage d’un château au loin à la quête pour la gloire d’autres. En dehors de la garder, j’ai remarqué un prisonnier elfe. J’ai aussi remarqué que son nez était manquant. Un examen médico-légal du donjon a révélé la partie du corps parmi les débris. J’ai besoin de quelqu’un pour Voyage avec moi dans la nature pour aider à dissuader les attaques de nuit sur le long voyage, donc j’ai invité le prisonnier long. Nous l’avons fait au château seconde après sunfall et a dormi dans une des tours.

Google Traduction pour les :RecherchesVidéosE-mailsMobilesChatsEntrepri

pygame : exemple de transparence

Voici un exemple simple pour gérer la transparence : cet exemple est très simple, il crée un petit carré qui suit la souris partout, et un autre « gros » carré qui apparait autour de la souris puis ne bouge plus, et dès que la souris sort de ce carré, hop, il fait un fondu au noir. Vous pouvez donc vous baser sur cet exemple pour comprendre comment transformer votre Surface en surface transparente destinée à être rapidement affichée à l’écran. Je parle de convert_alpha(). Avec cet appel, pour vous donner une idée, le temps pris est presque 40 fois plus rapide que sans l’appel. Vous pouvez tester par vous même !

Attention !
Le plus important c’est de faire dans l’ordre :

        self.image.set_alpha(valeur_transparence)
        pygame.Surface.convert_alpha(self.image)

Car l’ordre self.image.set_alpha(valeur_transparence) fera créer un masque au complet, et ce n’est qu’après qu’il vous faudra convertir la totale via pygame.Surface.convert_alpha(self.image).

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import os, pygame, sys, time, random, copy, pprint
from pygame.locals import *

class MySprite(pygame.sprite.Sprite):
    def __init__(self,width,height):
        # (!) Avant toute chose appeler le constructeur parent :
        pygame.sprite.Sprite.__init__(self)
        self.width = width
        self.height = height
        self.rect  = pygame.Rect(0, 0, width, height)
        self.image = pygame.Surface( (self.rect.width, self.rect.height) )
        self.image.set_colorkey((0,0,0))
        self.image.fill((0, 0, 0))

class SMouse(MySprite):
    def __init__(self,width,height):
        MySprite.__init__(self,width,height)
        pygame.draw.rect(self.image, (205,250,130), self.rect, 5)
        self.image = self.image.convert()

    def update(self):
        self.rect.topleft = pygame.mouse.get_pos()

class Contour(MySprite):
    def __init__(self,width,height,speed):
        MySprite.__init__(self,width,height)
        pygame.draw.rect(self.image, (105,250,230), self.rect, 5)
        self.fadeout = False
        self.speed = speed
        self.alpha = 250
        self.done = False
        self.image.set_alpha(self.alpha)
        # Convertir en transparent :
        pygame.Surface.convert_alpha(self.image)

    def update(self):
        if not self.fadeout:
            if not self.rect.collidepoint( pygame.mouse.get_pos() ):
                self.fadeout = True
        else:
            self.alpha -= self.speed
            if self.alpha<0:
                self.alpha = 0
                self.done = True
            self.image.set_alpha(self.alpha)

def main():
    pygame.init()
    pygame.mouse.set_visible(0)
    screen = pygame.display.set_mode( (0,0),
        pygame.FULLSCREEN | pygame.DOUBLEBUF | pygame.HWSURFACE )
    if pygame.display.Info().bitsize < 24:
        print "This game needs a 24 bits display"
        pygame.quit()

    background = pygame.Surface(screen.get_size())
    background = background.convert()
    background.fill((0, 0, 0))
    screen.blit(background, (0, 0))
    pygame.display.flip()
    clock = pygame.time.Clock()
    c = Contour(500, 500, 5)
    c.rect.center = pygame.mouse.get_pos()
    group_sprites = pygame.sprite.RenderPlain( [ SMouse(50, 50), c ] )

Labyrinthes Trackmania : ça a fonctionné !

J’ai écrit un énorme générateur de labyrinthes pour Trackmania :

Forum Trackmania sur mes labyrinthes

Et plein de personnes ont répondu, il y en a même une qui a crée un topic sur un forum Espagnol :

http://tm.maniazones.com/forum/index.php?topic=20292.0

Enfin, comme les liens ne fonctionnent pas forcément, voilà le lien pour aller récupérer tous les fichier de folie que mon générateur a fait :

http://olivier.pons.free.fr/archives/

Et n’oubliez pas la meilleure page concernant ces labyrinthes, qui se trouve directement sur ce site même :

Trackmania et labyrinthes