/** *納豆天国Presents *"Comix Dungeon 2" */ import java.applet.*; import java.awt.*; import java.awt.image.*; import java.util.*; /** *クラス"ComixDungeon2" *ComixDungeon2アプレットの本体 */ public class ComixDungeon2 extends Applet{ /** *乱数発生器 */ static final Random random = new Random(); /** *方向指定用の定数 */ static final int NORTH = 0; static final int SOUTH = 1; static final int WEST = 2; static final int EAST = 3; /** *階層ごとの敵のテーブル */ static final int[][] ENEMY_TABLE = { {ComixDungeonCharactor.G_SLIME,ComixDungeonCharactor.L_MOUSE}, {ComixDungeonCharactor.G_SLIME,ComixDungeonCharactor.L_MOUSE,ComixDungeonCharactor.F_MAGE}, {ComixDungeonCharactor.L_MOUSE,ComixDungeonCharactor.F_MAGE,ComixDungeonCharactor.R_SLIME}, {ComixDungeonCharactor.F_MAGE,ComixDungeonCharactor.R_SLIME,ComixDungeonCharactor.N_YASAI}, {ComixDungeonCharactor.F_MAGE,ComixDungeonCharactor.N_YASAI,ComixDungeonCharactor.S_MOUSE,ComixDungeonCharactor.C_SPIRIT}, {ComixDungeonCharactor.N_YASAI,ComixDungeonCharactor.S_MOUSE,ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.I_MAGE}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.I_MAGE,ComixDungeonCharactor.S_YASAI}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.I_MAGE,ComixDungeonCharactor.S_YASAI,ComixDungeonCharactor.C_SLIME,ComixDungeonCharactor.B_SPIRIT}, {ComixDungeonCharactor.S_DAKKI}, {ComixDungeonCharactor.D_KNIGHT}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.C_SLIME,ComixDungeonCharactor.B_SPIRIT,ComixDungeonCharactor.S_DAKKI,ComixDungeonCharactor.D_KNIGHT}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.C_SLIME,ComixDungeonCharactor.B_SPIRIT,ComixDungeonCharactor.Z_BIODOG}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.C_SLIME,ComixDungeonCharactor.Z_BIODOG,ComixDungeonCharactor.L_MAGE}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.C_SLIME,ComixDungeonCharactor.Z_BIODOG,ComixDungeonCharactor.L_MAGE,ComixDungeonCharactor.F_DEVIL}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.Z_BIODOG,ComixDungeonCharactor.L_MAGE,ComixDungeonCharactor.F_DEVIL,ComixDungeonCharactor.D_DEVIL}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.L_MAGE,ComixDungeonCharactor.F_DEVIL,ComixDungeonCharactor.D_DEVIL,ComixDungeonCharactor.C_BIODOG}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.F_DEVIL,ComixDungeonCharactor.D_DEVIL,ComixDungeonCharactor.C_BIODOG,ComixDungeonCharactor.E_MOUSE}, {ComixDungeonCharactor.C_SPIRIT,ComixDungeonCharactor.E_MOUSE,ComixDungeonCharactor.U_DEVIL}, {ComixDungeonCharactor.C_SPIRIT}, {ComixDungeonCharactor.U_SPIRIT} }; /** *アイテムの出現率表 */ static final int[][] ITEM_POSSIBILITY = { {140,ComixDungeonItem.W_STICK}, {120,ComixDungeonItem.W_SPIKEDCLUB}, {100,ComixDungeonItem.W_STONEAXE}, {80,ComixDungeonItem.W_BRONZESPEAR}, {60,ComixDungeonItem.W_IRONSWORD}, {40,ComixDungeonItem.W_SILVERSWORD}, {20,ComixDungeonItem.W_DIAMONDSWORD}, {5,ComixDungeonItem.W_GOLDBAT}, {70,ComixDungeonItem.A_LEATHER}, {60,ComixDungeonItem.A_SCALE}, {50,ComixDungeonItem.A_RING}, {40,ComixDungeonItem.A_BRONZE}, {30,ComixDungeonItem.A_IRON}, {20,ComixDungeonItem.A_SILVER}, {10,ComixDungeonItem.A_DIAMOND}, {5,ComixDungeonItem.A_GOLD}, {250,ComixDungeonItem.M_PORK}, {100,ComixDungeonItem.M_BEEF}, {250,ComixDungeonItem.B_HEALING}, {100,ComixDungeonItem.B_HEALINGTWO}, {250,ComixDungeonItem.B_FIRE}, {150,ComixDungeonItem.B_ICE}, {50,ComixDungeonItem.B_LIGHTNING}, {150,ComixDungeonItem.B_CONFUSING}, {150,ComixDungeonItem.B_TURNBACK}, {50,ComixDungeonItem.B_CANCELING}, {50,ComixDungeonItem.B_BIO} }; /** *ボスのしゃべり用フラグ */ static final int BOSS_ATTACK = 0; static final int BOSS_DAMAGE = 1; static final int BOSS_DEATH = 2; /** *最下層 */ static final int LAST_STORY = 20; /** *現在のマップ */ private ComixDungeonMazeMap cdmm; /** *現在の階層 */ private int story; /** *現在のX座標 */ private int yourX; /** *現在のY座標 */ private int yourY; /** *プレイヤーのキャラクター */ private ComixDungeonCharactor yourCDC; /** *ボス敵のキャラクター */ private ComixDungeonCharactor bossCDC; /** *姜子牙 */ private ComixDungeonCharactor shigaCDC; /** *ラスボス用フラグ */ private int lastBoss; /** *現在の体力 */ private int yourVit; /** *装備している武器 */ private ComixDungeonItem exw; /** *装備している防具 */ private ComixDungeonItem exa; /** *ダンジョン表示用のキャンバス */ private ComixDungeonMainCanvas cdmc; /** *コントロールパネル */ private ComixDungeonControlPanel cdcp; /** *オートマップ */ private ComixDungeonMapCanvas cdmc2; /** *アイテムパネル */ private ComixDungeonItemPanel cdip; /** *敵処理用スタック */ private Stack enemyX,enemyY; /** *ゲームオーバー判定ブール値 */ private boolean gameOver; /** *メソッド"init" *アプレットのイニシャライザ *表示キャンバス、操作パネル、オートマップ、メッセージボックスを貼り付ける */ public void init(){ story = 1; yourCDC = new ComixDungeonCharactor(ComixDungeonCharactor.YOU); yourVit = 1000; exw = null; exa = null; enemyX = new Stack(); enemyY = new Stack(); bossCDC = null; shigaCDC = null; lastBoss = -1; newMap(); setLayout(new GridLayout(2,2)); Image img = createImage(4800,400); Image dlImage = getImage(getCodeBase(),"graphics.gif"); MediaTracker mt = new MediaTracker(this); mt.addImage(dlImage,0); mt.checkID(0,true); while(!mt.checkID(0)){} img.getGraphics().drawImage(dlImage,0,0,this); cdmc = new ComixDungeonMainCanvas(createImage(200,200),img); cdmc.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); add(cdmc); cdcp = new ComixDungeonControlPanel(); cdcp.labelUpdate(yourCDC.getHP(),yourCDC.getMaxHP(),yourVit,story,yourCDC.getEx()); add(cdcp); cdmc2 = new ComixDungeonMapCanvas(20,20); cdmc2.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); add(cdmc2); cdip = new ComixDungeonItemPanel(); cdip.addItem(new ComixDungeonItem(ComixDungeonItem.M_BEEF)); add(cdip); gameOver = false; } /** *メソッド"action" *すでにJava最新版ではやっちゃあいけないイベント処理なんだけどなぁ *でもそれだと古いバージョンだと動かないから仕方ないよね */ public boolean action(Event e,Object o){ if(gameOver){ story = 1; yourCDC = new ComixDungeonCharactor(ComixDungeonCharactor.YOU); yourVit = 1000; exw = null; exa = null; enemyX = new Stack(); enemyY = new Stack(); bossCDC = null; shigaCDC = null; lastBoss = -1; newMap(); cdmc.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); cdcp.labelUpdate(yourCDC.getHP(),yourCDC.getMaxHP(),yourVit,story,yourCDC.getEx()); cdcp.resetText(); cdmc2.imageReset(20,20); cdmc2.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); cdip.resetList(); cdip.addItem(new ComixDungeonItem(ComixDungeonItem.M_BEEF)); gameOver = false; return true; }else if(lastBoss > 9){ cdmc.endingImage(lastBoss); cdmc2.imageReset(20,20); cdmc2.repaint(); cdcp.resetText(); switch(lastBoss){ case 10: cdcp.writeText("秘宝に封印されていた邪神を"); cdcp.writeText("ついに倒した"); break; case 11: cdcp.writeText("秘宝を持って洞窟を出て"); cdcp.writeText("事の一部始終を語り歩いた"); break; case 12: cdcp.writeText("そして英雄として称えられ"); cdcp.writeText("新しい王朝の王となった"); break; case 13: cdcp.writeText("ComixDungeon2開発陣"); break; case 14: cdcp.writeText("総監督"); cdcp.writeText("納豆神"); break; case 15: cdcp.writeText("プログラム"); cdcp.writeText("納豆神"); break; case 16: cdcp.writeText("グラフィック"); cdcp.writeText("納豆神"); break; case 17: cdcp.writeText("テストプレイヤ"); cdcp.writeText("お茶っぽい"); break; case 18: cdcp.writeText("「...邪神は生きている」"); cdcp.writeText("「そして歴史は繰り返す」"); break; case 19: cdcp.writeText("「この王朝も邪神の前に」"); cdcp.writeText("「滅びる定めなのだ」"); break; case 20: cdcp.writeText("ComixDungeon2"); cdcp.writeText("未完"); lastBoss--; break; } lastBoss++; }else if(yourCDC.getConfused() != 0){ cdcp.resetText(); yourCDC.addConfused(-1); int upperX = 0; int upperY = 0; switch(yourCDC.getDirection()){ case ComixDungeon2.NORTH: upperY = -1; break; case ComixDungeon2.SOUTH: upperY = 1; break; case ComixDungeon2.WEST: upperX = -1; break; case ComixDungeon2.EAST: upperX = 1; break; } int cym = 0; if(cdmm.getGrid(yourX + upperX,yourY + upperY).isWall()){ cym = (Math.abs(random.nextInt() % 3) + 1); }else{ cym = Math.abs(random.nextInt() % 4); } switch(cym){ case 0: if(cdmm.getGrid(yourX + upperX,yourY + upperY).getCharactor() != null){ attack(yourCDC,cdmm.getGrid(yourX + upperX,yourY + upperY).getCharactor()); }else{ yourX += upperX; yourY += upperY; } break; case 1: yourCDC.setDirection(ComixDungeonCharactor.LEFT); break; case 2: yourCDC.setDirection(ComixDungeonCharactor.RIGHT); break; case 3: yourCDC.setDirection(ComixDungeonCharactor.BACK); break; } enemyTurn(); return true; }else if(e.target == ComixDungeonControlPanel.GO){ cdcp.resetText(); switch(yourCDC.getDirection()){ case NORTH: if(!(cdmm.getGrid(yourX,yourY - 1).isWall()) && cdmm.getGrid(yourX,yourY - 1).getCharactor() == null){ yourY--; enemyTurn(); }else if(cdmm.getGrid(yourX,yourY - 1).getCharactor() != null && cdmm.getGrid(yourX,yourY - 1).getCharactor().isClear()){ cdcp.writeText("何かにぶつかったような気がした"); enemyTurn(); } break; case SOUTH: if(!(cdmm.getGrid(yourX,yourY + 1).isWall()) && cdmm.getGrid(yourX,yourY + 1).getCharactor() == null){ yourY++; enemyTurn(); }else if(cdmm.getGrid(yourX,yourY + 1).getCharactor() != null && cdmm.getGrid(yourX,yourY + 1).getCharactor().isClear()){ cdcp.writeText("何かにぶつかったような気がした"); enemyTurn(); } break; case WEST: if(!(cdmm.getGrid(yourX - 1,yourY).isWall()) && cdmm.getGrid(yourX - 1,yourY).getCharactor() == null){ yourX--; enemyTurn(); }else if(cdmm.getGrid(yourX - 1,yourY).getCharactor() != null && cdmm.getGrid(yourX - 1,yourY).getCharactor().isClear()){ cdcp.writeText("何かにぶつかったような気がした"); enemyTurn(); } break; case EAST: if(!(cdmm.getGrid(yourX + 1,yourY).isWall()) && cdmm.getGrid(yourX + 1,yourY).getCharactor() == null){ yourX++; enemyTurn(); }else if(cdmm.getGrid(yourX + 1,yourY).getCharactor() != null && cdmm.getGrid(yourX + 1,yourY).getCharactor().isClear()){ cdcp.writeText("何かにぶつかったような気がした"); enemyTurn(); } } return true; }else if(e.target == ComixDungeonControlPanel.LEFT){ cdcp.resetText(); yourCDC.setDirection(ComixDungeonCharactor.LEFT); enemyTurn(); return true; }else if(e.target == ComixDungeonControlPanel.RIGHT){ cdcp.resetText(); yourCDC.setDirection(ComixDungeonCharactor.RIGHT); enemyTurn(); return true; }else if(e.target == ComixDungeonControlPanel.BACK){ cdcp.resetText(); yourCDC.setDirection(ComixDungeonCharactor.BACK); enemyTurn(); return true; }else if(e.target == ComixDungeonControlPanel.ATTACK){ int upperX = 0; int upperY = 0; cdcp.resetText(); switch(yourCDC.getDirection()){ case ComixDungeon2.NORTH: upperY = -1; break; case ComixDungeon2.SOUTH: upperY = 1; break; case ComixDungeon2.WEST: upperX = -1; break; case ComixDungeon2.EAST: upperX = 1; } ComixDungeonCharactor inrCDC = cdmm.getGrid(yourX + upperX,yourY + upperY).getCharactor(); if(inrCDC != null){ attack(yourCDC,inrCDC); } enemyTurn(); return true; }else if(e.target == ComixDungeonItemPanel.USE){ cdcp.resetText(); if(ComixDungeonItemPanel.LIST.getSelectedIndex() == -1){ cdcp.writeText("アイテムを選択してください"); }else{ ComixDungeonItem cdi = cdip.getItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); int cdit = cdi.getType(); if(cdit - ComixDungeonItem.WEAPON < 100){ if(cdi == exw){ exw = null; cdcp.writeText(cdi.getName() + "の装備をはずした"); enemyTurn(); }else if(exw == null){ exw = cdi; cdcp.writeText(cdi.getName() + "を装備した"); enemyTurn(); }else{ cdcp.writeText("装備をはずしてください"); } }else if(cdit - ComixDungeonItem.ARMOR < 100){ if(cdi == exa){ exa = null; cdcp.writeText(cdi.getName() + "の装備をはずした"); enemyTurn(); }else if(exa == null){ exa = cdi; cdcp.writeText(cdi.getName() + "を装備した"); enemyTurn(); }else{ cdcp.writeText("装備をはずしてください"); } }else if(cdit - ComixDungeonItem.MEAT < 100){ int vitalrecover = 0; switch(cdit){ case ComixDungeonItem.M_PORK: vitalrecover = 500; break; case ComixDungeonItem.M_BEEF: vitalrecover = 1000; break; } cdcp.writeText("あなたは" + cdi.getName() + "を食べた"); cdcp.writeText("体力が" + (vitalrecover / 10) + "%回復した"); yourVit += vitalrecover; if(yourVit > 1001){ yourVit = 1001; } cdip.removeItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); enemyTurn(); }else if(cdit - ComixDungeonItem.BOOK < 100){ cdcp.writeText("あなたは" + cdi.getName() + "を読んだ"); spell(yourCDC,cdi,yourX,yourY); cdip.removeItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); enemyTurn(); }else if(cdit == ComixDungeonItem.S_TETRAFORCE){ if(shigaCDC == null){ if(bossCDC == null && story == 19){ story++; enemyX = new Stack(); enemyY = new Stack(); newMap(); cdip.removeItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); cdmc.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); cdcp.labelUpdate(yourCDC.getHP(),yourCDC.getMaxHP(),yourVit,0,yourCDC.getEx()); cdcp.resetText(); cdmc2.imageReset(20,20); cdmc2.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); cdcp.writeText("最終決戦場"); bossCDC = new ComixDungeonCharactor(ComixDungeonCharactor.L_CHUO); cdcp.writeText("邪神の声が聞こえる"); cdcp.writeText("「老子を追い払うとは」"); cdcp.writeText("「貴様は最高の器だ」"); cdcp.writeText("「さあ、私と一緒になろう」"); }else{ cdcp.writeText("鈍い光が危険を知らせる"); cdcp.writeText("なんだか好戦的な気分だ"); } }else{ cdcp.writeText("マルチプレイヤーのデータ"); cdcp.writeText("名前:" + shigaCDC.getName()); cdcp.writeText("HP:" + Integer.toString(shigaCDC.getHP()) + "/" + Integer.toString(shigaCDC.getMaxHP())); if(shigaCDC.getConfused() != 0){ cdcp.writeText("混乱している"); } if(shigaCDC.getThrowSpell() == null){ cdcp.writeText("封印されている"); } } } } return true; }else if(e.target == ComixDungeonItemPanel.THROW){ cdcp.resetText(); if(ComixDungeonItemPanel.LIST.getSelectedIndex() == -1){ cdcp.writeText("アイテムを選択してください"); }else{ ComixDungeonItem cdi = cdip.getItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); int cdit = cdi.getType(); int innerX = yourX; int innerY = yourY; int upperX = 0; int upperY = 0; switch(yourCDC.getDirection()){ case NORTH: upperY = -1; break; case SOUTH: upperY = 1; break; case WEST: upperX = -1; break; case EAST: upperX = 1; } while(true){ innerX += upperX; innerY += upperY; if(cdmm.getGrid(innerX,innerY).isWall()){ cdcp.writeText("ターゲットがいない"); return true; }else if(cdmm.getGrid(innerX,innerY).getCharactor() != null && !(cdmm.getGrid(innerX,innerY).getCharactor().isClear())){ ComixDungeonCharactor throwTarget = cdmm.getGrid(innerX,innerY).getCharactor(); if(cdit - ComixDungeonItem.WEAPON < 100){ if(cdi == exw){ cdcp.writeText(cdi.getName() + "を投げた"); attack(yourCDC,throwTarget); exw = null; cdip.removeItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); enemyTurn(); }else{ ComixDungeonItem exedw = exw; exw = cdi; cdcp.writeText(cdi.getName() + "を投げた"); attack(yourCDC,throwTarget); exw = exedw; cdip.removeItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); enemyTurn(); } }else if(cdit - ComixDungeonItem.ARMOR < 100){ cdcp.writeText("重くて投げられない"); }else if(cdit - ComixDungeonItem.MEAT < 100){ cdcp.writeText(cdi.getName() + "を投げた"); switch(cdit){ case ComixDungeonItem.M_PORK: cdcp.writeText(throwTarget.getName() + "は元気があふれた"); throwTarget.addEx(1); break; case ComixDungeonItem.M_BEEF: cdcp.writeText(throwTarget.getName() + "は元気100倍"); throwTarget.addEx(1); throwTarget.addEx(1); break; } cdip.removeItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); enemyTurn(); }else if(cdit - ComixDungeonItem.BOOK < 100){ cdcp.writeText(cdi.getName() + "を投げた"); spell(yourCDC,cdi,innerX,innerY); cdip.removeItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); enemyTurn(); }else if(cdit == ComixDungeonItem.S_TETRAFORCE){ cdcp.writeText(cdi.getName() + "は呪われている"); } return true; } } } return true; }else if(e.target == ComixDungeonItemPanel.UNDER){ cdcp.resetText(); if(yourX == cdmm.getGoalX() && yourY == cdmm.getGoalY()){ if((bossCDC == null && (story != 10 || shigaCDC != null)) || lastBoss == 3){ if(story != LAST_STORY){ story++; } enemyX = new Stack(); enemyY = new Stack(); newMap(); cdmc.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); if(story < 10){ cdcp.labelUpdate(yourCDC.getHP(),yourCDC.getMaxHP(),yourVit,story,yourCDC.getEx()); }else{ cdcp.labelUpdate(yourCDC.getHP(),yourCDC.getMaxHP(),yourVit,20 - story,yourCDC.getEx()); } cdcp.resetText(); cdmc2.imageReset(20,20); cdmc2.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); if(story < 10){ cdcp.writeText("第" + story + "階層"); }else if(story == 20){ cdcp.writeText("最終決戦場"); lastBoss = -1; ComixDungeonCharactor lbTempCDC = new ComixDungeonCharactor(ComixDungeonCharactor.L_CHUO); lbTempCDC.setHP(bossCDC.getHP()); bossCDC = lbTempCDC; }else{ cdcp.writeText("第" + (20 - story) + "階層"); } }else{ cdcp.writeText("この魔法陣は封印されている"); } }else if(cdmm.getGrid(yourX,yourY).getItem() != null){ ComixDungeonItem cdi = cdmm.getGrid(yourX,yourY).getItem(); if(cdip.addItem(cdi)){ cdcp.writeText(cdi.getName() + "を拾った"); if(cdi.getType() == ComixDungeonItem.S_TETRAFORCE){ cdcp.writeText("マルチプレイヤーの乱入です"); shigaCDC = new ComixDungeonCharactor(ComixDungeonCharactor.SHIGA); } cdmm.getGrid(yourX,yourY).putItem(null); enemyTurn(); }else{ cdcp.writeText("アイテムがいっぱいで拾えない"); } }else{ if(ComixDungeonItemPanel.LIST.getSelectedIndex() == -1){ cdcp.writeText("アイテムを選択してください"); }else{ ComixDungeonItem cdi = cdip.getItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); if(cdi == exw || cdi == exa){ cdcp.writeText("装備をはずしてください"); }else if(cdi.getType() == ComixDungeonItem.S_TETRAFORCE){ cdcp.writeText(cdi.getName() + "は呪われている"); }else{ cdmm.getGrid(yourX,yourY).putItem(cdi); cdcp.writeText(cdi.getName() + "を置いた"); cdip.removeItem(ComixDungeonItemPanel.LIST.getSelectedIndex()); enemyTurn(); } } } return true; } return false; } /** *メソッド"enemyTurn" *敵の行動を処理する */ void enemyTurn(){ Stack newEnemyX = new Stack(); Stack newEnemyY = new Stack(); while(!(enemyX.empty())){ int enmX = ((Integer)(enemyX.pop())).intValue(); int enmY = ((Integer)(enemyY.pop())).intValue(); ComixDungeonCharactor cdc = cdmm.getGrid(enmX,enmY).getCharactor(); if(cdc != null){ if(cdc.getHP() > 0){ newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); }else if(cdc.getType() == ComixDungeonCharactor.U_SPIRIT && lastBoss == 0){ cdmm.getGrid(enmX,enmY).putCharactor(bossCDC); lastBoss = 1; while(bossCDC.getDirection() != yourCDC.getDirection()){ bossCDC.setDirection(ComixDungeonCharactor.LEFT); } bossCDC.setDirection(ComixDungeonCharactor.BACK); newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); }else{ if(cdc == bossCDC || cdc == shigaCDC){ if(cdc.getType() == ComixDungeonCharactor.F_CHUO){ if(enmX == cdmm.getGoalX() && enmY == cdmm.getGoalY()){ if(enmX == yourX){ cdmm.getGrid(enmX,enmY + ((yourY - enmY) / Math.abs(yourY - enmY))).putItem(new ComixDungeonItem(ComixDungeonItem.S_TETRAFORCE)); }else{ cdmm.getGrid(enmX + ((yourX - enmX) / Math.abs(yourX - enmX)),enmY).putItem(new ComixDungeonItem(ComixDungeonItem.S_TETRAFORCE)); } }else{ cdmm.getGrid(enmX,enmY).putItem(new ComixDungeonItem(ComixDungeonItem.S_TETRAFORCE)); } } bossSpeak(cdc,BOSS_DEATH); bossCDC = null; if(story == 19 && cdc.getType() == ComixDungeonCharactor.SHIGA){ cdcp.writeText("どこからともなく声が聞こえる"); cdcp.writeText("「子牙よ、死ぬときではない」"); cdcp.writeText("「この邪教の悪魔は私に任せろ」"); bossCDC = new ComixDungeonCharactor(ComixDungeonCharactor.L_ROSHI); int roshiX = -1; int roshiY = -1; ComixDungeonMazeGrid roshiMG = null; while(true){ roshiX = Math.abs(random.nextInt() % 20); roshiY = Math.abs(random.nextInt() % 20); roshiMG = cdmm.getGrid(roshiX,roshiY); if(roshiMG.getCharactor() == null && !roshiMG.isWall() && roshiX != yourX && roshiY != yourY){ roshiMG.putCharactor(bossCDC); newEnemyX.push(new Integer(roshiX)); newEnemyY.push(new Integer(roshiY)); break; } } } } cdmm.getGrid(enmX,enmY).putCharactor(null); } } } enemyX = newEnemyX; enemyY = newEnemyY; newEnemyX = new Stack(); newEnemyY = new Stack(); while(!(enemyX.empty())){ int enmX = ((Integer)(enemyX.pop())).intValue(); int enmY = ((Integer)(enemyY.pop())).intValue(); ComixDungeonCharactor cdc = cdmm.getGrid(enmX,enmY).getCharactor(); if(cdc.getType() == ComixDungeonCharactor.L_CHUO && lastBoss++ == 2){ cdmm.getGrid(enmX,enmY).putCharactor(null); continue; } int innerX = enmX; int innerY = enmY; int upperX = 0; int upperY = 0; switch(cdc.getDirection()){ case ComixDungeon2.NORTH: upperY = -1; break; case ComixDungeon2.SOUTH: upperY = 1; break; case ComixDungeon2.WEST: upperX = -1; break; case ComixDungeon2.EAST: upperX = 1; } while(!(cdmm.getGrid(innerX,innerY).isWall())){ innerX += upperX; innerY += upperY; } int t = ((innerX - enmX) * upperX) + ((innerY - enmY) * upperY); int move = -1; while(t-- > 1){ if(yourX == enmX + (t * upperX) && yourY == enmY + (t * upperY)){ if(t == 1){ if(cdc.getConfused() != 0){ cdc.addConfused(-1); move = (Math.abs(random.nextInt() % 4) + 1); }else{ if(cdc.isDrainable()){ move = 7; }else if(cdc.getReadSpell() == null){ move = 4; }else{ move = 6; } } }else if(cdc.getConfused() != 0){ cdc.addConfused(-1); move = Math.abs(random.nextInt() % 4); }else if(cdc.getThrowSpell() == null){ move = 0; }else{ move = 5; } break; } } if(move == -1){ if(cdc.getConfused() != 0){ cdc.addConfused(-1); if(cdmm.getGrid(enmX + upperX,enmY + upperY).isWall()){ move = (Math.abs(random.nextInt() % 3) + 1); }else if(cdmm.getGrid(enmX + upperX,enmY + upperY).getCharactor() != null){ move = (Math.abs(random.nextInt() % 4) + 1); }else{ move = Math.abs(random.nextInt() % 4); } }else if(yourX == enmX + upperY && yourY == enmY - upperX){ if(cdc.getReadSpell() == null){ move = 1; }else{ move = 6; } }else if(yourX == enmX - upperY && yourY == enmY + upperX){ if(cdc.getReadSpell() == null){ move = 3; }else{ move = 6; } }else if(cdc.isYasaian() && cdmm.getGrid(enmX + upperX,enmY + upperY).getCharactor() != null && !(cdmm.getGrid(enmX + upperX,enmY + upperY).getCharactor().isClear())){ move = 4; }else if(cdc.isYasaian() && cdmm.getGrid(enmX + upperY,enmY - upperX).getCharactor() != null && !(cdmm.getGrid(enmX + upperY,enmY - upperX).getCharactor().isClear())){ move = 1; }else if(cdc.isYasaian() && cdmm.getGrid(enmX - upperY,enmY + upperX).getCharactor() != null && !(cdmm.getGrid(enmX - upperY,enmY + upperX).getCharactor().isClear())){ move = 3; }else if(cdmm.getGrid(enmX + upperX,enmY + upperY).isWall() || cdmm.getGrid(enmX + upperX,enmY + upperY).getCharactor() != null){ if(cdmm.getGrid(enmX + upperY,enmY - upperX).isWall()){ if(cdmm.getGrid(enmX - upperY,enmY + upperX).isWall()){ move = 2; }else{ move = 3; } }else if(cdmm.getGrid(enmX - upperY,enmY + upperX).isWall()){ move = 1; }else{ move = (Math.abs(random.nextInt() % 2) * 2) + 1; } }else{ move = 0; } } switch(move){ case 0: if(cdmm.getGrid(enmX + upperX,enmY + upperY).getCharactor() == null){ cdmm.getGrid(enmX + upperX,enmY + upperY).putCharactor(cdc); cdmm.getGrid(enmX,enmY).putCharactor(null); newEnemyX.push(new Integer(enmX + upperX)); newEnemyY.push(new Integer(enmY + upperY)); }else{ newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); } break; case 1: cdc.setDirection(ComixDungeonCharactor.LEFT); newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); break; case 2: cdc.setDirection(ComixDungeonCharactor.BACK); newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); break; case 3: cdc.setDirection(ComixDungeonCharactor.RIGHT); newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); break; case 4: if(cdmm.getGrid(enmX + upperX,enmY + upperY).getCharactor() != null){ attack(cdc,cdmm.getGrid(enmX + upperX,enmY + upperY).getCharactor()); }else{ if(cdc == bossCDC || cdc == shigaCDC){ bossSpeak(cdc,BOSS_ATTACK); } attack(cdc,yourCDC); } if(cdc.getType() == ComixDungeonCharactor.L_ROSHI && enmX + upperX == yourX && enmY + upperY == yourY){ boolean nCheck = false; boolean sCheck = false; boolean wCheck = false; boolean eCheck = false; int sanseiX = -1; int sanseiY = -1; if(cdmm.getGrid(enmX + upperX,enmY + upperY - 1).getCharactor() != null || cdmm.getGrid(enmX + upperX,enmY + upperY - 1).isWall()){ nCheck = true; } if(cdmm.getGrid(enmX + upperX,enmY + upperY + 1).getCharactor() != null || cdmm.getGrid(enmX + upperX,enmY + upperY + 1).isWall()){ sCheck = true; } if(cdmm.getGrid(enmX + upperX - 1,enmY + upperY).getCharactor() != null || cdmm.getGrid(enmX + upperX - 1,enmY + upperY).isWall()){ wCheck = true; } if(cdmm.getGrid(enmX + upperX + 1,enmY + upperY).getCharactor() != null || cdmm.getGrid(enmX + upperX + 1,enmY + upperY).isWall()){ eCheck = true; } if(nCheck && sCheck && wCheck && eCheck){ cdcp.writeText("「ここは任せるとしよう」"); sanseiX = enmX; sanseiY = enmY; int roshiX = -1; int roshiY = -1; ComixDungeonMazeGrid roshiMG = null; while(true){ roshiX = Math.abs(random.nextInt() % 20); roshiY = Math.abs(random.nextInt() % 20); roshiMG = cdmm.getGrid(roshiX,roshiY); if(roshiMG.getCharactor() == null && !roshiMG.isWall() && roshiX != yourX && roshiY != yourY){ roshiMG.putCharactor(bossCDC); newEnemyX.push(new Integer(roshiX)); newEnemyY.push(new Integer(roshiY)); break; } } }else{ newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); while(sanseiX < 0){ switch(Math.abs(random.nextInt() % 4)){ case 0: if(!nCheck){ sanseiX = enmX + upperX; sanseiY = enmY + upperY - 1; } break; case 1: if(!sCheck){ sanseiX = enmX + upperX; sanseiY = enmY + upperY + 1; } break; case 2: if(!wCheck){ sanseiX = enmX + upperX - 1; sanseiY = enmY + upperY; } break; case 3: if(!eCheck){ sanseiX = enmX + upperX + 1; sanseiY = enmY + upperY; } break; } } } ComixDungeonCharactor sanseiCDC = null; switch(Math.abs(random.nextInt() % 3)){ case 0: sanseiCDC = new ComixDungeonCharactor(ComixDungeonCharactor.S_ROSHI); break; case 1: sanseiCDC = new ComixDungeonCharactor(ComixDungeonCharactor.Y_ROSHI); break; case 2: sanseiCDC = new ComixDungeonCharactor(ComixDungeonCharactor.T_ROSHI); break; } cdmm.getGrid(sanseiX,sanseiY).putCharactor(sanseiCDC); newEnemyX.push(new Integer(sanseiX)); newEnemyY.push(new Integer(sanseiY)); }else{ newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); } break; case 5: if(cdc == bossCDC || cdc == shigaCDC){ bossSpeak(cdc,BOSS_ATTACK); } cdcp.writeText(cdc.getName() + "は" + cdc.getThrowSpell().getName() + "を読んだ"); spell(cdc,cdc.getThrowSpell(),yourX,yourY); newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); break; case 6: if(cdc == bossCDC || cdc == shigaCDC){ bossSpeak(cdc,BOSS_ATTACK); } cdcp.writeText(cdc.getName() + "は" + cdc.getReadSpell().getName() + "を読んだ"); spell(cdc,cdc.getReadSpell(),enmX,enmY); newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); break; case 7: yourVit = Math.max(yourVit - 300,0); cdcp.writeText(cdc.getName() + "は体力を吸い取った"); cdcp.writeText(cdc.getName() + "は元気があふれた"); cdc.addEx(1); newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); break; } } enemyX = newEnemyX; enemyY = newEnemyY; newEnemyX = new Stack(); newEnemyY = new Stack(); while(!(enemyX.empty())){ int enmX = ((Integer)(enemyX.pop())).intValue(); int enmY = ((Integer)(enemyY.pop())).intValue(); ComixDungeonCharactor cdc = cdmm.getGrid(enmX,enmY).getCharactor(); if(cdc != null){ if(cdmm.getGrid(enmX,enmY).isBio()){ cdc.addHP(-(cdc.getMaxHP() / 8) - 1); cdcp.writeText(cdc.getName() + "は毒で" + ((cdc.getMaxHP() / 10) + 1) + "ダメージ"); if(cdc.getHP() < 1){ cdcp.writeText(cdc.getName() + "は倒れた"); } } if(cdc.getHP() > 0){ newEnemyX.push(new Integer(enmX)); newEnemyY.push(new Integer(enmY)); }else{ if(cdc == bossCDC || cdc == shigaCDC){ if(cdc.getType() == ComixDungeonCharactor.F_CHUO){ if(enmX == cdmm.getGoalX() && enmY == cdmm.getGoalY()){ if(enmX == yourX){ cdmm.getGrid(enmX,enmY + ((yourY - enmY) / Math.abs(yourY - enmY))).putItem(new ComixDungeonItem(ComixDungeonItem.S_TETRAFORCE)); }else{ cdmm.getGrid(enmX + ((yourX - enmX) / Math.abs(yourX - enmX)),enmY).putItem(new ComixDungeonItem(ComixDungeonItem.S_TETRAFORCE)); } }else{ cdmm.getGrid(enmX,enmY).putItem(new ComixDungeonItem(ComixDungeonItem.S_TETRAFORCE)); } } bossSpeak(cdc,BOSS_DEATH); bossCDC = null; if(story == 19 && cdc.getType() == ComixDungeonCharactor.SHIGA){ cdcp.writeText("どこからともなく声が聞こえる"); cdcp.writeText("「子牙よ、死ぬときではない」"); cdcp.writeText("「この邪教の悪魔は私に任せろ」"); bossCDC = new ComixDungeonCharactor(ComixDungeonCharactor.L_ROSHI); int roshiX = -1; int roshiY = -1; ComixDungeonMazeGrid roshiMG = null; while(true){ roshiX = Math.abs(random.nextInt() % 20); roshiY = Math.abs(random.nextInt() % 20); roshiMG = cdmm.getGrid(roshiX,roshiY); if(roshiMG.getCharactor() == null && !roshiMG.isWall() && roshiX != yourX && roshiY != yourY){ roshiMG.putCharactor(bossCDC); newEnemyX.push(new Integer(roshiX)); newEnemyY.push(new Integer(roshiY)); break; } } } } cdmm.getGrid(enmX,enmY).putCharactor(null); } } } enemyX = newEnemyX; enemyY = newEnemyY; if(cdmm.getGrid(yourX,yourY).isBio()){ yourCDC.addHP(-(yourCDC.getMaxHP() / 10) - 1); cdcp.writeText("あなたは毒で" + ((yourCDC.getMaxHP() / 10) + 1) + "ダメージ"); } if(yourVit == 0){ yourCDC.addHP(-1); if(yourCDC.getHP() > 0){ cdcp.writeText("これ以上の行動は危険です"); cdcp.writeText("早めに体力を回復しましょう"); } }else if(--yourVit % Math.max(1,150 / yourCDC.getMaxHP()) == 0 && yourCDC.getHP() > 0){ yourCDC.addHP(1); } if(random.nextInt() % 10 == 0){ addEnemy(); } if(yourCDC.getHP() < 1){ cdcp.writeText("あなたは死にました"); gameOver = true; }else{ if(cdmm.getGrid(yourX,yourY).getItem() != null){ cdcp.writeText("足元に" + cdmm.getGrid(yourX,yourY).getItem().getName() + "がある"); } if(yourX == cdmm.getGoalX() && yourY == cdmm.getGoalY()){ if(cdmm.hasStair()){ cdcp.writeText("足元に階段がある"); }else{ cdcp.writeText("足元に魔法陣がある"); } } if(yourCDC.getConfused() != 0){ cdcp.writeText("あなたは混乱している"); cdcp.writeText("思うように動けないだろう"); } } if(lastBoss == 0){ lastBoss = -1; } cdmc.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); cdmc2.imageUpdate(cdmm,yourX,yourY,yourCDC.getDirection()); if(story < 10){ cdcp.labelUpdate(yourCDC.getHP(),yourCDC.getMaxHP(),yourVit,story,yourCDC.getEx()); }else{ cdcp.labelUpdate(yourCDC.getHP(),yourCDC.getMaxHP(),yourVit,20 - story,yourCDC.getEx()); } } /** *メソッド"newMap" *マップを新規作成し、敵を配置する */ void newMap(){ if(story == 9){ cdmm = ComixDungeonMazeMap.getSpecialMap(ComixDungeonMazeMap.DAKKI); yourX = cdmm.getStartX(); yourY = cdmm.getStartY(); bossCDC = new ComixDungeonCharactor(ComixDungeonCharactor.D_DAKKI); cdmm.getGrid(10,7).putCharactor(bossCDC); cdmm.getGrid(0,19).putCharactor(new ComixDungeonCharactor(ComixDungeonCharactor.O_DAKKI)); cdmm.getGrid(19,19).putCharactor(new ComixDungeonCharactor(ComixDungeonCharactor.K_DAKKI)); enemyX.push(new Integer(10)); enemyY.push(new Integer(7)); enemyX.push(new Integer(0)); enemyY.push(new Integer(19)); enemyX.push(new Integer(19)); enemyY.push(new Integer(19)); }else if(story == 10){ cdmm = ComixDungeonMazeMap.getSpecialMap(ComixDungeonMazeMap.KING_FIRST); yourX = cdmm.getStartX(); yourY = cdmm.getStartY(); bossCDC = new ComixDungeonCharactor(ComixDungeonCharactor.F_CHUO); cdmm.getGrid(17,17).putCharactor(bossCDC); cdmm.getGrid(2,17).putCharactor(new ComixDungeonCharactor(ComixDungeonCharactor.R_KNIGHT)); enemyX.push(new Integer(17)); enemyY.push(new Integer(17)); enemyX.push(new Integer(2)); enemyY.push(new Integer(17)); }else if(story == 19){ cdmm = ComixDungeonMazeMap.getSpecialMap(ComixDungeonMazeMap.ROSHI); yourX = cdmm.getStartX(); yourY = cdmm.getStartY(); bossCDC = new ComixDungeonCharactor(ComixDungeonCharactor.SHIGA); while(bossCDC.getMaxHP() < shigaCDC.getMaxHP()){ bossCDC.addEx(1); } for(int i = 0;i < 5;i++){ bossCDC.addEx(1); } shigaCDC = null; cdmm.getGrid(12,10).putCharactor(bossCDC); enemyX.push(new Integer(12)); enemyY.push(new Integer(10)); }else if(story == 20){ cdmm = new ComixDungeonMazeMap(20,20,false); yourX = cdmm.getStartX(); yourY = cdmm.getStartY(); }else if(shigaCDC != null){ if(shigaCDC.getHP() < 1){ ComixDungeonCharactor newShiga = new ComixDungeonCharactor(ComixDungeonCharactor.SHIGA); while(newShiga.getMaxHP() < shigaCDC.getMaxHP()){ newShiga.addEx(1); } shigaCDC = newShiga; } cdmm = new ComixDungeonMazeMap(20,20,false); yourX = cdmm.getStartX(); yourY = cdmm.getStartY(); int shigaX = 0; int shigaY = 0; ComixDungeonMazeGrid shigaMG = null; boolean shigaPutFlag = true; while(shigaPutFlag){ shigaX = Math.abs(random.nextInt() % 20); shigaY = Math.abs(random.nextInt() % 20); shigaMG = cdmm.getGrid(shigaX,shigaY); if(shigaMG.getCharactor() == null && !shigaMG.isWall() && shigaX != yourX && shigaY != yourY){ shigaMG.putCharactor(shigaCDC); enemyX.push(new Integer(shigaX)); enemyY.push(new Integer(shigaY)); shigaPutFlag = false; } } }else{ cdmm = new ComixDungeonMazeMap(20,20,true); yourX = cdmm.getStartX(); yourY = cdmm.getStartY(); } int maxRandom = 0; for(int i = 0;i < ITEM_POSSIBILITY.length;i++){ maxRandom += ITEM_POSSIBILITY[i][0]; } for(int i = 0;i < 10;i++){ addEnemy(); addCDItem(maxRandom); addCDItem(maxRandom); } } /** *メソッド"addEnemy" *ランダムに敵を配置する *返り値は配置に成功したかのブール型 */ private boolean addEnemy(){ int x = Math.abs(random.nextInt() % 20); int y = Math.abs(random.nextInt() % 20); ComixDungeonMazeGrid mg = cdmm.getGrid(x,y); if(mg.getCharactor() == null && !mg.isWall() && x != yourX && y != yourY){ mg.putCharactor(new ComixDungeonCharactor(ENEMY_TABLE[story - 1][Math.abs(random.nextInt() % ENEMY_TABLE[story - 1].length)])); enemyX.push(new Integer(x)); enemyY.push(new Integer(y)); return true; } return false; } /** *メソッド"addCDItem" *ランダムにアイテムを配置する *返り値は配置に成功したかのブール型 */ private boolean addCDItem(int maxRandom){ int x = Math.abs(random.nextInt() % 20); int y = Math.abs(random.nextInt() % 20); ComixDungeonMazeGrid mg = cdmm.getGrid(x,y); if(mg.getItem() == null && !mg.isWall() && x != cdmm.getGoalX() && y != cdmm.getGoalY()){ int randomInt = Math.abs(random.nextInt() % maxRandom); int compareInt = 0; for(int i = 0;i < ITEM_POSSIBILITY.length;i++){ compareInt += ITEM_POSSIBILITY[i][0]; if(randomInt < compareInt){ mg.putItem(new ComixDungeonItem(ITEM_POSSIBILITY[i][1])); return true; } } } return false; } /** *メソッド"attack" *ダメージを計算し、HPを減らし、倒せば経験値を得、以上を表示する */ private void attack(ComixDungeonCharactor offense,ComixDungeonCharactor defense){ float attackPoint = offense.getAttack(); if(offense.getType() == ComixDungeonCharactor.YOU){ if(exw != null){ switch(exw.getType()){ case ComixDungeonItem.W_STICK: attackPoint += 1; break; case ComixDungeonItem.W_SPIKEDCLUB: attackPoint += 2; break; case ComixDungeonItem.W_STONEAXE: attackPoint += 3; break; case ComixDungeonItem.W_BRONZESPEAR: attackPoint += 4; break; case ComixDungeonItem.W_IRONSWORD: attackPoint += 5; break; case ComixDungeonItem.W_SILVERSWORD: attackPoint += 6; break; case ComixDungeonItem.W_DIAMONDSWORD: attackPoint += 7; break; case ComixDungeonItem.W_GOLDBAT: attackPoint += 10; break; } } } float defensePoint = defense.getDefense(); if(defense.getType() == ComixDungeonCharactor.YOU){ if(exa != null){ switch(exa.getType()){ case ComixDungeonItem.A_LEATHER: defensePoint += 1; break; case ComixDungeonItem.A_SCALE: defensePoint += 2; break; case ComixDungeonItem.A_RING: defensePoint += 3; break; case ComixDungeonItem.A_BRONZE: defensePoint += 4; break; case ComixDungeonItem.A_IRON: defensePoint += 5; break; case ComixDungeonItem.A_SILVER: defensePoint += 6; break; case ComixDungeonItem.A_DIAMOND: defensePoint += 7; break; case ComixDungeonItem.A_GOLD: defensePoint += 10; break; } } } int damage = Math.max(1,(int)(attackPoint / Math.pow(2.0,defensePoint / 10.0))); defense.addHP(-damage); cdcp.writeText(offense.getName() + "の攻撃"); cdcp.writeText(defense.getName() + "に" + damage + "ダメージ"); if(offense.getType() == ComixDungeonCharactor.L_CHUO){ offense.addHP(damage / 2); cdcp.writeText(offense.getName() + "はHPを吸収した"); } int originalType = offense.getType(); int originalLevel = 0; if(originalType == ComixDungeonCharactor.YOU){ originalLevel = exToLevel(offense.getEx()); } if((defense == bossCDC || defense == shigaCDC) && defense.getHP() > 0){ bossSpeak(defense,BOSS_DAMAGE); } if(defense.getHP() < 1){ cdcp.writeText(defense.getName() + "を倒した"); cdcp.writeText(defense.getEx() + "の経験値獲得"); offense.addEx(defense.getEx()); if(originalType != offense.getType() || (originalType == ComixDungeonCharactor.YOU && originalLevel != exToLevel(offense.getEx()))){ cdcp.writeText("レベルアップ"); } if(offense.getType() == ComixDungeonCharactor.YOU && defense.getType() == ComixDungeonCharactor.U_SPIRIT && lastBoss == -1){ lastBoss = 0; } } } /** *メソッド"spell" *魔法を使う */ private void spell(ComixDungeonCharactor userCDC,ComixDungeonItem item,int x,int y){ if(item.getType() == ComixDungeonItem.B_BIO){ cdmm.getGrid(x,y).makeBio(); cdmm.getGrid(x,y + 1).makeBio(); cdmm.getGrid(x - 1,y).makeBio(); cdmm.getGrid(x,y - 1).makeBio(); cdmm.getGrid(x + 1,y).makeBio(); cdcp.writeText("猛毒の沼が広がった"); }else{ ComixDungeonCharactor[] cdcs = new ComixDungeonCharactor[5]; if(yourX == x && yourY == y){ cdcs[0] = yourCDC; }else{ cdcs[0] = cdmm.getGrid(x,y).getCharactor(); } if(yourX == x && yourY == y + 1){ cdcs[1] = yourCDC; }else{ cdcs[1] = cdmm.getGrid(x,y + 1).getCharactor(); } if(yourX == x - 1 && yourY == y){ cdcs[2] = yourCDC; }else{ cdcs[2] = cdmm.getGrid(x - 1,y).getCharactor(); } if(yourX == x && yourY == y - 1){ cdcs[3] = yourCDC; }else{ cdcs[3] = cdmm.getGrid(x,y - 1).getCharactor(); } if(yourX == x + 1 && yourY == y){ cdcs[4] = yourCDC; }else{ cdcs[4] = cdmm.getGrid(x + 1,y).getCharactor(); } for(int i = 0;i < 5;i++){ if(cdcs[i] != null){ switch(item.getType()){ case ComixDungeonItem.B_HEALING: cdcs[i].addHP(30); cdcp.writeText(cdcs[i].getName() + "のHPが30回復"); break; case ComixDungeonItem.B_HEALINGTWO: cdcs[i].addHP(100); cdcp.writeText(cdcs[i].getName() + "のHPが100回復"); break; case ComixDungeonItem.B_FIRE: cdcs[i].addHP(-10); cdcp.writeText(cdcs[i].getName() + "に10ダメージ"); break; case ComixDungeonItem.B_ICE: cdcs[i].addHP(-20); cdcp.writeText(cdcs[i].getName() + "に20ダメージ"); break; case ComixDungeonItem.B_LIGHTNING: cdcs[i].addHP(-30); cdcp.writeText(cdcs[i].getName() + "に30ダメージ"); break; case ComixDungeonItem.B_CONFUSING: cdcs[i].addConfused(8 + (random.nextInt() % 3)); cdcp.writeText(cdcs[i].getName() + "は混乱した"); break; case ComixDungeonItem.B_TURNBACK: cdcs[i].setDirection(ComixDungeonCharactor.BACK); cdcp.writeText(cdcs[i].getName() + "は振り返った"); break; case ComixDungeonItem.B_CANCELING: if(cdcs[i].getType() == ComixDungeonCharactor.YOU){ if(cdip.getMass() != 0){ int canceledItem = Math.abs(random.nextInt() % cdip.getMass()); if(cdip.getItem(canceledItem).getType() != ComixDungeonItem.S_TETRAFORCE){ cdcp.writeText(cdip.getItem(canceledItem).getName() + "を封印した"); if(cdip.getItem(canceledItem) == exw){ exw = null; } if(cdip.getItem(canceledItem) == exa){ exa = null; } if(cdip.getItem(canceledItem) != item){ cdip.removeItem(canceledItem); } }else{ cdcp.writeText(cdip.getItem(canceledItem).getName() + "は封印されない"); } } }else{ cdcs[i].setCanceled(); cdcp.writeText(cdcs[i].getName() + "の力を封印した"); } break; case ComixDungeonItem.B_ULTIMET: cdcs[i].addHP(-40); cdcp.writeText(cdcs[i].getName() + "に40ダメージ"); if(cdmm.getGrid(x,y).getItem() == null && !(x == cdmm.getGoalX() && y == cdmm.getGoalY()) && userCDC.getType() != ComixDungeonCharactor.YOU){ cdmm.getGrid(x,y).putItem(new ComixDungeonItem(ComixDungeonItem.B_ULTIMET)); cdcp.writeText("究極の魔法の奥義が明かされた"); } break; } if((cdcs[i] == bossCDC || cdcs[i] == shigaCDC) && cdcs[i].getHP() > 0){ bossSpeak(cdcs[i],BOSS_DAMAGE); } if(cdcs[i].getHP() < 1){ cdcp.writeText(cdcs[i].getName() + "を倒した"); if(cdcs[i] != userCDC){ int originalType = userCDC.getType(); int originalLevel = 0; if(originalType == ComixDungeonCharactor.YOU){ originalLevel = exToLevel(userCDC.getEx()); } cdcp.writeText(cdcs[i].getEx() + "の経験値獲得"); userCDC.addEx(cdcs[i].getEx()); if(originalType != userCDC.getType() || (originalType == ComixDungeonCharactor.YOU && originalLevel != exToLevel(userCDC.getEx()))){ cdcp.writeText("レベルアップ"); } if(userCDC.getType() == ComixDungeonCharactor.YOU && cdcs[i].getType() == ComixDungeonCharactor.U_SPIRIT && lastBoss == -1){ lastBoss = 0; } } } } } } } /** *メソッド"bossSpeak" *ボス敵にしゃべらせる */ private void bossSpeak(ComixDungeonCharactor bcdc,int type){ switch(bcdc.getType()){ case ComixDungeonCharactor.D_DAKKI: if(type == BOSS_ATTACK){ cdcp.writeText("「陛下を倒しに来た賊め!」"); }else if(type == BOSS_DAMAGE){ cdcp.writeText("「わたくしに罪は無いのよ!」"); }else if(type == BOSS_DEATH){ cdcp.writeText("「力が及ばないの...?」"); cdcp.writeText("悪の皇后を倒した"); cdcp.writeText("しかし、王の姿も秘宝もそこには無い"); cdcp.writeText("さらに奥へと進む事にした"); } break; case ComixDungeonCharactor.F_CHUO: if(type == BOSS_ATTACK){ cdcp.writeText("「反逆の徒を殺す!」"); }else if(type == BOSS_DAMAGE){ cdcp.writeText("「何がわしの罪なのだ!」"); }else if(type == BOSS_DEATH){ cdcp.writeText("「天の意志なのか...?」"); cdcp.writeText("この恐るべき魔物の死体"); cdcp.writeText("その姿はまさしくかの王であった"); cdcp.writeText("そして、秘宝がその傍らにある"); } break; case ComixDungeonCharactor.SHIGA: if(type == BOSS_ATTACK){ cdcp.writeText("「おまえの首はもらった!」"); }else if(type == BOSS_DAMAGE){ cdcp.writeText("「おまえはPKか?」"); }else if(type == BOSS_DEATH){ cdcp.writeText("「こいつはPKだ!」"); } break; case ComixDungeonCharactor.L_ROSHI: if(type == BOSS_ATTACK){ cdcp.writeText("「邪教の悪魔を討つ!」"); }else if(type == BOSS_DAMAGE){ cdcp.writeText("「邪神の力で私は倒せん!」"); }else if(type == BOSS_DEATH){ cdcp.writeText("「一旦ここは引き揚げじゃ!」"); cdcp.writeText("「邪教の悪魔」という謎の言葉"); cdcp.writeText("この秘宝の鈍い光を見て閃いた"); cdcp.writeText("それこそが邪神の道具なのだと"); cdcp.writeText("それを使い、最後の戦いへ赴く"); } break; case ComixDungeonCharactor.L_CHUO: if(type == BOSS_ATTACK){ cdcp.writeText("「終末へ導こうぞ!」"); }else if(type == BOSS_DAMAGE){ cdcp.writeText("「最高の器をぜひもらうぞ!」"); }else if(type == BOSS_DEATH){ cdcp.writeText("「わ、私の負けだ」"); lastBoss = 10; } break; } } /** *メソッド"exToLevel" *経験値からレベルを求める */ static final int exToLevel(int e){ int l = 1; while(e >= levelToEx(l)){ l++; } return l; } /** *メソッド"levelToEx" *レベルから必要経験値を求める */ static final int levelToEx(int l){ int e = 10; int ep = 10; for(int i = 1;i < l;i++){ int ne = e + ep; ep = e; e = ne; } return e; } } /** *クラス"ComixDungeonMainCanvas" *ComixDungeonゲーム本体を司るキャンバス */ class ComixDungeonMainCanvas extends Canvas{ /** *描画データのバッファ */ private Image bgImage; private Graphics bgGraphics; /** *さまざまなグラフィック */ private Image dataImage; /** *コンストラクタ */ ComixDungeonMainCanvas(Image i,Image d){ super(); bgImage = i; bgGraphics = bgImage.getGraphics(); dataImage = d; } /** *メソッド"preferredSize" *このキャンバスは200*200の大きさで動く */ public Dimension preferredSize(){ return new Dimension(200,200); } /** *メソッド"minimumSize" *このキャンバスは200*200の大きさで動く */ public Dimension minimumSize(){ return new Dimension(200,200); } /** *メソッド"maximumSize" *このキャンバスは200*200の大きさで動く */ public Dimension maximumSize(){ return new Dimension(200,200); } /** *メソッド"imageUpdate" *マップと座標データからイメージを描く */ void imageUpdate(ComixDungeonMazeMap cdmm,int x,int y,int direction){ int innerX = x; int innerY = y; int upperX = 0; int upperY = 0; switch(direction){ case ComixDungeon2.NORTH: upperY = -1; break; case ComixDungeon2.SOUTH: upperY = 1; break; case ComixDungeon2.WEST: upperX = -1; break; case ComixDungeon2.EAST: upperX = 1; } while(!(cdmm.getGrid(innerX,innerY).isWall())){ innerX += upperX; innerY += upperY; } bgGraphics.setColor(Color.lightGray); bgGraphics.fillRect(0,0,200,200); bgGraphics.setColor(Color.darkGray); int t = ((innerX - x) * upperX) + ((innerY - y) * upperY); bgGraphics.fillRect(0,getDrawPoint(t),200,200 - (2 * getDrawPoint(t))); while(t-- > 0){ ComixDungeonMazeGrid cGrid = cdmm.getGrid(x + (t * upperX),y + (t * upperY)); ComixDungeonMazeGrid lGrid = cdmm.getGrid(x + (t * upperX) + upperY,y + (t * upperY) - upperX); ComixDungeonMazeGrid rGrid = cdmm.getGrid(x + (t * upperX) - upperY,y + (t * upperY) + upperX); int dp = getDrawPoint(t); int dpp = getDrawPoint(t + 1); if(lGrid.isBio()){ bgGraphics.setColor(Color.green); int[] polyX = {dp,dpp,dp}; int[] polyY = {200 - dpp,200 - dpp,200 - dp}; bgGraphics.fillPolygon(polyX,polyY,3); } if(lGrid.isWall()){ bgGraphics.setColor(Color.gray); int[] polyX = {dp,dpp,dpp,dp}; int[] polyY = {dp,dpp,200 - dpp,200 - dp}; bgGraphics.fillPolygon(polyX,polyY,4); }else{ bgGraphics.setColor(Color.darkGray); bgGraphics.fillRect(0,dpp,dpp,200 - (2 * dpp)); } if(x + (t * upperX) + upperY == cdmm.getGoalX() && y + (t * upperY) - upperX == cdmm.getGoalY()){ if(cdmm.hasStair()){ bgGraphics.setColor(Color.black); }else{ bgGraphics.setColor(Color.blue); } bgGraphics.fillOval(((3 * dp) + (3 * dpp) - 400) / 2,200 - dpp,200 - dp - dpp,dpp - dp); }else if(lGrid.getItem() != null){ bgGraphics.setColor(Color.orange); bgGraphics.fillOval(((3 * dp) + (3 * dpp) - 400) / 2,200 - dpp,200 - dp - dpp,dpp - dp); } if(lGrid.getCharactor() != null && !(lGrid.getCharactor().isClear())){ int ed = lGrid.getCharactor().getDirection(); int yd = direction; while(yd != ComixDungeon2.NORTH){ switch(ed){ case ComixDungeon2.NORTH: ed = ComixDungeon2.WEST; break; case ComixDungeon2.SOUTH: ed = ComixDungeon2.EAST; break; case ComixDungeon2.EAST: ed = ComixDungeon2.NORTH; break; case ComixDungeon2.WEST: ed = ComixDungeon2.SOUTH; } switch(yd){ case ComixDungeon2.SOUTH: yd = ComixDungeon2.EAST; break; case ComixDungeon2.EAST: yd = ComixDungeon2.NORTH; break; case ComixDungeon2.WEST: yd = ComixDungeon2.SOUTH; } } bgGraphics.drawImage(enemyToImage(lGrid.getCharactor().getType(),ed),dpp + (2 * dp) - 200,dp,200 - 2 * dp,200 - 2 * dp,this); } if(rGrid.isBio()){ bgGraphics.setColor(Color.green); int[] polyX = {200 - dp,200 - dpp,200 - dp}; int[] polyY = {200 - dpp,200 - dpp,200 - dp}; bgGraphics.fillPolygon(polyX,polyY,3); } if(rGrid.isWall()){ bgGraphics.setColor(Color.gray); int[] polyX = {200 - dp,200 - dpp,200 - dpp,200 - dp}; int[] polyY = {dp,dpp,200 - dpp,200 - dp}; bgGraphics.fillPolygon(polyX,polyY,4); }else{ bgGraphics.setColor(Color.darkGray); bgGraphics.fillRect(200 - dpp,dpp,dpp,200 - (2 * dpp)); } if(x + (t * upperX) - upperY == cdmm.getGoalX() && y + (t * upperY) + upperX == cdmm.getGoalY()){ if(cdmm.hasStair()){ bgGraphics.setColor(Color.black); }else{ bgGraphics.setColor(Color.blue); } bgGraphics.fillOval((400 - dp - dpp) / 2,200 - dpp,200 - dp - dpp,dpp - dp); }else if(rGrid.getItem() != null){ bgGraphics.setColor(Color.orange); bgGraphics.fillOval((400 - dp - dpp) / 2,200 - dpp,200 - dp - dpp,dpp - dp); } if(rGrid.getCharactor() != null && !(rGrid.getCharactor().isClear())){ int ed = rGrid.getCharactor().getDirection(); int yd = direction; while(yd != ComixDungeon2.NORTH){ switch(ed){ case ComixDungeon2.NORTH: ed = ComixDungeon2.WEST; break; case ComixDungeon2.SOUTH: ed = ComixDungeon2.EAST; break; case ComixDungeon2.EAST: ed = ComixDungeon2.NORTH; break; case ComixDungeon2.WEST: ed = ComixDungeon2.SOUTH; } switch(yd){ case ComixDungeon2.SOUTH: yd = ComixDungeon2.EAST; break; case ComixDungeon2.EAST: yd = ComixDungeon2.NORTH; break; case ComixDungeon2.WEST: yd = ComixDungeon2.SOUTH; } } bgGraphics.drawImage(enemyToImage(rGrid.getCharactor().getType(),ed),200 - dpp,dp,200 - 2 * dp,200 - 2 * dp,this); } if(cGrid.isBio()){ bgGraphics.setColor(Color.green); int[] polyX = {dp,dpp,200 - dpp,200 - dp}; int[] polyY = {200 - dp,200 - dpp,200 - dpp,200 - dp}; bgGraphics.fillPolygon(polyX,polyY,4); } if(x + (t * upperX) == cdmm.getGoalX() && y + (t * upperY) == cdmm.getGoalY()){ if(cdmm.hasStair()){ bgGraphics.setColor(Color.black); }else{ bgGraphics.setColor(Color.blue); } bgGraphics.fillOval((dp + dpp) / 2,200 - dpp,200 - dp - dpp,dpp - dp); }else if(cGrid.getItem() != null){ bgGraphics.setColor(Color.orange); bgGraphics.fillOval((dp + dpp) / 2,200 - dpp,200 - dp - dpp,dpp - dp); } if(cGrid.getCharactor() != null && !(cGrid.getCharactor().isClear())){ int ed = cGrid.getCharactor().getDirection(); int yd = direction; while(yd != ComixDungeon2.NORTH){ switch(ed){ case ComixDungeon2.NORTH: ed = ComixDungeon2.WEST; break; case ComixDungeon2.SOUTH: ed = ComixDungeon2.EAST; break; case ComixDungeon2.EAST: ed = ComixDungeon2.NORTH; break; case ComixDungeon2.WEST: ed = ComixDungeon2.SOUTH; } switch(yd){ case ComixDungeon2.SOUTH: yd = ComixDungeon2.EAST; break; case ComixDungeon2.EAST: yd = ComixDungeon2.NORTH; break; case ComixDungeon2.WEST: yd = ComixDungeon2.SOUTH; } } bgGraphics.drawImage(enemyToImage(cGrid.getCharactor().getType(),ed),dp,dp,200 - 2 * dp,200 - 2 * dp,this); } } repaint(); } /** *メソッド"endingImage" *エンディング用のイメージ */ void endingImage(int lastBoss){ if(lastBoss < 18){ bgGraphics.setColor(Color.black); bgGraphics.fillRect(0,0,200,200); }else{ bgGraphics.setColor(Color.blue); bgGraphics.fillRect(0,0,200,200); bgGraphics.drawImage(enemyToImage(ComixDungeonCharactor.L_ROSHI,ComixDungeon2.WEST),0,0,this); } repaint(); } /** *メソッド"update" *ダブルバッファリングのため、残念ながら直接paintを呼ばさせていただきます */ public void update(Graphics g){ paint(g); } /** *メソッド"paint" *あらかじめ作っておいた画像を表示する */ public void paint(Graphics g){ g.drawImage(bgImage,0,0,this); } /** *メソッド"getDrawPoint" *描画計算用のサブルーチン */ private static final int getDrawPoint(int d){ double b = 0.0; int t = d; while(t-- > 0){ b += (200.0 - (2 * b)) / 6; } return (int)b; } /** *メソッド"enemyToImage" *敵イメージを作る */ private final Image enemyToImage(int t,int d){ int cutX = 0; int cutY = 0; int start = 0; int r = 0xffff0000; int g = 0xff00ff00; int b = 0xff0000ff; switch(d){ case ComixDungeon2.NORTH: cutX = 200; break; case ComixDungeon2.WEST: cutX = 200; case ComixDungeon2.EAST: cutY = 200; } switch(t){ case ComixDungeonCharactor.G_SLIME: start = 0; r = 0xff00ff00; g = 0xffff0000; b = 0xffffffff; break; case ComixDungeonCharactor.R_SLIME: start = 0; r = 0xffff0000; g = 0xff0000ff; b = 0xffffffff; break; case ComixDungeonCharactor.C_SLIME: start = 0; r = 0x8000ffff; g = 0x80ff0000; b = 0x80ffffff; break; case ComixDungeonCharactor.L_MOUSE: start = 400; r = 0xff404080; g = 0xffffff80; b = 0xff000000; break; case ComixDungeonCharactor.S_MOUSE: start = 400; r = 0xff000000; g = 0xff808080; b = 0xff0000ff; break; case ComixDungeonCharactor.E_MOUSE: start = 400; r = 0xffff8000; g = 0xffffff80; b = 0xff800000; break; case ComixDungeonCharactor.F_MAGE: start = 800; r = 0xffff8080; g = 0xffff0000; b = 0xff00ffff; break; case ComixDungeonCharactor.I_MAGE: start = 800; r = 0xff8080ff; g = 0xff0000ff; b = 0xffffff00; break; case ComixDungeonCharactor.L_MAGE: start = 800; r = 0xffffff80; g = 0xffff8000; b = 0xff0000ff; break; case ComixDungeonCharactor.N_YASAI: start = 1200; r = 0xff000000; g = 0xffffffff; b = 0xff00ff00; break; case ComixDungeonCharactor.S_YASAI: start = 1200; r = 0xffff8000; g = 0xffffff80; b = 0xff00ffff; break; case ComixDungeonCharactor.C_SPIRIT: start = 1600; r = 0x4000ff00; g = 0x8000ff00; b = 0xff00ff00; break; case ComixDungeonCharactor.B_SPIRIT: start = 1600; r = 0x40ffff00; g = 0x80ffff00; b = 0xffffff00; break; case ComixDungeonCharactor.U_SPIRIT: start = 1600; r = 0x400000ff; g = 0x800000ff; b = 0xff0000ff; break; case ComixDungeonCharactor.S_DAKKI: start = 2000; r = 0xff000000; g = 0xff808000; b = 0xffff8000; break; case ComixDungeonCharactor.O_DAKKI: start = 2000; r = 0xff8000ff; g = 0xff8080ff; b = 0xffffffff; break; case ComixDungeonCharactor.K_DAKKI: start = 2000; r = 0xff800000; g = 0xff80ff80; b = 0xff00ff00; break; case ComixDungeonCharactor.D_DAKKI: start = 2000; r = 0xffff8000; g = 0xffff80ff; b = 0xff8000ff; break; case ComixDungeonCharactor.D_KNIGHT: start = 2400; r = 0xffff0000; g = 0xff404040; b = 0xff000000; break; case ComixDungeonCharactor.R_KNIGHT: start = 2400; r = 0xff0000ff; g = 0xffff0000; b = 0xffff8000; break; case ComixDungeonCharactor.F_CHUO: start = 2800; r = 0xff0000ff; g = 0xffff0000; b = 0xff000000; break; case ComixDungeonCharactor.L_CHUO: start = 2800; r = 0xffff0000; g = 0xffff8080; b = 0xff000000; break; case ComixDungeonCharactor.SHIGA: start = 3200; r = 0xffff8000; g = 0xff00ff00; b = 0xffff0000; break; case ComixDungeonCharactor.Z_BIODOG: start = 3600; r = 0xff808000; g = 0xffffffff; b = 0xff00ff00; break; case ComixDungeonCharactor.C_BIODOG: start = 3600; r = 0xff000000; g = 0xffffffff; b = 0xffff00ff; break; case ComixDungeonCharactor.F_DEVIL: start = 4000; r = 0xff808080; g = 0xffffffff; b = 0xff804040; break; case ComixDungeonCharactor.U_DEVIL: start = 4000; r = 0xff0000ff; g = 0xff00ffff; b = 0xff000080; break; case ComixDungeonCharactor.D_DEVIL: start = 4000; r = 0xff808000; g = 0xff00ff00; b = 0xff008000; break; case ComixDungeonCharactor.L_ROSHI: start = 4400; r = 0xffff8000; g = 0xffffffff; b = 0xff800000; break; case ComixDungeonCharactor.S_ROSHI: start = 4400; r = 0xffff8000; g = 0xffff0000; b = 0xffffffff; break; case ComixDungeonCharactor.Y_ROSHI: start = 4400; r = 0xffff8000; g = 0xffffff00; b = 0xffffffff; break; case ComixDungeonCharactor.T_ROSHI: start = 4400; r = 0xffff8000; g = 0xffff00ff; b = 0xff000000; break; } return createImage(new FilteredImageSource(createImage(new FilteredImageSource(dataImage.getSource(),new CropImageFilter(start + cutX,cutY,200,200))).getSource(),new ComixDungeonRGBFilter(r,g,b))); } } /** *クラス"ComixDungeonControlPanel" *ComixDungeonゲームの操作に使うパネル */ class ComixDungeonControlPanel extends Panel{ /** *パネルに貼るボタン */ static final Button GO = new Button("進"); static final Button LEFT = new Button("左"); static final Button RIGHT = new Button("右"); static final Button BACK = new Button("後"); static final Button ATTACK = new Button("攻"); /** *各種部品 */ private Panel buttons,labels; private TextArea text; /** *コンストラクタ *ボタンを貼るだけ貼るが、処理はアプレットに任せる */ ComixDungeonControlPanel(){ super(); setLayout(new GridLayout(3,1)); buttons = new Panel(); buttons.setLayout(new GridLayout(3,3)); buttons.add(new Canvas()); buttons.add(GO); buttons.add(new Canvas()); buttons.add(LEFT); buttons.add(ATTACK); buttons.add(RIGHT); buttons.add(new Canvas()); buttons.add(BACK); buttons.add(new Canvas()); add(buttons); labels = new Panel(); labels.setLayout(new GridLayout(3,2)); add(labels); text = new TextArea(); text.setEditable(false); add(text); } /** *メソッド"labelUpdate" *ラベルを新しくする */ void labelUpdate(int hp,int maxHP,int vit,int f,int e){ labels.removeAll(); labels.add(new Label("階層:" + f)); labels.add(new Label("Lv:" + ComixDungeon2.exToLevel(e))); labels.add(new Label("HP:" + hp + "/" + maxHP)); labels.add(new Label("体力:" + vit / 10 + "%")); labels.add(new Label("経験:" + e)); labels.add(new Label("次Lv:" + ComixDungeon2.levelToEx(ComixDungeon2.exToLevel(e)))); validate(); } /** *メソッド"writeText" *テキストボックスメッセージを書く */ void writeText(String s){ text.appendText(s); text.select(text.getSelectionEnd(),text.getSelectionEnd()); text.appendText("\n"); } /** *メソッド"resetText" *テキストボックスをリセットする */ void resetText(){ text.setText(""); } } /** *クラス"ComixDungeonMapCanvas" *ComixDungeonゲームのオートマップ表示用キャンバス */ class ComixDungeonMapCanvas extends Canvas{ /** *内部で持つ表示テーブル */ Color[][] mapTable; /** *イメージキャンセル用スタック */ Stack cancelX,cancelY; /** *コンストラクタ *表示テーブルの初期化も行う */ ComixDungeonMapCanvas(int x,int y){ super(); imageReset(x,y); } /** *メソッド"preferredSize" *このキャンバスは200*200の大きさで動く */ public Dimension preferredSize(){ return new Dimension(200,200); } /** *メソッド"minimumSize" *このキャンバスは200*200の大きさで動く */ public Dimension minimumSize(){ return new Dimension(200,200); } /** *メソッド"maximumSize" *このキャンバスは200*200の大きさで動く */ public Dimension maximumSize(){ return new Dimension(200,200); } /** *メソッド"imageReset" *イメージを初期化する */ void imageReset(int x,int y){ cancelX = new Stack(); cancelY = new Stack(); mapTable = new Color[x][y]; for(int i = 0;i < x * y;i++){ mapTable[i % x][i / x] = Color.black; } } /** *メソッド"imageUpdate" *マップと座標データから表示テーブルを更新する */ void imageUpdate(ComixDungeonMazeMap cdmm,int x,int y,int direction){ while(!(cancelX.empty())){ int stackX = ((Integer)(cancelX.pop())).intValue(); int stackY = ((Integer)(cancelY.pop())).intValue(); if(stackX == cdmm.getGoalX() && stackY == cdmm.getGoalY()){ mapTable[stackX][stackY] = Color.yellow; }else if(cdmm.getGrid(stackX,stackY).getItem() != null){ mapTable[stackX][stackY] = Color.green; }else{ mapTable[stackX][stackY] = Color.blue; } } int innerX = x; int innerY = y; int upperX = 0; int upperY = 0; switch(direction){ case ComixDungeon2.NORTH: upperY = -1; break; case ComixDungeon2.SOUTH: upperY = 1; break; case ComixDungeon2.WEST: upperX = -1; break; case ComixDungeon2.EAST: upperX = 1; } while(!(cdmm.getGrid(innerX,innerY).isWall())){ innerX += upperX; innerY += upperY; } if(innerX > -1 && innerX < mapTable.length && innerY > -1 && innerY < mapTable[innerX].length){ mapTable[innerX][innerY] = Color.gray; } int t = ((innerX - x) * upperX) + ((innerY - y) * upperY); while(t-- > 0){ int drawX = x + (t * upperX); int drawY = y + (t * upperY); ComixDungeonMazeGrid cGrid = cdmm.getGrid(drawX,drawY); ComixDungeonMazeGrid lGrid = cdmm.getGrid(drawX + upperY,drawY - upperX); ComixDungeonMazeGrid rGrid = cdmm.getGrid(drawX - upperY,drawY + upperX); if(lGrid.isWall()){ if(drawX + upperY > -1 && drawX + upperY < mapTable.length && drawY - upperX > -1 && drawY - upperX < mapTable[drawX + upperY].length){ mapTable[drawX + upperY][drawY - upperX] = Color.gray; } }else if(lGrid.getCharactor() != null && !(lGrid.getCharactor().isClear())){ mapTable[drawX + upperY][drawY - upperX] = Color.red; cancelX.push(new Integer(drawX + upperY)); cancelY.push(new Integer(drawY - upperX)); }else if(drawX + upperY == cdmm.getGoalX() && drawY - upperX == cdmm.getGoalY()){ mapTable[drawX + upperY][drawY - upperX] = Color.yellow; }else if(lGrid.getItem() != null){ mapTable[drawX + upperY][drawY - upperX] = Color.green; }else{ mapTable[drawX + upperY][drawY - upperX] = Color.blue; } if(rGrid.isWall()){ if(drawX - upperY > -1 && drawX - upperY < mapTable.length && drawY + upperX > -1 && drawY + upperX < mapTable[drawX - upperY].length){ mapTable[drawX - upperY][drawY + upperX] = Color.gray; } }else if(rGrid.getCharactor() != null && !(rGrid.getCharactor().isClear())){ mapTable[drawX - upperY][drawY + upperX] = Color.red; cancelX.push(new Integer(drawX - upperY)); cancelY.push(new Integer(drawY + upperX)); }else if(drawX - upperY == cdmm.getGoalX() && drawY + upperX == cdmm.getGoalY()){ mapTable[drawX - upperY][drawY + upperX] = Color.yellow; }else if(rGrid.getItem() != null){ mapTable[drawX - upperY][drawY + upperX] = Color.green; }else{ mapTable[drawX - upperY][drawY + upperX] = Color.blue; } if(t == 0){ mapTable[drawX][drawY] = Color.white; cancelX.push(new Integer(drawX)); cancelY.push(new Integer(drawY)); }else if(cGrid.getCharactor() != null && !(cGrid.getCharactor().isClear())){ mapTable[drawX][drawY] = Color.red; cancelX.push(new Integer(drawX)); cancelY.push(new Integer(drawY)); }else if(drawX == cdmm.getGoalX() && drawY == cdmm.getGoalY()){ mapTable[drawX][drawY] = Color.yellow; }else if(cGrid.getItem() != null){ mapTable[drawX][drawY] = Color.green; }else{ mapTable[drawX][drawY] = Color.blue; } } repaint(); } /** *メソッド"update" *ダブルバッファリングのため、残念ながら直接paintを呼ばさせていただきます */ public void update(Graphics g){ paint(g); } /** *メソッド"paint" *描画テーブルからイメージを起こして描画する */ public void paint(Graphics g){ int dx = 200 / mapTable.length; int dy = 200 / mapTable[0].length; for(int i = 0;i < mapTable.length * mapTable[0].length;i++){ g.setColor(mapTable[i % mapTable.length][i / mapTable.length]); g.fillRect(dx * (i % mapTable.length),dy * (i / mapTable.length),dx,dy); } } } /** *クラス"ComixDungeonItemPanel" *ComixDungeonゲームのアイテム用パネル */ class ComixDungeonItemPanel extends Panel{ /** *パネルに貼るリスト */ static final java.awt.List LIST = new java.awt.List(); /** *パネルに貼るボタン */ static final Button USE = new Button("使用"); static final Button THROW = new Button("投擲"); static final Button UNDER = new Button("足元"); /** *リストに入っているアイテムの実体 */ private Vector items; /** *コンストラクタ */ ComixDungeonItemPanel(){ setLayout(new GridLayout(1,2)); add(LIST); Panel p = new Panel(); p.setLayout(new GridLayout(3,1)); p.add(USE); p.add(THROW); p.add(UNDER); LIST.clear(); add(p); items = new Vector(20); } /** *メソッド"resetList" *リストを初期化する */ void resetList(){ LIST.clear(); items = new Vector(20); } /** *メソッド"addItem" *アイテムを加える *限界量のときはfalseを返す */ boolean addItem(ComixDungeonItem cdi){ if(items.size() < 20){ items.addElement(cdi); LIST.addItem(cdi.getName()); return true; }else{ return false; } } /** *メソッド"getItem" *アイテムを返す */ ComixDungeonItem getItem(int i){ return (ComixDungeonItem)(items.elementAt(i)); } /** *メソッド"removeItem" *アイテムを消去する */ void removeItem(int i){ items.removeElementAt(i); LIST.delItem(i); } /** *メソッド"getMass" *アイテムの数を返す */ int getMass(){ return items.size(); } } /** *クラス"ComixDungeonMazeMap" *ComixDungeonゲームに使うマップ */ class ComixDungeonMazeMap{ /** *特殊階層用定数 */ static final int DAKKI = 9; static final int KING_FIRST = 10; static final int ROSHI = 19; /** *マスを表す配列 */ private ComixDungeonMazeGrid[][] grids; /** *スタート、ゴールの座標 */ private int startX,startY,goalX,goalY; /** *階段かを示すブール値 */ private boolean stair; /** *コンストラクタ *マップを生成する */ ComixDungeonMazeMap(int x,int y,boolean s){ grids = new ComixDungeonMazeGrid[x][y]; for(int i = 0;i < y;i++){ for(int j = 0;j < x;j++){ grids[j][i] = new ComixDungeonMazeGrid(true); } } startX = Math.abs(ComixDungeon2.random.nextInt() % x); startY = Math.abs(ComixDungeon2.random.nextInt() % y); goalX = Math.abs(ComixDungeon2.random.nextInt() % x); goalY = Math.abs(ComixDungeon2.random.nextInt() % y); while(startX == goalX && startY == goalY){ goalX = Math.abs(ComixDungeon2.random.nextInt() % x); goalY = Math.abs(ComixDungeon2.random.nextInt() % y); } grids[startX][startY] = new ComixDungeonMazeGrid(false); grids[goalX][goalY] = new ComixDungeonMazeGrid(false); int directX = goalX - startX; int directY = goalY - startY; while(Math.abs(directX) + Math.abs(directY) > 1){ if(directX == 0 || (directY != 0 && ComixDungeon2.random.nextInt() < 0)){ directY -= Math.abs(directY) / directY; }else{ directX -= Math.abs(directX) / directX; } grids[goalX - directX][goalY - directY] = new ComixDungeonMazeGrid(false); } for(int k = 0;k < x * y;k++){ int rndX = Math.abs(ComixDungeon2.random.nextInt() % x); int rndY = Math.abs(ComixDungeon2.random.nextInt() % y); while((!(getGrid(rndX + 1,rndY).isWall()) && !(getGrid(rndX + 1,rndY + 1).isWall()) && !(getGrid(rndX,rndY + 1).isWall())) || (!(getGrid(rndX,rndY + 1).isWall()) && !(getGrid(rndX - 1,rndY + 1).isWall()) && !(getGrid(rndX - 1,rndY).isWall())) || (!(getGrid(rndX - 1,rndY).isWall()) && !(getGrid(rndX - 1,rndY - 1).isWall()) && !(getGrid(rndX,rndY - 1).isWall())) || (!(getGrid(rndX,rndY - 1).isWall()) && !(getGrid(rndX + 1,rndY - 1).isWall()) && !(getGrid(rndX + 1,rndY).isWall()))){ rndX = Math.abs(ComixDungeon2.random.nextInt() % x); rndY = Math.abs(ComixDungeon2.random.nextInt() % y); } grids[rndX][rndY] = new ComixDungeonMazeGrid(false); } stair = s; } /** *メソッド"getGrid" *指定されたマスを返す */ ComixDungeonMazeGrid getGrid(int x,int y){ if(x > -1 && y > -1 && x < grids.length && y < grids[0].length){ return grids[x][y]; }else{ return new ComixDungeonMazeGrid(true); } } /** *メソッド"getStartX" *スタートのX座標を返す */ int getStartX(){ return startX; } /** *メソッド"getStartY" *スタートのY座標を返す */ int getStartY(){ return startY; } /** *メソッド"getGoalX" *ゴールのX座標を返す */ int getGoalX(){ return goalX; } /** *メソッド"getGoalY" *ゴールのY座標を返す */ int getGoalY(){ return goalY; } /** *メソッド"hasStair" *階段を持つかを返す */ boolean hasStair(){ return stair; } /** *メソッド"getSpecialMap" *特殊階層のマップを得る */ static final ComixDungeonMazeMap getSpecialMap(int type){ ComixDungeonMazeMap cdmm = new ComixDungeonMazeMap(20,20,false); String wallData = null; switch(type){ case DAKKI: cdmm.startX = 9; cdmm.startY = 1; cdmm.goalX = 10; cdmm.goalY = 7; wallData = "rrrwwrrrrwwrrrrwwrrr"+ "rwrrrrwwrrrrwwrrrrwr"+ "rrwwwwwwwwwwwwwwwwrr"+ "wrwwrrrrrwwwrrrrrwrw"+ "wrwwrwwwrwwwrwwwrwrw"+ "rrwwrwwwrwwwrwwwrwrr"+ "rwwwrwwwrwwwrwwwrwwr"+ "rwwwrrrrrrrrrrrrrwwr"+ "rrwwwwwwrwwwrwwwwwrr"+ "wrwwwwwwrwwwrwwwwwrw"+ "wrwwwwwwrwwwrwwwwwrw"+ "rrwwrrrrrrrrrrrrrwrr"+ "rwwwrwwwrwwwrwwwrwwr"+ "rwwwrwwwrwwwrwwwrwwr"+ "rrwwrwwwrwwwrwwwrwrr"+ "wrwwrrrrrwwwrrrrrwrw"+ "wrwwwrwwwwwwwwrwwwrw"+ "rrwwwrwwwwwwwwrwwwrr"+ "rwrrrrwwrrrrwwrrrrwr"+ "rrrwwrrrrwwrrrrwwrrr"; break; case KING_FIRST: cdmm.startX = 8; cdmm.startY = 11; cdmm.goalX = 11; cdmm.goalY = 11; wallData = "wwwrrrrrrrrrrrrrrwww"+ "wwwrwwwwrwwrwwwwrwww"+ "wwrrrrrrrwwrrrrrrrww"+ "rrrwwwwwrwwrwwwwwrrr"+ "rwrwwwwwrwwrwwwwwrwr"+ "rwrwwwwwrwwrwwwwwrwr"+ "rwrwwwwwrwwrwwwwwrwr"+ "rwrwwwwwrwwrwwwwwrwr"+ "rrrrrrrrrrrrrrrrrrrr"+ "rwwwwwwwrwwrwwwwwwwr"+ "rwwwwwwwrwwrwwwwwwwr"+ "rrrrrrrrrrrrrrrrrrrr"+ "rwrwwwwwrwwrwwwwwrwr"+ "rwrwwwwwrwwrwwwwwrwr"+ "rwrwwwwwrwwrwwwwwrwr"+ "rwrwwwwwrwwrwwwwwrwr"+ "rrrwwwwwrwwrwwwwwrrr"+ "wwrrrrrrrwwrrrrrrrww"+ "wwwrwwwwrwwrwwwwrwww"+ "wwwrrrrrrrrrrrrrrwww"; break; case ROSHI: cdmm.startX = 9; cdmm.startY = 0; cdmm.goalX = 10; cdmm.goalY = 10; wallData = "wwwwrrrrrrrrrrrrrrrw"+ "rrrrrwwwwwwwwwwwwwrw"+ "rwwwrwrrrrrrrrrrrwrw"+ "rwrrrrrwwwwwwwwwrwrw"+ "rwrwwwrwrrrrrrrwrrrr"+ "rwrwrrrrrwwwwwrwrwwr"+ "rwrwrwwwrwrrrwrrrrwr"+ "rwrwrwrrrrrwrwrwwrwr"+ "rwrwrwrwwwwwrrrrwrwr"+ "rwrwrwrrwwwwrwwrwrwr"+ "rwrwrwwrwwwwrrwrwrwr"+ "rwrwrrrrwwwwwrwrwrwr"+ "rwrwwrwrwrrrrrwrwrwr"+ "rwrrrrwrrrwrwwwrwrwr"+ "rwwrwrwwwwwrrrrrwrwr"+ "rrrrwrrrrrrrwrwwwrwr"+ "wrwrwwwwwwwwwrrrrrwr"+ "wrwrrrrrrrrrrrwrwwwr"+ "wrwwwwwwwwwwwwwrrrrr"+ "wrrrrrrrrrrrrrrrwwww"; break; } for(int i = 0;i < 20;i++){ for(int j = 0;j < 20;j++){ if(wallData.charAt(j + (i * 20)) == 'r'){ cdmm.grids[j][i] = new ComixDungeonMazeGrid(false); }else{ cdmm.grids[j][i] = new ComixDungeonMazeGrid(true); } } } return cdmm; } } /** *クラス"ComixDungeonMazeGrid" *ComixDungeonゲームに使うマス */ class ComixDungeonMazeGrid{ private boolean isWall; private ComixDungeonCharactor cdc; private ComixDungeonItem cdi; private boolean isBio; /** *コンストラクタ *引数は壁かどうかを意味する */ ComixDungeonMazeGrid(boolean w){ isWall = w; cdc = null; cdi = null; isBio = false; } /** *メソッド"isWall" *壁かどうかを返す */ boolean isWall(){ return isWall; } /** *メソッド"putCharactor" *キャラクタを配置する */ void putCharactor(ComixDungeonCharactor c){ cdc = c; } /** *メソッド"getCharactor" *マスにいるキャラクタを返す */ ComixDungeonCharactor getCharactor(){ return cdc; } /** *メソッド"putItem" *アイテムを配置する */ void putItem(ComixDungeonItem i){ cdi = i; } /** *メソッド"getItem" *マスにあるアイテムを返す */ ComixDungeonItem getItem(){ return cdi; } /** *メソッド"makeBio" *バイオを作る */ void makeBio(){ isBio = true; } /** *メソッド"isBio" *バイオが出来ているかを返す */ boolean isBio(){ return isBio; } } /** *クラス"ComixDungeonCharactor" *ComixDungeonゲームのキャラクタ */ class ComixDungeonCharactor{ /** *方向変更用の定数 */ static final int LEFT = 1; static final int BACK = 2; static final int RIGHT = 3; /** *タイプ指定用定数 */ static final int YOU = 0; static final int G_SLIME = 10; static final int R_SLIME = 11; static final int C_SLIME = 12; static final int L_MOUSE = 20; static final int S_MOUSE = 21; static final int E_MOUSE = 22; static final int F_MAGE = 30; static final int I_MAGE = 31; static final int L_MAGE = 32; static final int N_YASAI = 40; static final int S_YASAI = 41; static final int C_SPIRIT = 50; static final int B_SPIRIT = 51; static final int U_SPIRIT = 52; static final int S_DAKKI = 60; static final int O_DAKKI = 61; static final int K_DAKKI = 62; static final int D_DAKKI = 63; static final int D_KNIGHT = 70; static final int R_KNIGHT = 71; static final int F_CHUO = 80; static final int L_CHUO = 81; static final int SHIGA = 90; static final int Z_BIODOG = 100; static final int C_BIODOG = 101; static final int F_DEVIL = 110; static final int U_DEVIL = 111; static final int D_DEVIL = 112; static final int L_ROSHI = 120; static final int S_ROSHI = 121; static final int Y_ROSHI = 122; static final int T_ROSHI = 123; /** *各種パラメーター */ private int type; private int direction; private int mhp; private int hp; private int ex; private boolean yasaian; private boolean clear; private boolean drainable; private int confused; private boolean canceled; /** *コンストラクタ *方向はランダムで決める */ ComixDungeonCharactor(int t){ type = t; direction = Math.abs(ComixDungeon2.random.nextInt() % 4); switch(type){ case YOU: mhp = 15; ex = 0; break; case G_SLIME: mhp = 5; ex = 2; break; case R_SLIME: mhp = 15; ex = 5; break; case C_SLIME: mhp = 30; ex = 20; break; case L_MOUSE: mhp = 10; ex = 3; break; case S_MOUSE: mhp = 20; ex = 10; break; case E_MOUSE: mhp = 70; ex = 500; break; case F_MAGE: mhp = 3; ex = 5; break; case I_MAGE: mhp = 5; ex = 10; break; case L_MAGE: mhp = 8; ex = 75; break; case N_YASAI: mhp = 25; ex = 7; break; case S_YASAI: mhp = 30; ex = 10; break; case C_SPIRIT: mhp = 1; ex = 5; break; case B_SPIRIT: mhp = 1; ex = 5; break; case U_SPIRIT: mhp = 1; ex = 2000; break; case S_DAKKI: mhp = 20; ex = 30; break; case O_DAKKI: mhp = 30; ex = 75; break; case K_DAKKI: mhp = 40; ex = 100; break; case D_DAKKI: mhp = 50; ex = 200; break; case D_KNIGHT: mhp = 35; ex = 50; break; case R_KNIGHT: mhp = 50; ex = 100; break; case F_CHUO: mhp = 50; ex = 300; break; case L_CHUO: mhp = 100; ex = 0; break; case SHIGA: mhp = 25; ex = 50; break; case Z_BIODOG: mhp = 50; ex = 75; break; case C_BIODOG: mhp = 80; ex = 300; break; case F_DEVIL: mhp = 30; ex = 100; break; case U_DEVIL: mhp = 80; ex = 1000; break; case D_DEVIL: mhp = 1; ex = 200; break; case L_ROSHI: mhp = 150; ex = 3000; break; case S_ROSHI: mhp = 10; ex = 5; break; case Y_ROSHI: mhp = 10; ex = 5; break; case T_ROSHI: mhp = 10; ex = 5; break; } hp = mhp; if(type != S_YASAI && type != SHIGA){ yasaian = false; }else{ yasaian = true; } if(type != C_SLIME && type != U_SPIRIT && type != F_CHUO && type != D_DEVIL){ clear = false; }else{ clear = true; } if(type != F_DEVIL){ drainable = false; }else{ drainable = true; } confused = 0; canceled = false; } /** *メソッド"getType" *種類を返す */ int getType(){ return type; } /** *メソッド"getDirection" *方向を返す */ int getDirection(){ return direction; } /** *メソッド"setDirection" *方向を変える */ void setDirection(int d){ int i = d; while(i-- > 0){ switch(direction){ case ComixDungeon2.NORTH: direction = ComixDungeon2.WEST; break; case ComixDungeon2.SOUTH: direction = ComixDungeon2.EAST; break; case ComixDungeon2.EAST: direction = ComixDungeon2.NORTH; break; case ComixDungeon2.WEST: direction = ComixDungeon2.SOUTH; } } } /** *メソッド"addMaxHP" *最大HPを引数ほど変更する */ void addMaxHP(int d){ setMaxHP(mhp + d); } /** *メソッド"getMaxHP" *最大HPを返す */ int getMaxHP(){ return mhp; } /** *メソッド"setMaxHP" *最大HPを変更し、それに沿って現在HPも変える *それによって現在HPが0以下になれば1にする *また、最大HPも0以下になれば1にする */ void setMaxHP(int m){ int gmhp = m - mhp; if(m < 1){ mhp = 1; }else{ mhp = m; } addHP(gmhp); if(hp < 1){ hp = 1; } } /** *メソッド"addHP" *現在HPを引数ほど変更する */ void addHP(int d){ setHP(hp + d); } /** *メソッド"getHP" *現在HPを返す */ int getHP(){ return hp; } /** *メソッド"setHP" *現在HPを変える *計算の結果最大値を超える、または負の値を取るときは最適な値にする */ void setHP(int h){ hp = h; if(hp < 0){ hp = 0; }else if(hp > mhp){ hp = mhp; } } /** *メソッド"getAttack" *攻撃力を返す */ int getAttack(){ int a = 0; switch(type){ case YOU: a = (ComixDungeon2.exToLevel(ex) + 2); break; case C_SPIRIT: case B_SPIRIT: case U_SPIRIT: case F_DEVIL: a = 1; break; case G_SLIME: a = 2; break; case L_MOUSE: a = 3; break; case R_SLIME: a = 5; break; case F_MAGE: case N_YASAI: a = 10; break; case C_SLIME: case S_MOUSE: case S_DAKKI: case L_ROSHI: case S_ROSHI: case Y_ROSHI: case T_ROSHI: a = 15; break; case E_MOUSE: case I_MAGE: case O_DAKKI: case K_DAKKI: case D_KNIGHT: case Z_BIODOG: case C_BIODOG: a = 20; break; case L_MAGE: case D_DAKKI: case R_KNIGHT: case U_DEVIL: a = 30; break; case F_CHUO: case L_CHUO: a = 40; break; case D_DEVIL: a = 100; break; case S_YASAI: a = 15 + (ex / 5); break; case SHIGA: a = 20 + (ex / 50); break; } return a; } /** *メソッド"getDefense" *防御力を返す */ int getDefense(){ int d = 0; switch(type){ case YOU: case G_SLIME: case L_MOUSE: case N_YASAI: case C_SPIRIT: case B_SPIRIT: case U_SPIRIT: case Z_BIODOG: case C_BIODOG: case F_DEVIL: case D_DEVIL: case S_ROSHI: case Y_ROSHI: case T_ROSHI: d = 0; break; case R_SLIME: case C_SLIME: case S_MOUSE: case E_MOUSE: case S_DAKKI: case O_DAKKI: case K_DAKKI: case D_KNIGHT: case R_KNIGHT: d = 5; break; case F_MAGE: case I_MAGE: case L_MAGE: case D_DAKKI: case F_CHUO: case SHIGA: case U_DEVIL: case L_ROSHI: d = 10; break; case L_CHUO: d = 127; break; case S_YASAI: d = (ex / 5); break; } return d; } /** *メソッド"getThrowSpell" *投げる魔法を返す */ ComixDungeonItem getThrowSpell(){ if(canceled){ return null; }else{ ComixDungeonItem cdi = null; switch(type){ case YOU: case G_SLIME: case R_SLIME: case C_SLIME: case L_MOUSE: case S_MOUSE: case N_YASAI: case S_YASAI: case C_SPIRIT: case B_SPIRIT: case U_SPIRIT: case D_KNIGHT: case R_KNIGHT: case L_CHUO: case F_DEVIL: case U_DEVIL: case D_DEVIL: case L_ROSHI: case S_ROSHI: case Y_ROSHI: case T_ROSHI: break; case F_MAGE: case S_DAKKI: cdi = new ComixDungeonItem(ComixDungeonItem.B_FIRE); break; case I_MAGE: case O_DAKKI: case K_DAKKI: cdi = new ComixDungeonItem(ComixDungeonItem.B_ICE); break; case E_MOUSE: case L_MAGE: case D_DAKKI: cdi = new ComixDungeonItem(ComixDungeonItem.B_LIGHTNING); break; case F_CHUO: cdi = new ComixDungeonItem(ComixDungeonItem.B_CANCELING); break; case Z_BIODOG: case C_BIODOG: cdi = new ComixDungeonItem(ComixDungeonItem.B_BIO); break; case SHIGA: if(ex > 500){ cdi = new ComixDungeonItem(ComixDungeonItem.B_LIGHTNING); }else{ cdi = new ComixDungeonItem(ComixDungeonItem.B_ICE); } break; } return cdi; } } /** *メソッド"getReadSpell" *直接唱える魔法を返す */ ComixDungeonItem getReadSpell(){ if(canceled){ return null; }else{ ComixDungeonItem cdi = null; switch(type){ case YOU: case G_SLIME: case R_SLIME: case C_SLIME: case L_MOUSE: case S_MOUSE: case F_MAGE: case N_YASAI: case S_YASAI: case S_DAKKI: case D_KNIGHT: case R_KNIGHT: case L_CHUO: case SHIGA: case Z_BIODOG: case F_DEVIL: case L_ROSHI: case S_ROSHI: case Y_ROSHI: case T_ROSHI: break; case I_MAGE: cdi = new ComixDungeonItem(ComixDungeonItem.B_TURNBACK); break; case C_SPIRIT: cdi = new ComixDungeonItem(ComixDungeonItem.B_CANCELING); break; case L_MAGE: case B_SPIRIT: case F_CHUO: case D_DEVIL: cdi = new ComixDungeonItem(ComixDungeonItem.B_CONFUSING); break; case U_SPIRIT: cdi = new ComixDungeonItem(ComixDungeonItem.B_ULTIMET); break; case E_MOUSE: if(mhp / 2 < hp){ cdi = new ComixDungeonItem(ComixDungeonItem.B_LIGHTNING); } break; case O_DAKKI: case K_DAKKI: if(mhp / 2 > hp){ cdi = new ComixDungeonItem(ComixDungeonItem.B_TURNBACK); } break; case D_DAKKI: if(mhp / 2 > hp){ cdi = new ComixDungeonItem(ComixDungeonItem.B_CONFUSING); } break; case U_DEVIL: if(mhp / 2 < hp){ cdi = new ComixDungeonItem(ComixDungeonItem.B_ULTIMET); } break; case C_BIODOG: if(mhp / 2 > hp){ cdi = new ComixDungeonItem(ComixDungeonItem.B_BIO); } break; } return cdi; } } /** *メソッド"isYasaian" *「超野菜人」特性があれば真を返す */ boolean isYasaian(){ return yasaian; } /** *メソッド"isClear" *「透明」特性があれば真を返す */ boolean isClear(){ return clear; } /** *メソッド"isDrainable" *「体力吸収」特性があれば真を返す */ boolean isDrainable(){ return drainable; } /** *メソッド"addConfused" *「混乱」回復までのターン数を加算する */ void addConfused(int c){ setConfused(confused + c); } /** *メソッド"getConfused" *「混乱」回復までのターン数を返す *混乱していなければ0を返す */ int getConfused(){ return confused; } /** *メソッド"setConfused" *「混乱」回復までのターン数を設定する *負の数をとればもちろん最適化 */ void setConfused(int c){ confused = Math.max(c,0); } /** *メソッド"setCanceled" *「封印」させる */ void setCanceled(){ yasaian = false; clear = false; drainable = false; canceled = true; } /** *メソッド"addEx" *経験値を加算する *プレイヤーならレベル変更によってHPの再計算 *モンスターなら変化処理 */ void addEx(int d){ switch(type){ case YOU: int olv = ComixDungeon2.exToLevel(ex); ex += d; addMaxHP((Math.abs(ComixDungeon2.random.nextInt() % 3) + 3) * (ComixDungeon2.exToLevel(ex) - olv)); break; case G_SLIME: type = R_SLIME; addMaxHP(10); ex = 5; break; case R_SLIME: type = C_SLIME; addMaxHP(15); ex = 20; clear = true; break; case L_MOUSE: type = S_MOUSE; addMaxHP(10); ex = 10; break; case S_MOUSE: type = E_MOUSE; addMaxHP(50); ex = 500; break; case F_MAGE: type = I_MAGE; addMaxHP(2); ex = 10; break; case I_MAGE: type = L_MAGE; addMaxHP(3); ex = 75; break; case N_YASAI: type = S_YASAI; addMaxHP(5); ex = 10; yasaian = true; break; case S_YASAI: ex += 10; break; case SHIGA: addMaxHP(3); ex += 50; break; case Z_BIODOG: type = C_BIODOG; addMaxHP(30); ex = 300; break; case F_DEVIL: type = U_DEVIL; addMaxHP(50); ex = 1000; drainable = false; break; case C_SLIME: case E_MOUSE: case L_MAGE: case C_SPIRIT: case B_SPIRIT: case U_SPIRIT: case S_DAKKI: case O_DAKKI: case K_DAKKI: case D_DAKKI: case D_KNIGHT: case R_KNIGHT: case F_CHUO: case L_CHUO: case C_BIODOG: case U_DEVIL: case D_DEVIL: case L_ROSHI: case S_ROSHI: case Y_ROSHI: case T_ROSHI: break; } } /** *メソッド"getEx" *経験値を返す */ int getEx(){ return ex; } /** *メソッド"getName" *名前を返す */ String getName(){ if(clear){ return "見えない敵"; }else{ switch(type){ case YOU: return "あなた"; case G_SLIME: return "グリーンスライム"; case R_SLIME: return "レッドスライム"; case C_SLIME: return "クリアスライム"; case L_MOUSE: return "大ネズミ"; case S_MOUSE: return "サーベルマウス"; case E_MOUSE: return "電気ネズミ"; case F_MAGE: return "火炎術師"; case I_MAGE: return "氷河術師"; case L_MAGE: return "雷電術師"; case N_YASAI: return "野菜人"; case S_YASAI: return ("超野菜人" + Integer.toString(ex / 10)); case C_SPIRIT: return "封印の魂"; case B_SPIRIT: return "混乱の魂"; case U_SPIRIT: return "邪神の魂"; case S_DAKKI: return "サキュバス"; case O_DAKKI: return "王貴人"; case K_DAKKI: return "胡喜媚"; case D_DAKKI: return "蘇妲己"; case D_KNIGHT: return "暗黒騎士"; case R_KNIGHT: return "魯仁傑"; case F_CHUO: return "ザ キング"; case L_CHUO: return "ザ イーヴル"; case SHIGA: return ("姜子牙" + Integer.toString(ex / 50)); case Z_BIODOG: return "ゾンビ犬"; case C_BIODOG: return "ケルベロス"; case F_DEVIL: return "食欲魔神"; case U_DEVIL: return "究極魔神"; case D_DEVIL: return "デスピエロ"; case L_ROSHI: return "老子"; case S_ROSHI: return "上清道人"; case Y_ROSHI: return "玉清道人"; case T_ROSHI: return "太清道人"; } return ""; } } } /** *クラス"ComixDungeonItem" *ComixDungeonゲームのアイテム */ class ComixDungeonItem{ /** *タイプ指定用定数 */ static final int W_STICK = 0; static final int W_SPIKEDCLUB = 1; static final int W_STONEAXE = 2; static final int W_BRONZESPEAR = 3; static final int W_IRONSWORD = 4; static final int W_SILVERSWORD = 5; static final int W_DIAMONDSWORD = 6; static final int W_GOLDBAT = 7; static final int A_LEATHER = 100; static final int A_SCALE = 101; static final int A_RING = 102; static final int A_BRONZE = 103; static final int A_IRON = 104; static final int A_SILVER = 105; static final int A_DIAMOND = 106; static final int A_GOLD = 107; static final int M_PORK = 200; static final int M_BEEF = 201; static final int B_HEALING = 300; static final int B_HEALINGTWO = 301; static final int B_FIRE = 302; static final int B_ICE = 303; static final int B_LIGHTNING = 304; static final int B_CONFUSING = 305; static final int B_TURNBACK = 306; static final int B_CANCELING = 307; static final int B_BIO = 308; static final int B_ULTIMET = 309; static final int S_TETRAFORCE = 400; /** *種類判別用定数 */ static final int WEAPON = 0; static final int ARMOR = 100; static final int MEAT = 200; static final int BOOK = 300; static final int SPECIAL = 400; /** *アイテムの種類 */ private int type; /** *コンストラクタ */ ComixDungeonItem(int t){ type = t; } /** *メソッド"getName" *名前を返す */ String getName(){ switch(type){ case W_STICK: return "棒"; case W_SPIKEDCLUB: return "棍棒"; case W_STONEAXE: return "石の斧"; case W_BRONZESPEAR: return "青銅の槍"; case W_IRONSWORD: return "鉄の剣"; case W_SILVERSWORD: return "銀の剣"; case W_DIAMONDSWORD: return "ダイアの剣"; case W_GOLDBAT: return "黄金のバット"; case A_LEATHER: return "革の鎧"; case A_SCALE: return "鱗の鎧"; case A_RING: return "鎖の鎧"; case A_BRONZE: return "青銅の鎧"; case A_IRON: return "鉄の鎧"; case A_SILVER: return "銀の鎧"; case A_DIAMOND: return "ダイアの鎧"; case A_GOLD: return "黄金の鎧"; case M_PORK: return "豚肉"; case M_BEEF: return "牛肉"; case B_HEALING: return "回復の書"; case B_HEALINGTWO: return "大回復の書"; case B_FIRE: return "炎の書"; case B_ICE: return "氷の書"; case B_LIGHTNING: return "雷の書"; case B_CONFUSING: return "混乱の書"; case B_TURNBACK: return "回れ右の書"; case B_CANCELING: return "封印の書"; case B_BIO: return "毒の書"; case B_ULTIMET: return "究極の書"; case S_TETRAFORCE: return "テトラフォース"; } return null; } /** *メソッド"getType" *タイプを返す */ int getType(){ return type; } } /** *クラス"ComixDungeonRGBFilter" *ComixDungeonで使うグラフィックの加工に使う */ class ComixDungeonRGBFilter extends RGBImageFilter{ /** *色テーブル */ private int exRed; private int exGreen; private int exBlue; /** *コンストラクタ *canFilterIndexColorModelはtrueで行く */ ComixDungeonRGBFilter(int r,int g,int b){ super(); exRed = r; exGreen = g; exBlue = b; canFilterIndexColorModel = true; } /** *メソッド"filterRGB" *元の絵の黒は透明に、残りの三色はコンストラクタの引数通りに処理する */ public int filterRGB(int x,int y,int rgb){ if((rgb & 0x000000ff) > 0x0000007f){ return exBlue; }else if((rgb & 0x0000ff00) > 0x00007f00){ return exGreen; }else if((rgb & 0x00ff0000) > 0x007f0000){ return exRed; }else{ return 0; } } }