//BLOBBY VOLLEY - TI68k C Source File //adaptation du jeu PC pour calculatrices TI92+(HW1/HW2) //seul le nom a été repris et tous les graphismes et les sources sont de la j2t //sous license GNU GPL - voir license.txt (see license.txt for more details about copyright) //vous pouvez reprendre tout ou partie de ce code pour le modifier et/ou l'intégrer a vos programmes //copyleft (C) la janjan2team(j2t) - [http://www.j2t.fr.st/] //programmé par janjan2/ben [janjan2@laposte.net] sous TIGCC [http://tigcc.ticalc.org] //VERSION BETA n°2 - 9 janvier 2002 //VERSION 92plus UNIQUEMENT!!!!!!!! #define USE_TI89 // Produce .89z File #define USE_TI92PLUS // Produce .9xz File short _ti89,_ti92plus; #define OPTIMIZE_ROM_CALLS // Use ROM Call Optimization #define SAVE_SCREEN // Save/Restore LCD Contents #include // Include All Header Files (tigclib) #include "rowkeys.h" // librairie de lecture du clavier en bas niveau de la j2t #include "sprites.h" // sprites: fond, perso, balle #include "about.h" // texte d'aide #define MAX_VY 12 #define START_Y 97 #define SIGNE(a) (a>0?1:0) //VARIABLES GLOBALES //joueur typedef struct player{ short x,y,vy,vx,minx,maxx,perspr,tc,win,cx,cy; }PLAYER; PLAYER one,two; //balle short bx,by,bvx,bvy,bcx,bcy; //ecran virtuel char *virt_0; char *virt_1; //sprites joueur short sprdec[4]={0,90,180,90}; //ROUTINE DE SPRITE COPIEE SUR EXTGRAPH :: http://tict.ticalc.org/ (C) la ti chess team //cette fct sera remplacée dans une prochaine version //!!!!!!!!ATTENTION, LA LICENSE NE S'APPLIQUE PAS A CETTE FONCTION!!!!!!!! void sprite(short x,short y,short h,unsigned char* sprite,unsigned char* mask,short bytewidth,void* dest) { register unsigned char* addr = ((unsigned char*)dest)+((y<<5)-(y<<1)+(x>>3)); register unsigned short shift1 = x & 7; register unsigned short shift2; register unsigned short lineoffset = 30-bytewidth; register short loop; register unsigned char startmask; register unsigned char endmask; if (shift1) { shift2 = 8 - shift1; startmask = 0xff << shift2; endmask = 0xff >> shift1; for (;h;h--,addr+=lineoffset) { *addr &= ((*mask) >> shift1) | startmask; *addr++ |= *sprite >> shift1; for (loop=1;loop> shift1); *addr |= ((*sprite++) << shift2); *addr++ |= (*sprite >> shift1); } *addr &= ((*mask++) << shift2) | endmask; *addr |= (*sprite++ << shift2); } } else { for (;h;h--,addr+=lineoffset) { for (loop=0;loop=x0&&checkx<=x1&&checky>=y0&&checky<=y1)return 1;else return 0;} //ROUTINE DE SCROLL void about(char **text,int lines) { int i=0,j,tempo,y=8; //affiche la barre de titre dans les 2 plans memset(GetPlane(0),0,3840); memcpy(GetPlane(0),fond_0,210); memset(GetPlane(1),0,3840); memcpy(GetPlane(1),fond_0,210); //trace le cadre PortSet(GetPlane(0),239,127); DrawPix(2,7,A_NORMAL); DrawPix(237,7,A_NORMAL); DrawLine(1,7,1,127,A_NORMAL); DrawLine(238,7,238,127,A_NORMAL); DrawLine(2,127,237,127,A_NORMAL); PortSet(GetPlane(1),239,127); DrawPix(2,7,A_NORMAL); DrawPix(237,7,A_NORMAL); DrawLine(1,7,1,127,A_NORMAL); DrawLine(238,7,238,127,A_NORMAL); DrawLine(2,127,237,127,A_NORMAL); memset(virt_1,0,3840); PortSet(virt_1,239,127); FontSetSys(F_6x8); //boucle de scrolling while(!_92P_KEY_ENTER) { //les lignes commençant par un '#' sont en 8x10, les autres en 6x8 if((*text[i])=='#'){FontSetSys(F_8x10);DrawStr(120-((strlen(text[i])*8-1)/2),115,text[i]+1,A_NORMAL);y=10;} else{FontSetSys(F_6x8);DrawStr(120-((strlen(text[i])*6)/2),115,text[i],A_NORMAL);y=8;} for(j=0;jtwo.win)bx=55; if(one.win==two.win){bx=(random(2)?55:175);} by=50;bvx=0;bvy=0; //affichage du fond memcpy(GetPlane(1),fond_1,3840); memcpy(GetPlane(0),fond_0,3840); //BOUCLE DE JEU while(!_92P_KEY_ESC) { //INITIALISATION //effaçage de l'ecran memcpy(virt_0,fond_0,3840); memcpy(virt_1,fond_1,3840); //PARAMETRES JOUEURS //PREMIER JOUEUR //lecture des touches one.vx=0; if(_92P_KEY_ALPHAX&&(!one.vy))one.vy=MAX_VY; if(_92P_KEY_DIAMOND&&one.x>one.minx){one.x-=4;one.vx=-2;if(one.y==START_Y&&one.perspr==0)one.perspr=3;} if(_92P_KEY_STO&&one.x=2)one.vy--; if(one.vy==1)one.vy=-1; if(one.vy<=-1)one.vy--; if(one.vy==-MAX_VY)one.vy=0; one.y-=one.vy; if(one.perspr)one.perspr--; //affichage du joueur sprite(one.x,one.y,30,perso_0+sprdec[one.perspr],perso_0+270+sprdec[one.perspr],3,virt_0); sprite(one.x,one.y,30,perso_1+sprdec[one.perspr],perso_1+270+sprdec[one.perspr],3,virt_1); //SECOND JOUEUR //lecture des touches two.vx=0; if(_92P_KEY_PAD2&&(!two.vy))two.vy=MAX_VY; if(_92P_KEY_PAD0&&two.x>two.minx){two.x-=4;two.vx=-2;if(two.y==START_Y&&two.perspr==0)two.perspr=3;} if(_92P_KEY_NEGAT&&two.x=2)two.vy--; if(two.vy==1)two.vy=-1; if(two.vy<=-1)two.vy--; if(two.vy==-MAX_VY)two.vy=0; two.y-=two.vy; if(two.perspr)two.perspr--; //affichage du joueur sprite(two.x,two.y,30,perso_0+sprdec[two.perspr],perso_0+270+sprdec[two.perspr],3,virt_0); sprite(two.x,two.y,30,perso_1+sprdec[two.perspr],perso_1+270+sprdec[two.perspr],3,virt_1); //PARAMETRES BALLE //poids if(!tour)bvy-=2; //rebonds par rapport au sol if(by>=111&&bvy<0){if(bvy>=4)bvy=-(bvy>>1);else{by=112;bvy=0;}sol=1;} //rebonds par rapport aux murs if(bx<=0||bx>=224){bvy>>=1;bvx=-bvx;} if((bx+16)<117&&(bx+16+bvx)>117&&by>45)bvx=-bvx; if(bx>122&&(bx+bvx)<122&&by>45)bvx=-bvx; //suppression des touches de balle if((bx+16)<117&&(bx+16+bvx)>117&&by<45){one.tc=0;two.tc=0;} if(bx>122&&(bx+bvx)<122&&by<45){one.tc=0;two.tc=0;} //rebonds par rapport aux joueurs //essai sans hotspots multiples bcx=bx+8;bcy=by+8; one.cx=one.x+12;two.cx=two.x+12; one.cy=one.y+15;two.cy=two.y+15; if(hotspot(one.x-14,one.x+22,one.y-14,one.y+28,bx,by)&&(!sol)) { angle=(int)abs(((float)(((float)one.cx-(float)bcx)/sqrt(((float)one.cx-(float)bcx)*((float)one.cx-(float)bcx)+((float)one.cy-(float)bcy)*((float)one.cy-(float)bcy)))*5)); pvtab=vtab; if(one.cx>bcx)pvtab+=20; if(one.cy>bcy)pvtab+=10; bvx=pvtab[(angle<<1)]; bvy=pvtab[(angle<<1)+1]; engage=1; //touche de balle one.tc++; //correction des vitesses if(SIGNE(bvx)&&(bvx<=one.vx))bvx=one.vx+1; if(!SIGNE(bvx)&&(bvx>=one.vx))bvx=one.vx-1; if(SIGNE(bvy)&&(bvy<=one.vy))bvy=one.vy+3; if(!SIGNE(bvy)&&(bvy>=one.vy))bvy=one.vy-3; } if(hotspot(two.x-14,two.x+22,two.y-14,two.y+28,bx,by)&&(!sol)) { angle=(int)abs(((float)(((float)two.cx-(float)bcx)/sqrt(((float)two.cx-(float)bcx)*((float)two.cx-(float)bcx)+((float)two.cy-(float)bcy)*((float)two.cy-(float)bcy)))*5)); pvtab=vtab; if(two.cx>bcx)pvtab+=20; if(two.cy>bcy)pvtab+=10; //modification des vitesses bvx=pvtab[(angle<<1)]; bvy=pvtab[(angle<<1)+1]; engage=1; //touche de balle two.tc++; //correction des vitesses if(SIGNE(bvx)&&(bvx<=two.vx))bvx=two.vx+2; if(!SIGNE(bvx)&&(bvx>=two.vx))bvx=two.vx-2; if(SIGNE(bvy)&&(bvy<=two.vy))bvy=two.vy+2; if(!SIGNE(bvy)&&(bvy>=two.vy))bvy=two.vy-2; } //application des vitesses if(engage) { by-=bvy; bx+=bvx; } //affichage de la balle if(by>=0&&by<=112&&bx>=0&&bx<=224) { sprite(bx,by,16,balle_0+(bal<<5),balle_0+256,2,virt_0); sprite(bx,by,16,balle_1+(bal<<5),balle_1+256,2,virt_1); //numero de sprite if(SIGNE(bvx))bal--;else bal++; if(bal==8)bal=0; if(bal==-1)bal=7; } //PARAMETRES JEU //lecture des touches if(_92P_KEY_ADD){WAITKEYUP(_92P_KEY_ADD);OSContrastUp();} if(_92P_KEY_SUB){WAITKEYUP(_92P_KEY_SUB);OSContrastDn();} if(_92P_KEY_F1)about(about_text,67); //affichage du score FontSetSys(F_4x6); PortSet(virt_1,239,1275); sprintf(buffer,"%d",one.win); DrawStr(70,1,buffer,A_XOR); sprintf(buffer,"%d",two.win); DrawStr(165,1,buffer,A_XOR); PortRestore(); //affichage memcpy(GetPlane(0),virt_0,3840); memcpy(GetPlane(1),virt_1,3840); //delai for(i=0;i<20000;i++){i--;i++;} //incrementation du tour tour++; if(tour)tour=0; //partie perdue/gagnée if(by==112&&bx>=119){one.win++;goto newgame;} if(by==112&&bx<=119){two.win++;goto newgame;} if(one.tc==3){two.win++;goto newgame;} if(two.tc==3){one.win++;goto newgame;} //jeu perdu/gagné if(two.win==15||one.win==15)break; }//FIN DE BOUCLE JEU //FIN DU JEU //affichage du score sprite(97,23,45,score_1,score_m,6,GetPlane(1)); sprite(97,23,45,score_0,score_m,6,GetPlane(0)); FontSetSys(F_8x10); PortSet(GetPlane(1),239,127); sprintf(buffer,"%d",one.win); DrawStr(102,37,buffer,A_REPLACE); sprintf(buffer,"%d",two.win); DrawStr(125,37,buffer,A_REPLACE); PortSet(LCD_MEM,239,127); WAITKEYPRESSED(_92P_KEY_ENTER); //suppression des niveaux de gris GrayOff(); //restauration des interruptions SetIntVec(AUTO_INT_5, save_int_5); SetIntVec(AUTO_INT_1, save_int_1); SetIntVec(AUTO_INT_6,autoint_bkp); //liberation de la memoire free(virt_0); free(virt_1); } //PLUS DE CODE EN DESSOUS DE CETTE LIGNE /*****HISTORIQUE DES VERSIONS***** -[beta n°2]- -meilleure maniabilité -meilleure gestion des collisions (completement refait) -refonte des graphismes -balle qui tourne et gelatine qui se déforme -mise en forme propre du code pour distribution :-p -[beta n°1]- -premiere beta publique -mauvaise maniabilité ****EOF****/