/************************************************************************** * * Artifice v0.71 - 04/02/2004 * * Copyright (C) 2000-2004 François LEIBER * * Artifice is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * Artifice is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * *************************************************************************/ #define OPTIMIZE_ROM_CALLS #define NO_EXIT_SUPPORT #define NO_CALC_DETECT #define NO_AMS_CHECK #define _89 //remplacer par _92 pour avoir une version 92+ #ifdef _89 #define USE_TI89 #define _89_92(x, y) (x) #define HAUT 337 #define BAS 340 #define GAUCHE 338 #define DROITE 344 #else #define USE_TI92PLUS #define USE_V200 #define _89_92(x, y) (y) #define GAUCHE 337 #define DROITE 340 #define HAUT 338 #define BAS 344 #endif #define ENTER 13 #define ESC 264 #include /////////////////////////////////////////////////////////////////////////////////////// unsigned short randint(short n) { static unsigned short prec = 1 ; return ((47 + (prec *= 503))%n) ; } /////////////////////////////////////////////////////////////////////////////////////// void _main() { short i, n, intense, touche ; short nbre = 150, nbre_artis = 4 ; // 4 fusées de 150 particules par défaut short part[4][250][5] ; short etat[4] = {0, 0, 0, 0} ; LCD_BUFFER LCD_buff ; LCD_save(LCD_buff) ; OSSetSR(0x0700) ; SetCurClip(&(SCR_RECT){{0, 0, _89_92(159, 239), _89_92(99, 127)}}) ; while ((_rowread(_89_92(0xffbf,0xfeff))&_89_92(1,64)) == 0) { ClrScr() ; for (n = 0 ; n < nbre_artis ; n++) // Affiche les fusées qui sont en train de monter if (etat[n] == -1) DrawLine(part[n][0][0]/100, part[n][0][1]/100, part[n][0][0]/100, part[n][0][1]/100-2, 1) ; for (i = 1 ; i < nbre ; i++) { for (n = 0 ; n < nbre_artis ; n++) // Fait bouger chaque particule { part[n][i][0] += part[n][i][2] ; part[n][i][1] += part[n][i][3] ; part[n][i][2] *= 96 ; part[n][i][2] /= 100 ; part[n][i][3] += (part[n][i][3] > 0)?(1):(3)+part[n][i][4]/14 ; part[n][i][4]-- ; if (part[n][i][4] == 0 && etat[n] > 0) etat[n]-- ; else if (part[n][i][4] > 0 && etat[n] > 0) DrawClipPix(part[n][i][0]/100, part[n][i][1]/100) ; else DrawClipPix(part[0][0][0]/100, -1) ; // S'il ne doit pas affiche la particule, affiche quand même un } // point quelconque pour éviter les variations de vitesse } for (n = 0 ; n < nbre_artis ; n++) { if (etat[n] == 0) // Si la fusée est éteinte, la lancer { etat[n] = -1 ; part[n][0][0] = 400+randint(_89_92(15200, 23400)) ; part[n][0][1] = _89_92(9900, 12700) ; part[n][0][3] = -300-randint(_89_92(280, 350)) ; } else if (etat[n] == -1) // Si la fusée est en train d'être lancée { part[n][0][1] += part[n][0][3] ; part[n][0][3] += 20 ; if (part[n][0][3] > 0) // Si elle a atteint le sommet de sa trajectoire { etat[n] = nbre-1 ; intense = 85+randint(70) ; for (i = 1 ; i < nbre ; i++) // Donner une direction, une vitesse et une intensité aléatoire à chaque particule { part[n][i][0] = part[n][0][0] ; part[n][i][1] = part[n][0][1] ; do // Tire une vitesse au hasard jusqu'à ce que la vitesse soit dans un cercle { part[n][i][2] = 60-randint(120) ; part[n][i][3] = 60-randint(120) ; } while (((long)(part[n][i][2]*part[n][i][2])+(long)(part[n][i][3]*part[n][i][3]) > 3000)||((long)(part[n][i][2]*part[n][i][2])+(long)(part[n][i][3]*part[n][i][3]) < randint(2500)-1200)) ; part[n][i][2] *= 300 ; part[n][i][3] *= 240 ; part[n][i][2] += 1000-randint(2000) ; part[n][i][3] += 1000-randint(2000) ; part[n][i][2] /= intense ; part[n][i][3] /= intense ; part[n][i][4] = 1800+randint(2200)-200*n ; part[n][i][4] /= intense ; } } } } if ((_rowread(_89_92(0xffdf,0xffbf))&_89_92(128,16)) != 0) // Affiche un menu avec infos et réglages { ClrScr() ; FontSetSys(2) ; DrawStr(_89_92(21, 61), 10, "Feux d'artifice", 4) ; DrawLine(_89_92(20, 60), 25, _89_92(140, 180), 25, 4) ; FontSetSys(1) ; DrawStr(_89_92(23, 63), 35, "par Francois Leiber", 4) ; DrawStr(_89_92(17, 57), 50, "Défi de TI-FR - 05/00", 4) ; FontSetSys(0) ; DrawChar(_89_92(9, 49), 78, 19, 4) ; DrawChar(_89_92(15, 55), 78, 20, 4) ; DrawChar(_89_92(9, 49), 88, 17, 4) ; DrawChar(_89_92(15, 55), 88, 18, 4) ; do { printf_xy(_89_92(23, 63), 78, "Nombre de fusées : %d", nbre_artis) ; printf_xy(_89_92(23, 63), 88, "Nombre de particules par fusée : %d ", nbre) ; touche = ngetchx() ; nbre_artis = 1+(nbre_artis+(touche == HAUT)-(touche == BAS)+3)%4 ; nbre = 50+(nbre+50*(touche == DROITE)-50*(touche == GAUCHE)+200)%250 ; } while (touche != ENTER && touche != ESC) ; OSSetSR(0x0700) ; for (i = 0 ; i < 4 ; i++) etat[i] = 0 ; } } GKeyFlush() ; OSTimerRestart(2) ; LCD_restore(LCD_buff) ; ST_showHelp("Feux d'artifice v0.71 par Francois Leiber") ; return ; }