集めた仲間によって評価が変わるRPGの作成~全NPCのフラグ(会話、アイテム)と仲間加入イベント③~

 

集めた仲間によって評価が変わるRPGの作成

~全NPCのフラグ(会話、アイテム)と仲間加入イベント③~

こんにちは、東京経済大学3年のSTです。
全NPCのフラグ(会話、アイテム)と仲間加入イベント②の続きです。
(ステージ3,7,11)


ステージ11



魔法使いD

{active:true, name:"魔法使いD", sprite:"mage1", stage:11, x:9,y:2, solid:true, talk:function(){ if(!hasItem("霊魂D")){ showMsg("魔法使いD","魂が足りない。"); return; } if(!inParty("魔法使いD")){ showChoice("魔法使いD","その魂を私に。共に終わりを見届けよう。",["はい","いいえ"],(i)=>{ if(i===0){ addParty("魔法使いD"); showMsg("魔法使いD","よし見届けよう。"); } else{ showMsg("魔法使いD","まだなのか。"); } }); }else{ showMsg("魔法使いD","もう仲間になっている。"); } } },

役割
アイテム「霊魂D」で加入できる魔法使い。

イベント/条件

  • 霊魂Dなし:「魂が足りない。」

  • 所持&未加入:「はい」で加入

  • 加入後:「もう仲間になっている。」

評価との関係

  • 現行 calcFinalEvaluation()if(inParty("魔法使いD"))score++; があるため 加点あり


戦士I

{active:true, name:"戦士I", sprite:"warrior7", stage:11, x:17,y:5, solid:true, talk:function(){ if(!hasItem("戦士Iの剣")){ showMsg("戦士I","剣がどこかにあるはずだ。"); return; } if(!inParty("戦士I")){ showChoice("戦士I","その剣を私に。共に行こう。",["はい","いいえ"],(i)=>{ if(i===0){ addParty("戦士I"); showMsg("戦士I","ともに戦おう。"); } else{ showMsg("戦士I","ならば剣は預けておこう。"); } }); }else{ showMsg("戦士I","もう仲間になっている。"); } } },

役割
アイテム「戦士Iの剣」で加入できる戦士。

イベント/条件

  • 戦士Iの剣なし:「剣がどこかにあるはずだ。」

  • 所持&未加入:「はい」で加入

  • 加入後:「もう仲間になっている。」

評価との関係

  • 現行 calcFinalEvaluation()if(inParty("戦士I"))score++; があるため 加点あり


骸骨王

{ active:true, name:"骸骨王", sprite:"skeletonKing", stage:11, x:8,y:9, solid:true, talk:function(){ if(inParty("骸骨王")){ showMsg("骸骨王","カラカラ……骨の王は、すでに汝と共にある。"); return; } if(!inParty("魔法使いA") || !inParty("魔法使いB") || !inParty("魔法使いC") || !inParty("魔法使いD")){ showMsg("骸骨王","……我が力を取り戻すためには、4人の術者が必要だ……"); return; } if(!inParty("パンプキンマン")){ showMsg("骸骨王","……カラカラ……カボチャの道化が最後の鍵となる……"); return; } showChoice( "骸骨王", "……この感覚、久しい……\n" + "汝の軍勢に、骨の王を加えるか……?", ["はい","いいえ"], (i)=>{ if(i===0){ addParty("骸骨王"); setFlag("skeletonKingDefeated", true); showMsg("骸骨王","カラカラ……力を貸そう。"); }else{ showMsg("骸骨王","待とう。いつまでも"); } } ); } },

役割
複合条件(魔法使いA/B/C/D+パンプキンマン)を満たすと加入できる裏ルート仲間。

イベント/条件

  • すでに加入済:「骨の王は、すでに汝と共にある。」

  • 魔法使いA/B/C/D が揃っていない:「4人の術者が必要」

  • パンプキンマンがいない:「カボチャの道化が最後の鍵」

  • 条件揃い:選択肢「はい」で加入+ skeletonKingDefeated=true

評価との関係

  • 現行 calcFinalEvaluation()if(inParty("骸骨王))score++;if(hasFlag("skeletonKingDefeated"))score++; があるため 加入加点+フラグ加点あり


ステージ7



骸骨騎士

{ active:true, name:"骸骨騎士", sprite:"skeletonKnight2", stage:7, x:11, y:1, solid:true, talk:function(){ if(hasFlag("defeated_skeletonKnight")){ this.active=false; return; } const eva = calcFinalEvaluation(); const rank = eva.rank; const score = eva.score; showChoice( "骸骨騎士", "カラカラ……最終の扉はすぐ先……\n" + "現在の評価ランクは「" + rank + "」(スコア:" + score + ")だ……\n" + "この仲間で挑む覚悟はあるか……?", ["挑む", "挑まない"], (i)=>{ if(i===0){ if(rank==="D" || rank==="C"){ showMsg("骸骨騎士","……まだ早い……\nこの先には進めぬ……"); return; } setFlag("defeated_skeletonKnight", true); this.active = false; showMsg("骸骨騎士","……覚悟を見届けた……進むがよい……"); }else{ showMsg("骸骨騎士","……準備を整え、再び来るがよい……"); } } ); } },

役割
評価ランクが低いと止め、B以上ならフラグを立てて消える門番。

イベント/条件

  • defeated_skeletonKnight 済み:消える

  • 「挑む」+ rankがD/C:進めない

  • 「挑む」+ rankがB以上:defeated_skeletonKnight=true → 消える

評価との関係

  • 現行 calcFinalEvaluation()このフラグの加点はない


骸骨剣士

{active:true, name:"骸骨剣士", sprite:"skeletonSwordsman", stage:7, x:3,y:4, solid:true, talk:function(){ if(hasFlag("defeated_skeletonSword")){ this.active=false; return; } if(inParty("戦士A") && inParty("戦士B")&& inParty("戦士C")&& inParty("戦士D")&& inParty("戦士E")&& inParty("戦士F")&& inParty("戦士G")&& inParty("戦士H")){ setFlag("defeated_skeletonSword",true); addItem("戦士Iの剣"); this.active=false; showMsg("骸骨剣士","8人の戦士によって倒された。『戦士Iの剣』を落とした。"); }else{ showMsg("骸骨剣士","それでは我には勝てぬな。"); } }},

役割
戦士A〜Hが全員揃っていると倒せて「戦士Iの剣」を落とす。

イベント/条件

  • defeated_skeletonSword 済み:消える

  • 条件(戦士A〜H全加入)OK:

    • defeated_skeletonSword=true

    • addItem("戦士Iの剣")

    • 消える

  • 条件不足:「それでは我には勝てぬな。」

評価との関係

  • 現行 calcFinalEvaluation()if(hasFlag("defeated_skeletonSword"))score++; があるため フラグ加点あり


ゴースト

{active:true, name:"ゴースト", sprite:"ghost", stage:7, x:13,y:8, solid:true, talk:function(){ if(hasFlag("defeated_ghost")){ this.active=false; return; } if(inParty("僧侶A") && inParty("僧侶B") && inParty("僧侶C")&& inParty("闇の魔術師")){ setFlag("defeated_ghost",true); addItem("霊魂D"); this.active=false; showMsg("ゴースト","……成仏。『霊魂D』を入手。"); }else{ showMsg("ゴースト","……足りない。"); } }},

役割
僧侶A/B/C+闇の魔術師が揃うと成仏して「霊魂D」を落とす。

イベント/条件

  • defeated_ghost 済み:消える

  • 条件(僧侶A/B/C+闇の魔術師)OK:

    • defeated_ghost=true

    • addItem("霊魂D")

    • 消える

  • 条件不足:「……足りない。」

評価との関係

  • 現行 calcFinalEvaluation()if(hasFlag("defeated_ghost"))score++; があるため フラグ加点あり


ステージ3(ボス部屋)






ダンジョンボス

{ active:true, name:"ダンジョンボス", sprite:"dungeonBoss", stage:3, x:9,y:4, solid:true, talk:function(){ if(hasFlag("bossCleared")){ showMsg("ダンジョンボス","……すでにこの部屋の主は消え去っている。"); this.active = false; return; } const eva = calcFinalEvaluation(); const rank = eva.rank; const score= eva.score; showChoice( "ダンジョンボス", "……ここが最終の地だ。\n" + "今の評価ランクは『" + rank + "』\n" + "スコア:" + score + "\n\n" + "本当にこの仲間たちで挑むか?", ["挑む","挑まない"], (i)=>{ if(i!==0){ showMsg("ダンジョンボス","……覚悟が定まった時に来るがよい。"); return; } const okRanks = ["SS","S","A","B"]; if(!okRanks.includes(rank)){ showMsg( "ダンジョンボス", "……まだ力が足りぬ。\n" + "出直すがよい。" ); return; } setFlag("bossCleared", true); this.active = false; showMsg( "ダンジョンボス", "……見事だ……\n" + "\n\n" + "(ダンジョンボスを倒した)\n" + "城へ戻り、王に報告しよう。" ); } ); } },

役割
評価ランクが一定以上なら撃破でき、bossCleared をONにする最終ボス。

イベント/条件

  • bossCleared 済み:会話後に消える

  • 未撃破:評価ランクが SS/S/A/B のときのみ撃破 → bossCleared=true → 消える

  • 撃破後NPC王様に話しかけると、評価、スコア、エンディング(あとでエンディングの追加)

評価との関係

  • 現行 calcFinalEvaluation()if(hasFlag("bossCleared"))score++; があるため、撃破後 フラグ加点あり




参考文献・引用サイト

ぴぽや倉庫
ドット絵世界
DOT  ILLOST
効果音ラボ