1
2
3
4
|
PACKETkoordinatenDEFINES GPOS,MPOS,null,:=,=,igpos,jgpos,impos,jmpos,iwindowpos,jwindowpos,gpos,mpos,newmpos,gcursor,getgcursor,bewegecursor,standardfenster,imgitter,igittersize,jgittersize,gitterfenster,gitterstart,:LETmaxlength=9,maxheight=1,habstand=4,vabstand=2,xsize=77,ysize=20,maxi=20,maxj=10;TEXT CONSTcursorbewegungen:="���
��"+return+rubin+rubout;LETreturn="
",rubin="�",rubout="�",hop="�",piep="�";WINDOW VARfenster:=window(2,2,xsize,ysize);WINDOW PROCstandardfenster:fensterEND PROCstandardfenster;TYPE GITTERFENSTER=STRUCT(MPOSstart,INTisize,jsize);TYPE GPOS=STRUCT(INTi,j);TYPE MPOS=STRUCT(INTi,j);GPOS PROCgpos(INT CONSTi,j):GPOS VARg;g.i:=i;g.j:=j;gENDPROCgpos;OP:=(GPOS VARl,GPOS CONSTr):CONCR(l):=CONCR(r)ENDOP:=;INT PROCigpos(GPOS CONSTg):g.iEND PROCigpos;INT PROCjgpos(GPOS CONSTg):g.jEND PROCjgpos;BOOL OP=(GPOS CONSTl,r):(l.i=r.i)AND(l.j=r.j)END OP=;MPOS PROCnewmpos(INT CONSTi,j):MPOS VARm;m.i:=i;m.j:=j;mEND PROCnewmpos;MPOS PROCnull:MPOS VARm;m.i:=0;m.j:=0;mEND PROCnull;BOOL OP=(MPOS CONSTl,r):(l.i=r.i)AND(l.j=r.j)END OP=;OP:=(MPOS VARl,MPOS CONSTr):CONCR(l):=CONCR(r)ENDOP:=;INT PROCimpos(MPOS CONSTm):m.iEND PROCimpos;INT PROCjmpos(MPOS CONSTm):m.jEND PROCjmpos;MPOS PROCmpos(GPOS CONSTg):newmpos(standardgitter.start.i+g.i-1,standardgitter.start.j+g.j-1)ENDPROCmpos;GPOS PROCgpos(MPOS CONSTm):GPOS VARg;IF NOTimgitter(m)THENg.i:=0;g.j:=0;ELSEg.i:=m.i-standardgitter.start.i+1;g.j:=m.j-standardgitter.start.j+1FI;gENDPROCgpos;INT PROCiwindowpos(GPOS CONSTgitterpos):(gitterpos.i-1)*(maxlength+2+habstand)+3END PROCiwindowpos;INT PROCjwindowpos(GPOS CONSTgitterpos):(gitterpos.j-1)*(maxheight+2+vabstand)+2END PROCjwindowpos;BOOL PROCimgitter(MPOS CONSTmp):standardgitter.start.i<=mp.iANDstandardgitter.start.j<=mp.jANDmp.i-standardgitter.start.i<igittersizeANDmp.j-standardgitter.start.j<jgittersizeEND PROCimgitter;BOOL PROCimgitter(GPOS CONSTgp):1<=igpos(gp)AND1<=jgpos(gp)ANDigpos(gp)<=igittersizeANDjgpos(gp)<=jgittersizeEND PROCimgitter;GITTERFENSTER VARstandardgitter;gitterfenster(newmpos(1,1));INT PROCigittersize:standardgitter.isizeEND PROCigittersize;INT PROCjgittersize:standardgitter.jsizeEND PROCjgittersize;MPOS PROCgitterstart:standardgitter.startEND PROCgitterstart;PROCgitterfenster(MPOS CONSTstart):INT VARxsize:=areaxsize(fenster),ysize:=areaysize(fenster);berechneisizeundjsize;.startpunktunzulaessig:start.i<1ORstart.i>maxiORstart.j<1ORstart.j>maxj.berechneisizeundjsize:standardgitter.start:=start;standardgitter.isize:=(xsize+1)DIVxsizeeinerboxsamtumgebung;standardgitter.jsize:=(ysize+1)DIVysizeeinerboxsamtumgebung.xsizeeinerboxsamtumgebung:(maxlength+habstand+2).ysizeeinerboxsamtumgebung:(maxheight+vabstand+2).END PROCgitterfenster;PROCverschiebegitter(INT CONSThor,vert,PROCkonstruierediagrammimneuengitterfenster):MPOS VARstartmp:=mpos(gpos(1,1));gitterfenster(newmpos(imp,jmp));konstruierediagrammimneuengitterfenster.imp:max(1,min(maxi-igittersize+1,impos(startmp)+hor)).jmp:max(1,min(maxj-jgittersize+1,jmpos(startmp)+vert)).END PROCverschiebegitter;GPOS VARgittercursor;gittercursor.i:=1;gittercursor.j:=1;PROCgcursor(GPOS CONSTg):WINDOW VARw:=fenster;IFimgitter(g)THENgittercursor:=g;cursor(w,iwindowpos(g),jwindowpos(g))FI END PROCgcursor;GPOS PROCgetgcursor:gittercursorEND PROCgetgcursor;PROCbewegecursor(GPOS VARgp,TEXT VARtaste,PROCneuesbild):INT VARsooftwie,schritte;MPOS VARaktuellempos;gcursor(gp);REPgp:=getgcursor;inchar(taste);IFtaste=hopTHENlieshopsequenzELSEsooftwie:=1+clearbufferandcount(taste)FI;SELECTpos(cursorbewegungen,taste)OF CASE1:geheevtlnachrechtsCASE2:geheevtlnachlinksCASE3:geheevtlnachobenCASE4:geheevtlnachuntenOTHERWISEverlasseprozedurENDSELECT PER.geheevtlnachrechts:WHILEsooftwie>0REPgp:=getgcursor;aktuellempos:=mpos(gp);IF NOT(impos(aktuellempos)<maxi)THENout(piep);sooftwie:=0ELIFigpos(gp)<igittersizeTHENschritte:=min(igittersize-igpos(gp),sooftwie);gcursor(gpos(igpos(gp)+schritte,jgpos(gp)));sooftwieDECRschritteELSEverschiebegitter(sooftwie,0,PROCneuesbild);gcursor(gp);sooftwie:=0FI PER.
geheevtlnachlinks:WHILEsooftwie>0REPgp:=getgcursor;aktuellempos:=mpos(gp);IF NOT(1<impos(aktuellempos))THENout(piep);sooftwie:=0ELIF1<igpos(gp)THENschritte:=min(igpos(gp)-1,sooftwie);gcursor(gpos(igpos(gp)-schritte,jgpos(gp)));sooftwieDECRschritteELSEverschiebegitter(-sooftwie,0,PROCneuesbild);gcursor(gp);sooftwie:=0FI PER.geheevtlnachoben:WHILEsooftwie>0REPgp:=getgcursor;aktuellempos:=mpos(gp);IF NOT(1<jmpos(aktuellempos))THENout(piep);sooftwie:=0ELIF1<jgpos(gp)THENschritte:=min(jgpos(gp)-1,sooftwie);gcursor(gpos(igpos(gp),jgpos(gp)-schritte));sooftwieDECRschritteELSEverschiebegitter(0,-sooftwie,PROCneuesbild);gcursor(gp);sooftwie:=0FI PER.geheevtlnachunten:WHILEsooftwie>0REPgp:=getgcursor;aktuellempos:=mpos(gp);IF NOT(jmpos(aktuellempos)<maxj)THENout(piep);sooftwie:=0ELIFjgpos(gp)<jgittersizeTHENschritte:=min(jgittersize-jgpos(gp),sooftwie);gcursor(gpos(igpos(gp),jgpos(gp)+schritte));sooftwieDECRschritteELSEverschiebegitter(0,+sooftwie,PROCneuesbild);gcursor(gp);sooftwie:=0FI PER.lieshopsequenz:REPinchar(taste);SELECTpos(cursorbewegungen,taste)OF CASE1:hoprechts;LEAVElieshopsequenzCASE2:hoplinks;LEAVElieshopsequenzCASE3:hophoch;LEAVElieshopsequenzCASE4:hoprunter;LEAVElieshopsequenzCASE6,7,8,9:verlasseprozedurOTHERWISEout(piep)END SELECT PER.hoprechts:IFigpos(gp)=igittersizeTHENsooftwie:=igittersizeELSEsooftwie:=igittersize-igpos(gp)FI.hoplinks:IFigpos(gp)=1THENsooftwie:=igittersizeELSEsooftwie:=igpos(gp)-1FI.hophoch:IFjgpos(gp)=1THENsooftwie:=jgittersizeELSEsooftwie:=jgpos(gp)-1FI.hoprunter:IFjgpos(gp)=jgittersizeTHENsooftwie:=jgittersizeELSEsooftwie:=jgittersize-jgpos(gp)FI.verlasseprozedur:LEAVEbewegecursor.END PROCbewegecursor;END PACKETkoordinaten;
|