//--------------------------------------------------------------------// // 戦略シミュレーション ver.0.0 // // 2002/01/04 作成 樋口和宏 // //--------------------------------------------------------------------// // クラス一覧 // class WarSimulation メイン // class fieldPanel フィールド表示部分 // class ControlButton コントロールボタンクラス // class DataCore データ管理 // class Formation 部隊編成クラス // class Supply 部隊補給クラス // class ImageData イメージクラス // class FieldParts フィールド部品クラス // class Castle 城クラス // class Grid フィールドデータクラス // class Nation 国家クラス // class Division 部隊クラス // class Weapon 兵種クラス // class General 武将クラス // class FileFormatException ファイル書式例外処理 // class ClearFilter 指定した色を透明にするフィルタ // class halfClearFilter 半透明にするフィルタ // class drawDivision 部隊描画クラス //--------------------------------------------------------------------// import java.applet.*; import java.awt.*; import java.awt.event.*; import java.awt.image.*; import java.util.*; import java.io.*; import java.net.URL; //--------------------------------------------------------------------// // メイン public class WarSimulation extends Applet{ fieldPanel fpanel; Image template=null; MediaTracker mt=new MediaTracker(this); //--------------------------------------------------------------------// public void init(){ // データファイル名 String fname,iname,size; int imageSize=40; URL base=getDocumentBase(); fname=getParameter("data"); if(fname==null) fname="sumple.dat"; iname=getParameter("image"); if(iname==null) iname="template.gif"; size=getParameter("imagesize"); if(size!=null) imageSize=Integer.parseInt(size); setLayout(new BorderLayout()); getTemplateImage(iname); try{ mt.waitForAll(); fpanel=new fieldPanel(base,fname,template,imageSize); add("Center",fpanel); } catch(InterruptedException e){} } //--------------------------------------------------------------------// public void destroy(){ remove(fpanel); } //--------------------------------------------------------------------// void getTemplateImage(String iname){ // テンプレートイメージ読み込み URL ibase=getClass().getResource(iname); template=getToolkit().getImage(ibase); mt.addImage(template,0); } } //--------------------------------------------------------------------// // フィールド表示部分 class fieldPanel extends Panel implements Runnable,MouseListener,MouseMotionListener,KeyListener{ static final int LOCALMAP=0; // 画面モード static final int GLOBALMAP=1; static final int DIVISIONLIST=2; static final int NATIONLIST=3; static final int NATIONSELECT=0; // 状態スイッチ static final int PLAYERTURN=1; static final int SELECT=2; static final int MOVE=3; static final int ATTACK=4; static final int DIRECTION=5; static final int FORMATION=6; static final int EXCHANGE=7; static final int SUPPLY=8; static final int CONSTRUCT=9; static final int TRAINING=10; static final int TURNEND=11; static final int ENEMYTURN=12; static final int FOOD=0; // 編成 static final int MONEY=1; static final int SOLDIER=2; static final int DELTA=100; static final int MARGIN=5; // マージン DataCore dc; Thread viewThread=null; String errorMessage; // エラーメッセージ int fx,fy; // 地図表示サイズ・位置 int sy; // 文字表示高さ int indexViewRange; private Image bgImage; // ダブルバッファリング用イメージ private Graphics bg; int mapPoint=DataCore.NONE; // 地図上の位置 int currentIndex=0; int mousex=0,mousey=0; // マウス位置 int mapmode=LOCALMAP; // 画面モード int status=NATIONSELECT; // 状態スイッチ int waitTime=200,waitTime2=10,waitTime3=200; // 表示待ち時間 int attackAction=10; // 攻撃行動グラフィック表示回数 Color backColor=Color.black,textColor=Color.white; // 背景色・文字色 int fontSize=12; // 文字フォントサイズ int turn=0; // ターン数 int game=DataCore.GAME; boolean running=false; ControlButton move,attack,direction,formation,train,end,done; // ボタン ControlButton supply,construct,occupy; ControlButton constructFood,constructMoney,constructClass; ControlButton globalMap,divList,nationList,turnEnd; ControlButton yes,no; ControlButton decide,cancel; //--------------------------------------------------------------------// fieldPanel(URL base,String name,Image image,int imageSize){ getData(base,name,image,imageSize); dc.setViewPoint(0); setBackground(backColor); addMouseListener(this); addMouseMotionListener(this); addKeyListener(this); } //--------------------------------------------------------------------// void getData(URL base,String name,Image image,int imageSize){ // データ読み込み InputStream is=null; errorMessage=null; try{ is=new URL(base,name).openStream(); dc=new DataCore(is,image,imageSize,backColor,textColor); } catch(Exception e){ errorMessage=e.toString(); } try { if(is!=null) is.close(); } catch(Exception e){ } } //--------------------------------------------------------------------// void start(){ if(viewThread==null){ viewThread=new Thread(this); viewThread.start(); } } //--------------------------------------------------------------------// public void run(){ if(running) return; running=true; switch(status){ default: break; case MOVE: moveRun(); status=PLAYERTURN; break; case ATTACK: attackRun(); status=PLAYERTURN; break; case TRAINING: trainingRun(); status=PLAYERTURN; break; case ENEMYTURN: enemyTurnRun(); status=PLAYERTURN; break; } stop(); running=false; } //--------------------------------------------------------------------// void moveRun(){ // 移動行動 int i; if(dc.currentDivision!=DataCore.NONE){ for(i=dc.moving;i>0;i--){ dc.moveDraw(i-1); repaint(); try{ viewThread.sleep(waitTime); } catch(InterruptedException e){ } } dc.setDivViewPoint(dc.currentNation,dc.currentDivision); dc.moveDone(); repaint(); } } //--------------------------------------------------------------------// void attackRun(){ // 攻撃行動 int i; if(dc.currentDivision!=DataCore.NONE){ for(i=0;i=dc.nation[dc.currentNation].divisionNumber) EndOfDivision=true; } dc.nextNation(); if(dc.currentNation==0) nextTurn(); if(dc.currentNation==dc.playerNation) EnemyTurn=false; } if(game==DataCore.GAME){ dc.setCurrentDivision(dc.playerNation,DataCore.NONE); dc.setDivViewPoint(dc.playerNation,0); } repaint(); } //--------------------------------------------------------------------// void stop(){ viewThread=null; } //--------------------------------------------------------------------// public void mouseClicked(MouseEvent e){ } //--------------------------------------------------------------------// public void mousePressed(MouseEvent e){ int newpt; if(running) return; mousex=e.getX(); mousey=e.getY(); if(status==NATIONSELECT){ actionNationSelect(); } else if(status==EXCHANGE){ actionDivisionExchange(); } else if(status==SUPPLY){ actionSupply(); } else if(status==CONSTRUCT){ actionConstruct(); } else if(status==TURNEND){ actionTurnEnd(); } else{ switch(mapmode){ case LOCALMAP: newpt=dc.getMapPointLocal(mousex,mousey); if(newpt!=DataCore.NONE){ mapPoint=newpt; switch(status){ case PLAYERTURN: actionPlayerTurn(); break; case MOVE: actionMove(); break; case ATTACK: actionAttack(); break; case DIRECTION: actionDirection(); break; case FORMATION: actionFormation(); break; } } else{ if(globalMap.press(mousex,mousey)){ mapmode=GLOBALMAP; } else if(divList.press(mousex,mousey)){ mapmode=DIVISIONLIST; } else if(nationList.press(mousex,mousey)){ mapmode=NATIONLIST; } else if(turnEnd.press(mousex,mousey)){ status=TURNEND; } globalMap.Release(); divList.Release(); nationList.Release(); turnEnd.Release(); } break; case GLOBALMAP: actionGlobalMap(); break; case DIVISIONLIST: actionDivisionList(); break; case NATIONLIST: actionNationList(); break; } } repaint(); e.consume(); } //--------------------------------------------------------------------// void actionNationSelect(){ // 国家選択画面での行動 if(currentIndex=dc.viewSize || mousey>=dc.viewSize) return; FontMetrics fm=g.getFontMetrics(); sx=fm.stringWidth("移動")+MARGIN; nati=dc.grid[mapPoint].nation; div=dc.grid[mapPoint].division; x0=dc.gridSize*(dc.nation[nati].division[div].dx-dc.viewx +DataCore.GHALF); y0=dc.gridSize*(dc.nation[nati].division[div].dy-dc.viewy +DataCore.GHALF); if(x0<(int)(0.6*dc.viewSize)){ cx=x0+dc.gridSize+MARGIN; } else{ cx=x0-sx-MARGIN; } if(y0<(int)(0.6*dc.viewSize)){ cy[0]=y0+2; for(i=1;i<8;i++){ cy[i]=cy[i-1]+sy; } } else{ cy[7]=y0+dc.gridSize-sy-2; for(i=6;i>=0;i--){ cy[i]=cy[i+1]-sy; } } move=new ControlButton("移動",cx,cy[0],sx,sy); attack=new ControlButton("攻撃",cx,cy[1],sx,sy); direction=new ControlButton("方向",cx,cy[2],sx,sy); formation=new ControlButton("編成",cx,cy[3],sx,sy); train=new ControlButton("訓練",cx,cy[4],sx,sy); if(dc.gridNation(mapPoint)==dc.playerNation){ supply=new ControlButton("補給",cx,cy[5],sx,sy); construct=new ControlButton("建設",cx,cy[6],sx,sy); constructFood=new ControlButton("農業",cx,cy[0],sx,sy); constructMoney=new ControlButton("商業",cx,cy[1],sx,sy); constructClass=new ControlButton("城郭",cx,cy[2],sx,sy); end=new ControlButton("終了",cx,cy[7],sx,sy); } else if(dc.grid[mapPoint].castle){ occupy=new ControlButton("占領",cx,cy[5],sx,sy); end=new ControlButton("終了",cx,cy[6],sx,sy); } else{ end=new ControlButton("終了",cx,cy[5],sx,sy); } done=new ControlButton("済",cx,cy[2],sx,sy); } //--------------------------------------------------------------------// void setControlPanel(Graphics g){ // コントロールパネル設定 int sx1,sx2,sx3,sx4,x0,y0; FontMetrics fm=g.getFontMetrics(); sx1=fm.stringWidth("全体マップ")+MARGIN; sx2=fm.stringWidth("部隊一覧")+MARGIN; sx3=fm.stringWidth("国家一覧")+MARGIN; sx4=fm.stringWidth("ターン終了")+MARGIN; x0=dc.viewSize+MARGIN; y0=fy-2*sy-MARGIN; globalMap=new ControlButton("全体マップ",x0,y0,sx1,sy); divList=new ControlButton("部隊一覧",x0+sx1,y0,sx2,sy); nationList=new ControlButton("国家一覧",x0+sx1+sx2,y0,sx3,sy); turnEnd=new ControlButton("ターン終了",x0,y0+sy,sx4,sy); x0=fx/4-sx2/2; y0=(fy-sy)/2; yes=new ControlButton("はい",x0,y0,sx2,sy); no=new ControlButton("いいえ",x0+fx/2,y0,sx2,sy); } //--------------------------------------------------------------------// void setDecidePanel(Graphics g){ // 決定ボタンパネル設定 int sx,x0,x1,y0; FontMetrics fm=g.getFontMetrics(); sx=fm.stringWidth("決定")+MARGIN; x0=fx/4-sx/2; x1=x0+fx/2; y0=fy-sy-MARGIN; decide=new ControlButton("決定",x0,y0,sx,sy); cancel=new ControlButton("取消",x1,y0,sx,sy); } //--------------------------------------------------------------------// public void update(Graphics g){ if (dc!=null){ drawScreen(bg); g.drawImage(bgImage,0,0,this); } else if(errorMessage!=null){ drawError(g,errorMessage); } } //--------------------------------------------------------------------// public void paint(Graphics g){ setScreen(g); if (dc!=null){ dc.setGridSize(Math.min(fx,fy)); setControlPanel(bg); drawScreen(bg); g.drawImage(bgImage,0,0,this); } else if(errorMessage!=null){ drawError(g,errorMessage); } } //--------------------------------------------------------------------// void setScreen(Graphics g){ // 画面設定 Font font=new Font("Serif",Font.PLAIN,fontSize); g.setFont(font); fx=getSize().width; fy=getSize().height; bgImage=createImage(fx,fy); bg=bgImage.getGraphics(); bg.setFont(font); FontMetrics fm=bg.getFontMetrics(); sy=fm.getHeight()+MARGIN; indexViewRange=fy/sy; } //--------------------------------------------------------------------// void drawScreen(Graphics g){ // 画面描画 switch(game){ case DataCore.GAME: g.setColor(backColor); g.fillRect(0,0,fx,fy); switch(mapmode){ case LOCALMAP: drawLocalMap(g); break; case GLOBALMAP: drawGlobalMap(g); break; case DIVISIONLIST: drawDivisionList(g); break; case NATIONLIST: drawNationList(g); break; } break; case DataCore.GAMEOVER: drawError(g,"Game Over"); break; case DataCore.GAMEWIN: drawError(g,"You Win!"); break; } } //--------------------------------------------------------------------// void drawLocalMap(Graphics g){ // マップ描画 switch(status){ default: dc.drawLocalMap(g); dc.drawDivisionLocal(g,textColor); drawCursorLocal(g); if(mapPoint!=DataCore.NONE) dc.drawStatus(g,mapPoint,dc.viewSize+MARGIN,sy,fx-dc.viewSize,fy,sy); drawControlPanel(g); drawTurn(g); break; case NATIONSELECT: drawNationList(g); g.setColor(textColor); g.drawString("プレイヤーの国家を選んで下さい",MARGIN,fy-MARGIN); break; case SELECT: dc.drawLocalMap(g); dc.drawDivisionLocal(g,textColor); drawDivisionControlPanel(g); if(mapPoint!=DataCore.NONE) dc.drawStatus(g,mapPoint,dc.viewSize+MARGIN,sy,fx-dc.viewSize,fy,sy); drawControlPanel(g); drawTurn(g); break; case MOVE: dc.drawLocalMap(g); dc.drawDivisionLocal(g,textColor); dc.drawMoveDistance(g); drawCursorLocal(g); if(mapPoint!=DataCore.NONE) dc.drawStatus(g,mapPoint,dc.viewSize+MARGIN,sy,fx-dc.viewSize,fy,sy); drawControlPanel(g); drawTurn(g); break; case ATTACK: dc.drawLocalMap(g); dc.drawDivisionLocal(g,textColor); dc.drawAttackDistance(g); drawCursorLocal(g); if(mapPoint!=DataCore.NONE) dc.drawStatus(g,mapPoint,dc.viewSize+MARGIN,sy,fx-dc.viewSize,fy,sy); drawControlPanel(g); drawTurn(g); break; case DIRECTION: dc.drawLocalMap(g); dc.drawDivisionLocal(g,textColor); drawCursorLocal(g); if(mapPoint!=DataCore.NONE) dc.drawStatus(g,mapPoint,dc.viewSize+MARGIN,sy,fx-dc.viewSize,fy,sy); drawControlPanel(g); g.setColor(textColor); g.drawString("方向を指定して下さい",dc.viewSize+MARGIN,sy); break; case FORMATION: dc.drawLocalMap(g); dc.drawDivisionLocal(g,textColor); dc.drawFormationPlace(g); drawCursorLocal(g); if(mapPoint!=DataCore.NONE) dc.drawStatus(g,mapPoint,dc.viewSize+MARGIN,sy,fx-dc.viewSize,fy,sy); drawControlPanel(g); drawTurn(g); break; case EXCHANGE: drawDivisionExchange(g,MARGIN,sy,fx/2,sy); break; case SUPPLY: drawSupply(g,MARGIN,sy,fx/2,sy); break; case CONSTRUCT: dc.drawLocalMap(g); dc.drawDivisionLocal(g,textColor); drawConstructPanel(g); if(mapPoint!=DataCore.NONE) dc.drawStatus(g,mapPoint,dc.viewSize+MARGIN,sy,fx-dc.viewSize,fy,sy); drawControlPanel(g); drawTurn(g); break; case TURNEND: dc.drawLocalMap(g); dc.drawDivisionLocal(g,textColor); drawYesNoButton(g); g.setColor(textColor); g.drawString("行動を終了しますか?",dc.viewSize+MARGIN,sy); break; } } //--------------------------------------------------------------------// void drawGlobalMap(Graphics g){ // 全体マップ描画 dc.drawGlobalMap(g); dc.drawDivisionGlobal(g); drawCursorGlobal(g); if(mapPoint!=DataCore.NONE) dc.drawStatus(g,mapPoint,dc.viewSize+MARGIN,sy,fx-dc.viewSize,fy,sy); drawTurn(g); } //--------------------------------------------------------------------// void drawDivisionList(Graphics g){ // 部隊リスト描画 dc.drawDivisionList(g,sy); drawCursorDivisionList(g); } //--------------------------------------------------------------------// void drawNationList(Graphics g){ // 国家リスト描画 dc.drawNationList(g,sy); drawCursorNationList(g); } //--------------------------------------------------------------------// void drawDivisionExchange(Graphics g,int x0,int y0,int xhalf,int sy){ // 部隊編成画面描画 dc.drawDivisionExchange(g,x0,y0,xhalf,sy); drawCursorDivisionExchange(g); drawDecidePanel(g); } //--------------------------------------------------------------------// void drawSupply(Graphics g,int x0,int y0,int xhalf,int sy){ // 部隊補給画面描画 dc.drawSupply(g,x0,y0,xhalf,sy); drawCursorSupply(g); drawDecidePanel(g); } //--------------------------------------------------------------------// void drawTurn(Graphics g){ // ターン情報描画 FontMetrics fm=bg.getFontMetrics(); int sx1,sx2; sx1=fm.stringWidth(dc.nation[dc.currentNation].name)+dc.viewSize+2*MARGIN; sx2=sx1+fm.stringWidth("の戦略")+MARGIN; g.setColor(dc.nation[dc.currentNation].color); g.drawString(dc.nation[dc.currentNation].name,dc.viewSize+MARGIN,sy); g.setColor(textColor); g.drawString("の戦略",sx1,sy); g.drawString(" ターン "+turn,sx2,sy); } //--------------------------------------------------------------------// void drawDivisionControlPanel(Graphics g){ // 部隊コントロールパネル表示 int nati=dc.grid[mapPoint].nation,div=dc.grid[mapPoint].division; switch(dc.nation[nati].division[div].status){ case Division.WAIT: move.draw(g,backColor,textColor); attack.draw(g,backColor,textColor); direction.draw(g,backColor,textColor); formation.draw(g,backColor,textColor); train.draw(g,backColor,textColor); end.draw(g,backColor,textColor); if(dc.gridNation(mapPoint)==dc.playerNation){ supply.draw(g,backColor,textColor); construct.draw(g,backColor,textColor); } else if(dc.grid[mapPoint].castle){ occupy.draw(g,backColor,textColor); } break; case Division.MOVED: attack.draw(g,backColor,textColor); direction.draw(g,backColor,textColor); formation.draw(g,backColor,textColor); train.draw(g,backColor,textColor); end.draw(g,backColor,textColor); if(dc.gridNation(mapPoint)==dc.playerNation){ supply.draw(g,backColor,textColor); construct.draw(g,backColor,textColor); } else if(dc.grid[mapPoint].castle){ occupy.draw(g,backColor,textColor); } break; case Division.DONE: done.draw(g,backColor,textColor); break; } } //--------------------------------------------------------------------// void drawConstructPanel(Graphics g){ // 建設パネル表示 constructFood.draw(g,backColor,textColor); constructMoney.draw(g,backColor,textColor); constructClass.draw(g,backColor,textColor); } //--------------------------------------------------------------------// void drawControlPanel(Graphics g){ // コントロールパネル表示 globalMap.draw(g,backColor,textColor); divList.draw(g,backColor,textColor); nationList.draw(g,backColor,textColor); turnEnd.draw(g,backColor,textColor); } //--------------------------------------------------------------------// void drawYesNoButton(Graphics g){ // Yes/Noパネル表示 yes.draw(g,backColor,textColor); no.draw(g,backColor,textColor); } //--------------------------------------------------------------------// void drawDecidePanel(Graphics g){ // 決定ボタンパネル表示 decide.draw(g,backColor,textColor); cancel.draw(g,backColor,textColor); } //--------------------------------------------------------------------// void drawCursorLocal(Graphics g){ // カーソルの描画 int x0,y0; if(mousex>=dc.viewSize || mousey>=dc.viewSize) return; x0=(mousex/dc.gridSize)*dc.gridSize; y0=(mousey/dc.gridSize)*dc.gridSize; g.drawImage(dc.img.partImage[ImageData.CURSOR],x0,y0,this); } //--------------------------------------------------------------------// void drawCursorGlobal(Graphics g){ // 全体マップでのカーソルの描画 int x0,y0,x1,y1,cx,cy; if(mousex>=dc.viewSize || mousey>=dc.viewSize) return; cx=dc.gridSize2*DataCore.GRID; cy=dc.gridSize2*DataCore.GRID; x0=(mousex/dc.gridSize2)*dc.gridSize2; x0=Math.min(Math.max(x0,cx/2),dc.gridSize2*dc.nx-cx/2); y0=(mousey/dc.gridSize2)*dc.gridSize2; y0=Math.min(Math.max(y0,cy/2),dc.gridSize2*dc.ny-cy/2); x1=x0-cx/2; y1=y0-cy/2; g.setColor(textColor); g.drawRect(x1,y1,cx,cy); g.drawRect(x1+1,y1+1,cx-2,cy-2); } //--------------------------------------------------------------------// void drawCursorDivisionList(Graphics g){ // 部隊リストでのカーソルの描画 int x0,y0; x0=1; if(currentIndex=viewSize || y>=viewSize) return NONE; ix=Math.min(Math.max(x/gridSize+viewx-GHALF,0),nx-1); iy=Math.min(Math.max(y/gridSize+viewy-GHALF,0),ny-1); pt=nx*iy+ix; return pt; } //--------------------------------------------------------------------// int getMapPointGlobal(int x,int y){ // 全体マップでのフィールド位置の獲得 int ix=0,iy=0,pt; if(x>=viewSize || y>=viewSize) return NONE; ix=Math.min(Math.max(x/gridSize2,0),nx-1); iy=Math.min(Math.max(y/gridSize2,0),ny-1); pt=nx*iy+ix; return pt; } //--------------------------------------------------------------------// int gridNation(int point){ // 領有している国家 if(grid[point].castle){ return castle[grid[point].field].nation; } else{ return DataCore.NONE; } } //--------------------------------------------------------------------// void setDirection(int point){ // 部隊方向の設定 int dx,dy,direc; dx=grid[point].x-nation[currentNation].division[currentDivision].dx; dy=grid[point].y-nation[currentNation].division[currentDivision].dy; if(Math.abs(dx)>Math.abs(dy)){ if(dx>0) direc=EAST; else direc=WEST; } else{ if(dy>0) direc=SOUTH; else direc=NORTH; } nation[currentNation].setDirection(currentDivision,direc); } //--------------------------------------------------------------------// void setCurrentDivision(int nation,int div){ // 行動中の国家の設定 currentNation=nation; currentDivision=div; } //--------------------------------------------------------------------// void setMoveDistance(int nati,int div){ // 部隊移動可能範囲の設定 clearMoveDistance(); FindDistance(nation[nati].division[div].dx,nation[nati].division[div].dy ,nation[nati].division[div].move); } //--------------------------------------------------------------------// boolean setMoveDistance(int pt){ // 部隊移動可能範囲の設定 int nati=grid[pt].nation,div=grid[pt].division; if(nati==currentNation && div!=NONE){ currentDivision=div; clearMoveDistance(); FindDistance(nation[nati].division[div].dx,nation[nati].division[div].dy ,nation[nati].division[div].move); return true; } else{ currentDivision=NONE; return false; } } //--------------------------------------------------------------------// void FindDistance(int x,int y,int dist){ // 移動可能範囲の計算 int xy,dnew; xy=y*nx+x; grid[xy].setMoveDistance(Math.max(grid[xy].moveDistance,dist)); if(dist==0) return; if(y>0 && CheckMove(xy-nx,dist)){ dnew=dist-Mobility(xy-nx); FindDistance(x,y-1,dnew); } if(y0 && CheckMove(xy-1,dist)){ dnew=dist-Mobility(xy-1); FindDistance(x-1,y,dnew); } if(x=0){ if(grid[xy].division==NONE && dist>=Mobility(xy)){ if(grid[xy].moveDistance=0){ moveDivision(grid[point].x,grid[point].y,grid[point].moveDistance); } else{ currentDivision=NONE; } } //--------------------------------------------------------------------// void moveDivision(int x,int y,int dist){ // 部隊移動の計算 int xy; while(dist!=nation[currentNation].division[currentDivision].move){ xy=y*nx+x; movingPoint[moving]=xy; dist+=Mobility(xy); if(y>0 && grid[xy-nx].moveDistance==dist){ movingDirection[moving]=SOUTH; y--; } else if(y0 && grid[xy-1].moveDistance==dist){ movingDirection[moving]=EAST; x--; } else if(x0 && CheckAttack(xy-nx,dist)){ FindAttack(x,y-1,dnew); } if(y0 && CheckAttack(xy-1,dist)){ FindAttack(x-1,y,dnew); } if(x=0){ if(grid[xy].nation!=currentNation){ if(dist>0 && grid[xy].attackDistance=0){ dx=grid[point].x-nation[currentNation].division[currentDivision].dx; dy=grid[point].y-nation[currentNation].division[currentDivision].dy; if(Math.abs(dx)>Math.abs(dy)){ if(dx>0) direc=EAST; else direc=WEST; } else{ if(dy>0) direc=SOUTH; else direc=NORTH; } nation[currentNation].setDirection(currentDivision,direc); attackedNation=nati; attackedDivision=div; return; } } currentDivision=NONE; } //--------------------------------------------------------------------// void setAttackDivision(int point,int nati,int div){ // 部隊攻撃の設定 int dx,dy,direc; if(nati!=currentNation && div!=NONE){ dx=grid[point].x-nation[currentNation].division[currentDivision].dx; dy=grid[point].y-nation[currentNation].division[currentDivision].dy; if(Math.abs(dx)>Math.abs(dy)){ if(dx>0) direc=EAST; else direc=WEST; } else{ if(dy>0) direc=SOUTH; else direc=NORTH; } nation[currentNation].setDirection(currentDivision,direc); attackedNation=nati; attackedDivision=div; } } //--------------------------------------------------------------------// void attackDraw(int step){ // 部隊攻撃描画 battle=!battle; } //--------------------------------------------------------------------// void attackCalculate(){ // 部隊攻撃ダメージ計算 double directionCoefficient; int i,direc; int attack1,defense1,field1,damage1,direc1; int attack2,defense2,field2,damage2,direc2; attack1=nation[currentNation].division[currentDivision].attack; defense1=nation[currentNation].division[currentDivision].defense; field1=divisionFieldEffect(currentNation,currentDivision); direc1=nation[currentNation].division[currentDivision].direction; attack2=nation[attackedNation].division[attackedDivision].attack; defense2=nation[attackedNation].division[attackedDivision].defense; field2=divisionFieldEffect(attackedNation,attackedDivision); direc2=nation[attackedNation].division[attackedDivision].direction; direc=(direc1-direc2+4)%4; switch(direc){ default: // 側面攻撃 directionCoefficient=SIDECOEF; break; case 0: // 背後からの攻撃 directionCoefficient=BACKCOEF; break; case 2: // 正面攻撃 directionCoefficient=FRONTCOEF; break; } damage1=attack1/(int)(directionCoefficient*defense2*field2); damage2=(int)(directionCoefficient*(attack2/(defense1*field1))); nation[attackedNation].Damage(attackedDivision,damage1); if(nation[currentNation].division[currentDivision].weapon.counter){ nation[currentNation].Damage(currentDivision,damage2); } deleteDivision(attackedNation,attackedDivision); deleteDivision(currentNation,currentDivision); battle=false; attackedDivision=NONE; } //--------------------------------------------------------------------// void deleteDivision(int nati,int div){ // 部隊削除 int i,j,ndiv,ip; if(nation[nati].division[div].number==0){ grid[divisionPoint(nati,div)].setDivision(NONE,NONE); for(i=div+1;i=Division.GENERAL || ndiv==div) && ndiv0 && CheckFormation(xy-nx)){ grid[xy-nx].setFormationPlace(); } if(y0 && CheckFormation(xy-1)){ grid[xy-1].setFormationPlace(); } if(x=0){ if(grid[xy].division==NONE){ return true; } else if(grid[xy].nation==currentNation && nation[currentNation].CheckFormation(currentDivision,grid[xy].division)){ return true; } } return false; } //--------------------------------------------------------------------// void setFormationDivision(int point){ // 編成部隊の設定 int nati=grid[point].nation,div=grid[point].division,dx,dy,direc; if(grid[point].formation){ formDivision1=currentDivision; formDivision2=grid[point].division; } else{ currentDivision=NONE; } } //--------------------------------------------------------------------// void clearFormation(){ // 編成部隊選択の解除 int i; for(i=0;i0 && formation.formDivision2.number>0){ nation[currentNation].resetDivision(formDivision1,formation.formDivision1); if(formDivision2==NONE){ formDivision2=nation[currentNation].divisionNumber; nation[currentNation].addDivision(formDivision2,formation.formDivision2); grid[point].setDivision(currentNation,formDivision2); } else{ nation[currentNation].resetDivision(formDivision2,formation.formDivision2); } currentDivision=formDivision2; actionDone(); currentDivision=formDivision1; actionDone(); } else if(formation.formDivision1.number==0 && formation.formDivision1.generalNumber==0){ if(formDivision2!=NONE){ nation[currentNation].resetDivision(formDivision1,formation.formDivision1); nation[currentNation].resetDivision(formDivision2,formation.formDivision2); currentDivision=formDivision2; actionDone(); deleteDivision(currentNation,formDivision1); } } else if(formation.formDivision2.number==0 && formation.formDivision2.generalNumber==0){ if(formDivision2!=NONE){ nation[currentNation].resetDivision(formDivision1,formation.formDivision1); nation[currentNation].resetDivision(formDivision2,formation.formDivision2); currentDivision=formDivision1; actionDone(); deleteDivision(currentNation,formDivision2); } } formationCancel(); } //--------------------------------------------------------------------// void formationCancel(){ // 部隊編成の取消 formation=null; formDivision1=NONE; formDivision2=NONE; } //--------------------------------------------------------------------// void setSupply(int point){ // 部隊補給の設定 if(grid[point].castle){ supply=new Supply(nation[currentNation].division[currentDivision] ,castle[grid[point].field]); } } //--------------------------------------------------------------------// void foodSupply(int direc,int food){ // 兵糧補給 if(supply!=null){ switch(direc){ case 0: supply.foodDivisionToCastle(food); break; case 1: supply.foodCastleToDivision(food); break; } } } //--------------------------------------------------------------------// void moneySupply(int direc,int money){ // 資金補給 if(supply!=null){ switch(direc){ case 0: supply.moneyDivisionToCastle(money); break; case 1: supply.moneyCastleToDivision(money); break; } } } //--------------------------------------------------------------------// void soldierSupply(int point){ // 募兵 if(supply!=null){ supply.soldierSupply(); supplySet(point); } } //--------------------------------------------------------------------// void supplySet(int point){ // 部隊補給の決定 if(supply!=null){ nation[currentNation].resetDivision(currentDivision,supply.division); castle[grid[point].field]=new Castle(supply.castle); castle[grid[point].field].setNation(supply.castle.nation ,supply.castle.nationColor); actionDone(); supplyCancel(); } } //--------------------------------------------------------------------// void supplyCancel(){ // 部隊補給の取消 supply=null; } //--------------------------------------------------------------------// void constructFoodProduct(int point){ // 城の農業開発 if(castle[grid[point].field].foodProduct=COST){ nation[currentNation].useMoney(currentDivision,COST); castle[grid[point].field].constructFoodProduct (nation[currentNation].division[currentDivision].Construct()); actionDone(); } } //--------------------------------------------------------------------// void constructMoneyProduct(int point){ // 城の商業開発 if(castle[grid[point].field].moneyProduct=COST){ nation[currentNation].useMoney(currentDivision,COST); castle[grid[point].field].constructMoneyProduct (nation[currentNation].division[currentDivision].Construct()); actionDone(); } } //--------------------------------------------------------------------// void constructCastleClass(int point){ // 城の規模拡大 if(castle[grid[point].field].castleClass=COST){ nation[currentNation].useMoney(currentDivision,COST); castle[grid[point].field].constructCastleClass (nation[currentNation].division[currentDivision].Construct()); actionDone(); } } //--------------------------------------------------------------------// boolean Training(){ // 部隊訓練 if(nation[currentNation].division[currentDivision].train =0){ setAttackDistance(i,div); for(j=0;j=0 && grid[j].division!=NONE){ point=grid[i].moveDistance-grid[j].attackDistance; if(point>evalPoint){ evalPoint=point; moveTarget=i; attackedNation=grid[j].nation; attackedDivision=grid[j].division; } } } } } } //--------------------------------------------------------------------// void allWait(){ // 全部隊待機状態 int i; for(i=0;i=0 && grid[ii].division!=currentDivision){ g.drawImage(img.partImage[ImageData.SELECT],x0,y0,this); } ii++; } jj++; } } //--------------------------------------------------------------------// void drawAttackDistance(Graphics g){ // 攻撃可能範囲の描画 int i,j,ii,jj,gxy,x0,y0; jj=viewy-GHALF; for(j=0;j=0 && grid[ii].division!=currentDivision){ g.drawImage(img.partImage[ImageData.SELECT],x0,y0,this); } ii++; } jj++; } } //--------------------------------------------------------------------// void drawFormationPlace(Graphics g){ // 編成可能位置の描画 int i,j,ii,jj,gxy,x0,y0; jj=viewy-GHALF; for(j=0;j0){ y0+=sy; nation[i].drawNationList(g,x0,y0); } } } //--------------------------------------------------------------------// void drawDivisionList(Graphics g,int sy){ // 部隊リストの描画 int i,x0=5,y0=0; for(i=0;i0 && formDivision2.generalNumber0 && formDivision1.generalNumber=division.weapon.cost){ division.useMoney(division.weapon.cost); division.SupplySoldier(soldier,NEWSOLDIER); } } //--------------------------------------------------------------------// void drawSupply(Graphics g,int x0,int y0,int xhalf,int sy){ // 部隊補給の描画 division.drawDivisionExchange(g,x0,y0,sy); castle.drawSupply(g,x0+xhalf,y0,sy); } } //--------------------------------------------------------------------// // イメージクラス class ImageData extends Panel{ static final int CURSOR=0; // カーソル部品 static final int SELECT=1; // 選択範囲部品 static final int NMAX=100; // テンプレート大きさ・部品数の上限 int nx,ny,number; // テンプレート内の部品数 Image partImage[]=new Image[NMAX]; // 部品イメージ ImageData(Image image,int partSize){ nx=image.getWidth(this)/partSize; ny=image.getHeight(this)/partSize; number=Math.min(nx*ny,NMAX); makePartImage(image,partSize); BlackToClear(CURSOR); halfClear(SELECT); } //--------------------------------------------------------------------// void makePartImage(Image image,int partSize){ // イメージ部品取り出し int i,x0,y0; for(i=0;i0){ for(i=0;i=GENERAL) return; general[generalNumber]=gen; generalNumber++; setParameter(); } //--------------------------------------------------------------------// void deleteGeneral(int del){ // 部隊所属将軍の削除 int i; generalNumber--; for(i=del;i