// ここから始まったRPG 謎の世界編 // 2004/07/25 import java.awt.*; import java.awt.event.*; import java.applet.*; import java.io.*; import java.net.URL; import java.util.Random; public class FirstRpg extends Applet implements Runnable,KeyListener{ Image buffer;//イメージバッファ Graphics bufferg;//バックバッファ Random rand = new Random();//乱数 volatile Thread th;//スレッド final int CHIP_SIZE=32;//チップサイズ final int MAX_EVENT_TABLE=100;//イベントテーブルの最大個数 final int KAKUHO_NO=99;//確保イベントNO(キャラが次に着く位置) final int WORLD_MAP=50;//世界マップの番号 final int CMAX=3;//パーティ人数 float FrameTime;//1フレームあたりの時間(秒) long waitTime;//現在時刻保存用 Image chara_image;//キャラチップ画像 MyClass My = new MyClass(0);//自分クラス宣言(チップNO 0) //仲間クラス宣言 PartyClass party[] = { new PartyClass(9), new PartyClass(68), new PartyClass(69), new PartyClass(70), }; //方向テーブル(上下左右不動の順) int dir_x[] = {0,0,-1,+1,0}; int dir_y[] = {-1,+1,0,0,0}; //キーの状態(離している=0、押し続けている=1、押した瞬間=2) int key_states[] = new int[6];//4方向(上=0,下=1,左=2,右=3)+Zキー=4、Xキー=5 //マップデータ int now_map_no;//現在のマップNO short map_data[][] = new short[256][256];//256×256 int map_width,map_height;//マップの横幅、高さ(チップ数) Image map_image;//マップチップ画像 ClassLoader classLoader = this.getClass().getClassLoader(); //イベントデータ int event_data[][] = new int[256][256]; //イベントテーブル Event eventtbl[] = new Event[MAX_EVENT_TABLE]; int event_num;//そのマップでのイベントの個数 // イベントファイル用バッファ char gl_event_file_buffer[] = new char[ 4096 ]; //ゲーム進行スイッチ boolean game_switch[] = new boolean[128]; //------------ゲーム管理フラグ------------- //0=マップ移動(黒幕下がる) //1=マップ移動(黒幕上がる) //2=イベント中 //3=会話イベント //4=文字が流れている途中 //7=デバッグフラグ //8=テーブル更新予約フラグ //9=ダイアログ中 //10=スクリプトスキップ中 //11=イベント強制移動中 //12=主人公強制移動中 //13=ゲーム終了スタート //14=画面中央にENDの文字 //15=ゲーム完全終了 boolean game_flags[] = new boolean[16]; //------------ゲーム管理ウェイト(floatバッファにも使う)----------- //0=黒い幕の昇降ウェイト //1=会話の流れる文字ウェイト float game_waits[] = new float[8]; //------------ゲーム管理バッファ----------- //0=現在のイベントNO //1=読み込むマップNO //2=移動先X座標 //3=移動先Y座標 //4=移動後向き //5=現在のスクリプトの行 //6=会話中の文字の位置。 //7=現在選択中選択肢 //8=選択肢の数 int game_buffer[] = new int[16]; //------------ゲーム管理文字列----------- //0=現在のスクリプトファイル名 //1=現在の会話内容 //2=分岐1 //3=分岐2 //4=分岐3 String game_strings[] = new String[8]; char game_talks[] = new char[256];//会話内容char配列 //当たり判定用のセルテーブル(マップ) MapCell celltbl[] = { new MapCell(0,true), //平原 new MapCell(1,true), //芝1 new MapCell(2,true), //芝2 new MapCell(3,true), //家 new MapCell(4,false), //木1 new MapCell(5,false), //木2 new MapCell(6,true), //城 new MapCell(7,false), //海 new MapCell(8,true), //塔(上) new MapCell(9,true), //塔(下) new MapCell(10,true), //洞窟 new MapCell(11,false), //岩山 new MapCell(12,true), //宇宙1 new MapCell(13,true), //宇宙2 new MapCell(14,false), //クリスタル new MapCell(15,true), //宇宙の城 new MapCell(16,true), //真っ黒 new MapCell(17,true), //茶色 new MapCell(18,false), //灰色 new MapCell(19,false), //ツボ new MapCell(20,true), //空 new MapCell(21,true), //地面2 new MapCell(22,true), //宝箱 new MapCell(23,true), //青壁 new MapCell(24,true), //黒 new MapCell(25,false), //机 new MapCell(26,false), //川1 new MapCell(27,false), //川2 new MapCell(28,false), //洞窟岩 new MapCell(29,true), //洞窟地面 new MapCell(30,true), //草原1 new MapCell(31,true), //草原2 new MapCell(32,true), //雪地面 new MapCell(33,true), //雪芝1 new MapCell(34,true), //雪芝2 new MapCell(35,true), //雪家 new MapCell(36,false), //雪木 new MapCell(37,true), //雪城 new MapCell(38,false), //雪池 new MapCell(39,true), //雪洞窟 new MapCell(40,true), //雪木 new MapCell(41,true), //雪芝3 new MapCell(42,true), //木の壁 new MapCell(43,true), //橋 new MapCell(44,true), //階段1 new MapCell(45,true), //階段2 }; //当たり判定用のセルテーブル(キャラ) CharaCell charatbl[] = new CharaCell[256]; //マップデータ構造 MapFile mapfiles[] = { new MapFile(1,"フィールド1",20,12), new MapFile(2,"別荘の庭",20,12), new MapFile(3,"別荘",20,12), new MapFile(4,"二階",20,12), new MapFile(5,"一階",20,12), new MapFile(6,"学校フィールド",20,12), new MapFile(7,"学校1階",20,24), new MapFile(8,"学校2階",20,12), new MapFile(9,"理科室",20,12), new MapFile(10,"運動場",20,12), new MapFile(11,"謎の世界",80,36), new MapFile(12,"洞窟1",20,12), new MapFile(13,"洞窟2",20,12), new MapFile(14,"洞窟3",20,12), new MapFile(15,"洞窟4",20,12), new MapFile(16,"おちかた村",40,24), new MapFile(17,"カワニシの塔1",20,12), new MapFile(18,"カワニシの塔2",20,12), new MapFile(19,"カワニシの塔3",20,12), new MapFile(20,"カワニシの塔4",20,12), new MapFile(21,"イクノ城1",20,48), new MapFile(22,"イクノ城2",20,24), new MapFile(23,"イクノ城3",20,12), new MapFile(24,"魔王の間",20,12), }; final int MAXMAPNUM = 24;//マップの個数 //初期化 public void init(){ System.out.println("init()"); int i; Dimension d = getSize(); MediaTracker mediaT = new MediaTracker(this); //キャラチップ画像ロード // getImage(URL) // chara_image = getImage( getDocumentBase(),"chara_chip.gif"); chara_image = getImage( classLoader.getResource("chara_chip.gif") ); mediaT.addImage(chara_image,0); //マップチップ画像ロード //map_image = getImage(getDocumentBase(),"map_chip.gif"); map_image = getImage( classLoader.getResource("map_chip.gif") ); mediaT.addImage(map_image,0); //ロード待ち try{ mediaT.waitForAll(); }catch(InterruptedException e){} //透明色指定 chara_image = Harulib.getAlphaImage(chara_image,new Color(0,255,0)); //イベントテーブル初期化 for(i=0;i= 1){ eventtbl[ event_data[x][y] ].x = x; eventtbl[ event_data[x][y] ].y = y; eventtbl[ event_data[x][y] ].px = x*CHIP_SIZE; eventtbl[ event_data[x][y] ].py = y*CHIP_SIZE; //その他初期化 eventtbl[ event_data[x][y] ].sum_move_length = 0.0f; } if(++x == map_width){ ++y; x=0; if(y==map_height)break; //終了条件 } } is.close(); }catch(IOException e){} //イベントを全てアクティブにする。0以外。 for(i=1;i",0); //NULLと書いてるものはそのまま実行 if(str.equals("NULL")){;} else{ //数字のものはゲーム進行スイッチにより読み込む sw = Integer.parseInt(str); //条件がマッチしているか? if(game_switch[sw]){ ;//続ける }else{ //この行は破棄 x=0; y++; continue; } } //イベントNO str = Harulib.HaruSplit(sline,"<>",1); no = Integer.parseInt(str); eventtbl[no].no = Integer.parseInt(str); //System.out.println("y="+y+" eventtbl[y].no="+eventtbl[y].no); //スクリプト名 str = Harulib.HaruSplit(sline,"<>",2); eventtbl[no].filename = str; //グラフィックス str = Harulib.HaruSplit(sline,"<>",3); eventtbl[no].gra = Integer.parseInt(str); //System.out.println("y="+y+" eventtbl[y].gra="+eventtbl[y].gra); //移動タイプ str = Harulib.HaruSplit(sline,"<>",4); eventtbl[no].type_of_move = Integer.parseInt(str); eventtbl[no].speed = 32; //イベントタイプ str = Harulib.HaruSplit(sline,"<>",5); eventtbl[no].type_of_event = Integer.parseInt(str); //最大値保存 if(maxno < no){ maxno = no; } x=0; y++; } } is.close(); }catch(IOException e){} //0を作る eventtbl[0].gra = 255; //イベントの数(最大値) event_num = maxno+1; //KAKUHO_NO番目に入れる eventtbl[KAKUHO_NO].gra = 254;//透明で当たる eventtbl[KAKUHO_NO].type_of_event = 0; //自動的に始まるイベントがあった場合、それを起動 for(i=0;i lim_right){ view_x = lim_right; } if(My.py + CHIP_SIZE/2 < lim_top){ view_y = lim_top; } if(My.py + CHIP_SIZE/2 > lim_bottom){ view_y = lim_bottom; } } //マップデータの範囲(主人公から6チップ分) int start_x; int start_y; int end_x; int end_y; start_x = view_x/CHIP_SIZE - 6; start_y = view_y/CHIP_SIZE - 6; end_x = view_x/CHIP_SIZE + 6; end_y = view_y/CHIP_SIZE + 6; //描画位置IJ //世界マップのみ int disp_start_i,disp_i,disp_start_j,disp_j; disp_start_i = start_y; disp_start_j = start_x; //限界 //世界マップ以外 if(now_map_no != WORLD_MAP){ if(start_x < 0){start_x = 0;} if(start_y < 0){start_y = 0;} if(end_x > map_width){end_x = map_width;} if(end_y > map_height){end_y = map_height;} }else{ //ループ //世界マップのみ if(start_x < 0){start_x += map_width;} if(end_x >= map_width){end_x -= map_width;} if(start_y < 0){start_y += map_height;} if(end_y >= map_height){end_y -= map_height;} } //描画位置 int dsp_x; int dsp_y; for(i=start_y,disp_i=disp_start_i; ;i++,disp_i++){ //iがマップ端の場合、0に。(世界マップのみ) if(i == map_height && now_map_no == WORLD_MAP){i = 0;} //終了 if(i == end_y){break;} for(j=start_x,disp_j=disp_start_j; ;j++,disp_j++){ //jがマップ端の場合、0に。 if(j == map_width && now_map_no == WORLD_MAP){j = 0;} //終了 if(j == end_x){break;} //セルデータ取得 cell_data = map_data[j][i]; //セルデータからマップグラフィックスを取得 gra = celltbl[ cell_data ].gra; //マップチップからグラフィックスの位置を取得 x = (gra%16)*CHIP_SIZE; y = (gra/16)*CHIP_SIZE; //マップ描画位置 if(now_map_no == WORLD_MAP){ dsp_x = disp_j*CHIP_SIZE - (view_x - d.width/2); dsp_y = disp_i*CHIP_SIZE - (view_y - d.height/2); }else{ dsp_x = j*CHIP_SIZE - (view_x - d.width/2); dsp_y = i*CHIP_SIZE - (view_y - d.height/2); } bufferg.drawImage(map_image,dsp_x,dsp_y, dsp_x+CHIP_SIZE,dsp_y+CHIP_SIZE,x,y,x+CHIP_SIZE,y+CHIP_SIZE,this); //イベントがある場合はEマークを表示(デバッグ用) if(event_data[j][i] >= 1 && game_flags[7]){ //グラフィックスの位置を取得 x = (13%16)*CHIP_SIZE; y = (13/16)*CHIP_SIZE; bufferg.drawImage(chara_image,dsp_x,dsp_y, dsp_x+CHIP_SIZE,dsp_y+CHIP_SIZE,x,y,x+CHIP_SIZE,y+CHIP_SIZE,this); } } } } //--------------イベント(キャラクター)描画------------------ void DispEvent(Graphics bufferg){ int i; int dsp_x,dsp_y; int x,y; Dimension d = getSize(); //画面中心座標を主人公の位置から取得 int view_x = (int)My.px + CHIP_SIZE/2; int view_y = (int)My.py + CHIP_SIZE/2; //カメラが行ける範囲(マップの端−画面半分) int lim_left = d.width/2; int lim_right = map_width * CHIP_SIZE - d.width/2; int lim_top = d.height/2; int lim_bottom = map_height * CHIP_SIZE - d.height/2; //主人公がマップの端寄りの場合、カメラ固定 //世界マップ以外 if(now_map_no != WORLD_MAP){ if(My.px + CHIP_SIZE/2 < lim_left){ view_x = lim_left; } if(My.px + CHIP_SIZE/2 > lim_right){ view_x = lim_right; } if(My.py + CHIP_SIZE/2 < lim_top){ view_y = lim_top; } if(My.py + CHIP_SIZE/2 > lim_bottom){ view_y = lim_bottom; } } for(i=0;i=0;i--){ if(!party[i].sh)continue; dsp_x = (int)party[i].px - (view_x - d.width/2); dsp_y = (int)party[i].py - (view_y - d.height/2); //チップNO定義 int no; if(party[i].moving_dir != 4){ no = party[i].chip_no + party[i].moving_dir*2 + My.anime_no; }else{ no = party[i].chip_no; } x = (no%16)*CHIP_SIZE; y = (no/16)*CHIP_SIZE; bufferg.drawImage(chara_image,dsp_x,dsp_y, dsp_x+CHIP_SIZE,dsp_y+CHIP_SIZE,x,y,x+CHIP_SIZE,y+CHIP_SIZE,this); } } //--------------主人公描画------------------ void DispMy(Graphics bufferg){ int i,j,x,y; int cell_data,gra; Dimension d = getSize(); //カメラが行ける範囲(マップの端−画面半分) int lim_left = d.width/2; int lim_right = map_width * CHIP_SIZE - d.width/2; int lim_top = d.height/2; int lim_bottom = map_height * CHIP_SIZE - d.height/2; //描画開始位置 int view_x = d.width/2 - CHIP_SIZE/2; int view_y = d.height/2 - CHIP_SIZE/2; //マップの端に近づいてる時(カメラが行けない範囲) //通常マップ if(now_map_no != WORLD_MAP){ if(My.px + CHIP_SIZE/2 < lim_left){ view_x = (int)My.px; } if(My.px + CHIP_SIZE/2 > lim_right){ view_x += (int)My.px + CHIP_SIZE/2 - lim_right; } if(My.py + CHIP_SIZE/2 < lim_top){ view_y = (int)My.py; } if(My.py + CHIP_SIZE/2 > lim_bottom){ view_y += (int)My.py + CHIP_SIZE/2 - lim_bottom; } } //主人公描画 //チップNO定義 int no = My.chip_no + My.moving_dir*2 + My.anime_no; //チップNOからグラフィックスの位置を取得 x = (no%16)*CHIP_SIZE; y = (no/16)*CHIP_SIZE; bufferg.drawImage(chara_image,view_x,view_y, view_x+CHIP_SIZE,view_y+CHIP_SIZE,x,y,x+CHIP_SIZE,y+CHIP_SIZE,this); } //処理 public void action(){ int i; //上下左右キー状態で移動処理 //エフェクト中、イベント中、会話中は受け付けない if(game_flags[0] || game_flags[1] || game_flags[2] || game_flags[3]){;} else{ KeyForMove(); } //Zキー(決定キー)を押した時 if(key_states[4] == 2){ //決定キーのいろんな処理 ZAction(); //キーの状態を押し続けに変更。 key_states[4] = 1; } //Xキーを押した時(デバッグフラグ) if(key_states[5] == 2){ game_flags[7] = !game_flags[7]; key_states[5] = 1; } //上下キーを押した時 for(i=0;i<2;i++){ if(key_states[i] == 2){ //上の場合 if(i==0){ if(game_buffer[7] > 0)game_buffer[7]--; } //下の場合 else if(i==1){ if(game_buffer[7] < game_buffer[8]-1)game_buffer[7]++; } //キーの状態を押し続けに変更。 key_states[i] = 1; } } //移動中の場合 if(My.moving_flag){ MyMoving(); } //イベント移動(エフェクト中、イベント中、会話中は受け付けない) if(game_flags[0] || game_flags[1] || game_flags[2] || game_flags[3]){;} else{ EventMove(); } //イベント強制移動 if(game_flags[11]){ CharaMoving(eventtbl[ game_buffer[0] ]); } //主人公強制移動 if(game_flags[12]){ MyMoving(); } //会話中の場合、文字が流れていく if(game_flags[3]){ //0.03秒に1文字 game_waits[1] += FrameTime; if(game_waits[1] >= 0.03f){ game_waits[1] = 0.0f; game_buffer[6]++; if(game_buffer[6] > game_strings[1].length()){ game_buffer[6] = game_strings[1].length(); //完了 game_flags[4] = false; } } } //マップ移動開始(幕閉じ) if(game_flags[0]){ //黒い幕が降りてくる(1.1秒) game_waits[0] += FrameTime; if(game_waits[0] >= 1.1f){ game_flags[0] = false; game_flags[1] = true; //マップロード readMapData(game_buffer[1]); } } //マップ移動2(幕開け) else if(game_flags[1]){ //黒い幕が上っていく(1.2秒) game_waits[0] -= FrameTime; if(game_waits[0] <= 0.0f){ game_flags[1] = false; game_waits[0] = 0.0f; } } //エンディング if(game_flags[13]){ //黒い幕が降りてくる(1.1秒) game_waits[0] += FrameTime; if(game_waits[0] >= 1.1f){ game_flags[14] = true; } if(game_waits[0] >= 2.0f){ game_flags[15] = true; } } //イベント中 if(game_flags[2]){ //マップ移動時、会話の時、ダイアログ中、強制移動は停止中 if(game_flags[0] || game_flags[1] || game_flags[3] || game_flags[9] || game_flags[11] || game_flags[12]){;} else{ ActionScript();//スクリプト実行 } } } //イベント移動開始 void EventMove(){ int i; int ran; int dir; int next_x,next_y; boolean ismove; for(i=0;i= map_width || next_y < 0 || next_y >= map_height){ //通行不可 ismove = false; } //障害物 else if(!celltbl[ map_data[next_x][next_y] ].move_flag){ //通行不可 ismove = false; } //イベント else if(event_data[next_x][next_y] >= 1){ //通行不可 ismove = false; } //主人公の位置 else if(next_x == My.x && next_y == My.y){ //通行不可 ismove = false; } //それ以外 else{ //通行可 ismove = true; //移動開始 eventtbl[i].sum_move_length = 0.0f; eventtbl[i].moving_dir = dir; //移動先イベントデータにKAKUHO_NOを入れる event_data[next_x][next_y] = KAKUHO_NO; } eventtbl[i].moving_flag = ismove; } //移動中の時 else{ //その方向に向かって移動 CharaMoving( eventtbl[i] ); } } } } //Zキーの処理 void ZAction(){ //ダイアログ中は決定 if(game_flags[9]){ game_flags[9] = false; System.out.println("Done:Dialog"); } //会話中の時はウインドウを消す(文字が流れ終わった時) else if(game_flags[3] && !game_flags[4]){ game_flags[3] = false; System.out.println("Done:Talk"); } //そうでなくてイベント中でないなら、イベントチェック else if(!game_flags[2]){ //その方向にイベントがあるかチェック //決定ボタンが押されると実行するものを実行 check_event(My.x + dir_x[My.moving_dir] , My.y + dir_y[My.moving_dir],1); } } //キー状態で移動処理 public void KeyForMove(){ int i; int next_x,next_y; boolean ismove; //上下左右キー for(i=0;i<4;i++){ if(key_states[i] == 1){ //現在移動中か? if(!My.moving_flag){ //移動中でないなら移動 My.moving_dir = i; //その方向は通行可能か? next_x = My.x + dir_x[My.moving_dir]; next_y = My.y + dir_y[My.moving_dir]; //世界マップならループさせる if(now_map_no == WORLD_MAP){ if(next_x < 0){next_x += map_width;} if(next_x >= map_width){next_x -= map_width;} if(next_y < 0){next_y += map_height;} if(next_y >= map_height){next_y -= map_height;} } //System.out.println("My next("+next_x+","+next_y+")"); //領域外(通常マップ時) if(next_x < 0 || next_x >= map_width || next_y < 0 || next_y >= map_height){ //通行不可 ismove = false; } //障害物 else if(!celltbl[ map_data[next_x][next_y] ].move_flag){ //通行不可 ismove = false; } //イベントで、通行不可タイプ else if(!charatbl[ eventtbl[ event_data[next_x][next_y] ].gra ].move_flag){ //通行不可 ismove = false; } //確保イベント else if(event_data[next_x][next_y] == KAKUHO_NO){ //通行不可 ismove = false; } //それ以外 else{ //通行可 ismove = true; //移動開始 My.sum_move_length = 0.0f; //移動先イベントデータにKAKUHO_NOを入れる(0の時) if(event_data[next_x][next_y] == 0){ event_data[next_x][next_y] = KAKUHO_NO; } } My.moving_flag = ismove; } } } } //自分移動 public void MyMoving(){ int i; //その方向に移動 My.px += FrameTime * My.speed * dir_x[My.moving_dir]; My.py += FrameTime * My.speed * dir_y[My.moving_dir]; //仲間も for(i=0;i= 0.2f){ My.anime_no = 1 - My.anime_no; My.anime_wait = 0.0f; } //総合距離加算 My.sum_move_length += FrameTime * My.speed; //一定距離動いたか if(My.sum_move_length >= (float)CHIP_SIZE){ //ピッタリの位置にする My.x += dir_x[My.moving_dir]; My.y += dir_y[My.moving_dir]; //世界マップの時 if(My.x < 0){My.x += map_width;} if(My.x >= map_width){My.x -= map_width;} if(My.y < 0){My.y += map_height;} if(My.y >= map_height){My.y -= map_height;} My.px = My.x*CHIP_SIZE; My.py = My.y*CHIP_SIZE; My.moving_flag = false; //仲間もピッタリ for(i=0;i= map_width){party[i].x -= map_width;} if(party[i].y < 0){party[i].y += map_height;} if(party[i].y >= map_height){party[i].y -= map_height;} party[i].px = party[i].x*CHIP_SIZE; party[i].py = party[i].y*CHIP_SIZE; } //方向保存 for(i=CMAX-2;i>=0;i--){ party[i+1].moving_dir = party[i].moving_dir; } party[0].moving_dir = My.moving_dir; //この位置の確保イベントを消す(KAKUHO_NOの時) if(event_data[My.x][My.y] == KAKUHO_NO){ event_data[My.x][My.y] = 0; } //強制イベント移動の場合 if(game_flags[12]){ game_flags[12] = false; My.sum_move_length = 0.0f; }else{ //イベントチェック //その上に重なると起動するもの。 check_event(My.x,My.y,0); } } } //キャラ移動 void CharaMoving(Event event){ int ran; //その方向に移動 event.px += FrameTime * event.speed * dir_x[event.moving_dir]; event.py += FrameTime * event.speed * dir_y[event.moving_dir]; //総合距離加算 event.sum_move_length += FrameTime * event.speed; //一定距離動いたか if(event.sum_move_length >= (float)CHIP_SIZE){ //前の位置のイベントを消す event_data[event.x][event.y] = 0; //ピッタリの位置にする event.x += dir_x[event.moving_dir]; event.y += dir_y[event.moving_dir]; event.px = event.x*CHIP_SIZE; event.py = event.y*CHIP_SIZE; event.moving_flag = false; event_data[event.x][event.y] = event.no; //強制イベント移動の場合 if(game_flags[11]){ game_flags[11] = false; event.sum_move_length = 0.0f; }else{ //小休止(ランダム1秒〜3秒) ran=rand.nextInt(); if(ran<0){ran=-ran;} event.sum_move_length = -(ran%3+1); } } } //その場所のイベントチェック void check_event(int x,int y,int type){ //領域外の時 if(x < 0 || y < 0 || x >= map_width || y >= map_height)return; //イベントがあった場合(KAKUHO_NOは無視) if(event_data[x][y] != 0 && event_data[x][y] != KAKUHO_NO){ //上に乗った時。それは触れた時に起動するものか? if(type == 0 && eventtbl[ event_data[x][y] ].type_of_event != 1){ //違う場合は抜ける return; } //決定ボタンを押した時。それ決定で起動するものか? if(type == 1 && eventtbl[ event_data[x][y] ].type_of_event != 0){ //違う場合は抜ける return; } game_buffer[0] = eventtbl[ event_data[x][y] ].no;//イベントNO記憶 game_flags[2] = true;//イベントフラグセット //スクリプトファイル名決定 game_strings[0] = "eventscript/"+eventtbl[ game_buffer[0] ].filename+".txt"; LoadFileToBuffer( game_strings[0] ); } } // バッファに一気に入れる public void LoadFileToBuffer( String filename ){ int i, x = 0; InputStream is = null; try{ // is = new URL(getDocumentBase(), filename).openStream(); is = classLoader.getResourceAsStream( filename ); Reader r = new BufferedReader(new InputStreamReader(is)); while((i=r.read()) != -1){ //一行ずつ読み込む gl_event_file_buffer[x++] = (char)i; } is.close(); }catch(IOException e){} // 最後に-1を入れる gl_event_file_buffer[ x ] = 0xff; } //スクリプト実行 void ActionScript(){ String filename; int i,x; char line[] = new char[256]; InputStream is = null; filename = game_strings[0]; if(game_flags[7])System.out.println("Script("+filename+"):Load"); //指定の行まで行く int line_num = 0; boolean done_flag=true;//最後まで読みきったか boolean next_flag;//次の行も読み取るか x=0; for( i = 0; gl_event_file_buffer[ i ] != 0xff; i++ ){ //一行ずつ読み込む line[x++] = (char)gl_event_file_buffer[ i ]; //System.out.print((char)i); //改行がきた場合 if( gl_event_file_buffer[ i ] == '\n'){ //System.out.println("("+line_num+")"+String.valueOf(line)); //その行は読み込む行か? if(line_num == game_buffer[5]){ //そうであった場合、読み込んで解析 next_flag = AnalyzeScript(line); game_buffer[5]++; //マップ移動、会話イベント、ダイアログなら抜ける if(!next_flag){ done_flag = false; break; } //そうでないならそのまま読み込み続ける line_num++; }else{ //違うなら、改行数増やして探索続行 line_num++; } x=0; } } //最後まで読み切った場合は、フラグ解除 if(done_flag){ if(game_flags[7])System.out.println("Script("+filename+"):End"); game_flags[2] = false; // 一行目から読み込む game_buffer[5] = 0; //テーブル更新予約があればテーブル更新 if(game_flags[8]){ Load_Event_Table(); game_flags[8] = false; } } } //指定の行を読み込んで解析(戻り値がある時はそれを実行し次の行へ続く) public boolean AnalyzeScript(char line[]){ int i,x,y; String command; String value; String buffer; boolean next_flag=true; //改行コード以降切り捨て(改行含む) String sline = Harulib.HaruChop(line); //コマンド取得 command = Harulib.HaruSplit(sline,":",0); //値取得 value = Harulib.HaruSplit(sline,":",1); if(game_flags[7])System.out.println("("+game_buffer[5]+")Script -- > com="+command+",value="+value); //ラベル確認 if(command.equals("IF_SCENE1")){ //そのラベル以降は実行すべきか? if(game_buffer[7] == 0){ game_flags[10] = false;//スキップ解除してそのまま実行 } else{ //実行しない。スキップ開始。 game_flags[10] = true; } }else if(command.equals("IF_SCENE2")){ //そのラベル以降は実行すべきか? if(game_buffer[7] == 1){ game_flags[10] = false;//スキップ解除してそのまま実行 } else{ game_flags[10] = true; } }else if(command.equals("IF_SCENE3")){ //そのラベル以降は実行すべきか? if(game_buffer[7] == 2){ game_flags[10] = false;//スキップ解除してそのまま実行 } else{ game_flags[10] = true; } }else if(command.equals("END_SCENE")){ //スキップ終了 game_flags[10] = false; } //スキップ実行の時 if(game_flags[10]){ return true;//抜ける } //コマンドによってイベント実行 //マップ移動コマンド if(command.equals("move")){ System.out.println("Do:Move"); //移動イベント開始 game_flags[0] = true; //値を解析 buffer = Harulib.HaruSplit(value,"=",0); game_buffer[1] = Integer.parseInt(buffer);//移動先マップNO buffer = Harulib.HaruSplit(value,"=",1); game_buffer[2] = Integer.parseInt(buffer);//X buffer = Harulib.HaruSplit(value,"=",2); game_buffer[3] = Integer.parseInt(buffer);//Y buffer = Harulib.HaruSplit(value,"=",3); game_buffer[4] = Integer.parseInt(buffer);//方向 next_flag=false; } //会話コマンド else if(command.equals("talk")){ System.out.println("Do:Talk"); //会話イベント開始 game_flags[3] = true; //流れ始める。 game_flags[4] = true; //会話 game_strings[1] = value; //char配列にコピー game_strings[1].getChars(0,game_strings[1].length(),game_talks,0); //文字の位置 game_buffer[6] = 1;//1文字目 next_flag=false; } //ゲーム進行スイッチオンコマンド else if(command.equals("switch_on")){ System.out.println("Do:switch_on"); game_switch[ Integer.parseInt(value) ] = true; //テーブル更新予約 game_flags[8] = true; } //ゲーム進行スイッチオフコマンド else if(command.equals("switch_off")){ System.out.println("Do:switch_off"); game_switch[ Integer.parseInt(value) ] = false; //テーブル更新予約 game_flags[8] = true; } //分岐1 else if(command.equals("SCENE1")){ System.out.println("Do:SCENE1"); game_strings[2] = value; } //分岐2 else if(command.equals("SCENE2")){ System.out.println("Do:SCENE2"); game_strings[3] = value; game_buffer[7] = 0; game_buffer[8] = 2;//選択肢の数 } //分岐3 else if(command.equals("SCENE3")){ System.out.println("Do:SCENE3"); game_strings[4] = value; game_buffer[7] = 0; game_buffer[8] = 3;//選択肢の数 } //ダイアログを出す else if(command.equals("DIALOG")){ System.out.println("Do:DIALOG"); game_flags[9] = true; next_flag=false; } //イベントを一時的に消去 else if(command.equals("temperace")){ System.out.println("Do:temperace"); event_data[eventtbl[ game_buffer[0] ].x][eventtbl[ game_buffer[0] ].y] = 0; eventtbl[ game_buffer[0] ].sh = false; eventtbl[ game_buffer[0] ].gra = 255; next_flag=true; } //イベント強制移動 else if(command.equals("emove")){ System.out.println("Do:emove"); //方向 if(value.equals("up")){eventtbl[ game_buffer[0] ].moving_dir = 0;} else if(value.equals("down")){eventtbl[ game_buffer[0] ].moving_dir = 1;} else if(value.equals("left")){eventtbl[ game_buffer[0] ].moving_dir = 2;} else if(value.equals("right")){eventtbl[ game_buffer[0] ].moving_dir = 3;} game_flags[11] = true; next_flag=false; } //主人公強制移動 else if(command.equals("mymove")){ System.out.println("Do:mymove"); //方向 if(value.equals("up")){My.moving_dir = 0;} else if(value.equals("down")){My.moving_dir = 1;} else if(value.equals("left")){My.moving_dir = 2;} else if(value.equals("right")){My.moving_dir = 3;} game_flags[12] = true; My.sum_move_length = 0.0f; next_flag=false; } //イベント速度変更 else if(command.equals("espeed")){ System.out.println("Do:espeed"); eventtbl[ game_buffer[0] ].speed = (float)Integer.parseInt(value); next_flag=true; } //仲間になる else if(command.equals("join")){ System.out.println("Do:join"); for(i=0;i