ANOTHER WORLD

UNE BELLE LEÇON D’ARCHITECTURE LOGICIELLE

ANOTHER WORLD

Une belle leçon d’architecture logicielle

ANOTHER WORLD

MAIS QU'EST-CE DONC ?

UN JEU VIDÉO CULTE !

Cultissime même !

Another World Cover
Another World Cover

EN QUELQUES MOTS

Another World
UN JEU D'AVENTURE/ACTION CINÉMATIQUE
Pour une expérience cinématographique
IMAGINÉ, CONÇU ET RÉALISÉ PAR ÉRIC CHAHI
L'oeuvre d'un seul homme (quasiment)
PUBLIÉ PAR DELPHINE SOFTWARE
Et Interplay aux États-Unis
COMMERCIALISÉ EN NOVEMBRE 1991
🤯🤯🤯

NOVEMBRE 1991 ?

WTF ?!?!

I was there
I was there
I was there
J'aime les gros pixels
J'aime les gros pixels
J'aime les gros pixels

LE PACKAGE

Another World
UN PETIT EXÉCUTABLE
⚙️ pesant seulement 24Ko ⚙️
DES ASSETS et RESSOURCES
🎨 pesant au total 1,2Mo 🎼
・・・
LE TOUT TENANT SUR
UNE SEULE DISQUETTE 💾

(Haute densité 1,44Mo)
 

LA TECHNIQUE

Another World
UN MOTEUR GRAPHIQUE POLYGONAL 2D
📽️ Pour de belles animations et séquences cinématiques 🎞️
UN MOTEUR SONORE 4 PISTES PCM
🎼 Pour une musique et des effets sonores inoubliables 🎵
・・・
UNE MACHINE VIRTUELLE
🤯 Un bytecode pour les gouverner tous 🔥
 

ÉRIC CHAHI

LE MAGICIEN

ÉRIC CHAHI

La bio express

Eric Chahi
Eric Chahi
DÉVELOPPEUR, GRAPHISTE
ET GAME DESIGNER

Né en 1967 à Yerres (91)
UN DES PIONNIERS
DU JEU VIDÉO EN FRANCE

Durant les années 80 et 90
1983 · ASN DIFFUSION
Démarre sa carrière sur Oric Atmos
 
« Frog », « Carnaval »
1985 · LORICIEL
Amstrad CPC
 
« Infernal Runner », « Le pacte »
1986 · CHIP
Amiga et Atari ST
 
« Jeanne d'Arc», « Voyage au centre de la Terre »
1989 · DELPHINE SOFTWARE
« Les voyageurs du temps »
 
Comme graphiste avec Paul Cuisset
1989 · DELPHINE SOFTWARE
Débute Another World
 
Qu'il développera pendant deux ans
Eric Chahi

CRÉATION DU JEU

LES OUTILS

LE MATÉRIEL

Le top de l'époque

Eric Chahi
Eric Chahi
UN AMIGA 500
Avec 1Mo RAM et un HDD de 20Mo
Amiga 500
UN GENLOCK
Avec un caméscope et un magnétoscope
Genlock
UN MAGNÉTOPHONE
pour enregistrer les bruitages
Recorder
Eric Chahi
Eric Chahi

LE LOGICIEL

Créé pour l'occasion

Tools

DE LA ROTOSCOPIE

Pour certaines animations

Rotoscopy

DES PEINTURES ET DESSINS

Pour inventer tout un monde

Drawings
Drawings

LE MOTEUR

ENTRONS DANS LE VIF DU SUJET

UNE ARCHITECTURE SIMPLE

Mais très efficace

Architecture
Architecture
Architecture
Architecture
Architecture
Architecture
Architecture
Architecture
Architecture
Architecture
Architecture

LES RESSOURCES

LA PIERRE ANGULAIRE

LES RESSOURCES

La pierre angulaire

Architecture

LES TYPES DE RESSOURCES

Sept types différents

 
  • Les sons
  • Les musiques
  • Les images
  • Les palettes
  • Les scripts (bytecode)
  • Les polygones des niveaux
  • Les polygones communs
 

ORGANISATION DES RESSOURCES

1 index, 13 banques, 146 ressources

Resources 1
 

ANATOMIE D'UNE RESSOURCE

Dans le fichier MEMLIST.BIN

Resources 2
Resources 3
Resources 4
Resources 5
Resources 6
Resources 7
LES DONNÉES SONT COMPRESSÉES
AVEC L'ALGORITHME BYTEKILLER

BYTEKILLER ?

OUVRONS UNE PARENTHÈSE

L'ALGORITHME BYTEKILLER

En bref ...

 
  • Assez répandu sur la scène Amiga
  • Relativement efficace
  • Économe en mémoire
  • Facile à implémenter
  • Codage entropique fixe et non adaptatif
  • Utilisation d'une fenêtre glissante
  • Fonctionne à rebours
 

L'ALGORITHME BYTEKILLER

Son fonctionnement

Bytekiller
Bytekiller
Bytekiller
Bytekiller
Bytekiller
Bytekiller
Bytekiller

L'ALGORITHME BYTEKILLER

Quelques détails techniques

Bytekiller
 

L'ALGORITHME BYTEKILLER

Quelques détails techniques

Bytekiller
 

FERMONS LA PARENTHÈSE

QUELQUES STATISTIQUES

Tout le monde aime les stats

Global statistics

LA MACHINE VIRTUELLE

LE COEUR DU RÉACTEUR

LA MACHINE VIRTUELLE

Le cœur du réacteur

Architecture

LA MACHINE VIRTUELLE

En bref

 

Architecture de type Harvard

Stockage des données en big-endian

64 threads, 256 registres, 1 pile

Multithreading coopératif

5 groupes d'instructions

29 instructions de base

219 opcodes

 

LA MACHINE VIRTUELLE

À la loupe

Virtual Machine
 

LES THREADS

Le cerveau de la VM

Threads
 

LES REGISTRES

La mémoire de travail

Registers
 

LE BYTECODE

En bref

 

Chaque instruction a un/plusieurs opcode(s)

Chaque opcode est codé sur un octet

Chaque instruction/opcode peut avoir des paramètres

Le jeu d'instruction n'est pas orthogonal

 

LE BYTECODE

Cinq groupes d'instructions

 
  • load and store
  • arithmetic and logic
  • jump and call
  • thread management
  • resource management
 

LE BYTECODE

Les vingt-neuf instructions

Instructions
 

LOAD AND STORE

Charger et stocker des valeurs

 
  • setr [dst],[src] ([dst] = [src])
  • seti [dst],{i16} ([dst] = {i16})
 

ARITHMETIC AND LOGIC

Calculer et manipuler les bits

 
  • addr [dst],[src] ([dst] += [src])
  • addi [dst],{i16} ([dst] += {i16})
  • subr [dst],[src] ([dst] -= [src])
  • andi [dst],{i16} ([dst] &= {i16})
  • iori [dst],{i16} ([dst] |= {i16})
  • lsli [dst],{i16} ([dst] <<= {i16})
  • lsri [dst],{i16} ([dst] >>= {i16})
 

JUMP AND CALL

Gérer les branchements de code

 
  • jump {address}
  • jump {condition},[rg1],[rg2],{address}
  • jump {condition},[reg],{i16},{address}
  • jump {condition},[reg],{i08},{address}
  • dbra [reg],{address}
  • call {address}
  • ret
 

CJMP INSTRUCTION

Les sauts conditionnels

CJMP instruction
 

THREAD MANAGEMENT

Gérer les fils d'exécution

 
  • start {thread},{address}
  • reset {from-thread},{to-thread},{state}
  • yield
  • halt
 

RESOURCE MANAGEMENT

Exploiter les resources

 
  • load {resource-id}
  • fade {palette-id}
  • page {page-id}
  • fill {page-id},{color}
  • copy {dst-page},{src-page}
  • show {page-id}
  • print {id},{x},{y},{col}
  • sound {id},{pitch},{volume},{channel}
  • music {id},{delay},{position}
  • poly1 {offset},{x},{y},{zoom}
  • poly2 {offset},{x},{y}
 

POLY1 INSTRUCTION

Dessiner des polygones avec contrôle

Poly1 instruction
 

POLY2 INSTRUCTION

Dessiner des polygones simplement

Poly2 instruction
 

SOUS-SYSTÈME VIDÉO

AFFICHER LE JEU

SOUS-SYSTÈME VIDÉO

Afficher le jeu

Architecture

LES FRAMEBUFFERS

Quatre pages et double buffering

Framebuffers 0
Framebuffers 1

LES OBJETS

Une hiérarchie de polygones

Polygons 0

LES POLYGONES

Dessiner les polygones

Polygons 1
Polygons 2
Polygons 3
Polygons 4
Polygons 5
Polygons 6
Polygons 7
Polygons 8
Polygons 9

LE RENDU

Pipeline de rendu

 

Les scènes sont rendues de l'arrière vers l'avant

Les scènes rendues sont mises en cache

Le cache est utilisé pour afficher les scènes

Les objets sont ensuite rendus

 

LE RENDU

L'algorithme du peintre

 

LE RENDU

Mise en cache et rendu global

 

LES PALETTES

Colorer le monde

 

Chaque niveau dispose d'un groupe de palettes

Chaque groupe contient deux sous-groupes de palettes

・・・

🢂 32 palettes de 16 couleurs
RGB444 (12 bits)

🢂 32 palettes de 16 couleurs
index + RGB444 (4 bits + 12 bits)

 

LES PALETTES

Colorer le monde

Palettes 0
Palettes 1

LES PALETTES

En images

Palette 0
Palette 1
Palette 2
Palette 3
Palette 4

LA TRANSPARENCE

Un trick simple et efficace

 

Si couleur(polygone) == 16

Alors couleur(pixel) = couleur(pixel) | 8

 

LA TRANSPARENCE

En images

Transparency 0
Transparency 1
Transparency 2
Transparency 3
Transparency 4

LE MASQUAGE

Un autre trick simple et efficace

 

Si couleur(polygone) > 16

Alors couleur(pixel) = couleur(pixel[page_source])

 

LE MASQUAGE

En images

Masking 0
Masking 1
Masking 2
Masking 3
Masking 4

SOUS-SYSTÈME AUDIO

AMBIANCER LE JEU

SOUS-SYSTÈME AUDIO

Ambiancer le jeu

Architecture

LE ROYAUME DES SAMPLES

Quatre canaux PCM 8-bits

Audio

LES SONS ET LES EFFETS

L'ambiance sonore

Sound 0
Sound 1
Sound 2
Sound 3
Sound 4
Sound 0

LA MUSIQUE

Les génériques

Tracker

LA MUSIQUE

Utilisation d'un tracker

 

SOUS-SYSTÈME D'ENTRÉES

PILOTER LE JEU

SOUS-SYSTÈME D'ENTRÉES

Piloter le jeu

Architecture

PILOTER LE JEU

Interagir avec la VM

Input 0
Input 1
Input 2

POUR CONCLURE

LA BIG PICTURE

UNE ARCHITECTURE ÉLÉGANTE

Et assez audacieuse pour l'époque !

Evil Kermit

APPRENDRE DU PASSÉ

Il y a beaucoup à découvrir

Van Damme

LE JEU

EN VRAI

JOUER DANS LE NAVIGATEUR

MON IMPLÉMENTATION C++, SDL ET WASM

Screenshot

QUELQUES RÉFÉRENCES

POUR ALLER PLUS LOIN

ÉRIC CHAHI

Another World

https://www.anotherworld.fr/another_world.htm

Éric Chahi

GREGORY MONTOIR

Rewrite Of Another World

https://github.com/cyxx/rawgl

Gregory Montoir

FABIEN SANGLARD

The Polygons Of Another World

https://fabiensanglard.net/another_world_polygons/index.html

Fabien Sanglard

FABIEN SANGLARD

Another World Bytecode Interpreter

https://github.com/fabiensanglard/Another-World-Bytecode-Interpreter

Fabien Sanglard

CÉSAR BOTANA

Another World Suite

https://github.com/malandrin/another-world-suite

César Botana

OLIVIER PONCET

Another World Interpreter

https://github.com/ponceto/another-world-interpreter

Olivier POoncet

OLIVIER PONCET

Another World In Your Browser

https://www.emaxilde.net/assets/games/another-world/another-world.html

Olivier POoncet

A PROPOS DE MOI

UN PEU DE PERSONAL BRANDING

OLIVIER PONCET

Retrouvez-moi sur les réseaux

Olivier Poncet
@ponceto91 emaxilde.net
@ponceto91 github.com/ponceto/
@ponceto91 gitlab.com/ponceto/
@ponceto91 bitbucket.org/ponceto/

EMAXILDE