前置き
1.Nobu12LimitOverSystem フォルダ内の Nobu12LimitOverSystem.sln から起動。ウインドウが開く。
2.ウインドウ内の Nobu12LimitOverSystem をダブルクリック。
3.LOSystem.ProgramList.東方Project をダブルクリックし、 東風谷早苗 を同じようにダブルクリック。
4.Default_Flag.xmlを削除。(接続終了時に保存をした場合)
+
|
とりあえず書き方だけ必要な人用 |
次の「void 覚醒条件(object o, EventArgs e)」をコピーし、「覚醒条件」を別の名前に変更する。
ctrl.Event.DailyEvent += new cEventControl.EventHandler(覚醒条件); をコピーし、次の行に貼り付け、「覚醒条件」を別の名前に変更する。
ctrl.Event.DailyEvent -= 覚醒条件; も同様に、別の名前に変更する。
class 東風谷早苗 //(武将名)
{
private MainControl ctrl;
//武将コントロールを取得
MemoryMap.cCharacter sanae; //早苗 → sanae
public 東風谷早苗(MainControl cnt) //武将名(MainControl cnt) ← ゲーム起動時に行う確認作業を記述
{
ctrl = cnt;
//起動時処理
//武将名が存在しているか確認
if (ctrl.MemControls.CharaControl.NameCheck("東風谷早苗") == false) return;
sanae = ctrl.MemControls.CharaControl.Chara("東風谷早苗");
if (!sanae.Check) return;
//未覚醒の場合
if (ctrl.Flag.GetFlag("覚醒", "東風谷早苗") == 0)
{
ctrl.Event.DailyEvent += new cEventControl.EventHandler(覚醒条件);
//DailyEvent ← ゲーム中に毎日発生するイベント。覚醒条件を満たしていない場合
//スルーされ、満たした場合は解除されるので、大体はゲーム中一回のみ実施される。
//()内に記載したイベントを、毎日実行するように、登録するためのコード。
}
}
void 覚醒条件(object o, EventArgs e) //覚醒処理を実行するコード。
{
//一般状態ではなければ条件未達(捕虜・人質含む)
if (sanae.Info.Condition != 7) return;
//①所属軍に神奈子、諏訪子がいる
if (!ctrl.MemControls.CharaControl.SameInfluence("東風谷早苗", "八坂神奈子", "洩矢諏訪子")) { return; }
//②所属軍の名声が300以上
if (sanae.Affiliation.Influence.Celebrity > 299)
//③所属軍に霊夢がいる
if (ctrl.MemControls.CharaControl.SameInfluence("東風谷早苗", "博麗霊夢"))
{
//覚醒条件達成
ctrl.Event.DailyEvent -= 覚醒条件;
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 20, 20, 20, 20);
}
}
}
|
前回、コードを変更することで、覚醒内容を改造することが出来ましたね。
思い出せない人は、安っぽいインスタントコーヒーを一口飲んでから、前回をもう一度見てきてもかまいません。
その間に、私はドーナツ(チョコでコーティングされた、とても文化的なオーガニック食物)を三つは食べられるでしょうから。
思い出しました?
では、新しく「覚醒させる」にはどうすればいいのでしょう?
確か、「void 覚醒条件(object o,EventArgs e)」の中身を変更したら、改造が出来たはずです。
ここをコピーして名前を変更できたら、新しく「覚醒させる」ことが出来るかもしれないですね。
まずは、わかりやすく改造してみましょう。
例えば、次のように。
void 覚醒条件(object o, EventArgs e)
{
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 20, 20, 20, 20);
}
わけのわからない呪文を取り払ったら、やけにすっきりしたと思います。
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 20, 20, 20, 20);
これは確か、該当武将の能力値を20ずつ上昇させたはずですね。
ゲームを起動し、接続して、実行してみましょう。
数日進めると、おかしなことに気がつくはずです。
なぜか能力が急上昇している。20しか上昇しないはずなのに!?
接続ボタンを押して、終了してください。
保存は「いいえ」にしてください。
もし保存した場合は、ページトップの4.を実行しておきましょう。
これは明らかにバグだと思われます!
至急マイクロソフト社に連絡の上、修正してもらう必要があるのでは?
いや、ちょっと待ってください。
その前に、改造する前のコードと見比べてみましょう。
+
|
改造前のコード |
class 東風谷早苗
{
private MainControl ctrl;
//武将コントロールを取得
MemoryMap.cCharacter sanae;
public 東風谷早苗(MainControl cnt)
{
ctrl = cnt;
//起動時処理
//武将名が存在しているか確認
if (ctrl.MemControls.CharaControl.NameCheck("東風谷早苗") == false) return;
sanae = ctrl.MemControls.CharaControl.Chara("東風谷早苗");
if (!sanae.Check) return;
//未覚醒の場合
if (ctrl.Flag.GetFlag("覚醒", "東風谷早苗") == 0)
{
ctrl.Event.DailyEvent += new cEventControl.EventHandler(覚醒条件);
}
}
void 覚醒条件(object o, EventArgs e)
{
//一般状態ではなければ条件未達(捕虜・人質含む)
if (sanae.Info.Condition != 7) return;
//①所属軍に神奈子、諏訪子がいる
if (!ctrl.MemControls.CharaControl.SameInfluence("東風谷早苗", "八坂神奈子", "洩矢諏訪子")) { return; }
//②所属軍の名声が300以上
if (sanae.Affiliation.Influence.Celebrity > 299)
//③所属軍に霊夢がいる
if (ctrl.MemControls.CharaControl.SameInfluence("東風谷早苗", "博麗霊夢"))
{
//覚醒条件達成
ctrl.Event.DailyEvent -= 覚醒条件;
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 20, 20, 20, 20);
}
}
}
|
ctrl.Event.DailyEvent -= 覚醒条件;
残したコードの上の行に、このようなものが。
DailyEvent -= 覚醒条件; とある。
……毎日のイベントから、マイナスイコール、覚醒条件?
覚醒条件と言うのは、「void 覚醒条件(object o, EventArgs e)」のことでしょうか。
なんらかの関係があるのかもしれない。先ほどのコードに、この二行を追加してみましょう。
void 覚醒条件(object o, EventArgs e)
{
//覚醒条件達成
ctrl.Event.DailyEvent -= 覚醒条件;
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 20, 20, 20, 20);
}
すばらしい!
能力が上昇し、かつ、意図したとおり一回のみで終了していることに気がつくはずです。
よくわからないが、「ctrl.Event.DailyEvent -= 」と言うのは、覚醒イベントが「起こらない」処理のようだと理解できます。
これで今回の講座は無事終了。
強めに入れたインスタントコーヒーを片手に、チョコチップスドーナツを一口で流し込もうとして、……
……そうです、思い出しました。
新しく「覚醒させる」ことが今日の内容でした。
そのために、まずは「void 覚醒条件(object o, EventArgs e)」をコピーして、名前を変更しようとしていたのです。
先ほど改造したものをコピーして、そうですね、名前も変更しましょう。
ついでに能力も20から200と十倍にしましょうか。
例えば次のように。
void 覚醒条件(object o, EventArgs e)
{
//覚醒条件達成
ctrl.Event.DailyEvent -= 覚醒条件;
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 20, 20, 20, 20);
}
void 超絶覚醒!(object o, EventArgs e)
{
//覚醒条件達成
ctrl.Event.DailyEvent -= 覚醒条件;
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 200, 200, 200, 200);
}
さてこれでゲームを……おっと!
先ほどの「へま」を忘れたわけではありません。
「ctrl.Event.DailyEvent -= 覚醒条件;」を、「ctrl.Event.DailyEvent -= 超絶覚醒!;」に変更しましょう。
これで、「覚醒条件」、「超絶覚醒!」あわせて、早苗さんの能力値が全部220上昇するだろうと思われます。
常識に囚われてはいけないのですね!
void 覚醒条件(object o, EventArgs e)
{
//覚醒条件達成
ctrl.Event.DailyEvent -= 覚醒条件;
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 20, 20, 20, 20);
}
void 超絶覚醒!(object o, EventArgs e)
{
//覚醒条件達成
ctrl.Event.DailyEvent -= 超絶覚醒!;
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 200, 200, 200, 200);
}
さて。
ゲームを起動して、接続して、さて。
言いたいことはわかります。
能力が20しか上昇していないと、そうおっしゃりたいに違いない。
よろしい、ならばコードを確認してみましょう。
(まったく上昇していない場合、ゲームを終了するときに保存してしまったか、あるいはトップの4.を実施していません)
さきほど、能力値の上昇が止まらないことがありました。
「覚醒条件」のイベント停止を行わなかったのが原因ですね?
ならば、同じように、「覚醒条件」のイベントを「開始」するコードがあると、気づくことができます。
(ええ、実を言うとこれは嘘です。私は答えを知っていながら、今、新たに、気が付いた「ふり」をしているだけです。でも、私を信じている純粋な子供たちには、このことは秘密です)
……見つけました。
ctrl.Event.DailyEvent += new cEventControl.EventHandler(覚醒条件);
先ほどとは若干違いますが、何しろ「 += 」、「 new 」とあります。
これが原因なのは確定的に明らかです。改造しましょう。
ctrl.Event.DailyEvent += new cEventControl.EventHandler(超絶覚醒!);
さて、これを追加してみましょう。
なんだかコードがごちゃごちゃなので、初めのほうにちょこっと付け足しましょうか。
ついでに、いままでのコードも全部書いて見ましょうか。
public 東風谷早苗(MainControl cnt)
{
ctrl = cnt;
//起動時処理
ctrl.Event.DailyEvent += new cEventControl.EventHandler(超絶覚醒!);
//武将名が存在しているか確認
if (ctrl.MemControls.CharaControl.NameCheck("東風谷早苗") == false) return;
sanae = ctrl.MemControls.CharaControl.Chara("東風谷早苗");
if (!sanae.Check) return;
//未覚醒の場合
if (ctrl.Flag.GetFlag("覚醒", "東風谷早苗") == 0)
{
ctrl.Event.DailyEvent += new cEventControl.EventHandler(覚醒条件);
}
}
void 覚醒条件(object o, EventArgs e)
{
//覚醒条件達成
ctrl.Event.DailyEvent -= 覚醒条件;
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 20, 20, 20, 20);
}
void 超絶覚醒!(object o, EventArgs e)
{
//覚醒条件達成
ctrl.Event.DailyEvent -= 超絶覚醒!;
//覚醒処理(ひなやぼ版)
ctrl.DataProcessMethods.HinaYaboAwakening("東風谷早苗", 1, 200, 200, 200, 200);
}
あとは確認してみてください。
今回のことをまとめると、次のように簡略化できます。
public 武将の名前(MainControl cnt)
{
ctrl.Event.DailyEvent += new cEventControl.EventHandler(○○○○); //↓に記述するvoidの名前をイベントとして追加
}
void ○○○○(object o, EventArgs e)
{
ctrl.Event.DailyEvent -= ○○○○; //イベント処理しないように停止
}
あ、「DailyEvent」って言うのがあるくらいだから、もしかしたら月ごとの処理や年毎の処理なんかもあるかもしれませんね!
カウンター
今日 -
昨日 -
合計 -