1

// C Source File
// Created 29/09/2003; 19:17:15

#define USE_TI89 // Compile for TI-89
#define USE_TI92PLUS // Compile for TI-92 Plus
#define USE_V200 // Compile for V200

#define OPTIMIZE_ROM_CALLS // Use ROM Call Optimization

#define MIN_AMS 100 // Compile for AMS 1.00 or higher

#define SAVE_SCREEN // Save/Restore LCD Contents

#include <tigcclib.h> // Include All Header Files
#define round(x) ({typeof(x) __x = (x); typeof(x) __ux = (typeof(x))trunc(x); __ux<=__x+0.5 ? (long)__ux : (long)__ux+1; })
enum Attrib {CT_NONE = 0, CT_UNDL = 1, CT_FRAME = 2, CT_CROSS = 4, CT_WWRAP = 8};
void CenterStrX(short y, const char *str, short Attr, int underline);
void Center3DStrX(short y, const char * str, short Attr, int underline);
// Main Function

void _main(void)
{
short x, att;
float a, l;
char round[20];
static unsigned short holly_bomb[] = { 0x23, 0x77, 0x3E, 0x1C, 0xF3E, 0x30F7, 0x70E2, 0x51E0, 0x9B90, 0x8F10, 0x8E10, 0x9F70, 0x79E0, 0x7020, 0x30C0, 0xF00};
static unsigned long ver_debut[] = { 0x1F0, 0x208, 0x404, 0x802, 0x802, 0x806, 0x809, 0x8C9, 0x92B, 0x92B, 0x969, 0x966, 0x922, 0x8C2, 0x802, 0x802, 0x804, 0x7C838, 0x82804, 0x101804, 0x200804, 0x200804, 0x400804, 0x400404, 0x810404, 0x810204, 0x1010004, 0x2028004, 0x4028008, 0x2044008, 0x1083010, 0xF00FE0};
static unsigned long ver_debut2[] = { 0x1F0, 0x208, 0x404, 0x802, 0x802, 0x806, 0x809, 0x8C9, 0x92B, 0x92B, 0x969, 0x966, 0x922, 0x8C2, 0x802, 0x802, 0x804, 0x838, 0x804, 0x804, 0x804, 0x804, 0x3F0804, 0xC0E804, 0x1001C04, 0x6000204, 0x8000004, 0x10000004, 0x20080008, 0x40140008, 0x30630010, 0xF80FFE0};
clrscr();
a=0;
FontSetSys(F_8x10);
CenterStrX(35, "F5 to skip intro", A_NORMAL, CT_UNDL);
FontSetSys(F_6x8);
OSFreeTimer(USER_TIMER);
OSRegisterTimer(USER_TIMER, 20);
for(x=3 ; x!=0 ; x--)
{
sprintf(round, "%i", x);
CenterStrX(52, round, A_REPLACE, CT_NONE);
while(!OSTimerExpired(USER_TIMER));
OSTimerRestart(USER_TIMER);
if(kbhit()==272)
{
a=32;
break;
}
}
GKeyFlush();
INT_HANDLER save_int_1; save_int_1 = GetIntVec(AUTO_INT_1); SetIntVec(AUTO_INT_1, DUMMY_HANDLER);
if(a!=32)
{
OSFreeTimer(USER_TIMER);
OSRegisterTimer(USER_TIMER, 5);
for(x=0 ; x!=50 ; x+=5)
{
clrscr();
Sprite32(x, 65, 32, ver_debut, LCD_MEM, SPRT_OR);
while(!OSTimerExpired(USER_TIMER));
OSTimerRestart(USER_TIMER);
clrscr();
Sprite32(x+5, 65, 32, ver_debut2, LCD_MEM, SPRT_OR);
while(!OSTimerExpired(USER_TIMER));
OSTimerRestart(USER_TIMER);
}
clrscr();
Sprite32(50, 65, 32, ver_debut, LCD_MEM, SPRT_OR);
FontSetSys(F_8x10);
DrawStrXY(82, 60, "?", A_NORMAL);
FontSetSys(F_4x6);
OSFreeTimer(USER_TIMER);
OSRegisterTimer(USER_TIMER, 1);
for(x=0 ; x!=-40 ; x--)
{
for(att=0 ; att!=100 ; att++)
{
DrawLine(90, att, 160, att, A_REVERSE);
}
att=83-sqrt(1600-(x*x));
Sprite16(145+x, att, 16, holly_bomb, LCD_MEM, SPRT_OR);
for(l=0; l>6; l++); //ralentir
//while(!OSTimerExpired(USER_TIMER));
//OSTimerRestart(USER_TIMER);
}
for(x=10 ; x!=-15 ; x--)
{
for(att=0 ; att!=100 ; att++)
{
DrawLine(82, att, 121, att, A_REVERSE);
}
att=83-sqrt(100-(x*x));
Sprite16(95+x, att, 16, holly_bomb, LCD_MEM, SPRT_OR);
for(l=0; l>6; l++); //ralentir
//while(!OSTimerExpired(USER_TIMER));
//OSTimerRestart(USER_TIMER);
}
OSFreeTimer(USER_TIMER);
OSRegisterTimer(USER_TIMER, 20);
for(x=3 ; x!=0 ; x--)
{
sprintf(round, "%i", x);
DrawStrXY(100, 75, round, A_REPLACE);
FontSetSys(F_8x10);
DrawStrXY(52+10*x, 50+10*abs(x-2), "!", A_NORMAL);
FontSetSys(F_4x6);
while(!OSTimerExpired(USER_TIMER));
OSTimerRestart(USER_TIMER);
}
DrawStrXY(100, 75, " ", A_REPLACE);
att=0;
for(x=2 ; x!=35 ; x++)
{
DrawClipEllipse(80, 99, x, x, &(SCR_RECT){{0, 0, 160, 100}}, A_NORMAL);
DrawClipEllipse(80, 99, x-1, x-1, &(SCR_RECT){{0, 0, 160, 100}}, A_REVERSE);
}
FontSetSys(F_4x6);
CenterStrX(89, "Worms", A_NORMAL, 0);
FontSetSys(F_6x8);
for(x=35 ; x!=60 ; x++)
{
att+=1;
DrawClipEllipse(80, 99, x+att, x, &(SCR_RECT){{0, 0, 160, 100}}, A_NORMAL);
DrawClipEllipse(80, 99, x+att-2, x-1, &(SCR_RECT){{0, 0, 160, 100}}, A_REVERSE);
if(x==48)
CenterStrX(88, "Worms", A_REPLACE, 0);
if(x==58)
{
FontSetSys(F_8x10);
CenterStrX(87, "Worms", A_REPLACE, 0);
FontSetSys(F_6x8);
}
}
}
SetIntVec(AUTO_INT_1, save_int_1);
ngetchx();
}
void CenterStrX(short y, const char *str, short Attr, int underline)
{
if((underline & CT_UNDL) == CT_UNDL)
{
DrawLine((160-DrawStrWidth(str, FontGetSys()))/2, FontGetSys()*2+6+y, (160-DrawStrWidth(str, FontGetSys()))/2+DrawStrWidth(str, FontGetSys()), FontGetSys()*2+6+y, A_NORMAL);
}
else if((underline & CT_FRAME) == CT_FRAME)
{
DrawLine((160-DrawStrWidth(str, FontGetSys()))/2-1, FontGetSys()*2+6+y, (160-DrawStrWidth(str, FontGetSys()))/2+DrawStrWidth(str, FontGetSys())+1, FontGetSys()*2+6+y, A_NORMAL);
DrawLine((160-DrawStrWidth(str, FontGetSys()))/2, FontGetSys()*2+6+y-1, (160-DrawStrWidth(str, FontGetSys()))/2+DrawStrWidth(str, FontGetSys()), FontGetSys()*2+6+y-1, A_REVERSE);
DrawLine((160-DrawStrWidth(str, FontGetSys()))/2, y-1, (160-DrawStrWidth(str, FontGetSys()))/2+DrawStrWidth(str, FontGetSys()), y-1, A_REVERSE);
DrawLine((160-DrawStrWidth(str, FontGetSys()))/2-1, y-2, (160-DrawStrWidth(str, FontGetSys()))/2+DrawStrWidth(str, FontGetSys())+1, y-2, A_NORMAL);
DrawLine((160-DrawStrWidth(str, FontGetSys()))/2-1, y-2, (160-DrawStrWidth(str, FontGetSys()))/2-1, FontGetSys()*2+6+y, A_NORMAL);
DrawLine((160-DrawStrWidth(str, FontGetSys()))/2+DrawStrWidth(str, FontGetSys())+1, y-2, (160-DrawStrWidth(str, FontGetSys()))/2+DrawStrWidth(str, FontGetSys())+1, FontGetSys()*2+6+y, A_NORMAL);
DrawLine((160-DrawStrWidth(str, FontGetSys()))/2-1, FontGetSys()*2+6+y+1, (160-DrawStrWidth(str, FontGetSys()))/2+DrawStrWidth(str, FontGetSys())+1, FontGetSys()*2+6+y+1, A_REVERSE);
}
if((underline & CT_CROSS) == CT_CROSS)
{
DrawLine((160-DrawStrWidth(str, FontGetSys()))/2, FontGetSys()*2+y, (160-DrawStrWidth(str, FontGetSys()))/2+DrawStrWidth(str, FontGetSys()), FontGetSys()*2+y, A_NORMAL);
}
if((underline & CT_WWRAP) == CT_WWRAP)
{
//TODO
}
DrawStrXY((160-DrawStrWidth(str, FontGetSys()))/2, y, str, Attr);
}
void Center3DStrX(short y, const char * str, short Attr, int underline)
{
if(GrayCheckRunning())
{
SetPlane(LIGHT_PLANE);
DrawStrXY((LCD_WIDTH-DrawStrWidth(str, FontGetSys()))/2, y, str, Attr);
DrawStrXY((LCD_WIDTH-DrawStrWidth(str, FontGetSys()))/2-1, y-1, str, Attr);
SetPlane(DARK_PLANE);
DrawStrXY((LCD_WIDTH-DrawStrWidth(str, FontGetSys()))/2-1, y-1, str, Attr);
underline = 0;
}
}

voici le code complet d'une intro de jeu ...
mais au lieu de laisser un laps de temps pour eviter l'intro, j'aimerai qu'on puisse la quitter n'importe quand. Ya pas une solution avec l'interrupt handler ?? j'avoue que G pas bien compris le tutos en anglais de Tict
@+

2

-

3

Mets ton code entre balises pre, stp, il sera plus digeste smile
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

4

Ça me fait penser au traditionnel "voilà mon code [source de 500 lignes] y'a un bug vous pouvez m'aider ?" bang
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

5

c clair que les tutos tict sont pas trop une reference pour les debutants ds un langage
avatar
納 豆パワー!
I becamed a natto!!!1!one!

6

Bon, pour répondre à sa question, j'avoue que je ne vois pas de méthode qui ne soit pas trop moche sad
Il peut par exemple tester l'appui sur ESC dans chaque boucle, mais c'est un peu lourd.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

7

Ou tout silplement créer une faible interruption et vérifier la touche ESC, et dans ce cas sauter son intro, grâce à une varaible de type boolean ou saut de fonction...
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

8

Comment tu sautes la fonction, je ne comprends pas confus
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

9

Tu as ton intro qui commence à la fonction IntroPlay par exemple et après tu à ton jeu qui débute avec la fonction PlayGame ou un truc de ce genre, mon idée consiste à intercepter dans une interruption la touche ESC? si c'est le cas on efface ette interruption et on saute à la fonction PlayGame avec setjmp ou d'autres méthode...
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

10

Super simple à faire avec les timers de GraphX ! Que du pur bonheur smile
Mais le plus simple est d'insérer un test de la touche [ESC] dans la boucle de tempo.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

11

Il faut choisir entre simple et efficace. smile
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

12

Tu as vu son code et les fonctions qu'il utilise ? visiblement son intro n'a pas besoin d'être rapide smile
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

13

Oué, ça ressemble beaucoup à du code (c) moi... et c'est pas vraiment un compliment tongue
avatar

14

J'avais pensé en effet a une test sur chaque boucle mais je pensais qu'on pouvais faire mieux...
Geogeo, tu pourrais préciser ton idée ?
Sinon, si il y a des temporisateurs, ou des ralentisseurs, c'est parce que l'écran n'est pas assez rapidement rafraichi et le sprite Holly Bomb est pas vraiment visible lors de la première parabole ...
Euh... sinon, merci d'avoir pris le temps de lire ce code, la prochaine fois c'est promis je le met entre les balises.
Et puis arretez de charrier, on débute comme on peut...

15

Et puis arretez de charrier, on débute comme on peut...


Tout à fait d'accord... sauf que moi, ça fait 3 ans que je débute en C sur TI (tout ça parce qu'à l'IUT ils nous faisaient pas faire du C mais du Java et que j'y arrive toujours pas avec les pointeurs en C).
avatar

16

Mais pourtant, tes pointeurs, tu les as utilisés sans arrêt en Java sans le savoir... J'explique: dans un langage qui passe les objets par référence (Java, VB, ...; d'ailleurs, en VB, c'est encore plus compliqué: des objets passés "par valeur" sont passés par référence, des objets passés "par référence" (option par défaut) même par référence à une référence!), quand tu penses avoir une fonction (ou une méthode statique) comme celle-ci (notation Java):
public static ObjectClass1 f(ObjectClass2 a, ObjectClass3 b, int c);
en réalité, tu as une fonction comme celle-ci (notation C++):
ObjectClass1 &f(ObjectClass2 &a, ObjectClass3 &b, int c);
ce qui en pratique (encore un niveau plus bas) te donnera une fonction comme celle-ci (notation C):
ObjectClass1 *f(ObjectClass2 *a, ObjectClass3 *b, int c);
Le compilateur Java s'occupe des déréférencements de pointeurs pour toi (il n'y a pas de prises d'adresse parce que tout objet est alloué dynamiquement, donc on a naturellement des pointeurs), mais c'est ce qui se passe. Si tu appelles:
ObjectClass2 a=...; ObjectClass3 b=...;
ObjectClass1 x = ObjectClass0.f(a, b, 0);

en Java, cela correspond en réalité à:
ObjectClass2 *a=...; ObjectClass3 *b=...;
ObjectClass1 *x = ObjectClass0__f(a, b, 0);

Et si dans ta fonction Java, tu utilises a.toto, en réalité, ce que tu utilises est (*a).toto, ou encore a->toto.
Bref, il y a des tonnes de pointeurs en Java, le compilateur essaye juste de te les cacher.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

17

De toute façon, le java... oh et puis non, je ne vais pas troller.
avatar
« Le bonheur, c'est une carte de bibliothèque ! » — The gostak distims the doshes.
Membrane fondatrice de la confrérie des artistes flous.
L'univers est-il un dodécaèdre de Poincaré ?
(``·\ powaaaaaaaaa ! #love#

18

[mode troll=on]Ben oué, ça pue, c'est encore plus lourd que le C++, ça se voulait universel et c'est pire que tout, personne l'utilise, c'est presque jamais utilisable sur de l'embarqué, c'est lent...[mode troll=off]

Mais le gros problème que j'ai, en fait, c'est la notation avec l'étoile en C. Parce que les pointeurs, j'ai aucun problèmes avec eux en Pascal. Mais j'ai comme l'impression que la notation * sert à beaucoup de choses confus...
avatar

19

C pas très compliqué si tu fais l'effort de t'y mettre un peu, tu sais... Moi aussi, au début, je pensais que je n'arriverai jamais à m'en servir et puis c'est venu tout seul et après je me suis demandé comment j'avais vécu sans tongue
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

20

J'avais pensé en effet a une test sur chaque boucle mais je pensais qu'on pouvais faire mieux...
Geogeo, tu pourrais préciser ton idée ?
Sinon, si il y a des temporisateurs, ou des ralentisseurs, c'est parce que l'écran n'est pas assez rapidement rafraichi et le sprite Holly Bomb est pas vraiment visible lors de la première parabole ...
Euh... sinon, merci d'avoir pris le temps de lire ce code, la prochaine fois c'est promis je le met entre les balises. Et puis arretez de charrier, on débute comme on peut...


Si tu as une partie de code ou tu ne peux pas vraiment tester une touche de façon optimale...
Le but et de réaliser une interruption qui ce déclenche à une fréquence (pas trop élevé c'est inutile car ça ralentie le programme pour rien), et dans celle-ci de tester la touche voulu, une fois la vérification de touche effectué et correcte tu peux aller à une fonction qui s'occupe de lancer le jeu...

Par exemple tu as ton intro:
void Intro (void)...

Le jeu:
void PlayGame (void)...

Dans ton interruption tu va à PlayGame.

Essaye de voir comemnt fonctionne les interruptions (SetIntVec et GetIntVec....).

avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

21

Et tu fais comment en C pour "aller" à la fonction PlayGame ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

22

geogeo> tu veux exécuter le jeu dans l'interruption? C'est vraiment pas une bonne idée grin
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

23

Un simple appel ne suffit pas. PlayGame()?
Dans ce cas il n'ai pas possible de mettre l'adresse de cette fonction dans le PC à la fin de rte?
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

24

Oui, il suffit d'empiler correctement l'adresse de la fonction, enfin c'est un peu caca tout ça...
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

25

Si tu as une méthode ça m'interesserais car je plenche sur ça dans certains de mes programmes. sad
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

26

Je ne vois pas vraiment de solution propre...
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

27

Et l'implantation de mon idée ne peut que ce faire en ASM Inline?
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

28

c'est une très mauvaise idée de traffiquer la pile en asm inline
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.

29

Bah si c'est bien codé et 'propre' y a pas de problèmes.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

30

Et si le compilo se sert de la pile juste après tu fais comment ?
avatar
Que cache le pays des Dieux ? - Forum Ghibli - Forum Littéraire

La fin d'un monde souillé est venue. L'oiseau blanc plane dans le ciel annonçant le début d'une longue ère de purification. Détachons-nous à jamais de notre vie dans ce monde de souffrance. Ô toi l'oiseau blanc, l'être vêtu de bleu, guide nous vers ce monde de pureté. - Sutra originel dork.