//↓此処を編集 const int item_key = 1046; //鍵アイテムのインデックス const int item_CBox = 34; //閉まっている宝箱 const int item_OBox = 35; //空けてある宝箱 const int enemy = 2; //敵キャラクターの勢力番号 //↑編集此処まで //改造はご自由にしてください。但しこのプログラムで発生したトラブルなどの責任は一切負いません。 const int cl = 0x00ff80; const int er = 0xffe000; const int wt = 0xffffff; int OpenBox( int box, // ローカル変数格納先 int qx, int qy, int qz, int dir, // 座標&方向 string len, // 入手アイテム int item, int num, // 与えるアイテムインデックス(-1でお金)&数量(-1の時金額) int flg // 施錠(しない:0/する:1) ){ if(Investigate(qx, qy, qz, dir)){ if(box){ PlaySound("Command.wav", 0); ResetWindow(); cmsString("箱は空っぽだ。", er); } else { PlaySound("Command.wav", 0); if(!flg){ //施錠なし ReplaceObject(qx, qy, item_CBox, item_OBox); RenderMap(0); if(item!=-1){ if(GiveCharaItem(GetCurrentChara(), item, num)==0){ ResetWindow(); cmsString(len+"を見つけた", cl); cmsString("しかし持ち物が一杯だった…", er); ReplaceObject(qx, qy, item_OBox, item_CBox); RenderMap(0); return 0; }else{ DrawItem(0, 20, item); cmsString(len+"を"+num+"個手に入れた!", cl); } } else { GiveCharaMoney(GetCurrentChara(), num); cmsString(""+num+"ゴールド手に入れた!", cl); } return 1; } else { //施錠あり if(!TakeCharaItem(GetCurrentChara(), item_key, 1)){ cmsString("宝箱には鍵がかかっている", er); return 0; } else { ReplaceObject(qx, qy, item_CBox, item_OBox); RenderMap(0); if(item!=-1){ if(GiveCharaItem(GetCurrentChara(), item, num)==0){ ResetWindow(); cmsString(len+"を見つけた", cl); cmsString("しかし持ち物が一杯だった…", er); ReplaceObject(qx, qy, item_OBox, item_CBox); RenderMap(0); if(flg) GiveCharaItem(GetCurrentChara(), 1046, 1); return 0; }else{ DrawItem(0, 20, item_key); cmsString("鍵を1つ消費しました。", cl); DrawItem(0, 20, item); cmsString(len+"を"+num+"個手に入れた!", cl); } } else { DrawItem(0, 20, item_key); cmsString("鍵を1つ消費しました。", cl); GiveCharaMoney(GetCurrentChara(), num); cmsString(""+num+"ゴールド手に入れた!", cl); } return 1; } } } } return 0; } int BoxCheck(int box, int qx, int qy){ if(!box){ return 0; } else { ReplaceObject(qx, qy, item_CBox, item_OBox); return 1; } } /* * メッセージを表示し、アイテムを入手 * ※必ず実行前、後にウィンドウが初期化されます */ int GetItemInMessage(void *chara, int item, int num, string t_len, string f_len){ ResetWindow(); DrawItem(0, 20, item); if(item > 0){ if(GiveCharaItem(chara, item, num)){ cmsString(t_len, cl); return 1; } else { cmsString(f_len, cl); return 0; } } else { GiveCharaMoney(chara, num); msString(t_len, cl); return 1; } ResetWindow(); } /* * ↑アイテム関数 * ↓配置関数 */ //キャラクター配置 戻り値:キャラクターポインタ void *CreateMob( int qx, int qy, int qz, int index, int lv ){ void * chara = CreateChara(index, lv); SetCharaGroup(chara, enemy); PutChara(chara, qx, qy, qz, Rand2(0, 3)); return chara; } void *CreateNPC(int index, int qx, int qy, int qz, int dir, int flg){ void * chara = CreateChara(index, 1); FreezeChara(chara, flg); PutChara(chara, qx, qy, qz, dir); return chara; } void SetBoss(void *chara, int hp){ SetCharaGroup(chara, 2); FixCharaStatus(chara, 4, hp-GetCharaStatus(chara, 6)); FixCharaStatus(chara, 1, hp); } /* * 残りHPを獲得 */ float CheckHP(void * chara){ return GetCharaStatus(chara, 5); } /* * ↑キャラクター関数 * ↓移動処理 */ int MoveMap( int qx1, int qy1, int qx2, int qy2, int qx3, int qy3, int qz, string map ){ if(CheckRect2(qx1, qy1, qx2, qy2)){ SetMap(map); SetTransit(qx3, qy3, qz, -1); return 1; }else return 0; } /* * pzは毎フレーム0に戻るので高さ0で屋根付きのエリアチェンジ判定には使えない。 * CheckZはエリアチェンジのZ座標判定に使う */ int CheckZ(int qz){ return CheckPos3(-1, -1, qz); } int MoveMapC( int qx1, int qy1, int qx2, int qy2, int qx3, int qy3, int qz, string map, int flg, int anim ){ if(CheckRect2(qx1, qy1, qx2, qy2)){ if(flg){ SetMap(map); SetTransit(qx3, qy3, qz, -1); return 1; } else { cmsString("この先はまだ行くべきではないな。", 0xffffff); BackAnim(anim); } }else{ return 0; } } int InHouse( int qx1, int qy1, int qx2, int qy2, int qz, int cip1, int cip2, string map ){ if(Investigate(qx1, qy1, -1, -1)){ ReplaceObject(qx1, qy1, cip1, cip2); RenderMap(1); PlaySound("Command.wav", 0); SetMap(map); SetTransit(qx2, qy2, qz, -1); return 1; }else{ return 0; } } int Warp( int qx1, int qy1, int qx2, int qy2 ){ if(CheckPos2(qx1, qy1)){ PutChara(GetCurrentChara(), qx2, qy2, -1, -1); return 1; } else return 0; } int MoveToMoney(int money, int qx, int qy, int qz, string map, string ms ){ int px, py, pz; int m = GetCharaMoney(GetCurrentChara()); cmsString(ms, 0xffffff); InitWindow(5, 15, 15, 5, 0); PushString("所持金 費用:"+money+"\n "+m+"G", m=合成後の重さにすること int Conpound( int item1, int num1, //必要アイテム1, 個数 int item2, int num2, //必要アイテム2, 個数 int item3, int num3, //〃 int item4, int num4, //〃 int Titem, int Tnum, //成功時生成物, 個数 int Fitem, int Fnum, //失敗時生成物, 個数 float P, int money //成功確率, 費用 ){ void *chara = GetCurrentChara(); ResetWindow(); PushString("合成しますか?", wt, 0); if(SelectMessage("はい", "キャンセル", 1)==1){ if(CheckCharaItem(chara, item1, num1)&& CheckCharaItem(chara, item2, num2)&& CheckCharaItem(chara, item3, num3)&& CheckCharaItem(chara, item4, num4)&& TakeCharaMoney(chara, money)){ float i = FRand2(0.0f, 100.0f); TakeCharaItem(chara, item1, num1); TakeCharaItem(chara, item2, num2); TakeCharaItem(chara, item3, num3); TakeCharaItem(chara, item4, num4); if(i <= P){ GiveCharaItem(chara, Titem, Tnum); cmsString("合成に成功しました。", cl); }else{ PlaySound("miss2.wav", 0); GiveCharaItem(chara, Fitem, Fnum); cmsString("合成に失敗しました・・・。", er); } }else{ cmsString("合成に必要な素材または所持金が不足しています。", er); } } else ClearWindow(); } //charaがitemをnum個以上持っているか(numをNULLにすると常に1が返る) int CheckCharaItem( void *chara, int item, int num ){ if(GetCharaItem(chara, item) >= num||num==NULL){ return 1; }else{ return 0; } } /* * ↑合成関連関数 * ↓システム関数 */ //コンストラクタ(最初に呼び出す ただし、敵などの配置は先に行うこと) void constructor(string music){ PutPlayer(); PlayMusic(music, 1); TransitMap(-1, 10); } //セーブポイント int SavePoint(int qx, int qy, int qz, int dir){ if(Investigate(qx, qy, qz, dir)){ PlaySound("Command.wav", 0); ExecuteInn("セーブポイント", "", -1, 1, 0); return 1; } else return 0; } /* * answerで指定した数字が入力されると1、それ以外0 * ただし、-1000はキャンセル時に使う値なので使わないこと */ int PassWord(int answer){ int id; PushString("パスワードを入力してください。\n", wt, 0); id = InputNumber(0, -1000); switch(id){ case -1000: cmsString("キャンセルされました", wt); return 0; default : if(id==answer){ cmsString("ロックを解除します。", cl); return 1; } else { cmsString("パスワードが違います!", er); return 0; } } } /* * グラフを表示 * (本数:赤←黄←緑←青←紫) */ int SetGraph( void *Chara, //キャラクターポインタ string String, //キャラクターネーム&レベル表示 int graph //グラフの本数(1〜5) ){ int color[6] = {0x000000, 0xff0000, 0xffff00, 0x00ff00, 0x0080ff, 0x8000ff}; float mhp = GetCharaStatus(Chara, 6), hp = GetCharaStatus(Chara, 5); int i; if(!GetUniqueParam(Chara, 0)) SetUniqueParam(Chara, 0, 1); for(i=0;i hp&&hp > 0){ DrawText(-1, 220, 10, String, 0x00e0e0e0, 256); DrawText(-1, 120, 28, "HP", 0x0080ff80, 256); DrawRect(-1, 139, 29, 302, 14, 0x00ffffff); FillRect(-1, 140, 30, 300, 12, color[i]); FillRect(-1, 140, 30, (int)(300*(hp-mhp*1/graph*i)/(mhp*1/graph)), 12, color[i+1]); } } } /* * 主にゲージが無くなっても生きているように見せる場合や * HPが残っているように見せる時に使う * ただし、後者の場合ifステートメントで制御しないとグラフが残り続ける * maxがグラフの本数で割り切れない場合、ゲージに多少の誤差が出ます。 */ int SetGraphEx( void *Chara, //キャラクターポインタ string String, //キャラクターネーム&レベル表示 int graph, //グラフの本数(1〜5) int max //グラフ全体の最大値(÷グラフの本数されます) ){ int color[6] = {0x000000, 0xff0000, 0xffff00, 0x00ff00, 0x0080ff, 0x8000ff}; float mhp = GetCharaStatus(Chara, 6), hp = GetCharaStatus(Chara, 5); float P = mhp-max; //あまるHP float div = max/graph; //1本あたりのHP int i; if(!GetUniqueParam(Chara, 0)) SetUniqueParam(Chara, 0, 1); for(i=0;i hp&&hp > mhp-max){ DrawText(-1, 220, 10, String, 0xe0e0e0, 256); DrawText(-1, 120, 28, "HP", 0x80ff80, 256); DrawRect(-1, 139, 29, 302, 14, 0xffffff); FillRect(-1, 140, 30, 300, 12, color[i]); FillRect(-1, 140, 30, (int)(300*(((hp-P)-div*i)/div)), 12, color[i+1]); } } } /* * ↑システム関数 */