/*************************************************************************** * Paranoid --- The newest game from 7087 * * Feel free to copy the source code * ***************************************************************************/ #include #include #include #include #include #include /************************************************************************** * Feststehende Daten,die sich nicht mehr veraendern (Sprites...) * **************************************************************************/ /* ColorTable fuer die Steine */ long sc1[]={ 0l,27l,19l,19l,20l,19l,19l,30l,23l}; long sc2[]={ 0l,23l,17l,27l,21l,30l,31l,26l,28l}; long sc3[]={ 0l,28l,18l,23l,29l,26l,16l,24l,28l}; UWORD platte1_img [] = { 0x0000,0x0000,0x3fff,0x3000,0x6000,0x7fff,0x8000,0xffff,0x9fff,0xf000, 0xffff,0xf000,0x7fff,0x7000,0x3fff,0x3000,0x0000,0x0000 }; UWORD platte2_img [] = { 0x0000,0x0000,0xfffc,0x000c,0x0006,0xfffe,0x0001,0xffff,0xfff9,0x000f, 0xffff,0x000f,0xfffe,0x000e,0xfffc,0x000c,0x0000,0x0000 }; UWORD ball_img [] = { 0x0000,0x0000, 0x7000,0x1000, 0x7800,0xb800, 0x7800,0x9000, 0x3800,0xc000, 0x1000,0x6000, 0x0000,0x0000 }; UWORD mouse_pointer [] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; UWORD sound2[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }; struct SimpleSprite platte1_spr= { platte1_img,7l }; struct SimpleSprite platte2_spr= { platte2_img,7l }; struct SimpleSprite ball_spr= { ball_img,5l }; /************************************************************************** * einige Variablen fuer Spiel + System * **************************************************************************/ short platte1_nr,platte2_nr,ball_nr,GetSprite(); long spr_offset,horpos,verpos,mousemove; char oldmouse; float ballwinkel,speed,rad(),sin(),cos(),ran(); float sinwert,coswert; long ballx,bally,newx,newy; long xcheck,ycheck; UBYTE oldscore[5]; UBYTE newscore[5]; short stage,lives,stone,score; long stonecount; struct Level { short p_num; UBYTE stones [320]; }; struct Level level; struct HighScore { short punkte; char name[30]; }; struct HighScore highscore[10]; /************************************************************************** * Variablen fuer das System * **************************************************************************/ struct Screen *scr,*MasterScreen(); struct ViewPort *vp; struct RastPort *rp; struct BitMap *bm; long bm5base; struct FileHeader *fh,*Open(); struct ColorMap *GetColorMap(),*cmap; UBYTE *button=(UBYTE *) 0xbfe001; UBYTE *key=(UBYTE *) 0xbfec01; struct Window *win,*MasterWindow(); struct IntuitionBase *IntuitionBase; long AllocMem(),soundbuffer,s1,s2; short soundflag=0; UWORD pattern[1024]; struct BitMap hitmap; UBYTE hitbit[1280]; long hitnr=0l,hitdel=0l; short hitflag=0; /************************************************************************** * Vorspann und HauptMenu * **************************************************************************/ main() { openstuff(); Disable(); GetData(); InitBitMap (&hitmap,5l,16l,16l); if (!(s1=AllocMem(68000l,MEMF_CHIP|MEMF_PUBLIC))) { printf ("No Memory for sounds\n"); CloseMaster(scr,win); } if (!(fh=Open ("Paranoid:music/synt.snd",1004l))) { printf ("Sounddata not found\n"); CloseMaster(scr,win); } Read (fh,s1,66802l); Close (fh); if (!(s2=AllocMem(68000l,MEMF_CHIP|MEMF_PUBLIC))) { printf ("No Memory for sounds\n"); CloseMaster(scr,win); } if (!(fh=Open ("Paranoid:music/loopsynt.snd",1004l))) { printf ("loopsynt not found\n"); CloseMaster(scr,win); } Read (fh,s2,67325l); Close (fh); GetPicture ("Paranoid:gfx/titlescreen.dat",320l,200l,5l); PlaySound (s1,66802l,358,3,64l+(64l<<8l)); Delay (50l); PlaySound (s2,67325l,358,3,64l+(64l<<8l)); Delay (300l); FreeMem (s1,68000l); Enable(); while (*button&(UBYTE)64); /* Solange,bis Button unten*/ while (TRUE) { GetPicture("Paranoid:gfx/mscreen.dat",320l,178l,4l); if (s2) { FreeMem (s2,68000l); s2=0l; silence(15); } while (TRUE) { while (!(*button&(UBYTE)64)); /* Solange,bis Button oben */ while (*button&(UBYTE)64); /* Solange,bis Button unten */ if (CheckRange (51,64,60,73)) { playit(); break; } if (CheckRange (51,94,60,103)) { editor(); break; } if (CheckRange (51,130,60,139)) { GetPicture ("Paranoid:gfx/highscreen.dat",320l,256l,2l); PrintHighScore(); while (!(*button&(UBYTE)64)); while (*button&(UBYTE)64); /* Solange,bis Button unten */ while (!(*button&(UBYTE)64)); break; } } Delay (30l); if (*key==117) CloseMaster (scr,win); } } playit() { long loop; float t=sin(1.0);/* Lade Mathtrans.library*/ spr_offset=8l; xcheck=4l; ycheck=0l; score=stage=0;lives=5; for (loop=0l;loop<5l;loop++) oldscore[loop]=0; GetPicture("Paranoid:gfx/playscreen.dat",320l,256l,4l); SetPointer (win,mouse_pointer,16l,16l,0l,0l); RemakeDisplay(); GetSound(); SetRGB4 (vp,16l,12l,0l,12l); SetRGB4 (vp,17l,10l,10l,10l); SetRGB4 (vp,18l,7l,7l,7l); SetRGB4 (vp,19l,13l,13l,13l); SetRGB4 (vp,20l,6l,6l,15l); SetRGB4 (vp,21l,4l,4l,15l); SetRGB4 (vp,22l,15l,15l,15l); SetRGB4 (vp,23l,14l,2l,2l); SetRGB4 (vp,24l,1l,6l,1l); SetRGB4 (vp,25l,15l,15l,15l); SetRGB4 (vp,26l,3l,9l,3l); SetRGB4 (vp,27l,15l,5l,0l); SetRGB4 (vp,28l,10l,0l,0l); SetRGB4 (vp,29l,0l,0l,11l); SetRGB4 (vp,30l,3l,12l,3l); SetRGB4 (vp,31l,15l,0l,15l); if (!(platte1_nr=GetSprite (&platte1_spr,2l))) { printf ("No Sprite 2 allocation\n"); CloseMaster (scr,win); } if (!(platte2_nr=GetSprite (&platte2_spr,3l))) { printf ("No Sprite 3 allocation\n"); CloseMaster (scr,win); } if (!(ball_nr=GetSprite (&ball_spr,1l))) { printf ("No Sprite 4 allocation\n"); CloseMaster (scr,win); } LoadStage(21l,25l); realstart: horpos=160l;verpos=237l;ballwinkel=45.0;bally=verpos-5l;speed=4.0; newwinkel(45.0); PrintStuff(); GetMouseMove(); do { MoveSprite (vp,&platte1_spr,horpos,verpos); MoveSprite (vp,&platte2_spr,horpos+spr_offset,verpos); MoveSprite (vp,&ball_spr,horpos+10l,bally); GetMouseMove(); WaitTOF (); } while (*button&(UBYTE)64); ballx=horpos+10l; do { for (t=1.0;t<=speed;t++) { newx=ballx+(long)(t*coswert); newy=bally-(long)(t*sinwert); if (newx<20l) { silence(1); soundflag=1; newx++; score++; newwinkel(90.0); PlaySound (soundbuffer+39028l,5986l,358,1,64l); break; } if (newx>296l) { silence(2); newwinkel(90.0); PlaySound (soundbuffer+39028l,5986l,358,2,64l<<8); soundflag=2; newx--;score++; break; } if (newy<56l) { silence(3); newwinkel(0.0); PlaySound (soundbuffer+39028l,5986l,358,3, (304l-newx)/5l+((newx/5l)<<8)); soundflag=3; newy++;score++; break; } if (newy>verpos-5l) { if ((newx+3l>horpos)&&(newx.5) PlaySound (soundbuffer+6135l,12412l,406,3,64l<<8); else PlaySound (soundbuffer+18548l,20480l,298,3,64l); Delay (50l*1l); shutup(3); Delay(60l*1l); lives--; if (!(lives)) break; goto realstart; } } loop=0l; if (loop=pixtest(newx,newy)) { silence(3); soundflag=3; if ((long)loop==1l) newwinkel (0.0); if ((long)loop==2l) newwinkel (90.0); KillStone (newx,newy,25l); newx=ballx; newy=bally; PlaySound (soundbuffer+61398l,1480l,358,3, (304l-newx)/5l+((newx/5l)<<8)); score+=2; stonecount--; break; } } ballx=newx;bally=newy; MoveSprite (vp,&ball_spr,ballx,bally); GetMouseMove(); MoveSprite (vp,&platte1_spr,horpos,verpos); MoveSprite (vp,&platte2_spr,horpos+spr_offset,verpos); PrintScore(); if ((++hitdel>1000l)&&((hitdel>>1l)<<1l==hitdel)) { if (hitdel>1200l) hitdel=0l; BltBitMapRastPort (&hitmap,0l,0l,rp,281l,223l,16l,16l,0xccl); if (++hitnr>=8l) hitnr=0l; for (loop=0l;loop<5l;loop++) hitmap.Planes[loop]=(UBYTE *)((long)(hitbit)+160l*hitnr+32l*loop); } if ((hitdel>1000l)&&(horpos+spr_offset+16l>=281l)) { speed=4.0; hitflag=0; spr_offset=8l; hitdel=0l; t=ran(); if (t<.1) spr_offset=16l; if ((t>=.1)&&(t<.2)) score+=40; if ((t>=.2)&&(t<.3)) { lives++; PrintStuff(); } if ((t>=.3)&&(t<.4)) { stage++; LoadStage(21l,25l); goto realstart;} if ((t>=.4)&&(t<.5)) hitflag=1; if ((t>=.5)&&(t<.6)) score+=75; if ((t>=.6)&&(t<.7)) goto realstart; if ((t>=.7)&&(t<.8)) speed=2.0; if ((t>=.8)&&(t<.9)) speed=3.0; if (t>=.9) speed=5.0; } if (hitflag) { ballwinkel+=((ran()-.5)*10.0); newwinkel (ballwinkel);} WaitTOF(); if (soundflag) { shutup(soundflag); soundflag=0; } if (lives<1) break; if (!(stonecount)) { stage++;LoadStage(21l,25l); goto realstart; } } while (*key!=117); FreeMem (soundbuffer,64000l); FreeSprite (2l); FreeSprite (3l); FreeSprite (1l); ClearPointer (win); RethinkDisplay(); silence(15); if (score>highscore[9].punkte) PutHighScore(); } editor() { short xmouse,ymouse; GetPicture ("Paranoid:gfx/escreen.dat",320l,256l,5l); DisplayBeep (scr); stage=0l;level.p_num=0;stone=1; PrintMuster(); PrintRunde (); CleanFields(); while (TRUE) { while (!(*button&(UBYTE)64)); while (*button&(UBYTE)64); if (CheckRange (2,105,20,113)) break; if ((CheckRange (2,90,20,103))&&(stage>0l)) { stage--; PrintRunde(); continue; } if ((CheckRange (2,75,20,88))&&(stage<99l)) { stage++; PrintRunde(); continue; } if ((CheckRange (157,34,168,44))&&(level.p_num>0)) { level.p_num--; PrintMuster(); continue; } if ((CheckRange (144,34,155,44))&&(level.p_num<15)) { level.p_num++; PrintMuster(); continue; } if (CheckRange (144,9,168,19)) { CleanFields(); continue; } if (CheckRange (80,12,95,17)) { stone=1; continue; } if (CheckRange (102,12,117,17)) { stone=2; continue; } if (CheckRange (124,12,139,17)) { stone=3; continue; } if (CheckRange (80,24,95,29)) { stone=4; continue; } if (CheckRange (102,24,117,29)) { stone=5; continue; } if (CheckRange (124,24,139,29)) {stone=6; continue; } if (CheckRange (80,36,95,41)) {stone=7; continue; } if (CheckRange (124,36,139,41)) { stone=8; continue; } if (CheckRange (102,36,117,41)) { stone=0; continue; } if (CheckRange (35,80,306,219)) { paint(); continue; } if (CheckRange (2,27,20,44)) { SaveStage(); continue;} if (CheckRange (2,9,20,25)) { LoadStage(32l,35l); PrintRunde(); PrintMuster(); continue;} } } /********************************************************************* * Hier stehen die Hilfsroutinen * *********************************************************************/ GetMouseMove() { register char *move=(char *) 0xdff00b; register char new,summ; new=*move; summ=oldmouse-new; oldmouse=new; mousemove=(long)(-1.2*(float)(summ)); horpos+=mousemove; if (horpos+mousemove<20l) horpos=20l; if (horpos+mousemove>284l-spr_offset) horpos=284l-spr_offset; } float rad (deg) float deg; { return (3.141593*deg/180.0); } newwinkel(grad) float grad; { while (grad>=180.0) grad-=180.0; while (grad<=-180.0) grad+=180.0; ballwinkel=2.0*grad-ballwinkel; if (ballwinkel>180.2) ballwinkel-=360.0; if (ballwinkel<-180.2) ballwinkel+=360.0; if ((ballwinkel>.0)&&(ballwinkel<=180.0)) ycheck=0l; else ycheck=4l; if ((ballwinkel>-90.0)&&(ballwinkel<=90.0)) xcheck=4l; else xcheck=0l; sinwert=sin(rad(ballwinkel)); coswert=cos(rad(ballwinkel)); } PlaySound (start,laenge,rate,channels,volume) ULONG *start,volume,laenge; USHORT rate,channels; { USHORT loop,avol; USHORT *ctlw,*c0tl,*c0per,*c0vol; ULONG *c0thi; c0thi = (ULONG *) 0xdff0a0; c0tl = (USHORT *) 0xdff0a4; c0per = (USHORT *) 0xdff0a6; c0vol = (USHORT *) 0xdff0a8; ctlw = (USHORT *) 0xdff096; for (loop=1;loop<=8;loop*=2) { avol=0; avol=(UBYTE)(volume>>(8*(loop/2-loop/8))); if (loop&channels) { *c0thi = (ULONG) start; *c0tl = (UWORD) (laenge>>1l); *c0vol = avol; *c0per = rate; } c0thi=(ULONG *)((ULONG)(c0thi)+0x10l); c0tl=(USHORT *)((ULONG)(c0tl)+0x10l); c0per=(UWORD *)((ULONG)(c0per)+0x10l); c0vol=(UWORD *)((ULONG)(c0vol)+0x10l); } *ctlw = 0x8200+channels; } shutup(channels) UWORD channels; { USHORT loop; USHORT *c0tl=(USHORT *) 0xdff0a4; ULONG *c0thi=(ULONG *) 0xdff0a0; for (loop=1;loop<=8;loop*=2) { if (loop&channels) { *c0thi = (ULONG) sound2; *c0tl = 20; } c0thi=(ULONG *)((ULONG)(c0thi)+0x10l); c0tl=(USHORT *)((ULONG)(c0tl)+0x10l); } } silence(channels) USHORT channels; { USHORT *ctlw=(USHORT *) 0xdff096; *ctlw=channels; } /* Hier steht pixtest(); */ #asm public _pixtest _pixtest: movem.l d1-d7/a0-a6,-(sp) ;60(a7) ist x,64(a7) ist y addq.l #1,60(a7) move.l _ycheck,d0 add.l d0,64(a7) jsr offset ; schleife 1 mit d3 move.l #2,d3 move.l #1,d4 loop1: clr.l d0 bset d6,d0 and.b (a0),d0 tst.b d0 bne raus1 subq.l #1,d6 cmp.l #-1,d6 bne loop1on move.l #7,d6 addq.l #1,a0 loop1on: addq.l #1,d4 dbra d3,loop1 subq.l #1,60(a7) move.l _xcheck,d0 add.l d0,60(a7) move.l _ycheck,d0 sub.l d0,64(a7) addq.l #1,64(a7) jsr offset ; schleife 1 mit d3 move.l #2,d3 move.l #1,d4 loop2: clr.l d0 bset d6,d0 and.b (a0),d0 tst.b d0 bne raus2 adda.l #40,a0 ;eventuell anpassen addq.l #1,d4 dbra d3,loop2 .pixend movem.l (sp)+,d1-d7/a0-a6 rts ;offset und bytepos berechnen,x und y sind um vier verschoben offset: move.l 68(a7),d0 mulu #40,d0 ; eventuell anpassen move.l 64(a7),d1 divu #8,d1 add.w d1,d0 add.l _bm5base,d0 movea.l d0,a0 mulu #8,d1 addq.l #7,d1 sub.l 64(a7),d1 move.l d1,d6 rts raus1: move.l _newx,_ballx move.l _newy,_bally add.l d4,_newx move.l _ycheck,d1 add.l _newy,d1 move.l d1,_newy move.l #1,d0 jmp .pixend raus2: move.l _newx,_ballx move.l _newy,_bally add.l d4,_newy move.l _xcheck,d1 add.l _newx,d1 move.l d1,_newx move.l #2,d0 jmp .pixend #endasm /************************************************************************ * Diese Routinen werden auch vom Editor benutzt. * ************************************************************************/ openstuff() { if (!(OpenMaster())) { printf ("Keine Libraries\n"); exit(); } SetRast (IntuitionBase->ActiveWindow->RPort,0l); if (!(scr=MasterScreen(320,256,31,0l))) { printf ("Kein Screen\n"); CloseMaster (0l,0l); } if (!(win=MasterWindow (scr,0,0,320,256,0l,BORDERLESS,0l))) { printf ("Kein Window\n"); CloseMaster (scr,0l); } if (!(cmap=GetColorMap(32l))){printf ("Color Map\n"); CloseMaster (scr,win);} vp=&(scr->ViewPort); rp=&(scr->RastPort); bm=&(scr->BitMap); bm5base=(long)bm->Planes[4]; } GetSound() { if (!(soundbuffer=AllocMem(64000l,MEMF_CHIP|MEMF_PUBLIC))) { printf ("No Memory for sounds\n"); CloseMaster(scr,win); } if (!(fh=Open ("Paranoid:music/parsound.dat",1004l))) { printf ("Sounddata not found\n"); CloseMaster(scr,win); } Disable(); Read (fh,soundbuffer,62878l); Close (fh); Enable(); } GetPicture(name,x,y,planes) char *name; long x,y,planes; { long loop; if (!(fh=Open(name,1005l))) { printf ("No Picture\n"); CloseMaster (scr,win);} SetRast (rp,0l); ScreenToBack (scr); Disable(); for (loop=0l;loopPlanes[loop],(x*y)/8l); Read (fh,cmap->ColorTable,2l*(1l<ColorTable,(1l<MouseX; ym=scr->MouseY; if ((xmx2)||(ymy2)) return (0); while (!(*button&(UBYTE)64)); xm=scr->MouseX; ym=scr->MouseY; if ((xmx2)||(ymy2)) return (0); else return(1); } PrintRunde() { char runde[2];short st=(short)stage; runde[0]=48+(char)(st/10); st=st-10*(st/10); runde[1]=48+(char)st; SetAPen (rp,1l); Move (rp,4l,55l); Text (rp,runde,1l); Move (rp,11l,64l); Text (rp,&(runde[1]),1l); } PrintMuster () { char ziffer[2];short pn=level.p_num; UWORD *pzeiger; pzeiger=(UWORD *)((long)(pattern)+128l*(long)(level.p_num)); SetAPen (rp,15l); SetAfPt (rp,pzeiger,-4); RectFill (rp,201l,14l,299l,39l); RectFill (rp,176l,16l,191l,31l); SetAfPt (rp,0l,0); SetAPen (rp,1l); ziffer[0]=48+(char)(pn/10); pn=pn-10*(pn/10); ziffer[1]=48+(char)pn; Move (rp,148l,30l); Text (rp,ziffer,1l); Move (rp,157l,30l); Text (rp,&(ziffer[1]),1l); } CleanFields() { long loop; UWORD *pzeiger; for (loop=0l;loop<320l;loop++) level.stones[loop]=0; pzeiger=(UWORD *)((long)(pattern)+128l*(long)(level.p_num)); SetAPen (rp,15l); SetAfPt (rp,pzeiger,-4); RectFill (rp,32l,57l,311l,243l); SetAfPt (rp,0l,0); } paint() { long xloc,yloc; xloc=(long)((scr->MouseX-35l)/17); yloc=(long)((scr->MouseY-80l)/7l); if (!(stone)) { KillStone ((long)(scr->MouseX),(long)(scr->MouseY),35l); level.stones[xloc+yloc*16]=0; return (0l); } do { SetStone (xloc,yloc,(long)stone,35l); level.stones[xloc+yloc*16]=(UBYTE)stone; xloc=(long)((scr->MouseX-35l)/17); yloc=(long)((scr->MouseY-80l)/7l); if ((scr->MouseX>306)||(scr->MouseX<35)) return; if ((scr->MouseY>219)||(scr->MouseY<80)) return; while (*button&(UBYTE)64) { if ((scr->MouseX>306)||(scr->MouseX<35)) return; if ((scr->MouseY>219)||(scr->MouseY<80)) return; } } while (1); } SaveStage() { char name[50]; char ziffer[2];short st=(short)stage; ziffer[0]=48+(char)(st/10); st=st-10*(st/10); ziffer[1]=48+(char)st; sprintf (name,"Paranoid:levels/runde%c%c",ziffer[0],ziffer[1]); if (!(fh=Open(name,1006l))) { printf ("No Save-File\n"); CloseMaster (scr,win);} Write (fh,&level,322l); Close (fh); } LoadStage(b1,b2) long b1,b2; { long x,y; char name[50],ziffer[2]; short st; UWORD *pzeiger; begin_load: st=(short)stage; ziffer[0]=48+(char)(st/10); st=st-10*(st/10); ziffer[1]=48+(char)st; sprintf (name,"Paranoid:levels/runde%c%c",ziffer[0],ziffer[1]); if (!(fh=Open(name,1004l))) { DisplayBeep (scr); stage=0; goto begin_load; } Read (fh,&level,322l); Close (fh); pzeiger=(UWORD *)((long)(pattern)+128l*(long)(level.p_num)); SetAPen (rp,15l); SetAfPt (rp,pzeiger,-4); RectFill (rp,b1,57l,b1+279l,243l); SetAfPt (rp,0l,0); stonecount=0l; for (y=0l;y<20l;y++) { for (x=0l;x<16l;x++) { if (level.stones[y*16l+x]) { SetStone (x,y,(long)(level.stones[y*16l+x]),b2); stonecount++; } } } if (!(stonecount)) { stage++; goto begin_load; } } PrintScore() { long loop,wert=10000l,posn=40l; long punkte=(long)score; SetAPen (rp,1l); for (loop=0l;loop<5l;loop++) { newscore[loop]=(UBYTE)(48l+punkte/wert); punkte=punkte-wert*(punkte/wert); wert/=10l; if (oldscore[loop]!=newscore[loop]) { Move (rp,posn,23l); Text (rp,&(newscore[loop]),1l); } posn+=9l; oldscore[loop]=newscore[loop]; } } PrintStuff() { char ziffer[2];short st=stage; char qwertz[2];short li=lives; ziffer[0]=48+(char)(st/10); st=st-10*(st/10); ziffer[1]=48+(char)st; qwertz[0]=48+(char)(li/10); li=li-10*(li/10); qwertz[1]=48+(char)li; SetAPen (rp,1l); Move (rp,110l,23l); Text (rp,ziffer,1l); Move (rp,119l,23l); Text (rp,&(ziffer[1]),1l); Move (rp,150l,23l); Text (rp,qwertz,1l); Move (rp,159l,23l); Text (rp,&(qwertz[1]),1l); } /*************************************************************************** * Hier stehen die HighScore Routinen * ***************************************************************************/ PrintHighScore() { long loop; char sbuff[10]; SetAPen (rp,1l); for (loop=0l;loop<10l;loop++) { sprintf (sbuff,"%d",highscore[loop].punkte); Move (rp,10l,40l+loop*15l); Text (rp,sbuff,(long) strlen(sbuff)); Move (rp,61l,40l+loop*15l); Text (rp,highscore[loop].name,(long) strlen (highscore[loop].name)); } } PutHighScore() { long loop,t; GetPicture ("Paranoid:gfx/highscreen.dat",320l,256l,2l); for (loop=9l;loop>=0l;loop--) { if (scoreloop;t--) { highscore[t].punkte=highscore[t-1l].punkte; strcpy(highscore[t].name,highscore[t-1l].name); } highscore[loop].punkte=score; PrintHighScore(); GetName (loop); if (!(fh=Open ("Paranoid:highscore",1006l))) { printf ("highdata not found\n"); return; } Write (fh,highscore,320l); Close (fh); } GetName (nummer) long nummer; { long count=0l; UBYTE nbuff[40]; nbuff[0]=0; while (1) { SetAPen (rp,0l); RectFill (rp,60l,30l+nummer*15l,300l,43l+nummer*15l); SetAPen (rp,1l); Move (rp,61l,40l+nummer*15l); Text (rp,nbuff,(long)strlen(nbuff)); if (count>28l) break; while (!(*button&(UBYTE)64)); /* Solange,bis Button oben */ while (*button&(UBYTE)64); /* Solange,bis Button unten */ if (CheckRange(220,203,258,244)) break; if ((count>0l)&&(CheckRange(61,203,99,244))) { nbuff[--count]=0; continue;} if (CheckRange(109,210,212,216)) { nbuff[count]=(UBYTE)(65+(scr->MouseX-109)/8); nbuff[++count]=0; continue; } if (CheckRange (109,220,212,226)) { nbuff[count]=(UBYTE)(78+(scr->MouseX-109)/8); nbuff[++count]=0; continue; } if (CheckRange (109,230,188,236)) { nbuff[count]=(UBYTE)(48+(scr->MouseX-109)/8); nbuff[++count]=0; continue; } if (CheckRange (189,230,196,236)) { nbuff[count]='-'; nbuff[++count]=0; continue; } if (CheckRange (197,230,204,236)) { nbuff[count]='/'; nbuff[++count]=0; continue; } if (CheckRange (205,230,212,236)) { nbuff[count]='.'; nbuff[++count]=0; continue; } if (CheckRange (213,230,220,236)) { nbuff[count]=' '; nbuff[++count]=0; continue;} } strcpy (highscore[nummer].name,nbuff); }