#define APPLET
/*-------------------------------------
タイトル:勇者で行こう!Ω ver 0.11
制作:ハルーポッター
HomePage: http://www.ar.wakwak.com/~harupotter/
動作機種:imode504iシリーズ、Javaアプレット
[コンパイル方法]
アプレットにする場合は、一番上の行を
#define APPLET
とする。
iアプリにする場合は、
//#define APPLET
とする。
そして、PPP(Pamuow Preprocessor)を使用する。DL先・・・http://www.and.or.jp/~pamulow/ppp/ppp.html
[使い方]
ppp 入力フォルダ 出力フォルダ
例:ppp . src
[アプレットの場合にHTMLファイルに記述するタグ]
ーーーーーー---------------------------*/
import java.util.Random;
import java.io.*;
#ifdef APPLET
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
import java.net.URL;
#else
import com.nttdocomo.ui.*;
import com.nttdocomo.io.*;
import javax.microedition.io.*;
#endif
#ifndef APPLET
//ポイントクラス
class Point{
int x,y;
Point(int a,int b){x=a;y=b;}
};
//本体
public class Rpg extends IApplication{
//アプリの開始
public void start() {
RpgCanvas r=new RpgCanvas();
Display.setCurrent(r);
r.exe();
}
}
class RpgCanvas extends Canvas{
#else
public class Rpg extends Applet implements KeyListener,Runnable{
Image buffer;//バッファ
AudioClip se[] = new AudioClip[5];//効果音
MediaTracker tracker = new MediaTracker(this);//メディアトラッカー
#endif
/********************************************************************************/
/* */
/* メンバ変数の定義 */
/* */
/********************************************************************************/
//--------定数-------
final int WIDTH=9;//横幅に入るパーツ数
final int HEIGHT=6;//縦幅に入るパーツ数
final int WPIXEL=120;//横幅(ピクセル)
final int HPIXEL=130;//縦幅(ピクセル)
final int MAPNUM=8;//マップパーツの数
final int CHARANUM=12;//キャラクターの数
final int BCHARANUM=15;//バトルキャラの数
final int CHARAIMAGENUM=8;//キャラクター画像の数
final int BCHARAIMAGENUM=14;//バトルキャラクター画像の数
final int INIT_X=3,INIT_Y=2;//左上から数えた勇者の位置
final int PARTS_SIZE=16;//パーツの一辺あたりのサイズ(ピクセル)
final int UP=0,DOWN=1,LEFT=2,RIGHT=3,KEY1=4,KEY2=5;//キー列挙
final int PARTY_NUM=15;//仲間の人数
final char table[]={'C','G','A','D','H','B','E','J','F','I'};//パスワード用テーブル
final int E_DEL=50,E_BATTLE=51;//削除イベント、バトルイベント
final int MAP_SPEED=10;//マップのスクロールの速さ
final int FONT_SPEED=3;//文字の流れる速さ
final Point LIMIT = new Point(32,24);//マップの限界値
final boolean DEBUG_FLAG=false;//デバッグ時か
//--------変数(値は不変)-------------
Image map_images[] = new Image[MAPNUM];//マップパーツ画像
Image chara_images[] = new Image[CHARAIMAGENUM];//キャラクター画像
Image bchara_images[] = new Image[BCHARAIMAGENUM];//バトルキャラ画像
Graphics g;//グラフィックスコンテキスト
long FrameTime=0;//フレーム時間(1秒で1000)
long waitTime;//フレーム更新時間取得用
//--------変数------------
int move_dir;//向いている方向(UP,DOWN,LEFT,RIGHT)
int battle_probability=15;//エンカウント率
int TalkPos;//会話点
int now_screen=0;//画面
int now_point=0;//現在の添え字
int now_select=0;//選択中のもの
int now_map,now_event=0,now_string,now_chara;//現在マップ、現在文字列、現在話中キャラ
int now_talk_index;//話中のキャラクター添字
int party[] = new int[PARTY_NUM];//パーティの並び順
Point map_start = new Point(0,0);//マップ開始座標
Point mapfew = new Point(0,0);//アニメ中のマップずれ
Point My = new Point(0,0);//マップ開始座標
//バッファ
char cbuffer[]=new char[64];
String sbuffer="";
//フラグ
boolean loaded_flag=false;
boolean sound_flag=true;//サウンドを鳴らすか
boolean event_flags[] = new boolean[10];//イベントフラグ
boolean anime_font=false;//会話のアニメーションフラグ
boolean anime_fonts[] = new boolean[3];
boolean moving_flag=false;//移動中か
boolean key_flags[]=new boolean[5];//キーの状態
boolean error_flag=false;//エラーフラグ
boolean PushFlag=false;//キーを押した状態であるか
//仲間
PartyChara pcharas[] = {
new PartyChara("勇者",0),
new PartyChara("すーじー",5),
new PartyChara("ルリ",5),
new PartyChara("はるきち",4),
new PartyChara("不幸の手紙",6),
new PartyChara("宝",7),
new PartyChara("不幸の手紙",6),
new PartyChara("不幸の手紙",6),
new PartyChara("不幸の手紙",6),
new PartyChara("不幸の手紙",6),
new PartyChara("不幸の手紙",6),
new PartyChara("不幸の手紙",6),
new PartyChara("不幸の手紙",6),
new PartyChara("不幸の手紙",6),
new PartyChara("不幸の手紙",6),
};
//セルデータ
Cell celldata[] = {
new Cell(0,0,false),//海
new Cell(1,0,true),//平原
new Cell(2,0,true),//芝生
new Cell(3,0,false),//木
new Cell(4,0,false),//壁
new Cell(5,0,true),//洞窟の地面
new Cell(6,1,true),//フィールドから街
new Cell(7,2,true),//フィールドから洞窟
new Cell(1,3,true),//街からフィールド
new Cell(1,4,true),//洞窟から外へ
};
//キャラクターデータ
Chara charas[]={
new Chara(4,1,8,2,2,"僕はるきち。 あー暇だなぁ。 何か起こらないかなぁ。"),
new Chara(2,2,6,2,0,"この洞窟は 強い敵が多いなぁ。 冗談じゃないよ"),
new Chara(4,1,5,2,6,"オレはトレジャーハンター。 幻の金属バットが 洞窟に眠ると聞く。 もし手に入れたら オレに譲ってくれ! とっておきの物を 渡すから! ではよろしく。"),
new Chara(4,1,6,12,0,"魔王はすぐ近く にいそうな気が するんだ。"),
new Chara(4,1,10,10,0,"このゲームは パーティの人数によって 攻撃力が変わるんだよ"),
new Chara(5,1,4,7,0,"ようこそ。 ここはハルーシティです。"),
new Chara(5,1,10,2,4,"「話しかけないで ウゼエ ・・・ なんてね。」 スージーが 仲間に加わった!"),
new Chara(5,1,11,2,5,"「うるせえ」"),
new Chara(5,2,8,8,0,"こんにちは ヒカル17歳女子高生"),
new Chara(5,1,30,20,7,"これ全部あげる!"),
new Chara(6,1,3,1,1,"手紙がある。 「この手紙は不幸 の手紙。 これをはるきちに 渡せ。」"),
new Chara(7,2,8,12,3,"宝箱を開けた。 『伝説の金属バット』 を手に入れた!"),
};
//バトルキャラクターデータ
Bchara bcharas[]={
//ボス系
new Bchara("勇者",1,20,1,0,1),
new Bchara("闇色キッド",4,100,2,0,2),
new Bchara("はるきち",2,20,1,0,1),
new Bchara("太陽",1,20,1,0,1),
new Bchara("ウイルン",3,20,1,0,2),
//ザコ
new Bchara("ナイフィ",5,20,1,0,3),
new Bchara("クロすけ",6,20,1,0,3),
new Bchara("飛行機",7,20,1,0,4),
new Bchara("ハチ",8,20,1,0,6),
new Bchara("オセロン",9,20,1,0,8),
new Bchara("魔法使い",10,20,1,0,9),
new Bchara("ナイト",11,20,1,0,11),
new Bchara("ナマイキガール",12,20,1,0,44),
new Bchara("トルイヌ",13,20,1,0,56),
new Bchara("城",0,20,1,0,100),
};
//マップバッファ(32*24)
int mapdata[][] = new int[24][32];
/********************************************************************************/
/* */
/* イメージロード関数(アプレット、アプリ) */
/* */
/********************************************************************************/
public Image image_load(String filename){
Image image=null;
#ifdef APPLET
image=getImage(getDocumentBase(),filename);
tracker.addImage(image,0);
#else
try{
MediaImage m;
m=MediaManager.getImage("resource:///"+filename);
m.use();
image=m.getImage();
}catch(Exception e){e.printStackTrace();}
#endif
return image;
}
/********************************************************************************/
/* */
/* リソースをロード */
/* */
/********************************************************************************/
public void load_resource(){
int i;
//キャラクター
for(i=0;i3){return false;}
//座標
My.x=10*data[1] + data[2] - INIT_X;
My.y=10*data[3] + data[4] - INIT_Y;
if(My.x<0 || My.x>LIMIT.x || My.x<0 || My.y>LIMIT.y){
return false;
}
//経験値
bcharas[0].ex=100*data[5]+10*data[6]+data[7];
//フラグ
int value=1000*data[8]+100*data[9]+10*data[10]+data[11];
for(i=0;i<10;i++){
if((value&0x1)==1)event_flags[i]=true;
else event_flags[i]=false;
value>>=1;
}
//キャラを消す
if(event_flags[0]){charas[10].event=E_DEL;}
if(event_flags[2]){charas[11].event=E_DEL;}
return true;
}
/********************************************************************************/
/* */
/* マップ画面 */
/* */
/********************************************************************************/
public void map_screen(){
int i,j,k,l;
int map;
String strs[] = new String[3];
//背景(マップ)
for(i=My.x-1,k=-1;i=LIMIT.x || j>=LIMIT.y){
if(now_map==0)map=0;//海
else if(now_map==1)map=1;//草原
else if(now_map==2)map=4;//壁
else map=0;
}else{
map=celldata[mapdata[j][i]].gra;
}
mydrawImage(map_images[map],k*PARTS_SIZE+mapfew.x/100,l*PARTS_SIZE+mapfew.y/100);
}
}
//勇者の場合だけ方向あり
if(pcharas[0].dir == UP || pcharas[0].dir==DOWN){
mydrawImage(chara_images[move_dir],
(pcharas[0].x-My.x)*PARTS_SIZE+mapfew.x/100,
(pcharas[0].y-My.y)*PARTS_SIZE+mapfew.y/100 + pcharas[0].few/100);
}
else if(pcharas[0].dir == RIGHT || pcharas[0].dir == LEFT){
mydrawImage(chara_images[move_dir],
(pcharas[0].x-My.x)*PARTS_SIZE+mapfew.x/100 + pcharas[0].few/100,
(pcharas[0].y-My.y)*PARTS_SIZE+mapfew.y/100);
}
//パーティ描画
for(i=PARTY_NUM-1;i>=1;i--){
if(!pcharas[i].join_flag){continue;}
if(pcharas[i].dir == UP || pcharas[i].dir==DOWN){
mydrawImage(chara_images[pcharas[i].image],
(pcharas[i].x-My.x)*PARTS_SIZE+mapfew.x/100,
(pcharas[i].y-My.y)*PARTS_SIZE+mapfew.y/100 + pcharas[i].few/100);
}
else if(pcharas[i].dir == RIGHT || pcharas[i].dir == LEFT){
mydrawImage(chara_images[pcharas[i].image],
(pcharas[i].x-My.x)*PARTS_SIZE+mapfew.x/100 + pcharas[i].few/100,
(pcharas[i].y-My.y)*PARTS_SIZE+mapfew.y/100);
}
}
//-------------------キャラクター描画-----------------
for(i=0;i= My.x && charas[i].x=My.y && charas[i].y=now_talk_index+1+1){
strs[1]=charas[now_chara].talk[now_talk_index+1];
}else{strs[1]="";anime_fonts[1]=false;}
//三行目
if(charas[now_chara].talk.length>=now_talk_index+2+1){
strs[2]=charas[now_chara].talk[now_talk_index+2];
}else{strs[2]="";anime_fonts[2]=false;}
//続きがある場合
if(charas[now_chara].talk.length>=now_talk_index+4){strs[2]+="▽";}
break;
default:strs[0]="";strs[1]="";strs[2]="";
}
//流れる文字
//一行目
if(anime_fonts[0]){
g.drawString(strs[0].substring(0,TalkPos/100+1),2,130-21-14);
if((TalkPos+=FONT_SPEED*FrameTime)/100 >=strs[0].length()){anime_fonts[0]=false;TalkPos=-FONT_SPEED*(int)FrameTime;}
}else{g.drawString(strs[0],2,130-21-14);}
//二行目
if(!anime_fonts[0] && anime_fonts[1]){
if(TalkPos>=0)g.drawString(strs[1].substring(0,TalkPos/100+1),2,130-7-14);
if((TalkPos+=FONT_SPEED*FrameTime)/100>=strs[1].length()){anime_fonts[1]=false;TalkPos=-FONT_SPEED*(int)FrameTime;}
}else if(!anime_fonts[1]){g.drawString(strs[1],2,130-7-14);}
//三行目
if(!anime_fonts[1] && anime_fonts[2]){
if(TalkPos>=0)g.drawString(strs[2].substring(0,TalkPos/100+1),2,130-7);
if((TalkPos+=FONT_SPEED*FrameTime)/100>=strs[2].length()){anime_fonts[2]=false;TalkPos=0;}
}else if(!anime_fonts[2]){g.drawString(strs[2],2,130-7);}
if(!anime_fonts[0] && !anime_fonts[1] && !anime_fonts[2]){anime_font=false;}
//g.drawString("("+My.x+","+My.y+")",2,120);
keyAction();
}
/********************************************************************************/
/* */
/* 描画関数(アプレット、アプリ) */
/* */
/********************************************************************************/
public void mydrawImage(Image image,int x,int y){
#ifdef APPLET
g.drawImage(image,x,y,this);
#else
g.drawImage(image,x,y);
#endif
}
/********************************************************************************/
/* */
/* 累乗 */
/* */
/********************************************************************************/
public int mypow(int a,int b){
int i;
int ans=1;
for(i=0;i0)now_select--;break;
case 2:now_select=0;break;
case 3:
if(now_select>=5)now_select-=5;
break;
}
break;
//下ボタン
#ifdef APPLET
case KeyEvent.VK_DOWN:
#else
case Display.KEY_DOWN:
#endif
key_flags[DOWN]=true;
switch(now_screen){
case 0:if(now_select<2)now_select++;break;
case 2:now_select=1;break;
case 3:
if(now_select<5)now_select+=5;
else now_select=10;
break;
}
break;
#ifdef APPLET
case KeyEvent.VK_RIGHT:
#else
case Display.KEY_RIGHT:
#endif
key_flags[RIGHT]=true;
switch(now_screen){
case 3:
if(now_select<10)now_select++;
break;
}
break;
#ifdef APPLET
case KeyEvent.VK_LEFT:
#else
case Display.KEY_LEFT:
#endif
key_flags[LEFT]=true;
switch(now_screen){
case 3:
if(now_select>0)now_select--;
break;
}
break;
//ステータス表示
#ifdef APPLET
case KeyEvent.VK_ENTER:
#else
case Display.KEY_SELECT:
#endif
if(now_screen==1){
if(now_string==0){sbuffer=getPassword();now_string=1;}
else if(now_string==1){now_string=0;}
}
break;
//決定ボタン
#ifdef APPLET
case KeyEvent.VK_S:
#else
case Display.KEY_SOFT2:
#endif
press_key1();
break;
//取消ボタン
#ifdef APPLET
case KeyEvent.VK_A:
#else
case Display.KEY_SOFT1:
#endif
switch(now_screen){
case 3:
if(--now_point < 0){now_screen=0;often_init();}
break;
}
break;
}
}
/********************************************************************************/
/* */
/* 決定ボタン */
/* */
/********************************************************************************/
public void press_key1(){
int i;
switch(now_screen){
//タイトル画面
case 0:
//ニューゲーム
if(now_select==0){
now_screen=1;
//初期化
PartyChara.tail=1;
My.x=1-INIT_X;
My.y=1-INIT_Y;
now_map=0;
bcharas[0].ex=0;
}else if(now_select==1){//コンテニュー
now_screen=3;
often_init();
}else{
sound_flag=!sound_flag;//サウンド設定
}
break;
case 1:
if(!key_flags[KEY1]){
map_search(My.x+INIT_X,My.y+INIT_Y);//調べる
key_flags[KEY1]=true;
}
break;
case 2://バトル
switch(now_event){
case 0://登場
now_event=1;
break;
case 1://コマンド入力画面
switch(now_select){
case 0://攻撃
//素早さ比較
if(bcharas[0].speed > bcharas[now_chara].speed){
now_event=2;//自分のターン
}else{
now_event=3;//敵のターン
}
break;
case 1://逃げる
//イベント戦闘の場合は逃げられない
if(charas[2].event==E_BATTLE){now_event=6;}
else{now_event=4;}
break;
}
break;
case 2://自分のターン
bcharas[now_chara].hp-=bcharas[0].power;
if(bcharas[now_chara].hp<=0){//やっつけた場合
bcharas[0].ex+=bcharas[now_chara].ex;//経験値獲得
now_event=5;
}else if(bcharas[0].speed > bcharas[now_chara].speed){
now_event=3;
}else{now_event=1;}
break;
case 3://敵のターン
bcharas[0].hp-=bcharas[now_chara].power;
if(bcharas[0].hp<=0){//死んだ場合
now_event=5;
}
else if(bcharas[0].speed > bcharas[now_chara].speed){
now_event=1;
}else{
now_event=2;
}
break;
case 4://逃げる完了
now_screen=1;
now_chara=0;
battle_probability=10;
break;
case 5://戦闘終了
//全滅の場合
if(bcharas[0].hp<=0){now_screen=10;return;}
//イベント戦闘の場合
for(i=0;i=100){battle_probability=99;}
//戦闘開始
if(battle_probability==0 || now_map==1)return;
Random rand = new Random();
int ran=rand.nextInt();
if(ran<0){ran=-ran;}
if(ran%(100-battle_probability) == 0){
often_init();
ran=rand.nextInt();
if(ran<0){ran=-ran;}
now_chara=ran%(BCHARANUM-5)+5;//ボスは含めない
if(now_chara<5 || now_chara>=BCHARANUM)return;
now_screen=2;
}
}
/********************************************************************************/
/* */
/* 仲間の向きを変える(動き出した瞬間) */
/* */
/********************************************************************************/
public void change_pchara_dir(){
int i;
//向き
for(i=PartyChara.tail-1;i>=1;i--){
pcharas[party[i]].dir = pcharas[party[i-1]].dir;
}
pcharas[party[0]].dir = move_dir;
}
/********************************************************************************/
/* */
/* ピッタリ到着した瞬間(仲間の座標を変更) */
/* */
/********************************************************************************/
public void arrive_pchara(){
int i;
//移動
for(i=0;i=PARTS_SIZE){
//ピッタリ配置
mapfew.y=0;
moving_flag=false;
My.y--;
//仲間の向き
arrive_pchara();
//イベントチェック
map_event(My.x+INIT_X,My.y+INIT_Y);
}
break;
case DOWN:
if((mapfew.y-=MAP_SPEED*FrameTime)/100<=-PARTS_SIZE){
mapfew.y=0;moving_flag=false;My.y++;arrive_pchara();map_event(My.x+INIT_X,My.y+INIT_Y);
}
break;
case LEFT:
if((mapfew.x+=MAP_SPEED*FrameTime)/100>=PARTS_SIZE){
mapfew.x=0;moving_flag=false;My.x--;arrive_pchara();map_event(My.x+INIT_X,My.y+INIT_Y);
}
break;
case RIGHT:
if((mapfew.x-=MAP_SPEED*FrameTime)/100<=-PARTS_SIZE){
mapfew.x=0;moving_flag=false;My.x++;arrive_pchara();map_event(My.x+INIT_X,My.y+INIT_Y);
}
break;
}
}
/********************************************************************************/
/* */
/* よくする初期化 */
/* */
/********************************************************************************/
public void often_init(){
now_event=0;
now_select=0;
now_point=0;
if(now_chara!=0){
bcharas[now_chara].hp=bcharas[now_chara].maxhp;//HP回復
}
}
/********************************************************************************/
/* */
/* 調べる */
/* */
/********************************************************************************/
public void map_search(int x,int y){
int cell,i,j;
boolean move_flag=false;
boolean talk_flag=false;
if(anime_font){return;}
#ifdef APPLET
if(sound_flag)se[1].play();
#endif
//会話スキップ
switch(now_string){
case 0:case 1:break;
case 2:
//会話に続きがある場合
if(charas[now_chara].talk.length>=now_talk_index+4){
now_talk_index+=3;
anime_font=true;TalkPos=0;
for(j=0;j<3;j++){anime_fonts[j]=true;}
}else{
//会話終了時
switch(charas[now_chara].event){
case 1://不幸の手紙
join_pchara(4);//仲間に
event_flags[0]=true;
charas[now_chara].event=E_DEL;
break;
case 2://はるきち
//手紙を渡したら仲間になる
if(event_flags[1]){
join_pchara(3);
bcharas[0].power++;
charas[now_chara].event=E_DEL;//消す
}
break;
case 3://宝
event_flags[3]=true;
join_pchara(5);//仲間になる
charas[now_chara].event=E_DEL;//消す
break;
case 4://すーじー
join_pchara(1);//仲間になる
bcharas[0].power++;
charas[now_chara].event=E_DEL;//消す
break;
case 5://ルリ
if(event_flags[1]){
join_pchara(2);//仲間になる
bcharas[0].power++;
charas[now_chara].event=E_DEL;
}
break;
case 6://魔王
if(event_flags[3]){
//戦闘に突入
charas[now_chara].event=E_BATTLE;
now_chara=1;
now_screen=2;
often_init();
}
break;
case 7://手紙
for(i=6;i= 32){++k;l=0;}
}
r.close();
}catch(IOException e){}
#else
InputStreamReader in=null;
HttpConnection c =null;
filename = IApplication.getCurrentApp().getArgs()[0] + filename;//引数
try{
//接続
c=(HttpConnection)Connector.open(filename,Connector.READ,true);
c.setRequestMethod(HttpConnection.GET);
c.connect();
//読み込み
in=new InputStreamReader(c.openInputStream());
StringBuffer sb=new StringBuffer(500);
i=in.read();
k=l=0;
while (i>=0) {
mapdata[k][l]=i;
if(++l >= 32){++k;l=0;}
i=in.read();
}
//切断
in.close();
c.close();
}catch(Exception e){
//例外処理
e.printStackTrace();
Dialog dialog=new Dialog(Dialog.DIALOG_ERROR,"エラー");
dialog.setText("通信エラーです");
dialog.show();
IApplication.getCurrentApp().terminate();
}
#endif
}
}