//Relix complex (a Melee/Wizard rehash) - Thorsz scenario - Knight's Tour module //~incorp rpt() //~rev arySiz #elms //~sep lblWd,Ht map side offset vars from lbl ltr dim vars import java.awt.*; //incorpg Graphics class import java.awt.event.*; //incorpg KeyListener/Adapter,ActionListener/Event classes public class ktrX0Ap extends Panel{ int x1=1,x2,x3,x4,x5,y1=1,y2,y3,y4,y5; //var lvl 1 routines' constants static final int Sho4th=1,UseOpt=2,EncRev=3,OneRnd=4,EndGam=5; //var lvl 2 routines' constants static final int ChgBd=1,ChkIni=2,ChkRea=3,SidMov=4,PikAct=5,ExeAct=6; //var lvl 3 routines' constants static final int UsrMov=1,MacMov=2; static final int Neg=-1,X=10,C=100,Asc0=+'0'; //note shorthand for (int)'0' static final Color StdHue[]={ Color.black,Color.magenta,Color.red,Color.orange,Color.yellow, Color.green,Color.cyan,Color.blue,Color.lightGray,Color.white }; //StdHue[] int hues[]={0,0,3,9,0,0,0,6,7}; //hue() fnc's indirect ref sto static final int BdBkg=1,BdBdr=2,BrfFgd=3,BrfBkg=4,LblFgd=5,LblBkg=6, MapBkg=7,MapFgd=8; /*~unused static final Color newHue[]={ new Color(200,200,C).brighter() //bright khaki }; //newHue[] //*/ int newFig,srcFig,tgtFig,atkSrc,atkTgt; //vals= ary elm#s static final int All=-1,Bst=0,Adv=1,Foe=2,Pty=3,Any=4,Set=5,Out=X,By=0; //nxtFig(), rdmFig() args static final String Ctl$="BAba"; Font ltr,lbl; //& FontMetrics class instance ltrSiz obj int ltrPt,lblPt,typHt; int bdWd,bdHt,ioWd,ioHt,zonWd,lblWd,lblHt,bdrWd=1; int vuWd,vuHt,vuSqWd=34,vuSqHt=24; int hlfSqHt=12,hlfSqWd,sqWd,sqHt,mapSqWd,mapSqHt; int mapWd,mapHt,mapTop,mapBtm,mapLft,mapRgt,mapTopMar,mapLftMar; //hexAsp= C* [tan(30 deg) or 1/sqr(3)= .57]: hexside-to-height ratio at 1:1 display fmt int hlfHexSid=7,hlfHexHt,hexSid,hexWd,hexHt,hexAsp=57; int minLftMar=5*hlfHexSid/2,minTopMar=2*hlfHexSid; //~?n*hlfHexSid int mapColWd=21,mapRowHt=11; //utility vars char a$,A$; boolean isa1,isA4,isB4,isA6,isA7,isA8,isA9; int a1,b1,c1,d1,e1,f1; int a2,b2,c2; int A2; int A3,B3,C3; int A4,B4,C4,D4,E4,F4,G4; int A6,B6,C6,D6,E6,F6; int A7,B7,C7,D7,E7,F7,G7,H7,I7; int A8,B8,C8,D8,E8,F8,G8,H8,I8,J8,K8,L8,M8,N8,O8,P8; int A9,B9,C9,D9,E9,F9,G9,H9,I9,J9; int A0; StringBuffer a1$=new StringBuffer(); StringBuffer A6$=new StringBuffer(); StringBuffer B6$=new StringBuffer(); StringBuffer C6$=new StringBuffer(); StringBuffer A7$=new StringBuffer(); StringBuffer B7$=new StringBuffer(); StringBuffer C7$=new StringBuffer(); StringBuffer D7$=new StringBuffer(); StringBuffer E7$=new StringBuffer(); StringBuffer A8$=new StringBuffer(); StringBuffer B8$=new StringBuffer(); StringBuffer A9$=new StringBuffer(); StringBuffer A0$=new StringBuffer(); StringBuffer inp$=new StringBuffer(); //KeyListener user inp $ StringBuffer die$=new StringBuffer(); //dic() dice result listg $ //small util int arys static final int FigMax=C; //~=? int z1Siz=X,z1[]=new int[z1Siz+1]; //rout lvl1 util ary int Z7Siz=X,Z7[]=new int[Z7Siz+1]; //sbr lvl7 util ary int Z8Siz=X,Z8[]=new int[Z8Siz+1]; //sbr lvl8 util ary int pflLoc[]=new int[7]; //pfl layout on bd //data$'s fmt= delimited with commas, (?convert to int if beg with - or 0..9 ?def codes) //single z1$[] array with int divider indexes mazMap, chrPoo, itmPoo, chrGrp, itmGrp int begDiv,endDiv,begElm,endElm,elmNum,itmElm,dtaEnd,arySiz=200; //~[#?] StringBuffer z1$[]=new StringBuffer[arySiz+1]; //[0] unused; [1]..[arySiz] static final char Div$=',',Fre0$='$'; //string data fields delimited with Div$ chrs static final String Fre$="$"; int xsA,xsB; static final String WayOut$=";B,CE,;?DF,<@EG,=FH,>G,3CJ,4DIK,15AEJL,26BFKM,37CGLN," //13 +"48DHMO,5ENP,6FO,2;KR,13JNSU,46;?KOTV,57<@LPUW,68=MVX,7>NW,:CSZ," //25 +"9;DTY[,:CGSW\\^,=?DHTX]_,>@EU^`,?FV_,BK[b,ACL\\ac,BDIMY]bd,CEJNZ^ce," //36 +"DFKO[_df,EGLP\\`eg,FHM]fh,GN^g,JScj,IKTdik,JLQUaejl,KMRVbfkm,LNSWcgln,MOTXdhmo,NPUenp," +"OVfo,R[k,QS\\l,RTY]im,SUZ^jn,TV[_ko,UW\\`lp,VX]m,W^n,Zc,Y[d,Z\\ae,[]bf,\\^cg,]_dh,^`e,_f"; StringBuffer kntPth$=new StringBuffer(); StringBuffer pthFrk$=new StringBuffer(); int basMag=hlfSqHt,drwMag=hlfSqHt; //~?BasMag cst char key1$,key2$,key3$,key4$,key5$; boolean isKey,isLin; int inpVal,txtX,txtY,txtTyp,argLg,txtCodLg=3; StringBuffer lin$=new StringBuffer(); public static void main(String args[]){ //main mth Frame f=new Frame(); f.addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ System.exit(0); }; //windowClosing( }); //f.addWindowListener( ktrX0Ap p=new ktrX0Ap(); //Constructor mth runs here: //defer any Graphics g mth calls post paint() run at main() end p.setSize(1000,1000); f.add(p); f.pack(); //` p.init(); //rev as ktrX0Ap() constructor mth: //`req for array of StringBuffers object's compatibility f.setSize(486,414); f.setResizable(true); f.setVisible(true); //paint() run now automatically on startup } //main( ktrX0Ap(){ this.addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e){ //prov for (Apple numpad) Enter keys key5$=e.getKeyChar(); if(key5$=='\n') keyIn(); } //keyPressed mth public void keyTyped(KeyEvent e){ //all other keys key5$=e.getKeyChar(); if(key5$!='\n') keyIn(); } //keyTyped mth }); //KeyAdapter class/ addKeyListener args //now loading main dta strings array z1$[] //note: z1$[0] is left unused - locElm(), etc. may rtn 0 as a "not found" //init all StringBuffer elms //~optimize into segregated loops IAW expected elm size limits? for(a1=1;a1<=arySiz;a1++) //z1$[0] remains null z1$[a1]=new StringBuffer(); a1=1; xsA=a1++; //transient string elm var usage - eg. see ~ xsB=a1++; //persistent (during inputs) string elm var usage - eg. see ~ vuSqHt-=2; //Note sho4th() cmt re loop action on setSize() in bdSiz() when placed in same case bdSiz(false); //no Graphics g.() mth/ paint() calls yet } //Constructor mth public void paint(Graphics g){ reTrd(); //calls shoBd() -> go() -> (with initial x1=1) sho4th() //keybd inp is then accepted/ listened for here; at called routines' rtn this.requestFocusInWindow(); //permit keybd detect by KeyListener } //paint mth - will automatically restore keybd focus, if lost void reTrd(){ shoBd(); shoFrc(); if(x5>0){ if(y5>1) y5--; } else //~?lvl lmt if(x4>0){ if(y4>1) y4--; } else if(x3>0){ if(y3>1) y3--; } else if(x2>0){ if(y2>1) y2--; } else if(y1>1) y1--; go(); } //reTrd mth void keyIn(){ isKey=true; Graphics g=getGraphics(); //clear lin$ (prompt+input): FontMetrics ltrSiz=g.getFontMetrics(ltr); /*~limit chk A8=txtY-typHt*3/4; B8=ltrSiz.stringWidth(str(lin$).substring(txtCodLg)); C8=typHt; if(A8+C8>bdHt) C8=C8-(A8+C8-bdHt); //*/ A8=ltrSiz.stringWidth(str(lin$).substring(txtCodLg)); g.setColor(hue(BrfBkg)); g.fillRect(txtX,txtY-typHt*3/4,A8,typHt-1); if(isLin){ if(key5$=='\n' || key5$=='\b' && inp$.length()==argLg){ isLin=false; eq(lin$,str(lin$).substring(argLg)); if(txtTyp==4) inpVal=str(lin$).equals("")?0:Integer.parseInt(str(lin$)); //Enter alone= 0 } //if(key5$=='\n' else{ if(key5$=='\b') inp$.setLength(Math.max(argLg,inp$.length()-1)); else if(txtTyp!=4 || "0123456789".indexOf(key5$)>=0) inp$.append(key5$); eq(lin$,inp$); g.setColor(hue(BrfFgd)); g.setFont(ltr); g.drawString(str(lin$).substring(txtCodLg),txtX,txtY); } //else(key5$=='\n' } //if(isLin if(txtTyp==2) inpVal=key5$=='\n'?0:+key5$-Asc0; key1$=key2$=key3$=key4$='?'; //~?lvl lmt if(x5==0) if(x4>0) key4$=key5$; else if(x3>0) key3$=key5$; else if(x2>0) key2$=key5$; else key1$=key5$; if(!isLin) go(); } //keyIn mth void go(){ //director/ switchboard routine: all keybd inp (and repaint()) is sent here - //these are those routines that accept key input //var lvl 1 routines if(x1==Sho4th) sho4th(); else if(x1==UseOpt) useOpt(); else endGam(); } //go mth - keybd inp is accepted/ listened for here; at called rout's rtn //var lvl 1 routines void sho4th(){ if(x1!=Sho4th) y1=1; switch(y1){ case 1: x1=Sho4th; y1++; /*~test lns for WayOut$ dta validation eq(xsA,WayOut$); for(B7=1;B7<65;B7++){ A$=(char)(B7+Asc0); eq(B7$,wrdOut(xsA,B7)); C7=B7$.length(); for(D7=0;D7 manl Resizable) for apps } //bdSiz mth void shoBd(){ //paint()-external graphics mth call forces complete redraw in AWT; // vs only clipping regions previously obscured by other windows Graphics g=getGraphics(); g.setColor(hue(BdBkg)); g.fillRect(0,0,bdWd,bdHt); g.setColor(hue(BdBdr)); g.drawRect(0,0,bdWd,bdHt); g.drawRect(0,vuHt,ioWd,ioHt+2); //~ shoPfl(1); } //shoBd mth void shoFrc(){ if(kntPth$.length()>63){ //vs incidental calls zonWd=ioWd/16; /*~ for(A6=0;A6<8;A6++){ A$=(char)(+'!'+A6); txt("1"+A$+"1 "+A6); } //for(A6=0; //*/ pthFrk$.setLength(0); //prep eval info eq(xsA,WayOut$); for(A6=0;A6<64;A6++){ B6=dij(kntPth$,A6); eq(A6$,wrdOut(xsA,B6)); C6=A6$.length(); E6=C; for(D6=0;D6A6+1 && F60?":"+C6:"")); } //for(A6=0; zonWd=ioWd/6; } //if(kntPth$.length()>63 /*~ for(A6=figGrp;A6=C7 && B7-G7=C7 } //for(F7=0; } //for(D7=0; C7=B7$.length(); if(C7>0) A7=dij(B7$,ran(C7)-1); //*/ } //for(B7=1; kntPth$.append((char)(A7+Asc0)); } //genPth mth - rtns: kntPth$ //var lvl 8 subroutines void txt(String dta$){ eq(lin$,dta$); eq(inp$,lin$); //note: lin$ & inp$ passed thru KeyListener argLg=lin$.length(); //note: argLg & txtTyp passed thru KeyListener txtTyp=dij(lin$,0); B8=dij(lin$,1); C8=dij(lin$,2); Graphics g=getGraphics(); txtX=(C8-1)*zonWd+bdrWd+1; txtY=vuHt+B8*ioHt/3-typHt/4+1; //~ioHt/4 for 4-line i/o if(txtTyp==0){ //clear rect space //clear from desig zone right & down to btm of area //~?-> redraw bdr for that whole area (which area: deter by line#) txtX--; txtY-=typHt*3/4; C8=ioHt-(B8-1)*typHt-1; B8=ioWd-txtX; g.setColor(hue(BrfBkg)); g.fillRect(txtX,txtY,B8,C8); //~g.setColor(StdHue[bdBdr]); //~g.drawRect(areaBdrx,areay,areawd,areaht); return; } //if(txtTyp==0 else{ g.setColor(hue(BrfFgd)); g.setFont(ltr); g.drawString(str(lin$).substring(txtCodLg),txtX,txtY); if(txtTyp==5){ //display in pseudo bold type g.drawString(str(lin$).substring(txtCodLg),txtX+1,txtY); txtTyp=1; } //if(txtTyp==5 } //else (txtTyp==0 isKey=false; if(txtTyp==2){ key5$=key4$=key3$=key2$=key1$='0'; //~default vals, in case of mouse click - nec? inpVal=0; //ini for KeyListener } //if(txtTyp==2 else if(txtTyp>2) isLin=true; //decl as false, & leaves keyTyped() false } //txt mth void dtaIn(int elm,int nth,String ins$){ eq(A8$,ins$); nthDiv(elm,nth); //note ini asgn: A9=elm; B9=nth insStr(z1$[A9],begDiv,endDiv,A8$); } //dtaIn mth //var lvl 9 subroutines int valOut(int elm,int num){ //db ary chk suite: pri() - locElm() - val/wrdOut() - nthDiv() A$=wrdOut(elm,num).charAt(0); //A9,B9 of nthDiv() return C9="+-0123456789".indexOf(A$)<0?0 :Integer.parseInt(str(A9$).substring(A$=='+'?1:0)); //A9$ of wrdOut() } //valOut mth String wrdOut(int elm,int num){ //db ary chk suite: pri() - locElm() - val/wrdOut() - nthDiv() //~if either elm or num outside expected bounds, rtn "?" nthDiv(elm,num); //note ini asgns: A9=elm, B9=num eq(A9$,str(z1$[A9]).substring(begDiv,endDiv)); return str(A9$); } //wrdOut mth void nthDiv(int elm,int nth){ //db ary chk suite: pri() - locElm() - val/wrdOut() - nthDiv() A9=elm; B9=nth; begDiv=0; for(C9=B9;C9>0;C9--){ endDiv=str(z1$[A9]).indexOf(Div$,begDiv); if(C9>1) if(endDiv==-1) ;//note error of nth>#Divs else begDiv=endDiv+1; } //for(C9=B9; if(endDiv==-1) endDiv=z1$[A9].length(); } //nthDiv mth - 1st field nth= 1 int ran(int num){ A9=num; if(A9<2) //+ or 0 only return B9=A9; B9=(int)(A9*Math.random()); return ++B9; //=(int)Math.floor(A9*Math.random()+1) } //ran mth - rtns: A9= rdm int in rng 1..num int dij(StringBuffer dta$,int loc){ return dij(str(dta$),loc); //note ini asgn: A9$=dta$, A9=loc } //dij mth w StringBuffer arg int dij(String dta$,int loc){ eq(A9$,dta$); A9=loc; return B9=+A9$.charAt(A9)-Asc0; } //dij mth w String arg //var lvl 0 subroutines Color hue(int val){ return StdHue[hues[val]]; } //hue mth void insStr(StringBuffer sbj$,int at,StringBuffer ins$){ insStr(sbj$,at,at,ins$); } //insStr mth void insStr(StringBuffer sbj$,int at,String ins$){ insStr(sbj$,at,at,ins$); } //insStr mth void insStr(StringBuffer sbj$,int at,int to,StringBuffer ins$){ insStr(sbj$,at,to,str(ins$)); } //insStr mth void insStr(StringBuffer sbj$,int at,int to,String ins$){ //~equiv to sbj$.delete(at,to); sbj$.insert(at,ins$) ~.delete,.insert useable? eq(A0$,sbj$); eqs(sbj$,str(A0$).substring(0,at)) //~note: A0$.substring() hangs browser .append(ins$) .append(str(A0$).substring(to)); } //insStr mth int sgn(int num){ A0=num; if(A0<0) A0=-1; if(A0>0) A0=1; return A0; } //sgn mth //StringBuffer <-> String utilities: /*~alt for asgn to $Bfr, to avoid use of local $ var: eq(a1$).append("ok"); StringBuffer eq(StringBuffer sbj$){ sbj$.setLength(0); return sbj$; } //eq mth //*/ StringBuffer eqs(int elm,StringBuffer obj$){ return eqs(z1$[elm],obj$); } //eqs fnc mth w int (array elm) arg StringBuffer eqs(StringBuffer sbj$,StringBuffer obj$){ return eqs(sbj$,str(obj$)); } //eqs fnc mth w StringBuffer arg StringBuffer eqs(int elm,String obj$){ return eqs(z1$[elm],obj$); } //eqs fnc mth w int (array elm) arg StringBuffer eqs(StringBuffer sbj$,String obj$){ eq(sbj$,obj$); return sbj$; } //eqs fnc mth w String arg void eq(int elm,StringBuffer obj$){ eq(z1$[elm],obj$); } //eq mth w int (array elm) arg void eq(StringBuffer sbj$,StringBuffer obj$){ eq(sbj$,str(obj$)); } //eq mth w StringBuffer arg void eq(int elm,String obj$){ eq(z1$[elm],obj$); } //eq mth w int (array elm) arg void eq(StringBuffer sbj$,String obj$){ sbj$.setLength(0); sbj$.append(obj$); } //eq mth w String arg String str(StringBuffer sbj$){ //When used without assigning= a String var, doesn't alloc mry to copy Buffer, //just refs existing Buffer (per API detail: Implementation advice) for efficiency. return sbj$.toString(); } //str fnc mth - cnv bfr to str: allows for str-only opns on bfr contents } //Ap Panel's cla