diff --git a/MANUAL/omake.txt b/MANUAL/omake.txt
new file mode 100644
index 0000000..0c65b8b
--- /dev/null
+++ b/MANUAL/omake.txt
@@ -0,0 +1,679 @@
+
+
+ 東方時封城 〜 the Alternative Age
+ おまけテキスト
+
+__________________
+
+
+
+
+ このさきには
+ 暴力的で
+ 鬼のような
+ ネタバレどもが
+ あなたを待っています。
+
+ そ れ で も 行きますか?
+
+ はい <いいえ>
+
+
+
+
+__________________
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+_______________________________________________________________________
+■ もくじ
+=======================================================================
+一、あとがきのようなもの
+一、スペシャルサンクスな人たち
+一、エキストラのストーリー
+一、登場キャラの設定
+
+_______________________________________________________________________
+■ あとがきのようなもの
+=======================================================================
+
+皆様こんにちは。Mc(まく)と申す者です。
+以前にもフリーでいくつかステージモノの弾幕風スクリプトを配布したりとか、
+東方アレンジ・耳コピスレッドCD企画に参加し1曲提供したので
+知っている方も居るかもしれませんが、知らない人ははじめまして。
+
+まずは本作品をプレイしていただきありがとうございます。
+最初に断っておきますが、この文書はあとがき「のようなもの」です。
+脱線上等、駄文全開ですので、物好きな方以外は斜め読み推奨ってことで(^^;
+忙しい方は退屈になってから見ていただくとより一層楽しめるかと思います。
+
+今までも紅魔郷Phantasmステージとか、永夜抄Phantasmステージとか、本編
+ステージのアレンジのようなものを出してたりはしていたのですが、時期的には
+永夜抄Phantasmステージを作ってる最中辺りでしょうか、ふと1ステージもの
+じゃなくてもう全部作れないかな?と思いはじめたのが始まりですね。
+仕事中(当時は工事やイベントなどの交通警備員やってました)、その時は夜勤で
+しかもいつもの交通誘導じゃなくて朝まで歩行者に入られないように見張り
+してろって言うなんとも退屈な仕事で、あー暇だなとか思いつつポータブルMP3
+プレーヤーで「蓬莱人形」でも聞きつつ所定の場所に突っ立ってたんですが
+(職務怠慢でゴメンナサイ>現場のK監督さん)、ふとTr7のサーカスレヴァリエが
+なんかパチェっぽいなーとか思い始めたのが最初で、そういえばその前のTrの
+エニグマティクドールなんかもヴワルっぽくね?とか思ってきて、後日紅魔郷の
+BGMを丸ごと差し替えてみたらなんと雰囲気ばっちり!流石に背景とBGMが
+シンクロしなくなったのは仕方ないですが(っというか神主さんゴメンナサイ)
+で、その次の日までに4・5・6ステージのBGMの構想が完全に出来上がって、
+あぁ、じゃあこれ作っちゃおうって感じで晴れて時封城製作が始まりました。
+永夜抄Phantasm完成のちょっと前辺りから「thA(仮)」ってのがありましたが、
+あれがまさしくこれです。ちなみにth10だからthAじゃありません。本家とは
+また異なる(パラレルワールドでの)幻想郷でのお話ということで本家のどの
+東方にも属さないぞって意味で「thA」と名づけてみました。というわけで次は
+「thB」ですかね。しつこいかも知れませんが16進数ではないですよ。
+
+今回の東方時封城は東方弾幕風で動作する超巨大なステージスクリプトですが、
+実はここかなり迷いました。弾幕風スクリプトにするか、または独立した
+アプリにするか、でね。最初独立アプリと弾幕風スクリプト両面で計画していた
+のですが、やはり今まで弾幕風ステージスクリプト3作品を連続して投下してた
+人間なので、今回も弾幕風で行こうと最終的に決定しました。現時点でも
+「弾幕風ステージの人」で通ってる(た)みたいですし(^^;
+それと、弾幕風スクリプトを選んだもう一つの理由を挙げると、
+「弾幕風の可能性を極限まで追求してみたかった」からですね。紅魔郷Phを
+作ってる時はそんなこと毛頭も考えていなかったのですが、完成させてから
+暫く他人のリプレイ見てはうけけけと嘲笑してる最中に(うっわ、性格悪いな)、
+「あー、ここ演出追加すればもうちょっと本家っぽくならないかな」とか思う
+ようになってきて「いっそのこと本家東方と見間違うスクリプトを作ろう!」と
+まで思ってきて、そんな考えで妖々夢外伝、永夜抄Phantasmと作ってきました。
+作品が進むごとに重くなってきてゴメンナサイ。そして今回も重いです。
+覚悟してくださいそしてゴメンナサイ。やはりストーリーを実装するとなると、
+ある程度は演出も必要不可欠になって来ますが、今回その範疇すら越えてます。
+コンセプトが「弾幕風で本家東方のクオリティに匹敵するスクリプトを作る」
+なので、勘弁したってください。今回コミケ68で頒布させていただきましたが、
+今回ネットでのフリー配布ではなく、コミケで頒布しようとかなり前の段階から
+決めてました。その代わり弾幕風とは思えないほどのクオリティの作品を
+引っさげてみんなをびっくりさせてやろうって考えだったのですが、
+弾幕風スレ見てると他の皆さんもクオリティ高くなって、自分ばかりびっくり
+してる始末。まぁコミケで頒布するに恥じない作品には仕上がったと自分では
+思ってますが。当初は紅魔郷Phantasmから始まって、妖々夢外伝で演出背景とか
+試行錯誤して、永夜抄Phantasmで磨いていって、時封城で完成のつもり
+だったのですが、それはあくまでフリー配布でのレベルであって、コミケ頒布
+レベルで考えたらやっぱり辛うじてスタートラインに立てたかなって程度かと
+思います。その点次作次々作ではおおよそ半年〜1年スパンでもっと凄いのに
+チャレンジしていきたいと思いますね。それまで東方が続いてくれるかどうかが
+心配ですが。特に例大祭2以降は縮小の方向に向かって行くとの噂が絶えず実に
+怖い限り。最低でも3〜4年、できれば6〜7年は続いて欲しいと思う。二次創作
+されてる方々が神主様に元気(と、さりげなくプレッシャー)を送り続ける限り
+何とかなるんじゃないかなぁ。自分は早くに本家東方が終わってしまっても
+当分の間は東方作品を出し続けていきたいです。それだけ東方大好きです。
+(勿論仕事しながらね。さすがにNEET志望じゃないし)
+
+今回は従来と違い難易度がEasy〜Lunaticまであって誰でも手軽に楽しめる、
+弾幕風では珍しい低難易度ステージかと思いきや、やってみれば一発で分かると
+思いますが、かなりはっちゃけてます。本家東方・・・まぁここでは妖々夢と
+しましょうか、のEASYをLevel2、Normalを4、以下HardとLunaticを6、8と
+例えると、本作はEASYが2.5、NORMALが5、HARDは7.5、LUNATICは10程度を想定
+して作りました。最初はもう少しは甘くしても良かったかもとも思いましたが、
+やっぱ難易度をぬるくしてしまうとこの非公式の東方STGではあまり熱く
+なれないんじゃないかな、と思ってみたので。まぁそれでもEASY辺りは本家と
+大差ない難易度に仕上げたつもりなので、まぁ本家東方のEASYがクリアできる
+程度の能力があれば楽しんでもらえるんじゃないかなと思います。安易にHARDや
+LUNATICを選択してあえなく大往生した方、南無阿弥陀仏。本作品をコミケで
+頒布した理由の一つに東方界隈により広く弾幕風を知ってもらうって意味合いも
+あるんですが、かえってこれで「弾幕風=頭のおかしな難易度」って認識
+ばかりが強調されて広く知られてしまうのはやだなぁ・・・ι
+
+そういえばパッケージで「今回神主様がやらないなら俺がやる!」と宣言
+してましたが、あれは偶然です(^^; この作品は花映塚が発表されるかなり
+前から製作始めてきたし、まさか神主様が夢時空風対戦STGを作るとは思っても
+みなかったので。そういえばそれで思い出したのですが、2月と3月にHDDの中身
+全部ふっ飛ばしました。2月にはHDDのクラッシュで全て消滅、3月には
+ウィルス感染でHDDアクセス不能に陥ってしまいました。結構なところまで製作
+進めてたのでこの消滅はかなり痛かったでしたね。現在出来上がったのは実質
+4ヶ月弱で作り上げたのかと思うと結構信じられなかったりします。やっぱ
+神主様も言ってたけどお酒の力かなぁ。ちなみに自分は洋酒派ですがね。
+ウォッカベースのカクテル大好き。ちなみにそれ以来データ消滅は無いですが
+必ずバージョンアップの度に時封城(だけ^^;)をきっちりバックアップ
+とってます。Web上とCD-RWに。でもこうやって完全版を出すことが出来たので、
+晴れてバックアップを消すことが出来ました。実は結構Web領域食ってて
+大変だったので。もし1年間みっちり作り上げて磨き上げたらどんな作品が
+出来るだろうか・・・次作次々作での課題ですね。あとは時封城製作開始した
+頃は絵も落書きレベル、(辛うじて○ーリ○の絵板に投稿できる程度の画力)、
+曲なんかも今までコード進行が知らなくても作れるようなミニマルテクノ位しか
+まともに作ったことの無かった(と言うか時封城で初めて東方曲作った・・・ι)
+人間なので、本作品を通じて絵描きも作曲も小慣れてきた(≠うまくなった)今、
+果たして次回はどれだけのモノが作れるか・・・
+ところで改めて思ったこと・・・やっぱ音弄り楽しいぃ!(そっちかよ)
+
+さて、次回作「thB(仮)」ですが、現在の予定(は未定)では(たぶん)一度
+弾幕風から離れ(ると思い)ます。独立したWindowsアプリとして開発
+していきます。というのも次作は(たぶん)縦STGじゃありません。妖々夢や
+永夜抄に対して萃夢想・花映塚的なノリで対戦モノを作っていこうかなと
+考えてます。・・・次々作辺りでもしかしたら弾幕風に戻るかもしれない(^^;
+
+・・・結局あとがきらしいこと何も書いてないな自分・・・('A`)
+まぁいいや、またどこかでお会いしましょう。
+それではまた来世・・・間違えた。
+
+ STAFF #1:製作のほとんど担当
+ danmaq 代表 まく
+
+
+
+皆様こんばんはひがしといいます。
+まく君を東方に巻き込んだ張本人でもあります(笑)。東方妖々夢を彼に
+やらせてしまったばかりに・・・。まあ他人の人生を動かせるぐらいの
+完成度を誇っていたのはまず間違いない作品ではありましたが。そして
+そのせいで自分がいつの間にかdanmaqのメンバーになってました(笑)。
+自分も紅魔郷から始めてハマってしまった人間です。同人の世界は2年位前に
+入ってたが、深くのめりこんだのは東方があったからだと思っています。
+
+今回danmaqのステージスクリプト第4弾ですが、前作の3作とは違いdanmaq完全
+オリジナルストーリーです。前作も一応オリジナルなのですが、本家の作品名を
+少し使っているという意味では完全なオリジナルとはいえません。弾幕風上で
+動かすスクリプトでありながらステージ数が6+αという本家顔負けです。
+ここまでの製作の様々な障害はまく君が語っているので省かせてもらいます。
+ただ彼のがんばりはとんでもなかったです。NEETでもここまでやるのは相当
+きついです。自分にはまず出来ないでしょう。
+
+自分が時封城で行った作業は、弾幕の構想とステージ案の作成と
+デバックです。これでも自分は結構STGというジャンルをやっております。
+(1回だけですがア○カ○ィア全国1位に載った経験もあります)。
+プレイヤーとしてやってた自分が、今度は製作者として参加するというのは
+経験をすごく活かせると思いました。しかし・・・、弾幕を考えるのは
+想像以上にきついです。やるのと考えるのでは全く違う。さっき作ったのと
+似ないように(5面は似させているが)考えるのは難しい。CAVEなんかよく
+あんなに弾幕を考えられるものだなと思いましたよ。ステージ案は最初は
+パターンが多すぎなど色々な指摘がありましたが、配置に関しては東方らしい
+作りになったかな?と。そのまま採用されてるもの、+αされてたりします。
+
+自分が絵・音楽・プログラムのどれかが出来たら製作も余裕で終わったと思う
+のですが。この時封城で自分の新たなる挑戦をしたいと思いました。
+
+次回作の「thB」はまだ構想だけで何も進めてはいません。果たして本当に
+作れるのか心配です。ひょっとしたら構想だけで終わる可能性もあります。
+構想だけではできれば終わらせたくない。
+たとえ構想だけでも次に繋がることをしたいですね。
+
+さて普段自分はどういうことをしているのかというと仕事。就職もしており
+立派なサラリーマンです。仕事しながら製作協力は正直自分なりにかなり
+きつかった。仕事以外だと、ゲーセンでDDR(ダンスダンスレボリューション)
+ですね。早く次回作が出て欲しいと思う今日この頃。
+このゲームの実力はまあそこそこ。適度な運動にはこのゲームは最適です。
+
+さてとこのへんで終わらせてもらいます。
+今度はいつあとがきを書けるだろうか。
+
+ STAFF #2:弾幕・ステージ構想
+ danmaq No.2 ひがし
+
+_______________________________________________________________________
+■ スペシャルサンクスな人たち
+=======================================================================
+
+特に順不同です。あえて言うなら下のコメントを書き上げた順。
+
+○mkm 様
+
+本作品の動作ベースとなる、東方弾幕風の作者様です。
+弾幕風側として本作品製作に対し色々サポートいただきました。
+そもそも弾幕風がなければ全く異質の作品となっていたと思いますので・・・
+一時期は無茶・無謀な要望など出してしまってご迷惑おかけしましたが、
+こうやって晴れて一つの作品が出来上がりました。誠にありがとうございます。
+それと、また無茶するかもしれません。先にゴメンナサイしときます。
+弾幕風よ永遠なれ、東方の続く限り・・・
+
+
+
+○Age 様
+
+氏の製作なされた弾幕風用置き換え弾画像のCD収録に関して、
+弾幕風スレッド上にてご快諾いただきました。誠にありがとうございました。
+
+
+
+○東方アレンジ・耳コピスレッドCD企画 の皆様
+
+IRCにてBGM製作に関する多数のアドバイスをいただきました。感謝。
+なにぶん自分も企画に参加してるのでいつも和気藹々やってます。
+ここのところ忙しくて余り話に参加できなくてゴメンナサイ。
+
+('A`)
+
+
+
+・・・そうだ、忘れちゃいけない。
+
+
+○ZUN 様
+
+素敵な東方ワアルドを創造してくださった神主様にも感謝。
+
+
+
+○テストプレイヤー の皆様、そして、あなた 様
+
+この度は本作品を手に取っていただいた上に、こんな隅っこまで読んでいただき
+誠にありがとうございました。これからも(何か)出して行きたいので、
+このdanmaqに今後も期待していただければ幸いです。
+
+_______________________________________________________________________
+■ エキストラのストーリー
+=======================================================================
+
+霊夢「また退屈な季節になったわね」
+魔理沙「そうだな、雪が降りだすとマトモに外出れないからな」
+
+霊夢「あんたはマトモに外出れなくなる前に帰れ」
+魔理沙「カタイこと言うなよ。もし帰れなくなったら
+ 神社で冬明かせばいいだけで何の問題もないぜ」
+
+霊夢「そうね・・・待ってて、今夢想封印の符持って来るから」
+紫「面白そうな展開ね、私も混ぜなさい」
+
+霊夢「面白くないし、混ざったら神社が滅びるだけからそいつを連れて帰れ」
+紫「一体なんなのよ、つれないわね」
+
+霊夢「私はつい先日までまた厄介ごとに巻き込まれて
+ 疲れてるんだから、そっとしといて欲しいわ」
+魔理沙「同じく疲れてるんだから、冬の間神社で寝かせてもらうぜ」
+紫「あら、今度は何が起きてたのかしら?私は何も気付かなかったけど」
+
+魔理沙「あぁ、なんか過ぎた時の一部を消すとか言ってたぜ、非現実過ぎて
+ 信じてないけど、確かこんな・・・こんな感じの魔方陣だったかな」
+
+魔理沙がさっさっと描いた魔方陣を覗きこんだ紫の顔が凍りつく。
+紫「・・・それって」
+霊夢「何か覚えがあるのかしら?」
+紫「本当に時間戻るわよ」
+魔理沙「そーなのかー?」
+紫「で、ここの部分を・・・っと、こう書き換えれば、時間は
+ 無限年逆流して、事実上この世界は消滅することになるわ」
+二人「「え」」
+
+その日の晩、神社にて幻想郷中の高等妖怪が集まって人妖会議が開かれた。
+無論メインの議題は例の魔方陣について、だ。
+
+魔理沙「なぁ、やっぱ昼言ってたのって、さすがに嘘だろ?あんな単純な
+ 魔方陣で時間戻るなんて・・・あれくらい私でも普通に描けるぜ?」
+紫「嘘よ」
+霊夢「はぁ!?」
+
+紫「冗談はさておき、昼一度解散した後に見てきたわ。昼あなたの
+ 描いたのは単に魔力を集結させるための目印みたいなものよ。
+ ホンモノはその下の階にあったわ。とてつもなくどでかい魔方陣が、ね」
+魔理沙「そーなのかー?」
+
+紫「さて、で、書き写してきたこの魔方陣なんだけど」
+それを覗きこんだ妖怪どもが一斉に凍りつく。ただ一部の者は何も
+分からなそうな顔をしていたが。
+
+「あれは一度魔力を充填され、ましてや始動しかけていた。
+ 一度動き出したものは魔方陣が冷える迄の暫くの間、足りない
+ 魔力を補充するだけですぐに再始動することがあるわ。私なら
+ 今すぐにでも破壊すべきだと思うけど、皆の意見はどうかしら?」
+「まぁ落ち着け。あれは私でも滅多にお目にかかれない
+ 貴重な魔方陣だ。封印だけ施して保存しておくべきだと思うわね」
+「外の人間は地上を破壊するだけの兵器を
+ 備えている。今すぐ魔方陣を発動させるべき(ゴシャ」
+「今回主犯格のあなたは少々黙ってなさい」
+「じゃああれを幻想郷から追放したらどうです?結界の位置変えて・・・
+ どうせ妖力を持たぬ人間には扱える代物ではあるまいし」
+「それは言い換えると私たちの監視もできなくなるってことよ」
+「じゃあどうすればいいんだ・・〜」
+「・・・〜」
+「・・〜」
+
+結局夜通しで討論が続き、その中で酒宴ありの弾幕戦ありの惨事となり、翌朝、
+紫「と・・・言うことで、あんたら人間二人に任せたわ・・・
+ ちょっと会議で暴れ過ぎて疲れちゃった」
+霊夢「会議と呼べたのは最初の十数分だけね、まぁいいけど帰ってくるまでに
+ 神社改築しておきなさいよ。全く派手に壊してくれて・・・」
+魔理沙「要はあの魔方陣も派手に壊せばいいんだろ?この神社みたいに」
+霊夢「この神社は余計」
+力尽きたのか紫からの返事は無かった。
+
+二人が飛び立ってから数時間経った頃、神社で折り重なって倒れていた
+人妖どもが目を覚まし、暴れるだけ暴れた後だけあって疲れきった表情で
+口数も少なくぞろぞろと神社『だった』ところを後にしていった。
+紫「そういえば昨日見たときなんか人影が居たような気がしたけど、
+大丈夫かしら・・・ま、あの霊夢と初代Gなら何とかなるわね」
+紫はそう呟くとお疲れ人妖に混ざって帰っていった。
+
+
+魔理沙「へっくしょん!・・・あー、冬入って早速風邪かよ・・・」
+霊夢「・・・帰っても絶対神社直ってなさそうね・・・」
+
+_______________________________________________________________________
+■ 登場キャラの設定
+=======================================================================
+
+かなり非公式の俺設定満開だったりするのでそういうの嫌いな方はスルー推奨。
+
+
+
+○博麗 霊夢
+ 人間:幻想夢現の巫女
+
+言わずもがなの東方の顔であり主人公でもある、博麗神社の巫女さん。
+彼女の先祖は幻想郷の生い立ちに深く関わっているが、
+彼女はそれを知らないし、それどころか気にもしていない。
+物理的に人間だが頭の中までちゃんと人間してるかどうかは微妙。
+
+色々不公平な能力が使えるが、特に自慢したりすることは無い。
+むしろ毎年空っぽの賽銭箱の方を自慢しているような気がする。極稀に誰かが
+賽銭投げ込んでも数分後に魔理沙が持ち去ってしまうので、毎年空っぽ。
+
+緑茶が好物。緑茶のみで生きているのではないかとの疑惑も。
+
+
+
+○霧雨 魔理沙
+ 人間:恋色の白黒魔術師
+
+霊夢と並び今や東方の顔の主人公。自称普通の魔法使い。蒐集癖がある。
+主な入手経路は、霧雨邸のある魔法の森の入り口当たりにある古道具屋。
+肌身離さず箒を持ってる割に掃除は大の苦手。但し例外として神社の賽銭箱の
+掃除は大好き。小さな金属円盤や紙を中からかき出してはしっかり持ち帰る。
+
+最近自宅が倉庫になりかけて困っている。現在霧雨邸の裏手に小屋を新設して
+そこをメインの生活の場としているが、ここも次第に床が見えなくなってきて
+二号倉庫と改称されるのもそろそろ時間の問題だろう。
+
+今製作中の符は、どうやら戦闘用ではないとか何とやら。
+
+
+
+○大妖精(エルフチーフ)
+ 妖精:雑魚よりはマシな妖精
+
+ステージ1の中ボスとして登場します。
+
+主に湖の近辺に住んでますが妖精さんは基本的に好奇心旺盛なので
+あまり湖から離れるようなことをしなければ多少は森の中に
+入っていくことも。まぁストーリーと余り関係ないけど。
+
+
+
+○アリス・マーガトロイド
+ 妖怪:七色人形魔導師
+
+ステージ1のボスとして登場します。
+
+彼女もストーリーと余り・・・というか全く関係ありません。
+偶然知ってる顔が通りかかったので邪魔してみただけだったり。
+
+現在、(自称)体調不良気味なのであまり本気は出しません。スペルカードも
+二人を倒すために使ったのではなく、最近弾幕やってないので腕がなまって
+いないかどうかの確認のため(自称)です。でも、予想以上に腕が落ちていた
+ので(自称)、そんな粘らずにあっさりあきらめてそのまま帰ってしまいます。
+
+
+
+
+○紅 美鈴
+ 妖怪:紅の館の番人
+
+ステージ2の中ボスとして登場します。中国だから中ボス。あまり関係ないか。
+
+主人公二人が紅魔館の近くを通りかかったので、また侵入しに来たかと
+追い払いにやってきます。でも、弾幕の美しさの割にそんな強くありません。
+まぁ誰も名前を覚えてくれない程度の能力ですし。
+
+
+
+○十六夜 咲夜
+ 人間:時と紅の支配人
+
+ステージ2のボスとして登場します。
+
+別に侵入されたわけでもないし二人のことなどどうでも良いのですが、
+余りに外で騒いでるので耐えかねて出てきてしまいます。きっと紅魔館で
+子守りでもしてたのでしょう・・・で、外が煩くて子供が泣きやまないため
+耐えかねて出てきてしまったのでしょう。割と嘘ですが。
+
+
+
+○レティ・ホワイトロック
+ 妖怪:春の残雪、冬の物怪
+
+ステージ3の中ボスとして登場します。
+
+冬なので当たり前のように動き回ってます。当然近くに人を見つけたら
+ちょっかいを出そうとします。まぁバカじゃないのである程度相手の実力が
+出来ると判断したらさっさと引いてしまいますが。
+
+
+
+○リリーホワイト
+ 妖精:輪廻転生の四季妖精
+
+主に春の妖精。ステージ3のボスとして登場します。
+
+リリーに限らず妖精は季節が変わると別の妖精に生まれ変わる。夏には夏の
+妖精があり、冬には冬の妖精が居る。だが彼女のようにある程度の力を持つと
+最もメインの季節以外の妖精に転生した時、全開の威力を発揮できないので
+転生せずに、次の季節まで眠りについてしまうのだ。さらに力を持つと
+メイン以外の季節になっても眠りにすらつかなくなる。丁度チルノみたいに。
+ちなみに妖精は転生しても記憶は概ね引き継がれる。人間は多分無理。
+
+春が過ぎ去り、次の春までとある屋敷の床下で冬眠(夏眠秋眠含む)していた所、
+その館から突如湧き出てきた猛烈な冷気にびっくりして季節外れなのに慌てて
+外に飛び出し、暖を求めて山のてっぺんまで逃げてきた始末。
+
+今回紅白と白黒の二人に激しくけなされ、普段温厚な彼女でも内心ちょっと
+ムッと来てケンカを買って出ることに。春の能力だけだとレパートリーに
+欠けるので四季妖精に転生するが、春の能力に特化されてかなり経つ彼女には
+やはりそれらの全開の力を出すまでに至らなかった。
+
+
+
+○レイラ・プリズムリバー
+ 亡霊:騒霊人形師
+
+朽ち果てた洋館に住み着く自縛霊。ステージ4のボスとして登場します。
+
+元異界の貴族の末っ子。プリズムリバー家には両親と4人の娘で恵まれた生活を
+送っていた貴族だったが、とある不幸で両親を亡くし、そして長女・次女・
+三女と館を去っていったが、末っ子のレイラだけはこの屋敷に残り続けていた。
+
+・・・姉たちの帰りをいつまでも待つために、帰る場所を残しておくために。
+
+だが、山奥の洋館にいつまでも独りで居続けられるほどの
+強靭な精神力を持っているわけでもない彼女は日に日に精神を
+蝕まれていき、やがて孤独に耐え切れなくなった彼女は禁じられた
+マジックアイテムに手を出し、三姉妹の騒霊を生み出してしまう。
+
+そこに現れた三姉妹の像は楽団を思わせる格好をしていて、それぞれ一つずつ
+楽器を手にしていた。これは彼女の音楽家になりたいという願望が雑念となり
+騒霊に影響されたためである。幼少期から音楽が大好きで昔家庭があった頃、
+両親に音楽家を志す決意を明かしたが、厳しかった両親に大反対され彼女の
+望まぬ道へ進むことを強要されていた過去があった影響なのかも知れない。
+
+かくして大好きな姉妹と大好きな音楽に囲まれ明るい家庭が
+戻ってきた彼女だが、禁じられたマジックアイテムを使用した反動かどうかは
+定かではないが、彼女は三人の姉の虚像に見守られ短命で生涯を終えてしまう。
+
+それから暫くたち、その館には相変わらず4人が楽しく暮らしていた。
+レイラは成仏せず、3人の騒霊と永遠に館に居続けることを選んだのだ。
+結局若くして命を落とし、楽器を極める望みこそ果たせなかったが、
+3人の姉たちの演奏をいつも聞いていられるだけで既に満足していた。
+
+館の外は街から遠く離れた山奥だったため、光景こそ今も昔もさほど変化して
+いないが、実はすでにそこは元の世界ではなかった。いつから館が幻想郷に転移
+していたのか、そもそもここが幻想郷だという事実を、彼女は未だ知らない。
+
+
+
+○マエリベリー・ハーン
+ 人間:妖の力を持つ異界の人間
+
+ステージ5のボスとして登場します。
+また、エキストラステージでも中ボスとして登場します。
+
+外界にある総員2人しかいない霊能サークル「秘封倶楽部」のメンバーの一人。
+霊能活動ってのはあくまで表向きの名刺代わりのようなもので、現実に
+やっていることは、暗黙に禁忌とされている各所の結界暴きである。
+
+蓮台野の次に博麗神社の結界を暴き幻想郷に侵入した秘封倶楽部の二人。だが
+そこで人間好きの半妖、上白沢 慧音と出会ってしまうが、彼女に襲ったりする
+意思が無いことが分かると二人は好奇心から彼女についていってしまう。
+
+そうしてたどり着いた山を二つほど越えたところにある古い洋館の
+地下深くにある謎の祭壇。慧音はそこで何を思ったか二人に自分の
+力の一部を分け与え、二人に弾幕する程度の能力を持たせてしまう。
+その後慧音は祭壇に向かい目の前にある巨大な魔方陣を起動させ、術の
+補佐を頼まれる。二人は特に断る理由もないので言われるがまま従っていた。
+
+だが術の途中で上層部の方に別の人間の気配を感じた慧音はもう一人に
+比べて力の制御こそ不慣れなものの、弾幕にパワーのあるメリーを
+警備に向かわせた。そうして遭遇した巫女と魔法使い・・・。
+
+弾幕のパワーこそ人(妖?)一倍あれど、
+制御が利かずまた場数も少ない彼女に、勝ち目は薄かった。
+
+
+
+○上白沢 慧音
+ 妖怪:知識の人、獣の歴史
+
+ステージ6に出現する最終ボスです。
+
+元来人間が好きな彼は人間がわんさと居る外界のことを知り早速行こうと試み、
+命からがら博麗結界を乗り越えてやっと外界に出られたものの、
+そこで見たものは慧音の予想を遥かに超越した文明レベルであった。
+
+外の人間たちの持つ兵器は外の世界を全て滅ぼすのに十分すぎるものであった。
+幻想郷の妖怪どもも全て根絶できてしまうかもしれないし、下手するとこれらの
+兵器の破壊力の前では博麗の大結界ですら意味を成さないかもしれない。
+外の世界は物が裕福になりすぎていた。その一方物に頼りすぎてきた人間は心が
+育たず、相手を信じず互いに武力で威嚇することで辛うじて均衡を保っていた。
+少しでもそこに揺らぎが起きようものならすぐ戦争に発展し、最悪全てが破滅
+することも十分にありえることだろう。外の世界は心が貧相になりすぎていた。
+
+こんな世界に驚愕した慧音は何とかならないものかと色々
+案を模索する。そしてある歴史を思い出し、その頭の中の史料を元に
+その場所へ行くと、そこには史料どおりの巨大な魔方陣が眠っていた。
+
+時は百年以上昔、とある密談で幻想郷を永遠に隔離することが確定した。だが、
+参加者の中にはそれを快く思わない者もいた。そして一人は幻想郷が隔離される
+前にとある魔方陣を設置した。それは眠りながらその後のあらゆる森羅万象の
+歴史を蓄え続け、もしこれから行われる幻想郷隔離が後々誤りだったと判断した
+場合、この魔方陣で全てを無に帰し、丁度設置した今の時代に全てを戻すように
+記述された。そして彼はこの魔方陣を山奥の地下深くに封じ、滅多なことで
+知られないようにと西欧にあった大きな廃屋を魔力でその地下入り口の真上に
+移転させた。それから間もなくして、幻想郷は結界により隔離された・・・
+
+慧音は今まさにその時と判断し、魔方陣を動かそうと魔力を注入したが、その
+魔方陣はわずかに淡い光を放ったかと思うと間もなく停止してしまった。実は
+この魔方陣は、誰かが独断で勝手に時を戻さぬよう魔力による『錠』が
+かけられていて、その開錠には術者の他に2人以上の補佐が必要だったのだ。
+
+それから暫くの後、慧音は博麗神社の境内の片隅で一人困り果てていた。これを
+霊夢や他の皆に伝え協力を仰ぐか・・・否、分かってもらえないだろうな・・・
+
+悩みぬいた末に慧音が立ち上がったその時、視界に突然結界の亀裂が映り、
+そして初めてみる顔の人間が二人、その亀裂の中から現れた・・・。
+
+
+
+○宇佐見 蓮子
+ 人間:異界の科学者
+
+エキストラステージのボスとして登場します。
+外界にある、総員2人しかいない自称霊能サークル「秘封倶楽部」のリーダー。
+
+魔方陣のある祭壇で戦闘の騒音が消えると共に魔方陣の出す低周波音が
+弱まり、そして完全に何も聞こえなくなり魔方陣に11日間に渡り
+蓄積されてきた魔力もぷっつり途切れて何も感じなくなった。蓮子は
+全ての終わりを悟ると術の補佐をやめ、メリーと一緒に一度外界に帰った。
+
+暫くして落ち着いた頃に改めて幻想郷に乗り込み、興味本位で件の
+魔方陣について色々調べてみた。あちこち触ってみたり、慧音の真似事を
+してみたり。そしてそのうち物凄いことを発見した。この魔方陣は設置以来
+全ての歴史、全ての記憶を吸っては溜め込んでいたのだ。言ってしまえば
+巨大な近代歴史事典あるいは百科事典のようなもの・・・いや、それすらも
+凌駕するだろう。なんたって蓮子のここ1週間で抜け落ちた髪の本数から、
+数年前の外界における国内で緋蜂が異常発生した時の数まで正確に
+記憶されている。蓮子はメリーを放っぽってこの魔方陣のある地底祭壇に
+住み着き、なんとかこの魔方陣の全ての記憶の複製が出来ないものかあれこれ
+研究を始めたが、そんな時に紅白と白黒によりあらぬ邪魔が入る。
+
+この魔方陣の存在は余りに危険すぎた。世界最大の百科事典であると
+同時に、世界最大の最終兵器でもあるからだ。破壊の方向で意思が
+まとまった妖怪、全ての記憶の保存を望む異界の人間、別にどっちでも
+いいけど頼まれたことだから、と妖怪側に加担する幻想郷の人間・・・
+
+そしてついにぶつかった互いの譲れぬ意思・・・
+その後、魔方陣がどうなったかは当事者の二人+二人のみが知る。
+
+
+
diff --git a/MANUAL/thA.chm b/MANUAL/thA.chm
new file mode 100644
index 0000000..81efabe
--- /dev/null
+++ b/MANUAL/thA.chm
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a2deaa5c006558162550b23dee4bc8bcfd99f3aa76b45bb4b54969d0750f577f
+size 406978
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000..e9889b6
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1,37 @@
+========================================================================
+ 東方弾幕風用ステージスクリプト
+ 「東方時封城 - the Alternative Age」
+========================================================================
+
+MANUALフォルダにマニュアルやその他一式を同梱しておりますので、
+初めての方や物好きな方はご一読お願いします。
+
+なお、当スクリプトを動作させるには、
+東方弾幕風 バージョン0.11m以降が必要となります。
+
+なお、本CDに東方弾幕風は同梱しておりますので
+HDDにコピーするだけでそのままプレイできます。
+但し、インストーラは付属しておりません。
+HDDへのコピーやスタートメニューへの登録は各自でお願いします。
+
+インストール方法
+・CDの中身を全てHDDにコピーする
+・(お好みに応じて)th_dnh.exeとconfig.exeを
+ スタートメニューやデスクトップに登録する
+・(Pad使用の方は)config.exeを起動し[Pad]のタブを開き設定を行う
+・th_dnh.exeを起動してゲームスタート(インストール完了)
+
+東方弾幕風の最新版はこちら:
+と〜ほ〜GC
+
+本作品のバージョンアップパッチやその他サポートはこちら:
+danmaq
+
+注意!
+ファイル不整合により思わぬ不都合が発生する可能性があるため、
+体験版には上書きしないでください。古いフォルダを削除するなり
+別のフォルダ名に変更するなりしてからコピペしてください。
+
+thAフォルダ以下は非常にネタバレ性の強いファイルがごろごろ
+転がっています。余程必要が無い限り覗かないことを推奨します。
+
diff --git a/th_dnh/SE/seBomb_MarisaA.wav b/th_dnh/SE/seBomb_MarisaA.wav
new file mode 100644
index 0000000..667878d
--- /dev/null
+++ b/th_dnh/SE/seBomb_MarisaA.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b5d2c26685de146b68e84e935da4bb7143132f51a3dcdfb1f836c282ca6feee
+size 280026
diff --git a/th_dnh/SE/seBomb_MarisaA_Star.wav b/th_dnh/SE/seBomb_MarisaA_Star.wav
new file mode 100644
index 0000000..13d6ee5
--- /dev/null
+++ b/th_dnh/SE/seBomb_MarisaA_Star.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:85d79d59c69aa1c10197526707a931477df6d79b1cf15b0cff624629d30acaef
+size 29486
diff --git a/th_dnh/SE/seBomb_MarisaB.wav b/th_dnh/SE/seBomb_MarisaB.wav
new file mode 100644
index 0000000..ae7f537
--- /dev/null
+++ b/th_dnh/SE/seBomb_MarisaB.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:388c57e0eed4cca79828348955ff880f1c046a9098bc7dc57fd56ab53c9b0e48
+size 1234844
diff --git a/th_dnh/SE/seGraze.wav b/th_dnh/SE/seGraze.wav
new file mode 100644
index 0000000..650d679
--- /dev/null
+++ b/th_dnh/SE/seGraze.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f631e01acc55f20d9bd2100d69c65be4fcab13f06f3246f1ac53065a2171e225
+size 17740
diff --git a/th_dnh/img/CutIn_PlayerChar01.png b/th_dnh/img/CutIn_PlayerChar01.png
new file mode 100644
index 0000000..1738bee
--- /dev/null
+++ b/th_dnh/img/CutIn_PlayerChar01.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2922da14be2864ac3c3fce47ccb4a00fcc8e0663687ae6a288b14cb7fefb019
+size 34202
diff --git a/th_dnh/img/CutIn_PlayerChar11.png b/th_dnh/img/CutIn_PlayerChar11.png
new file mode 100644
index 0000000..506eed7
--- /dev/null
+++ b/th_dnh/img/CutIn_PlayerChar11.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e5bf43ee6b9d6dfa311d9eb51bd2dc545c161dff66c410673d47b4b3c15b871
+size 41506
diff --git a/th_dnh/img/STG_Frame.png b/th_dnh/img/STG_Frame.png
new file mode 100644
index 0000000..10025e6
--- /dev/null
+++ b/th_dnh/img/STG_Frame.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:63dc7d3e8f20218b09de70c48900e6660d97d331c907cfe8522283066c89867c
+size 112922
diff --git a/th_dnh/img/STG_Player01.png b/th_dnh/img/STG_Player01.png
new file mode 100644
index 0000000..eddfefd
--- /dev/null
+++ b/th_dnh/img/STG_Player01.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4864a08808061b0884dc4d810500f6398a729fb1566ef835c5933b4726d2666e
+size 6726
diff --git a/th_dnh/img/STG_Player11.png b/th_dnh/img/STG_Player11.png
new file mode 100644
index 0000000..54c4629
--- /dev/null
+++ b/th_dnh/img/STG_Player11.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f7a5d4e0a99d06f4192fc9986d1f57b6794ae893cbfb0b52fde78c1137a5da9f
+size 7209
diff --git a/th_dnh/img/Select_Player01.png b/th_dnh/img/Select_Player01.png
new file mode 100644
index 0000000..820793e
--- /dev/null
+++ b/th_dnh/img/Select_Player01.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9beb5e66f7d03a1a607d36eb7e98db2ea43b2e58e43aa951404cfe73293fc706
+size 252095
diff --git a/th_dnh/img/Select_Player11.png b/th_dnh/img/Select_Player11.png
new file mode 100644
index 0000000..f11f24d
--- /dev/null
+++ b/th_dnh/img/Select_Player11.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac8a14f2884b42547e1b4d0c831a6c16149e8b8a08e425f6318d285a5ae6712a
+size 261559
diff --git a/th_dnh/img/Shot.png b/th_dnh/img/Shot.png
new file mode 100644
index 0000000..e977f24
--- /dev/null
+++ b/th_dnh/img/Shot.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:98c7aeef9f6f9b52bbd761d9592bf364bada00ec31b3d6738bb5d35457cf0e26
+size 105481
diff --git a/th_dnh/script/thA/Alice.dnh b/th_dnh/script/thA/Alice.dnh
new file mode 100644
index 0000000..a967a2f
--- /dev/null
+++ b/th_dnh/script/thA/Alice.dnh
@@ -0,0 +1,8 @@
+#ScriptPathData
+#ScriptPath[.\Alice0.dnh]
+#ScriptPath[.\Alice1.dnh]
+#ScriptPath[.\Alice1S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Alice2.dnh]
+#ScriptPath[.\Alice2S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/Alice0.dnh b/th_dnh/script/thA/Alice0.dnh
new file mode 100644
index 0000000..5d1c896
--- /dev/null
+++ b/th_dnh/script/thA/Alice0.dnh
@@ -0,0 +1,103 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let bgm = false;
+ task Behavior(){
+ yield;
+ while( GetEventStep() != 1 ){ yield; }
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ while( GetEventStep() != 2 ){ yield; }
+ SetCommonData( "ShowName", 1 );
+ while( GetEventStep() != 3 ){ yield; }
+ PlayMusicEx( 3 );
+ Wait( 30 );
+ bgm = true;
+ }
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ SetX( 0 );
+ SetY( -128 );
+ SetGraphicRect( 1, 1, 45, 80 );
+ CreateEventFromScript( "Talk" );
+ Behavior();
+ }
+ @MainLoop{
+ if( !OnEvent() && bgm ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 36, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyAlice, 1, 1, 45, 80, count ); }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu5 );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]あいたたた・・・" );
+ TextOut( "\c[BLUE]やっと冬支度終えて一息って時に、\n何なのよこの腰の痛みは・・・" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]それは困ったものね" );
+ SetStep( 1 );
+ Wait( 60 );
+ SetChar( RIGHT, imgCutInAlice );
+ SetGraphicRect( RIGHT, 1, 1, 192, 320 );
+ Enemy();
+ SetStep( 2 );
+ SetNameFromTexture( RIGHT, imgNameAlice );
+ TextOut( "\c[RED]私もここ数日腰痛とかで困っているのよね" );
+ SetChar( LEFT, imgCutInReimu );
+ Player();
+ TextOut( "\c[BLUE]珍しいわ、あんたも悩むことあるのね" );
+ Enemy();
+ DeleteName( RIGHT );
+ TextOut( "\c[RED]悩みは時に女を美しく見せるのよ" );
+ TextOut( "\c[RED]あいたたた・・・\n本当に痛くなってきたわ" );
+ Player();
+ SetStep( 3 );
+ Player();
+ TextOut( "\c[BLUE]こういうときは、\n痛みをもって痛みを相殺すればいいのよ" );
+ Enemy();
+ TextOut( "\c[RED]その言葉、そっくりそのまま\n返してもよくて?" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]何ていうか、\n今日は一段と寒さがこたえるな" );
+ TextOut( "\c[BLUE]こういう日はさっさと行って\nさっさと集めてさっさと寝るに限るぜ" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]あなたの蒐集癖も飽きないものね" );
+ SetStep( 1 );
+ Wait( 100 );
+ SetChar( RIGHT, imgCutInAlice );
+ SetGraphicRect( RIGHT, 1, 1, 192, 320 );
+ Enemy();
+ SetStep( 2 );
+ SetNameFromTexture( RIGHT, imgNameAlice );
+ TextOut( "\c[RED]ま、私にも同じこと言えるわね" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]おー?\n私もコレクションにする気か?" );
+ Enemy();
+ DeleteName( RIGHT );
+ TextOut( "\c[RED]変なこと言わないでよ。\n腰痛に響くわ" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]出産か?" );
+ SetStep( 3 );
+ Enemy();
+ TextOut( "\c[RED]ば…バカ言わないの!\nこの場で黙らせるわよ?" );
+ Player();
+ TextOut( "\c[BLUE]出来るものならな。\n出来なきゃ霊夢に言いふらすぜ" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/Alice1.dnh b/th_dnh/script/thA/Alice1.dnh
new file mode 100644
index 0000000..7b85023
--- /dev/null
+++ b/th_dnh/script/thA/Alice1.dnh
@@ -0,0 +1,105 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 100 );
+ SetShotDirectionType( PLAYER );
+ let pattern = 0;
+ while( 1 ){
+ let dir = [ 1, -1 ][ trunc( pattern / 4 ) % 2 ];
+ alternative( pattern % 4 )
+ case( 0 ){
+ ascent( let i in 0..5 ){
+ let speed = 2;
+ loop( [ 3, 6 ][ Level == 1 ] ){
+ if( Level < 2 ){ CreateShot01( GetX(), GetY(), speed, [ RandBlur( 45 ), 0 ][ dir == 1 ], BLUE01, 10 ); }
+ else{ WayShotGap01( [ 10, 7.5 ][ i % 2 ], 5, speed, BLUE01, 5, [ RandBlur( 10 ), 0 ][ dir == 1 ] ); }
+ speed += [ 0.4, 0.8 ][ trunc( Level / 2 ) ];
+ }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ }
+ case( 1 ){
+ ascent( let i in 0..8 ){
+ let angle = 0;
+ while( angle < 360 ){
+ let speed = 1;
+ loop( [ 2, 3 ][ Level == 3 ] ){
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, Smooth( 3, 1, i, 7 ) * speed, ( angle + i * 9 ) * dir, 0, Smooth( -0.1, -0.05, i, 7 ), 0, RED04 );
+ SetShotDataA( 0, 30, NULL, NULL, 0, Smooth( 0.15, 0.1, i, 7 ) * speed, Smooth( 2, 3, i, 7 ) * speed, RED04 );
+ FireShot( 0 );
+ speed += 0.4;
+ }
+ angle += [ 45, 40, 24, 20 ][ Level ];
+ }
+ }
+ PlaySEEx( seShot1 );
+ Wait( 30 );
+ PlaySEEx( seKira1 );
+ }
+ case( 2 ){
+ ascent( let i in 0..10 ){
+ let speed = 2;
+ loop( 3 ){
+ let space = 35 - Level * 10;
+ let width = [ 15, rand( space, space + 10 ) ][ dir == 1 ] - i;
+ WayShot01( width, width, speed, BLUE11, 5 );
+ speed += [ 0.6, 0.9 ][ trunc( Level / 2 ) ];
+ }
+ PlaySEEx( seShot3 );
+ Wait( 10 );
+ }
+ }
+ case( 3 ){
+ SetShotDirectionType( ABSOLUTE );
+ ascent( let i in 0..8 ){
+ let firstangle = GetAngleToPlayer();
+ let angle = 0;
+ while( angle < 360 ){
+ let speed = 1;
+ loop( [ 2, 3 ][ Level == 3 ] ){
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, Smooth( 3, 1, i, 7 ) * speed, firstangle + ( angle + i * 2 ) * dir, 0, Smooth( -0.1, -0.05, i, 7 ), 0, RED21 );
+ SetShotDataA( 0, 30, NULL, firstangle + ( angle - i * 9 ) * dir, 0, Smooth( 0.15, 0.1, i, 7 ) * speed, Smooth( 1.8, 3, i, 7 ) * speed, RED21 );
+ FireShot( 0 );
+ speed += 0.4;
+ }
+ angle += [ 40, 36, 24, 20 ][ Level ];
+ }
+ }
+ PlaySEEx( seShot1 );
+ SetShotDirectionType( PLAYER );
+ Wait( 30 );
+ PlaySEEx( seKira1 );
+ }
+ Wait( 30 );
+ ExMove( false, count );
+ Wait( 50 );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2222 );
+ SetTimer( 50 );
+ SetInvincibility( 30 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 20 );
+ yield;
+ count++;
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyAlice, 1, 1, 45, 80, count ); }
+}
diff --git a/th_dnh/script/thA/Alice1S.dnh b/th_dnh/script/thA/Alice1S.dnh
new file mode 100644
index 0000000..b1098e6
--- /dev/null
+++ b/th_dnh/script/thA/Alice1S.dnh
@@ -0,0 +1,72 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ while( 1 ){
+ Concentration01( 120 );
+ PlaySEEx( sePower1 );
+ ascent( let pattern in 0..6 ){
+ Wait( [ 120, 80 ][ pattern != 0 && Level >= 2 ] );
+ let playerangle = GetAngleToPlayer();
+ if( pattern == 0 ){
+ let space = [ 30, 30, 16, 20 ][ trunc( Level / 2 ) ];
+ CircleShot02( space, 10, -0.4, 1, GREEN22, 10 );
+ if( Level != 0 ){ CircleShotGap02( space, 10, -0.36, 1.2, GREEN22, 10, space / 2 ); }
+ PlaySEEx( seShot1 );
+ }
+ let angle = [ 10, 20 ][ pattern % 2 ];
+ loop( [ 6, 10, 16, 60 ][ Level ] ){
+ let speed = 2;
+ loop( 8 + Level ){
+ let dir = 1;
+ loop( 2 ){
+ CreateShot01( GetX(), GetY(), speed, playerangle + angle * dir, BLUE01, 5 );
+ dir = -dir;
+ }
+ speed += 0.3;
+ }
+ PlaySEEx( seShot2 );
+ Wait( [ 5, 4, 3, 2 ][ Level ] );
+ angle += [ 5, 7 ][ Level == 3 ] * [ 1, -1 ][ pattern % 2 ];
+ }
+ ExMove( false, count );
+ }
+ }
+ }
+ @Initialize{
+ SetLife( 400 );
+ SetScore( 360000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 18, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "BGStep", 4 );
+ SetCommonData( "ShowName", 1 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 0, imgCutInAlice, 192, 320 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 20 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 0 + Level );
+ EndSpell();
+ DropItem( 8, 64 );
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyAlice, 1, 1, 45, 80, count ); }
+ @BackGround{ AliceBG( imgSpellAlice, imgSpellBigCircle, count ); }
+}
diff --git a/th_dnh/script/thA/Alice2.dnh b/th_dnh/script/thA/Alice2.dnh
new file mode 100644
index 0000000..5f63553
--- /dev/null
+++ b/th_dnh/script/thA/Alice2.dnh
@@ -0,0 +1,94 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let uniquestr = "G_ALICE2";
+ task Behavior(){
+ SetShotDirectionType( ABSOLUTE );
+ yield;
+ CreateShadowInterface( uniquestr );
+ let pattern = 0;
+ while( 1 ){
+ Wait( 80 );
+ ascent( let i in [ 0, 1 ][ Level == 0 ]..3 ){
+ let space = 120 - i * 20;
+ let angle = -space / 2;
+ while( angle <= space / 2 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), [ 2.4, 2 ][ i % 2 ], angle + GetAngleToPlayer(), pattern + i );
+ angle += space;
+ }
+ }
+ PlaySEEx( seShadow );
+ Wait( 150 );
+ CreateShot02( GetX(), GetY(), 11, GetAngleToPlayer(), -0.6, 0.8, WHITE02, 20 );
+ PlaySEEx( seShot2 );
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2000 );
+ SetTimer( 55 );
+ SetInvincibility( 30 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, [ -1, 16 ][ count > 30 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 20 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{ DrawBossChr( imgEnemyAlice, 1, 1, 45, 80, count ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_ALICE2";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let Argv = GetArgument();
+ task Behavior(){
+ SetShotDirectionType( ABSOLUTE );
+ while( GetSpeed() > 0 ){
+ SetSpeed( GetSpeed() - 0.02 );
+ yield;
+ }
+ let color = [ PURPLE01, BLUE01, AQUA01, GREEN01, YELLOW01, ORANGE01, RED01 ][ Argv % 7 ];
+ SetAngle( rand( 0, 360 ) );
+ loop{
+ if( count % [ 12, 10, 8, 5 ][ Level ] == 0 ){
+ loop( Max( Level, 1 ) ){
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, 5, GetAngle() + 180 + RandBlur( 2 ), 0, -0.2, 0, color );
+ SetShotDataA( 0, 30, NULL, rand( 0, 360 ), 0, ( Level + 1 ) * 0.004, ( Level + 1 ) * 0.4, color );
+ FireShot( 0 );
+ }
+ PlaySEEx( seShot1 );
+ }
+ SetSpeed( Min( GetSpeed() + 0.03, 3 ) );
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 190 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, true );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleRed, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Alice2S.dnh b/th_dnh/script/thA/Alice2S.dnh
new file mode 100644
index 0000000..9995c6a
--- /dev/null
+++ b/th_dnh/script/thA/Alice2S.dnh
@@ -0,0 +1,117 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let uniquestr = "G_ALICE2S";
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let pattern = 0;
+ while( 1 ){
+ SetShotDirectionType( PLAYER );
+ Concentration01( 120 );
+ PlaySEEx( sePower1 );
+ Wait( 120 );
+ let angle = 0;
+ while( angle < 360 ){
+ if( pattern % 2 == 0 || Level == 3 ){ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, angle, 0 ); }
+ if( pattern % 2 == 1 || Level == 3 ){ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, angle, 1 ); }
+ angle += [ 180, 120 ][ trunc( Level / 2 ) ];
+ }
+ PlaySEEx( seShadow );
+ loop( 3 ){
+ if( GetLife() <= 0 ){ return; }
+ Wait( 90 );
+ ExMove( false, count );
+ Wait( 90 );
+ SetShotDirectionType( PLAYER );
+ let speed = 0.6;
+ loop( [ 0, 1, 2, 2 ][ Level ] ){
+ WayShot01( 12, [ 6, 4 ][ trunc( Level / 2 ) ], speed, WHITE04, 10 );
+ speed += 0.4
+ }
+ }
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 365 );
+ SetScore( 675000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 13, 7 );
+ SetEffectForZeroLife( [ 60, 1 ][ GetCommonDataDefault( "SpellPractice", false ) ], 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetCommonData( "ShowName", 1 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 1, imgCutInAlice, 192, 320 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ if( GetLife() <= 0 ){
+ SetCommonData( uniquestr, 0 );
+ if( count % 15 == 0 ){ PlaySEEx( seShot1 ); }
+ }
+ else{ yield; }
+ TaskShadowInterface( uniquestr, [ -1, 5 ][ count > 130 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 20 );
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 4 + Level );
+ EndSpell();
+ SetCommonData( "ShowName", -1 );
+ ReleaseShadowInterface( uniquestr );
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyAlice, 1, 1, 45, 80, count ); }
+ @BackGround{ AliceBG( imgSpellAlice, imgSpellBigCircle, count ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_ALICE2S";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let ParentX = GetCommonData( uniquecode ~ "X" );
+ let ParentY = GetCommonData( uniquecode ~ "Y" );
+ let NowAngle = GetAngle();
+ let Argv = GetArgument();
+ task Behavior(){
+ Wait( 20 );
+ SetShotDirectionType( ABSOLUTE );
+ loop( 15 ){
+ loop( 6 ){
+ let speed = 1.2;
+ loop( [ 1, 2, 2, 2 ][ Level ] ){
+ WayShotGap01( 30, 60, speed, [ BLUE21, RED21 ][ Argv ], 5, NowAngle + 180 );
+ speed += 0.8;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 5 );
+ }
+ Wait( 5 );
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 950 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ MoveRotate( [ 2.5, 1 ][ trunc( Level / 2 ) ], Min( count, 80 ), count, uniquecode );
+ NowAngle = atan2( GetY() - GetCommonData( uniquecode ~ "Y" ), GetX() - GetCommonData( uniquecode ~ "X" ) ) + 90 * [ -1, 1 ][ Argv ];
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, true );
+ yield;
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleRed, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/AliceE.dnh b/th_dnh/script/thA/AliceE.dnh
new file mode 100644
index 0000000..0d38828
--- /dev/null
+++ b/th_dnh/script/thA/AliceE.dnh
@@ -0,0 +1,59 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ PlaySEEx( seBossExplode );
+ CreateEventFromScript( "Talk" );
+ while( GetEventStep() != 1 ){ yield; }
+ SetCommonData( "Result", true );
+ let clear = 10000000;
+ let point = GetPoint() * 50000;
+ let graze = GetGraze() * 500;
+ let rank = [ 50, 100, 120, 150 ][ GetCommonDataDefault( "Level", 1 ) ];
+ let total = ( clear + point + graze ) * ( rank / 100 );
+ SetCommonData( "ResultClear", clear );
+ SetCommonData( "ResultPoint", point );
+ SetCommonData( "ResultGraze", graze );
+ SetCommonData( "ResultRank", rank );
+ SetCommonData( "ResultTotal", total );
+ AddScore( total );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetX( -128 );
+ SetY( -128 );
+ LoadSE( seBossExplode );
+ ForbidBomb( true );
+ ForbidShot( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( !OnEvent() ){ VanishEnemy(); }
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]あぁ、そういえば\nどれだけ腰が痛いか聞き忘れてたわ。" );
+ SetStep( 1 );
+ TextOut( "\c[BLUE]とりあえず思いきり痛めつけちゃったけど\n腰痛はもう治ったのかしら" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa2 );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]なんだよ、妖怪は腰痛だけでも\n弾幕ごっこ出来なくなるのか?" );
+ SetStep( 1 );
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]じゃあ高山茶でも摘んでから\n神社でも寄っていくかな" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/BGM/index.dnh b/th_dnh/script/thA/BGM/index.dnh
new file mode 100644
index 0000000..356d589
--- /dev/null
+++ b/th_dnh/script/thA/BGM/index.dnh
@@ -0,0 +1,21 @@
+let bgmList = [
+ GetCurrentScriptDirectory() ~ "BGM\Mute.wav",
+ GetCurrentScriptDirectory() ~ "BGM\thA01.wav", // Title
+ GetCurrentScriptDirectory() ~ "BGM\thA02.wav", // Stage1
+ GetCurrentScriptDirectory() ~ "BGM\thA03.wav", // Boss
+ GetCurrentScriptDirectory() ~ "BGM\thA04.wav", // Stage2
+ GetCurrentScriptDirectory() ~ "BGM\thA05.wav", // Boss
+ GetCurrentScriptDirectory() ~ "BGM\thA06.wav", // Stage3
+ GetCurrentScriptDirectory() ~ "BGM\thA07.wav", // Boss
+ GetCurrentScriptDirectory() ~ "BGM\thA08.wav", // Stage4
+ GetCurrentScriptDirectory() ~ "BGM\thA09.wav", // Boss
+ GetCurrentScriptDirectory() ~ "BGM\thA10.wav", // Stage5
+ GetCurrentScriptDirectory() ~ "BGM\thA11.wav", // Boss
+ GetCurrentScriptDirectory() ~ "BGM\thA12.wav", // Stage6
+ GetCurrentScriptDirectory() ~ "BGM\thA13.wav", // Boss
+ GetCurrentScriptDirectory() ~ "BGM\thA14.wav", // BossLS
+ GetCurrentScriptDirectory() ~ "BGM\thA15.wav", // StageE
+ GetCurrentScriptDirectory() ~ "BGM\thA16.wav", // Boss
+ GetCurrentScriptDirectory() ~ "BGM\thA17.wav", // ED
+ GetCurrentScriptDirectory() ~ "BGM\thA18.wav", // StaffRoll
+];
diff --git a/th_dnh/script/thA/BGM/mute.wav b/th_dnh/script/thA/BGM/mute.wav
new file mode 100644
index 0000000..510e40b
--- /dev/null
+++ b/th_dnh/script/thA/BGM/mute.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:53b7c73052814a3e08fd6064a4008e822d9b35cdc629b0fee6623d7de8d9d6d7
+size 30129
diff --git a/th_dnh/script/thA/BGM/thA01.wav b/th_dnh/script/thA/BGM/thA01.wav
new file mode 100644
index 0000000..8cf1c22
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA01.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:405e21bd382ed692119a5bd2686cb3d7284efd7aa92401879084b387c1e69342
+size 6084596
diff --git a/th_dnh/script/thA/BGM/thA02.wav b/th_dnh/script/thA/BGM/thA02.wav
new file mode 100644
index 0000000..8ce0d0e
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA02.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f0e4406959f6f0df567fa0c451db2eaebfb167e4cd34477365a11a5d12f12b1d
+size 7920687
diff --git a/th_dnh/script/thA/BGM/thA03.wav b/th_dnh/script/thA/BGM/thA03.wav
new file mode 100644
index 0000000..1168ec5
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA03.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:764f02166e6454de7a6fe0ba9de39f174d621050860bde59a64aceeb1790aa8a
+size 8389396
diff --git a/th_dnh/script/thA/BGM/thA04.wav b/th_dnh/script/thA/BGM/thA04.wav
new file mode 100644
index 0000000..0772251
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA04.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf594a8bcd150c29094c8019e5f5d61e434fd56bfe2f83c0ff2d96f116a189d6
+size 8683362
diff --git a/th_dnh/script/thA/BGM/thA05.wav b/th_dnh/script/thA/BGM/thA05.wav
new file mode 100644
index 0000000..8039cf4
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA05.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:29816d1b4967472334998e9f7effe217007bb0c8ff191ef435e92e18dbf93c20
+size 8875819
diff --git a/th_dnh/script/thA/BGM/thA06.wav b/th_dnh/script/thA/BGM/thA06.wav
new file mode 100644
index 0000000..8e5f583
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA06.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:82570d5c9c00984c576bc1f4e10dfb116363eb7144350e3c181f71d31402c47e
+size 6807249
diff --git a/th_dnh/script/thA/BGM/thA07.wav b/th_dnh/script/thA/BGM/thA07.wav
new file mode 100644
index 0000000..40fc6b8
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA07.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:997a23113161f2867e629bb8d0aea1d934086ac0f475deb3046769c42d849e8c
+size 10861558
diff --git a/th_dnh/script/thA/BGM/thA08.wav b/th_dnh/script/thA/BGM/thA08.wav
new file mode 100644
index 0000000..94888fa
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA08.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1cd29b485b3d59ffdd1365f3d9b4bd3f25dfd78b0dace5444e1b839a47fb6f20
+size 10538998
diff --git a/th_dnh/script/thA/BGM/thA09.wav b/th_dnh/script/thA/BGM/thA09.wav
new file mode 100644
index 0000000..c61f812
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA09.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9be022ae7aaafec46a4e3b8ca574e0bd7e00cb1fe1a991c00c0a6f68d9e7717e
+size 15425671
diff --git a/th_dnh/script/thA/BGM/thA10.wav b/th_dnh/script/thA/BGM/thA10.wav
new file mode 100644
index 0000000..5a5e4a8
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA10.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4efc3beb49c219802b19ab7f1b89f04ffa0ca06964be535b991d247a96464257
+size 11221419
diff --git a/th_dnh/script/thA/BGM/thA11.wav b/th_dnh/script/thA/BGM/thA11.wav
new file mode 100644
index 0000000..633de4d
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA11.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9fdf71649403c657b36ba49f4900c3e8447598477266e7854f358018be1ec750
+size 15582198
diff --git a/th_dnh/script/thA/BGM/thA12.wav b/th_dnh/script/thA/BGM/thA12.wav
new file mode 100644
index 0000000..253a884
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA12.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ad53282e64a1f3e51a48473d8cfd192608f0553343d350aba11e5816c8c7de5
+size 13255583
diff --git a/th_dnh/script/thA/BGM/thA13.wav b/th_dnh/script/thA/BGM/thA13.wav
new file mode 100644
index 0000000..0236732
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA13.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9c7cedc4cc140ad5c136bbaf4aba5d9d46f6efb53d1132d557c26f189b5625e4
+size 25081991
diff --git a/th_dnh/script/thA/BGM/thA14.wav b/th_dnh/script/thA/BGM/thA14.wav
new file mode 100644
index 0000000..15a7c73
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA14.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fdc796bd143968c26653e4e0a50d64c94eafa9cbe3c8f7ec639513cb3ce21ad4
+size 7273899
diff --git a/th_dnh/script/thA/BGM/thA15.wav b/th_dnh/script/thA/BGM/thA15.wav
new file mode 100644
index 0000000..f9c7d4a
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA15.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5fa23cf73cc751b98da20feea9dc68f9edc25f511bb567e9dfda69d143b3f282
+size 17439495
diff --git a/th_dnh/script/thA/BGM/thA16.wav b/th_dnh/script/thA/BGM/thA16.wav
new file mode 100644
index 0000000..f5c037b
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA16.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4ff298d8a6007c5703e114c91057e46241b2287f6252095384494f91f186259
+size 37161622
diff --git a/th_dnh/script/thA/BGM/thA17.wav b/th_dnh/script/thA/BGM/thA17.wav
new file mode 100644
index 0000000..d1e2ff4
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA17.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0f62f4556cf267ca4fb5f9a544f557c9ebe4a61fde2c1de4908973e2f343c71d
+size 14225398
diff --git a/th_dnh/script/thA/BGM/thA18.wav b/th_dnh/script/thA/BGM/thA18.wav
new file mode 100644
index 0000000..a071640
--- /dev/null
+++ b/th_dnh/script/thA/BGM/thA18.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:258021892820c4a48ae5cb045a281c2e531b5d6620f4ce356014d18c2cfe59f8
+size 5881259
diff --git a/th_dnh/script/thA/Blur.dnh b/th_dnh/script/thA/Blur.dnh
new file mode 100644
index 0000000..9a1b058
--- /dev/null
+++ b/th_dnh/script/thA/Blur.dnh
@@ -0,0 +1,10 @@
+script_enemy_main{
+ let count = 0;
+ let Argv = GetArgument();
+ @Initialize{ SetLife( 1 ); }
+ @MainLoop{
+ MotionBlurEx( ALL, Argv, 240, ALPHA );
+ if( count > Argv ){ VanishEnemy(); }
+ count++;
+ }
+}
diff --git a/th_dnh/script/thA/CavedA.dnh b/th_dnh/script/thA/CavedA.dnh
new file mode 100644
index 0000000..bf32477
--- /dev/null
+++ b/th_dnh/script/thA/CavedA.dnh
@@ -0,0 +1,20 @@
+#ScriptPathData
+#ScriptPath[.\CavedA0.dnh]
+#ScriptPath[.\CavedA1.dnh]
+#ScriptPath[.\CavedA1S.dnh]
+#ScriptNextStep
+#ScriptPath[.\CavedA_.dnh]
+#ScriptPath[.\CavedA2.dnh]
+#ScriptPath[.\CavedA2S.dnh]
+#ScriptNextStep
+#ScriptPath[.\CavedA_.dnh]
+#ScriptPath[.\CavedA3.dnh]
+#ScriptPath[.\CavedA3S.dnh]
+#ScriptNextStep
+#ScriptPath[.\CavedA_.dnh]
+#ScriptPath[.\CavedA4.dnh]
+#ScriptPath[.\CavedA4S.dnh]
+#ScriptNextStep
+#ScriptPath[.\CavedA5_.dnh]
+#ScriptPath[.\CavedA5S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/CavedA0.dnh b/th_dnh/script/thA/CavedA0.dnh
new file mode 100644
index 0000000..0f26475
--- /dev/null
+++ b/th_dnh/script/thA/CavedA0.dnh
@@ -0,0 +1,147 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let bgm = false;
+ task Behavior(){
+ yield;
+ while( GetEventStep() != 1 ){ yield; }
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ while( GetEventStep() != 2 ){ yield; }
+ SetCommonData( "ShowName", 8 );
+ while( GetEventStep() != 3 ){ yield; }
+ PlayMusicEx( 13 );
+ Wait( 30 );
+ bgm = true;
+ }
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ SetX( GetCenterX() );
+ SetY( -128 );
+ CreateEventFromScript( "Talk" );
+ Behavior();
+ }
+ @MainLoop{
+ if( !OnEvent() && bgm ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 24, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]さぁ、出てきなさい。" );
+ TextOut( "\c[BLUE]警備やってる人間とやらは死んだわ。\nこの魔方陣を壊されちゃ困るでしょ?" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]流石にこの術に\n人間を巻き込むのは無理があったか" );
+ SetStep( 1 );
+ Wait( 100 );
+ SetChar( RIGHT, imgCutInKene );
+ SetGraphicRect( RIGHT, 1, 1, 192, 344 );
+ Enemy();
+ SetNameFromTexture( RIGHT, imgNameKene );
+ SetStep( 2 );
+ TextOut( "\c[RED]出てきたぞ。\n何の用だ、いつぞやの紅白よ" );
+ Player();
+ TextOut( "\c[BLUE]冷気の出しすぎで、困る" );
+ Enemy();
+ TextOut( "\c[RED]安心しろ、もうあとわずかで完成する" );
+ Player();
+ DeleteName( RIGHT );
+ SetChar( LEFT, imgCutInReimu5 );
+ TextOut( "\c[BLUE]一体全体何をたくらんでいるのかしら?" );
+ Enemy();
+ TextOut( "\c[RED]この術が完成すれば時は全て停止し、\nそして逆流を始める" );
+ TextOut( "\c[RED]その時の逆流は、\n百年余の歴史をなかったことにし" );
+ TextOut( "\c[RED]幻想郷が隔離される前の時代に戻った時\n再び何事もなかったかのように流れ出す" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]今日の歴史食いはかなりオオゴトね\nそんなことをして何のためになるの?" );
+ Enemy();
+ TextOut( "\c[RED]外界の人間はもはや幻想郷どころか\n天地全てを滅ぼす程の武器を持っている" );
+ TextOut( "\c[RED]あれにはもう手の施しようが無い・・・\nだから過去に戻し全てをやり直すのだ" );
+ Player();
+ TextOut( "\c[BLUE]そう、そして今あるものは\n全て消え去るのね" );
+ Enemy();
+ TextOut( "\c[RED]幻想郷の未来のためには\nやむをえない犠牲だ" );
+ Player();
+ TextOut( "\c[BLUE]私はそんな完璧な世界の\n幻想郷なんて幻想郷とは呼べないわ" );
+ TextOut( "\c[BLUE]それに幻想郷が外界に干渉してはならない\nそれが暗黙の了解じゃないのかしら?" );
+ Enemy();
+ SetStep( 3 );
+ TextOut( "\c[RED]五月蝿い、お前に外界の兵器の\n恐ろしさが分かるものか" );
+ Player();
+ TextOut( "\c[BLUE]幻想郷を今滅ぼそうとしているのは\n外界の人間じゃない、あんただ!" );
+ MoveChar( LEFT, FRONT );
+ MoveChar( RIGHT, FRONT );
+ TextOut( "\c[BLUE]幻想郷の明日は今一度やり直される!\n\c[RED]幻想郷の明日は戻りも進みもしない!" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]あー、こいつかな・・・\n件の幻想郷を氷付けにする魔方陣か" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]それに触るな!" );
+ SetStep( 1 );
+ Wait( 100 );
+ SetChar( RIGHT, imgCutInKene );
+ SetGraphicRect( RIGHT, 1, 1, 192, 344 );
+ Enemy();
+ SetNameFromTexture( RIGHT, imgNameKene );
+ SetStep( 2 );
+ TextOut( "\c[RED]まったく、\nあの警備はなにやってるんだ" );
+ Player();
+ TextOut( "\c[BLUE]さっき殺してきたぜ" );
+ Enemy();
+ TextOut( "\c[RED]ただでさえ少ない人間だ\nあまりむやみに減らすな" );
+ Player();
+ DeleteName( RIGHT );
+ TextOut( "\c[BLUE]んで、お前のその術のせいで\n向こうの山が凍りついて" );
+ SetChar( LEFT, imgCutInMarisa3 );
+ TextOut( "\c[BLUE]高山茶が採れなくなってしまったんだが\nその責任はどう取ってもらおうか" );
+ Enemy();
+ TextOut( "\c[RED]安心しろ、もうあと僅かで終わる" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]氷付けにして幻想郷丸ごと\nコレクションにするんだな?" );
+ Enemy();
+ TextOut( "\c[RED]違う。この術が完成すれば\n時は止まり、逆流を始める" );
+ TextOut( "\c[RED]その時の逆流は、\n百年余の歴史をなかったことにし" );
+ TextOut( "\c[RED]幻想郷が隔離される前の時代に戻った時\n再び何事もなかったかのように流れ出す" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa4 );
+ TextOut( "\c[BLUE]今日はかなり大食いなんだな\n太るぜ" );
+ Enemy();
+ TextOut( "\c[RED]太りすぎたのは外界の人間だ" );
+ TextOut( "\c[RED]外界の人間はもはや幻想郷どころか\n天地全てを滅ぼす程の武器を持っている" );
+ TextOut( "\c[RED]あそこまで太ってしまうと\nもう手の施しようが無い" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]で、過去に戻ってやり直す\n・・・ということか?" );
+ TextOut( "\c[BLUE]過去の過ちを正し完璧な世界を\n創造したとして、その世界の何が楽しい?" );
+ Enemy();
+ SetStep( 3 );
+ TextOut( "\c[RED]五月蝿い、お前に外界の兵器の\n恐ろしさが分かるものか" );
+ Player();
+ TextOut( "\c[BLUE]私にはお前がこれからやることの方が\n余程恐ろしく感じるぜ" );
+ MoveChar( LEFT, FRONT );
+ MoveChar( RIGHT, FRONT );
+ TextOut( "\c[BLUE]幻想郷の明日は今一度やり直される!\n\c[RED]幻想郷の明日は降水確率ゼロ%だぜ!" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/CavedA1.dnh b/th_dnh/script/thA/CavedA1.dnh
new file mode 100644
index 0000000..53e08a7
--- /dev/null
+++ b/th_dnh/script/thA/CavedA1.dnh
@@ -0,0 +1,91 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 3 );
+ let uniquestr = "G_CAVEDA1";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ PlaySEEx( sePower1 );
+ Concentration01( 90 );
+ Wait( 90 );
+ ascent( let i in 0..2 + trunc( Level / 2 ) ){
+ Wait( 10 );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, angle, i );
+ angle += 60;
+ }
+ PlaySEEx( seShadow );
+ }
+ loop{
+ Wait( 360 );
+ ExMove( false, count );
+ }
+ }
+ @Initialize{
+ SetLife( 2600 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 6 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, [ -1, 50 ][ count > 300 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_CAVEDA1";
+ let Level = GetCommonDataDefault( "Level", 3 );
+ let Argv = GetArgument() + 1;
+ let PrevLife;
+ task Behavior(){
+ Wait( Argv * 5 + 60 );
+ loop{
+ ascent( let i in 0..Max( Level + 1 - Argv, 1 ) ){
+ CircleShotGap01(
+ 120,
+ Smooth( 0.4, [ 1.2, 1.4, 1.5, 1.8 ][ Level ], count, 180 ) + i / 3,
+ [ BLUE04, PURPLE04, RED04, ORANGE04, YELLOW04 ][ ( Argv - 1 ) % 5 ],
+ 10,
+ [ count * GetDir( GetX() - GetCommonData( uniquecode ~ "X" ) ), 0 ][ count < 240 ] + 90
+ );
+ }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ }
+ @Initialize{
+ SetLife( 2000 );
+ SetDamageRate( 100, 10 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( 0, Argv * 48, count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, true );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleRed, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/CavedA1S.dnh b/th_dnh/script/thA/CavedA1S.dnh
new file mode 100644
index 0000000..d44179e
--- /dev/null
+++ b/th_dnh/script/thA/CavedA1S.dnh
@@ -0,0 +1,89 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 60 );
+ let pattern = 0;
+ loop{
+ PlaySEEx( sePower1 );
+ Concentration01( 60 );
+ Wait( 60 );
+ SetShotDirectionType( ABSOLUTE );
+ let pangle = GetAngleToPlayer();
+ let space = [ 20, 12, 10, 10 ][ Level ];
+ ascent( let i in 0..2 ){
+ PlaySEEx( seLaser1 );
+ let angle = 0;
+ while( angle < 360 ){
+ let finalangle = angle * [ 1, -1 ][ i ] + pangle + truncEx( 180, space ) + ( space / 2 ) * i;
+ CreateLaserA( 0,GetX(), GetY(), 512, 16, [ BLUE21, RED21 ][ i ], 100 );
+ SetLaserDataA( 0, 0, finalangle, 0, 0, 0, 0 );
+ SetShotKillTime( 0, 300 - ( 40 - Level * 10 ) );
+ let dir = -1;
+ loop( 2 ){
+ CreateLaserA( 1, 0, 0, 448, 12, [ BLUE21, RED21 ][ i ], 60 );
+ SetLaserDataA( 1, 0, finalangle + [ 45, 90, 90, 60 ][ Level ] * dir, 0, 0, 0, 0 );
+ SetShotKillTime( 1, 240 - ( 40 - Level * 10 ) );
+ AddShot( 45, 0, 1, 32 );
+ dir = -dir;
+ }
+ FireShot( 0 );
+ yield;
+ angle += space;
+ }
+ }
+ PlaySEEx( seLaser1 );
+ local{
+ let dstx = GetX();
+ let dsty = GetY();
+ let len = 40;
+ dstx = dstx + len * [ -1, 1 ][ GetPlayerX() - GetX() > 0 ];
+ if( GetPlayerY() > GetCenterY() ){ dsty += 32 * [ -1, 1 ][ rand_int( 0, 1 ) ]; }
+ else{ dsty = dsty + len * [ -1, 1 ][ GetPlayerY() - GetY() > 0 ]; }
+ if( dstx < GetClipMinX() + 104 ){ dstx += 64; }
+ else if( dstx > GetClipMaxX() - 104 ){ dstx -= 64; }
+ if( dsty < GetClipMinY() + 16 ){ dsty += 64; }
+ else if( dsty > GetCenterY() - 112 ){ dsty -= 64; }
+ SetMovePosition03( dstx, dsty, 20, 1.6 );
+ }
+ Wait( [ [ 10, 0 ][ Level == 3 ], [ 70, 55 ][ Level == 3 ] ][ pattern < 3 ] );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 555 );
+ SetScore( 3650000 );
+ SetTimer( 70 );
+ SetInvincibility( 130 );
+ SetDamageRate( 16, 2 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 8 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 21, imgCutInKene, 192, 344 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 21 * 4 + Level );
+ EndSpell();
+ DropItem( 20, 64 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+ @BackGround{ KeneBG( imgSpellStar, imgSpellWheel, imgSpellKene, ALPHA, count ); }
+}
diff --git a/th_dnh/script/thA/CavedA2.dnh b/th_dnh/script/thA/CavedA2.dnh
new file mode 100644
index 0000000..7904980
--- /dev/null
+++ b/th_dnh/script/thA/CavedA2.dnh
@@ -0,0 +1,112 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 3 );
+ let uniquestr = "G_CAVEDA2";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let dir = -1;
+ loop( 2 ){
+ CreateEnemyFromScript( "Obj", GetX(), GetY(), 0, 0, dir );
+ dir = -dir;
+ }
+ Wait( 10 );
+ let pattern = 0;
+ loop{
+ let angle = 0;
+ while( angle <= 180 ){
+ ascent( let i in 0..2 ){ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, [ angle + 180, 360 - angle ][ i ], [ 1, -1 ][ i ] ); }
+ PlaySEEx( seShadow );
+ Wait( 16 );
+ angle += [ 60, 36, 30, 45 ][ Level ];
+ }
+ Wait( 96 );
+ SetShotDirectionType( PLAYER );
+ CircleShot01( [ [ 60, 36, 24, 20 ][ Level ], [ 30, 24, 15, 12 ][ Level ] ][ pattern % 4 == 0 ], 0.8, RED03, 30 );
+ PlaySEEx( seShot3 );
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 6000 );
+ SetTimer( 80 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 4 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ SetShotAutoDeleteClip( 64, 64, 64, 64 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, [ -1, 10 ][ count > 130 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{
+ SetGraphicRect( 0, 0, 256, 256 );
+ SetAlpha( Smooth( 255, 192, count, 200 ) );
+ SetGraphicScale( Accelerate( 2, 1, count, 60 ), Accelerate( 0, 1, count, 60 ) );
+ DrawChr( imgEnemyPhoenix[ count % 10 ], count );
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_CAVEDA2";
+ let Level = GetCommonDataDefault( "Level", 3 );
+ let Argv = GetArgument();
+ let PrevLife;
+ let RotateSpeed = 2 * GetDir( Argv );
+ task Behavior(){
+ Wait( 30 );
+ loop( 8 ){
+ SetShotDirectionType( ABSOLUTE );
+ SetShotColor( 255, 192, 192 );
+ ascent( let speed in 1..[ 2, 3 ][ Level == 3 ] ){ CircleShotGap01( 180, speed / 2, RED04, 20, count * RotateSpeed ); }
+ SetShotColor( 255, 255, 255 );
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 200 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count * 2, 160 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
+script_enemy Obj{
+ let Argv = GetArgument();
+ let uniquestr = "G_CAVEDA2";
+ @Initialize{
+ SetDamageRateEx( 100, 100, 10, 5 );
+ SetLife( 32767 );
+ }
+ @MainLoop{
+ SetX( GetCommonData( uniquestr ~ "X" ) + 128 * Argv );
+ SetY( GetCommonData( uniquestr ~ "Y" ) - 144 );
+ SetCollisionA( GetX(), GetY(), 96 );
+ }
+}
diff --git a/th_dnh/script/thA/CavedA2S.dnh b/th_dnh/script/thA/CavedA2S.dnh
new file mode 100644
index 0000000..b8b0e3d
--- /dev/null
+++ b/th_dnh/script/thA/CavedA2S.dnh
@@ -0,0 +1,175 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_CAVEDA2S";
+ let PrevTime = GetTimer();
+ let AngleTable = [ 0, 0, 5, 10, 120, 130, 135, 170, 180, 190, 225, 230, 240, 350, 355 ];
+ let StartTable = [ 0, 5, 3, 2, 0, 3, 6, 0, 1, 0, 6, 3, 0, 2, 3 ];
+ let LengthTable = [ 6, 2, 1, 1, 5, 5, 2, 3, 3, 3, 2, 5, 5, 1, 1 ];
+ let MaxSpeed = 3.5;
+ let AddSpeed = 0.03;
+ let Delay = 50;
+ let CircleSpace = [ 15, 12, 10, 8 ][ Level ];
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let dir = -1;
+ loop( 2 ){
+ CreateEnemyFromScript( "Obj", GetX(), GetY(), 0, 0, dir );
+ dir = -dir;
+ }
+ let pattern = 0;
+ loop{
+ Concentration01( 120 );
+ PlaySEEx( sePower1 );
+ Wait( 120 );
+ alternative( pattern % 6 )
+ case( 0 ){
+ Phoenix( GetAngleToPlayer() );
+ CircleShotGap01( CircleSpace, 1.8, RED01, Delay, GetAngleToPlayer() );
+ PlaySEEx( seShot1 );
+ }
+ case( 1 ){
+ let pangle = GetAngleToPlayer();
+ let angle = 36 - Level * 5;
+ while( angle <= 135 ){
+ let dir = -1;
+ loop( 2 ){
+ Phoenix( pangle + angle * dir );
+ dir = -dir;
+ }
+ CircleShotGap01( CircleSpace, 1.8, RED01, Delay, pangle + angle );
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ angle += 15;
+ }
+ }
+ case( 2, 4 ){
+ ascent( let i in 0..8 ){
+ Phoenix( GetAngleToPlayer() );
+ if( i == 7 ){
+ let dir = -1;
+ loop( [ 2, 1 ][ Level == 0 ] ){
+ Phoenix( GetAngleToPlayer() + [ 0, 10, 15, 18 ][ Level ] * dir );
+ dir = -dir;
+ }
+ }
+ CircleShotGap01( CircleSpace, 1.8, RED01, Delay, GetAngleToPlayer() + [ 0, 5 ][ i % 2 ] );
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ }
+ case( 3, 5 ){
+ let pangle = GetAngleToPlayer();
+ let limit = [ 150, 125, 140, 122.5 ][ Level ];
+ let space = [ 60, 50, 40, 35 ][ Level ];
+ let w = [ 30, 20 ][ trunc( Level / 2 ) ];
+ let angle = -limit;
+ while( angle <= limit ){
+ Phoenix( pangle + angle * [ -1, 1 ][ pattern == 3 ] );
+ CircleShotGap01( CircleSpace, 1.8, RED01, Delay, pangle + angle * [ -1, 1 ][ pattern == 3 ] );
+ PlaySEEx( seShot1 );
+ Wait( w );
+ angle += space;
+ }
+ }
+ ExMoveUnderBorder( false, 128 );
+ pattern++;
+ }
+ }
+ task Cluster( let x, let y, let angle ){
+ let obj = SetHiddenObject( x, y, 64, rand( 0, 360 ), 0, true, false );
+ yield;
+ CreateShotA( 0, Obj_GetX( obj ), Obj_GetY( obj ), Delay );
+ SetShotDataA( 0, 0, 0, angle, 0, 0, 0, RED23 );
+ SetShotDataA( 0, 30 + Level * 10, NULL, NULL, 0, AddSpeed, MaxSpeed, RED23 );
+ FireShot( 0 );
+ Obj_Delete( obj );
+ }
+ task BuckShot( let angle ){
+ let obj = SetHiddenObject( GetX(), GetY(), 0, angle, Delay + 50, true, true );
+ let count = 0;
+ while( !Obj_BeDeleted( obj ) ){
+ let speed = Obj_GetSpeed( obj );
+ Obj_SetSpeed( obj, Min( speed + AddSpeed, MaxSpeed ) );
+ if( speed > 1 && count % ( 2 + Level ) == 0 ){ Cluster( Obj_GetX( obj ), Obj_GetY( obj ), angle ) };
+ yield;
+ count++;
+ }
+ }
+ task PBody( let angle, let start, let len, let gap, let color ){
+ let obj = SetHiddenObject( GetX(), GetY(), 16, angle + gap, 0, false, true );
+ let count = 0;
+ loop( start ){
+ count++;
+ yield;
+ }
+ loop( len ){
+ CreateShot02( Obj_GetX( obj ), Obj_GetY( obj ), 0, angle, AddSpeed, MaxSpeed, color, Delay - count );
+ count++;
+ yield;
+ }
+ Obj_Delete( obj );
+ }
+ function Phoenix( let angle ){
+ BuckShot( angle );
+ CreateShot02( GetX(), GetY(), 0, angle, AddSpeed, MaxSpeed, RED03, Delay );
+ ascent( let i in 0..length( AngleTable ) ){ PBody( angle, StartTable[ i ], LengthTable[ i ], AngleTable[ i ], [ RED22, RED32 ][ i == 1 ] ); }
+ }
+ @Initialize{
+ SetLife( 1100 );
+ SetScore( 3650000 );
+ SetTimer( 90 );
+ SetInvincibility( 130 );
+ SetDamageRate( 30, 6 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 8 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 22, imgCutInKene, 192, 344 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, -1 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ CreateSpellResult( 22 * 4 + Level );
+ EndSpell();
+ DropItem( 20, 64 );
+ }
+ @DrawLoop{
+ SetGraphicRect( 0, 0, 256, 256 );
+ SetAlpha( Smooth( 255, 192, count, 200 ) );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ SetGraphicScale( Accelerate( 2, 1, count, 60 ), Accelerate( 0, 1, count, 60 ) ); }
+ DrawChr( imgEnemyPhoenix[ count % 10 ], count );
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+ @BackGround{ KeneBG( imgSpellStar, imgSpellWheel, imgSpellKene, ALPHA, count ); }
+}
+script_enemy Obj{
+ let Argv = GetArgument();
+ let uniquestr = "G_CAVEDA2S";
+ @Initialize{
+ SetDamageRateEx( 100, 100, 5, 2 );
+ SetLife( 32767 );
+ }
+ @MainLoop{
+ SetX( GetCommonData( uniquestr ~ "X" ) + 128 * Argv );
+ SetY( GetCommonData( uniquestr ~ "Y" ) - 144 );
+ SetCollisionA( GetX(), GetY(), 96 );
+ }
+}
diff --git a/th_dnh/script/thA/CavedA3.dnh b/th_dnh/script/thA/CavedA3.dnh
new file mode 100644
index 0000000..c216e98
--- /dev/null
+++ b/th_dnh/script/thA/CavedA3.dnh
@@ -0,0 +1,124 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_CAVEDA3";
+ let PrevTime = GetTimer();
+ task Bloom( let finalangle ){
+ let width = 32;
+ let len = 256;
+ let obj = Obj_Create( OBJ_LASER );
+ Obj_SetX( obj, GetX() );
+ Obj_SetY( obj, GetY() );
+ Obj_SetAngle( obj, -90 );
+ ObjShot_SetDelay( obj, 100 );
+ ObjShot_SetBombResist( obj, true );
+ ObjShot_SetGraphic( obj, PURPLE01 );
+ ObjLaser_SetLength( obj, len );
+ ObjLaser_SetWidth( obj, width );
+ Wait( 60 );
+ let count = 0;
+ loop( 100 ){
+ Obj_SetAngle( obj, SlowDown( -90, -90 + finalangle, count, 100 ) );
+ count++;
+ yield;
+ }
+ CreateLaserB( 0, len, width, PURPLE01, 0 );
+ SetLaserDataB( 0, 0, 0, 0, 0, 0, 0, Obj_GetAngle( obj ), 0 );
+ let pos = 32;
+ while( pos < len ){
+ CreateShotA( 1, 0, 0, 50 );
+ SetShotDataA( 1, 0, 0, 90 - Obj_GetAngle( obj ), 0, 0.03, rand( [ 0.9, 1.1, 1.5, 2 ][ Level ], [ 1.6, 2, 2.7, 3.3 ][ Level ] ), PURPLE12 );
+ AddShot( rand( 10, 70 ), 0, 1, pos );
+ pos += [ 64, 48, 40, 32 ][ Level ];
+ }
+ SetShotKillTime( 0, 100 );
+ FireShot( 0 );
+ Obj_Delete( obj );
+ }
+ task Cherry(){
+ loop{
+ Wait( 300 );
+ let angle = 15;
+ while( angle <= 120 ){
+ let dir = -1;
+ loop( 2 ){
+ Bloom( angle * dir );
+ dir = -dir;
+ }
+ angle += 15;
+ }
+ PlaySEEx( seLaser1 );
+ Wait( 200 );
+ }
+ }
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let dir = -1;
+ loop( 2 ){
+ CreateEnemyFromScript( "Obj", GetX(), GetY(), 0, 0, dir );
+ dir = -dir;
+ }
+ SetShotDirectionType( ABSOLUTE );
+ Cherry();
+ let limit = [ 45, 30, 20, 45 ][ Level ];
+ let space = [ 45, 30, 20, 15 ][ Level ];
+ let speed = [ 1, 1, 1.2, 1.5 ][ Level ];
+ loop{
+ let x = GetX() + RandBlur( 160 );
+ let y = GetY() + RandBlur( 48 );
+ let angle = -limit;
+ while( angle <= limit ){
+ CreateShot01( x, y, speed, atan2( GetPlayerY() - y, GetPlayerX() - x ) + angle, BLUE01, 15 );
+ angle += space;
+ }
+ PlaySEEx( seShot3 );
+ Wait( 10 );
+ }
+ }
+ @Initialize{
+ SetLife( 6000 );
+ SetTimer( 80 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, -1 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{
+ SetGraphicRect( 0, 0, 512, 256 );
+ SetAlpha( Smooth( 255, 192, count, 200 ) );
+ SetGraphicScale( Accelerate( 2, 1, count, 60 ), Accelerate( 0, 1, count, 60 ) );
+ DrawChr( imgEnemySense[ count % 10 ], count );
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+}
+script_enemy Obj{
+ let Argv = GetArgument();
+ let uniquestr = "G_CAVEDA3";
+ @Initialize{
+ SetDamageRateEx( 100, 100, 10, 5 );
+ SetLife( 32767 );
+ }
+ @MainLoop{
+ SetX( GetCommonData( uniquestr ~ "X" ) + 128 * Argv );
+ SetY( GetCommonData( uniquestr ~ "Y" ) - 144 );
+ SetCollisionA( GetX(), GetY(), 96 );
+ }
+}
diff --git a/th_dnh/script/thA/CavedA3S.dnh b/th_dnh/script/thA/CavedA3S.dnh
new file mode 100644
index 0000000..efa94ec
--- /dev/null
+++ b/th_dnh/script/thA/CavedA3S.dnh
@@ -0,0 +1,118 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_CAVEDA3S";
+ let PrevTime = GetTimer();
+ task BlurShot( let pattern ){
+ let BlurTime = 80;
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateShotA( 0, GetX(), GetY(), 20 );
+ SetShotDataA( 0, 0, 2, angle + GetAngleToPlayer(), 0, 0, 2, PURPLE03 );
+ let speed = 2.5;
+ loop( 3 + Level * 2 ){
+ CreateShotA( 1, 0, 0, 0 );
+ SetShotDataA( 1, 0, 2, angle + GetAngleToPlayer(), 0, 0.1, speed, PURPLE03 );
+ AddShot( BlurTime, 0, 1, 0 );
+ speed += 0.5;
+ }
+ FireShot( 0 );
+ angle += [ [ [ 18, 15, 12, 10 ][ Level ], [ 18, 12, 10, 8 ][ Level ] ][ pattern == 0 ], [ 24, 18, 15, 12 ][ Level ], [ 30, 30, 24, 18 ][ Level ] ][ pattern % 3 ];
+ }
+ PlaySE( seShot1 );
+ Wait( BlurTime );
+ PlaySE( seKira1 );
+ }
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let dir = -1;
+ loop( 2 ){
+ CreateEnemyFromScript( "Obj", GetX(), GetY(), 0, 0, dir );
+ dir = -dir;
+ }
+ SetShotDirectionType( ABSOLUTE );
+ let anglegap = 0;
+ let pattern = 0;
+ loop{
+ BlurShot( pattern );
+ if( pattern == 0 ){ Wait( 180 ); }
+ loop( [ 30, 40, 40, 60 ][ Level ] ){
+ ascent( let angle in 0..4 ){
+ ascent( let i in 0..[ 2, 4 ][ trunc( Level / 2 ) ] ){
+ let firstangle = angle * 90 + anglegap * [ 1, -1, -1, 1 ][ i ] + GetAngleToPlayer();
+ let color = [ BLUE22, AQUA22, RED22, YELLOW22 ][ angle ];
+ CreateShotA( 0, GetX(), GetY(), 10 );
+ SetShotDataA( 0, 0, [ 4.5, 1.5 ][ i % 2 ] + Level / 2, firstangle, 0, -0.1, 1, color );
+ SetShotDataA( 0, [ 50, 70, 50, 40 ][ Level ], [ 1.2, 1.5 ][ i % 2 ], firstangle + [ -90, 60, 60, -90 ][ i ], 0, 0, [ 1.2, 1.5 ][ i % 2 ], color );
+ FireShot( 0 );
+ }
+ }
+ PlaySEEx( seShot2 );
+ anglegap += [ 15, 8 ][ trunc( Level / 2 ) ];
+ Wait( [ 8, 5, 5, 5 ][ Level ] );
+ }
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 1200 );
+ SetScore( 3650000 );
+ SetTimer( 95 );
+ SetInvincibility( 130 );
+ SetDamageRate( 30, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 8 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 23, imgCutInKene, 192, 344 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, -1 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ CreateSpellResult( 23 * 4 + Level );
+ EndSpell();
+ DropItem( 20, 64 );
+ }
+ @DrawLoop{
+ SetGraphicRect( 0, 0, 512, 256 );
+ SetAlpha( Smooth( 255, 192, count, 200 ) );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ SetGraphicScale( Accelerate( 2, 1, count, 60 ), Accelerate( 0, 1, count, 60 ) ); }
+ DrawChr( imgEnemySense[ count % 10 ], count );
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+ @BackGround{ KeneBG( imgSpellStar, imgSpellWheel, imgSpellKene, ALPHA, count ); }
+}
+script_enemy Obj{
+ let Argv = GetArgument();
+ let uniquestr = "G_CAVEDA3S";
+ @Initialize{
+ SetDamageRateEx( 100, 100, 5, 2 );
+ SetLife( 32767 );
+ }
+ @MainLoop{
+ SetX( GetCommonData( uniquestr ~ "X" ) + 128 * Argv );
+ SetY( GetCommonData( uniquestr ~ "Y" ) - 144 );
+ SetCollisionA( GetX(), GetY(), 96 );
+ }
+}
diff --git a/th_dnh/script/thA/CavedA4.dnh b/th_dnh/script/thA/CavedA4.dnh
new file mode 100644
index 0000000..de2207c
--- /dev/null
+++ b/th_dnh/script/thA/CavedA4.dnh
@@ -0,0 +1,131 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_CAVEDA4";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let dir = -1;
+ loop( 2 ){
+ CreateEnemyFromScript( "Obj", GetX(), GetY(), 0, 0, dir );
+ dir = -dir;
+ }
+ let pattern = 0;
+ loop{
+ SetShotDirectionType( ABSOLUTE );
+ let pangle = GetAngleToPlayer();
+ alternative( pattern % 3 )
+ case( 0 ){
+ let angle = 66;
+ loop( 3 ){
+ ascent( let i in 0..2 ){ BuckShot( pangle + angle * [ 1, -1 ][ i ] ); }
+ PlaySEEx( seShot1 );
+ Wait( 40 );
+ angle -= 30;
+ }
+ }
+ case( 1 ){
+ let angle = 30;
+ loop( 10 ){
+ ascent( let i in 0..2 ){ BuckShot( pangle + angle * [ 1, -1 ][ i ] ); }
+ PlaySEEx( seShot1 );
+ Wait( 10 );
+ angle += 24;
+ }
+ }
+ case( 2 ){
+ ascent( let i in 0..18 ){
+ if( i % 2 == 0 ){
+ let angle = -80;
+ while( angle <= 80 ){
+ BuckShot( GetAngleToPlayer() + angle );
+ angle += 80;
+ }
+ }
+ else{ BuckShot( GetAngleToPlayer() ); }
+ PlaySEEx( seShot1 );
+ Wait( [ 10, 5 ][ i < 8 ] );
+ }
+ }
+ Wait( [ 90, 30 ][ pattern % 3 == 1 ] );
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ function BuckShot( let angle ){
+ Ref( angle, 5, RED03 );
+ loop( [ 10, 6, 10, 16 ][ Level ] ){
+ let color = [ RED04, RED01, RED02 ][ rand_int( 0, 2 ) ];
+ let gap;
+ let speed;
+ alternative( color )
+ case( RED02 ){
+ gap = 2.2;
+ speed = rand( 4.2, 4.8 );
+ }
+ case( RED01 ){
+ gap = 4;
+ speed = rand( 3.3, 4.4 );
+ }
+ case( RED04 ){
+ gap = 5;
+ speed = rand( 2.8, 3.6 );
+ }
+ Ref( angle + RandBlur( gap ), speed, color );
+ }
+ }
+ task Ref( let angle, let speed, let color ){
+ let obj = SetShotObject( GetX(), GetY(), speed, angle, color, 33 );
+ while( !( Obj_BeDeleted( obj ) || ReflectObject( obj, false, Level != 0, true ) ) ){ yield; }
+ if( Obj_BeDeleted( obj ) ){ return; }
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), speed, Obj_GetAngle( obj ), color, 0 );
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 5555 );
+ SetTimer( 80 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ SetShotAutoDeleteClip( 64, 64, 64, 64 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, -1 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{
+ SetGraphicRect( 0, 0, 512, 256 );
+ SetAlpha( Smooth( 255, 192, count, 200 ) );
+ SetGraphicScale( Accelerate( 2, 1, count, 60 ), Accelerate( 0, 1, count, 60 ) );
+ DrawChr( imgEnemyBat[ count % 10 ], count );
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+}
+script_enemy Obj{
+ let Argv = GetArgument();
+ let uniquestr = "G_CAVEDA4";
+ @Initialize{
+ SetDamageRateEx( 100, 100, 10, 5 );
+ SetLife( 32767 );
+ }
+ @MainLoop{
+ SetX( GetCommonData( uniquestr ~ "X" ) + 128 * Argv );
+ SetY( GetCommonData( uniquestr ~ "Y" ) - 144 );
+ SetCollisionA( GetX(), GetY(), 96 );
+ }
+}
diff --git a/th_dnh/script/thA/CavedA4S.dnh b/th_dnh/script/thA/CavedA4S.dnh
new file mode 100644
index 0000000..e0655de
--- /dev/null
+++ b/th_dnh/script/thA/CavedA4S.dnh
@@ -0,0 +1,119 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_CAVEDA4S";
+ let PrevTime = GetTimer();
+ let Defrost = false;
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let dir = -1;
+ loop( 2 ){
+ CreateEnemyFromScript( "Obj", GetX(), GetY(), 0, 0, dir );
+ dir = -dir;
+ }
+ loop{
+ SetShotDirectionType( ABSOLUTE );
+ Concentration01( 120 );
+ PlaySE( sePower1 );
+ Wait( 120 );
+ ascent( let i in 0..8 ){
+ Explosion01( GetX(), GetY(), 12, 0.5, 16 );
+ PlaySE( seKira1 );
+ Defrost = true;
+ yield;
+ Defrost = false;
+ loop( [ 1, 3 ][ i == 0 ] ){
+ Ripple();
+ PlaySEEx( seShot2 );
+ Wait( 18 );
+ }
+ Wait( [ 200 - i * 10, 30 ][ i == 7 ] );
+ ExMove( false, count );
+ }
+ }
+ }
+ task Ripple(){
+ let x = GetX() + RandBlur( 64 );
+ let y = GetY() + RandBlur( 64 );
+ let pangle = atan2( GetPlayerY() - y, GetPlayerX() - x );
+ let angle = 0;
+ while( angle < 360 ){
+ Ref( x, y, angle + pangle );
+ angle += [ 30, 24, 20, 12 ][ Level ];
+ }
+ }
+ task Ref( let x, let y, let angle ){
+ let obj = SetShotObject( x, y, 2.4, angle, RED11, 50 );
+ let ref = false;
+ let count = 1;
+ while( !Obj_BeDeleted( obj ) ){
+ if( !ref ){ ref = ReflectObject( obj, false, true, true ); }
+ if( count % 33 == 0 && Obj_GetY( obj ) < GetClipMaxY() - 64 ){ Bit( Obj_GetX( obj ), Obj_GetY( obj ), ( count + angle ) % 360 ); }
+ yield;
+ count++;
+ }
+ }
+ task Bit( let x, let y, let angle ){
+ let obj = SetShotObject( x, y, 0, angle, RED04, 100 );
+ while( !( Obj_BeDeleted( obj ) || Defrost ) ){ yield; }
+ CreateShot02( Obj_GetX( obj ), Obj_GetY( obj ), 0, angle, 0.01, [ 0.8, 0.8, 1.5, 1.6 ][ Level ], RED04, 0 );
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 1200 );
+ SetScore( 3650000 );
+ SetTimer( 90 );
+ SetInvincibility( 130 );
+ SetDamageRate( 30, 6 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 8 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 24, imgCutInKene, 192, 344 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, -1 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ CreateSpellResult( 24 * 4 + Level );
+ EndSpell();
+ DropItem( 20, 64 );
+ }
+ @DrawLoop{
+ SetGraphicRect( 0, 0, 512, 256 );
+ SetAlpha( Smooth( 255, 192, count, 200 ) );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ SetGraphicScale( Accelerate( 2, 1, count, 60 ), Accelerate( 0, 1, count, 60 ) ); }
+ DrawChr( imgEnemyBat[ count % 10 ], count );
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+ @BackGround{ KeneBG( imgSpellStar, imgSpellWheel, imgSpellKene, ALPHA, count ); }
+}
+script_enemy Obj{
+ let Argv = GetArgument();
+ let uniquestr = "G_CAVEDA4S";
+ @Initialize{
+ SetDamageRateEx( 100, 100, 5, 2 );
+ SetLife( 32767 );
+ }
+ @MainLoop{
+ SetX( GetCommonData( uniquestr ~ "X" ) + 128 * Argv );
+ SetY( GetCommonData( uniquestr ~ "Y" ) - 144 );
+ SetCollisionA( GetX(), GetY(), 96 );
+ }
+}
diff --git a/th_dnh/script/thA/CavedA5S.dnh b/th_dnh/script/thA/CavedA5S.dnh
new file mode 100644
index 0000000..9332829
--- /dev/null
+++ b/th_dnh/script/thA/CavedA5S.dnh
@@ -0,0 +1,226 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let uniquestr = "G_CAVEDA5S";
+ function Concentration(){
+ if( GetTimer() <= 30 ){ return; }
+ Concentration01( 120 );
+ PlaySEEx( sePower1 );
+ Wait( 120 );
+ }
+ task Circle(){
+ loop( 30 ){
+ let angle = 0;
+ while( angle < 360 ){
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, 10, angle + 180, 0, -0.3, 0, WHITE12 );
+ SetShotDataA( 0, 120, NULL, NULL, 0, 0.2, 6, WHITE12 );
+ FireShot( 0 );
+ angle += 6;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 3 );
+ }
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 3, angle + GetAngleToPlayer(), 0 );
+ angle += 30;
+ }
+ PlaySEEx( seShadow );
+ }
+ task CircleSE(){
+ loop( 30 ){
+ PlaySEEx( seKira1 );
+ Wait( 3 );
+ }
+ }
+ task Option(){
+ ascent( let i in 0..4 ){
+ let angle = -30;
+ while( angle <= 30 ){
+ ascent( let gap in 0..2 ){ CreateEnemyFromScript( "Shadow2", GetX(), GetY(), 0, angle + gap * 180, i ); }
+ angle += [ 60, [ 30, 60 ][ i < 2 ] ][ trunc( Level / 2 ) ];
+ }
+ }
+ PlaySEEx( seShadow );
+ }
+ task Move(){
+ loop{
+ Wait( 300 );
+ CreateShot02( GetX(), GetY(), 11, GetAngleToPlayer(), -0.6, 0.8, AQUA02, 20 );
+ PlaySEEx( seShot3 );
+ let dstx = GetX();
+ let dsty = GetY();
+ let len = 40;
+ dstx = dstx + len * [ -1, 1 ][ GetPlayerX() - GetX() > 0 ];
+ if( GetPlayerY() > GetCenterY() ){ dsty += 32 * [ -1, 1 ][ rand_int( 0, 1 ) ]; }
+ else{ dsty = dsty + len * [ -1, 1 ][ GetPlayerY() - GetY() > 0 ]; }
+ if( dstx < GetClipMinX() + 96 ){ dstx += 64; }
+ else if( dstx > GetClipMaxX() - 96 ){ dstx -= 64; }
+ if( dsty < GetClipMinY() + 16 ){ dsty += 64; }
+ else if( dsty > GetCenterY() - 128 ){ dsty -= 64; }
+ SetMovePosition03( dstx, dsty, 20, 1.6 );
+ }
+ }
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ SetShotDirectionType( PLAYER );
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ Circle();
+ Wait( 120 );
+ CircleSE();
+ PlaySEEx( sePower1 );
+ Concentration01( 100 );
+ Wait( 100 );
+ Option();
+ Move();
+ ascent( let i in 0..1 + trunc( Level / 2 ) ){
+ while( GetTimer() > 30 && GetLife() > 8000 - i * 2000 ){ loop( 5 ){ yield; } }
+ Concentration();
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow3", GetX(), GetY(), 0, angle, i );
+ angle += 60;
+ }
+ PlaySEEx( seShadow );
+ }
+ }
+ @Initialize{
+ SetLife( 9999 );
+ SetScore( 6000000 );
+ SetTimer( 120 );
+ SetInvincibility( 300 );
+ SetDamageRate( 80, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( [ 60, 1 ][ GetCommonDataDefault( "SpellPractice", false ) ], 0, 0 );
+ SetCommonData( "ShowName", 8 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 25, imgCutInKene, 192, 344 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ if( GetLife() <= 0 ){
+ SetCommonData( uniquestr, 0 );
+ if( count % 15 == 0 ){ PlaySEEx( seShot1 ); }
+ }
+ else{ yield; }
+ TaskShadowInterface( uniquestr, [ -1, 7 ][ count > 300 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ CreateSpellResult( 25 * 4 + Level );
+ EndSpell();
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+ @BackGround{ KeneBG( imgSpellStar, imgSpellWheel, imgSpellKene, ALPHA, count ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let PrevLife;
+ @Initialize{
+ SetLife( 128 );
+ PrevLife = GetLife();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, "G_CAVEDA5S", true );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleRed, imgEnemyShadow, count ); }
+}
+script_enemy Shadow2{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgument();
+ let CentralX = GetCenterX() + [ 128, 80 ][ trunc( Argv / 2 ) ] * [ 1, -1 ][ Argv % 2 ];
+ let CentralY = GetClipMinY() + [ 64, 160 ][ trunc( Argv / 2 ) ];
+ let RotateSpeed = [ 1.5, 1, 0.8, 0.8 ][ Level ] * [ 1, -1 ][ Argv % 2 ];
+ let PrevLife;
+ task Behavior(){
+ yield;
+ Wait( 20 );
+ loop{
+ loop( 10 ){
+ SetShotDirectionType( ABSOLUTE );
+ CreateShot01( GetX(), GetY(), Smooth( 0.5, [ 1.2, 1.4, 1.5, 1.4 ][ Level ], 100 - GetTimer(), 100 ), atan2( CentralY - GetY(), CentralX - GetX() ), BLUE12, 10 );
+ if( Level == 3 && Argv < 2 ){ CreateShot01( GetX(), GetY(), Smooth( 0.7, 1.5, 100 - GetTimer(), 100 ), atan2( CentralY - GetY(), CentralX - GetX() ) + 180, BLUE12, 10 ); }
+ PlaySEEx( seShot1 );
+ Wait( 8 );
+ }
+ Wait( 5 );
+ }
+ }
+ @Initialize{
+ SetLife( [ 500, 1800 ][ Argv < 2 ] );
+ SetDamageRate( 100, [ 1, 3 ][ Argv < 2 ] );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, "G_CAVEDA5S", false );
+ SetX( CentralX - cos( count * RotateSpeed + GetAngle() ) * 32 );
+ SetY( CentralY + sin( count * RotateSpeed + GetAngle() ) * 32 );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
+script_enemy Shadow3{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_CAVEDA5S";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgument() + 1;
+ let PrevLife;
+ task Behavior(){
+ Wait( Argv * 5 + 60 );
+ loop{
+ CircleShotGap01(
+ [ 120, 90 ][ Level == 3 ],
+ [ 1.2, 1.4, 1.5, 1.6 ][ Level ],
+ [ YELLOW04, ORANGE04, RED04, PURPLE04 ][ Argv - 1 ],
+ 10,
+ [ count * 2 * GetDir( GetX() - GetCommonData( uniquecode ~ "X" ) ), 90 ][ count < 90 ]
+ );
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ }
+ @Initialize{
+ SetLife( 5000 );
+ SetDamageRate( 100, 5 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( 0, Argv * 32, count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, true );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleRed, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/CavedA5_.dnh b/th_dnh/script/thA/CavedA5_.dnh
new file mode 100644
index 0000000..be7cf13
--- /dev/null
+++ b/th_dnh/script/thA/CavedA5_.dnh
@@ -0,0 +1,26 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ Wait( 180 );
+ AddLife( -1 );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetInvincibility( 120 );
+ SetDamageRate( 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+}
diff --git a/th_dnh/script/thA/CavedA_.dnh b/th_dnh/script/thA/CavedA_.dnh
new file mode 100644
index 0000000..5c11442
--- /dev/null
+++ b/th_dnh/script/thA/CavedA_.dnh
@@ -0,0 +1,33 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ Wait( 120 );
+ Concentration01( 180 );
+ PlaySEEx( sePower1 );
+ Wait( 180 );
+ AddLife( -1 );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetInvincibility( 30 );
+ SetDamageRate( 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ SetCommonData( "BGStep", 2 );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 0 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ PlaySEEx( seKira1 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ }
+}
diff --git a/th_dnh/script/thA/CavedB.dnh b/th_dnh/script/thA/CavedB.dnh
new file mode 100644
index 0000000..ecf86b2
--- /dev/null
+++ b/th_dnh/script/thA/CavedB.dnh
@@ -0,0 +1,3 @@
+#ScriptPathData
+#ScriptPath[.\CavedB1S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/CavedB1S.dnh b/th_dnh/script/thA/CavedB1S.dnh
new file mode 100644
index 0000000..8408794
--- /dev/null
+++ b/th_dnh/script/thA/CavedB1S.dnh
@@ -0,0 +1,88 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let timer = 500;
+ let DeadTime = -1;
+ task Shot( let pattern ){
+ let angle = 0;
+ while( angle < 360 ){
+ ascent( let i in 0..2 ){
+ let fangle = angle + pattern * 4 * [ 1, -1 ][ i ];
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, 2.8, fangle, 0, -0.03, 0, [ RED21, BLUE21 ][ i ] );
+ SetShotDataA( 0, 50, NULL, NULL, 0, -0.01, 0, [ RED21, BLUE21 ][ i ] );
+ SetShotDataA( 0, 56, NULL, NULL, 0, 0, 0, [ RED21, BLUE21 ][ i ] );
+ SetShotDataA( 0, 133, NULL, NULL, 0, -0.01, 0, [ RED21, BLUE21 ][ i ] );
+ SetShotDataA( 0, timer, NULL, fangle + 180 + ( pattern % 7 ) * 2 * [ 1, -1 ][ i ], 0, 0.0086, 2.4, [ RED21, BLUE21 ][ i ] );
+ SetShotKillTime( 0, 777 );
+ FireShot( 0 );
+ }
+ angle += [ 120, 90, 72, 60 ][ Level ];
+ }
+ PlaySEEx( seShot1 );
+ if( pattern % 2 == 0 ){ return; }
+ Wait( timer );
+ PlaySEEx( seKira1 );
+ }
+ task Behavior(){
+ Wait( 30 );
+ SetShotAutoDeleteClip( 128, 128, 128, 128 );
+ let pattern = 0;
+ loop{
+ Concentration01( 120 );
+ PlaySEEx( sePower1 );
+ Wait( 120 );
+ loop( 84 ){
+ if( pattern % 7 > 1 ){ Shot( pattern ); }
+ Wait( 5 );
+ pattern++;
+ }
+ }
+ }
+ @Initialize{
+ SetLife( 7777 );
+ SetScore( 11000000 );
+ SetTimer( 50 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 100 );
+ SetMovePosition03( GetCenterX(), GetCenterY(), 20, 3.5 );
+ SetEffectForZeroLife( [ 60, 1 ][ GetCommonDataDefault( "SpellPractice", false ) ], 240, 2 );
+ SetCommonData( "ShowName", 8 );
+ LastSpell();
+ SetDurableSpellCard();
+ SetShotAutoDeleteClip( 192, 192, 192, 192 );
+ StartSpell( 26, imgCutInKene, 192, 344 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ if( GetLife() <= 0 ){
+ if( DeadTime < 0 ){ DeadTime = count; }
+ if( count % 15 == 0 ){ PlaySEEx( seShot1 ); }
+ }
+ else{ yield; }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ if( GotSpellCardBonus() && PrevTime > 1 ){ DropItem( 101 + Level * 33, 384 ); }
+ CreateSpellResult( 26 * 4 + Level );
+ EndSpell();
+ }
+ @DrawLoop{
+ SetColor( 192, 0, 0 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ SetRenderState( SUBTRACT );
+ DrawBossChr( imgEnemyKene, 1, 1, 45, 86, count );
+ SetRenderState( ALPHA );
+ }
+ @BackGround{ KeneBG( imgSpellStar, imgSpellWheel, imgSpellKene, ALPHA, count ); }
+}
diff --git a/th_dnh/script/thA/CavedBE.dnh b/th_dnh/script/thA/CavedBE.dnh
new file mode 100644
index 0000000..16ab9ea
--- /dev/null
+++ b/th_dnh/script/thA/CavedBE.dnh
@@ -0,0 +1,53 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ task Behavior(){
+ yield;
+ Slow( 1 );
+ PlaySEEx( seBossExplode );
+ Wait( 30 );
+ CollectItems();
+ Wait( 70 );
+ Slow( 0 );
+ SetCommonData( "Result", true );
+ let clear = 60000000;
+ let point = GetPoint() * 50000 - GetCommonDataDefault( "ResultPoint", 0 );
+ let graze = GetGraze() * 500 - GetCommonDataDefault( "ResultGraze", 0 );
+ let player = ( GetPlayerLife() - 1 ) * 20000000;
+ let bomb = GetPlayerBomb() * 4000000;
+ let rank = [ 50, 100, 120, 150 ][ GetCommonDataDefault( "Level", 1 ) ];
+ let total = ( clear + point + graze + player + bomb ) * ( rank / 100 );
+ SetCommonData( "ResultClear", clear );
+ SetCommonData( "ResultPoint", point );
+ SetCommonData( "ResultGraze", graze );
+ SetCommonData( "ResultPlayer", player );
+ SetCommonData( "ResultBomb", bomb );
+ SetCommonData( "ResultRank", rank );
+ SetCommonData( "ResultTotal", total );
+ AddScore( total );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetX( -128 );
+ SetY( -128 );
+ LoadSE( seBossExplode );
+ ForbidBomb( true );
+ ForbidShot( true );
+ CreateEventFromScript( "Talk" );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( !OnEvent() ){
+ SetCommonData( "WhiteFadeOut", GetCommonDataDefault( "GlobalCount", 0 ) );
+ VanishEnemy();
+ }
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ TextOutB( 180, "" );
+ SetStep( 1 );
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/China.dnh b/th_dnh/script/thA/China.dnh
new file mode 100644
index 0000000..51c9224
--- /dev/null
+++ b/th_dnh/script/thA/China.dnh
@@ -0,0 +1,3 @@
+#ScriptPathData
+#ScriptPath[.\China1.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/China1.dnh b/th_dnh/script/thA/China1.dnh
new file mode 100644
index 0000000..a6642b0
--- /dev/null
+++ b/th_dnh/script/thA/China1.dnh
@@ -0,0 +1,62 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 0 );
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 130 );
+ SetShotDirectionType( ABSOLUTE );
+ let anglegap = 0;
+ while( 1 ){
+ loop( [ 30, 40, 40, 60 ][ Level ] ){
+ ascent( let angle in 0..4 ){
+ ascent( let i in 0..[ 2, 4 ][ trunc( Level / 2 ) ] ){
+ let firstangle = angle * 90 + anglegap * [ 1, -1, -1, 1 ][ i ] + GetAngleToPlayer();
+ let color = [ [ WHITE23, RED23, ORANGE23, YELLOW23 ][ angle ], [ GREEN23, AQUA23, BLUE23, PURPLE23 ][ angle ] ][ i % 2 ];
+ CreateShotA( 0, GetX(), GetY(), 10 );
+ SetShotDataA( 0, 0, [ 4.5, 1.5 ][ i % 2 ] + Level / 2, firstangle, 0, -0.1, 1, color );
+ SetShotDataA( 0, [ 50, 70, 50, 40 ][ Level ], [ 1.2, 1.5 ][ i % 2 ], firstangle + [ -90, 60, 60, -90 ][ i ], 0, 0, [ 1.2, 1.5 ][ i % 2 ], color );
+ FireShot( 0 );
+ }
+ }
+ PlaySEEx( seShot1 );
+ anglegap += [ 27, 8 ][ trunc( Level / 2 ) ];
+ Wait( [ 8, 5, 5, 5 ][ Level ] );
+ }
+ if( Level == 3 ){
+ CircleShot01( 6, 1.1, RED01, 20 );
+ PlaySEEx( seShot3 );
+ }
+ ExMove( false, count );
+ }
+ }
+ @Initialize{
+ SetLife( 1900 );
+ SetTimer( 40 );
+ SetInvincibility( 50 );
+ SetDamageRate( 100, 40 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 0, 0, 0 );
+ SetEnemyMarker( true );
+ Behavior();
+ SetCommonData( "ShowName", 2 );
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 20 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ SetCommonData( "ShowName", -1 );
+ PlaySEEx( seBossExplode );
+ DropItem( 10, 64 );
+ DropBomb();
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyChina, 1, 1, 47, 86, count ); }
+}
diff --git a/th_dnh/script/thA/Concentrate.dnh b/th_dnh/script/thA/Concentrate.dnh
new file mode 100644
index 0000000..0ae51a4
--- /dev/null
+++ b/th_dnh/script/thA/Concentrate.dnh
@@ -0,0 +1,16 @@
+script_enemy_main{
+#include_function ".\FUNC\Enemy.dnh"
+ task Behavior(){
+ Wait( 1 );
+ Concentration02( 100 );
+ PlaySEEx( sePower1 );
+ Wait( 120 );
+ Explosion01( GetX(), GetY(), 16, 0.3, 16 );
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 1 );
+ Behavior();
+ }
+ @MainLoop{ yield; }
+}
diff --git a/th_dnh/script/thA/Daiyosei.dnh b/th_dnh/script/thA/Daiyosei.dnh
new file mode 100644
index 0000000..4599601
--- /dev/null
+++ b/th_dnh/script/thA/Daiyosei.dnh
@@ -0,0 +1,3 @@
+#ScriptPathData
+#ScriptPath[.\Daiyosei1.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/Daiyosei1.dnh b/th_dnh/script/thA/Daiyosei1.dnh
new file mode 100644
index 0000000..c54cb04
--- /dev/null
+++ b/th_dnh/script/thA/Daiyosei1.dnh
@@ -0,0 +1,111 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let HideAlpha = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let Turn = 0;
+ task Behavior(){
+ yield;
+ WaitZeroSpeed();
+ loop{
+ Concentration02( 100 );
+ PlaySEEx( sePower2 );
+ Wait( 80 );
+ alternative( Turn % 2 )
+ case( 0 ){
+ SetShotDirectionType( ABSOLUTE );
+ let dir = -1;
+ loop( [ 2, 1 ][ Turn == 0 ] ){
+ let angle = 0;
+ while( angle <= [ 60, 120 ][ Turn == 0 ] ){
+ let speed = Smooth( [ 1, 0.5 ][ trunc( Level / 2 ) ], [ 3, 5 ][ trunc( Level / 2 ) ], angle, 120 );
+ loop( [ 1, 2, 3, 5 ][ Level ] ){
+ let firstspeed = speed / 3;
+ let gap = angle * dir * [ 1, -1 ][ trunc( Turn / 2 ) % 2 ];
+ ascent( let i in 0..[ 2, 4 ][ Level == 3 ] ){ CircleShotGap02( 120, firstspeed, 0.05, speed, BLUE11, 5, gap + [ 0, 57.5 ][ trunc( i / 2 ) ] + [ 0, 1.5 ][ i % 2 ] ); }
+ speed += [ 0.4, 0.6 ][ trunc( Level / 2 ) ];
+ }
+ PlaySEEx( seShot3 );
+ Wait( 5 );
+ angle += 5;
+ }
+ dir = -dir;
+ }
+ }
+ case( 1 ){
+ SetShotDirectionType( PLAYER );
+ if( Level == 3 ){
+ CircleShot01( 5, 2, ORANGE12, 20 );
+ CircleShot01( 5, 1, ORANGE12, 7 );
+ }
+ ascent( let i in 0..6 ){
+ let speed = 1.5;
+ loop( [ 6, 4 ][ Level == 0 ] ){
+ if( trunc( Turn / 2 ) % 2 == 0 ){
+ let limit = [ 2, 5 ][ trunc( Level / 2 ) ];
+ WayShot01( limit * trunc( i / 2 ), limit, speed, [ PURPLE31, GREEN31 ][ trunc( i / 2 ) % 2 ], 5 );
+ }
+ else{
+ let dir = 1;
+ loop( 2 ){
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, speed, rand( 50, 65 ) * dir, 0, 0, speed, PURPLE31 );
+ SetShotDataA( 0, 40, NULL, [ 0, [ -12, -8, 0, 8, 12 ][ rand_int( 0, 4 ) ] ][ Level == 3 ], 0, -1, 0, PURPLE31 );
+ SetShotDataA( 0, 50, speed / [ 1.7, 1.5, 1, 4 ][ Level ], NULL, 0, 0, speed, PURPLE31 );
+ FireShot( 0 );
+ dir = -dir;
+ }
+ }
+ speed += [ 0.4, 0.8 ][ trunc( Level / 2 ) ];
+ }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ }
+ ExMove( false, count );
+ Wait( 16 );
+ Turn++;
+ Wait( 84 );
+ }
+ }
+ @Initialize{
+ SetLife( 1999 );
+ SetTimer( 28 );
+ SetInvincibility( 200 );
+ SetDamageRate( 100, 90 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 0, 0, 0 );
+ Behavior();
+ SetCommonData( "ShowName", 0 );
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ HideAlpha = MinMax( HideAlpha + [ -16, 7 ][ GetSpeed() < 0.1 ], 0, 255 );
+ SetEnemyMarker( HideAlpha > 0 );
+ if( HideAlpha > 64 ){ Collision( 36, [ 0, 20 ][ HideAlpha == 255 ] ); }
+ SEShotHitBoss( seDamage, count );
+ yield;
+ count++;
+ }
+ @Finalize{
+ SetCommonData( "ShowName", -1 );
+ PlaySEEx( seBossExplode );
+ DropItem( 6, 64 );
+ }
+ @DrawLoop{
+ if( HideAlpha != 0 ){
+ SetGraphicScale( Smooth( 0, 1, HideAlpha, 255 ), Smooth( 2, 1, HideAlpha, 255 ) );
+ SetAlpha( HideAlpha );
+ SetGraphicAngle( [ 0, 180 ][ Turn % 2 ], 0, 0 );
+ DrawBossChr( imgEnemyDaiyosei, 1, 1, 47, 64, count );
+ SetAlpha( 255 );
+ SetGraphicAngle( 0, 0, 0 );
+ SetGraphicScale( 1, 1 );
+ }
+ }
+}
diff --git a/th_dnh/script/thA/Doll01.dnh b/th_dnh/script/thA/Doll01.dnh
new file mode 100644
index 0000000..ad4d3b6
--- /dev/null
+++ b/th_dnh/script/thA/Doll01.dnh
@@ -0,0 +1,62 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ let FadeTime = 0;
+ task Behavior(){
+ Wait( 100 );
+ SetShotDirectionType( ABSOLUTE );
+ let angle = 0;
+ while( angle < 360 ){
+ let pangle = angle + GetAngleToPlayer();
+ let speed = [ 10, 16, 20, 24 ][ Level ];
+ CreateShotA( 0, GetX(), GetY(), 0 );
+ SetShotDataA( 0, 0, 20, pangle, 0, 0, 20, ORANGE12 );
+ SetShotKillTime( 0, 3 );
+ alternative( Level )
+ case( 0, 1 ){
+ CreateShotA( 1, 0, 0, 0 );
+ SetShotDataA( 1, 0, 10, pangle, 0, -0.7, 0.8, ORANGE12 );
+ AddShot( 2, 0, 1, 0 );
+ }
+ case( 2, 3 ){
+ let dir = 1;
+ loop( 2 ){
+ CreateShotA( 1, 0, 0, 0 );
+ SetShotDataA( 1, 0, 10, pangle + 10 * dir, 0.9 * dir, -0.5, 0.8, ORANGE12 );
+ SetShotDataA( 1, 50, NULL, NULL, 0, -0.5, 0.8, ORANGE12 );
+ AddShot( 2, 0, 1, 0 );
+ dir = -dir;
+ }
+ }
+ FireShot( 0 );
+ angle += [ 30, 10, 10, 6 ][ Level ];
+ }
+ PlaySEEx( seShot3 );
+ Wait( 60 );
+ FadeTime = count;
+ Wait( 100 );
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 100 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count > 90 ){ Collision( 20, 0 ); }
+ SEShotHit( seDamage, count );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 16 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ if( count < 100 ){ SetAlpha( Smooth( 0, 255, count, 100 ) ); }
+ if( FadeTime != 0 ){ SetAlpha( Smooth( 255, 0, count - FadeTime, 100 ) ); }
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ SetAlpha( 255 );
+ }
+}
diff --git a/th_dnh/script/thA/Doll02.dnh b/th_dnh/script/thA/Doll02.dnh
new file mode 100644
index 0000000..26eb0fe
--- /dev/null
+++ b/th_dnh/script/thA/Doll02.dnh
@@ -0,0 +1,87 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquecode = RandBlur( 32767 );
+ let uniquestr = ToString( uniquecode );
+ let Shadow = true;
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let dir = GetX() < GetCenterX();
+ SetMovePosition03( GetX(), GetClipMinY() + 96, 20, 4 );
+ WaitSpeedDown( 0.4 );
+ ascent( let i in 0..8 ){
+ let playerangle = GetAngleToPlayer();
+ let angle = 0;
+ while( absolute( angle ) <= 60 ){
+ SetShotDirectionType( ABSOLUTE );
+ let speed = 0.6;
+ loop( 1 + Level ){
+ CircleShotGap02( 60, speed + Smooth( 2, 5, absolute( angle ), 60 ), -0.3, speed + Smooth( 0, 1, absolute( angle ), 60 ), [ RED04, PURPLE04 ][ dir ], 10, angle + i * 10 + playerangle );
+ speed += 0.5;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 3 );
+ angle += 6 * [ 1, -1 ][ i % 2 ];
+ }
+ Wait( 7 );
+ }
+ Shadow = false;
+ SetAngle( [ 150, 30 ][ GetX() < GetCenterX() ] );
+ while( GetSpeed() < 2 ){
+ SetSpeed( GetSpeed() + 0.05 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 360 );
+ SetDamageRate( 0, 3 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( Shadow && count % 100 == 0 ){
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 2, angle, uniquecode );
+ angle += 30;
+ }
+ PlaySEEx( seShadow );
+ }
+ if( count == 120 ){ SetDamageRate( 100, 30 ); }
+ TaskShadowInterface( uniquestr, 50 );
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ if( IsBossExisting() ){ VanishEnemy(); }
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ DropItem( 4, 68 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei1, count );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquecode = ToString( GetArgument() );
+ let PrevLife;
+ @Initialize{
+ SetLife( 30 );
+ PrevLife = GetLife();
+ }
+ @MainLoop{
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( [ 72, 48, 40, 40 ][ Level ] ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Doll03.dnh b/th_dnh/script/thA/Doll03.dnh
new file mode 100644
index 0000000..c6cd061
--- /dev/null
+++ b/th_dnh/script/thA/Doll03.dnh
@@ -0,0 +1,71 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ let FadeTime = 0;
+ let Invincible = 0;
+ task Behavior(){
+ Wait( 100 );
+ Invincible++;
+ SetShotDirectionType( ABSOLUTE );
+ let angle = 0;
+ while( angle < 360 ){
+ let pangle = angle + GetAngleToPlayer();
+ Appear( pangle );
+ angle += [ 30, 20, 20, 15 ][ Level ];
+ }
+ PlaySEEx( seShot3 );
+ Wait( 2 );
+ Invincible++;
+ Wait( 60 );
+ FadeTime = count;
+ Wait( 100 );
+ VanishEnemy();
+ }
+ task Appear( let angle ){
+ let obj = SetShotObject( GetX(), GetY(), 20, angle, AQUA12, 0 );
+ Obj_SetCollisionToPlayer( obj, false );
+ let count = 0;
+ if( WaitObject( obj, [ 2, 1 ][ Level == 3 ] ) ){ return; }
+ alternative( Level )
+ case( 0, 1 ){
+ CreateShotA( 0, Obj_GetX( obj ), Obj_GetY( obj ), 0 );
+ SetShotDataA( 0, 0, 10, angle, 0, -0.7, 0.8, AQUA12 );
+ FireShot( 0 );
+ }
+ case( 2, 3 ){
+ let dir = 1;
+ loop( 2 ){
+ CreateShotA( 0, Obj_GetX( obj ), Obj_GetY( obj ), 0 );
+ SetShotDataA( 0, 0, 10, angle + 10 * dir, dir, -0.5, 0.8, AQUA12 );
+ SetShotDataA( 0, 50, NULL, NULL, 0, -0.5, 0.8, AQUA12 );
+ FireShot( 0 );
+ dir = -dir;
+ }
+ }
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 3 );
+ SetDamageRate( 0, 0 );
+ Behavior();
+ }
+ @MainLoop{
+ if( Invincible >= 1 ){ Collision( 20, 0 ); }
+ if( Invincible == 2 ){ SetDamageRate( 100, 1 ); }
+ SEShotHit( seDamage, count );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 16 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ if( count < 100 ){ SetAlpha( Smooth( 0, 255, count, 100 ) ); }
+ if( FadeTime != 0 ){ SetAlpha( Smooth( 255, 0, count - FadeTime, 100 ) ); }
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ SetAlpha( 255 );
+ }
+}
diff --git a/th_dnh/script/thA/Doll04.dnh b/th_dnh/script/thA/Doll04.dnh
new file mode 100644
index 0000000..140bf6d
--- /dev/null
+++ b/th_dnh/script/thA/Doll04.dnh
@@ -0,0 +1,38 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ let FadeTime = 0;
+ let maxnum = 8 + Level;
+ task Behavior(){
+ Wait( 100 );
+ SetShotDirectionType( PLAYER );
+ ascent( let i in 0..maxnum ){ WayShotGap01( 60, [ 12, 10 ][ Level == 3 ], Smooth( 1, [ 2.5, 3.6 ][ trunc( Level / 2 ) ], i, maxnum - 1 ), RED04, 24, Smooth( -10, 10, i, maxnum - 1 ) ); }
+ PlaySEEx( seShot1 );
+ Wait( 60 );
+ FadeTime = count;
+ Wait( 100 );
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 100 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count > 90 ){ Collision( 20, 0 ); }
+ SEShotHit( seDamage, count );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 3, 16 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ if( count < 100 ){ SetAlpha( Smooth( 0, 255, count, 100 ) ); }
+ if( FadeTime != 0 ){ SetAlpha( Smooth( 255, 0, count - FadeTime, 100 ) ); }
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei5, count );
+ SetAlpha( 255 );
+ }
+}
diff --git a/th_dnh/script/thA/DollX01.dnh b/th_dnh/script/thA/DollX01.dnh
new file mode 100644
index 0000000..9845e9d
--- /dev/null
+++ b/th_dnh/script/thA/DollX01.dnh
@@ -0,0 +1,54 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Argv = GetArgumentDefault( 0 );
+ let FadeTime = 0;
+ task Behavior(){
+ Wait( 100 );
+ let dir = [ 1, -1 ][ GetX() < GetCenterX() ];
+ let space = 30;
+ SetShotDirectionType( PLAYER );
+ ascent( let i in 0..2 ){
+ let angle = 0;
+ while( angle < 360 ){
+ let gap = 0;
+ while( gap <= space ){
+ let color = [ AQUA12, RED12 ][ i ];
+ if( !( gap >= space / 2 - 3 && gap <= space / 2 + 3 ) ){
+ CreateShotA( 0, GetX(), GetY(), [ 5, 30 ][ i ] );
+ SetShotDataA( 0, 0, Smooth( 5, 13, gap, space ), ( angle + gap ) * dir, 0, 0, 20, color );
+ SetShotDataA( 0, 2, NULL, NULL, 0, -0.5, Smooth( 2.6, [ 3, 5 ][ i ], gap, space ), color );
+ FireShot( 0 );
+ }
+ gap += 3;
+ }
+ angle += space;
+ }
+ }
+ PlaySEEx( seShot1 );
+ Wait( 60 );
+ FadeTime = count;
+ Wait( 100 );
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 100 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count > 90 ){ Collision( 20, 0 ); }
+ SEShotHit( seDamage, count );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 16 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ if( count < 100 ){ SetAlpha( Smooth( 0, 255, count, 100 ) ); }
+ if( FadeTime != 0 ){ SetAlpha( Smooth( 255, 0, count - FadeTime, 100 ) ); }
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei1, count );
+ SetAlpha( 255 );
+ }
+}
diff --git a/th_dnh/script/thA/ED.dnh b/th_dnh/script/thA/ED.dnh
new file mode 100644
index 0000000..e81938b
--- /dev/null
+++ b/th_dnh/script/thA/ED.dnh
@@ -0,0 +1,120 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task WaitEvent4(){
+ while( GetEventStep() != 4 ){ yield; }
+ SetCommonData( "EDFade", GetCommonDataDefault( "NowCount", 0 ) );
+ yield;
+ }
+ task Behavior(){
+ WaitEvent4();
+ if( Continued() ){ return; }
+ while( GetEventStep() != 1 ){ yield; }
+ SetCommonData( "EDStep", [ 1, GetCommonDataDefault( "NowCount", 0 ) ] );
+ while( GetEventStep() != 2 ){ yield; }
+ SetCommonData( "EDStep", [ 2, GetCommonDataDefault( "NowCount", 0 ) ] );
+ while( GetEventStep() != 3 ){ yield; }
+ SetCommonData( "EDStep", [ 3, GetCommonDataDefault( "NowCount", 0 ) ] );
+ yield;
+ }
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ CreateEventFromScript( [ "Good", "Bad" ][ Continued() ] );
+ Behavior();
+ }
+ @MainLoop{
+ if( !OnEvent() ){ VanishEnemy(); }
+ yield;
+ count++;
+ }
+ @Finalize{
+ DeleteCommonData( "EDStep" );
+ DeleteCommonData( "EDFade" );
+ }
+}
+script_event Bad{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ TextOut( "\c[WHITE]誰も来ない、冬の山奥の神社。" );
+ TextOut( "\c[WHITE]朝、霊夢が目を覚ますと\n外は既に雪が降り始めていた。" );
+ TextOut( "\c[BLUE]「・・・そういえば私、\n何してたんだっけ」" );
+ TextOut( "\c[WHITE]何かをしようとしていたが、何も\n覚えていない。体もピンピンしているし" );
+ TextOut( "\c[WHITE]天候も平年並みか若干暖かめ。\n特に異常らしい異常は見当たらない。" );
+ TextOut( "\c[BLUE]「ま、いっか。\nこれから長い冬眠の季節ね」" );
+ TextOut( "\c[WHITE]そう漏らすと霊夢は、越冬のため\n里で買い込んだ食材を整理し始めた。" );
+ SetStep( 4 );
+ TextOutB( 300, "\c[WHITE]ENDING No1(BAD END)\nノーコンティニューでクリアしよう!" );
+ }
+ case( MARISA_A, MARISA_B ){
+ TextOut( "\c[WHITE]誰も来ない、冬の森の奥にある小さな館。\n刹那、窓から七色の閃光がほとばしる。" );
+ TextOut( "\c[BLUE]「・・・ゲホっ、で、出来たぜ・・・」" );
+ TextOut( "\c[WHITE]やっと目的の符が完成した・・・が、\n何かを忘れているような気がする。" );
+ TextOut( "\c[WHITE]魔理沙はそれを思い出そうと\nお茶を沸かし一息で飲みきる。" );
+ TextOut( "\c[BLUE]「・・・ま、いっか。思い出せないほど\nどうでもいいことなんだろうな」" );
+ TextOut( "\c[WHITE]そう漏らすと魔理沙は早速符の実験をしに\n雪の降り出した外へ飛び出していった。" );
+ SetStep( 4 );
+ TextOutB( 300, "\c[WHITE]ENDING No2(BAD END)\nノーコンティニューでクリアしよう!" );
+ }
+ End();
+ }
+}
+script_event Good{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ TextOut( "\c[WHITE]誰も来ない、冬の山奥の神社。" );
+ TextOut( "\c[WHITE]外は既に雪が降り始め、\n本格的に冬になろうとしていた。" );
+ SetStep( 1 );
+ TextOut( "\c[BLUE]「はぁ、真相はこうだったのね」" );
+ TextOut( "\c[BLUE]「結局、温泉に入ることなく\n元気になっちゃったじゃないの」" );
+ TextOut( "\c[BLUE]「楽しみにしてたのにちょっと残念ね」" );
+ TextOut( "\c[RED]「お、入浴中だったのか」" );
+ SetStep( 2 );
+ TextOut( "\c[BLUE]「入浴中と分かってて覗かない!\nおまけに他人も巻き込んで覗かせない!」" );
+ TextOut( "\c[RED]「いや、先刻こいつが私の家にやって来て\n『帰れなくなった』って」" );
+ TextOut( "\c[RED]「で、入浴中悪いんだけど、\nちょっとだけ結界開けてやれないか?」" );
+ TextOut( "\c[BLUE]「あー、それ入浴中でも以外でも無理よ。\n私の力でどうこうできる代物じゃないわ」" );
+ TextOut( "\c[PURPLE]「・・・修行不足」\n\c[BLUE]「そこの外人は後で覚悟してなさい」" );
+ SetStep( 3 );
+ TextOut( "\c[BLUE]「・・・で、なんで二人揃って\n勝手に人の風呂に入ってるのかしらね」" );
+ TextOut( "\c[RED]「外寒いぜ」\n\c[PURPLE]「外寒いし」" );
+ TextOut( "\c[BLUE]「やっぱ二人とも後で覚悟してなさい」" );
+ TextOut( "\c[WHITE]幻想郷の時は永遠に止まったまま。" );
+ TextOut( "\c[WHITE]動き出すことも巻き戻ることも\n未来永劫無いだろう。" );
+ TextOut( "\c[WHITE]それでこそ幻想郷だし、今後も幻想郷は\nそうであるべきだと思う。" );
+ SetStep( 4 );
+ TextOutB( 300, "\c[WHITE]ENDING No3(GOODEND)" );
+ }
+ case( MARISA_A, MARISA_B ){
+ TextOut( "\c[WHITE]幻想郷に雪が降り出した。" );
+ TextOut( "\c[WHITE]同時に外の世界でも\n雪が舞い始めようとしていた。" );
+ SetStep( 1 );
+ TextOut( "\c[BLUE]「おー、久々だなこの光景も・・・\nもう十年は経つかな、いやそれ以上かな」" );
+ TextOut( "\c[BLUE]「それにしてもだいぶ変わったもんだな。\nというか覚えてないけど」" );
+ TextOut( "\c[RED]「そこ、田舎者丸出ししてない!」\n\c[BLUE]「悪かったな田舎者で」" );
+ SetStep( 2 );
+ TextOut( "\c[RED]「はい、これあげるわ。田舎者の\n口には合わないかもしれないけど」" );
+ TextOut( "\c[BLUE]「おー、サンキュ」\n\c[RED]「まぁ、冬にアイスってのも変だけどね」" );
+ TextOut( "\c[BLUE]「ところで、これは食い物なのか?」\n\c[RED]「・・・田舎者」" );
+ SetStep( 3 );
+ TextOut( "\c[BLUE]「そういやもう一人居るとか言ってたけど\nそいつはどうしてるんだ?」" );
+ TextOut( "\c[RED]「あぁ、今別件で動いてるから」\n\c[BLUE]「また幻想郷に来るのか?」" );
+ TextOut( "\c[RED]「さぁ、あいつは動き出すそのときまで\n何も言わないからよく分からないわ」" );
+ TextOut( "\c[BLUE]「・・・なんか外の世界も悪くないな」\n\c[RED]「そうかしら?」" );
+ TextOut( "\c[BLUE]「あぁ、もうちょっと空気うまければな」\n\c[RED]「あなたみたいな田舎も捨てがたいわよ」" );
+ TextOut( "\c[GREEN]「あ、魔女のコスプレだー写真いいー?」\n\c[BLUE]「おー、なんか人気者だなー」" );
+ TextOut( "\c[BLUE]「いっちょ星の舞でも見せてやろうか」\n\c[RED]「それはやめてね、混乱の元だから」" );
+ TextOut( "\c[WHITE]外の世界は常に進化し続けている。" );
+ TextOut( "\c[WHITE]また幻想郷も外の世界とはまた方向が\n異なれどやはり進化し続けている。" );
+ TextOut( "\c[WHITE]この進化は今も今後も、誰にも止めたり\n戻したりはけっして出来ないだろう。" );
+ SetStep( 4 );
+ TextOutB( 300, "\c[WHITE]ENDING No4(GOODEND)" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/Extend.dnh b/th_dnh/script/thA/Extend.dnh
new file mode 100644
index 0000000..4cb443d
--- /dev/null
+++ b/th_dnh/script/thA/Extend.dnh
@@ -0,0 +1,4 @@
+script_enemy_main{
+ @Initialize{ VanishEnemy(); }
+ @Finalize{ loop( GetArgument() ){ CreateItem( ITEM_1UP, GetPlayerX(), GetPlayerY() ); } }
+}
diff --git a/th_dnh/script/thA/FUNC/Boss.dnh b/th_dnh/script/thA/FUNC/Boss.dnh
new file mode 100644
index 0000000..6c985dc
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Boss.dnh
@@ -0,0 +1,135 @@
+#include_function ".\FUNC\Enemy.dnh"
+#include_function ".\IMAGE\ENEMY\BAT\index.dnh"
+#include_function ".\IMAGE\ENEMY\PHOENIX\index.dnh"
+#include_function ".\IMAGE\ENEMY\SENSE\index.dnh"
+function ExMoveUnderBorder( let acrobat, let underborder ){
+ let dstx = GetX();
+ let dsty = GetY();
+ let len = [ 40, 80 ][ acrobat ];
+ dstx = dstx + len * [ -1, 1 ][ GetPlayerX() - GetX() > 0 ];
+ if( GetPlayerY() > GetCenterY() ){ dsty += [ 32, 64 ][ acrobat ] * [ -1, 1 ][ rand_int( 0, 1 ) ]; }
+ else{ dsty = dsty + len * [ -1, 1 ][ GetPlayerY() - GetY() > 0 ]; }
+ if( dstx < GetClipMinX() + 64 ){ dstx += 96; }
+ else if( dstx > GetClipMaxX() - 64 ){ dstx -= 96; }
+ if( dsty < GetClipMinY() + 16 ){ dsty += 96; }
+ else if( dsty > GetCenterY() - underborder ){ dsty -= 96; }
+ SetMovePosition03( dstx, dsty, 20, [ 1.6, 20 ][ acrobat ] );
+}
+function ExMove( let acrobat, let count ){ ExMoveUnderBorder( acrobat, 64 ); }
+function MoveSpell( let frame ){ SetMovePosition02( GetCenterX(), GetClipMinY() + 80, frame ); }
+function SEShotHitBoss( let se, let count ){
+ if( GetHitCount() != 0 ){
+ if( count % 3 == 0 ){ PlaySEEx( se ); }
+ if( GetCommonDataDefault( "DrawFrameCount", 0 ) % 2 != 0 ){ SetEnemyMarker( false ); }
+ else{ SetEnemyMarker( true ); }
+ }
+ else{ SetEnemyMarker( true ); }
+}
+function StartSpell( let code, let imgcutin, let width, let height ){
+ SetCommonData( "Spell", [ code, width, height ] );
+ SetCommonData( "SpellCutIn", imgcutin );
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), 0 ] );
+}
+function EndSpell(){
+ DeleteCommonData( "Spell" );
+ DeleteCommonData( "SpellCutIn" );
+ DeleteCommonData( "SpellBonus" );
+}
+function CreateSpellResult( let no ){
+ let gethistory = GetCommonData( "SpellGetHistory" );
+ let playhistory = GetCommonData( "SpellPlayHistory" );
+ let highscore = GetCommonData( "SpellHighScore" );
+ playhistory[ no ] = playhistory[ no ] + 1;
+ if( GotSpellCardBonus() ){
+ let nowscore = GetSpellCardBonusScore();
+ gethistory[ no ] = gethistory[ no ] + 1;
+ if( nowscore > highscore[ no ] ){ highscore[ no ] = nowscore; }
+ }
+ SetCommonData( "SpellGetHistory", gethistory );
+ SetCommonData( "SpellPlayHistory", playhistory );
+ SetCommonData( "SpellHighScore", highscore );
+ SaveEx();
+}
+function LettyBG( let bgfile, let count ){
+ if( !GetCommonDataDefault( "BGGEnable", true ) ){ return; }
+ SetGraphicRect( 0, 0, 384, 448 );
+ local{ ascent( let y in 0..2 ){ _DrawChr( bgfile, GetCenterX(), GetCenterY() + y * 448 - count * 5 % 448 ); } }
+ SetAlpha( 128 );
+ local{ ascent( let y in 0..2 ){ _DrawChr( bgfile, GetCenterX(), GetCenterY() + y * 448 + count * 5 % 448 ); } }
+ SetAlpha( 255 );
+}
+function AliceBG( let bgfile, let circlefile, let count ){
+ if( !GetCommonDataDefault( "BGGEnable", true ) ){ return; }
+ SetGraphicRect( 0, 0, 384, 448 );
+ local{ ascent( let y in 0..2 ){ _DrawChr( bgfile, GetCenterX(), GetCenterY() + y * 448 - count * 3 % 448 ); } }
+ SetGraphicRect( 0, 0, 512, 512 );
+ SetGraphicAngle( 0, 0, count * 1.5 );
+ SetAlpha( 80 + sin( count * 2 ) * 16 );
+ local{ ascent( let y in 0..6 ){ _DrawChr( circlefile, [ GetCenterX(), GetClipMinY(), GetClipMaxY() ][ y % 3 ], 512 - y * 256 + count * 2 % 768 ); } }
+ SetGraphicAngle( 0, 0, 0 );
+ SetAlpha( 255 );
+}
+function KhanBG( let bgfile, let color ){
+ if( !GetCommonDataDefault( "BGGEnable", true ) ){ return; }
+ SetColor( color, color, color );
+ RenkoBG( bgfile );
+ SetColor( 255, 255, 255 );
+}
+function RenkoBG( let bgfile ){
+ if( !GetCommonDataDefault( "BGGEnable", true ) ){ return; }
+ SetGraphicRect( 0, 0, 384, 448 );
+ DrawCenter( bgfile );
+}
+function LeilaBG( let frontbg, let backbg, let scrollbg, let count ){
+ SetGraphicRect( 0, 0, 384, 448 );
+ DrawCenter( backbg );
+ SetAlpha( 128 );
+ local{ ascent( let y in 0..2 ){ _DrawChr( scrollbg, GetCenterX(), GetCenterY() + y * 448 - count * 3 % 448 ); } }
+ SetAlpha( 255 );
+ DrawCenter( frontbg );
+}
+function LilyBG( let bgfile, let r, let g, let b, let count ){
+ if( !GetCommonDataDefault( "BGGEnable", true ) ){ return; }
+ SetColor( r, g, b );
+ SetGraphicRect( 0, 0, 1024, 1024 );
+ SetGraphicAngle( 0, 0, count / 3 );
+ DrawCenter( bgfile );
+ SetGraphicAngle( 0, 0, 0 );
+ SetColor( 255, 255, 255 );
+}
+function SakuyaBG( let bgfile, let bgtop, let fadestart, let fadetime, let count ){
+ if( !GetCommonDataDefault( "BGGEnable", true ) ){ return; }
+ let freeze = fadestart + fadetime >= count;
+ let color = [ 255, 48 ][ freeze ];
+ SetColor( color, color, color );
+ SetGraphicRect( 0, 0, 1024, 1024 );
+ SetGraphicAngle( 0, 0, [ -count, -fadestart ][ freeze ] / 2 );
+ DrawCenter( bgfile );
+ SetGraphicAngle( 0, 0, 0 );
+ SetColor( 255, 255, 255 );
+ if( !freeze ){
+ SetAlpha( 128 );
+ let speed = count * 1.5;
+ SetGraphicRect( speed, speed, speed + 512, speed + 512 );
+ DrawCenter( bgtop );
+ SetAlpha( 255 );
+ }
+}
+function KeneBG( let bg1, let bg2, let bg3, let state, let count ){
+ let speed = count * 1.5;
+ SetGraphicRect( count, count, 512 + count, count + 512 );
+ DrawCenter( bg1 );
+ SetRenderState( state );
+ SetGraphicRect( -speed, speed, 512 - speed, speed + 512 );
+ DrawCenter( bg2 );
+ SetRenderState( ALPHA );
+ SetGraphicRect( 0, 0, 384, 448 );
+ DrawCenter( bg3 );
+}
+function DrawBossChr( let file, let x1, let y1, let x2, let y2, let count ){
+ let angle = ( GetAngle() + 7200 ) % 360;
+ SetGraphicAngle( [ 0, 180 ][ angle > 90 && angle <= 270 ], 0, 0 );
+ SetGraphicRect( x1, y1, x2, y2 );
+ DrawChr( file, count );
+ SetGraphicAngle( 0, 0, 0 );
+}
diff --git a/th_dnh/script/thA/FUNC/Common.dnh b/th_dnh/script/thA/FUNC/Common.dnh
new file mode 100644
index 0000000..ca311fa
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Common.dnh
@@ -0,0 +1,64 @@
+function truncEx( let expr1, let expr2 ){ return trunc( expr1 / expr2 ) * expr2; }
+function GetDir( let expr ){ return [ [ 0, 1 ][ expr > 0 ], -1 ][ expr < 0 ]; }
+function Max( let expr1, let expr2 ){ return [ expr2, expr1 ][ expr1 > expr2 ]; }
+function Min( let expr1, let expr2 ){ return [ expr1, expr2 ][ expr1 > expr2 ]; }
+function Hypot( let x, let y ){ return ( ( x ^ 2 ) + ( y ^ 2 ) ) ^ 0.5; }
+function Shift( let expr, let bit ){ return expr * 2 ^ bit; }
+function MinMax( let expr, let limit1, let limit2 ){ return Max( Min( expr, Max( limit1, limit2 ) ), Min( limit1, limit2 ) ); }
+function MinMaxLoop( let expr, let limit1, let limit2 ){
+ if( limit1 > limit2 ){
+ let limittemp = limit1;
+ limit1 = limit2;
+ limit2 = limittemp;
+ }
+ if( expr < limit1 ){ expr = limit2; }
+ else if( expr > limit2 ){ expr = limit1; }
+ return expr;
+}
+function Smooth( let start, let end, let now, let limit ){
+ if( now >= limit ){ return end; }
+ if( now <= 0 ){ return start; }
+ return start + ( end - start ) * MinMax( now, 0, limit ) / limit;
+}
+function Accelerate( let start, let end, let now, let limit ){
+ if( now >= limit ){ return end; }
+ if( now <= 0 ){ return start; }
+ return start + ( end - start ) * Shift( ( now + 1 ) * now, -1 ) / Shift( ( limit + 1 ) * limit, -1 ); }
+function SlowDown( let start, let end, let now, let limit ){
+ if( now >= limit ){ return end; }
+ if( now <= 0 ){ return start; }
+ return start + ( end - start ) * Shift( ( Shift( limit, 1 ) - now + 1 ) * now, -1 ) / Shift( ( limit + 1 ) * limit, -1 );
+}
+function SplineFakeFSF( let start, let end, let now, let limit ){
+ if( now >= limit ){ return end; }
+ if( now <= 0 ){ return start; }
+ let center = start + ( end - start ) / 2;
+ return [ SlowDown( start, center, now, limit / 2 ), Accelerate( center, end, now, limit ) ][ now > limit / 2 ];
+}
+function SplineFakeSFS( let start, let end, let now, let limit ){
+ if( now >= limit ){ return end; }
+ if( now <= 0 ){ return start; }
+ let center = start + ( end - start ) / 2;
+ let limithalf = limit / 2;
+ return [ Accelerate( start, center, now, limithalf ), SlowDown( center, end, now - limithalf, limithalf ) ][ now >= limithalf ];
+}
+function Near( let expr1, let expr2, let len ){ return absolute( expr1 - expr2 ) < len; }
+function IsReimu(){ return GetPlayerType() == REIMU_A || GetPlayerType() == REIMU_B; }
+function IsMarisa(){ return GetPlayerType() == MARISA_A || GetPlayerType() == MARISA_B; }
+function SearchArray( let array, let char ){
+ let total = length( array );
+ let pos = 0;
+ while( pos < total && array[ pos ] != char ){ pos++; }
+ return pos;
+}
+function StringToStringInt( let str ){ return str[ 0 .. SearchArray( str, '.' ) ]; }
+function ToStringInt( let num ){ return StringToStringInt( ToString( num ) ); }
+function CharToInteger( let char ){ return char - 48; }
+function StringToInteger( let str ){
+ let strint = StringToStringInt( str );
+ let bytes = length( str );
+ let res = 0;
+ ascent( let grade in 0..bytes ){ res += CharToInteger( strint[ grade ] ) * 10 ^ grade; }
+ return res;
+}
+function LoadGraphicList( let list ){ ascent( let i in 0..length( list ) ){ LoadGraphic( list[ i ] ); } }
\ No newline at end of file
diff --git a/th_dnh/script/thA/FUNC/Enemy&Shadow.dnh b/th_dnh/script/thA/FUNC/Enemy&Shadow.dnh
new file mode 100644
index 0000000..a5a55ec
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Enemy&Shadow.dnh
@@ -0,0 +1,7 @@
+#include_function ".\FUNC\Shot&Enemy&Shadow.dnh"
+function GoneA( let deadline ){ if( IsOut( deadline ) ){ VanishEnemy(); } }
+function Gone(){ GoneA( 32 ); }
+function Collision( let a, let b ){
+ if( a > 0 ){ SetCollisionA( GetX(), GetY(), a ); }
+ if( b > 0 ){ SetCollisionB( GetX(), GetY(), b ); }
+}
diff --git a/th_dnh/script/thA/FUNC/Enemy.dnh b/th_dnh/script/thA/FUNC/Enemy.dnh
new file mode 100644
index 0000000..8fb5387
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Enemy.dnh
@@ -0,0 +1,31 @@
+#include_function ".\FUNC\Enemy&Shadow.dnh"
+function LinkageDamage( let uniquestr, let percentage ){
+ let damagetotal = GetCommonData( uniquestr ~ "D" );
+ if( damagetotal != 0 ){ AddLife( -( damagetotal * percentage / 100 ) ); }
+ SetCommonData( uniquestr ~ "D", 0 );
+}
+function CreateShadowInterface( let uniquestr ){
+ SetCommonData( uniquestr, 1 );
+ SetCommonData( uniquestr ~ "D", 0 );
+ TaskShadowInterface( uniquestr, -1 );
+}
+function TaskShadowInterface( let uniquestr, let linkdamage ){
+ SetCommonData( uniquestr ~ "X", GetX() );
+ SetCommonData( uniquestr ~ "Y", GetY() );
+ if( linkdamage >= 0 ){ LinkageDamage( uniquestr, linkdamage ); }
+}
+function ReleaseShadowInterface( let uniquestr ){
+ SetCommonData( uniquestr, [ 0, 2 ][ BeVanished() ] );
+// DeleteCommonData( uniquestr ~ "X" );
+// DeleteCommonData( uniquestr ~ "Y" );
+// DeleteCommonData( uniquestr ~ "D" );
+}
+function SEShotHit( let se, let count ){ if( GetHitCount() != 0 && count % 3 == 0 ){ PlaySEEx( se ); } }
+function _DropItem( let type, let num, let width ){
+ if( BeVanished() || GetCommonDataDefault( "SpellPractice", false ) ){ return; }
+ let w = width / 2;
+ loop( num ){ CreateItem( type, GetX() + [ rand( -w, w ), 0 ][ num == 1 ], GetY() + [ rand( -w, w ), 0 ][ num == 1 ] ); }
+}
+function DropItem( let num, let width ){ _DropItem( ITEM_SCORE, num, width ); }
+function DropBomb(){ _DropItem( ITEM_BOMB, 1, 0 ); }
+function DropExtend(){ _DropItem( ITEM_1UP, 1, 0 ); }
diff --git a/th_dnh/script/thA/FUNC/Event.dnh b/th_dnh/script/thA/FUNC/Event.dnh
new file mode 100644
index 0000000..204451f
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Event.dnh
@@ -0,0 +1,10 @@
+#include_function ".\IMAGE\CUTIN\index.dnh"
+#include_function ".\FUNC\Common.dnh"
+function MoveCharAuto( let player ){ ascent( let i in 0..2 ){ MoveChar( [ RIGHT, LEFT ][ i ], [ FRONT, BACK ][ [ player, !player ][ i ] ] ); } }
+function AllBack(){ ascent( let i in 0..2 ){ MoveChar( [ RIGHT, LEFT ][ i ], BACK ); } }
+function Player(){ MoveCharAuto( true ); }
+function Enemy(){ MoveCharAuto( false ); }
+function ChrIn( let file, let dir, let width, let height ){
+ SetChar( dir, file );
+ SetGraphicRect( dir, 1, 1, width, height );
+}
diff --git a/th_dnh/script/thA/FUNC/Shadow.dnh b/th_dnh/script/thA/FUNC/Shadow.dnh
new file mode 100644
index 0000000..4541440
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Shadow.dnh
@@ -0,0 +1,45 @@
+#include_function ".\FUNC\Enemy&Shadow.dnh"
+function IsHidden(){ return GetKeyState( VK_SLOWMOVE ) == KEY_HOLD; }
+function IsSudden(){ return !IsHidden(); }
+function DestructShadow( let radius ){
+ if( !BeVanished() ){ DeleteEnemyShotToItemInCircle( SHOT, GetX(), GetY(), radius ); }
+ DeleteEnemyShotToItemInCircle( ALL, GetX(), GetY(), 0 );
+}
+function StandardBehaviorShadow( let hiddense, let suddense, let prevlife, let uniquestr, let collision ){
+ let life = GetLife();
+ if( prevlife != life ){
+ let total = GetCommonData( uniquestr ~ "D" ) + absolute( life - prevlife );
+ SetCommonData( uniquestr ~ "D", total );
+ }
+ alternative( GetKeyState( VK_SLOWMOVE ) )
+ case( KEY_PUSH ){ PlaySE( hiddense ); }
+ case( KEY_PULL ){ PlaySE( suddense ); }
+ case( KEY_FREE ){
+ Collision( 40, [ 0, 12 ][ collision ] );
+ if( GetCommonData( "NowCount" ) % 2 == 0 ){
+ CreateShotA( 0, GetX(), GetY(), 20 );
+ SetShotDataA( 0, 0, 0, 0, 0, 0, 0, WHITE05 );
+ SetShotKillTime( 0, 0 );
+ FireShot( 0 );
+ }
+ }
+ alternative( GetCommonData( uniquestr ) )
+ case( 0 ){ AddLife( -32767 ); }
+ case( 2 ){ VanishEnemy(); }
+ return life;
+}
+function MoveRotate( let speed, let diam, let count, let uniquestr ){
+ SetX( GetCommonData( uniquestr ~ "X" ) - cos( count * speed + GetAngle() ) * diam );
+ SetY( GetCommonData( uniquestr ~ "Y" ) + sin( count * speed + GetAngle() ) * diam );
+}
+function DrawShadowRect( let circle, let enemy, let width, let height, let angle, let count ){
+ SetAlpha( [ 48, 192 ][ IsHidden() ] );
+ _DrawCircle( circle, count, 64 );
+ SetAlpha( [ 255, 48 ][ IsHidden() ] );
+ SetGraphicAngle( 0, 0, angle );
+ SetGraphicRect( 0, 0, width, height );
+ DrawChr( enemy, count );
+ SetGraphicAngle( 0, 0, 0 );
+ SetAlpha( 255 );
+}
+function DrawShadow( let circle, let enemy, let count ){ DrawShadowRect( circle, enemy, 32, 32, 0, count ); }
diff --git a/th_dnh/script/thA/FUNC/Shot&Enemy&Shadow.dnh b/th_dnh/script/thA/FUNC/Shot&Enemy&Shadow.dnh
new file mode 100644
index 0000000..6cba807
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Shot&Enemy&Shadow.dnh
@@ -0,0 +1,134 @@
+#include_function ".\IMAGE\index_mini.dnh"
+#include_function ".\FUNC\Stage&Shot&Enemy&Shadow.dnh"
+function IsOut( let deadline ){ return IsOutPos( GetX(), GetY(), deadline ); }
+function _WayShot02( let start, let end, let space, let speed, let accelerate, let max, let type, let delay ){
+ let angle = start;
+ while( [ angle <= end, angle < end ][ end >= 360 + start ] ){
+ if( accelerate == 0 ){ CreateShot01( GetX(), GetY(), speed, angle, type, delay ); }
+ else{ CreateShot02( GetX(), GetY(), speed, angle, accelerate, max, type, delay ); }
+ angle += space;
+ }
+}
+function _WayShot01( let start, let end, let space, let speed, let type, let delay ){ _WayShot02( start, end, space, speed, 0, speed, type, delay ); }
+function WayShotGap01( let limit, let space, let speed, let type, let delay, let gap ){ _WayShot01( -limit + gap, limit + gap, space, speed, type, delay ); }
+function WayShot01( let limit, let space, let speed, let type, let delay ){ WayShotGap01( limit, space, speed, type, delay, 0 ); }
+function CircleShotGap01( let space, let speed, let type, let delay, let gap ){ _WayShot01( gap, 360 + gap, space, speed, type, delay ); }
+function CircleShot01( let space, let speed, let type, let delay ){ CircleShotGap01( space, speed, type, delay, 0 ); }
+function WayShotGap02( let limit, let space, let speed, let accelerate, let max, let type, let delay, let gap ){ _WayShot02( -limit + gap, limit + gap, space, speed, accelerate, max, type, delay ); }
+function WayShot02( let limit, let space, let speed, let accelerate, let max, let type, let delay ){ WayShotGap02( limit, space, speed, accelerate, max, type, delay, 0 ); }
+function CircleShotGap02( let space, let speed, let accelerate, let max, let type, let delay, let gap ){ _WayShot02( gap, 360 + gap, space, speed, accelerate, max, type, delay ); }
+function CircleShot02( let space, let speed, let accelerate, let max, let type, let delay ){ CircleShotGap02( space, speed, accelerate, max, type, delay, 0 ); }
+function _WayShotObject02( let object, let start, let end, let space, let speed, let accelerate, let max, let type, let delay ){
+ let angle = start;
+ while( [ angle <= end, angle < end ][ end >= 360 + start ] ){
+ if( accelerate == 0 ){ CreateShot01( Obj_GetX( object ), Obj_GetY( object ), speed, angle, type, delay ); }
+ else{ CreateShot02( Obj_GetX( object ), Obj_GetY( object ), speed, angle, accelerate, max, type, delay ); }
+ angle += space;
+ }
+}
+function _WayShotObject01( let object, let start, let end, let space, let speed, let type, let delay ){ _WayShotObject02( object, start, end, space, speed, 0, speed, type, delay ); }
+function WayShotObjectGap01( let object, let limit, let space, let speed, let type, let delay, let gap ){ _WayShotObject01( object, -limit + gap, limit + gap, space, speed, type, delay ); }
+function WayShotObject01( let object, let limit, let space, let speed, let type, let delay ){ WayShotObjectGap01( object, limit, space, speed, type, delay, 0 ); }
+function CircleShotObjectGap01( let object, let space, let speed, let type, let delay, let gap ){ _WayShotObject01( object, gap, 360 + gap, space, speed, type, delay ); }
+function CircleShotObject01( let object, let space, let speed, let type, let delay ){ CircleShotObjectGap01( object, space, speed, type, delay, 0 ); }
+function WayShotObjectGap02( let object, let limit, let space, let speed, let accelerate, let max, let type, let delay, let gap ){
+ _WayShotObject02( object, -limit + gap, limit + gap, space, speed, accelerate, max, type, delay );
+}
+function WayShotObject02( let object, let limit, let space, let speed, let accelerate, let max, let type, let delay ){ WayShotObjectGap02( object, limit, space, speed, accelerate, max, type, delay, 0 ); }
+function CircleShotObjectGap02( let object, let space, let speed, let accelerate, let max, let type, let delay, let gap ){
+ _WayShotObject02( object, gap, 360 + gap, space, speed, accelerate, max, type, delay );
+}
+function CircleShotObject02( let object, let space, let speed, let accelerate, let max, let type, let delay ){ CircleShotObjectGap02( object, space, speed, accelerate, max, type, delay, 0 ); }
+function _WayScriptShot( let name, let start, let end, let space, let speed, let delay, let argv ){
+ let angle = start;
+ while( [ angle <= end, angle < end ][ end >= 360 + start ] ){
+ CreateShotFromScript( name, GetX(), GetY(), speed, angle, delay, argv );
+ angle += space;
+ }
+}
+function ReflectObject( let object, let bottom, let side, let top ){
+ let angle = Obj_GetAngle( object ) % 360;
+ if( ( top && Obj_GetY( object ) < GetClipMinY() ) || ( bottom && Obj_GetY( object ) > GetClipMaxY() ) ){
+ Obj_SetAngle( object, -angle );
+ return true;
+ }
+ if( side && ( Obj_GetX( object ) < GetClipMinX() || Obj_GetX( object ) > GetClipMaxX() ) ){
+ Obj_SetAngle( object, 180 - angle );
+ return true;
+ }
+ return false;
+}
+function _SetObject( let x, let y, let speed, let angle, let delay, let autodelete ){
+ let obj = Obj_Create( OBJ_SHOT );
+ Obj_SetX( obj, x );
+ Obj_SetY( obj, y );
+ Obj_SetSpeed( obj, speed );
+ Obj_SetAngle( obj, angle );
+ Obj_SetAutoDelete( obj, autodelete );
+ ObjShot_SetDelay( obj, delay );
+ return obj;
+}
+function SetHiddenObject( let x, let y, let speed, let angle, let delay, let redist, let autodelete ){
+ let obj = _SetObject( x, y, speed, angle, delay, autodelete );
+ Obj_SetCollisionToPlayer( obj, false );
+ ObjShot_SetBombResist( obj, redist );
+ return obj;
+}
+function SetShotObject( let x, let y, let speed, let angle, let color, let delay ){
+ let obj = _SetObject( x, y, speed, angle, delay, true );
+ ObjShot_SetGraphic( obj, color );
+ return obj;
+}
+function MoveRotateObject( let speed, let diam, let count, let obj ){
+ Obj_SetX( obj, GetX() - cos( count * speed + GetAngle() ) * diam );
+ Obj_SetY( obj, GetY() + sin( count * speed + GetAngle() ) * diam );
+}
+function WaitObject( let obj, let frame ){
+ let count = 0;
+ while( !Obj_BeDeleted( obj ) && count < frame ){
+ yield;
+ count++;
+ }
+ return Obj_BeDeleted( obj );
+}
+function GetAngleToPlayerObject( let obj ){ return atan2( GetPlayerY() - Obj_GetY( obj ), GetPlayerX() - Obj_GetX( obj ) ); }
+function Reflect( let bottom ){
+ if( !IsOut( 0 ) ){ return false; }
+ let angle = GetAngle() % 360;
+ if( GetY() < GetClipMinY() || ( bottom && GetY() > GetClipMaxY() ) ){ SetAngle( -angle ); }
+ if( GetX() < GetClipMinX() || GetX() > GetClipMaxX() ){ SetAngle( 180 - angle ); }
+ return true;
+}
+function CircleScriptShotGap( let name, let space, let speed, let delay, let argv, let gap ){ _WayScriptShot( name, gap, 360 + gap, space, speed, delay, argv ); }
+function SetFade02( let count, let birthtime, let deathtime, let fadetime ){
+ SetAlpha( [
+ 0, [ [ 255, Smooth( 255, 0, count - ( deathtime - fadetime ), fadetime ) ][ count > deathtime - fadetime ], Smooth( 0, 255, count - birthtime, fadetime ) ][ count < birthtime + fadetime ]
+ ][ count > birthtime && count < deathtime ] );
+}
+function SetFade01( let count, let deathtime, let fadetime ){ SetFade02( count, 32767, deathtime, fadetime ); }
+function DrawChrGap( let file, let gap ){ _DrawChr( file, GetX(), GetY() + gap ); }
+function DrawChr( let file, let count ){ DrawChrGap( file, sin( count * 2.5 ) * 8 ); }
+function DrawCircle( let file, let count, let width ){
+ SetAlpha( 96 );
+ _DrawCircle( file, count, width );
+ SetAlpha( 255 );
+}
+function _DrawCircle( let file, let count, let width ){
+ SetGraphicAngle( 0, 0, -count );
+ SetGraphicRect( 0, 0, width, width );
+ DrawChrGap( file, 0 );
+ SetGraphicAngle( 0, 0, 0 );
+}
+function DrawRotate( let file, let count ){
+ SetGraphicAngle( 0, 0, count );
+ DrawChrGap( file, 0 );
+ SetGraphicAngle( 0, 0, 0 );
+}
+function WaitSpeedDown( let under ){ yield; while( GetSpeed() > under ){ yield; } }
+function WaitZeroSpeed(){ WaitSpeedDown( 0 ); }
+task TaskPlay( let sefile, let num, let interval ){
+ loop( num ){
+ PlaySEEx( sefile );
+ Wait( interval );
+ }
+}
diff --git a/th_dnh/script/thA/FUNC/Shot.dnh b/th_dnh/script/thA/FUNC/Shot.dnh
new file mode 100644
index 0000000..fe26c08
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Shot.dnh
@@ -0,0 +1,3 @@
+#include_function ".\FUNC\Shot&Enemy&Shadow.dnh"
+function Gone(){ GoneA( 32 ); }
+function GoneA( let deadline ){ if( IsOut( deadline ) ){ End(); } }
diff --git a/th_dnh/script/thA/FUNC/Stage&Shot&Enemy&Shadow.dnh b/th_dnh/script/thA/FUNC/Stage&Shot&Enemy&Shadow.dnh
new file mode 100644
index 0000000..7af15b4
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Stage&Shot&Enemy&Shadow.dnh
@@ -0,0 +1,48 @@
+#include_function ".\FUNC\Common.dnh"
+#include_function ".\BGM\index.dnh"
+#include_function ".\SE\index.dnh"
+function IsOutPos( let x, y, deadline ){ return x < GetClipMinX() - deadline || x > GetClipMaxX() + deadline || y < GetClipMinY() - deadline || y > GetClipMaxY() + deadline; }
+function IsPushDirKey(){ return GetKeyState( VK_UP ) == KEY_PUSH || GetKeyState( VK_DOWN ) == KEY_PUSH || GetKeyState( VK_LEFT ) == KEY_PUSH || GetKeyState( VK_RIGHT ) == KEY_PUSH; }
+function RandBlur( let expr ){ return rand( -expr, expr ); }
+function _DrawChr( let file, let x, let y ){
+ SetTexture( file );
+ DrawGraphic( x, y );
+}
+function _DrawChrRect( let file, let dstx, let dsty, let srcx1, let srcy1, let srcx2, let srcy2 ){
+ SetGraphicRect( srcx1, srcy1, srcx2, srcy2 );
+ _DrawChr( file, dstx, dsty );
+}
+function DrawCenter( let file ){ _DrawChr( file, GetCenterX(), GetCenterY() ); }
+function DrawPlayer( let file ){ _DrawChr( file, GetPlayerX(), GetPlayerY() ); }
+function SetColorA( let r, let g, let b ){
+ if( OnBomb() ){ SetColor( r / [ 3, 1 ][ IsReimu() ], g / [ 1, 3 ][ IsReimu() ], b / [ 1, 3 ][ IsReimu() ] ); }
+ else{ SetColor( r, g, b ); }
+}
+function DrawPlayerCircle( let file, let count ){
+ SetAlpha( 64 );
+ SetGraphicAngle( 0, 0, count * 16 );
+ SetGraphicRect( 0, 0, 64, 64 );
+ DrawPlayer( file );
+ SetGraphicAngle( 0, 0, 0 );
+ SetAlpha( 255 );
+}
+function DeleteGraphicList( let GraphicFileList, let SEFileList ){
+ ascent( let i in 0..2 ){
+ ascent( let j in 0..[ length( GraphicFileList ), length( SEFileList ) ][ i ] ){
+ alternative( i )
+ case( 0 ){ DeleteGraphic( GraphicFileList[ j ] ); }
+ case( 1 ){ DeleteSE( SEFileList[ j ] ); }
+ }
+ }
+}
+function MuteMusic(){ ascent( let i in 1..18 ){ DeleteMusic( bgmList[ i ] ); } }
+function Wait( let frame ){ if( frame > 0 ){ loop( frame ){ yield }; } }
+function WaitZeroEnemy(){ while( GetEnemyNum() != 0 ){ yield; } }
+task PlayMusicEx( let no ){
+ ascent( let i in 1..19 ){ if( i != no ){ DeleteMusic( bgmList[ i ] ); } }
+ if( no != 0 ){ SetCommonData( "NowBGM", no ); }
+ Wait( 30 );
+ if( GetCommonDataDefault( "BGMEnable", true ) ){ PlayMusic( bgmList[ no ] ); }
+}
+function PlaySEEx( let file ){ if( GetCommonDataDefault( "SEEnable", true ) ){ PlaySE( file ); } }
+function SaveEx(){ if( !IsReplay() ){ SaveCommonData(); } }
diff --git a/th_dnh/script/thA/FUNC/Stage.dnh b/th_dnh/script/thA/FUNC/Stage.dnh
new file mode 100644
index 0000000..9bc1436
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Stage.dnh
@@ -0,0 +1,236 @@
+#include_function ".\FUNC\Stage&Shot&Enemy&Shadow.dnh"
+#include_function ".\IMAGE\index.dnh"
+#include_function ".\index_zako.dnh"
+#include_function ".\index_boss.dnh"
+function MenuSelect( let value, let sefile, let max ){
+ let res = value;
+ if( IsPushDirKey() ){
+ PlaySEEx( sefile );
+ res = MinMaxLoop( value + [ 1, -1 ][ GetKeyState( VK_UP ) == KEY_PUSH || GetKeyState( VK_LEFT ) == KEY_PUSH ], 0, max );
+ }
+ return res;
+}
+function Extend( let players ){ CreateEnemyFromFile( _enemyExtend, GetPlayerX(), GetPlayerY(), 0, 0, players ); }
+function MotionBlurStage( let frame ){ CreateEnemyFromFile( _enemyBlur, 0, 0, 0, 0, frame ); }
+function LoadProgress( let now, let GraphicFileList, let SEFileList, let EnemyFileList ){
+ let graphiclistlen = length( GraphicFileList );
+ let selistlen = length( SEFileList );
+ let enemylistlen = length( EnemyFileList );
+ let total = graphiclistlen + selistlen + enemylistlen;
+ if( total - now <= 0 ){
+ SetCommonData( "LoadingProgress", -1 );
+ return;
+ }
+ SetCommonData( "LoadingProgress", Smooth( 100, 0, total - now, total ) );
+ if( now < graphiclistlen ){ LoadGraphic( GraphicFileList[ now ] ); }
+ else if( now - graphiclistlen < selistlen ){
+ // ↓ ↑のifと統合してはいけない→SEEnableがFalseの場合先に敵データを読もうとしてしまうため
+ if( GetCommonDataDefault( "SEEnable", true ) ){ LoadSE( SEFileList[ now - graphiclistlen ] ); }
+ }
+ else{ CompileEnemyFromFile( EnemyFileList[ now - ( graphiclistlen + selistlen ) ] ); }
+}
+function StageLoad( let graphiclist, let selist, let enemylist ){
+ let num = 0;
+ while( num == 0 || GetCommonDataDefault( "LoadingProgress", -1 ) != -1 ){
+ LoadProgress( num, graphiclist, selist, enemylist );
+ yield;
+ num++;
+ }
+}
+function DrawProgress( let ImageProgressBar, let ImageProgressBG, let ImageNumSmall, let width, let height, let BottomMargin ){
+ let progress = GetCommonDataDefault( "LoadingProgress", -1 );
+ if( progress == -1 ){ return; }
+ let widthhalf = width / 2;
+ _DrawChrRect( ImageProgressBG, GetCenterX(), GetClipMaxY() - BottomMargin, 0, 0, width, height );
+ SetGraphicExpansion( Smooth( 0, 1, progress, 100 ), 1 );
+ _DrawChr( ImageProgressBar, GetCenterX() - Smooth( widthhalf, 0, progress, 100 ), GetClipMaxY() - BottomMargin );
+ SetGraphicExpansion( 1, 1 );
+ DrawNumSmall( ImageNumSmall, progress, GetCenterX() + widthhalf, GetClipMaxY() - BottomMargin + 20 );
+}
+function SetMainMenuRect( let num, let lineheight, let width, let height ){ SetGraphicRect( 0, num * lineheight, width, height + num * lineheight ); }
+function DrawMainMenu( let file, let num, let gap ){
+ SetMainMenuRect( num, 51, 256, 50 );
+ _DrawChr( file, GetCenterX() + gap + num * 4, 224 + num * 40 );
+}
+function DrawMenuHeading( let file, let num, let now ){
+ SetAlpha( Smooth( 0, 255, now, 20 ) );
+ SetMainMenuRect( num, 50.4, 256, 50 );
+ _DrawChr( file, GetClipMaxX() - Smooth( 112, 128, now, 20 ), GetClipMinY() + 26 );
+ SetAlpha( 255 );
+}
+function DrawBoolean( let file, let bool, let x, let y ){
+ SetMainMenuRect( !bool, 37.35, 128, 38 );
+ _DrawChr( file, x, y );
+}
+function _DrawNum( let file, let num, let x, let y, let width, let height, let srcy, let gradespace ){
+ let str = ToStringInt( num );
+ let bytes = length( str );
+ ascent( let pos in 0..bytes ){
+ let xx = CharToInteger( str[ bytes - 1 - pos ] ) * width;
+ _DrawChrRect( file, x - pos * gradespace, y, xx + 1, 1 + srcy, xx + width + 1, height + srcy );
+ }
+}
+function DrawNum( let file, let num, let x, let y ){ _DrawNum( file, num, x, y, 25.3, 44, 0, 26 ); }
+function DrawNumMiddle( let file, let num, let x, let y ){ _DrawNum( file, num, x, y, 12, 22, 0, 12 ); }
+function DrawNumSmall( let file, let num, let x, let y ){ _DrawNum( file, num, x, y, 8, 16, 0, 7 ); }
+function DrawResultNum( let file, let num, let line, let y ){
+ let height = 24;
+ _DrawNum( file, num, GetClipMaxX() - 32, y, 15, 24, 24 * [ 0, 0, 0, 1, 1, 1, 2, 2, 3 ][ line ], 13 );
+}
+function FadeMainMenu( let file, let num, let now ){
+ SetAlpha( Smooth( 255, 0, now, 20 ) );
+ DrawMainMenu( file, num, 48 );
+ SetAlpha( 255 );
+}
+function DrawSpell( let imgname, let imgbonus, let imgnum ){
+ let spell = GetCommonDataDefault( "Spell", [ -32767, 0, 0 ] );
+ if( spell[ 0 ] >= 0 ){
+ let bonus = GetCommonDataDefault( "SpellBonus", [ 0, 32767 ] );
+ let cutin = GetCommonDataDefault( "SpellCutIn", "" );
+ let playhistory = GetCommonData( "SpellPlayHistory" );
+ let gethistory = GetCommonData( "SpellGetHistory" );
+ let alpha = Smooth( 0, 255, bonus[ 1 ], 90 );
+ if( bonus[ 1 ] < 200 ){
+ let ex = Accelerate( 1, 3, bonus[ 1 ] - 130, 50 );
+ if( bonus[ 1 ] < 100 ){ SetAlpha( alpha ); }
+ else{ SetAlpha( Smooth( 255, 0, bonus[ 1 ] - 130, 50 ) ); }
+ SetGraphicScale( ex, ex );
+ _DrawChrRect( cutin, GetClipMaxX() - SlowDown( 384, 96, bonus[ 1 ], 90 ), GetCenterY(), 0, 0, spell[ 1 ], spell[ 2 ] );
+ SetGraphicScale( 1, 1 );
+ if( bonus[ 1 ] - 130 > 0 ){ _DrawChr( cutin, GetClipMaxX() - 96, GetCenterY() ); }
+ }
+ let srcx;
+ let srcy;
+ let orgno;
+ if( spell[ 0 ] < 27 ){
+ let level = GetCommonDataDefault( "Level", 0 );
+ srcx = level * 256;
+ srcy = spell[ 0 ] * 24;
+ orgno = spell[ 0 ] * 4 + level;
+ }
+ else{
+ let num = spell[ 0 ] - 27;
+ srcx = ( num % 4 ) * 256;
+ srcy = trunc( num / 4 ) * 24 + 648;
+ orgno = spell[ 0 ] + 81;
+ }
+ let dstx = GetClipMinX() + SlowDown( 512, 128, bonus[ 1 ], 90 );
+ let dsty = GetCenterY() - SplineFakeSFS( 0, 184, bonus[ 1 ] - 130, 50 );
+ SetAlpha( Smooth( Min( 32, alpha ), alpha, Hypot( dstx - GetPlayerX(), dsty + 16 - GetPlayerY() ), 112 ) );
+ _DrawChrRect( imgname, dstx, dsty, srcx, srcy, srcx + 256, srcy + 24 );
+ _DrawChrRect( imgbonus, dstx - 92, dsty + 16, 0, 16, 64, 32 );
+ _DrawChrRect( imgbonus, dstx - 24, dsty + 16, 0, 32, 16, 48 );
+ _DrawChrRect( imgbonus, dstx - 92, dsty + 28, 0, 0, 64, 16 );
+ DrawNumSmall( imgnum, gethistory[ orgno ], dstx - 40, dsty + 16 );
+ DrawNumSmall( imgnum, playhistory[ orgno ], dstx + 8, dsty + 16 );
+ DrawNumSmall( imgnum, bonus[ 0 ], dstx - 16, dsty + 28 );
+ SetAlpha( 255 );
+ }
+}
+function Ready( let seok ){
+ if( !GetCommonDataDefault( "Practice", false ) ){
+ SetCommonData( "Ready", true );
+ let time = 0;
+ while( time < 1200 ){
+ if( GetKeyState( VK_SHOT ) == KEY_PUSH ){
+ PlaySEEx( seok );
+ time = 1200;
+ }
+ yield;
+ time++;
+ }
+ SetCommonData( "Ready", false );
+ ClearBGEffect();
+ }
+}
+function ClearBGEffect(){
+ loop( length( BGEffectX ) ){
+ BGEffectX = erase( BGEffectX, 0 );
+ BGEffectY = erase( BGEffectY, 0 );
+ BGEffectZ = erase( BGEffectZ, 0 );
+ BGEffectLife = erase( BGEffectLife, 0 );
+ BGEffectParam = erase( BGEffectParam, 0 );
+ BGEffectVectorX = erase( BGEffectVectorX, 0 );
+ BGEffectVectorY = erase( BGEffectVectorY, 0 );
+ BGEffectVectorZ = erase( BGEffectVectorZ, 0 );
+ }
+/*
+ BGEffectX = [];
+ BGEffectY = [];
+ BGEffectZ = [];
+ BGEffectLife = [];
+ BGEffectParam = [];
+ BGEffectVectorX = [];
+ BGEffectVectorY = [];
+ BGEffectVectorZ = [];
+*/
+}
+function AddBGEffect( let x, let y, let z, let vectorx, let vectory, let vectorz, let limit, let param ){
+ BGEffectX = BGEffectX ~ [ x ];
+ BGEffectY = BGEffectY ~ [ y ];
+ BGEffectZ = BGEffectZ ~ [ z ];
+ BGEffectLife = BGEffectLife ~ [ limit ];
+ BGEffectParam = BGEffectParam ~ [ param ];
+ BGEffectVectorX = BGEffectVectorX ~ [ vectorx ];
+ BGEffectVectorY = BGEffectVectorY ~ [ vectory ];
+ BGEffectVectorZ = BGEffectVectorZ ~ [ vectorz ];
+ return length( BGEffectX ) - 1;
+}
+function MoveBGEffect(){
+ let i = 0;
+ while( i < length( BGEffectX ) ){
+ if( BGEffectLife[ i ] <= 0 && BGEffectLife[ i ] != -65535 ){
+ BGEffectX = erase( BGEffectX, i );
+ BGEffectY = erase( BGEffectY, i );
+ BGEffectZ = erase( BGEffectZ, i );
+ BGEffectLife = erase( BGEffectLife, i );
+ BGEffectParam = erase( BGEffectParam, i );
+ BGEffectVectorX = erase( BGEffectVectorX, i );
+ BGEffectVectorY = erase( BGEffectVectorY, i );
+ BGEffectVectorZ = erase( BGEffectVectorZ, i );
+ }
+ else{
+ BGEffectX[ i ] = BGEffectX[ i ] + BGEffectVectorX[ i ];
+ BGEffectY[ i ] = BGEffectY[ i ] + BGEffectVectorY[ i ];
+ BGEffectZ[ i ] = BGEffectZ[ i ] + BGEffectVectorZ[ i ];
+ if( BGEffectLife[ i ] != -65535 ){ BGEffectLife[ i ] = BGEffectLife[ i ] - 1; }
+ i++;
+ }
+ }
+}
+function SetPhase( let phase ){
+ Phase = phase;
+ PhaseStartCount = count + 1;
+}
+function NextPhase(){ SetPhase( Phase + 1 ); }
+function ReadData(){
+ SpellCardGetHistory = GetCommonDataDefault( "SpellGetHistory", SpellCardGetHistory );
+ SpellCardPlayHistory = GetCommonDataDefault( "SpellPlayHistory", SpellCardPlayHistory );
+ SpellCardHighScore = GetCommonDataDefault( "SpellHighScore", SpellCardHighScore );
+ MusicRelease = GetCommonDataDefault( "MusicRelease", MusicRelease );
+ StageRelease = GetCommonDataDefault( "StageRelease", StageRelease );
+ StageHighScore = GetCommonDataDefault( "StageHighScore", StageHighScore );
+}
+function CreateSaveData(){
+ SetCommonData( "SpellGetHistory", SpellCardGetHistory );
+ SetCommonData( "SpellPlayHistory", SpellCardPlayHistory );
+ SetCommonData( "SpellHighScore", SpellCardHighScore );
+ SetCommonData( "MusicRelease", MusicRelease );
+ SetCommonData( "StageRelease", StageRelease );
+ SetCommonData( "StageHighScore", StageHighScore );
+}
+function DataMinimize(){
+ let optioncontinue = GetCommonDataDefault( "Continue", 1 );
+ let optionbgg = GetCommonDataDefault( "BGGEnable", true );
+ let optionbge = GetCommonDataDefault( "BGEEnable", true );
+ let optionbgm = GetCommonDataDefault( "BGMEnable", true );
+ let optionse = GetCommonDataDefault( "SEEnable", true );
+ ReadData();
+ ClearCommonData();
+ SetCommonData( "Continue", optioncontinue );
+ SetCommonData( "BGGEnable", optionbgg );
+ SetCommonData( "BGEEnable", optionbge );
+ SetCommonData( "BGMEnable", optionbgm );
+ SetCommonData( "SEEnable", optionse );
+ CreateSaveData();
+}
diff --git a/th_dnh/script/thA/FUNC/Zako.dnh b/th_dnh/script/thA/FUNC/Zako.dnh
new file mode 100644
index 0000000..910ecc1
--- /dev/null
+++ b/th_dnh/script/thA/FUNC/Zako.dnh
@@ -0,0 +1,19 @@
+#include_function ".\FUNC\Enemy.dnh"
+function DrawYosei( let file, let count ){
+ let x = [ ( trunc( count / 5 ) % 3 ), 1 ][ GetSpeed() >= 2 ] * 32;
+ SetGraphicRect( x, 0, x + 32, 30 );
+ DrawChr( file, count );
+}
+task KedamaWay( let sefile, let type, let level ){
+ loop( 12 ){
+ SetShotDirectionType( PLAYER );
+ let speed = [ 2.6, 2 ][ level % 2 ];
+ loop( 3 + level * 2 ){
+ CircleShotGap01( [ 120, 90, 72, 60 ][ level ], speed, [ RED05, BLUE05 ][ type % 2 ], 10, [ 0, [ 60, 45, 36, 30 ][ level ] ][ type % 2 ] );
+ speed += 0.5;
+ }
+ PlaySEEx( sefile );
+ if( GetY() > GetClipMaxX() - 80 ){ return; }
+ Wait( 24 );
+ }
+}
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Alice.png b/th_dnh/script/thA/IMAGE/CUTIN/Alice.png
new file mode 100644
index 0000000..ae221c6
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Alice.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6d8902f0963dee4b4a195202714b07234c21f2c5fd0ec6faf9fd39a15fcf5bc2
+size 30798
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Kene.png b/th_dnh/script/thA/IMAGE/CUTIN/Kene.png
new file mode 100644
index 0000000..4983922
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Kene.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6e0c938b4bb6f911dd58641e53fce376c94cd167eea4a46a4a3f8a1c13eacc7
+size 45114
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Leila.png b/th_dnh/script/thA/IMAGE/CUTIN/Leila.png
new file mode 100644
index 0000000..abf21ca
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Leila.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8197543dfa2d923bb8062e7be75e13031ed5a76ce4f7b9a4a4c04d00eca4121b
+size 107989
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Leila2.png b/th_dnh/script/thA/IMAGE/CUTIN/Leila2.png
new file mode 100644
index 0000000..c600c97
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Leila2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:184d0ad6bfa1d75579f836c6d98b20c79f4cffdbf4617afbbf8c1935a9c6560b
+size 68948
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Letty.png b/th_dnh/script/thA/IMAGE/CUTIN/Letty.png
new file mode 100644
index 0000000..a88098a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Letty.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:cf5b8611acf43316c2d15f5fa836e56272d82b9058895b9c044c3436ff6ecb1e
+size 29239
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Lily.png b/th_dnh/script/thA/IMAGE/CUTIN/Lily.png
new file mode 100644
index 0000000..fcc119a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Lily.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c8da5d9b27a846bb4b4aa79a5e06bf385a8ff2568f6a781057b27440adb12658
+size 47292
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Lily2.png b/th_dnh/script/thA/IMAGE/CUTIN/Lily2.png
new file mode 100644
index 0000000..ec9b2c7
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Lily2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4365e2e1091d706e4545add373eaa369be89ae2ecc3ae0747e125d3eb7476dcc
+size 50472
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Marisa.png b/th_dnh/script/thA/IMAGE/CUTIN/Marisa.png
new file mode 100644
index 0000000..99cfb34
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Marisa.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b2f7c9a8ed21fd832ade48e2a1b68eb91df14f8bbb58892b2a50fab87ccf78d5
+size 32925
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Marisa2.png b/th_dnh/script/thA/IMAGE/CUTIN/Marisa2.png
new file mode 100644
index 0000000..9b2fd73
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Marisa2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0019d28451d56075fe966576ab3f76838baa7bba1023364476a92d83bf85fd4d
+size 37054
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Marisa3.png b/th_dnh/script/thA/IMAGE/CUTIN/Marisa3.png
new file mode 100644
index 0000000..0d79a46
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Marisa3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8ffd199fcad2a884752873973749f459b7027c208f64b9c005e4e66299e48308
+size 31717
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Marisa4.png b/th_dnh/script/thA/IMAGE/CUTIN/Marisa4.png
new file mode 100644
index 0000000..e213120
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Marisa4.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2f720e6511827553be1a30a967f7cf80ff3a79183fd04b6bf3f069c426804576
+size 36148
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Merry.png b/th_dnh/script/thA/IMAGE/CUTIN/Merry.png
new file mode 100644
index 0000000..5558d7c
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Merry.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a250fe31a50d692272d6ea888c9e2c51aaa50b9418da185856a71d9774924e1c
+size 25709
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Merry2.png b/th_dnh/script/thA/IMAGE/CUTIN/Merry2.png
new file mode 100644
index 0000000..a64e861
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Merry2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:96eb46e1ef65cc7e7782fe8ff17f1ee21ac124febfb83c0f17410bf906c97c24
+size 29397
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/NAME/Alice.png b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Alice.png
new file mode 100644
index 0000000..49381e5
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Alice.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9268a833c81dbca048a1d4f6b50d731892cd65c3a2db7e78cac431a74265bf46
+size 10535
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/NAME/Kene.png b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Kene.png
new file mode 100644
index 0000000..0e0644b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Kene.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:24fdebd0d65e4e6a452d64f58681bc4b767b3dcc57394f6e02a3191ba965a0ba
+size 9594
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/NAME/Leila.png b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Leila.png
new file mode 100644
index 0000000..28e3361
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Leila.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:624a8f14d1b9e4cb279828df2dd36db9afbc9875e0c696f6c6d4a6628b3ea6bc
+size 10063
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/NAME/Lily.png b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Lily.png
new file mode 100644
index 0000000..4c7d64e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Lily.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4361a649b3d2e8dccb9f5c226be7384bfbafc3692d7639f2196f5adf36bd1c6f
+size 7630
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/NAME/Merry.png b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Merry.png
new file mode 100644
index 0000000..e9515f5
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Merry.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:33740c80588f6acbee74147901c2af64467736c8ab0d00631385495ea869e1e4
+size 10145
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/NAME/Renko.png b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Renko.png
new file mode 100644
index 0000000..e5aaece
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Renko.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:01c32d3c5c2ab53887011c735ea9719fa34390322035309cb37b41be4401da69
+size 7955
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/NAME/Sakuya.png b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Sakuya.png
new file mode 100644
index 0000000..fd50536
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/NAME/Sakuya.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d17c75f932da8ea6b1612a86dc275de0c0178b95b5d203f1474d69b201d3b86b
+size 8538
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/NAME/index.dnh b/th_dnh/script/thA/IMAGE/CUTIN/NAME/index.dnh
new file mode 100644
index 0000000..7cef31d
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/NAME/index.dnh
@@ -0,0 +1,7 @@
+let imgNameAlice = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\NAME\Alice.png";
+let imgNameKene = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\NAME\Kene.png";
+let imgNameLeila = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\NAME\Leila.png";
+let imgNameLily = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\NAME\Lily.png";
+let imgNameMerry = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\NAME\Merry.png";
+let imgNameRenko = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\NAME\Renko.png";
+let imgNameSakuya = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\NAME\Sakuya.png";
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Reimu.png b/th_dnh/script/thA/IMAGE/CUTIN/Reimu.png
new file mode 100644
index 0000000..978ee93
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Reimu.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:53305839a2fdac236706e59554ea2dd84633c87dd0b154ed9e0566d30ab18580
+size 38791
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Reimu2.png b/th_dnh/script/thA/IMAGE/CUTIN/Reimu2.png
new file mode 100644
index 0000000..30ecb58
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Reimu2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:91eb93fcbac31e89b2ce91c6cedb381dc5afece0e7118e96e9ea02fee7992674
+size 39121
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Reimu3.png b/th_dnh/script/thA/IMAGE/CUTIN/Reimu3.png
new file mode 100644
index 0000000..8878702
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Reimu3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0848d669819784ed3b298b4638c2e369cde166adc1754b6cbf38cf8f0ec3d861
+size 39335
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Reimu4.png b/th_dnh/script/thA/IMAGE/CUTIN/Reimu4.png
new file mode 100644
index 0000000..3a8b4e1
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Reimu4.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c120aa53c122d19fe283ebadc94a5682221bc5144c84071f7142ac90dedc5bd4
+size 38350
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Reimu5.png b/th_dnh/script/thA/IMAGE/CUTIN/Reimu5.png
new file mode 100644
index 0000000..2375f24
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Reimu5.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5a2532f3cc84b42214dcd0572f9f33f6a73e07f9687def8531395c4d07052117
+size 38366
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Renko.png b/th_dnh/script/thA/IMAGE/CUTIN/Renko.png
new file mode 100644
index 0000000..9fa7e6a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Renko.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:16384e7d92deeaee4a055e20653a8edf958af4fed7d98d88ed912679bf6aa111
+size 25676
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/Renko2.png b/th_dnh/script/thA/IMAGE/CUTIN/Renko2.png
new file mode 100644
index 0000000..e1d2c1b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/Renko2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3d00c42f3286db97a90ae3ec1878a89e84f84fc4c4348346fc1197b1f6ac98b5
+size 26671
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/index.dnh b/th_dnh/script/thA/IMAGE/CUTIN/index.dnh
new file mode 100644
index 0000000..ea9b43b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/index.dnh
@@ -0,0 +1,2 @@
+#include_function ".\IMAGE\CUTIN\index_mini.dnh"
+#include_function ".\IMAGE\CUTIN\NAME\index.dnh"
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/index_mini.dnh b/th_dnh/script/thA/IMAGE/CUTIN/index_mini.dnh
new file mode 100644
index 0000000..d08ab05
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/index_mini.dnh
@@ -0,0 +1,21 @@
+let imgCutInAlice = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Alice.png";
+let imgCutInKene = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Kene.png";
+let imgCutInLeila = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Leila.png";
+let imgCutInLeilaCry = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Leila2.png";
+let imgCutInLetty = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Letty.png";
+let imgCutInLily = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Lily.png";
+let imgCutInLilyCry = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Lily2.png";
+let imgCutInMarisa = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Marisa.png";
+let imgCutInMarisa2 = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Marisa2.png";
+let imgCutInMarisa3 = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Marisa3.png";
+let imgCutInMarisa4 = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Marisa4.png";
+let imgCutInMerry = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Merry.png";
+let imgCutInMerryCry = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Merry2.png";
+let imgCutInReimu = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Reimu.png";
+let imgCutInReimu2 = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Reimu2.png";
+let imgCutInReimu3 = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Reimu3.png";
+let imgCutInReimu4 = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Reimu4.png";
+let imgCutInReimu5 = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Reimu5.png";
+let imgCutInRenko = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Renko.png";
+let imgCutInRenkoCry = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Renko2.png";
+let imgCutInSakuya = GetCurrentScriptDirectory() ~ "IMAGE\CUTIN\Sakuya.png";
diff --git a/th_dnh/script/thA/IMAGE/CUTIN/sakuya.png b/th_dnh/script/thA/IMAGE/CUTIN/sakuya.png
new file mode 100644
index 0000000..20d63ce
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/CUTIN/sakuya.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9f3a6820553fcce48551f6d341ac3e63e0e17626264dd916dacb1576b8cff991
+size 35620
diff --git a/th_dnh/script/thA/IMAGE/ED/0.png b/th_dnh/script/thA/IMAGE/ED/0.png
new file mode 100644
index 0000000..4cb845a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ED/0.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e2a0cde247e7afddef714bdfa86a4d2342cfce25dcf9b76b51f64a0054713cc6
+size 197877
diff --git a/th_dnh/script/thA/IMAGE/ED/Marisa1.png b/th_dnh/script/thA/IMAGE/ED/Marisa1.png
new file mode 100644
index 0000000..cfcf1e2
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ED/Marisa1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:39163528b30af6267541238c961bb1aed0ae46f33af0c4b936ace866a2cb6f1f
+size 214662
diff --git a/th_dnh/script/thA/IMAGE/ED/Marisa2.png b/th_dnh/script/thA/IMAGE/ED/Marisa2.png
new file mode 100644
index 0000000..0111bb0
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ED/Marisa2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57231d722289dfbd48a40ed7497994f8ced4767d5ad792f44b6a8696c90f4cf7
+size 207485
diff --git a/th_dnh/script/thA/IMAGE/ED/Marisa3.png b/th_dnh/script/thA/IMAGE/ED/Marisa3.png
new file mode 100644
index 0000000..5de26b5
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ED/Marisa3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2a9521218e9684cfd5dd3ca979d152f60e2fc9ec922eef0bdab29140234213a
+size 223142
diff --git a/th_dnh/script/thA/IMAGE/ED/Reimu1.png b/th_dnh/script/thA/IMAGE/ED/Reimu1.png
new file mode 100644
index 0000000..fd29d8c
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ED/Reimu1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9f2cba68896dc038187d6be212b16e7732a97562ef442a37f60a899533a09fc3
+size 212529
diff --git a/th_dnh/script/thA/IMAGE/ED/Reimu2.png b/th_dnh/script/thA/IMAGE/ED/Reimu2.png
new file mode 100644
index 0000000..fee8a97
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ED/Reimu2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:416803bbfadd291506cd9c531ae14b9d205430b7d75bd032601f4a6a6f57abe7
+size 228887
diff --git a/th_dnh/script/thA/IMAGE/ED/Reimu3.png b/th_dnh/script/thA/IMAGE/ED/Reimu3.png
new file mode 100644
index 0000000..21781c1
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ED/Reimu3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3a5153847558d622040798547c5097eae63267adecf431c3249d9dccb9a560dd
+size 221675
diff --git a/th_dnh/script/thA/IMAGE/ED/index.dnh b/th_dnh/script/thA/IMAGE/ED/index.dnh
new file mode 100644
index 0000000..09736f2
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ED/index.dnh
@@ -0,0 +1,9 @@
+let imgED = [
+ GetCurrentScriptDirectory() ~ "IMAGE\ED\0.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ED\Reimu1.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ED\Reimu2.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ED\Reimu3.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ED\Marisa1.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ED\Marisa2.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ED\Marisa3.png"
+];
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Alice.png b/th_dnh/script/thA/IMAGE/ENEMY/Alice.png
new file mode 100644
index 0000000..efb6650
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Alice.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90fc462f52d583e1104b216a1048ef14cee3a8c06d2c866e32f9475e0cbeaef6
+size 3485
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/0.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/0.png
new file mode 100644
index 0000000..c8d1f1b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/0.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bcf7fe2a804ed51a41c103118e0805cac0f3d64c6a04dbe1554875bb811308cf
+size 60201
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/1.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/1.png
new file mode 100644
index 0000000..6f61d93
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b80cf07539d73d98f491e4f731feb7892a7ee006fcda97a1217a9185140d8578
+size 68764
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/2.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/2.png
new file mode 100644
index 0000000..906abcb
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ce0ec4a5e175b911e6f2840dc862430d91db4ef63a0aa068f882517110c4f417
+size 64784
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/3.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/3.png
new file mode 100644
index 0000000..27c7069
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ae3c865a219b2ddb2b12a0bca7029a57f6783cd820abaead7f5612d38c2efe5b
+size 62156
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/4.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/4.png
new file mode 100644
index 0000000..ba22ce3
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/4.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:86606eb9935e94d5459faf02050df87f09492dcf6241ee0f9ede48ac64f74e7c
+size 60585
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/5.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/5.png
new file mode 100644
index 0000000..a6ee2e7
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/5.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d94c2a693988525e8bd453bbffaaa637a18e288be1b2e209b55299b038dd4d3b
+size 63667
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/6.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/6.png
new file mode 100644
index 0000000..3766150
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/6.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e31bce73091d75e2dde648fab60200ae27355aa582254d0ec9b75aea2d9e157d
+size 64237
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/7.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/7.png
new file mode 100644
index 0000000..ae9d4dd
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/7.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0f1356adf0450599b760082677451f5606539fc87c9acb80f74800123ab39b78
+size 64134
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/8.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/8.png
new file mode 100644
index 0000000..9f9a8e4
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/8.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:abd0553a2c7f810d0da0d36bceddd9c891f52d4a7c8402d4238fe226418cce12
+size 64328
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/9.png b/th_dnh/script/thA/IMAGE/ENEMY/BAT/9.png
new file mode 100644
index 0000000..4bf1c3a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/9.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9e0afe5b6213c29494257c40c990168802c5b696ae00ea9a41e6c04e567afeff
+size 62614
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/BAT/index.dnh b/th_dnh/script/thA/IMAGE/ENEMY/BAT/index.dnh
new file mode 100644
index 0000000..5f73bad
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/BAT/index.dnh
@@ -0,0 +1,12 @@
+let imgEnemyBat = [
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\0.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\1.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\2.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\3.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\4.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\5.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\6.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\7.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\8.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\BAT\9.png"
+];
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/China.png b/th_dnh/script/thA/IMAGE/ENEMY/China.png
new file mode 100644
index 0000000..d16c033
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/China.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b0778c0a0d37536b8f29846d99be8ac80c3388d98212a3586b8ad6af7d753292
+size 5080
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Daiyosei.png b/th_dnh/script/thA/IMAGE/ENEMY/Daiyosei.png
new file mode 100644
index 0000000..316206e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Daiyosei.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8d4fc2b19af36879beec4868b931c2c8248a8a52c5dc0c7b1017ff96deefe69b
+size 4297
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Aqua.png b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Aqua.png
new file mode 100644
index 0000000..45cb557
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Aqua.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:743fdd1947153c86ef23babd46dd63945a3e99638550473942eb840bc950c77b
+size 2736
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Blue.png b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Blue.png
new file mode 100644
index 0000000..4927b3d
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Blue.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3b8d18346d3a5f2c6f458d59879a55175984da90c2b2d4dc283953a8e932121d
+size 2769
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Green.png b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Green.png
new file mode 100644
index 0000000..9599c47
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Green.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8aa769eaa0dfb8edb871859346086192fa3de840de6916c6ff908ec178e2d0de
+size 2776
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Orange.png b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Orange.png
new file mode 100644
index 0000000..9e3c7ec
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Orange.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3ce61e5ebf50338f1f62c0ce09d5d5af61c5c849428233a5780ec8043fdca8da
+size 2790
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Purple.png b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Purple.png
new file mode 100644
index 0000000..e223d0c
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Purple.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:54a16ea203084a25e233d23313b15ee3355bf17a59a0eb842873537bfde61f36
+size 2738
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Red.png b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Red.png
new file mode 100644
index 0000000..8fa9492
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Red.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:468d127e708ac48ddbedebecfdbf8c03a0c89f80dba384fcd5f62c1596342124
+size 2773
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/White.png b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/White.png
new file mode 100644
index 0000000..3e1e63e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/White.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:414fe1d552f785aa7956013f4df351c5705c1d6accc589140f35d30448c195ad
+size 2701
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Yellow.png b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Yellow.png
new file mode 100644
index 0000000..f6adc4d
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/Yellow.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:895b967203ed8b8f3c1ec37cbe978f84e4c0584679ace67b4690087fdb9bf4f2
+size 2732
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/index.dnh b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/index.dnh
new file mode 100644
index 0000000..4b9b1cd
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/KEDAMA/index.dnh
@@ -0,0 +1,8 @@
+let imgEnemyKedamaAqua = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\KEDAMA\Aqua.png";
+let imgEnemyKedamaBlue = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\KEDAMA\Blue.png";
+let imgEnemyKedamaGreen = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\KEDAMA\Green.png";
+let imgEnemyKedamaPurple = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\KEDAMA\Purple.png";
+let imgEnemyKedamaRed = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\KEDAMA\Red.png";
+let imgEnemyKedamaOrange = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\KEDAMA\Orange.png";
+let imgEnemyKedamaWhite = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\KEDAMA\White.png";
+let imgEnemyKedamaYellow = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\KEDAMA\Yellow.png";
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Kene.png b/th_dnh/script/thA/IMAGE/ENEMY/Kene.png
new file mode 100644
index 0000000..e362c74
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Kene.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b2c5decaad41851eca3c6b0e07a68971e6805f3b773d24210b67881992f2fefc
+size 5566
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Leila.png b/th_dnh/script/thA/IMAGE/ENEMY/Leila.png
new file mode 100644
index 0000000..937383c
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Leila.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5fc4f4e18a61a9ff0bb46f27af2e7789959328442216386cf00357abb171755f
+size 3673
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Letty.png b/th_dnh/script/thA/IMAGE/ENEMY/Letty.png
new file mode 100644
index 0000000..6fc4579
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Letty.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:759d527c48da6a958ab91d5cf44ad90dc38cdd25655b80c99b14879217b5089f
+size 2975
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Lily.png b/th_dnh/script/thA/IMAGE/ENEMY/Lily.png
new file mode 100644
index 0000000..e6fe3f3
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Lily.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4846569b7d3bc4f797f83e8a77cf896df4507bc5ae8c1c5e3d07e062ad673e83
+size 5995
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Merry.png b/th_dnh/script/thA/IMAGE/ENEMY/Merry.png
new file mode 100644
index 0000000..ec40395
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Merry.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7932a765160c06e6c700e1cbabfbaa1bf7bbe31179a5092a7ac4d1e05d5cb595
+size 3197
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/0.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/0.png
new file mode 100644
index 0000000..8d9bbaa
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/0.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:109b253eed1302989a2f1ca2bacec9c364fb5614c005c439bfff30f63ecc289b
+size 43422
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/1.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/1.png
new file mode 100644
index 0000000..ade0820
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ceae965be00fcd4b88bbfbfdc3ce63b8a672a1b5da72b7c7c15d67b36bbaf3e3
+size 41080
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/2.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/2.png
new file mode 100644
index 0000000..31c27cc
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6212242a5b5c4ec18405e1523e7ec2e8898f2041749dfb882f1cc943f267fbd5
+size 40736
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/3.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/3.png
new file mode 100644
index 0000000..07c5245
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57687d87a05a3dfbb22144d95893d1e913e78d9bb6c1be8b1482df6bc805b98d
+size 41644
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/4.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/4.png
new file mode 100644
index 0000000..59b897b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/4.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8b84dbb2dce3b7e4651ad1ebcb2068e0b041423c1956c3e5c70a96d7612e2770
+size 41429
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/5.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/5.png
new file mode 100644
index 0000000..5854036
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/5.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4b58693ec83d30550be41ed48c795029af57db06ddd412240b4b53bff7bace1
+size 41817
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/6.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/6.png
new file mode 100644
index 0000000..f289e0b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/6.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:724e1103ad9c1f47ca5c604e6b401b5e8ccbce3b8a324f0bdb2bded7e93bbabe
+size 42290
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/7.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/7.png
new file mode 100644
index 0000000..e52ae5b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/7.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:57ba5dcfc5b71b53b997c7441db30961d965d58788bb378e8f085bac18ef5c34
+size 41102
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/8.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/8.png
new file mode 100644
index 0000000..8c741ef
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/8.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0eb010c2319f864dbb7b6ce76cc1cc2c71b7ec3655e4e1bbcde4c26a717be66f
+size 41834
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/9.png b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/9.png
new file mode 100644
index 0000000..bf6062e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/9.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:67c8928f6e2515fd752b8f6c18fa3aa521377f4c1ac87c0e36734e0c17e5245a
+size 39931
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/index.dnh b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/index.dnh
new file mode 100644
index 0000000..fb04f23
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/PHOENIX/index.dnh
@@ -0,0 +1,12 @@
+let imgEnemyPhoenix = [
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\0.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\1.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\2.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\3.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\4.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\5.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\6.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\7.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\8.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\PHOENIX\9.png"
+];
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Renko.png b/th_dnh/script/thA/IMAGE/ENEMY/Renko.png
new file mode 100644
index 0000000..bc4da03
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Renko.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:63d0cfbdcdcb925d1ec013d866b5da21b5dce92acd27485f6bd5733ff4d0c543
+size 2706
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/0.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/0.png
new file mode 100644
index 0000000..978a68c
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/0.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9cbf1486d7d120fc5698fe4d8e7b32e8fb97b36f07290fa5f28ee57f8dbbf694
+size 251802
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/1.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/1.png
new file mode 100644
index 0000000..c25c417
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:09b3ddf103ebdbe122e0ea140a3910de92d287ad6d37717b2a97a59f71ac95ca
+size 263419
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/2.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/2.png
new file mode 100644
index 0000000..b6f487a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ceda1dc60d34898460dba7a50ebb82f16b2a6d69b092592ac78e23e7c4bc0bc6
+size 262909
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/3.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/3.png
new file mode 100644
index 0000000..edd1a9a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:46aeca1c48d70480b65d2612b8859556020957b29985d47de2df4bb0faef5eee
+size 265306
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/4.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/4.png
new file mode 100644
index 0000000..aad60e1
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/4.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8fdfed2aea092acfc49b1f86635e303b35315ff3b1140d74e4f155b420710a49
+size 265317
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/5.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/5.png
new file mode 100644
index 0000000..6ae350c
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/5.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e7501d1dc33cb042294561034a3f44eebfe914bc9894891a743074dcff5b1fad
+size 260446
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/6.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/6.png
new file mode 100644
index 0000000..020653e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/6.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7785dbea1c46d617a82c85711803f326a67962112516715f4a8376590a0f6d59
+size 266541
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/7.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/7.png
new file mode 100644
index 0000000..251d339
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/7.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bac1f00a6bdb26480c271da41ac15b880ca1d5eb36f37f288362775728fd3717
+size 258348
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/8.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/8.png
new file mode 100644
index 0000000..e31c1a8
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/8.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8e76acfd937628ba30b7802dcc1a4ee6970b2993d73808f5e9af6901a182a70e
+size 260189
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/9.png b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/9.png
new file mode 100644
index 0000000..09b98f2
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/9.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8e632730585e0f6f4ca8d189ea9037e45f4a39424ae6ba82407db1dc055f5d0e
+size 274851
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/SENSE/index.dnh b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/index.dnh
new file mode 100644
index 0000000..4f9c136
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/SENSE/index.dnh
@@ -0,0 +1,12 @@
+let imgEnemySense = [
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\0.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\1.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\2.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\3.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\4.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\5.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\6.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\7.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\8.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\SENSE\9.png"
+];
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Sakuya.png b/th_dnh/script/thA/IMAGE/ENEMY/Sakuya.png
new file mode 100644
index 0000000..7966964
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Sakuya.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9aa53eed32d0c66da02ac2c189a355985abc3739d04828b13f95e2cbdfec628b
+size 3901
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/Shadow.png b/th_dnh/script/thA/IMAGE/ENEMY/Shadow.png
new file mode 100644
index 0000000..103c696
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/Shadow.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:3fdb737ef74102e6167e9e5d9576428ad5146929ae60b64bf3c038739dde3c53
+size 461
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/index.dnh b/th_dnh/script/thA/IMAGE/ENEMY/index.dnh
new file mode 100644
index 0000000..5a7ce34
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/index.dnh
@@ -0,0 +1,4 @@
+#include_function ".\IMAGE\ENEMY\BAT\index.dnh"
+#include_function ".\IMAGE\ENEMY\PHOENIX\index.dnh"
+#include_function ".\IMAGE\ENEMY\SENSE\index.dnh"
+#include_function ".\IMAGE\ENEMY\index_mini.dnh"
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/index_mini.dnh b/th_dnh/script/thA/IMAGE/ENEMY/index_mini.dnh
new file mode 100644
index 0000000..b085c73
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/index_mini.dnh
@@ -0,0 +1,17 @@
+#include_function ".\IMAGE\ENEMY\KEDAMA\index.dnh"
+let imgEnemyAlice = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Alice.png";
+let imgEnemyChina = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\China.png";
+let imgEnemyDaiyosei = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Daiyosei.png";
+let imgEnemyKene = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Kene.png";
+let imgEnemyLeila = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Leila.png";
+let imgEnemyLetty = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Letty.png";
+let imgEnemyLily = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Lily.png";
+let imgEnemyMerry = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Merry.png";
+let imgEnemyRenko = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Renko.png";
+let imgEnemySakuya = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Sakuya.png";
+let imgEnemyShadow = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Shadow.png";
+let imgEnemyYosei1 = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Yosei1.png";
+let imgEnemyYosei2 = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Yosei2.png";
+let imgEnemyYosei3 = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Yosei3.png";
+let imgEnemyYosei4 = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Yosei4.png";
+let imgEnemyYosei5 = GetCurrentScriptDirectory() ~ "IMAGE\ENEMY\Yosei5.png";
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/yosei1.png b/th_dnh/script/thA/IMAGE/ENEMY/yosei1.png
new file mode 100644
index 0000000..c20f024
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/yosei1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0072b213768edd0a95e90a29de345183037aa575129181d9f3f7f8fd0d871216
+size 2934
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/yosei2.png b/th_dnh/script/thA/IMAGE/ENEMY/yosei2.png
new file mode 100644
index 0000000..52cc714
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/yosei2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:016b0421369cf83c1d7fdc0edb97d80c451e62a1a32cbfa7bee6f60788f1e3fa
+size 2937
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/yosei3.png b/th_dnh/script/thA/IMAGE/ENEMY/yosei3.png
new file mode 100644
index 0000000..13a4625
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/yosei3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fb94df72f0fcfd39c575ff326c9beccc668b31e8bc442f0c4bf31757b07089cb
+size 2937
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/yosei4.png b/th_dnh/script/thA/IMAGE/ENEMY/yosei4.png
new file mode 100644
index 0000000..7ff9e31
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/yosei4.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:92a96717731b5ccb202903575d877643e60d1c05005872f729a19635eea41aa8
+size 2942
diff --git a/th_dnh/script/thA/IMAGE/ENEMY/yosei5.png b/th_dnh/script/thA/IMAGE/ENEMY/yosei5.png
new file mode 100644
index 0000000..387936d
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/ENEMY/yosei5.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8fbc1f31a0a192398274bb4832934d7209bc30c19bfc3eb0e161c42b848e55d4
+size 2935
diff --git a/th_dnh/script/thA/IMAGE/MAP/Black.png b/th_dnh/script/thA/IMAGE/MAP/Black.png
new file mode 100644
index 0000000..f5c714f
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Black.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bf37bc435862638c6c12297214d4157f25a5e62f264575d28184e9f9f585e293
+size 2100
diff --git a/th_dnh/script/thA/IMAGE/MAP/Candle1.png b/th_dnh/script/thA/IMAGE/MAP/Candle1.png
new file mode 100644
index 0000000..4b952ea
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Candle1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7235be9c2447eb5b6a2095763ae3ac39fafaccff71c4a9b3b69fc07d29e8923d
+size 5173
diff --git a/th_dnh/script/thA/IMAGE/MAP/Candle8.png b/th_dnh/script/thA/IMAGE/MAP/Candle8.png
new file mode 100644
index 0000000..926433b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Candle8.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b1f8c0b7dbe8256a1f91fd9efa707abbc440ed0e04d91ec166b49d25e68a3398
+size 5500
diff --git a/th_dnh/script/thA/IMAGE/MAP/Chirch.png b/th_dnh/script/thA/IMAGE/MAP/Chirch.png
new file mode 100644
index 0000000..715552d
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Chirch.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a9981abbc9cf6de5a50ec83d73732c2e8661fcf5833392fecae9e6dea760a78b
+size 860582
diff --git a/th_dnh/script/thA/IMAGE/MAP/Ground.png b/th_dnh/script/thA/IMAGE/MAP/Ground.png
new file mode 100644
index 0000000..507422b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Ground.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6506dd247813b6f5cc0a907267bd5ed30f5a16d54a28bb195ea7a78347d191e8
+size 157516
diff --git a/th_dnh/script/thA/IMAGE/MAP/Light1.png b/th_dnh/script/thA/IMAGE/MAP/Light1.png
new file mode 100644
index 0000000..32e72b3
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Light1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f0f4a2e8c9b402855f32f60cb9eee4125eab612bb352c2ae8c2f7fe52880fe8e
+size 3476
diff --git a/th_dnh/script/thA/IMAGE/MAP/Light2.png b/th_dnh/script/thA/IMAGE/MAP/Light2.png
new file mode 100644
index 0000000..f4f5436
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Light2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f852be4eddd3f0b37b13416ba5790fceef3868123b69b76458ff078176680689
+size 3438
diff --git a/th_dnh/script/thA/IMAGE/MAP/PollEx.png b/th_dnh/script/thA/IMAGE/MAP/PollEx.png
new file mode 100644
index 0000000..ccff172
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/PollEx.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2fca6f53555f1cc02da5cb04b59a83533f3160e0fa7c105389aa60b73e20ea46
+size 16384
diff --git a/th_dnh/script/thA/IMAGE/MAP/Rock.png b/th_dnh/script/thA/IMAGE/MAP/Rock.png
new file mode 100644
index 0000000..e7d9091
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Rock.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:09ddaad89deb861300dfce850144a033572c67b1ebe1b00b5d3c91e80ee0bd1e
+size 279395
diff --git a/th_dnh/script/thA/IMAGE/MAP/RockEx.png b/th_dnh/script/thA/IMAGE/MAP/RockEx.png
new file mode 100644
index 0000000..5ab177b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/RockEx.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:45037cdb8ff75bfd6c980287be76758e73b768986ca26d8beb9fc37b7dfb8d73
+size 287118
diff --git a/th_dnh/script/thA/IMAGE/MAP/Seal.png b/th_dnh/script/thA/IMAGE/MAP/Seal.png
new file mode 100644
index 0000000..bbea357
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Seal.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1ad25d33ea334e02d2d2f13fcefa9aaa4a1c36d59160d5197cdbf7eda9da4a57
+size 143373
diff --git a/th_dnh/script/thA/IMAGE/MAP/Sky.png b/th_dnh/script/thA/IMAGE/MAP/Sky.png
new file mode 100644
index 0000000..b3e600b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Sky.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f3730ed31b2f8bd22eb672b5d6cf3ee6b0d6ea14fed3857ba1c33fc9775665ef
+size 78831
diff --git a/th_dnh/script/thA/IMAGE/MAP/Snow.png b/th_dnh/script/thA/IMAGE/MAP/Snow.png
new file mode 100644
index 0000000..7468701
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Snow.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:45306c15ae711dcfe18cc34ab9a2ad7f72c4f88b1276fd32dd498245745e9dce
+size 8895
diff --git a/th_dnh/script/thA/IMAGE/MAP/SnowField.png b/th_dnh/script/thA/IMAGE/MAP/SnowField.png
new file mode 100644
index 0000000..1f125f5
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/SnowField.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f9cdacb77aabc5840e4825d98f12d744286ea5bf915620e247821bcec633dabe
+size 109036
diff --git a/th_dnh/script/thA/IMAGE/MAP/SnowTree.png b/th_dnh/script/thA/IMAGE/MAP/SnowTree.png
new file mode 100644
index 0000000..69cf7ce
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/SnowTree.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:36f2352599d5b0f757e6fd889198d84e6204df9db1ee39a6ee95c65d870cd669
+size 30592
diff --git a/th_dnh/script/thA/IMAGE/MAP/Tree.png b/th_dnh/script/thA/IMAGE/MAP/Tree.png
new file mode 100644
index 0000000..fe9bbd7
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Tree.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ab9a4890f7aa55f02d4200f7d114ac3c440ee5cfa3a2a4a8d39c1a2bf533888a
+size 39716
diff --git a/th_dnh/script/thA/IMAGE/MAP/Water1.png b/th_dnh/script/thA/IMAGE/MAP/Water1.png
new file mode 100644
index 0000000..35d7bee
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Water1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7113ce97004a4558e51f5e2259765495e046a32e48b66ba76eb3beb5f0e5521d
+size 54024
diff --git a/th_dnh/script/thA/IMAGE/MAP/Water2.png b/th_dnh/script/thA/IMAGE/MAP/Water2.png
new file mode 100644
index 0000000..008cad2
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Water2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:50f62b55eaa3f39ba61d182ad38976b6dd7ffec6610d835196c32b25ba8fcbbc
+size 56579
diff --git a/th_dnh/script/thA/IMAGE/MAP/White.png b/th_dnh/script/thA/IMAGE/MAP/White.png
new file mode 100644
index 0000000..f3dd220
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/White.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4f7c536974115a70c4bca7125105c3db8d642bc6d98d5c1f45f6ae3797115402
+size 269
diff --git a/th_dnh/script/thA/IMAGE/MAP/Wood1.png b/th_dnh/script/thA/IMAGE/MAP/Wood1.png
new file mode 100644
index 0000000..013b54f
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Wood1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f866dd89d21bcb092ef0f1d198a060746f71bbef4d8967553cf3a407bc624bec
+size 37450
diff --git a/th_dnh/script/thA/IMAGE/MAP/Wood2.png b/th_dnh/script/thA/IMAGE/MAP/Wood2.png
new file mode 100644
index 0000000..e3b1f2d
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/Wood2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6c90e1c04da6c0e2a5657a9462468e641222c5caab809dda0156d7a2630a846c
+size 12645
diff --git a/th_dnh/script/thA/IMAGE/MAP/floor.png b/th_dnh/script/thA/IMAGE/MAP/floor.png
new file mode 100644
index 0000000..35f9fae
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/floor.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:fb812f8d5ece950730fceb4fc27f2c3df01081672fc788334dc463ec18aba222
+size 301679
diff --git a/th_dnh/script/thA/IMAGE/MAP/index.dnh b/th_dnh/script/thA/IMAGE/MAP/index.dnh
new file mode 100644
index 0000000..1b7d83a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/index.dnh
@@ -0,0 +1,23 @@
+let imgMapBlack = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Black.png";
+let imgMapWhite = GetCurrentScriptDirectory() ~ "IMAGE\MAP\White.png";
+let imgMapCandle1 = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Candle1.png";
+let imgMapCandle8 = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Candle8.png";
+let imgMapChirch = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Chirch.png";
+let imgMapFloor = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Floor.png";
+let imgMapGround = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Ground.png";
+let imgMapLight1 = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Light1.png";
+let imgMapLight2 = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Light2.png";
+let imgMapPoll = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Poll.png";
+let imgMapPollEx = GetCurrentScriptDirectory() ~ "IMAGE\MAP\PollEx.png";
+let imgMapRock = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Rock.png";
+let imgMapRockEx = GetCurrentScriptDirectory() ~ "IMAGE\MAP\RockEx.png";
+let imgMapSeal = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Seal.png";
+let imgMapSky = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Sky.png";
+let imgMapSnow = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Snow.png";
+let imgMapSnowField = GetCurrentScriptDirectory() ~ "IMAGE\MAP\SnowField.png";
+let imgMapSnowTree = GetCurrentScriptDirectory() ~ "IMAGE\MAP\SnowTree.png";
+let imgMapTree = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Tree.png";
+let imgMapWater1 = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Water1.png";
+let imgMapWater2 = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Water2.png";
+let imgMapWood1 = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Wood1.png";
+let imgMapWood2 = GetCurrentScriptDirectory() ~ "IMAGE\MAP\Wood2.png";
diff --git a/th_dnh/script/thA/IMAGE/MAP/poll.png b/th_dnh/script/thA/IMAGE/MAP/poll.png
new file mode 100644
index 0000000..0f274ba
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/MAP/poll.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:627906db965daed97d38ad9b7bbda4b6f300d43adb0a36c5c3c70ae3087dfa4a
+size 15989
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Alice.png b/th_dnh/script/thA/IMAGE/SPELL/Alice.png
new file mode 100644
index 0000000..404eb7d
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Alice.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a70cb4a03faf263525c8b86b646623ae4f7345b1b51e6cda0746dc06d3ae6545
+size 72073
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Bamboo.png b/th_dnh/script/thA/IMAGE/SPELL/Bamboo.png
new file mode 100644
index 0000000..c87ca2d
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Bamboo.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:06898e76be6d33c3b3fd089c9a66be0584597d27900b5ce65158ec878d65356c
+size 774420
diff --git a/th_dnh/script/thA/IMAGE/SPELL/BigCircle.png b/th_dnh/script/thA/IMAGE/SPELL/BigCircle.png
new file mode 100644
index 0000000..6c1efc4
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/BigCircle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9e7f41d22cdaed17c260eb2dc56b29ca89b82212e7e000b6697fea2d6b067a71
+size 3774
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Blood.png b/th_dnh/script/thA/IMAGE/SPELL/Blood.png
new file mode 100644
index 0000000..db79b35
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Blood.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5c1deb20036596ccfeae9d1f97f84cd0a1cf5e2715a90b733e6f8a65a56b7e0e
+size 281661
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Chirch.png b/th_dnh/script/thA/IMAGE/SPELL/Chirch.png
new file mode 100644
index 0000000..81db3e1
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Chirch.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7bb8b377013776c301d93ec4aa15952629c34fd3001171eb3adef3bef8e93b00
+size 150007
diff --git a/th_dnh/script/thA/IMAGE/SPELL/IceWall.png b/th_dnh/script/thA/IMAGE/SPELL/IceWall.png
new file mode 100644
index 0000000..d8d912b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/IceWall.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b60d541504d210d1391f683b7d840f0dfd65b39c7e96a0f09653112a06f7100f
+size 35325
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Kene.png b/th_dnh/script/thA/IMAGE/SPELL/Kene.png
new file mode 100644
index 0000000..d050782
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Kene.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2401f2d3bbc94f5ecd8fe3eb5d008dd8e9f9d23294e91c25cf34ecf71dcb43a4
+size 86912
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Khan.png b/th_dnh/script/thA/IMAGE/SPELL/Khan.png
new file mode 100644
index 0000000..75165a5
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Khan.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f74da79203d0ed8a8a85cb06cef7667e4960a4a069451ecd90f2904a2fad0616
+size 119732
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Luna.png b/th_dnh/script/thA/IMAGE/SPELL/Luna.png
new file mode 100644
index 0000000..c9d8e58
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Luna.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:aea1e1fc1e160f8f54cd7a1670f7d5214cd49f6918ec091ac415fec49dd2e226
+size 108746
diff --git a/th_dnh/script/thA/IMAGE/SPELL/RedWall.png b/th_dnh/script/thA/IMAGE/SPELL/RedWall.png
new file mode 100644
index 0000000..3d4723e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/RedWall.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b4bafd8c877638747b74d443a7b4649ce8c2bbbb89fcd37d2da7ce1e70e3e488
+size 25228
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Renko.png b/th_dnh/script/thA/IMAGE/SPELL/Renko.png
new file mode 100644
index 0000000..a2e7a02
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Renko.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e15814e4c28e42c8b99a24a5a2b337699c3000ef22e5ce31f28f4ca86cc2d11
+size 316679
diff --git a/th_dnh/script/thA/IMAGE/SPELL/RotateStone.png b/th_dnh/script/thA/IMAGE/SPELL/RotateStone.png
new file mode 100644
index 0000000..422146f
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/RotateStone.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:abd598c9f31b5802ad549c10ab6060742553ea87d1ff7b75c8518e2f2400fe80
+size 102893
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Star.png b/th_dnh/script/thA/IMAGE/SPELL/Star.png
new file mode 100644
index 0000000..4686fe5
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Star.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b2a76d7810cad6d6d1fd702fa4656516a3c4484993a7ca831383d3aa63a582d4
+size 238266
diff --git a/th_dnh/script/thA/IMAGE/SPELL/Wheel.png b/th_dnh/script/thA/IMAGE/SPELL/Wheel.png
new file mode 100644
index 0000000..08267b8
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/Wheel.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:b840cd63c75b1102b80b4b680ef25b5a4f20c4beb8ee65d2fcd46b0eed3f0909
+size 303203
diff --git a/th_dnh/script/thA/IMAGE/SPELL/index.dnh b/th_dnh/script/thA/IMAGE/SPELL/index.dnh
new file mode 100644
index 0000000..d6b140d
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SPELL/index.dnh
@@ -0,0 +1,14 @@
+let imgSpellAlice = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Alice.png";
+let imgSpellBamboo = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Bamboo.png";
+let imgSpellBigCircle = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\BigCircle.png";
+let imgSpellBlood = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Blood.png";
+let imgSpellChirch = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Chirch.png";
+let imgSpellIceWall = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\IceWall.png";
+let imgSpellKene = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Kene.png";
+let imgSpellKhan = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Khan.png";
+let imgSpellLuna = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Luna.png";
+let imgSpellRedWall = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\RedWall.png";
+let imgSpellRenko = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Renko.png";
+let imgSpellRotateStone = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\RotateStone.png";
+let imgSpellStar = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Star.png";
+let imgSpellWheel = GetCurrentScriptDirectory() ~ "IMAGE\SPELL\Wheel.png";
diff --git a/th_dnh/script/thA/IMAGE/STAGE/1.png b/th_dnh/script/thA/IMAGE/STAGE/1.png
new file mode 100644
index 0000000..9ffd33e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/STAGE/1.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5fe29d206d656eaa600d9720f30c4e8a86fd6dd8e5bc1deebb20f3a4b6fd3166
+size 32042
diff --git a/th_dnh/script/thA/IMAGE/STAGE/2.png b/th_dnh/script/thA/IMAGE/STAGE/2.png
new file mode 100644
index 0000000..c82618f
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/STAGE/2.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6e0ffcdef552a44d89efbf82a3b7f204a1510d87f5ccff0d0bff59ed297e7cd0
+size 33178
diff --git a/th_dnh/script/thA/IMAGE/STAGE/3.png b/th_dnh/script/thA/IMAGE/STAGE/3.png
new file mode 100644
index 0000000..a9bb609
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/STAGE/3.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8173e41374d2963e1eeadcc5fe77840f55967f71d6b3a00c069eb8e5a234a38a
+size 34674
diff --git a/th_dnh/script/thA/IMAGE/STAGE/4.png b/th_dnh/script/thA/IMAGE/STAGE/4.png
new file mode 100644
index 0000000..c41b6b0
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/STAGE/4.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d177c62bc2fb03df64f4885608329d92fcd1f6268b7fea8859b425bdad94a01b
+size 33286
diff --git a/th_dnh/script/thA/IMAGE/STAGE/5.png b/th_dnh/script/thA/IMAGE/STAGE/5.png
new file mode 100644
index 0000000..85b487e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/STAGE/5.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4a7a5e83a6adf72f0a2a3d1a1634a4c0dc5f3abfd416c777b2ad89eb3227e431
+size 32834
diff --git a/th_dnh/script/thA/IMAGE/STAGE/6.png b/th_dnh/script/thA/IMAGE/STAGE/6.png
new file mode 100644
index 0000000..f925075
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/STAGE/6.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:63c3863cb6c28884f5df87e6d86efb25d9bbf93bfa441704ed483d73bc07ddcb
+size 30989
diff --git a/th_dnh/script/thA/IMAGE/STAGE/Extra.png b/th_dnh/script/thA/IMAGE/STAGE/Extra.png
new file mode 100644
index 0000000..418283e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/STAGE/Extra.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4b7fd0cf420712c0b875893e1f06be4217c9ad78665cd642c29064ac8fe43cfc
+size 36197
diff --git a/th_dnh/script/thA/IMAGE/STAGE/index.dnh b/th_dnh/script/thA/IMAGE/STAGE/index.dnh
new file mode 100644
index 0000000..d09407f
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/STAGE/index.dnh
@@ -0,0 +1,9 @@
+let imgStage = [
+ GetCurrentScriptDirectory() ~ "IMAGE\STAGE\1.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\STAGE\2.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\STAGE\3.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\STAGE\4.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\STAGE\5.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\STAGE\6.png",
+ GetCurrentScriptDirectory() ~ "IMAGE\STAGE\Extra.png",
+];
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Boolean.png b/th_dnh/script/thA/IMAGE/SYSTEM/Boolean.png
new file mode 100644
index 0000000..b00b1a8
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Boolean.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9eaa7d0a11ab774775a9fbe1ed81c3c68b14c869deb38239bcd614cb8d68a0e5
+size 7641
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/CircleBig.png b/th_dnh/script/thA/IMAGE/SYSTEM/CircleBig.png
new file mode 100644
index 0000000..fda540a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/CircleBig.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1525126d7e14f009d14007c070648cc79d4b6842a6b09530349c6d0e09494680
+size 14229
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/CircleBlue.png b/th_dnh/script/thA/IMAGE/SYSTEM/CircleBlue.png
new file mode 100644
index 0000000..456c9af
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/CircleBlue.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2f450261a24dc3224ab19a04e6b21b0f79a47e69d66f13747bf3f0e5335cbdfb
+size 4260
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/CircleGreen.png b/th_dnh/script/thA/IMAGE/SYSTEM/CircleGreen.png
new file mode 100644
index 0000000..2555c08
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/CircleGreen.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f47e0fc4b923eb156e16f2b0c8e8236c95cc50be9e08b425c7b47b815c09b156
+size 4258
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/CircleRed.png b/th_dnh/script/thA/IMAGE/SYSTEM/CircleRed.png
new file mode 100644
index 0000000..2475e44
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/CircleRed.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:58a3b184b521f220e8f2e55f9566f96b95534e89235a869619debd6bd532385a
+size 4220
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/CircleWhite.png b/th_dnh/script/thA/IMAGE/SYSTEM/CircleWhite.png
new file mode 100644
index 0000000..45a0a33
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/CircleWhite.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:43a7828ca4d9e1f4fc63e24865fdf28ddd4a08c9a0da7a9bcadd668b8311b86d
+size 4131
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/CircleYellow.png b/th_dnh/script/thA/IMAGE/SYSTEM/CircleYellow.png
new file mode 100644
index 0000000..f101bb8
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/CircleYellow.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:1b3023ecbeb28161db1b6e09fddea79e03b695acac99d66f7108445c3db9f2b1
+size 4264
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Clear.png b/th_dnh/script/thA/IMAGE/SYSTEM/Clear.png
new file mode 100644
index 0000000..2d03fba
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Clear.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:21a8d4f32825ca7ee8ce96b2f9dbf720314592dc0ed62054831e8b353a242088
+size 6600
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Equal.png b/th_dnh/script/thA/IMAGE/SYSTEM/Equal.png
new file mode 100644
index 0000000..e60e418
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Equal.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6a2ddba36a10937aae8a201d537a1253fbed936f60c7f2566a4039bebb8455a
+size 1650
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Extra.png b/th_dnh/script/thA/IMAGE/SYSTEM/Extra.png
new file mode 100644
index 0000000..efdb07b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Extra.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:91778cf0c2d490aaec63b963101e5efb5b21c82986ddbb77db6366e946f6545b
+size 28330
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Jacket.png b/th_dnh/script/thA/IMAGE/SYSTEM/Jacket.png
new file mode 100644
index 0000000..cd129e1
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Jacket.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4476773de9d394b13b84dcb35e85bb2d7ee872a356949f4157ee30b5d4a7299e
+size 33568
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Level.png b/th_dnh/script/thA/IMAGE/SYSTEM/Level.png
new file mode 100644
index 0000000..1513e33
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Level.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:582d7f8ce5defad3856048c4afe1bda0c6ae18ccc590f321afa1886a7c565a5a
+size 8022
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/LevelSelect.png b/th_dnh/script/thA/IMAGE/SYSTEM/LevelSelect.png
new file mode 100644
index 0000000..dd9256a
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/LevelSelect.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c4408584ff72757e441697cf254f5823923f5af6c7a12f88f40a9f76433b32f0
+size 131390
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Logo.png b/th_dnh/script/thA/IMAGE/SYSTEM/Logo.png
new file mode 100644
index 0000000..293aad5
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Logo.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7e69dec5a8c47706f55801523136fa88e414b85f195a042983e6f03d360dbb72
+size 88536
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/LogoBG.png b/th_dnh/script/thA/IMAGE/SYSTEM/LogoBG.png
new file mode 100644
index 0000000..2800cf7
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/LogoBG.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9587598890c342f2ae24637c45d8dff23707fe4f46360e3caa83441471b726ea
+size 100077
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Menu.png b/th_dnh/script/thA/IMAGE/SYSTEM/Menu.png
new file mode 100644
index 0000000..7bea6a9
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Menu.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2635080259541a5442b6a56d0b7a7fd75b56d96982fda8722a98fd631d43ff5
+size 44640
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/MusicComment.png b/th_dnh/script/thA/IMAGE/SYSTEM/MusicComment.png
new file mode 100644
index 0000000..2270584
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/MusicComment.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:670a0b48391857c248c60e448b850b0ec0751393ea4cc5870537422e5bf1fd18
+size 592200
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/MusicList.png b/th_dnh/script/thA/IMAGE/SYSTEM/MusicList.png
new file mode 100644
index 0000000..b629a83
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/MusicList.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:44e701864d4c2e1418161849328c26e38cd427113b5dc3426eaaedf35143e9fa
+size 96686
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Name.png b/th_dnh/script/thA/IMAGE/SYSTEM/Name.png
new file mode 100644
index 0000000..3a69e95
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Name.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a5c24c56e15869fae4984f09e5a554a7ece1b4583a551d82d74f391c254a4cda
+size 27236
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/NextAge.png b/th_dnh/script/thA/IMAGE/SYSTEM/NextAge.png
new file mode 100644
index 0000000..7aa39e2
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/NextAge.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a26fa821300081f6fd8a8d0c482640a39532a47bc15d9440eefc156f9088fdfe
+size 3251
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Num.png b/th_dnh/script/thA/IMAGE/SYSTEM/Num.png
new file mode 100644
index 0000000..ccaf03c
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Num.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:9511da5610cb8e7ea8827f3672fc0adec6e83b73731dffc2573fad54cabf2732
+size 9539
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/NumMiddle.png b/th_dnh/script/thA/IMAGE/SYSTEM/NumMiddle.png
new file mode 100644
index 0000000..ee92c1e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/NumMiddle.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:bb640f427fde0aa8d170c744b1ad5698a64a7bff3a4230302c9d8f2a11809837
+size 3378
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/NumSmall.png b/th_dnh/script/thA/IMAGE/SYSTEM/NumSmall.png
new file mode 100644
index 0000000..b1b6935
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/NumSmall.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:73cdbc81b335d8b8fd4f50e74b8bcd4854bf10eaf49724234e9afcb3b8dbcdd6
+size 1716
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Option.png b/th_dnh/script/thA/IMAGE/SYSTEM/Option.png
new file mode 100644
index 0000000..5a40f17
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Option.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d4fdb572b02c164f46d8b40262897cbcff2716f0ad91538c839b58fc82680091
+size 33022
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Otama.png b/th_dnh/script/thA/IMAGE/SYSTEM/Otama.png
new file mode 100644
index 0000000..24fc737
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Otama.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:efdf74b3dd4b7de2ad6e15d5f6889a22063454b74555cfd89d58013bb776c2c5
+size 640
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/PlayerBorder.png b/th_dnh/script/thA/IMAGE/SYSTEM/PlayerBorder.png
new file mode 100644
index 0000000..12f3359
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/PlayerBorder.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a2f5c9699f823058e3e0f11090990d4e83681404653aa7de90fed1ff326f5bc1
+size 1155
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Practice.png b/th_dnh/script/thA/IMAGE/SYSTEM/Practice.png
new file mode 100644
index 0000000..b24add4
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Practice.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:90eae97676c4910640c7566da46aba5b5c039718f40080010dbcce714949e087
+size 20287
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Progress.png b/th_dnh/script/thA/IMAGE/SYSTEM/Progress.png
new file mode 100644
index 0000000..f063209
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Progress.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:333f50a0e93651d4a91f9ce77471ba0f45bb0f20147d91841eb5a0571e8275a0
+size 1640
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/ProgressBG.png b/th_dnh/script/thA/IMAGE/SYSTEM/ProgressBG.png
new file mode 100644
index 0000000..7e33c46
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/ProgressBG.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:93aba38aa50e9ac0ccb058778ae9b59a30f9f3444e10f6644ddc2761be9e936f
+size 1640
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/PushKey.png b/th_dnh/script/thA/IMAGE/SYSTEM/PushKey.png
new file mode 100644
index 0000000..d195279
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/PushKey.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a49b0e39f326eca17706ced769d614d1c1882a56d867660533a25380c1103741
+size 7852
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Result.png b/th_dnh/script/thA/IMAGE/SYSTEM/Result.png
new file mode 100644
index 0000000..1242059
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Result.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0682567447d187b2647bc5d6189593f0660161a2a302e1fbac12403f592a79d0
+size 22848
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/ResultNum.png b/th_dnh/script/thA/IMAGE/SYSTEM/ResultNum.png
new file mode 100644
index 0000000..bbbb0b3
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/ResultNum.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:64ea36bca4c48a953e0d5799f2193f8d09c638380095f0b53e29702a9a0a53c7
+size 12730
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/SpellBonus.png b/th_dnh/script/thA/IMAGE/SYSTEM/SpellBonus.png
new file mode 100644
index 0000000..08e3c66
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/SpellBonus.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6dd109f6a86afbab4751bae4d8ca2355df8d5270799e03fb6d1fe8c45e02499c
+size 2330
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/SpellName.png b/th_dnh/script/thA/IMAGE/SYSTEM/SpellName.png
new file mode 100644
index 0000000..b9aa581
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/SpellName.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:c7b2eb2425827c8faf357f110d6586a8d61c32327e2ad4aeeccade64c8c5bf3e
+size 332087
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/SpellResult.png b/th_dnh/script/thA/IMAGE/SYSTEM/SpellResult.png
new file mode 100644
index 0000000..a2f4a7b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/SpellResult.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6a499e32d71ed97ff36eb5a13606a5200e5e7a8f0c8bef7679d856baa4470c2b
+size 5250
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/StaffRoll.png b/th_dnh/script/thA/IMAGE/SYSTEM/StaffRoll.png
new file mode 100644
index 0000000..7df4dd9
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/StaffRoll.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:8892817f8831a2641693f44b610f252ffa9722f7fc1b5d207c77143ae8d0fcce
+size 68453
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/Stage.png b/th_dnh/script/thA/IMAGE/SYSTEM/Stage.png
new file mode 100644
index 0000000..27dfc3b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/Stage.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:12923520e5cc111e5218708709e4e9e56784363c410b0af0f190204f59874c95
+size 5322
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/UserShot.png b/th_dnh/script/thA/IMAGE/SYSTEM/UserShot.png
new file mode 100644
index 0000000..197d523
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/UserShot.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:66eff222443aa359fb714299f0f6d44bfad0dbe8134817dfc00b798b1e95845e
+size 275
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/border.png b/th_dnh/script/thA/IMAGE/SYSTEM/border.png
new file mode 100644
index 0000000..0dd80aa
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/border.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6c50a98e7e8ef9a7d6dc2ed92353cc29a6ad23aeac435738420a3425e6ba6294
+size 38536
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/copyright.png b/th_dnh/script/thA/IMAGE/SYSTEM/copyright.png
new file mode 100644
index 0000000..88a615f
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/copyright.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:5907483bdb7dae16edfb402bfd0116bc4e9d3f11c01af47c725a14797dcdde64
+size 7539
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/index.dnh b/th_dnh/script/thA/IMAGE/SYSTEM/index.dnh
new file mode 100644
index 0000000..de9047e
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/index.dnh
@@ -0,0 +1,34 @@
+#include_function ".\IMAGE\SYSTEM\index_mini.dnh"
+let imgSystemBoolean = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Boolean.png";
+let imgSystemClear = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Clear.png";
+let imgSystemCopyright = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Copyright.png";
+let imgSystemEqual = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Equal.png";
+let imgSystemExtra = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Extra.png";
+let imgSystemJacket = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Jacket.png";
+let imgSystemLevel = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Level.png";
+let imgSystemLevelSelect = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\LevelSelect.png";
+let imgSystemLogo = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Logo.png";
+let imgSystemLogoBG = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\LogoBG.png";
+let imgSystemMenu = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Menu.png";
+let imgSystemMusicList = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\MusicList.png";
+let imgSystemMusicComment = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\MusicComment.png";
+let imgSystemName = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Name.png";
+let imgSystemNetabare = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Netabare.png";
+let imgSystemNextAge = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\NextAge.png";
+let imgSystemNum = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Num.png";
+let imgSystemNumMiddle = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\NumMiddle.png";
+let imgSystemNumSmall = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\NumSmall.png";
+let imgSystemOption = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Option.png";
+let imgSystemOtama = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Otama.png";
+let imgSystemPlayerBorder = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\PlayerBorder.png";
+let imgSystemPractice = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Practice.png";
+let imgSystemProgress = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Progress.png";
+let imgSystemProgressBG = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\ProgressBG.png";
+let imgSystemPushKey = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\PushKey.png";
+let imgSystemResult = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Result.png";
+let imgSystemResultNum = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\ResultNum.png";
+let imgSystemSpellBonus = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\SpellBonus.png";
+let imgSystemSpellName = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\SpellName.png";
+let imgSystemSpellResult = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\SpellResult.png";
+let imgSystemStaffRoll = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\StaffRoll.png";
+let imgSystemStage = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Stage.png";
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/index_mini.dnh b/th_dnh/script/thA/IMAGE/SYSTEM/index_mini.dnh
new file mode 100644
index 0000000..2c41a87
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/index_mini.dnh
@@ -0,0 +1,7 @@
+let imgSystemBorder = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\Border.png";
+let imgSystemCircleBig = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\CircleBig.png";
+let imgSystemCircleBlue = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\CircleBlue.png";
+let imgSystemCircleGreen = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\CircleGreen.png";
+let imgSystemCircleRed = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\CircleRed.png";
+let imgSystemCircleYellow = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\CircleYellow.png";
+let imgSystemCircleWhite = GetCurrentScriptDirectory() ~ "IMAGE\SYSTEM\CircleWhite.png";
diff --git a/th_dnh/script/thA/IMAGE/SYSTEM/netabare.png b/th_dnh/script/thA/IMAGE/SYSTEM/netabare.png
new file mode 100644
index 0000000..fe4f7f2
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/SYSTEM/netabare.png
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7d55c7641cb74c2a8a22e1ba3cc7e9ce1de6b174c537d0f23d9120419ba91fa9
+size 34726
diff --git a/th_dnh/script/thA/IMAGE/index.dnh b/th_dnh/script/thA/IMAGE/index.dnh
new file mode 100644
index 0000000..539bba1
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/index.dnh
@@ -0,0 +1,7 @@
+#include_function ".\IMAGE\CUTIN\index.dnh"
+#include_function ".\IMAGE\ED\index.dnh"
+#include_function ".\IMAGE\ENEMY\index.dnh"
+#include_function ".\IMAGE\MAP\index.dnh"
+#include_function ".\IMAGE\SPELL\index.dnh"
+#include_function ".\IMAGE\STAGE\index.dnh"
+#include_function ".\IMAGE\SYSTEM\index.dnh"
diff --git a/th_dnh/script/thA/IMAGE/index_mini.dnh b/th_dnh/script/thA/IMAGE/index_mini.dnh
new file mode 100644
index 0000000..d34849b
--- /dev/null
+++ b/th_dnh/script/thA/IMAGE/index_mini.dnh
@@ -0,0 +1,4 @@
+#include_function ".\IMAGE\CUTIN\index_mini.dnh"
+#include_function ".\IMAGE\ENEMY\index_mini.dnh"
+#include_function ".\IMAGE\SPELL\index.dnh"
+#include_function ".\IMAGE\SYSTEM\index_mini.dnh"
diff --git a/th_dnh/script/thA/Kedama01.dnh b/th_dnh/script/thA/Kedama01.dnh
new file mode 100644
index 0000000..71551f5
--- /dev/null
+++ b/th_dnh/script/thA/Kedama01.dnh
@@ -0,0 +1,47 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ SetMovePosition03( [ GetClipMinX() - 64, GetClipMaxX() + 64 ][ GetX() < GetCenterX() ], GetY() + 192, 20, Smooth( 4, 5.5, GetCommonDataDefault( "GlobalCount", 0 ) % 29, 29 ) );
+ while( !Near( GetX(), GetCenterX(), 64 ) && Level != 3 ){ yield; }
+ loop( [ 1, 1, 2, 3 ][ Level ] ){
+ while( rand( 0, 100 ) < 98 - Level * 10 ){ yield; }
+ let speed = [ 1, 2 ][ Level == 3 ];
+ loop( Level + 1 ){
+ alternative( count % 2 )
+ case( 0 ){
+ WayShot01( 45, 30, speed, WHITE12, 5 );
+ if( Level >= 2 ){ WayShot01( 60, 30, speed + 0.25, WHITE12, 5 ); }
+ }
+ case( 1 ){
+ CircleShot02( [ 60, 30 ][ Level == 2 ], 5 + speed * 2, [ -0.3, -1 ][ Level == 3 ], speed / [ 1, 2 ][ Level == 3 ], YELLOW12, 5 );
+ if( Level >= 2 ){ CircleShotGap02( [ 60, 30 ][ Level == 2 ], 5.25 + speed * 2, [ -0.3, -1 ][ Level == 3 ], speed + 0.25 / [ 1, 2 ][ Level == 3 ], YELLOW12, 5, [ 30, 15 ][ Level == 2 ] ); }
+ }
+ speed += 0.5;
+ }
+ PlaySEEx( seShot1 );
+ }
+ }
+ @Initialize{
+ SetLife( 20 );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ if( Argv % 3 == 0 ){ DropItem( 1, 0 ); } }
+ @DrawLoop{
+ SetGraphicAngle( 0, 0, -count * 8 );
+ SetGraphicRect( 0, 0, 32, 32 );
+ DrawChr( imgEnemyKedamaGreen, count );
+ SetGraphicAngle( 0, 0, 0 );
+ }
+}
diff --git a/th_dnh/script/thA/Kedama02.dnh b/th_dnh/script/thA/Kedama02.dnh
new file mode 100644
index 0000000..b844c0e
--- /dev/null
+++ b/th_dnh/script/thA/Kedama02.dnh
@@ -0,0 +1,48 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ let Shot;
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetSpeed( 2.5 );
+ Wait( 60 );
+ loop( 90 ){
+ SetAngle( GetAngle() + 2 * dir );
+ SetSpeed( GetSpeed() - 2.5 / 90 );
+ yield
+ }
+ Shot = -1;
+ Wait( 60 );
+ SetAngle( GetAngle() + 90 * dir );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.05 );
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ Behavior();
+ Shot = rand_int( 0, 6 ) * 3;
+ }
+ @MainLoop{
+ if( Shot >= 0 && count % 20 == Shot ){
+ loop( 1 + Level ){ CreateShot02( GetX(), GetY(), 0, rand( 0, 360 ), 0.01, [ 0.3, 0.5, 1, 1.2 ][ Level ], [ BLUE04, RED04, PURPLE04, GREEN04, AQUA04, YELLOW04, ORANGE04 ][ Shot % 7 ], 5 ); }
+ PlaySEEx( seShot1 );
+ }
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ if( count > 180 || Argv % 3 == 0 ){ DropItem( 1, 8 ); } }
+ @DrawLoop{
+ SetGraphicAngle( 0, 0, -count * 8 );
+ SetGraphicRect( 0, 0, 32, 32 );
+ DrawChr( imgEnemyKedamaPurple, count );
+ SetGraphicAngle( 0, 0, 0 );
+ }
+}
diff --git a/th_dnh/script/thA/Kedama03.dnh b/th_dnh/script/thA/Kedama03.dnh
new file mode 100644
index 0000000..9c9366e
--- /dev/null
+++ b/th_dnh/script/thA/Kedama03.dnh
@@ -0,0 +1,41 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ let Shot;
+ task Behavior(){
+ yield;
+ let dir = [ 1, -1 ][ GetX() > GetCenterX() ];
+ SetSpeed( 3 );
+ Wait( 60 );
+ loop( 45 ){
+ SetAngle( GetAngle() + 2 * dir );
+ yield
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ Behavior();
+ Shot = rand_int( 0, 6 ) * 3;
+ }
+ @MainLoop{
+ if( count % 20 == Shot ){
+ SetShotDirectionType( PLAYER );
+ CircleShot02( 360 / ( Level + 2 ), 0, 0.01, [ 0.3, 0.5, 0.7, 1 ][ Level ], [ BLUE01, RED01, PURPLE01, GREEN01, AQUA01, YELLOW01, ORANGE01 ][ Shot % 7 ], 5 );
+ PlaySEEx( seShot1 );
+ }
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ if( count > 100 || Argv % 3 == 0 ){ DropItem( 1, 8 ); } }
+ @DrawLoop{
+ SetGraphicAngle( 0, 0, -count * 8 );
+ SetGraphicRect( 0, 0, 32, 32 );
+ DrawChr( imgEnemyKedamaAqua, count );
+ SetGraphicAngle( 0, 0, 0 );
+ }
+}
diff --git a/th_dnh/script/thA/Kedama04.dnh b/th_dnh/script/thA/Kedama04.dnh
new file mode 100644
index 0000000..835427e
--- /dev/null
+++ b/th_dnh/script/thA/Kedama04.dnh
@@ -0,0 +1,44 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetSpeed( 2.5 );
+ Wait( 20 );
+ KedamaWay( seShot1, 0, Level );
+ Wait( 40 );
+ loop( 90 ){
+ SetAngle( GetAngle() + 2 * dir );
+ SetSpeed( GetSpeed() - 2.5 / 90 );
+ yield;
+ }
+ Wait( 60 );
+ SetAngle( GetAngle() + 90 * dir );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.05 );
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ SetInvincibility( 18 );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 8 ); }
+ @DrawLoop{
+ SetGraphicAngle( 0, 0, -count * 8 );
+ SetGraphicRect( 0, 0, 32, 32 );
+ DrawChr( imgEnemyKedamaPurple, count );
+ SetGraphicAngle( 0, 0, 0 );
+ }
+}
diff --git a/th_dnh/script/thA/Kedama05.dnh b/th_dnh/script/thA/Kedama05.dnh
new file mode 100644
index 0000000..8d14fb3
--- /dev/null
+++ b/th_dnh/script/thA/Kedama05.dnh
@@ -0,0 +1,37 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ let dir = [ 1, -1 ][ GetX() > GetCenterX() ];
+ SetSpeed( 3 );
+ Wait( 20 );
+ KedamaWay( seShot1, 1, Level );
+ Wait( 40 );
+ loop( 45 ){
+ SetAngle( GetAngle() + 2 * dir );
+ yield
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ SetInvincibility( 18 );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 8 ); }
+ @DrawLoop{
+ SetGraphicAngle( 0, 0, -count * 8 );
+ SetGraphicRect( 0, 0, 32, 32 );
+ DrawChr( imgEnemyKedamaAqua, count );
+ SetGraphicAngle( 0, 0, 0 );
+ }
+}
diff --git a/th_dnh/script/thA/Kedama06.dnh b/th_dnh/script/thA/Kedama06.dnh
new file mode 100644
index 0000000..ed95424
--- /dev/null
+++ b/th_dnh/script/thA/Kedama06.dnh
@@ -0,0 +1,35 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ }
+ @Initialize{
+ SetLife( 10 );
+ SetInvincibility( 18 );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{
+ if( !BeVanished() ){
+ SetShotDirectionType( ABSOLUTE );
+ if( Level == 0 || GetY() > GetClipMaxY() - 64 ){ CreateShot01( GetX(), GetY(), 1.6, GetAngle(), GREEN31, 24 ); }
+ else{ CircleShotGap01( [ 360, 120, 90, 72 ][ Level ], 1.6, GREEN31, 24, GetAngle() ); }
+ }
+ if( count > 100 || Argv % 5 == 0 ){ DropItem( 1, 8 ); }
+ }
+ @DrawLoop{
+ SetGraphicAngle( 0, 0, -count * 8 );
+ SetGraphicRect( 0, 0, 32, 32 );
+ DrawChr( imgEnemyKedamaBlue, count );
+ SetGraphicAngle( 0, 0, 0 );
+ }
+}
diff --git a/th_dnh/script/thA/LeilaA.dnh b/th_dnh/script/thA/LeilaA.dnh
new file mode 100644
index 0000000..6739bcd
--- /dev/null
+++ b/th_dnh/script/thA/LeilaA.dnh
@@ -0,0 +1,4 @@
+#ScriptPathData
+#ScriptPath[.\LeilaA1.dnh]
+#ScriptPath[.\LeilaA2_.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/LeilaA1.dnh b/th_dnh/script/thA/LeilaA1.dnh
new file mode 100644
index 0000000..e31146e
--- /dev/null
+++ b/th_dnh/script/thA/LeilaA1.dnh
@@ -0,0 +1,84 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let uniquestr = "G_LEILAA1";
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ SetShotDirectionType( PLAYER );
+ Wait( 60 );
+ let dir = -1;
+ loop{
+ ascent( let i in 0..10 ){
+ let speed = 1;
+ loop( [ 1, 2 ][ Level != 0 ] ){
+ CircleShotGap01( [ 90, 60 ][ trunc( Level / 2 ) ], speed, RED03, 20, i * 12 * dir );
+ speed += 0.6;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 10 );
+ }
+ ExMove( false, count );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 2, angle, 0 );
+ angle += 45;
+ }
+ PlaySEEx( seShadow );
+ Wait( 60 );
+ dir = -dir;
+ }
+ }
+ @Initialize{
+ SetLife( 1500 );
+ SetTimer( 30 );
+ SetInvincibility( 50 );
+ SetDamageRate( 100, 10 );
+ DeleteEnemyShotToItem( ALL );
+ SetEffectForZeroLife( 1, 0, 0 );
+ Behavior();
+ SetShotAutoDeleteClip( 64, 64, 64, 64 );
+ SetCommonData( "ShowName", 6 );
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, 3 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ SetCommonData( "ShowName", -1 );
+ DropItem( 10, 64 );
+ DropBomb();
+ }
+ @DrawLoop{
+ SetAlpha( Smooth( 0, 240, count, 200 ) );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let PrevLife;
+ @Initialize{
+ SetLife( 70 );
+ PrevLife = GetLife();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, "G_LEILAA1", true );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleRed, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/LeilaA2_.dnh b/th_dnh/script/thA/LeilaA2_.dnh
new file mode 100644
index 0000000..1a2540d
--- /dev/null
+++ b/th_dnh/script/thA/LeilaA2_.dnh
@@ -0,0 +1,29 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ PlaySEEx( seBossExplode );
+ Wait( 60 );
+ SetMovePosition01( GetClipMinX() + 32, -32, 5 );
+ yield;
+ WaitZeroSpeed();
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetInvincibility( 130 );
+ SetDamageRate( 0, 0 );
+ SetEnemyMarker( false );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ SetAlpha( 240 );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+}
diff --git a/th_dnh/script/thA/LeilaB.dnh b/th_dnh/script/thA/LeilaB.dnh
new file mode 100644
index 0000000..1aabf8f
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB.dnh
@@ -0,0 +1,13 @@
+#ScriptPathData
+#ScriptPath[.\LeilaB0.dnh]
+#ScriptPath[.\LeilaB1.dnh]
+#ScriptPath[.\LeilaB1S.dnh]
+#ScriptNextStep
+#ScriptPath[.\LeilaB2.dnh]
+#ScriptPath[.\LeilaB2S.dnh]
+#ScriptNextStep
+#ScriptPath[.\LeilaB3_.dnh]
+#ScriptPath[.\LeilaB3S.dnh]
+#ScriptPath[.\LeilaB4S.dnh]
+#ScriptPath[.\LeilaB5S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/LeilaB0.dnh b/th_dnh/script/thA/LeilaB0.dnh
new file mode 100644
index 0000000..d8c85ed
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB0.dnh
@@ -0,0 +1,143 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let suddentime = 0;
+ let bgm = false;
+ task Behavior(){
+ yield;
+ while( GetEventStep() != 1 ){ yield; }
+ suddentime = count;
+ SetEnemyMarker( true );
+ SetY( GetClipMinY() + 96 );
+ Wait( 60 );
+ SetCommonData( "ShowName", 6 );
+ PlayMusicEx( 9 );
+ Wait( 30 );
+ bgm = true;
+ }
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ SetX( GetCenterX() );
+ SetY( -128 );
+ CreateEventFromScript( "Talk" );
+ Behavior();
+ }
+ @MainLoop{
+ if( !OnEvent() && bgm ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 24, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ SetAlpha( [ 0, Smooth( 0, 240, count - suddentime, 200 ) ][ suddentime != 0 ] );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]ここまで来ておいて" );
+ TextOut( "\c[BLUE]この館、実は無人でした・・・\nなんて言わせないでよね" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]この館は無人よ" );
+ SetStep( 1 );
+ Wait( 60 );
+ SetChar( RIGHT, imgCutInLeila );
+ SetGraphicRect( RIGHT, 1, 1, 192, 304 );
+ Enemy();
+ SetNameFromTexture( RIGHT, imgNameLeila );
+ TextOut( "\c[RED]人間「だった」ものなら\nいるかもしれないけど" );
+ Player();
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]まさに幽霊屋敷ね" );
+ Enemy();
+ TextOut( "\c[RED]で、幽霊の館主に何の用かしら?" );
+ Player();
+ DeleteName( RIGHT );
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]ここから出てくる冷気のせいで\n温泉にも入れないのよ" );
+ TextOut( "\c[BLUE]あんたと姉妹が\nここでオドロオドロしてるから" );
+ TextOut( "\c[BLUE]霊気が冷気になって\n出て来てるんじゃないのかしら?" );
+ Enemy();
+ TextOut( "\c[RED]確かにここ10日ほどこの館の床下から\n物凄い冷気が湧き出てきてるわ" );
+ Player();
+ TextOut( "\c[BLUE]地下に黒幕がいるのね、じゃ" );
+ Enemy();
+ TextOut( "\c[RED]ちょっと待ちなさいよ" );
+ Player();
+ SetChar( LEFT, imgCutInReimu2 );
+ TextOut( "\c[BLUE]何?・・・なるほど、\nあんたが番人ね" );
+ Enemy();
+ TextOut( "\c[RED]早とちりしないでもらえるかしら" );
+ TextOut( "\c[RED]この前、私の作り出した姉妹を\n酷い目に遭わせたのはあなたでしょ" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]あれが先に攻撃してきたのが悪い" );
+ Enemy();
+ TextOut( "\c[RED]敵討ちとかそういう物騒なのは\n余り好きじゃないけど" );
+ TextOut( "\c[RED]なんとなくむかついたわ" );
+ Player();
+ SetChar( LEFT, imgCutInReimu5 );
+ TextOut( "\c[BLUE]じゃあジャンケン5回勝負で\nいいかしら?" );
+ Enemy();
+ TextOut( "\c[RED]スペルカード5枚勝負よ!" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]またずいぶんデカい館だな・・・\n紅魔館といい勝負だぜ" );
+ TextOut( "\c[BLUE]にしてもここ人居るのか?\nそこらじゅう埃だらけじゃないか" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]この館は無人よ" );
+ SetStep( 1 );
+ Wait( 60 );
+ SetChar( RIGHT, imgCutInLeila );
+ SetGraphicRect( RIGHT, 1, 1, 192, 304 );
+ Enemy();
+ SetNameFromTexture( RIGHT, imgNameLeila );
+ TextOut( "\c[RED]人間「だった」ものなら\nいるかもしれないけど" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa3 );
+ TextOut( "\c[BLUE]人間でも以外でもいいから掃除しとけよ\n客が逃げるぜこりゃ" );
+ Enemy();
+ TextOut( "\c[RED]元々こんなところに客なんて来ないし" );
+ DeleteName( RIGHT );
+ TextOut( "\c[RED]あなただって一体何の用よ?" );
+ TextOut( "\c[RED]ここまで来て\n姉さんたちをいじめるつもり?" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]なんだよ、私そんな\nいじめっ子として有名なのか?" );
+ Enemy();
+ TextOut( "\c[RED]あなたのせいでパパからもらった\nクラリネットが壊れたって姉さん言ってた" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]クラリネット奏者なんていたっけ?" );
+ Enemy();
+ TextOut( "\c[RED]使ってたのよ、武器として" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa4 );
+ TextOut( "\c[BLUE]普通にぶん殴るための\n道具じゃあないぜ" );
+ Enemy();
+ TextOut( "\c[RED]で、壊れたクラリネットの分\n体で弁償してもらおうかしら" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]ほう、そのためにわざわざ\n冷気出しておびき寄せたのか?" );
+ Enemy();
+ TextOut( "\c[RED]それは私は関係ないわ。確かにここ数日\n床下から物凄い冷気が湧き出てるけど" );
+ TextOut( "\c[RED]・・・そうね、あなたを倒すには\nスペルカード5枚で十分かしら" );
+ Player();
+ TextOut( "\c[BLUE]多すぎだ\n2枚もありゃ十分だぜ" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/LeilaB1.dnh b/th_dnh/script/thA/LeilaB1.dnh
new file mode 100644
index 0000000..cc887cb
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB1.dnh
@@ -0,0 +1,72 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "LEILAB1";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ PlaySEEx( sePower1 );
+ Concentration01( 60 );
+ Wait( 60 );
+ let angle = 0;
+ while( angle < 360 ){
+ ascent( let i in 0..2 ){ CreateEnemyFromScript( "Shade", GetX(), GetY(), 0, angle, i ); }
+ angle += [ 120, 90, 72, 60 ][ Level ];
+ }
+ loop{
+ Wait( 240 );
+ ExMove( false, count );
+ }
+ }
+ @Initialize{
+ SetLife( 2200 );
+ SetTimer( 55 );
+ SetInvincibility( 50 );
+ SetDamageRate( 100, 40 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, 0 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{
+ SetAlpha( 240 );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+}
+script_enemy Shade{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let argv = GetArgument();
+ let RotateSpeed = 2 * [ 1, -1 ][ argv % 2 ];
+ task Behavior(){
+ loop{
+ Wait( 10 );
+ SetShotDirectionType( ABSOLUTE );
+ CircleShotGap01( 120, 1, [ RED21, ORANGE21 ][ argv % 2 ], 5, GetAngle() - count * RotateSpeed + 120 );
+ PlaySE( seShot1 );
+ }
+ }
+ @Initialize{
+ SetLife( 1 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( 160, 80 + count ), count, "LEILAB1" );
+ count++;
+ }
+}
diff --git a/th_dnh/script/thA/LeilaB1S.dnh b/th_dnh/script/thA/LeilaB1S.dnh
new file mode 100644
index 0000000..5be243c
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB1S.dnh
@@ -0,0 +1,199 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_LEILAB1S";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ ascent( let i in 0..4 ){
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( [ "Shadow", "Shadow2", "Shadow3", "Shadow4" ][ i ], GetX(), GetY(), 0, angle, 0 );
+ angle += [ 90, 90, 60, 45 ][ i ];
+ }
+ }
+ PlaySEEx( seShadow );
+ loop{
+ Wait( 300 );
+ ExMoveUnderBorder( false, 128 );
+ }
+ }
+ @Initialize{
+ SetLife( 400 );
+ SetScore( 1300000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 16, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 6 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 10, imgCutInLeila, 192, 304 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, [ -1, 5 ][ count > 130 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ CreateSpellResult( 40 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{
+ SetAlpha( 240 );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+ @BackGround{ LeilaBG( imgSpellChirch, imgSpellLuna, imgSpellRedWall, count ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_LEILAB1S";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let RotateSpeed = 4;
+ task Behavior(){
+ Wait( 20 );
+ loop{
+ SetShotDirectionType( ABSOLUTE );
+ let speed = [ 2, 1.5 ][ Level == 0 ];
+ loop( Max( Level, 1 ) ){
+ CreateShot01( GetX(), GetY(), speed, GetAngle() - count * RotateSpeed + 70, RED22, 15 );
+ speed += 0.8;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 15 );
+ }
+ }
+ @Initialize{
+ SetLife( 300 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count * 2, 64 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
+script_enemy Shadow2{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_LEILAB1S";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let RotateSpeed = -2;
+ task Behavior(){
+ Wait( 20 );
+ loop{
+ SetShotDirectionType( ABSOLUTE );
+ let speed = [ 2, 1.5 ][ Level == 0 ];
+ loop( Max( Level, 1 ) ){
+ CreateShot01( GetX(), GetY(), speed, GetAngle() - count * RotateSpeed + 70, RED22, 15 );
+ speed += 0.8;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ }
+ @Initialize{
+ SetLife( 300 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count * 2, 96 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
+script_enemy Shadow3{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_LEILAB1S";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let RotateSpeed = 1;
+ task Behavior(){
+ Wait( 20 );
+ loop{
+ SetShotDirectionType( ABSOLUTE );
+ let speed = [ 1.8, 1.2 ][ Level == 0 ];
+ loop( Max( Level, 1 ) ){
+ CreateShot01( GetX(), GetY(), speed, GetAngle() - count * RotateSpeed + 70, RED22, 15 );
+ speed += 0.7;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ }
+ @Initialize{
+ SetLife( 300 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count * 2, 128 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
+script_enemy Shadow4{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_LEILAB1S";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let RotateSpeed = -0.5;
+ task Behavior(){
+ Wait( 20 );
+ loop{
+ SetShotDirectionType( ABSOLUTE );
+ let speed = [ 1.8, 1 ][ Level == 0 ];
+ loop( Max( Level, 1 ) ){
+ CreateShot01( GetX(), GetY(), speed, GetAngle() - count * RotateSpeed + 70, RED22, 15 );
+ speed += 0.6;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ }
+ @Initialize{
+ SetLife( 300 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count * 2, 160 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/LeilaB2.dnh b/th_dnh/script/thA/LeilaB2.dnh
new file mode 100644
index 0000000..83142c2
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB2.dnh
@@ -0,0 +1,96 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_LEILAB2";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ Wait( 60 );
+ let angle = 0;
+ while( angle < 360 ){
+ ascent( let i in 0..2 ){ CreateEnemyFromScript( "Shade", GetX(), GetY(), 0, angle, i ); }
+ angle += [ 180, 120, 90, 72 ][ Level ];
+ }
+ loop{
+ Wait( 200 );
+ ExMove( false, count );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 2, angle, 0 );
+ angle += 45;
+ }
+ PlaySEEx( seShadow );
+ }
+ }
+ @Initialize{
+ SetLife( 2300 );
+ SetTimer( 55 );
+ SetInvincibility( 50 );
+ SetDamageRate( 100, 40 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetShotAutoDeleteClip( 64, 64, 64, 64 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, 0 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{
+ SetAlpha( 240 );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+}
+script_enemy Shade{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let argv = GetArgument();
+ let RotateSpeed = 3 * [ 1, -1 ][ argv % 2 ];
+ task Behavior(){
+ let pattern = 0;
+ loop{
+ Wait( 24 );
+ SetShotDirectionType( ABSOLUTE );
+ CircleShotGap01( [ 180, 120 ][ pattern % 5 - Level == 0 ], 1, [ PURPLE03, BLUE03 ][ argv % 2 ], 5, GetAngle() - count * RotateSpeed + 120 );
+ PlaySE( seShot1 );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 1 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( 160, 80 + count ), count, "G_LEILAB2" );
+ count++;
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let PrevLife;
+ @Initialize{
+ SetLife( 70 );
+ PrevLife = GetLife();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, "G_LEILAB2", true );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleRed, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/LeilaB2S.dnh b/th_dnh/script/thA/LeilaB2S.dnh
new file mode 100644
index 0000000..af96944
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB2S.dnh
@@ -0,0 +1,136 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_LEILAB2S";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let pattern = 0;
+ loop{
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 2, angle, pattern );
+ angle += [ 120, 90, 72, 60 ][ Level ];
+ }
+ PlaySEEx( seShadow );
+ Wait( 300 - Level * 10 );
+ ExMove( false, count );
+ Wait( 240 - Level * 50 );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 444 );
+ SetScore( 1700000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 18, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 6 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 11, imgCutInLeila, 192, 304 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, [ -1, 7 ][ count > 130 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ CreateSpellResult( 44 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{
+ SetAlpha( 240 );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+ @BackGround{ LeilaBG( imgSpellChirch, imgSpellLuna, imgSpellRedWall, count ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_LEILAB2S";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgument();
+ let PrevLife;
+ task Rotate(){
+ loop{
+ SetAngle( GetAngle() + Smooth( 1, 0.1, count, 256 ) * [ 1, -1 ][ Argv % 2 ] );
+ yield;
+ }
+ }
+ task Behavior(){
+ yield;
+ Rotate();
+ Wait( 30 );
+ loop{
+ CreateEnemyFromScript( "Shadow2", GetX(), GetY(), 0, GetAngle(), Argv );
+ PlaySEEx( seShadow );
+ Wait( 20 );
+ }
+ }
+ @Initialize{
+ SetLife( 333 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
+script_enemy Shadow2{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_LEILAB2S";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgument();
+ let PrevLife;
+ task Behavior(){
+ yield;
+ let ziki = IsHidden();
+ Wait( 100 );
+ let gap = [ GetAngle(), GetAngleToPlayer() ][ ziki ];
+ let pattern = 0;
+ loop( 6 ){
+ CircleShotGap01( 72, 0.5, [ [ RED21, BLUE21 ][ Argv % 2 ], [ PURPLE21, AQUA21 ][ Argv % 2 ] ][ ziki ], 5, pattern * 3 * [ -1, 1 ][ Argv % 2 ] + gap );
+ PlaySE( seShot1 );
+ Wait( 12 );
+ pattern++;
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 256 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleGreen, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/LeilaB3S.dnh b/th_dnh/script/thA/LeilaB3S.dnh
new file mode 100644
index 0000000..0b7f95c
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB3S.dnh
@@ -0,0 +1,109 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let uniquestr = "G_LEILAB3S";
+ task Move{
+ loop{
+ Wait( 200 );
+ PlaySE( seShot3 );
+ SetShotDirectionType( PLAYER );
+ CircleShot01( [ 30, 20, 20, 12 ][ Level ], [ 1.5, 1.7, 2.4, 2.6 ][ Level ], GREEN02, 20 );
+ ExMove( false, count );
+ }
+ }
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ Concentration01( 120 );
+ PlaySEEx( sePower1 );
+ Wait( 120 );
+ Move();
+ let pattern = 0;
+ loop{
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 4, GetAngleToPlayer(), 0 );
+ PlaySE( seShadow );
+ Wait( Max( 150 - pattern * 10, [ 60, 120 ][ pattern % 3 == 0 ] ) );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 400 );
+ SetScore( 1200000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 18, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 6 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 12, imgCutInLeila, 192, 304 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, 0 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 12 * 4 + Level );
+ ReleaseShadowInterface( uniquestr );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{
+ SetAlpha( 240 );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+ @BackGround{ LeilaBG( imgSpellChirch, imgSpellLuna, imgSpellRedWall, count ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ @Initialize{
+ SetLife( 333 );
+ PrevLife = GetLife();
+ }
+ @MainLoop{
+ let angle = GetAngle();
+ let pangle = GetAngleToPlayer();
+ let r = pangle - angle;
+ if( ( r > 0 && r <= 180 ) || ( r <= -180 ) ){ angle++; }
+ else if( ( r > 180 ) || ( r < 0 && r > -180 ) ){ angle--; }
+ SetAngle( ( angle + 7200 ) % 360 );
+ if( Hypot( GetX() - GetPlayerX(), GetY() - GetPlayerY() ) < 80 && !IsOut( -8 ) ){
+ SetShotDirectionType( ABSOLUTE );
+ let angle = 0;
+ while( angle < 360 ){
+ let anglegap = GetAngleToPlayer() + angle;
+ ascent( let i in 0..2 ){
+ let fspeed = [ [ 1.1, 1.4, 1.8, 2 ][ Level ], [ 0.8, 1.1, 1.5, 1.6 ][ Level ] ][ i ];
+ CreateShotA( 0, GetX(), GetY(), 20 );
+ SetShotDataA( 0, 0, [ 3, 2 ][ i ], anglegap, 0, -0.1, 0, [ RED21, PURPLE21 ][ i ] );
+ SetShotDataA( 0, 33, 0.3, anglegap + [ 160, 90 ][ i ], 0, 0.01, fspeed, [ RED21, PURPLE21 ][ i ] );
+ SetShotDataA( 0, 50, NULL, NULL, 0, 0.05, fspeed, [ RED21, PURPLE21 ][ i ] );
+ FireShot( 0 );
+ }
+ angle += [ 20, 15, 15, 10 ][ Level ];
+ }
+ PlaySEEx( seShot1 );
+ VanishEnemy();
+ }
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, "G_LEILAB3S", false );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleGreen, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/LeilaB3_.dnh b/th_dnh/script/thA/LeilaB3_.dnh
new file mode 100644
index 0000000..ae3b04c
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB3_.dnh
@@ -0,0 +1,27 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ Wait( 120 );
+ AddLife( -1 );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetInvincibility( 120 );
+ SetDamageRate( 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ SetAlpha( 240 );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+}
diff --git a/th_dnh/script/thA/LeilaB4S.dnh b/th_dnh/script/thA/LeilaB4S.dnh
new file mode 100644
index 0000000..11f07b5
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB4S.dnh
@@ -0,0 +1,80 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ Wait( 30 );
+ Concentration01( 100 );
+ PlaySEEx( sePower1 );
+ SetShotDirectionType( PLAYER );
+ Wait( 50 );
+ let pattern = 0;
+ loop{
+ Wait( 50 );
+ local{
+ let speed = 0.8;
+ loop( [ 10, 6 ][ Level == 0 ] ){
+ let anglegap = RandBlur( 15 );
+ let angle = 0;
+ while( angle < 360 ){
+ let finalangle = angle + anglegap + 30;
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, speed, finalangle, 0, -speed / 50, 0, YELLOW04 );
+ SetShotDataA( 0, 50, 0, finalangle + 30 * [ 1, -1 ][ pattern % 2 ], [ 1, -1 ][ pattern % 2 ], speed / 50, speed / 2, YELLOW04 );
+ SetShotDataA( 0, 130, NULL, NULL, 0, speed / 50, speed / 2, YELLOW04 );
+ FireShot( 0 );
+ angle += [ 60, 60, 45, 30 ][ Level ];
+ }
+ speed += 0.3;
+ }
+ }
+ local{
+ let speed = 5;
+ loop( [ 3, 5, 6, 6 ][ Level ] ){
+ CircleShotGap02( [ 60, 72, 45, 36 ][ Level ], speed, -speed / 50, speed / 10, YELLOW01, 10, rand( -15, 15 ) );
+ speed += 1;
+ }
+ }
+ PlaySEEx( seShot3 );
+ if( pattern % 3 == 2 ){ ExMove( false, count ); }
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 400 );
+ SetScore( 1200000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 15, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 6 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 13, imgCutInLeila, 192, 304 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 13 * 4 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{
+ SetAlpha( 240 );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+ @BackGround{ LeilaBG( imgSpellChirch, imgSpellLuna, imgSpellRedWall, count ); }
+}
diff --git a/th_dnh/script/thA/LeilaB5S.dnh b/th_dnh/script/thA/LeilaB5S.dnh
new file mode 100644
index 0000000..ed88222
--- /dev/null
+++ b/th_dnh/script/thA/LeilaB5S.dnh
@@ -0,0 +1,97 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task BigBall(){
+ let pattern = 0;
+ loop{
+ Wait( GetTimer() + 5 );
+ let size = rand( [ 72, 76, 104, 112 ][ Level ], [ 128, 144, 144, 160 ][ Level ] );
+ let x = [ GetPlayerX(), GetX() ][ pattern == 0 ];
+ let y = [ rand( GetClipMinY(), GetCenterY() - 64 ), GetY() ][ pattern == 0 ];
+ CreateLaserA( 0, x, y, size, size, RED03, 5 );
+ SetLaserDataA( 0, 0, 90, 0, 0, 0, 90 );
+ ascent( let i in 1..50 ){
+ SetLaserDataA( 0, i, NULL, 0, 0, Accelerate( 0, [ 2, 3.3, 3.6, 4 ][ Level ], i, 50 ), 90 );
+ yield;
+ }
+ FireShot( 0 );
+ PlaySEEx( seShot1 );
+ pattern++;
+ }
+ }
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ PlaySEEx( sePower1 );
+ Concentration01( 130 );
+ BigBall();
+ Wait( 130 );
+ let halflevel = trunc( Level / 2 );
+ loop{
+ let dir = -1;
+ loop( 2 ){
+ let pangle = GetAngleToPlayer();
+ ascent( let pattern in 0..6 ){
+ if( pattern % [ 3, 2 ][ halflevel ] == 0 ){ CircleShotGap01( [ 20, 15, 15, 12 ][ Level ], 1, RED01, 10, GetAngleToPlayer() ); }
+ let gap = 0;
+ loop( 2 ){
+ let angle = -7;
+ while( angle < 360 ){
+ let speed = 3;
+ loop( 2 ){
+ CreateShotA( 1, GetX(), GetY(), 30 );
+ SetShotDataA( 1, 0, speed, angle + gap + pangle - count * dir, 3 * dir, -0.2, speed / 2, PURPLE01 );
+ SetShotDataA( 1, 60 + trunc( pattern * 1.5 ), NULL, NULL, 0, -0.3, speed / 4, PURPLE01 );
+ FireShot( 1 ); // 0はBigBall()で使用されている
+ speed += 3;
+ }
+ angle += [ 72, 60 ][ halflevel ];
+ }
+ gap += 14;
+ }
+ PlaySEEx( seShot3 );
+ Wait( 6 );
+ }
+ dir = -dir;
+ }
+ Wait( 50 );
+ }
+ }
+ @Initialize{
+ SetLife( 400 );
+ SetScore( 1600000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 15, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( [ 60, 1 ][ GetCommonDataDefault( "SpellPractice", false ) ], 0, 0 );
+ SetCommonData( "ShowName", 6 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 14, imgCutInLeila, 192, 304 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ if( GetLife() <= 0 ){ if( count % 15 == 0 ){ PlaySEEx( seShot1 ); } }
+ else{ yield; }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 14 * 4 + Level );
+ EndSpell();
+ }
+ @DrawLoop{
+ SetAlpha( 240 );
+ DrawBossChr( imgEnemyLeila, 1, 1, 38, 76, count );
+ SetAlpha( 255 );
+ }
+ @BackGround{ LeilaBG( imgSpellChirch, imgSpellLuna, imgSpellRedWall, count ); }
+}
diff --git a/th_dnh/script/thA/LeilaBE.dnh b/th_dnh/script/thA/LeilaBE.dnh
new file mode 100644
index 0000000..46d1b18
--- /dev/null
+++ b/th_dnh/script/thA/LeilaBE.dnh
@@ -0,0 +1,70 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ PlaySEEx( seBossExplode );
+ CreateEventFromScript( "Talk" );
+ while( GetEventStep() != 1 ){ yield; }
+ SetCommonData( "Result", true );
+ let clear = 40000000;
+ let point = GetPoint() * 50000 - GetCommonDataDefault( "ResultPoint", 0 );
+ let graze = GetGraze() * 500 - GetCommonDataDefault( "ResultGraze", 0 );
+ let rank = [ 50, 100, 120, 150 ][ GetCommonDataDefault( "Level", 1 ) ];
+ let total = ( clear + point + graze ) * ( rank / 100 );
+ SetCommonData( "ResultClear", clear );
+ SetCommonData( "ResultPoint", point );
+ SetCommonData( "ResultGraze", graze );
+ SetCommonData( "ResultRank", rank );
+ SetCommonData( "ResultTotal", total );
+ AddScore( total );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetX( -128 );
+ SetY( -128 );
+ LoadSE( seBossExplode );
+ ForbidBomb( true );
+ ForbidShot( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( !OnEvent() ){ VanishEnemy(); }
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ SetChar( RIGHT, imgCutInLeilaCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 304 );
+ Player();
+ TextOut( "\c[BLUE]全然強く無いわね、\n数撃ちゃいいってもんじゃないわ" );
+ Enemy();
+ TextOut( "\c[RED]うぅ、私楽器使えないし" );
+ Player();
+ SetStep( 1 );
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]はいはい負け惜しみよくない\nそれじゃさっさと地下行かせてもらうわね" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa2 );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ SetChar( RIGHT, imgCutInLeilaCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 304 );
+ Player();
+ TextOut( "\c[BLUE]なんだそりゃ\n5枚も用意しててその程度かよ" );
+ Enemy();
+ TextOut( "\c[RED]うぅ、なんか埃っぽいし" );
+ Player();
+ SetStep( 1 );
+ SetChar( LEFT, imgCutInMarisa3 );
+ TextOut( "\c[BLUE]さっさと掃除しろ。\nちなみにこの箒は貸さないぜ" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/Letty.dnh b/th_dnh/script/thA/Letty.dnh
new file mode 100644
index 0000000..c13e115
--- /dev/null
+++ b/th_dnh/script/thA/Letty.dnh
@@ -0,0 +1,4 @@
+#ScriptPathData
+#ScriptPath[.\Letty1.dnh]
+#ScriptPath[.\Letty1S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/Letty1.dnh b/th_dnh/script/thA/Letty1.dnh
new file mode 100644
index 0000000..53bcff2
--- /dev/null
+++ b/th_dnh/script/thA/Letty1.dnh
@@ -0,0 +1,111 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_LETTY1";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ loop{
+ Wait( 40 );
+ loop( 2 ){
+ Wait( 20 );
+ ExMove( false, count );
+ ascent( let x in 0..7 ){
+ SetShotDirectionType( PLAYER );
+ let speed = 1;
+ loop( [ 2, 4, 5, 6 ][ Level ] ){
+ CreateShot01( GetX(), GetY(), speed + 1.5, 0, WHITE22, 15 );
+ let dir = -1;
+ loop( 2 ){
+ CreateShot12( GetX(), GetY(), Smooth( 0, speed, x, 6 ) * dir + RandBlur( 2 ), rand( 0, -speed ), 0, 0.08, 10, 3, WHITE04, 15 );
+ dir = -dir;
+ }
+ speed += 0.5;
+ }
+ PlaySEEx( seShot2 );
+ Wait( 8 );
+ }
+ Wait( 50 );
+ ExMove( false, count );
+ let speed = 1;
+ loop( 10 ){
+ SetShotDirectionType( PLAYER );
+ CircleShot01( [ 20, 15, 15, 12 ][ Level ], speed, BLUE21, 30 );
+ PlaySEEx( seShot1 );
+ Wait( 5 );
+ speed += 0.6;
+ }
+ }
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, angle, 0 );
+ angle += [ 90, 90, 60, 45 ][ Level ];
+ }
+ PlaySEEx( seShadow );
+ Wait( 60 );
+ ExMove( false, count );
+ }
+ }
+ @Initialize{
+ SetLife( 2200 );
+ SetTimer( 40 );
+ SetInvincibility( 50 );
+ SetDamageRate( 100, 60 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ SetShotAutoDeleteClip( 0, 192, 0, 0 );
+ SetCommonData( "ShowName", 4 );
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, [ -1, 7 ][ count > 130 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 15 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{ DrawBossChr( imgEnemyLetty, 1, 1, 31, 76, count ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_LETTY1";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let RotateSpeed = 1;
+ task Behavior(){
+ Wait( 20 );
+ loop( 14 ){
+ SetShotDirectionType( ABSOLUTE );
+ let speed = [ 2, 1.5 ][ Level == 0 ];
+ loop( Max( Level, 1 ) ){
+ WayShotGap02( 30, 30, 0, 0.1, speed, WHITE12, 5, GetAngle() - count * RotateSpeed + RandBlur( 30 ) );
+ speed += 0.8;
+ }
+ PlaySEEx( seShot1 );
+ Wait( [ 10, 5 ][ trunc( Level / 2 ) ] );
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 200 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count * 2, 160 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Letty1S.dnh b/th_dnh/script/thA/Letty1S.dnh
new file mode 100644
index 0000000..3276deb
--- /dev/null
+++ b/th_dnh/script/thA/Letty1S.dnh
@@ -0,0 +1,116 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let ColdTimer = 90;
+ task Cold( let x, let y ){
+ let angle = rand( 0, 360 );
+ let speed = rand( 0.9, 1.2 );
+ CreateShotA( 0, x, y, ColdTimer );
+ SetShotDataA( 0, 0, 6, angle, 0, -0.5, 0, BLUE01 );
+ SetShotDataA( 0, 15, 0, angle + 180, 0, 0.01, speed, BLUE01 );
+ FireShot( 0 );
+ if( Level == 3 ){
+ let gap = -1.5;
+ loop( 2 ){
+ CreateShotA( 0, x, y, ColdTimer );
+ SetShotDataA( 0, 0, 6, angle + gap, 0, -0.5, 0, BLUE04 );
+ SetShotDataA( 0, 15, 0, angle + gap + 180, 0, 0.01, speed, BLUE04 );
+ FireShot( 0 );
+ gap += 3;
+ }
+ }
+ if( count % 4 == 0 ){ return; }
+ PlaySEEx( seKira1 );
+ Wait( ColdTimer );
+ if( count % 8 == 0 ){ return; }
+ PlaySEEx( seShot1 );
+ }
+ task Blizzard( let gap ){
+ let obj = SetHiddenObject( GetX(), GetY(), 0, GetAngleToPlayer() + gap, 0, true, true );
+ let count = 0;
+ while( !Obj_BeDeleted( obj ) ){
+ let speed = Obj_GetSpeed( obj );
+ Obj_SetSpeed( obj, speed + 0.05 );
+ if( speed > 1.5 && count % [ 3, 5 ][ Level == 0 ] == 0 ){ Cold( Obj_GetX( obj ), Obj_GetY( obj ) ); }
+ yield;
+ count++;
+ }
+ }
+ task Behavior(){
+ function ShotBlizzard( let space, let gap ){
+ let angle = gap;
+ while( angle < 360 ){
+ Blizzard( angle );
+ angle += space;
+ }
+ }
+ loop{
+ PlaySEEx( sePower1 );
+ Concentration02( 90 );
+ Wait( 90 );
+ alternative( Level )
+ case( 0, 1 ){
+ Blizzard( 0 );
+ Wait( 30 );
+ ShotBlizzard( 180, 90 );
+ Wait( 30 );
+ ShotBlizzard( 120, 60 );
+ }
+ case( 2, 3 ){
+ Blizzard( 0 );
+ Wait( 15 );
+ ShotBlizzard( 180, 90 );
+ Wait( 15 );
+ ShotBlizzard( 120, 60 );
+ Wait( 15 );
+ ShotBlizzard( 90, 45 );
+ Wait( 15 );
+ ShotBlizzard( 72, 0 );
+ }
+ Wait( 150 );
+ let space = [ 30, 30, 16, 20 ][ trunc( Level / 2 ) ];
+ CircleShot02( space, 10, -0.4, 1, WHITE02, 10 );
+ if( Level != 0 ){ CircleShotGap02( space, 10, -0.36, 1.2, WHITE02, 10, space / 2 ); }
+ PlaySEEx( seShot3 );
+ ExMove( false, count );
+ Wait( 50 );
+ }
+ }
+ @Initialize{
+ SetLife( 446 );
+ SetScore( 720000 );
+ SetTimer( 50 );
+ SetInvincibility( 100 );
+ SetDamageRate( 18, 24 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 4 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 5, imgCutInLetty, 192, 304 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 15 );
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 20 + Level );
+ EndSpell();
+ SetCommonData( "ShowName", -1 );
+ PlaySEEx( seBossExplode );
+ DropItem( 10, 64 );
+ DropExtend();
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyLetty, 1, 1, 31, 76, count ); }
+ @BackGround{ LettyBG( imgSpellIceWall, count ); }
+}
diff --git a/th_dnh/script/thA/Lily.dnh b/th_dnh/script/thA/Lily.dnh
new file mode 100644
index 0000000..ebbce3d
--- /dev/null
+++ b/th_dnh/script/thA/Lily.dnh
@@ -0,0 +1,13 @@
+#ScriptPathData
+#ScriptPath[.\Lily0.dnh]
+#ScriptPath[.\Lily1.dnh]
+#ScriptPath[.\Lily1S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Lily2S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Lily3.dnh]
+#ScriptPath[.\Lily3S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Lily4_.dnh]
+#ScriptPath[.\Lily4S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/Lily0.dnh b/th_dnh/script/thA/Lily0.dnh
new file mode 100644
index 0000000..0bf94fe
--- /dev/null
+++ b/th_dnh/script/thA/Lily0.dnh
@@ -0,0 +1,138 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let bgm = false;
+ task Behavior(){
+ yield;
+ while( GetEventStep() != 1 ){ yield; }
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetCommonData( "ShowName", 5 );
+ while( GetEventStep() != 2 ){ yield; }
+ PlayMusicEx( 7 );
+ Wait( 30 );
+ bgm = true;
+ }
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ SetX( GetCenterX() );
+ SetY( -128 );
+ LoadGraphic( imgEnemyLily );
+ CreateEventFromScript( "Talk" );
+ Behavior();
+ }
+ @MainLoop{
+ if( !OnEvent() && bgm ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 48, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyLily, 1, 1, 58, 72, count ); }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]確かこの辺だったはずなんだけど…" );
+ SetChar( LEFT, imgCutInReimu3 );
+ TextOut( "\c[BLUE]ああもう、こんなに雪だらけだったら\n温泉もなにも分からないじゃないの!" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]ここには温泉はないですよ?" );
+ SetStep( 1 );
+ Wait( 60 );
+ SetChar( RIGHT, imgCutInLily );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Enemy();
+ SetNameFromTexture( RIGHT, imgNameLily );
+ TextOut( "\c[RED]いえ、もうここにあるものは既に\n温泉ではない、と言った方がいいかしら" );
+ SetChar( LEFT, imgCutInReimu4 );
+ Player();
+ TextOut( "\c[BLUE]何で春の妖精がこんな\n場違いな季節と場所にいるのよ?" );
+ Enemy();
+ TextOut( "\c[RED]だって、また空高く行けば\n暖かくなるかと思ったんです・・・" );
+ DeleteName( RIGHT );
+ Player();
+ TextOut( "\c[BLUE]あの馬鹿幽霊のせいで間違った知識\n植え付けられたのね、かわいそうに" );
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]で、どういうこと?\nここが温泉じゃなくなったって" );
+ Enemy();
+ TextOut( "\c[RED]余りに寒かったから、近くに湯気の\n立つ水辺があったから・・・くしゅん!" );
+ Player();
+ TextOut( "\c[BLUE]・・・真水だった、って\n言いたいわけね" );
+ Enemy();
+ TextOut( "\c[RED]くすん・・・\n風邪ひいちゃいました" );
+ Player();
+ TextOut( "\c[BLUE]感染さないでよね" );
+ TextOut( "\c[BLUE]と、まぁそれはともかく、\nなんでこんなことしたの?" );
+ Enemy();
+ TextOut( "\c[RED]へ?" );
+ Player();
+ SetChar( LEFT, imgCutInReimu3 );
+ TextOut( "\c[BLUE]どーせあんた、春をばらまくために\nこの辺の春を吸いとったんでしょ!" );
+ Enemy();
+ TextOut( "\c[RED]ひどい!\nそんな言い掛かりつけて私を・・・" );
+ SetStep( 2 );
+ TextOut( "\c[RED]こうなったら・・・\n風邪感染しちゃいますよ?" );
+ SetChar( LEFT, imgCutInReimu );
+ Player();
+ TextOut( "\c[BLUE]その前に殺すわ" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]全く酷いもんだ。\nこんな雪だらけじゃ茶も取れやしないぜ" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]全く酷いです・・・\n春を求めてここまで来たのに" );
+ SetStep( 1 );
+ Wait( 100 );
+ SetChar( RIGHT, imgCutInLily );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Enemy();
+ SetNameFromTexture( RIGHT, imgNameLily );
+ TextOut( "\c[RED]こんな寒いんじゃ\n風邪引いちゃいますよ" );
+ Player();
+ TextOut( "\c[BLUE]普通高所は寒いんだがな" );
+ Enemy();
+ TextOut( "\c[RED]えー?でもこの前雲の上まで行ったら\nすごい暖かかったじゃないですかー" );
+ DeleteName( RIGHT );
+ Player();
+ TextOut( "\c[BLUE]昨日暖かくても、\n今日暖かいとは限らないぜ" );
+ TextOut( "\c[BLUE]それに暖かかったのは\nいつぞやの馬鹿幽霊共の所為だ" );
+ Enemy();
+ TextOut( "\c[RED]そうなんですかー" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]で、なんでこんな雪だらけなんだ?" );
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]いくら冬の始めとは言え\n積もりすぎだろ、こりゃ" );
+ Enemy();
+ TextOut( "\c[RED]そんなの私が聞きたいですよー" );
+ Player();
+ TextOut( "\c[BLUE]そうだな、じゃあ\nこの名探偵魔理沙様が推理してみようか" );
+ TextOut( "\c[BLUE]お前が高山茶を食ってたら\nいつの間にか食い尽くしてしまった" );
+ TextOut( "\c[BLUE]一帯だけ禿山になって不自然に思った\nお前は春も食いつくし豪雪を降らせた" );
+ Enemy();
+ TextOut( "\c[RED]・・・・・・" );
+ Player();
+ TextOut( "\c[BLUE]だが残念だな、この\n早すぎる豪雪の方がよっぽど不自然だ" );
+ SetChar( LEFT, imgCutInMarisa3 );
+ TextOut( "\c[BLUE]よって、高山茶殺人事件の犯人はお前だ!" );
+ Enemy();
+ TextOut( "\c[RED]・・・殺人事件って何ですか・・・" );
+ Player();
+ SetStep( 2 );
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]どうだ、まいったか!\nさぁ罪人はこの場で御用だぜ" );
+ Enemy();
+ TextOut( "\c[RED]そもそも私そんな\n大食いキャラなんかじゃありません!" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/Lily1.dnh b/th_dnh/script/thA/Lily1.dnh
new file mode 100644
index 0000000..c6b2fa1
--- /dev/null
+++ b/th_dnh/script/thA/Lily1.dnh
@@ -0,0 +1,61 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task BuckShot( let speed, let graphic, let clustergraphic, let clustergap ){
+ let obj = SetShotObject( GetX(), GetY(), speed, rand( 0, 360 ), graphic, 30 );
+ while( !Obj_BeDeleted( obj ) ){
+ yield;
+ let nowspeed = Obj_GetSpeed( obj );
+ Obj_SetSpeed( obj, nowspeed - 0.05 );
+ if( nowspeed < 0.1 ){
+ SetShotDirectionType( PLAYER );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), rand( 1, 1.5 + Level ), angle, clustergraphic, 20 );
+ angle += clustergap;
+ }
+ PlaySEEx( seShot1 );
+ Obj_Delete( obj );
+ return;
+ }
+ }
+ }
+ task Behavior(){
+ yield;
+ let pattern = 0;
+ loop{
+ let color = [ PURPLE21, GREEN21, BLUE21, YELLOW21, AQUA21, ORANGE21, WHITE21, RED21 ][ pattern % 8 ];
+ Wait( 100 );
+ loop( 5 ){ BuckShot( rand( 4.5, 5.5 ), [ PURPLE03, GREEN03, BLUE03, YELLOW03, AQUA03, ORANGE03, WHITE03, RED03 ][ pattern % 8 ], color, [ 30, 15, 12, 8 ][ Level ] ); }
+ loop( 8 ){ BuckShot( rand( 3.6, 4.5 ), [ PURPLE02, GREEN02, BLUE02, YELLOW02, AQUA02, ORANGE02, WHITE02, RED02 ][ pattern % 8 ], color, [ 45, 24, 20, 12 ][ Level ] ); }
+ loop( 12 ){ BuckShot( rand( 3, 4 ), [ PURPLE01, GREEN01, BLUE01, YELLOW01, AQUA01, ORANGE01, WHITE01, RED01 ][ pattern % 8 ], color, [ 90, 45, 30, 20 ][ Level ] ); }
+ loop( 20 ){ BuckShot( rand( 2.5, 3.5 ), [ PURPLE04, GREEN04, BLUE04, YELLOW04, AQUA04, ORANGE04, WHITE04, RED04 ][ pattern % 8 ], color, [ 120, 60, 36, 24 ][ Level ] ); }
+ PlaySEEx( seShot1 );
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2100 );
+ SetTimer( 40 );
+ SetInvincibility( 50 );
+ SetDamageRate( 100, 60 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 24 );
+ yield;
+ count++;
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyLily, 1, 1, 58, 72, count ); }
+}
diff --git a/th_dnh/script/thA/Lily1S.dnh b/th_dnh/script/thA/Lily1S.dnh
new file mode 100644
index 0000000..5bc8331
--- /dev/null
+++ b/th_dnh/script/thA/Lily1S.dnh
@@ -0,0 +1,72 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ function BuckShot( let colorcode ){
+ loop( 5 ){ CreateShot01( GetX(), GetY(), rand( 4.5, 5.5 ), rand( 0, 360 ), [ AQUA03, ORANGE03, GREEN03, RED03, YELLOW03 ][ colorcode ], 30 ); }
+ loop( 10 ){ CreateShot01( GetX(), GetY(), rand( 3.5, 4.5 ), rand( 0, 360 ), [ AQUA02, ORANGE02 , GREEN02, RED02, YELLOW02 ][ colorcode ], 30 ); }
+ loop( 17 ){ CreateShot01( GetX(), GetY(), rand( 3, 4 ), rand( 0, 360 ), [ AQUA01, ORANGE01 , GREEN01, RED01, YELLOW01 ][ colorcode ], 30 ); }
+ loop( 33 ){ CreateShot01( GetX(), GetY(), rand( 2.5, 3.5 ), rand( 0, 360 ), [ AQUA04, ORANGE04 , GREEN04, RED04, YELLOW04 ][ colorcode ], 30 ); }
+ loop( 50 ){ CreateShot01( GetX(), GetY(), rand( 2, 3 ), rand( 0, 360 ), [ AQUA05, ORANGE05 , GREEN05, RED05, YELLOW05 ][ colorcode ], 30 ); }
+ }
+ task Cyclone( let colorcode ){
+ let pangle = GetAngleToPlayer();
+ let halflevel = trunc( Level / 2 );
+ ascent( let i in 0..50 ){
+ CircleShotGap01( [ 60, 45, 45, 36 ][ Level ], Smooth( 1, 7, i, 50 ), [ AQUA12, ORANGE12, GREEN12, RED12, YELLOW12 ][ colorcode ], 20, i * [ 5, -6 ][ halflevel ] );
+ PlaySEEx( seShot2 );
+ Wait( 3 );
+ }
+ }
+ task Behavior(){
+ Wait( 60 );
+ let pattern = 0;
+ SetShotDirectionType( ABSOLUTE );
+ loop{
+ PlaySEEx( sePower1 );
+ Concentration01( 60 );
+ Wait( 60 );
+ loop( Max( Level, 1 ) ){ BuckShot( pattern % 5 ); }
+ PlaySEEx( seShot1 );
+ ExMove( false, count );
+ if( Level >= 2 ){ Cyclone( ( pattern + 3 ) % 5 ); }
+ Wait( 60 );
+ Cyclone( ( pattern + 3 ) % 5 );
+ Wait( 120 );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 420 );
+ SetScore( 1000000 );
+ SetTimer( 60 );
+ SetInvincibility( 130 );
+ SetDamageRate( 20, 10 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 5 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 6, imgCutInLily, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 24 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 24 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyLily, 1, 1, 58, 72, count ); }
+ @BackGround{ LilyBG( imgSpellBamboo, 192, 255, 224, count ); }
+}
diff --git a/th_dnh/script/thA/Lily2S.dnh b/th_dnh/script/thA/Lily2S.dnh
new file mode 100644
index 0000000..b764b51
--- /dev/null
+++ b/th_dnh/script/thA/Lily2S.dnh
@@ -0,0 +1,73 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ let pattern = 0;
+ loop{
+ PlaySEEx( sePower1 );
+ Concentration01( 100 );
+ Wait( 100 );
+ let dir = [ 1, -1 ][ trunc( Level / 2 ) ];
+ loop( [ 1, 2 ][ Level == 3 ] ){
+ let angle = 0;
+ while( angle < 360 ){
+ CreateLaserB( 0, 160, 12, ORANGE21, 40 );
+ SetLaserDataB( 0, 0, 0, 0, 0, 0, 0, angle, 1 * [ 1, -1 ][ pattern % 2 ] * dir );
+ SetShotKillTime( 0, 240 );
+ ascent( let t in 0..18 ){
+ ascent( let l in 1..5 ){
+ ascent( let s in 0..[ 2, 1 ][ Level == 0 ] ){
+ CreateShotA( 1, 0, 0, 20 );
+ SetShotDataA( 1, 0, 0, 90 * [ 1, -1 ][ pattern % 2 ], 0, 0.02, 1.2 + s / 2, [ YELLOW12, ORANGE12 ][ s ] );
+ AddShot( t * 10, 0, 1, l * 32 );
+ }
+ }
+ }
+ FireShot( 0 );
+ angle += [ 72, 60, 45, 60 ][ Level ];
+ }
+ dir = -dir;
+ }
+ PlaySE( seLaser1 );
+ TaskPlay( seShot1, 18, 10 );
+ Wait( [ 120, 180 ][ pattern < 2 ] );
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 4000 );
+ SetScore( 1400000 );
+ SetTimer( 75 );
+ SetInvincibility( 130 );
+ SetDamageRate( 100, 10 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 5 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 7, imgCutInLily, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 24 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 28 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyLily, 1, 1, 58, 72, count ); }
+ @BackGround{ LilyBG( imgSpellBamboo, 255, 224, 192, count ); }
+}
diff --git a/th_dnh/script/thA/Lily3.dnh b/th_dnh/script/thA/Lily3.dnh
new file mode 100644
index 0000000..5c13bb1
--- /dev/null
+++ b/th_dnh/script/thA/Lily3.dnh
@@ -0,0 +1,107 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let HideAlpha = 255;
+ let HideStop = false;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task Obj( let speed, let angle, let num ){
+ let obj = SetShotObject( GetX(), GetY(), speed, angle, BLUE21, 20 );
+ let ocount = 0;
+ Wait( 20 );
+ while( !Obj_BeDeleted( obj ) ){
+ if( ocount < 60 ){ Obj_SetSpeed( obj, Max( Obj_GetSpeed( obj ) - speed / 50, 0 ) ); }
+ if( ocount == 60 ){ Obj_SetAngle( obj, [ -120, 0, 120 ][ num % 3 ] + atan2( GetPlayerY() - Obj_GetY( obj ), GetPlayerX() - Obj_GetX( obj ) ) ); }
+ if( ocount >= 60 ){ Obj_SetSpeed( obj, Min( Obj_GetSpeed( obj ) + 0.1, 2 ) ); }
+ yield;
+ ocount++;
+ }
+ }
+ task Circle(){
+ let pangle = GetAngleToPlayer();
+ ascent( let i in 0..72 ){
+ let toplayer = trunc( i / 3 ) % 2;
+ SetShotDirectionType( [ ABSOLUTE, PLAYER ][ toplayer ] );
+ ascent( let speed in [ 5, 3, 2, 1 ][ Level ]..6 ){
+ let angle = i * 5 + ( speed - 1 ) * 10;
+ if( toplayer == 1 ){ Obj( speed, angle, i ); }
+ else{
+ CreateShotA( 0, GetX(), GetY(), 20 );
+ SetShotDataA( 0, 0, speed, angle, 0, -speed / 50, 0, [ WHITE12, BLUE21 ][ toplayer ] );
+ SetShotDataA( 0, 60, 0, angle + [ -90, 180, 90 ][ i % 3 ], 0, 0.1, 2, [ WHITE12, BLUE21 ][ toplayer ] );
+ FireShot( 0 );
+ }
+ }
+ }
+ PlaySEEx( seShot2 );
+ Wait( 60 );
+ PlaySEEx( seKira1 );
+ }
+ task Behavior(){
+ Wait( 60 );
+ loop{
+ ascent( let i in 0..4 ){
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ Wait( 60 );
+ Circle();
+ Wait( 30 );
+ ExMove( false, count );
+ Wait( [ 100, 20 ][ i == 2 ] );
+ }
+ SetMovePosition03( GetCenterX(), GetCenterY(), 20, 3.5 );
+ Wait( 50 );
+ HideStop = true;
+ Concentration01( 50 );
+ PlaySEEx( sePower1 );
+ Wait( 50 );
+ SetMovePosition03( GetCenterX(), GetClipMinY(), 20, 2 );
+ SetShotDirectionType( ABSOLUTE );
+ let angle = 0;
+ while( angle <= 180 ){
+ let speed = [ 0.8, 1.3, 1.7, 2.1 ][ Level ];
+ loop( 2 ){
+ ascent( let i in 0..2 ){
+ let gap = angle + speed * 5.5;
+ WayShotGap01( 60, [ 30, 20 ][ trunc( Level / 2 ) ], speed, [ BLUE04, PURPLE04 ][ i ], 10, [ gap, 180 - gap ][ i ] );
+ }
+ speed += 0.5;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 8 );
+ angle += 6;
+ }
+ HideStop = false;
+ }
+ }
+ @Initialize{
+ SetLife( 3000 );
+ SetTimer( 40 );
+ SetInvincibility( 50 );
+ SetDamageRate( 100, 100 );
+ DeleteEnemyShotToItem( ALL );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ HideAlpha = MinMax( HideAlpha + [ -16, 7 ][ GetSpeed() < 0.1 || HideStop ], 0, 255 );
+ SetEnemyMarker( HideAlpha > 0 );
+ SEShotHitBoss( seDamage, count );
+ if( HideAlpha > 0 ){ Collision( 36, [ 0, 24 ][ HideAlpha == 255 ] ) };
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ if( HideAlpha != 0 ){
+ SetGraphicScale( Smooth( 0, 1, HideAlpha, 255 ), Smooth( 2, 1, HideAlpha, 255 ) );
+ SetAlpha( HideAlpha );
+ DrawBossChr( imgEnemyLily, 1, 1, 58, 72, count );
+ SetAlpha( 255 );
+ SetGraphicScale( 1, 1 );
+ }
+ }
+}
diff --git a/th_dnh/script/thA/Lily3S.dnh b/th_dnh/script/thA/Lily3S.dnh
new file mode 100644
index 0000000..912d15e
--- /dev/null
+++ b/th_dnh/script/thA/Lily3S.dnh
@@ -0,0 +1,120 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let LaserList = [];
+ task Cluster( let angle ){
+ let obj = SetShotObject( GetX(), GetY(), 2.7, angle, WHITE02, 20 );
+ while( !Obj_BeDeleted( obj ) ){
+ ascent( let i in 0..length( LaserList ) ){
+ if( Collision_Obj_Obj( LaserList[ i ], obj ) ){
+ ascent( let speed in 1..[ 2, 3 ][ Level == 1 ] ){
+ loop( ( Level + 1 ) * 2 ){
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), rand( 1, [ 4, 1.2 ][ Level < 2 ] ) * speed, Obj_GetAngle( LaserList[ i ] ) - 90 + [ 0, RandBlur( 3 ) ][ Level < 2 ], WHITE23, 5 );
+ if( Level == 3 ){
+ let gap = -120;
+ while( gap <= 120 ){
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), rand( 1, 2 ) * speed, Obj_GetAngle( LaserList[ i ] ) - 90 + gap, WHITE23, 5 );
+ gap += 240;
+ }
+ }
+ }
+ }
+ Obj_Delete( obj );
+ break;
+ }
+ }
+ yield;
+ }
+ }
+ task ShotCluster(){
+ let gap = GetAngleToPlayer();
+ loop{
+ let angle= 0;
+ while( angle < 360 ){
+ let dir = 1;
+ loop( 2 ){
+ Cluster( angle + gap * dir );
+ dir = -dir;
+ }
+ angle += [ 120, 180 ][ Level == 0 ];
+ }
+ PlaySEEx( seShot1 );
+ Wait( 10 );
+ gap += [ 10, 15 ][ Level != 0 ];
+ }
+ }
+ task CrashLaser( let angle ){
+ let obj = Obj_Create( OBJ_LASER );
+ let count = 0;
+ let radius = 128;
+ Obj_SetAutoDelete( obj, false );
+ ObjShot_SetGraphic( obj, BLUE01 );
+ ObjShot_SetDelay( obj, 120 );
+ ObjShot_SetBombResist( obj, true );
+ ObjLaser_SetLength( obj, 120 );
+ ObjLaser_SetWidth( obj, 16 );
+ while( !Obj_BeDeleted( obj ) ){
+ let speed = Accelerate( 0.3, 2.4, count, 3600 );
+ if( count == 120 ){ LaserList = LaserList ~ [ obj ]; }
+ Obj_SetX( obj, GetX() + cos( angle - count * speed ) * radius );
+ Obj_SetY( obj, GetY() + sin( angle - count * speed ) * radius );
+ Obj_SetAngle( obj, angle - count * speed + 120 );
+ count++;
+ yield;
+ }
+ }
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ Wait( 90 );
+ ShotCluster();
+ Wait( 130 );
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ let angle = 0;
+ while( angle < 360 ){
+ CrashLaser( angle );
+ angle += 60;
+ }
+ PlaySEEx( seLaser1 );
+ loop{
+ Wait( 300 );
+ ExMove( false, count );
+ }
+ }
+ @Initialize{
+ SetLife( 450 );
+ SetScore( 1000000 );
+ SetTimer( 60 );
+ SetInvincibility( 130 );
+ SetDamageRate( 15, 10 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 5 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 8, imgCutInLily, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 24 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 32 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyLily, 1, 1, 58, 72, count ); }
+ @BackGround{ LilyBG( imgSpellBamboo, 192, 192, 255, count ); }
+}
diff --git a/th_dnh/script/thA/Lily4S.dnh b/th_dnh/script/thA/Lily4S.dnh
new file mode 100644
index 0000000..24ee3e4
--- /dev/null
+++ b/th_dnh/script/thA/Lily4S.dnh
@@ -0,0 +1,125 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "G_LILY4S";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ let pattern = 0;
+ loop{
+ Concentration01( 120 );
+ PlaySEEx( sePower1 );
+ Wait( 120 );
+ local{
+ let max = 3 + pattern % 4;
+ SetCommonData( "SHADOWMAX", max );
+ ascent( let i in 1..max ){
+ let dir = -1;
+ loop( 2 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, 0, i * dir );
+ dir = -dir;
+ }
+ }
+ PlaySEEx( seShadow );
+ Wait( 60 );
+ }
+ local{
+ let color = [ RED21, PURPLE21 ][ pattern % 2 ];
+ let dir = [ -1, 1 ][ pattern % 2 ];
+ ascent( let i in 0..32 ){
+ SetShotDirectionType( PLAYER );
+ let angle = 0;
+ while( angle < 360 ){
+ ascent( let speed in 0..( 1 + trunc( Level / 2 ) ) ){
+ CreateShotA( 0, GetX(), GetY(), 20 );
+ SetShotDataA( 0, 0, [ 7, 4 ][ speed ], angle + i * 11 * dir, 3 * dir, [ -0.2, -0.3 ][ speed ], Smooth( 3, 4, i, 32 ), color );
+ SetShotDataA( 0, 60, NULL, NULL, -0.5 * dir, -0.3, Smooth( 1.5, 1.9, i, 32 ), color );
+ SetShotDataA( 0, 100, NULL, NULL, 0, -0.01, Smooth( 1.3, 1.5, i, 32 ), color );
+ FireShot( 0 );
+ }
+ angle += [ 60, 45, 45, 36 ][ Level ];
+ }
+ PlaySEEx( seShot1 );
+ Wait( 5 );
+ }
+ }
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 3600 );
+ SetScore( 1200000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 100, 150 );
+ DeleteEnemyShotToItem( ALL );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( [ 60, 1 ][ GetCommonDataDefault( "SpellPractice", false ) ], 0, 0 );
+ SetCommonData( "ShowName", 5 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 9, imgCutInLily, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( GetLife() <= 0 ){
+ SetCommonData( uniquestr, 0 );
+ if( count % 15 == 0 ){ PlaySEEx( seShot1 ); }
+ }
+ else{ yield; }
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, [ 1, 5 ][ count > 130 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 24 );
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 36 + Level );
+ DeleteCommonData( "SHADOWMAX" );
+ EndSpell();
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyLily, 1, 1, 58, 72, count ); }
+ @BackGround{ LilyBG( imgSpellBamboo, 255, 192, 224, count ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_LILY4S";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let Argv = GetArgument();
+ task BuckShot( let angle ){
+ let obj = SetHiddenObject( GetX(), GetY(), 32, angle, 0, true, false );
+ yield;
+ SetShotDirectionType( PLAYER );
+ CircleShotObject01( obj, [ 45, 40, 36, 30 ][ Level ], 1, [ WHITE31, ORANGE31 ][ absolute( Argv ) % 2 ], 30 );
+ Obj_Delete( obj );
+ }
+ task Behavior(){
+ Wait( 130 );
+ loop( 12 ){
+ BuckShot( rand( 0, 360 ) );
+ Wait( 8 );
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 286 );
+ SetMovePosition03( GetCenterX() + 176 * GetDir( Argv ), GetClipMinY() + Smooth( 32, 256, absolute( Argv ) - 1, GetCommonDataDefault( "SHADOWMAX", 0 ) - 2 ), 20, 2.5 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ yield;
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadowRect( imgSystemCircleBlue, imgEnemyShadow, 32, 32, sin( count ) * 820, count ); }
+}
diff --git a/th_dnh/script/thA/Lily4_.dnh b/th_dnh/script/thA/Lily4_.dnh
new file mode 100644
index 0000000..878d560
--- /dev/null
+++ b/th_dnh/script/thA/Lily4_.dnh
@@ -0,0 +1,23 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ Wait( 120 );
+ AddLife( -1 );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetInvincibility( 120 );
+ SetDamageRate( 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHitBoss( seDamage, count );
+ Collision( 36, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{ DrawBossChr( imgEnemyLily, 1, 1, 58, 72, count ); }
+}
diff --git a/th_dnh/script/thA/LilyE.dnh b/th_dnh/script/thA/LilyE.dnh
new file mode 100644
index 0000000..bf6a9a2
--- /dev/null
+++ b/th_dnh/script/thA/LilyE.dnh
@@ -0,0 +1,78 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ PlaySEEx( seBossExplode );
+ CreateEventFromScript( "Talk" );
+ while( GetEventStep() != 1 ){ yield; }
+ SetCommonData( "Result", true );
+ let clear = 30000000;
+ let point = GetPoint() * 50000 - GetCommonDataDefault( "ResultPoint", 0 );
+ let graze = GetGraze() * 500 - GetCommonDataDefault( "ResultGraze", 0 );
+ let rank = [ 50, 100, 120, 150 ][ GetCommonDataDefault( "Level", 1 ) ];
+ let total = ( clear + point + graze ) * ( rank / 100 );
+ SetCommonData( "ResultClear", clear );
+ SetCommonData( "ResultPoint", point );
+ SetCommonData( "ResultGraze", graze );
+ SetCommonData( "ResultRank", rank );
+ SetCommonData( "ResultTotal", total );
+ AddScore( total );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetX( -128 );
+ SetY( -128 );
+ LoadSE( seBossExplode );
+ ForbidBomb( true );
+ ForbidShot( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( !OnEvent() ){ VanishEnemy(); }
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu3 );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ SetChar( RIGHT, imgCutInLilyCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Player();
+ TextOut( "\c[BLUE]なによ、あんたが犯人じゃないの?" );
+ Enemy();
+ TextOut( "\c[RED]そういうことは攻撃してくる前に\n気づいて欲しかったです・・・" );
+ TextOut( "\c[RED]心当たりだってあるのに・・・" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]そういうことは先に言う!" );
+ Enemy();
+ SetStep( 1 );
+ TextOut( "\c[RED]だからそれ私のセリフですよ・・・くすん" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa4 );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ SetChar( RIGHT, imgCutInLilyCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Player();
+ TextOut( "\c[BLUE]まいったな、\nとっちめた犯人がまさかシロとは" );
+ Enemy();
+ TextOut( "\c[RED]リリーホワイトですから・・・くすん" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]あー、お前は\nなんか心当たりはあるのか?" );
+ Enemy();
+ TextOut( "\c[RED]この山の向こうのお屋敷の床下で\n冬眠してたら中から物凄い冷気が・・・" );
+ Player();
+ SetStep( 1 );
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]山の向こうか・・・\nちっ、行ったことの無いところだぜ" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/MerryA.dnh b/th_dnh/script/thA/MerryA.dnh
new file mode 100644
index 0000000..e56c778
--- /dev/null
+++ b/th_dnh/script/thA/MerryA.dnh
@@ -0,0 +1,6 @@
+#ScriptPathData
+#ScriptPath[.\MerryA0.dnh]
+#ScriptPath[.\MerryA1.dnh]
+#ScriptPath[.\MerryA1S.dnh]
+#ScriptPath[.\MerryA2_.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/MerryA0.dnh b/th_dnh/script/thA/MerryA0.dnh
new file mode 100644
index 0000000..082c05f
--- /dev/null
+++ b/th_dnh/script/thA/MerryA0.dnh
@@ -0,0 +1,55 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ }
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ SetX( GetCenterX() );
+ SetY( -64 );
+ CreateEventFromScript( "Talk" );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( !OnEvent() ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 24, 0 );
+ yield;
+ count++;
+ }
+ @Finalize{ SetCommonData( "ShowName", 7 ); }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( RIGHT, imgCutInMerry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ Enemy();
+ TextOutB( 70, "\c[RED]ちょっと待て!" );
+ TextOutB( 100, "\c[RED]あなた、いかにも\n巫女以外って感じの身なりね" );
+ TextOutB( 100, "\c[RED]侵入するには少々目立ちすぎるわ" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( RIGHT, imgCutInMerry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ Enemy();
+ TextOutB( 70, "\c[BLUE]ちょっと待て!" );
+ TextOutB( 100, "\c[RED]あなたのその身なり\n・・・明らかに侵入者ね" );
+ TextOutB( 100, "\c[RED]悪いけど、そのまま\n回れ右してもらうわ" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/MerryA1.dnh b/th_dnh/script/thA/MerryA1.dnh
new file mode 100644
index 0000000..3e92583
--- /dev/null
+++ b/th_dnh/script/thA/MerryA1.dnh
@@ -0,0 +1,101 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let uniquestr = "MERRYA1";
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ loop{
+ Wait( 60 );
+ local{
+ ascent( let i in 0..3 ){
+ Wait( 40 );
+ ExMove( false, count );
+ loop( 4 + i ){
+ SetShotDirectionType( PLAYER );
+ let speed = [ 1.4, 1.8, 2.1, 2.4 ][ Level ];
+ loop( 8 ){
+ let space = rand( 20, 30 );
+ WayShot02( space * 2, space, speed, -0.008, speed - 1, BLUE02, 30 );
+ speed += [ 0.2, 0.3 ][ Level != 0 ];
+ }
+ PlaySEEx( seShot1 );
+ Wait( 10 );
+ }
+ CreateEnemyFromScript( "Shade", GetX(), GetY(), 0, [ 0, 180 ][ i % 2 ], i );
+ }
+ Wait( 60 );
+ }
+ local{
+ ascent( let i in 0..55 ){
+ SetShotDirectionType( PLAYER );
+ let x = GetX() + RandBlur( 80 - i );
+ let y = GetY() + RandBlur( 80 - i );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateShot02( x, y, 7, angle, -0.1, 2, PURPLE04, 50 );
+ angle += 40;
+ }
+ if( GetCommonDataDefault( "GlobalCount", count ) % 3 == 0 ){ PlaySE( seKira1 ); }
+ if( i == 50 ){ CreateEnemyFromScript( "Shade", GetX(), GetY(), 0, 180, -1 ); }
+ Wait( 2 );
+ }
+ Wait( 60 );
+ }
+ }
+ }
+ @Initialize{
+ SetLife( 1666 );
+ SetTimer( 40 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 70 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, 0 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
+script_enemy Shade{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let argv = GetArgument();
+ let RotateSpeed = 5 * [ 1, -1 ][ absolute( argv % 2 ) ];
+ task Behavior(){
+ ascent( let i in 0..[ 20, 70 ][ argv < 0 ] ){
+ SetShotDirectionType( ABSOLUTE );
+ CircleShotGap01( [ 180, 120, 90, 72 ][ Level ], [ 1.5, 1.7, 2.2, 3 ][ Level ], [ RED01, GREEN21 ][ argv < 0 ], 5, GetAngle() - count * RotateSpeed );
+ if( GetCommonDataDefault( "GlobalCount", count ) % 3 == 0 ){ PlaySE( seShot1 ); }
+ Wait( 2 );
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 1 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, count * [ 3, 1 ][ argv < 0 ], count, "MERRYA1" );
+ count++;
+ }
+}
diff --git a/th_dnh/script/thA/MerryA1S.dnh b/th_dnh/script/thA/MerryA1S.dnh
new file mode 100644
index 0000000..f657a46
--- /dev/null
+++ b/th_dnh/script/thA/MerryA1S.dnh
@@ -0,0 +1,119 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let slow = false;
+ let Color = 255;
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ Wait( 60 );
+ let pattern = 1;
+ loop{
+ slow = true;
+ Wait( 30 );
+ Slow( 2 );
+ Wait( 45 );
+ Slow( 1 );
+ MakeShot( pattern );
+ slow = false;
+ Wait( 30 );
+ Slow( 0 );
+ ExMove( false, count );
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ loop( 3 ){
+ SetShotDirectionType( PLAYER );
+ let speed = 1.6;
+ loop( 6 ){
+ let space = rand( 20, 30 );
+ WayShot02( space * 2, space, speed, -0.005, speed - 1, BLUE02, 30 );
+ speed += 0.4;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ pattern++;
+ }
+ }
+ task MakeShot( let pattern ){
+ let spacex = [ 64, 56, 48, 40 ][ Level ];
+ let spacey = [ 64, 48 ][ trunc( Level / 2 ) ];
+ let y = 0;
+ loop( pattern * [ 1, 2, 3, 4 ][ Level ] ){
+ if( y > GetCenterY() ){ break; }
+ let x = 0;
+ while( x <= GetClipMaxX() ){
+ ascent( let i in 0..2 ){
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ 0, spacex / 2 ][ pattern % 2 ], GetCenterY() + y, 0 );
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ 0, spacex / 2 ][ pattern % 2 ], GetCenterY() - y, 0 );
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ spacex / 2, 0 ][ pattern % 2 ], GetCenterY() + y, 1 );
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ spacex / 2, 0 ][ pattern % 2 ], GetCenterY() - y, 1 );
+ }
+ x += spacex;
+ }
+ y += spacey;
+ }
+ }
+ task Sudden( let x, let y, let dir ){
+ if( !Near( x, GetCenterX(), 192 ) ){ return; }
+ let objcount = 0;
+ let color = [ RED21, BLUE21 ][ dir ];
+ let angle = [ 90, 270 ][ dir ];
+ let obj = SetShotObject( x, y, 0, angle, color, 0 );
+ Obj_SetAlpha( obj, 0 );
+ Obj_SetCollisionToPlayer( obj, false );
+ while( !Obj_BeDeleted( obj ) && objcount < 30 ){
+ Obj_SetAlpha( obj, Smooth( 0, 255, objcount, 30 ) );
+ Obj_SetSpeed( obj, Smooth( 0, 1, objcount, 30 ) );
+ yield;
+ objcount++;
+ }
+ if( Obj_BeDeleted( obj ) ){ return; }
+ SetShotDirectionType( ABSOLUTE );
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), 1, angle, color, 0 );
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 300 );
+ SetScore( 1200000 );
+ SetTimer( 47 );
+ SetInvincibility( 130 );
+ SetDamageRate( 16, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 7 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 15, imgCutInMerry, 192, 256 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ Color = MinMax( Color + [ 3, -5 ][ slow ], 96, 255 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 15 * 4 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ DropExtend();
+ SetCommonData( "ShowName", -1 );
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+ @BackGround{ KhanBG( imgSpellKhan, Color ); }
+}
diff --git a/th_dnh/script/thA/MerryA2_.dnh b/th_dnh/script/thA/MerryA2_.dnh
new file mode 100644
index 0000000..49c4e43
--- /dev/null
+++ b/th_dnh/script/thA/MerryA2_.dnh
@@ -0,0 +1,30 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ PlaySEEx( seBossExplode );
+ Wait( 60 );
+ SetMovePosition01( GetClipMaxX() + 128, 0, 5 );
+ yield;
+ WaitZeroSpeed();
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetInvincibility( 130 );
+ SetDamageRate( 0, 0 );
+ SetEnemyMarker( false );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
diff --git a/th_dnh/script/thA/MerryB.dnh b/th_dnh/script/thA/MerryB.dnh
new file mode 100644
index 0000000..ebd51a5
--- /dev/null
+++ b/th_dnh/script/thA/MerryB.dnh
@@ -0,0 +1,13 @@
+#ScriptPathData
+#ScriptPath[.\MerryB0.dnh]
+#ScriptPath[.\MerryB1.dnh]
+#ScriptPath[.\MerryB1S.dnh]
+#ScriptNextStep
+#ScriptPath[.\MerryB2S.dnh]
+#ScriptNextStep
+#ScriptPath[.\MerryB3.dnh]
+#ScriptPath[.\MerryB3S.dnh]
+#ScriptNextStep
+#ScriptPath[.\MerryB4_.dnh]
+#ScriptPath[.\MerryB4S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/MerryB0.dnh b/th_dnh/script/thA/MerryB0.dnh
new file mode 100644
index 0000000..3732738
--- /dev/null
+++ b/th_dnh/script/thA/MerryB0.dnh
@@ -0,0 +1,167 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let bgm = false;
+ task Behavior(){
+ yield;
+ while( GetEventStep() != 1 ){ yield; }
+ SetCommonData( "ShowName", 7 );
+ while( GetEventStep() != 2 ){ yield; }
+ PlayMusicEx( 11 );
+ Wait( 30 );
+ bgm = true;
+ }
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ CreateEventFromScript( "Talk" );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( !OnEvent() && bgm ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 24, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( RIGHT, imgCutInMerry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ Enemy();
+ TextOut( "\c[RED]いきなり攻撃してくるなんて、\n一体あんた何なのよ!" );
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ Player();
+ TextOut( "\c[BLUE]こんなところに普通の人間がいるなんて\n・・・やっぱこの遺跡怪しいわね" );
+ Enemy();
+ SetStep( 1 );
+ SetNameFromTexture( RIGHT, imgNameMerry );
+ TextOut( "\c[RED]あなたよりは怪しくないわよ!\nこの通り、普通の人間だし" );
+ Player();
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]あなたみたいな普通の人間が\n私につっかかってくる時点で十分怪しいわ" );
+ TextOut( "\c[BLUE]見た限り迷子って\n感じでもなさそうだし" );
+ Enemy();
+ DeleteName( RIGHT );
+ TextOut( "\c[RED]あなたみたいな侵入者を排除しに来たのよ" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]ここで一体何隠れてやってるのかしら?" );
+ Enemy();
+ TextOut( "\c[RED]もうすぐ、この幻想郷・・・いえ\n全世界の時が消滅するわ" );
+ Player();
+ TextOut( "\c[BLUE]そうしたらあんたも消えるんじゃないの?" );
+ Enemy();
+ TextOut( "\c[RED]あの方は手伝ってくれたら\n二人の命は保障するって言ってくれたわ" );
+ Player();
+ SetChar( LEFT, imgCutInReimu5 );
+ TextOut( "\c[BLUE]二人?" );
+ Enemy();
+ TextOut( "\c[RED]ええ、私ともう一人人間がいるわ。\n私達はそれぞれあの方に『能力』をもらって" );
+ TextOut( "\c[RED]もう一人は術の補佐を\n私は周辺の警備をしているのよ" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]あんた、騙されてるんじゃないの?" );
+ Enemy();
+ TextOut( "\c[RED]なんでそう思うのよ" );
+ Player();
+ TextOut( "\c[BLUE]もし、世界の時が消えたら\n保障も何もみんな消滅するんじゃないの?" );
+ Enemy();
+ TextOut( "\c[RED]もしみんな消えるなら\nあの方も消えることになるわ。" );
+ TextOut( "\c[RED]そもそもそんな自殺じみたこと\n考えるようなお方じゃない" );
+ Player();
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]いやまぁ。" );
+ Enemy();
+ TextOut( "\c[RED]さ、立ち話が長くなったわね" );
+ SetStep( 2 );
+ TextOut( "\c[RED]そこまで分かったら\nそろそろ立ち去ってもらおうかしら?" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]ところで、あんたは\nこの寒さに気付いてないのかしら?" );
+ Enemy();
+ TextOut( "\c[RED]なんのことかしら・・・とにかく\n立ち去らないなら強行退去させるわ" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( RIGHT, imgCutInMerry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ Enemy();
+ TextOut( "\c[RED]いきなり攻撃してくるなんて、\n一体あんた何なのよ!" );
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ Player();
+ TextOut( "\c[BLUE]侵入者だぜ" );
+ SetStep( 1 );
+ SetNameFromTexture( RIGHT, imgNameMerry );
+ Enemy();
+ TextOut( "\c[RED]じゃ、強制退去ね" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa4 );
+ TextOut( "\c[BLUE]カタいこと言うなよ" );
+ Enemy();
+ TextOut( "\c[RED]柔らかいことって何なのよ" );
+ Player();
+ DeleteName( RIGHT );
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]そうだな・・・とりあえず\nこの冷気をなんとかしてもらおうか" );
+ Enemy();
+ TextOut( "\c[RED]それは悪かったね、でももう少しなのよ" );
+ Player();
+ TextOut( "\c[BLUE]少しも待たんぜ" );
+ Enemy();
+ TextOut( "\c[RED]固いこと言わないの。\nもう少しであの方の術が完成するのよ" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]幻想郷を氷漬けにする術か?" );
+ Enemy();
+ TextOut( "\c[RED]半正解ね。正しくは幻想郷\n・・・いえ、全世界の時を消す術よ" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]そいつはまた物騒な術を\n持ち出したものだな" );
+ TextOut( "\c[BLUE]・・・で、あんたはそれでいいのか?" );
+ Enemy();
+ TextOut( "\c[RED]?" );
+ Player();
+ TextOut( "\c[BLUE]世界の時が消えるってことは\nあんたも消えるってことじゃないのか?" );
+ Enemy();
+ TextOut( "\c[RED]ご心配なくてよ。" );
+ TextOut( "\c[RED]私達の命は保障するって\nあの方は言っていたわ" );
+ TextOut( "\c[RED]それに私達が消えるならあの方も消える。" );
+ TextOut( "\c[RED]そんな自殺じみたこと\n考えるようなお方じゃないわ" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]達?他にもあんたみたいな\n人間がいるのか?" );
+ Enemy();
+ TextOut( "\c[RED]もう一人は能力の制御が\nうまいからって術の補佐に回されたわ。" );
+ TextOut( "\c[RED]私はパワーが有り余り過ぎて\n制御がうまく効かないから・・・" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]お払い箱ってわけだな" );
+ Enemy();
+ TextOut( "\c[RED]警備よ!近辺警備!\nつまり最初からあなたを倒す為に来たの!" );
+ SetStep( 2 );
+ TextOut( "\c[RED]そこまで分かったら\nそろそろ立ち去ってもらおうかしら?" );
+ Player();
+ TextOut( "\c[BLUE]あんたこそ早めに\n引いたほうが身のためだぜ" );
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]外の世界からの迷い人を\n消し炭にするなんて寝覚め悪いわな" );
+ Enemy();
+ TextOut( "\c[RED]なんのことかしら・・・とにかく\n立ち去らないなら強行退去させるわ" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/MerryB1.dnh b/th_dnh/script/thA/MerryB1.dnh
new file mode 100644
index 0000000..8171852
--- /dev/null
+++ b/th_dnh/script/thA/MerryB1.dnh
@@ -0,0 +1,136 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let uniquestr = "MERRYB1";
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ loop{
+ Wait( 60 );
+ local{
+ ascent( let i in 0..3 ){
+ Wait( 40 );
+ ExMove( false, count );
+ loop( 4 + i ){
+ SetShotDirectionType( PLAYER );
+ let speed = 2;
+ loop( 10 ){
+ let space = rand( 15, 25 );
+ WayShot02( space * 3, space, speed, -0.009, speed - 1, AQUA02, 30 );
+ speed += 0.3;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 10 );
+ }
+ CreateEnemyFromScript( "Shade", GetX(), GetY(), 0, [ 0, 180 ][ i % 2 ], i );
+ }
+ }
+ SetMovePosition03( GetX(), GetClipMinY() + 48, 20, 4 );
+ Wait( 60 );
+ local{
+ let limit = 45;
+ let angle = -limit;
+ while( angle <= limit ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 3, 90 + angle, 0 );
+ angle += [ 90, 30 ][ Level != 0 ];
+ }
+ PlaySEEx( seShadow );
+ Wait( 100 );
+ CreateEnemyFromScript( "Shade", GetX(), GetY(), 0, 180, -1 );
+ ExMove( false, count );
+ Wait( 100 );
+ }
+ }
+ }
+ @Initialize{
+ SetLife( 2400 );
+ SetTimer( 55 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, 0 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
+script_enemy Shade{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let argv = GetArgument();
+ let RotateSpeed = 5 * [ 1, -1 ][ absolute( argv % 2 ) ];
+ task Behavior(){
+ ascent( let i in 0..[ 20, 70 ][ argv < 0 ] ){
+ SetShotDirectionType( ABSOLUTE );
+ CircleShotGap02( [ 120, 72, 60, 40 ][ Level ], 10, -0.5, [ 1.6, 1.9, 2.5, 3 ][ Level ], [ ORANGE01, YELLOW21 ][ argv < 0 ], 5, GetAngle() - count * RotateSpeed );
+ if( GetCommonDataDefault( "GlobalCount", count ) % 3 == 0 ){ PlaySE( seShot1 ); }
+ Wait( 2 );
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 1 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, count * [ 3, 1 ][ argv < 0 ], count, "MERRYB1" );
+ count++;
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ task Behavior(){
+ yield;
+ WaitSpeedDown( 0.3 );
+ ascent( let i in 0..70 ){
+ SetShotDirectionType( PLAYER );
+ let x = GetX() + RandBlur( 80 - i );
+ let y = GetY() + RandBlur( 80 - i );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateShot02( x, y, 7, angle, -0.15, 2 + Level / 2, BLUE32, 44 );
+ angle += 72;
+ }
+ if( GetCommonDataDefault( "GlobalCount", count ) % 5 == 0 ){ PlaySE( seKira1 ); }
+ Wait( 3 );
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 150 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, "MERRYB1", true );
+ SetSpeed( Max( GetSpeed() - 0.03, 0 ) );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleRed, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/MerryB1S.dnh b/th_dnh/script/thA/MerryB1S.dnh
new file mode 100644
index 0000000..463402b
--- /dev/null
+++ b/th_dnh/script/thA/MerryB1S.dnh
@@ -0,0 +1,124 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let slow = false;
+ let Color = 255;
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ Wait( 80 );
+ CircleShot01( [ 30, 20, 10, 10 ][ Level ], 1.5, PURPLE02, 20 );
+ PlaySEEx( seShot3 );
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ Wait( 60 );
+ let pattern = 1;
+ loop{
+ slow = true;
+ Wait( 30 );
+ Slow( 2 );
+ Wait( 45 );
+ Slow( 1 );
+ MakeShot( pattern );
+ slow = false;
+ Wait( 30 );
+ Slow( 0 );
+ CircleShot01( [ 36, 24, 15, 12 ][ Level ], 1.5, PURPLE02, 20 );
+ PlaySEEx( seShot3 );
+ SetMovePosition03( GetCenterX() + 112 * [ 1, -1 ][ pattern % 2 ], GetClipMinY() + 96, 20, 3 );
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ loop( 6 ){
+ SetShotDirectionType( PLAYER );
+ let speed = 1.4;
+ loop( 4 ){
+ let space = rand( 20, 30 );
+ WayShot02( space * 2, space, speed, -0.005, speed - 1, RED02, 30 );
+ speed += 0.5;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 12 );
+ }
+ if( Level >= 2 ){ CircleShot01( [ 36, 24, 20, 15 ][ Level ], 1.5, PURPLE02, 20 ); }
+ PlaySEEx( seShot3 );
+ pattern++;
+ }
+ }
+ task MakeShot( let pattern ){
+ let spacex = [ 80, 64, 56, 48 ][ Level ];
+ let spacey = [ 80, 64 ][ trunc( Level / 2 ) ];
+ let y = 0;
+ loop( pattern * [ 1, 2, 3, 4 ][ Level ] ){
+ if( y > GetCenterY() ){ break; }
+ let x = 0;
+ while( x <= GetClipMaxX() ){
+ ascent( let i in 0..2 ){
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ 0, spacex / 2 ][ pattern % 2 ], GetCenterY() + y, 0 );
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ 0, spacex / 2 ][ pattern % 2 ], GetCenterY() - y, 0 );
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ spacex / 2, 0 ][ pattern % 2 ], GetCenterY() + y, 1 );
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ spacex / 2, 0 ][ pattern % 2 ], GetCenterY() - y, 1 );
+ }
+ x += spacex;
+ }
+ y += spacey;
+ }
+ }
+ task Sudden( let x, let y, let dir ){
+ if( !Near( x, GetCenterX(), 192 ) ){ return; }
+ let objcount = 0;
+ let color = [ RED21, BLUE21 ][ dir ];
+ let angle = [ 90, 270 ][ dir ];
+ let obj = SetShotObject( x, y, 0, angle, color, 0 );
+ Obj_SetAlpha( obj, 0 );
+ Obj_SetCollisionToPlayer( obj, false );
+ while( !Obj_BeDeleted( obj ) && objcount < 30 ){
+ Obj_SetAlpha( obj, Smooth( 0, 255, objcount, 30 ) );
+ Obj_SetSpeed( obj, Smooth( 0, 1.2, objcount, 30 ) );
+ yield;
+ objcount++;
+ }
+ if( Obj_BeDeleted( obj ) ){ return; }
+ SetShotDirectionType( ABSOLUTE );
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), 1.2, angle, color, 0 );
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 450 );
+ SetScore( 1600000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 25, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 7 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 16, imgCutInMerry, 192, 256 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ Color = MinMax( Color + [ 3, -5 ][ slow ], 96, 255 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 16 * 4 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+ @BackGround{ KhanBG( imgSpellKhan, Color ); }
+}
diff --git a/th_dnh/script/thA/MerryB2S.dnh b/th_dnh/script/thA/MerryB2S.dnh
new file mode 100644
index 0000000..43bf913
--- /dev/null
+++ b/th_dnh/script/thA/MerryB2S.dnh
@@ -0,0 +1,113 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 3 );
+ let PrevTime = GetTimer();
+ let slow = false;
+ let Color = 255;
+ task Laser(){
+ SetShotDirectionType( ABSOLUTE );
+ ascent( let i in 0..2 ){
+ CreateLaserA( 0, 0, [ GetClipMinY(), GetClipMaxY() ][ i ], 448, 32, [ RED01, BLUE01 ][ i ], 60 );
+ SetLaserDataA( 0, 0, 0, 0, 0, 0, 0 );
+ FireShot( 0 );
+ }
+ PlaySEEx( seLaser1 );
+ Wait( 60 );
+ let space = [ 48, 32, 28, 24 ][ Level ];
+ let laserspace = space * 2;
+ let pattern = 0;
+ loop{
+ ascent( let i in 0..2 ){
+ SetShotDirectionType( ABSOLUTE );
+ let x = GetPlayerX() % space - ( space / 2 ) * ( 1 - i );
+ while( x <= 400 ){
+ CreateShotA( 0, x, GetCenterY() + 224 * [ -1, 1 ][ i ], 10 );
+ SetShotDataA( 0, 0, 0, 90 + i * 180, 0, 0.01, 0.7, [ RED21, BLUE21 ][ i ] );
+ FireShot( 0 );
+ x += space;
+ }
+ PlaySEEx( seShot3 );
+ Wait( 50 );
+ }
+ if( pattern % 4 == 3 ){
+ SetShotDirectionType( ABSOLUTE );
+ ascent( let i in 0..2 ){
+ let x = GetPlayerX() % laserspace - ( laserspace / 2 ) * ( 1 - i );
+ while( x <= 400 ){
+ CreateLaserA( 0, x, GetCenterY() + 224 * [ -1, 1 ][ i ], 464, 12, [ RED01, BLUE01 ][ i ], 100 );
+ SetLaserDataA( 0, 0, 90 + i * 180 + [ RandBlur( 5 ), 0 ][ pattern == 4 ], 0, 0, 0, 0 );
+ SetShotKillTime( 0, 200 );
+ FireShot( 0 );
+ x += laserspace;
+ }
+ PlaySEEx( seLaser1 );
+ }
+ }
+ pattern++;
+ }
+ }
+ task Behavior(){
+ yield;
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ Wait( 60 );
+ slow = true;
+ ExMove( false, count );
+ Slow( 1 );
+ Wait( 30 );
+ Slow( 2 );
+ Wait( 16 );
+ Laser();
+ Wait( 30 );
+ slow = false;
+ Slow( 1 );
+ Wait( 30 );
+ Slow( 0 );
+ let pattern = 0;
+ loop{
+ SetShotDirectionType( PLAYER );
+ CircleShot01( 40 - Level * 10, 0.5, PURPLE12, 30 );
+ PlaySEEx( seShot1 );
+ Wait( [ 15, 120 ][ pattern % 3 == 0 ] );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 3000 );
+ SetScore( 2000000 );
+ SetTimer( 65 );
+ SetInvincibility( 160 );
+ SetDamageRate( 100, 8 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 7 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 17, imgCutInMerry, 192, 256 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ Color = MinMax( Color + [ 3, -5 ][ slow ], 96, 255 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 17 * 4 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+ @BackGround{ KhanBG( imgSpellKhan, Color ); }
+}
diff --git a/th_dnh/script/thA/MerryB3.dnh b/th_dnh/script/thA/MerryB3.dnh
new file mode 100644
index 0000000..635ec0a
--- /dev/null
+++ b/th_dnh/script/thA/MerryB3.dnh
@@ -0,0 +1,70 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let ShotSpeed = [ 1.3, 1.9, 2.6, 2.3 ][ Level ];
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ Wait( 60 );
+ let pattern = 0;
+ loop{
+ Wait( [ 20, 60 ][ pattern % 2 ] );
+ let dir = [ [ 1, -1 ][ trunc( pattern / 2 ) % 2 ], -1 ][ pattern == 0 ];
+ let anglegap = [ 20, 0 ][ pattern % 2 ];
+ while( anglegap <= 66 ){
+ let angle = 0;
+ while( angle < 360 ){
+ if( [ angle % 90 < 30, angle % 90 >= 60 ][ dir == -1 ] ){ ReflectShot( angle + anglegap * dir ); }
+ if( [ angle % 90 < 30, angle % 90 >= 60 ][ dir == 1 ] ){ CreateShot01( GetX(), GetY(), ShotSpeed, angle + anglegap * dir, BLUE32, 8 ); }
+ angle += 15;
+ }
+ PlaySEEx( seShot2 );
+ Wait( 8 );
+ anglegap += 6;
+ }
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ task ReflectShot( let angle ){
+ let ref = false;
+ let obj = Obj_Create( OBJ_SHOT );
+ Obj_SetX( obj, GetX() );
+ Obj_SetY( obj, GetY() );
+ Obj_SetSpeed( obj, ShotSpeed );
+ Obj_SetAngle( obj, angle );
+ ObjShot_SetGraphic( obj, RED32 );
+ ObjShot_SetDelay( obj, 8 );
+ while( !Obj_BeDeleted( obj ) ){
+ if( !ref ){ ref = ReflectObject( obj, false, Level == 3, true ); }
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 2400 );
+ SetTimer( 45 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
diff --git a/th_dnh/script/thA/MerryB3S.dnh b/th_dnh/script/thA/MerryB3S.dnh
new file mode 100644
index 0000000..6d9c10f
--- /dev/null
+++ b/th_dnh/script/thA/MerryB3S.dnh
@@ -0,0 +1,129 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let slow = false;
+ let Color = 255;
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ Wait( 60 );
+ let pattern = 1;
+ loop{
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ loop( 12 ){
+ let gap = 0;
+ loop( 4 ){
+ CircleShotGap01( 60, 1.5, BLUE32, 20, count * [ 1, 0.8 ][ Level == 3 ] * [ 1, -1 ][ pattern % 2 ] + gap );
+ gap += 6;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 5 );
+ }
+ slow = true;
+ ExMove( false, count );
+ Wait( 30 );
+ Slow( 1 );
+ Wait( 46 );
+ MakeShot( pattern );
+ slow = false;
+ Wait( 30 );
+ Slow( 0 );
+ pattern++;
+ }
+ }
+ task MakeShot( let pattern ){
+ let spacex = [ 24, 20, 16, 20 ][ Level ];
+ let spacey = [ 80, 64, 64, 80 ][ Level ];
+ local{
+ let y = 0;
+ while( y <= GetCenterY() ){
+ let x = [ 112, 96, 80, 48 ][ Level ];
+ while( x <= GetCenterX() ){
+ ascent( let i in 0..2 ){
+ Sudden( GetCenterX() + ( x + ( spacex / 2 ) * ( pattern % 2 ) ) * [ 1, -1 ][ i ], GetCenterY() + y, 0 );
+ Sudden( GetCenterX() + ( x + ( spacex / 2 ) * ( pattern % 2 ) ) * [ 1, -1 ][ i ], GetCenterY() - y, 0 );
+ Sudden( GetCenterX() + ( x + ( spacex / 2 ) * ( pattern % 2 ) ) * [ 1, -1 ][ i ], GetCenterY() + y, 1 );
+ Sudden( GetCenterX() + ( x + ( spacex / 2 ) * ( pattern % 2 ) ) * [ 1, -1 ][ i ], GetCenterY() - y, 1 );
+ }
+ x += spacex;
+ }
+ y += spacey;
+ }
+ }
+ local{
+ let x = 0;
+ while( x <= GetCenterX() ){
+ let y = [ 128, 104, 96, 64 ][ Level ];
+ while( y <= GetCenterY() ){
+ ascent( let i in 0..2 ){
+ Sudden( GetCenterX() + x, GetCenterY() + ( y + ( spacex / 2 ) * ( pattern % 2 ) ) * [ 1, -1 ][ i ], 2 );
+ Sudden( GetCenterX() - x, GetCenterY() + ( y + ( spacex / 2 ) * ( pattern % 2 ) ) * [ 1, -1 ][ i ], 2 );
+ Sudden( GetCenterX() + x, GetCenterY() + ( y + ( spacex / 2 ) * ( pattern % 2 ) ) * [ 1, -1 ][ i ], 3 );
+ Sudden( GetCenterX() - x, GetCenterY() + ( y + ( spacex / 2 ) * ( pattern % 2 ) ) * [ 1, -1 ][ i ], 3 );
+ }
+ y += spacex;
+ }
+ x += spacey;
+ }
+ }
+ }
+ task Sudden( let x, let y, let dir ){
+ if( !Near( x, GetCenterX(), 192 ) ){ return; }
+ let objcount = 0;
+ let color = [ RED21, BLUE21 ][ dir % 2 ];
+ let angle = [ 90, 270, 0, 180 ][ dir ];
+ let obj = SetShotObject( x, y, 0, angle, color, 0 );
+ Obj_SetAlpha( obj, 0 );
+ Obj_SetCollisionToPlayer( obj, false );
+ while( !Obj_BeDeleted( obj ) && objcount < 30 ){
+ Obj_SetAlpha( obj, Smooth( 0, 255, objcount, 30 ) );
+ Obj_SetSpeed( obj, Smooth( 0, 1, objcount, 30 ) );
+ yield;
+ objcount++;
+ }
+ if( Obj_BeDeleted( obj ) ){ return; }
+ SetShotDirectionType( ABSOLUTE );
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), 1, angle, color, 0 );
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 450 );
+ SetScore( 2300000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 18, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 7 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 18, imgCutInMerry, 192, 256 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ Color = MinMax( Color + [ 3, -5 ][ slow ], 96, 255 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 18 * 4 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+ @BackGround{ KhanBG( imgSpellKhan, Color ); }
+}
diff --git a/th_dnh/script/thA/MerryB4S.dnh b/th_dnh/script/thA/MerryB4S.dnh
new file mode 100644
index 0000000..a197c5f
--- /dev/null
+++ b/th_dnh/script/thA/MerryB4S.dnh
@@ -0,0 +1,117 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let slow = false;
+ let Color = 255;
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ Wait( 60 );
+ let pattern = 1;
+ loop{
+ slow = true;
+ Wait( 30 );
+ Slow( 1 );
+ Wait( 45 );
+ MakeShot( pattern );
+ slow = false;
+ Wait( 40 );
+ Slow( 0 );
+ ExMove( false, count );
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ loop( 3 ){
+ SetShotDirectionType( PLAYER );
+ let speed = 1.6;
+ loop( 6 ){
+ let space = rand( 20, 30 );
+ WayShot02( space * 2, space, speed, -0.005, speed - 1, BLUE02, 30 );
+ speed += 0.4;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ pattern++;
+ }
+ }
+ task MakeShot( let pattern ){
+ let spacex = [ 64, 56, 56, 48 ][ Level ];
+ let spacey = [ 64, 48 ][ trunc( Level / 2 ) ];
+ let y = 0;
+ loop( pattern * [ 1, 2, 3, 4 ][ Level ] ){
+ if( y > GetCenterY() ){ break; }
+ let x = -64;
+ while( x <= GetClipMaxX() + 96 ){
+ ascent( let i in 0..2 ){
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ 0, spacex / 2 ][ pattern % 2 ], GetCenterY() + y, 0, pattern % 2 );
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ 0, spacex / 2 ][ pattern % 2 ], GetCenterY() - y, 0, pattern % 2 );
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ spacex / 2, 0 ][ pattern % 2 ], GetCenterY() + y, 1, pattern % 2 );
+ Sudden( GetPlayerX() + x * [ 1, -1 ][ i ] + [ spacex / 2, 0 ][ pattern % 2 ], GetCenterY() - y, 1, pattern % 2 );
+ }
+ x += spacex;
+ }
+ y += spacey;
+ }
+ }
+ task Sudden( let x, let y, let dir1, let dir2 ){
+ if( !Near( x, GetCenterX(), 192 ) ){ return; }
+ let objcount = 0;
+ let color = [ RED21, BLUE21 ][ dir1 ];
+ let angle = [ 45, 225 ][ dir1 ] + [ 0, 90 ][ dir2 ];
+ let obj = SetShotObject( x, y, 0, angle, color, 0 );
+ Obj_SetAlpha( obj, 0 );
+ Obj_SetCollisionToPlayer( obj, false );
+ while( !Obj_BeDeleted( obj ) && objcount < 30 ){
+ Obj_SetAlpha( obj, Smooth( 0, 255, objcount, 30 ) );
+ Obj_SetSpeed( obj, Smooth( 0, 0.7, objcount, 30 ) );
+ yield;
+ objcount++;
+ }
+ if( Obj_BeDeleted( obj ) ){ return; }
+ SetShotDirectionType( ABSOLUTE );
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), 0.7, angle, color, 0 );
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 3000 );
+ SetScore( 1920000 );
+ SetTimer( 47 );
+ SetInvincibility( 130 );
+ SetDamageRate( 100, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( [ 60, 1 ][ GetCommonDataDefault( "SpellPractice", false ) ], 0, 0 );
+ SetCommonData( "ShowName", 7 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 19, imgCutInMerry, 192, 256 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ if( GetLife() <= 0 ){ if( count % 15 == 0 ){ PlaySEEx( seShot1 ); } }
+ else{ yield; }
+ Color = MinMax( Color + [ 3, -5 ][ slow ], 96, 255 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 19 * 4 + Level );
+ EndSpell();
+ SetCommonData( "ShowName", -1 );
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+ @BackGround{ KhanBG( imgSpellKhan, Color ); }
+}
diff --git a/th_dnh/script/thA/MerryB4_.dnh b/th_dnh/script/thA/MerryB4_.dnh
new file mode 100644
index 0000000..783a579
--- /dev/null
+++ b/th_dnh/script/thA/MerryB4_.dnh
@@ -0,0 +1,28 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ Wait( 100 );
+ AddLife( -1 );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetInvincibility( 120 );
+ SetDamageRate( 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
diff --git a/th_dnh/script/thA/MerryBE.dnh b/th_dnh/script/thA/MerryBE.dnh
new file mode 100644
index 0000000..e093f50
--- /dev/null
+++ b/th_dnh/script/thA/MerryBE.dnh
@@ -0,0 +1,68 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ PlaySEEx( seBossExplode );
+ CreateEventFromScript( "Talk" );
+ while( GetEventStep() != 1 ){ yield; }
+ SetCommonData( "Result", true );
+ let clear = 50000000;
+ let point = GetPoint() * 50000 - GetCommonDataDefault( "ResultPoint", 0 );
+ let graze = GetGraze() * 500 - GetCommonDataDefault( "ResultGraze", 0 );
+ let rank = [ 50, 100, 120, 150 ][ GetCommonDataDefault( "Level", 1 ) ];
+ let total = ( clear + point + graze ) * ( rank / 100 );
+ SetCommonData( "ResultClear", clear );
+ SetCommonData( "ResultPoint", point );
+ SetCommonData( "ResultGraze", graze );
+ SetCommonData( "ResultRank", rank );
+ SetCommonData( "ResultTotal", total );
+ AddScore( total );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetX( -128 );
+ SetY( -128 );
+ LoadSE( seBossExplode );
+ ForbidBomb( true );
+ ForbidShot( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( !OnEvent() ){ VanishEnemy(); }
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ SetChar( RIGHT, imgCutInMerryCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ Player();
+ TextOut( "\c[BLUE]さ、弾幕ごっこが長くなったわね・・・\n分かったらどいてもらおうかしら" );
+ Enemy();
+ TextOut( "\c[RED]うぅ・・・そんな力も\n時の消滅の前には無に等しいわ" );
+ Player();
+ SetStep( 1 );
+ TextOut( "\c[BLUE]一体何のつもりで\nそんなことやってるのかしらね" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ SetChar( RIGHT, imgCutInMerryCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ Player();
+ TextOut( "\c[BLUE]さぁこれで分かったろ、\n強制退去されるのはお前だ" );
+ Enemy();
+ TextOut( "\c[RED]この力、まだ慣れないわ・・・\nでもあの方なら" );
+ Player();
+ SetStep( 1 );
+ TextOut( "\c[BLUE]こんな大それたことするやつ\n一体誰なんだか" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/MerryC.dnh b/th_dnh/script/thA/MerryC.dnh
new file mode 100644
index 0000000..95c365d
--- /dev/null
+++ b/th_dnh/script/thA/MerryC.dnh
@@ -0,0 +1,5 @@
+#ScriptPathData
+#ScriptPath[.\MerryC0.dnh]
+#ScriptPath[.\MerryC1.dnh]
+#ScriptPath[.\MerryC1S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/MerryC0.dnh b/th_dnh/script/thA/MerryC0.dnh
new file mode 100644
index 0000000..aa3ee53
--- /dev/null
+++ b/th_dnh/script/thA/MerryC0.dnh
@@ -0,0 +1,54 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ CreateEventFromScript( "Talk" );
+ SetEnemyMarker( true );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 5 );
+ SetCommonData( "ShowName", 7 );
+ }
+ @MainLoop{
+ if( count == 5 ){ DeleteEnemyShotToItem( ALL ); }
+ if( !OnEvent() ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 24, 0 );
+ count++;
+ }
+ @DrawLoop{
+ SetColor( 224, 112, 240 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( RIGHT, imgCutInMerryCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ Enemy();
+ TextOutB( 80, "\c[RED]お願いだからこれ以上行かないでよ!\n術の邪魔されたらもう・・・" );
+ Player();
+ TextOutB( 50, "\c[BLUE]だからやめさせに来たのよ!" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( RIGHT, imgCutInMerryCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ Enemy();
+ TextOutB( 80, "\c[RED]お願いだからこれ以上行かないでよ!\n術の邪魔されたらもう・・・" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOutB( 50, "\c[BLUE]分かってないな\n邪魔しに来たんだぜ" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/MerryC1.dnh b/th_dnh/script/thA/MerryC1.dnh
new file mode 100644
index 0000000..4144ea9
--- /dev/null
+++ b/th_dnh/script/thA/MerryC1.dnh
@@ -0,0 +1,101 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquestr = "MERRYC1";
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ loop{
+ Wait( 60 );
+ local{
+ ascent( let i in 0..3 ){
+ Wait( 40 );
+ ExMove( false, count );
+ loop( 4 + i ){
+ SetShotDirectionType( PLAYER );
+ let speed = 1.8;
+ loop( 5 + Level ){
+ let space = rand( 20, 30 );
+ WayShot02( space * 2, space, speed, -0.005, speed - 1, PURPLE02, 30 );
+ speed += 0.3;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 10 );
+ }
+ CreateEnemyFromScript( "Shade", GetX(), GetY(), 0, [ 0, 180 ][ i % 2 ], i );
+ }
+ Wait( 60 );
+ }
+ local{
+ ascent( let i in 0..60 ){
+ SetShotDirectionType( PLAYER );
+ let x = GetX() + RandBlur( 80 - i );
+ let y = GetY() + RandBlur( 80 - i );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateShot02( x, y, 7, angle, -0.09, 2, BLUE04, 50 );
+ angle += 120;
+ }
+ if( GetCommonDataDefault( "GlobalCount", count ) % 3 == 0 ){ PlaySE( seKira1 ); }
+ if( i == 50 ){ CreateEnemyFromScript( "Shade", GetX(), GetY(), 0, 180, -1 ); }
+ Wait( 2 );
+ }
+ Wait( 60 );
+ }
+ }
+ }
+ @Initialize{
+ SetLife( 1800 );
+ SetTimer( 25 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, 0 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{
+ SetColor( 224, 112, 240 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
+script_enemy Shade{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let argv = GetArgument();
+ let RotateSpeed = 5 * [ 1, -1 ][ absolute( argv % 2 ) ];
+ task Behavior(){
+ ascent( let i in 0..[ 10, 33 ][ argv < 0 ] ){
+ SetShotDirectionType( ABSOLUTE );
+ ascent( let i in 0..( 1 + trunc( Level / 2 ) ) ){ CircleShotGap01( 120, [ 1, 1.5 ][ Level % 2 ] + i / 2, [ RED04, GREEN21 ][ argv < 0 ], 5, GetAngle() - count * RotateSpeed ); }
+ PlaySE( seShot1 );
+ Wait( 6 );
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 1 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, count * [ 3, 1 ][ argv < 0 ], count, "MERRYC1" );
+ count++;
+ }
+}
diff --git a/th_dnh/script/thA/MerryC1S.dnh b/th_dnh/script/thA/MerryC1S.dnh
new file mode 100644
index 0000000..480ebd0
--- /dev/null
+++ b/th_dnh/script/thA/MerryC1S.dnh
@@ -0,0 +1,105 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let slow = false;
+ let Color = 255;
+ task Behavior(){
+ Wait( 30 );
+ SetShotDirectionType( ABSOLUTE );
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ Wait( 20 );
+ slow = true;
+ Wait( 40 );
+ loop{
+ loop( [ 1, 2 ][ Level == 3 ] ){ MakeShot(); }
+ slow = false;
+ Wait( [ 30, 10, 1, 1 ][ Level ] );
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ Wait( 20 );
+ slow = true;
+ Wait( 40 );
+ ExMove( true, count );
+ }
+ }
+ task MakeShot(){
+ let l = RandBlur( 832 );
+ let x;
+ let y;
+ if( absolute( l ) < 384 ){
+ y = [ GetClipMaxY(), GetClipMinY() ][ GetDir( l ) > 0 ];
+ x = absolute( l );
+ }
+ else{
+ x = [ GetClipMaxX(), GetClipMinX() ][ GetDir( l ) > 0 ];
+ y = absolute( l ) - 384;
+ }
+ let obj = SetHiddenObject( x, y, [ 80, 64, 48, 56 ][ Level ], atan2( GetPlayerY() - y, GetPlayerX() - x ), 0, true, true );
+ while( !Obj_BeDeleted( obj ) ){
+ Sudden( Obj_GetX( obj ), Obj_GetY( obj ), Obj_GetAngle( obj ) );
+ Sudden( Obj_GetX( obj ), Obj_GetY( obj ), Obj_GetAngle( obj ) + 180 );
+ yield;
+ }
+ }
+ task Sudden( let x, let y, let angle ){
+ let objcount = 0;
+ let color = RED21;
+ let obj = SetShotObject( x, y, 0, angle, color, 0 );
+ Obj_SetAlpha( obj, 0 );
+ Obj_SetCollisionToPlayer( obj, false );
+ while( !Obj_BeDeleted( obj ) && objcount < 40 ){
+ Obj_SetAlpha( obj, Smooth( 0, 255, objcount, 40 ) );
+ Obj_SetSpeed( obj, Smooth( 0, 0.8, objcount, 40 ) );
+ yield;
+ objcount++;
+ }
+ if( Obj_BeDeleted( obj ) ){ return; }
+ SetShotDirectionType( ABSOLUTE );
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), 0.8, angle, color, 0 );
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 450 );
+ SetScore( 2000000 );
+ SetTimer( 22 );
+ SetInvincibility( 130 );
+ SetDamageRate( 24, 18 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 7 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 20, imgCutInMerry, 192, 256 );
+ Behavior();
+ }
+ @MainLoop{
+ if( !GetCommonDataDefault( "SpellPractice", false ) && GetCommonDataDefault( "GlobalCount", count ) > GetCommonDataDefault( "StartCount", count ) + 5100 ){ SetCommonData( "BGStep", 1 ); }
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ Color = MinMax( Color + [ 3, -5 ][ slow ], 96, 255 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 20 * 4 + Level );
+ EndSpell();
+ SetCommonData( "ShowName", -1 );
+ PlaySEEx( seBossExplode );
+ DropItem( 10, 64 );
+ DropBomb();
+ }
+ @DrawLoop{
+ SetColor( 224, 112, 240 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+ @BackGround{ KhanBG( imgSpellKhan, Color ); }
+}
diff --git a/th_dnh/script/thA/MerryX.dnh b/th_dnh/script/thA/MerryX.dnh
new file mode 100644
index 0000000..9280a0b
--- /dev/null
+++ b/th_dnh/script/thA/MerryX.dnh
@@ -0,0 +1,8 @@
+#ScriptPathData
+#ScriptPath[.\MerryX0.dnh]
+#ScriptPath[.\MerryX1.dnh]
+#ScriptPath[.\MerryX1S.dnh]
+#ScriptNextStep
+#ScriptPath[.\MerryB4_.dnh]
+#ScriptPath[.\MerryX2S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/MerryX0.dnh b/th_dnh/script/thA/MerryX0.dnh
new file mode 100644
index 0000000..edadba1
--- /dev/null
+++ b/th_dnh/script/thA/MerryX0.dnh
@@ -0,0 +1,61 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ SetX( -64 );
+ SetY( GetCenterY() );
+ CreateEventFromScript( "Talk" );
+ SetCommonData( "ShowName", 7 );
+ SetEnemyMarker( true );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ }
+ @MainLoop{
+ if( !OnEvent() ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 24, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ SetChar( RIGHT, imgCutInMerry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ Enemy();
+ TextOutB( 90, "\c[RED]また会ったわね" );
+ Player();
+ TextOutB( 120, "\c[BLUE]なんであんたがまだここに居るのよ" );
+ Enemy();
+ TextOutB( 90, "\c[RED]ちょっと野暮用でねぇ" );
+ TextOutB( 170, "\c[RED]悪いけど帰ってもらうか、3年くらい\nここにとどまってもらおうかしら" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ SetChar( RIGHT, imgCutInMerry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 256 );
+ Enemy();
+ TextOutB( 90, "\c[RED]また会ったわね" );
+ Player();
+ TextOutB( 110, "\c[BLUE]そうか、ここがお前の巣穴か" );
+ Enemy();
+ TextOutB( 140, "\c[RED]失礼ね、\nもうちょっとまともな生活してるわよ" );
+ TextOutB( 130, "\c[RED]少なくともあんたみたいな田舎者よりは、ね" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/MerryX1.dnh b/th_dnh/script/thA/MerryX1.dnh
new file mode 100644
index 0000000..68a1ed0
--- /dev/null
+++ b/th_dnh/script/thA/MerryX1.dnh
@@ -0,0 +1,95 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ SetShotAutoDeleteClip( 88, 88, 88, 88 );
+ loop{
+ Border();
+ Wait( 150 );
+ ExMove( false, count );
+ loop( 20 ){
+ SetShotDirectionType( PLAYER );
+ let angle = 0;
+ while( angle < 360 ){
+ ascent( let i in 0..2 ){
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, 10, angle + 180 + i * 6, 0, -0.3, 0, PURPLE12 );
+ SetShotDataA( 0, 112, NULL, NULL, 8 * [ -1, 1 ][ i ], 0.2, 2, PURPLE12 );
+ SetShotDataA( 0, 120, NULL, NULL, 0, 0.2, 2, PURPLE12 );
+ FireShot( 0 );
+ }
+ angle += 12;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 8 );
+ }
+ Wait( 50 );
+ ExMove( false, count );
+ }
+ }
+ task Border(){
+ ascent( let i in 0..3 ){
+ PlaySEEx( sePower1 );
+ Concentration02( 90 );
+ Wait( 90 );
+ MakeShot( [ i, 1 ][ i == 2 ] );
+ }
+ }
+ function MakeShot( let pattern ){
+ let space = 56;
+ let px = GetPlayerX() % space;
+ let py = GetPlayerY() % space;
+ let y = GetClipMinY() - 128;
+ while( y <= GetClipMaxY() + 128 ){
+ let x = GetClipMinX() - 88;
+ while( x <= GetClipMaxX() + 88 ){
+ ascent( let i in 0..2 ){ Sudden( x + px, y + py, i * 180 + pattern * 90, [ RED21, BLUE21 ][ pattern ] ); }
+ x += space;
+ }
+ y += space;
+ }
+ }
+ task Sudden( let x, let y, let angle, let color ){
+ let objcount = 0;
+ let obj = SetShotObject( x, y, 0, angle, color, 0 );
+ Obj_SetAlpha( obj, 0 );
+ Obj_SetCollisionToPlayer( obj, false );
+ while( !Obj_BeDeleted( obj ) && objcount < 60 ){
+ Obj_SetAlpha( obj, Smooth( 0, 255, objcount, 60 ) );
+ Obj_SetSpeed( obj, Smooth( 0, 1.2, objcount, 60 ) );
+ yield;
+ objcount++;
+ }
+ if( Obj_BeDeleted( obj ) ){ return; }
+ SetShotDirectionType( ABSOLUTE );
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), 2.4, angle, color, 0 );
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 2000 );
+ SetTimer( 44 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 10 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+}
diff --git a/th_dnh/script/thA/MerryX1S.dnh b/th_dnh/script/thA/MerryX1S.dnh
new file mode 100644
index 0000000..cef9e84
--- /dev/null
+++ b/th_dnh/script/thA/MerryX1S.dnh
@@ -0,0 +1,109 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ let uniquestr = "G_MERRYX1S";
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ CreateShadowInterface( uniquestr );
+ let pattern = 0;
+ loop{
+ let w = Smooth( 90, 40, pattern, 7 );
+ PlaySE( sePower1 );
+ Concentration01( w );
+ Wait( w );
+ CircleShotGap01( 45, 4.5, YELLOW03, 10, GetAngleToPlayer() );
+ PlaySE( seShot1 );
+ Wait( 10 );
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, 0, 0 );
+ PlaySE( seShadow );
+ Wait( w / 2 );
+ let pangle = GetAngleToPlayer();
+ ascent( let i in 0..16 ){
+ CircleShotGap02( 8, 5, -0.1, Smooth( 0.5, 4.5, i, 15 ), PURPLE21, 20, pangle );
+ PlaySE( seShot1 );
+ Wait( 8 );
+ }
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 444 );
+ SetScore( 2560000 );
+ SetTimer( 60 );
+ SetInvincibility( 130 );
+ SetDamageRate( 15, 40 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 7 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 27, imgCutInMerry, 192, 256 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, 7 );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 108 );
+ ReleaseShadowInterface( uniquestr );
+ EndSpell();
+ DropItem( 16, 64 );
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+ @BackGround{ KhanBG( imgSpellKhan, 255 ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let PrevLife;
+ task Obj( let angle ){
+ let obj = SetHiddenObject( GetX(), GetY(), 10, angle, 0, true, false );
+ yield;
+ ascent( let i in 0..2 ){ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), [ 4, 4.5 ][ i ], angle, RED32, 15 ); }
+ Obj_Delete( obj );
+ }
+ task Behavior(){
+ yield;
+ SetMovePosition03( GetPlayerX(), GetPlayerY(), 20, 4.5 );
+ WaitZeroSpeed();
+ loop( 16 ){
+ let space = 12;
+ let angle = 0;
+ while( angle < 360 ){
+ Obj( angle + GetAngleToPlayer() + [ space / 2, 0 ][ IsHidden() ] );
+ angle += space;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 8 );
+ }
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 500 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, "G_MERRYX1S", true );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleYellow, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/MerryX2S.dnh b/th_dnh/script/thA/MerryX2S.dnh
new file mode 100644
index 0000000..d5c0cce
--- /dev/null
+++ b/th_dnh/script/thA/MerryX2S.dnh
@@ -0,0 +1,87 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task Shot(){
+ SetShotDirectionType( PLAYER );
+ loop( 12 ){
+ ascent( let speed in 1..3 ){
+ CircleShot01( 5, 3 * speed, PURPLE12, 10 );
+ PlaySEEx( seShot1 );
+ }
+ Wait( 5 );
+ }
+ }
+ task Laser( let pattern ){
+ let pangle = GetAngleToPlayer();
+ let angle = 0;
+ SetShotDirectionType( ABSOLUTE );
+ while( angle < 360 ){
+ let fangle = angle + pangle;
+ CreateLaserA( 0, GetX(), GetY(), 512, 12, RED01, 50 );
+ SetLaserDataA( 0, 0, fangle, 0, 0, 0, 0 );
+ SetShotKillTime( 0, 180 );
+ CreateLaserA( 1, 0, 0, 512, 48, BLUE01, 20 );
+ SetLaserDataA( 1, 0, fangle, 0, 0, 0, 0 );
+ SetShotKillTime( 1, 60 );
+ AddShot( 50, 0, 1, 0 );
+ FireShot( 0 );
+ angle += 360 / trunc( pattern / 1.5 + 6 );
+ }
+ PlaySE( seLaser1 );
+ }
+ task Behavior(){
+ yield;
+ let pattern = 0;
+ loop{
+ PlaySEEx( sePower1 );
+ Concentration01( 90 );
+ Wait( 90 );
+ Shot();
+ Wait( 70 );
+ Laser( pattern );
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2500 );
+ SetScore( 2560000 );
+ SetTimer( 55 );
+ SetInvincibility( 130 );
+ SetDamageRate( 100, 200 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 7 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 28, imgCutInMerry, 192, 256 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 109 );
+ EndSpell();
+ SetCommonData( "ShowName", -1 );
+ PlaySEEx( seBossExplode );
+ DropItem( 20, 64 );
+ DropExtend();
+ }
+ @DrawLoop{
+ SetColor( 240, 128, 255 );
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ SetColor( 255, 255, 255 );
+ DrawBossChr( imgEnemyMerry, 1, 1, 44, 60, count );
+ }
+ @BackGround{ KhanBG( imgSpellKhan, 255 ); }
+}
diff --git a/th_dnh/script/thA/Renko.dnh b/th_dnh/script/thA/Renko.dnh
new file mode 100644
index 0000000..eb564aa
--- /dev/null
+++ b/th_dnh/script/thA/Renko.dnh
@@ -0,0 +1,32 @@
+#ScriptPathData
+#ScriptPath[.\Renko0.dnh]
+#ScriptPath[.\Renko1.dnh]
+#ScriptPath[.\Renko1S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Renko2.dnh]
+#ScriptPath[.\Renko2S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Renko3.dnh]
+#ScriptPath[.\Renko3S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Renko4.dnh]
+#ScriptPath[.\Renko4S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Renko5.dnh]
+#ScriptPath[.\Renko5S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Renko6.dnh]
+#ScriptPath[.\Renko6S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Renko7.dnh]
+#ScriptPath[.\Renko7S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Renko8.dnh]
+#ScriptPath[.\Renko8S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Renko_.dnh]
+#ScriptPath[.\Renko9S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Renko_.dnh]
+#ScriptPath[.\Renko10S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/Renko0.dnh b/th_dnh/script/thA/Renko0.dnh
new file mode 100644
index 0000000..620c364
--- /dev/null
+++ b/th_dnh/script/thA/Renko0.dnh
@@ -0,0 +1,204 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let bgm = false;
+ task Behavior(){
+ yield;
+ while( GetEventStep() != 1 ){ yield; }
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 4 );
+ SetEnemyMarker( true );
+ while( GetEventStep() != 2 ){ yield; }
+ SetCommonData( "ShowName", 9 );
+ while( GetEventStep() != 3 ){ yield; }
+ PlayMusicEx( 16 );
+ Wait( 30 );
+ bgm = true;
+ }
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ SetX( GetClipMinX() );
+ SetY( -128 );
+ CreateEventFromScript( "Talk" );
+ Behavior();
+ }
+ @MainLoop{
+ if( !OnEvent() && bgm ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 24, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]えっと、たしかどこだっけ・・・" );
+ SetChar( LEFT, imgCutInReimu5 );
+ TextOut( "\c[BLUE]前回は勘で何とかなったけど、\nはっきり場所覚えてないからなぁ・・・" );
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]ま、テキトーに行けば到着するでしょ" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]そっちは無限ループ回廊よ" );
+ SetStep( 1 );
+ Wait( 100 );
+ SetChar( RIGHT, imgCutInRenko );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Enemy();
+ TextOut( "\c[RED]何?7分11秒も遅刻の上\n代理人なんてどういう了見かしら" );
+ Player();
+ SetChar( LEFT, imgCutInReimu2 );
+ TextOut( "\c[BLUE]あんた誰?" );
+ SetStep( 2 );
+ SetNameFromTexture( RIGHT, imgNameRenko );
+ Enemy();
+ TextOut( "\c[RED]メリーのお友達。\n宇佐見蓮子と言うわ、よろしく" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]それはどうも(ぺこり)" );
+ Enemy();
+ TextOut( "\c[RED]いえいえこちらこそ・・・\nってあんた、私の連れはどこに居るのよ" );
+ Player();
+ DeleteName( RIGHT );
+ TextOut( "\c[BLUE]途中で死んじゃったから\n私が代わりに来たわ" );
+ Enemy();
+ TextOut( "\c[RED]そう、あなたが殺したのね" );
+ Player();
+ TextOut( "\c[BLUE]悪かったかしら?" );
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]で、悪いついでに魔方陣も壊しに\n行きたいんだけど、どいてくれない?" );
+ Enemy();
+ TextOut( "\c[RED]前者は別に悪くないけど、\n後者はとっても悪い" );
+ TextOut( "\c[RED]今あれを壊されちゃとっても困るわ" );
+ TextOut( "\c[RED]そうね・・・\n3年くらい待ってくれないかしら" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]何?\nあんたが歴史食いの代理人になるつもり?" );
+ Enemy();
+ TextOut( "\c[RED]今更過去をやり直すことなんて\n別に興味ないわ" );
+ TextOut( "\c[RED]あの魔方陣には世界の全ての歴史が\n200年余りに渡り刻まれている" );
+ TextOut( "\c[RED]その記憶の価値は既存のあらゆる財宝を\nもってしても替えられないほどよ" );
+ Player();
+ TextOut( "\c[BLUE]その魔方陣は歴史以外に\nご飯も食べられるわけね" );
+ TextOut( "\c[BLUE]ほっとけばきっと肥満になって\n幻想郷を埋め尽くしかねないわね" );
+ Enemy();
+ TextOut( "\c[RED]なるわけないじゃない" );
+ Player();
+ SetChar( LEFT, imgCutInReimu5 );
+ TextOut( "\c[BLUE]こっちだって頼まれごとなんだし\nちょっと引けないわね" );
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]私も正直、\nあの魔方陣は危険だと思ってるし" );
+ Enemy();
+ TextOut( "\c[RED]・・・そうね、どうしても先に\n進みたいならこっちにも考えがあるわ" );
+ Player();
+ TextOut( "\c[BLUE]あんたのお友達は\nその考えをやって撃沈したのよ" );
+ Enemy();
+ TextOut( "\c[RED]あんまりなめないでもらえるかしら" );
+ TextOut( "\c[RED]メリーとも何度か同士討ちしてみたけど\n現時点で9勝0敗よ" );
+ Player();
+ TextOut( "\c[BLUE]じゃあ先に10勝したら私の勝ちね" );
+ Enemy();
+ TextOut( "\c[RED]OK、それでいいわ・・・" );
+ SetStep( 3 );
+ TextOut( "\c[RED]じゃあ早速行くわよ!\nじゃーんけーん・・・" );
+ Player();
+ TextOut( "\c[BLUE]パー弾幕とか出るのかしら" );
+ Enemy();
+ TextOut( "\c[RED]まさか、それをやったら\n違うSTGになってしまうわ" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa4 );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]あー、見事に迷ったぜ" );
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]3回行けば完全に道覚えるんだが\nまだ2回目だしな・・・" );
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]おっと、ここ曲がるんだったかな" );
+ MoveChar( LEFT, BACK );
+ TextOut( "\c[RED]そっちは肥溜めトラップよ" );
+ SetStep( 1 );
+ Wait( 100 );
+ SetChar( RIGHT, imgCutInRenko );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Enemy();
+ TextOut( "\c[RED]何?あなたいつから\n魔女コスの趣味に目覚めたのかしら" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa4 );
+ TextOut( "\c[BLUE]誰?" );
+ Enemy();
+ TextOut( "\c[RED]あぁ、人違いだったのね" );
+ SetStep( 2 );
+ SetNameFromTexture( RIGHT, imgNameRenko );
+ TextOut( "\c[RED]私は宇佐見蓮子。もう一人とコンビ組んで\nこっちの世界にお邪魔しているのよ" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]あぁ、それはそれは\nイナカにウェルカムだぜ" );
+ Enemy();
+ TextOut( "\c[RED]ところで、もう一人・・・青紫の服に\nモブキャップの都会者見かけなかった?" );
+ Player();
+ DeleteName( RIGHT );
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]あー、都会者は知らないけど、\n変人なら見かけたぜ" );
+ Enemy();
+ TextOut( "\c[RED]で?" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]変だったから殺した" );
+ Enemy();
+ TextOut( "\c[RED]・・・どうやらここの人間には\n私たちの言葉が通じるようね" );
+ Player();
+ TextOut( "\c[BLUE]そりゃどうも・・・で、\nちょっとついでに道を聞きたいんだが" );
+ Enemy();
+ TextOut( "\c[RED]件の魔方陣ならこの先よ" );
+ Player();
+ TextOut( "\c[BLUE]そうかい、じゃああんたは離れてな\nちょっと派手にぶっ壊してくるから" );
+ Enemy();
+ TextOut( "\c[RED]壊すの?あれを?" );
+ TextOut( "\c[RED]悪いけど、待ってもらえないかしら\n・・・そうね、3年くらいは" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]残念だが、3分が限度だな" );
+ Enemy();
+ TextOut( "\c[RED]何でせっかくの貴重な魔方陣を壊すのよ?" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa4 );
+ TextOut( "\c[BLUE]こっちも頼まれてやってるからなぁ\n恨みは無いがお飯のため死んでもらうのさ" );
+ Enemy();
+ TextOut( "\c[RED]そう、あなたには\nあれの価値が分からないのかしら" );
+ TextOut( "\c[RED]あの魔方陣には世界の全ての歴史が\n200年余りに渡り刻まれている" );
+ TextOut( "\c[RED]その記憶の価値は既存のあらゆる歴史書を\nもってしても替えられないほどよ" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]あー、それは残念なことだな" );
+ Enemy();
+ TextOut( "\c[RED]ということで、今は帰ってもらおうかしら" );
+ Player();
+ TextOut( "\c[BLUE]そうだな、お前ももう一人と同じく\nアレできるようになったんだっけ?" );
+ Enemy();
+ TextOut( "\c[RED]アレはできないけど\nソレならできるわ" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa3 );
+ TextOut( "\c[BLUE]じゃあソレでもいいから\n10枚以内で私を倒してみな!" );
+ SetStep( 3 );
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]そしたら壊さずに私が蒐集してやる" );
+ Enemy();
+ TextOut( "\c[RED]不公平もいいところね\n・・・まぁでもいいわ" );
+ TextOut( "\c[RED]その時はあなたのところに\n入り浸って研究させてもらうわよ" );
+ Player();
+ TextOut( "\c[BLUE]ふん、多少は弾の扱いがうまいと聞いたが\n全部避けきってやるぜ!" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/Renko1.dnh b/th_dnh/script/thA/Renko1.dnh
new file mode 100644
index 0000000..11fd27c
--- /dev/null
+++ b/th_dnh/script/thA/Renko1.dnh
@@ -0,0 +1,42 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 90 );
+ SetShotDirectionType( PLAYER );
+ let pattern = 0;
+ loop{
+ loop( [ 4, 2, 6 ][ pattern % 3 ] ){
+ ascent( let i in 1..4 ){ CircleShot01( 8, i, BLUE11, 15 ); }
+ PlaySEEx( seShot1 );
+ Wait( 30 );
+ }
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2600 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
diff --git a/th_dnh/script/thA/Renko10S.dnh b/th_dnh/script/thA/Renko10S.dnh
new file mode 100644
index 0000000..8cb9030
--- /dev/null
+++ b/th_dnh/script/thA/Renko10S.dnh
@@ -0,0 +1,201 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ let TimerMax = 133;
+ let maxframe = TimerMax * 60;
+ let WallList = [];
+ function Concentration( let timeredist ){
+ if( timeredist && GetTimer() <= 30 ){ return; }
+ Concentration01( 120 );
+ PlaySEEx( sePower1 );
+ Wait( 120 );
+ }
+ task Wall( let x, let y, let angle, let len ){
+ let obj = Obj_Create( OBJ_LASER );
+ Obj_SetSpeed( obj, 0 );
+ Obj_SetAngle( obj, angle );
+ Obj_SetAutoDelete( obj, false );
+ ObjShot_SetGraphic( obj, GREEN02 );
+ ObjShot_SetDelay( obj, 100 );
+ ObjShot_SetBombResist( obj, true );
+ ObjLaser_SetLength( obj, len );
+ ObjLaser_SetWidth( obj, 12 );
+ ObjLaser_SetSource( obj, false );
+ WallList = WallList ~ [ obj ];
+ loop{
+ Obj_SetX( obj, x + [ Max( Smooth( 0, 64, count, maxframe ), Accelerate( 0, 40, 10000 - GetLife(), 10000 ) ) * [ 1, -1 ][ angle == 90 ], 0 ][ angle % 180 == 0 ] );
+ Obj_SetY( obj, y + [ Max( Smooth( 0, 64, count, maxframe ), Accelerate( 0, 40, 10000 - GetLife(), 10000 ) ) * [ -1, 1 ][ angle == 0 ], 0 ][ angle % 180 == 90 ] );
+ yield;
+ }
+ }
+ task Move(){
+ loop{
+ Wait( 360 );
+ let dstx = GetX();
+ let dsty = GetY();
+ let len = 40;
+ dstx = dstx + len * [ -1, 1 ][ GetPlayerX() - GetX() > 0 ];
+ if( GetPlayerY() > GetCenterY() ){ dsty += 32 * [ -1, 1 ][ rand_int( 0, 1 ) ]; }
+ else{ dsty = dsty + len * [ -1, 1 ][ GetPlayerY() - GetY() > 0 ]; }
+ if( dstx < GetClipMinX() + 80 && dstx > GetClipMinX() + 44 ){ dstx = GetClipMinX() + 81; }
+ if( dstx > GetClipMaxX() - 80 && dstx < GetClipMaxX() - 44 ){ dstx = GetClipMaxX() - 81; }
+ if( dstx > GetClipMinX() + 80 && dstx < GetClipMaxX() - 80 ){
+ if( dsty < GetClipMinY() + 64 ){ dsty += 96; }
+ else if( dsty > GetCenterY() ){ dsty -= 96; }
+ SetMovePosition03( dstx, dsty, 20, 1.6 );
+ }
+ }
+ }
+ task Laser( let angle, let delay ){
+ let obj = SetShotObject( GetX(), GetY(), 2, angle, YELLOW21, delay );
+ while( !Obj_BeDeleted( obj ) ){
+ ascent( let i in 0..length( WallList ) ){
+ if( Collision_Obj_Obj( WallList[ i ], obj ) ){
+ let ref = angle;
+ alternative( Obj_GetAngle( WallList[ i ] ) )
+ case( 0, 180 ){ ref = -ref; }
+ case( 90, 270 ){ ref = 180 - ref; }
+ let speed = 1;
+ loop( 3 ){
+ WayShotObjectGap01( obj, 30, 30, speed, GREEN21, 5, ref );
+ speed += 0.4;
+ }
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), 1.4, angle, YELLOW21, 0 );
+ Obj_Delete( obj );
+ }
+ }
+ yield;
+ }
+ }
+ task RefShot( let angle ){
+ let obj = SetShotObject( GetX(), GetY(), 1, angle, WHITE12, 20 );
+ while( !Obj_BeDeleted( obj ) ){
+ ascent( let i in 0..length( WallList ) ){
+ if( Collision_Obj_Obj( WallList[ i ], obj ) ){
+ let ref = angle;
+ alternative( Obj_GetAngle( WallList[ i ] ) )
+ case( 0, 180 ){ ref = -ref; }
+ case( 90, 270 ){ ref = 180 - ref; }
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), 1, ref, WHITE12, 0 );
+ Obj_Delete( obj );
+ }
+ }
+ yield;
+ }
+ }
+ task ShotLaser3Way( let angle ){
+ ascent( let gap in 0..3 ){
+ ascent( let delay in 0..3 ){ Laser( angle + gap * 10, delay * 10 ); }
+ PlaySEEx( seShot1 );
+ Wait( 15 );
+ }
+ }
+ task LaserLoop(){
+ PlaySEEx( seShot1 );
+ yield;
+ let pattern = 0;
+ loop{
+ ShotLaser3Way( count / 3 );
+ Wait( 100 );
+ pattern++;
+ }
+ }
+ task RefShotLoop(){
+ PlaySEEx( seShot1 );
+ yield;
+ let pattern = 0;
+ loop{
+ let angle = 0;
+ while( angle < 360 ){
+ RefShot( angle );
+ angle += 20;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 50 );
+ pattern++;
+ }
+ }
+ task WayShotLoop(){
+ PlaySEEx( seShot1 );
+ yield;
+ let pattern = 0;
+ loop{
+ WayShotGap01( 30, 30, 0.3, PURPLE04, 20, count / 2 );
+ PlaySEEx( seShot1 );
+ Wait( 40 );
+ pattern++;
+ }
+ }
+ task CircleShotLoop(){
+ PlaySEEx( seShot1 );
+ yield;
+ let pattern = 0;
+ loop{
+ CircleShotGap02( 20, 8, -0.5, 1, BLUE02, 20, 10 );
+ PlaySEEx( seShot1 );
+ Wait( 65 );
+ pattern++;
+ }
+ }
+ task Behavior(){
+ yield;
+ Concentration( true );
+ let angle = 0;
+ while( angle < 360 ){
+ Wall(
+ [ GetClipMinX(), GetClipMaxX(), GetClipMaxX(), GetClipMinX() ][ angle / 90 ],
+ [ GetClipMinY(), GetClipMinY(), GetClipMaxY(), GetClipMaxY() ][ angle / 90 ], angle, [ 400, 464 ][ ( angle / 90 ) % 2 ]
+ );
+ angle += 90;
+ }
+ PlaySEEx( seLaser1 );
+ Wait( 60 );
+ Move();
+ Concentration( true );
+ LaserLoop();
+ while( GetTimer() > 30 && GetLife() > 9000 ){ loop( 5 ){ yield; } }
+ Concentration( true );
+ RefShotLoop();
+ while( GetTimer() > 30 && GetLife() > 7000 ){ loop( 5 ){ yield; } }
+ Concentration( true );
+ WayShotLoop();
+ while( GetTimer() > 30 && GetLife() > 4000 ){ loop( 5 ){ yield; } }
+ Concentration( false );
+ CircleShotLoop();
+ }
+ @Initialize{
+ SetLife( 12000 );
+ SetScore( 20000000 );
+ SetTimer( TimerMax );
+ SetInvincibility( 300 );
+ SetDamageRate( 90, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( [ 60, 1 ][ GetCommonDataDefault( "SpellPractice", false ) ], 240, 2 );
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 38, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ if( GetLife() <= 0 ){ if( count % 15 == 0 ){ PlaySEEx( seShot1 ); } }
+ else{ yield; }
+ SEShotHitBoss( seDamage, count );
+ if( !OnBomb ){ Collision( 32, 16 ); }
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 119 );
+ EndSpell();
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
diff --git a/th_dnh/script/thA/Renko1S.dnh b/th_dnh/script/thA/Renko1S.dnh
new file mode 100644
index 0000000..c9bdf23
--- /dev/null
+++ b/th_dnh/script/thA/Renko1S.dnh
@@ -0,0 +1,98 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Shot(){
+ Wait( 150 );
+ loop{
+ SetShotDirectionType( PLAYER );
+ CircleShot01( 12, 0.9, ORANGE21, 20 );
+ PlaySE( seShot2 );
+ Wait( 43 );
+ }
+ }
+ task Behavior(){
+ yield;
+ Shot();
+ loop{
+ PlaySE( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ SetShotDirectionType( ABSOLUTE );
+ CreateEnemyFromScript( "Mother", GetX(), GetY(), 0, GetAngleToPlayer() + RandBlur( 36 ), 0 );
+ Wait( 300 );
+ ExMove( false, count );
+ }
+ }
+ @Initialize{
+ SetLife( 500 );
+ SetScore( 7777777 );
+ SetTimer( 70 );
+ SetInvincibility( 130 );
+ SetDamageRate( 13, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 29, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ if( !OnBomb ){ Collision( 32, 16 ); }
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 110 );
+ EndSpell();
+ if( GetPlayerLife() <= 2 ){ DropBomb(); }
+ DropItem( 30, 64 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
+script_enemy Mother{
+#include_function ".\FUNC\Enemy.dnh"
+ let uniquestr = "G_RENKO1S";
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateLaserB( 0, 448, 16, WHITE21, 120 );
+ SetLaserDataB( 0, 0, 0, 0, 1, angle, 1, angle - 90, 2.5 );
+ SetLaserDataB( 0, 100, 0, NULL, 0, NULL, 1, NULL, 2 );
+ SetLaserDataB( 0, 200, 0, NULL, 0, NULL, 1, NULL, 1.5 );
+ SetLaserDataB( 0, 210, 0, NULL, 0, NULL, 1, NULL, 1.1 );
+ SetLaserDataB( 0, 230, 0, NULL, 0, NULL, 1, NULL, 1 );
+ SetShotKillTime( 0, 360 );
+ FireShot( 0 );
+ angle += 45;
+ }
+ PlaySE( seLaser1 );
+ Wait( 50 );
+ SetSpeed( 4 );
+ while( GetSpeed() > 0 && !IsOut( -32 ) ){ yield; }
+ SetSpeed( 0 );
+ Wait( 200 );
+ VanishEnemy();
+ }
+ @Initialize{
+ SetLife( 1 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( GetTimer() <= 0 ){ VanishEnemy(); }
+ SetSpeed( Max( GetSpeed() - 0.04, 0 ) );
+ }
+}
diff --git a/th_dnh/script/thA/Renko2.dnh b/th_dnh/script/thA/Renko2.dnh
new file mode 100644
index 0000000..27acd15
--- /dev/null
+++ b/th_dnh/script/thA/Renko2.dnh
@@ -0,0 +1,42 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 150 );
+ SetShotDirectionType( PLAYER );
+ let pattern = 0;
+ loop{
+ loop( [ 7, 6, 5, 7, 3 ][ pattern % 5 ] ){
+ ascent( let i in 1..4 ){ CircleShot01( 8, i, BLUE11, 15 ); }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2600 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
diff --git a/th_dnh/script/thA/Renko2S.dnh b/th_dnh/script/thA/Renko2S.dnh
new file mode 100644
index 0000000..0ad7a8f
--- /dev/null
+++ b/th_dnh/script/thA/Renko2S.dnh
@@ -0,0 +1,78 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task BigBall( let angle ){
+ let obj = SetShotObject( GetX(), GetY(), 4, angle, RED03, 30 );
+ let ref = false;
+ while( !Obj_BeDeleted( obj ) ){
+ if( !ref ){ ref = ReflectObject( obj, false, true, true ); }
+ if( ref && Hypot( Obj_GetX( obj ) - GetX(), Obj_GetY( obj ) - GetY() ) < 64 ){
+ let x = Obj_GetX( obj );
+ let y = Obj_GetY( obj );
+ let nowangle = Obj_GetAngle( obj );
+ loop( 3 ){ CreateShot01( x + RandBlur( 22 ), y + RandBlur( 22 ), rand( 2.8, 3.3 ), nowangle + RandBlur( 3 ), RED02, 4 ); }
+ loop( 8 ){ CreateShot01( x + RandBlur( 22 ), y + RandBlur( 22 ), rand( 2.2, 2.9 ), nowangle + RandBlur( 8 ), RED01, 4 ); }
+ loop( 10 ){ CreateShot01( x + RandBlur( 22 ), y + RandBlur( 22 ), rand( 1.6, 2.3 ), nowangle + RandBlur( 10 ), RED04, 4 ); }
+ loop( 12 ){ CreateShot01( x + RandBlur( 22 ), y + RandBlur( 22 ), rand( 1, 2 ), nowangle + RandBlur( 28 ), RED21, 4 ); }
+ Obj_Delete( obj );
+ }
+ yield;
+ }
+ }
+ task Behavior(){
+ yield;
+ let pattern = 0;
+ loop{
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ ascent( let i in 0..3 ){
+ let angle = 0;
+ while( angle < 360 ){
+ BigBall( angle + GetAngleToPlayer() + i * 5 );
+ angle += 30;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 10 );
+ }
+ ExMove( false, count );
+ Wait( [ 30, 100 ][ pattern < 4 ] );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 500 );
+ SetScore( 7777777 );
+ SetTimer( 80 );
+ SetInvincibility( 130 );
+ SetDamageRate( 10, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 30, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ if( !OnBomb ){ Collision( 32, 16 ); }
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 111 );
+ EndSpell();
+ DropItem( 30, 64 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
diff --git a/th_dnh/script/thA/Renko3.dnh b/th_dnh/script/thA/Renko3.dnh
new file mode 100644
index 0000000..b11253c
--- /dev/null
+++ b/th_dnh/script/thA/Renko3.dnh
@@ -0,0 +1,51 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Big(){
+ loop{
+ ascent( let i in 1..3 ){ CircleShotGap01( 90, 1 * 0.9, ORANGE03, 20, count ); }
+ PlaySEEx( seShot1 );
+ Wait( 17 );
+ }
+ }
+ task Behavior(){
+ Wait( 150 );
+ SetShotDirectionType( PLAYER );
+ let pattern = 0;
+ Big();
+ loop{
+ loop( [ 4, 2, 6 ][ pattern % 3 ] ){
+ ascent( let i in 1..3 ){ CircleShot01( 8, i * 1.3, BLUE11, 15 ); }
+ CircleShotGap01( 90, 1, ORANGE03, 20, count );
+ PlaySEEx( seShot1 );
+ Wait( 34 );
+ }
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2600 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetDamageRate( 90, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
diff --git a/th_dnh/script/thA/Renko3S.dnh b/th_dnh/script/thA/Renko3S.dnh
new file mode 100644
index 0000000..e9c67d5
--- /dev/null
+++ b/th_dnh/script/thA/Renko3S.dnh
@@ -0,0 +1,74 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task LaserMaker( let angle, let color, let pattern ){
+ let obj = SetHiddenObject( GetX(), GetY(), 4, angle, 30, true, true );
+ let dir = -1;
+ if( WaitObject( obj, 20 ) ){ return; }
+ while( !WaitObject( obj, 15 ) ){
+ SetShotDirectionType( ABSOLUTE );
+ CreateLaserA( 0, Obj_GetX( obj ), Obj_GetY( obj ), 448, 16, color, 80 );
+ SetLaserDataA( 0, 0, RandBlur( ( pattern % 3 + 1 ) * 8 ) + Obj_GetAngle( obj ) + 90 * dir, 0, 0, 0, 0 );
+ SetShotKillTime( 0, 300 );
+ FireShot( 0 );
+ PlaySEEx( seLaser1 );
+ WayShotObjectGap01( obj, 10, 20, 2, color, 20, Obj_GetAngle( obj ) );
+ dir = -dir;
+ }
+ }
+ task Behavior(){
+ yield;
+ let pattern = 0;
+ loop{
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ SetShotDirectionType( PLAYER );
+ CircleShot01( 45, 4.5, RED03, 30 );
+ loop( 6 ){ CircleShotGap01( 60, rand( 3.5, 4.3 ), RED02, 30, RandBlur( 6 ) ); }
+ loop( 9 ){ CircleShotGap01( 60, rand( 2.3, 3.3 ), RED01, 30, RandBlur( 13 ) ); }
+ loop( 15 ){ CircleShotGap01( 60, rand( 1, 2.3 ), RED04, 30, RandBlur( 20 ) ); }
+ ascent( let i in 0..6 ){ LaserMaker( GetAngleToPlayer() + i * 60, [ BLUE01, RED01, PURPLE01, GREEN01, AQUA01, YELLOW01, ORANGE01, WHITE01 ][ i ], pattern ); }
+ PlaySE( seShot1 );
+ Wait( [ 30, 60 ][ pattern < 2 ] );
+ ExMove( false, count );
+ Wait( [ 90, 120 ][ pattern < 3 ] );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 500 );
+ SetScore( 7777777 );
+ SetTimer( 85 );
+ SetInvincibility( 130 );
+ SetDamageRate( 9, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 31, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ if( !OnBomb ){ Collision( 32, 16 ); }
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 112 );
+ EndSpell();
+ DropItem( 30, 64 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
diff --git a/th_dnh/script/thA/Renko4.dnh b/th_dnh/script/thA/Renko4.dnh
new file mode 100644
index 0000000..4e7289e
--- /dev/null
+++ b/th_dnh/script/thA/Renko4.dnh
@@ -0,0 +1,42 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 150 );
+ SetShotDirectionType( PLAYER );
+ let pattern = 0;
+ loop{
+ loop( [ 4, 2, 6 ][ pattern % 3 ] ){
+ ascent( let i in 0..2 ){ CircleShot01( 8, 1.5 + 2.5 * i, PURPLE04, 15 + 30 * i ); }
+ PlaySEEx( seShot1 );
+ Wait( 30 );
+ }
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2600 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
diff --git a/th_dnh/script/thA/Renko4S.dnh b/th_dnh/script/thA/Renko4S.dnh
new file mode 100644
index 0000000..9fa01e7
--- /dev/null
+++ b/th_dnh/script/thA/Renko4S.dnh
@@ -0,0 +1,85 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task NEO( let x, let y, let dir ){
+ let count = 0;
+ let obj = SetShotObject( x, y, 0.3, 90 * dir, WHITE04, 50 );
+ let gravitycount = 32767;
+ while( !Obj_BeDeleted( obj ) && count < gravitycount + 30 ){
+ if( Hypot( Obj_GetX( obj ) - GetPlayerX(), Obj_GetY( obj ) - GetPlayerY() ) < 64 || gravitycount != 32767 ){
+ if( gravitycount == 32767 ){ gravitycount = count; }
+ let angle = Obj_GetAngle( obj );
+ Obj_SetAngle( obj, atan2( GetPlayerY() - Obj_GetY( obj ), GetPlayerX() - Obj_GetX( obj ) ) );
+ }
+ count++;
+ yield;
+ }
+ if( Obj_BeDeleted( obj ) ){ return; }
+ CreateShotA( 0, Obj_GetX( obj ), Obj_GetY( obj ), 0 );
+ SetShotDataA( 0, 0, 0.3, Obj_GetAngle( obj ), 0, 0.01, 1, RED04 );
+ SetShotDataA( 0, 30, NULL, NULL, 0, 0.1, 5, RED04 );
+ FireShot( 0 );
+ Obj_Delete( obj );
+ }
+ task Behavior(){
+ yield;
+ let pattern = 0;
+ loop{
+ Concentration01( 120 );
+ PlaySEEx( sePower1 );
+ Wait( 120 );
+ let y = 0;
+ while( y < GetClipMaxY() ){
+ let x = GetClipMinX() + ( pattern % 3 ) * 8;
+ while( x <= GetClipMaxX() ){
+ if( rand( -64, [ 100, 128 ][ GetMissCountInThisSpell() == 0 ] ) > GetTimer() && !( Near( x, GetPlayerX(), 28 ) && Near( y, GetPlayerY(), 28 ) ) ){
+ NEO( x, [ y, GetClipMaxY() - y ][ pattern % 2 ], [ 1, -1 ][ pattern % 2 ] );
+ }
+ x += 24;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 3 );
+ y += 24;
+ }
+ Wait( 90 - pattern );
+ ExMove( false, count );
+ Wait( 90 - pattern );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 500 );
+ SetScore( 7777777 );
+ SetTimer( 86 );
+ SetInvincibility( 130 );
+ SetDamageRate( 8, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 32, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ if( !OnBomb ){ Collision( 32, 16 ); }
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 113 );
+ EndSpell();
+ DropItem( 30, 64 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
diff --git a/th_dnh/script/thA/Renko5.dnh b/th_dnh/script/thA/Renko5.dnh
new file mode 100644
index 0000000..56efb3e
--- /dev/null
+++ b/th_dnh/script/thA/Renko5.dnh
@@ -0,0 +1,40 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 150 );
+ SetShotDirectionType( PLAYER );
+ loop{
+ loop( 6 ){
+ ascent( let i in 0..2 ){ CircleShot01( 8, [ 1.5, 4.5 ][ i ], [ BLUE11, PURPLE11 ][ i ], 15 ); }
+ PlaySEEx( seShot1 );
+ Wait( 30 );
+ }
+ ExMove( false, count );
+ }
+ }
+ @Initialize{
+ SetLife( 2600 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
diff --git a/th_dnh/script/thA/Renko5S.dnh b/th_dnh/script/thA/Renko5S.dnh
new file mode 100644
index 0000000..840ae2c
--- /dev/null
+++ b/th_dnh/script/thA/Renko5S.dnh
@@ -0,0 +1,104 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ let HoleList = [];
+ let TimeMax = 81;
+ task Behavior(){
+ yield;
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ MakeRandShot();
+ MakeHole();
+ loop{
+ Wait( 200 );
+ ExMove( false, count );
+ }
+ }
+ task MakeRandShot(){
+ loop{
+ let level = trunc( Max( Smooth( 2.5, 6.5, TimeMax - GetTimer(), TimeMax ), SlowDown( 2.5, 4.5, 300 - GetLife(), 300 ) ) );
+ loop( level ){ RandShot(); }
+ PlaySEEx( seShot2 );
+ Wait( 10 );
+ }
+ }
+ task MakeHole(){
+ Wait( 50 );
+ loop{
+ let angle = -30;
+ while( angle <= 30 ){
+ Hole( angle );
+ Hole( angle + 180 );
+ angle += 30;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 120 );
+ }
+ }
+ task RandShot(){
+ let dir = [ -1, 1 ][ rand_int( 0, 1 ) ];
+ let obj = SetShotObject( GetCenterX() + 192 * dir, rand( GetClipMinY(), GetClipMaxY() ), 0, 90 * dir + 90, ORANGE21, 30 );
+ while( !Obj_BeDeleted( obj ) ){
+ if( Obj_GetSpeed( obj ) < 1 ){ Obj_SetSpeed( obj, Obj_GetSpeed( obj ) + 0.01 ); }
+ CheckInHole( obj );
+ yield;
+ }
+ }
+ function CheckInHole( let obj ){
+ let i = 0;
+ loop( length( HoleList ) ){
+ if( Collision_Obj_Obj( HoleList[ i ], obj ) ){ Obj_SetAngle( obj, Obj_GetAngle( obj ) + 1 ); }
+ i++;
+ }
+ }
+ task Hole( let angle ){
+ let obj = SetShotObject( GetX(), GetY(), 0.7, GetAngleToPlayer() + angle, BLUE03, 30 );
+ HoleList = HoleList ~ [ obj ];
+ while( !Obj_BeDeleted( obj ) ){ yield; }
+ let i = 0;
+ loop( length( HoleList ) ){
+ if( HoleList[ i ] == obj ){
+ HoleList = erase( HoleList, i );
+ return;
+ }
+ i++;
+ }
+ }
+ @Initialize{
+ SetLife( 500 );
+ SetScore( 7777777 );
+ SetTimer( TimeMax );
+ SetInvincibility( 130 );
+ SetDamageRate( 8, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 33, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ if( !OnBomb ){ Collision( 32, 16 ); }
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 114 );
+ EndSpell();
+ DropItem( 30, 64 );
+ if( GetPlayerLife() <= 2 ){ DropBomb(); }
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
diff --git a/th_dnh/script/thA/Renko6.dnh b/th_dnh/script/thA/Renko6.dnh
new file mode 100644
index 0000000..1b42d69
--- /dev/null
+++ b/th_dnh/script/thA/Renko6.dnh
@@ -0,0 +1,43 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 150 );
+ SetShotDirectionType( PLAYER );
+ let pattern = 0;
+ loop{
+ loop( 10 ){
+ ascent( let i in 1..3 ){ CircleShot01( 15, i * 1.5 * ( pattern % 2 + 1 ), ORANGE11, 15 ); }
+ PlaySEEx( seShot1 );
+ Wait( 7 );
+ }
+ ExMove( false, count );
+ Wait( [ 7, 35 ][ pattern % 2 ] );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2600 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
diff --git a/th_dnh/script/thA/Renko6S.dnh b/th_dnh/script/thA/Renko6S.dnh
new file mode 100644
index 0000000..a433c4b
--- /dev/null
+++ b/th_dnh/script/thA/Renko6S.dnh
@@ -0,0 +1,89 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ let speed = 1.5;
+ let div = 6;
+ let divtime = 24;
+ function Shot( let stack, let angle, let pattern ){
+ stack++;
+ let stackgap = [ [ -1, -2 ][ pattern == 0 ], [ 0, -1 ][ pattern == 1 ], 0 ][ pattern % 3 ];
+ let gap = -count / 16;
+ loop( 2 ){
+ let fangle = angle + gap;
+ CreateShotA( stack, 0, 0, 0 );
+ SetShotDataA( stack, 0, speed, fangle, 3.6 * GetDir( gap ) * [ 0, 1, -1 ][ pattern % 3 ], 0, speed, RED22 );
+ if( stack < div + stackgap ){
+ SetShotKillTime( stack, divtime + 1 );
+ Shot( stack, fangle, pattern );
+ }
+ else{ SetShotDataA( stack, divtime, NULL, NULL, 0, -0.01, 1, RED22 ); }
+ AddShot( divtime, stack - 1, stack, 0 );
+ gap += count / 8;
+ }
+ }
+ task SE( let pattern ){
+ Wait( 20 );
+ loop( div + [ [ -1, -2 ][ pattern == 0 ], [ 0, -1 ][ pattern == 1 ], 0 ][ pattern % 3 ] ){
+ Wait( divtime );
+ PlaySEEx( seKira1 );
+ }
+ }
+ task Behavior(){
+ yield;
+ let pattern = 0;
+ loop{
+ PlaySEEx( sePower1 );
+ Concentration01( 123 );
+ Wait( 123 );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateShotA( 0, GetX(), GetY(), 20 );
+ SetShotDataA( 0, 0, speed, angle, 0, 0, speed, RED22 );
+ SetShotKillTime( 0, divtime + 1 );
+ Shot( 0, angle, pattern );
+ FireShot( 0 );
+ angle += 45;
+ }
+ PlaySEEx( seShot1 );
+ SE( pattern );
+ Wait( 73 );
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 500 );
+ SetScore( 7777777 );
+ SetTimer( 85 );
+ SetInvincibility( 130 );
+ SetDamageRate( 8, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 34, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ if( !OnBomb ){ Collision( 32, 16 ); }
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 115 );
+ EndSpell();
+ DropItem( 30, 64 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
diff --git a/th_dnh/script/thA/Renko7.dnh b/th_dnh/script/thA/Renko7.dnh
new file mode 100644
index 0000000..8b8f19c
--- /dev/null
+++ b/th_dnh/script/thA/Renko7.dnh
@@ -0,0 +1,52 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 150 );
+ let pattern = 3;
+ SetShotDirectionType( PLAYER );
+ loop{
+ loop( 20 ){
+ let speed = 1.5;
+ loop( 2 ){
+ let dir = -1;
+ loop( 2 ){
+ CircleShotGap01( 90, speed, [ RED11, ORANGE11, YELLOW11, GREEN11, AQUA11, BLUE11, PURPLE11 ][ pattern % 7 ], 15, pattern * 4.7 * dir );
+ dir = -dir;
+ }
+ speed += 1.5;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 6 );
+ pattern++;
+ }
+ CircleShot01( 6, 1, WHITE04, 30 );
+ PlaySEEx( seShot3 );
+ ExMove( false, count );
+ }
+ }
+ @Initialize{
+ SetLife( 2600 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
diff --git a/th_dnh/script/thA/Renko7S.dnh b/th_dnh/script/thA/Renko7S.dnh
new file mode 100644
index 0000000..2330438
--- /dev/null
+++ b/th_dnh/script/thA/Renko7S.dnh
@@ -0,0 +1,88 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ let Freeze = false;
+ task Behavior(){
+ Wait( 40 );
+ let pattern = 0;
+ loop{
+ Wait( 60 );
+ loop( 73 ){
+ let angle = 0;
+ while( angle < 360 ){
+ let dir = -1;
+ loop( 2 ){
+ ChaosShot( count * 3 * dir + angle, dir, pattern + 1 );
+ dir = -dir;
+ }
+ angle += 90;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 3 );
+ }
+ ExMove( false, count );
+ Wait( 60 );
+ Explosion01( GetX(), GetY(), 16, 0.5, 16 );
+ PlaySEEx( seKira1 );
+ Concentration01( 60 );
+ PlaySEEx( sePower1 );
+ Freeze = true;
+ Wait( 60 );
+ Freeze = false;
+ pattern++;
+ }
+ }
+ task ChaosShot( let angle, let dir, let pattern ){
+ let color = [ RED02, BLUE02 ][ dir < 0 ];
+ let obj = SetShotObject( GetX(), GetY(), 4.2, angle, color, 10 );
+ Obj_SetAutoDelete( obj, false );
+ let count = 0;
+ while( !Freeze ){
+ Obj_SetAngle( obj, Obj_GetAngle( obj ) + [ 2, 4 ][ count < 55 ] * dir );
+ yield;
+ count++;
+ }
+ while( Freeze ){
+ Obj_SetSpeed( obj, Max( Obj_GetSpeed( obj ) - 0.1, 0 ) );
+ yield;
+ count++;
+ }
+ CreateShot02( Obj_GetX( obj ), Obj_GetY( obj ), 0, count * pattern * dir, 0.05, sin( count * 10 ) / 2 + 1.3, color, 0 );
+ Obj_Delete( obj );
+ }
+ @Initialize{
+ SetLife( 500 );
+ SetScore( 7777777 );
+ SetTimer( 89 );
+ SetInvincibility( 130 );
+ SetDamageRate( 7, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 35, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ if( !OnBomb ){ Collision( 32, 16 ); }
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 116 );
+ EndSpell();
+ DropItem( 30, 64 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
diff --git a/th_dnh/script/thA/Renko8.dnh b/th_dnh/script/thA/Renko8.dnh
new file mode 100644
index 0000000..5a6ad17
--- /dev/null
+++ b/th_dnh/script/thA/Renko8.dnh
@@ -0,0 +1,49 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 150 );
+ SetShotDirectionType( PLAYER );
+ loop{
+ loop( 20 ){
+ let angle = 0;
+ while( angle < 360 ){
+ let num = 0;
+ loop( 6 ){
+ CreateShot01( GetX(), GetY(), 2 + num * 0.2, ( num - 2.5 ) * 16 + angle + count * 2, [ RED01, BLUE01, PURPLE01 ][ num % 3 ], 10 );
+ num++;
+ }
+ angle += 120;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 5 );
+ }
+ Wait( 10 );
+ ExMove( false, count );
+ }
+ }
+ @Initialize{
+ SetLife( 2600 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetDamageRate( 100, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 16 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
diff --git a/th_dnh/script/thA/Renko8S.dnh b/th_dnh/script/thA/Renko8S.dnh
new file mode 100644
index 0000000..d29bf3a
--- /dev/null
+++ b/th_dnh/script/thA/Renko8S.dnh
@@ -0,0 +1,137 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ let uniquestr = "G_RENKO8S";
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ Wait( 120 );
+ ascent( let j in 0..2 ){
+ ascent( let i in 0..4 ){
+ let x = GetCenterX() + [ 192, 96 ][ j ] * [ 1, -1 ][ trunc( i / 2 ) ];
+ let y = GetCenterY() + [ 144, 224 ][ j ] * [ 1, -1 ][ i % 2 ];
+ let angle = [ [ 90, 270 ][ trunc( i / 2 ) ], [ 180, 0 ][ i % 2 ] ][ j ];
+ CreateEnemyFromScript( "Shadow", x, y, 0, angle, j );
+ }
+ }
+ PlaySEEx( seShadow );
+ Wait( 300 );
+ let pattern = 0;
+ loop{
+ ExMove( false, count );
+ loop( 3 ){
+ SetShotDirectionType( PLAYER );
+ let speed = 0.6;
+ loop( 2 ){
+ CircleShot01( 10, speed, PURPLE12, 30 );
+ speed += 0.4;
+ }
+ PlaySEEx( seShot1 );
+ Wait( Max( 100 - pattern, 30 ) );
+ }
+ pattern++;
+ }
+ }
+ @Initialize{
+ LoadUserShotData( GetCurrentScriptDirectory() ~ "UserGraphicShot.dnh" );
+ SetLife( 500 );
+ SetScore( 7777777 );
+ SetTimer( 90 );
+ SetInvincibility( 130 );
+ SetDamageRate( 7, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 36, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, 3 );
+ SEShotHitBoss( seDamage, count );
+ if( !OnBomb ){ Collision( 32, 0 ); }
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ CreateSpellResult( 117 );
+ EndSpell();
+ DropItem( 30, 64 );
+ if( GetPlayerLife() <= 1 ){ DropBomb(); }
+ DropExtend();
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Argv = GetArgument();
+ let PrevLife;
+ task Shot( let angle ){
+ let obj = Obj_Create( OBJ_SHOT );
+ Obj_SetX( obj, GetX() );
+ Obj_SetY( obj, GetY() );
+ Obj_SetSpeed( obj, 3 );
+ Obj_SetAngle( obj, angle );
+ ObjShot_SetDelay( obj, 15 );
+ while( !Obj_BeDeleted( obj ) ){
+ let push = GetKeyState( VK_SLOWMOVE ) == KEY_HOLD || GetKeyState( VK_SLOWMOVE ) == KEY_PUSH;
+ Obj_SetCollisionToPlayer( obj, Argv % 2 == [ 0, 1 ][ push ] );
+ ObjShot_SetGraphic( obj, [ [ RED01, 1 ][ push ], [ 1, BLUE01 ][ push ] ][ Argv % 2 ] );
+ yield;
+ }
+ }
+ task MakeShot(){
+ let start = count + 80;
+ loop{
+ let max = 1664 / GetSpeed();
+ let gap = [ 0, Smooth( 0, 360, ( count - start ) % max, max ) ][ count > start ];
+ let angle = 0;
+ while( angle < 360 ){
+ Shot( angle + gap );
+ angle += 90;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 8 );
+ }
+ }
+ task Behavior(){
+ Wait( 60 );
+ MakeShot();
+ Wait( 80 );
+ loop{
+ SetSpeed( Smooth( 0.9, 3, count, 4000 ) );
+ if( GetX() <= GetClipMinX() && GetY() <= GetClipMinY() ){ SetAngle( 0 ); }
+ if( GetX() >= GetClipMaxX() && GetY() <= GetClipMinY() ){ SetAngle( 90 ); }
+ if( GetX() >= GetClipMaxX() && GetY() >= GetClipMaxY() ){ SetAngle( 180 ); }
+ if( GetX() <= GetClipMinX() && GetY() >= GetClipMaxY() ){ SetAngle( 270 ); }
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 5000 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, "G_RENKO8S", false );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Renko9S.dnh b/th_dnh/script/thA/Renko9S.dnh
new file mode 100644
index 0000000..233e3ec
--- /dev/null
+++ b/th_dnh/script/thA/Renko9S.dnh
@@ -0,0 +1,103 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let PrevTime = GetTimer();
+ let Hide = false;
+ let Phase = 0;
+ let NextPhaseTime = 2800;
+ let ShotSETime = [];
+ task Behavior(){
+ yield;
+ PlaySEEx( sePower1 );
+ Concentration01( 120 );
+ ascent( let i in 0..6000 ){
+ ShotSETime = ShotSETime ~ [ false ];
+ if( i % 50 == 0 ){ yield; }
+ }
+ Explosion01( GetX(), GetY(), 12, 0.5, 16 );
+ PlaySEEx( seKira1 );
+ Hide = true;
+ let pattern = 0;
+ while( Phase == 0 ){
+ SetShotDirectionType( PLAYER );
+ CreateLaserA( 0, GetX(), GetY(), Hypot( GetX() - GetPlayerX(), GetY() - GetPlayerY() ), 16, WHITE05, 60 );
+ SetLaserDataA( 0, 0, 0, 0, 0, 0, 0 );
+ let angle = 0;
+ while( angle < 360 ){
+ ascent( let i in 0..10 ){
+ CreateShotA( 1, 0, 0, i * 3 + 10 );
+ SetShotDataA( 1, 0, Smooth( 1.5, 5, i, 9 ), angle + GetAngleToPlayer(), 0, 0, 5, ORANGE02 );
+ AddShot( NextPhaseTime, 0, 1, 0 );
+ ShotSETime[ count + NextPhaseTime ] = true;
+ }
+ angle += 60;
+ }
+ SetShotKillTime( 0, NextPhaseTime + 50 );
+ FireShot( 0 );
+ PlaySEEx( seLaser1 );
+ SetMovePosition03( GetPlayerX(), GetPlayerY(), 24, 7 );
+ Wait( Max( 150 - pattern * 10, 24 ) );
+ WayShot01( 5, 5, 1.5, PURPLE04, 20 );
+ WayShotGap01( 160, 160, 0.3, YELLOW04, 20, 180 );
+ PlaySEEx( seShot3 );
+ pattern++;
+ }
+ SetMovePosition03( GetCenterX(), GetCenterY(), 24, 2.5 );
+ WaitZeroSpeed();
+ pattern = 0;
+ loop{
+ if( pattern % 5 != 0 ){
+ let speed = 0.8;
+ loop( 2 ){
+ CircleShotGap01( 90, speed, GREEN21, 10, count );
+ CircleShotGap01( 90, speed, PURPLE21, 10, -count );
+ speed += 0.7;
+ }
+ PlaySEEx( seShot2 );
+ }
+ Wait( 7 );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 300 );
+ SetScore( 12800000 );
+ SetTimer( 95 );
+ SetInvincibility( 130 );
+ SetDamageRate( 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetDurableSpellCard();
+ SetCommonData( "ShowName", 9 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 37, imgCutInRenko, 192, 288 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == NextPhaseTime ){ Phase++; }
+ if( count > NextPhaseTime && ShotSETime[ count ] ){
+ PlaySEEx( seShot1 );
+ }
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ if( !Hide && !OnBomb() ){ Collision( 32, 16 ); }
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 118 );
+ EndSpell();
+ DropItem( 36, 64 );
+ }
+ @DrawLoop{
+ if( !Hide ){
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ if( !OnBomb() ){ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count ); }
+ }
+ }
+ @BackGround{ RenkoBG( imgSpellRenko ); }
+}
diff --git a/th_dnh/script/thA/RenkoE.dnh b/th_dnh/script/thA/RenkoE.dnh
new file mode 100644
index 0000000..257e518
--- /dev/null
+++ b/th_dnh/script/thA/RenkoE.dnh
@@ -0,0 +1,249 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ PlaySEEx( seBossExplode );
+ CreateEventFromScript( "Talk" );
+ while( OnEvent() ){ yield; }
+ let angle = 0;
+ while( angle < 360 ){
+ CreateShot02( GetPlayerX(), GetPlayerY(), 0, angle, 0.1, 5, RED03, 30 );
+ angle += 10;
+ }
+ Wait( 5 );
+ PlaySEEx( seShot1 );
+ Wait( 80 );
+ DeleteEnemyShotToItem( ALL );
+ CreateEventFromScript( "Talk2" );
+ while( GetEventStep() != 1 ){ yield; }
+ SetCommonData( "Result", true );
+ let clear = 100000000;
+ let point = GetPoint() * 50000;
+ let graze = GetGraze() * 500;
+ let player = ( GetPlayerLife() - 1 ) * 20000000;
+ let bomb = GetPlayerBomb() * 4000000;
+ let rank = 200;
+ let total = ( clear + point + graze + player + bomb ) * ( rank / 100 );
+ SetCommonData( "ResultClear", clear );
+ SetCommonData( "ResultPoint", point );
+ SetCommonData( "ResultGraze", graze );
+ SetCommonData( "ResultPlayer", player );
+ SetCommonData( "ResultBomb", bomb );
+ SetCommonData( "ResultRank", rank );
+ SetCommonData( "ResultTotal", total );
+ AddScore( total );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetX( -128 );
+ SetY( -128 );
+ LoadSE( seBossExplode );
+ ForbidShot( true );
+ SetCommonData( "ShowName", -1 );
+ Behavior();
+ }
+ @MainLoop{ yield; }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ SetChar( RIGHT, imgCutInRenkoCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Player();
+ TextOut( "\c[BLUE]そういえばもう10勝ね" );
+ Enemy();
+ TextOut( "\c[RED]スペルカード取れても\n取れなくても勝ちってなんかずるい・・・" );
+ Player();
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]ずるいのは私の能力で\n私自身はずるくないわ" );
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]それにあんたみたいな\n駆け出しの弾幕が通じると思って?" );
+ Enemy();
+ TextOut( "\c[RED]・・・えぅぅ" );
+ Player();
+ TextOut( "\c[BLUE]ま、そこいらの雑魚毛玉よりは\nまともな弾吐いてたわね" );
+ Enemy();
+ TextOut( "\c[RED]・・・こうなったら" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ SetChar( RIGHT, imgCutInRenkoCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Player();
+ TextOut( "\c[BLUE]さぁ、もう10枚終わったぜ\nゲームセットだ" );
+ Enemy();
+ TextOut( "\c[RED]やっぱりそうはうまくいかないものね" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]おいおい、こっちはプロだぜ" );
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]弾幕一日入門受けただけのような\nお前が勝てるわけなかろうが" );
+ Enemy();
+ TextOut( "\c[RED]・・・くすん" );
+ Player();
+ TextOut( "\c[BLUE]私なら2枚もありゃお前を完膚なきまでに倒せるぜ" );
+ Enemy();
+ TextOut( "\c[RED]・・・こうなったら" );
+ }
+ End();
+ }
+}
+script_event Talk2{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ SetChar( RIGHT, imgCutInRenkoCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Player();
+ SetChar( LEFT, imgCutInReimu2 );
+ TextOut( "\c[BLUE]ひゃ、何するのよ!\n当たるところだったじゃない!" );
+ Enemy();
+ TextOut( "\c[RED]・・・当てようと思ったのに" );
+ Player();
+ SetChar( LEFT, imgCutInReimu3 );
+ TextOut( "\c[BLUE]あんた今のはずるいわ!もし打ち所が\n悪ければ即効ゲームオーバーじゃない!" );
+ Enemy();
+ TextOut( "\c[RED]あなたの能力のほうが余程ずるいと思う" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]私のは神に仕えて得た能力だから\nずるくないのよ、まぁ神信じてないけど" );
+ Enemy();
+ TextOut( "\c[RED]さっきと言ってることが違う" );
+ Player();
+ SetChar( LEFT, imgCutInReimu3 );
+ TextOut( "\c[BLUE]とにかく、会話中に弾幕は嫌われるわ\nそれが幻想郷での暗黙のルールね" );
+ Enemy();
+ TextOut( "\c[RED]別に人様から嫌われてたほうが\nやりたいことに専念できるし〜" );
+ Player();
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]話聞いてる?" );
+ Enemy();
+ TextOut( "\c[RED]あんまり聞いてない" );
+ Player();
+ SetChar( LEFT, imgCutInReimu5 );
+ TextOut( "\c[BLUE]じゃあ私はさっさと魔方陣壊して帰るわ" );
+ Enemy();
+ TextOut( "\c[RED]そういえばあなた、博麗の紅白さんね" );
+ Player();
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]巫女って言わない辺り偉いわ。後で覚えてなさい" );
+ Enemy();
+ TextOut( "\c[RED]なんか幻想郷の歴史に\n深く関わりがあるらしいわね" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]まぁ確かになんか由緒ありそうだけど" );
+ Enemy();
+ TextOut( "\c[RED]まぁいいわ、じゃあ魔方陣あきらめるから\nあなたについていっていいかしら?" );
+ Player();
+ TextOut( "\c[BLUE]別にいいわよ?\nでも神社っつったって特に何も無いわ" );
+ Enemy();
+ TextOut( "\c[RED]別に物には期待してないわ、\nあなた掃除とか苦手そうだし" );
+ Player();
+ SetChar( LEFT, imgCutInReimu5 );
+ TextOut( "\c[BLUE]どこから分かるのよ" );
+ Enemy();
+ TextOut( "\c[RED]さっきまでのやり取りと勘と\n・・・あと魔方陣に聞いた" );
+ Player();
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]じゃあその個人情報漏洩しまくりな\n魔方陣はさっさと破壊しないとね" );
+ Enemy();
+ TextOut( "\c[RED]その代わりあなたから幻想郷の\n歴史についてみっちりと聞き出すわ" );
+ TextOut( "\c[RED]正直あの魔方陣の価値が余りに\n凄すぎて、卒倒しそうだったし" );
+ Player();
+ TextOut( "\c[BLUE]ふーん、まぁ何でも聞いて良いわよ\n分かる範囲で答えたげるわ" );
+ Enemy();
+ TextOut( "\c[RED]うん、じゃあ・・・まず博麗神社は\nどういう経緯で建てられたのかしら?" );
+ Player();
+ TextOut( "\c[BLUE]知らないわ" );
+ Enemy();
+ TextOut( "\c[RED]・・・・・・" );
+ Player();
+ SetChar( LEFT, imgCutInReimu5 );
+ TextOut( "\c[BLUE]だから、「分かる範囲」で\n答えたげるって言ったじゃない" );
+ Enemy();
+ TextOut( "\c[RED]・・・ねぇ、もう一回弾幕勝負しない?" );
+ SetStep( 1 );
+ Player();
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]やっぱあんたずるい!" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ SetChar( RIGHT, imgCutInRenkoCry );
+ SetGraphicRect( RIGHT, 1, 1, 192, 288 );
+ Player();
+ SetChar( LEFT, imgCutInMarisa2 );
+ TextOut( "\c[BLUE]うぉ何するんだよ!" );
+ Enemy();
+ TextOut( "\c[RED]・・・ちっ" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa3 );
+ TextOut( "\c[BLUE]今のは明らかに酷いぜ、ルール違反だ!" );
+ Enemy();
+ TextOut( "\c[RED]弾幕にルールも何もあるの?" );
+ Player();
+ TextOut( "\c[BLUE]今作った!" );
+ Enemy();
+ TextOut( "\c[RED]その「今作った」の方が\nルール違反丸出しよ" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa4 );
+ TextOut( "\c[BLUE]お前・・・そのうち嫌われるぜ" );
+ Enemy();
+ TextOut( "\c[RED]大丈夫よ、人様から嫌われてた方が\nやりたいことに専念できるし" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]とにかく、会話中は弾幕しないのが\n暗黙の了解だ、いいか?" );
+ SetChar( LEFT, imgCutInMarisa3 );
+ TextOut( "\c[BLUE]次やったら\n変人と同じくらい酷い目にあわすぜ" );
+ Enemy();
+ TextOut( "\c[RED]もうあったじゃない" );
+ Player();
+ TextOut( "\c[BLUE]あぁもうなんだっていいよ\nさっさと魔方陣壊して帰る!" );
+ SetChar( LEFT, imgCutInMarisa3 );
+ TextOut( "\c[BLUE]お前とは仲良くやれないぜ!" );
+ Enemy();
+ TextOut( "\c[RED]あ、そういえば" );
+ Player();
+ TextOut( "\c[BLUE]なんだよ!" );
+ Enemy();
+ TextOut( "\c[RED]魔方陣を破壊すると\n今までの蓄えられた歴史の情報が" );
+ TextOut( "\c[RED]全て解き放たれて\nそこいらじゅうにばら撒かれるんだけど" );
+ Player();
+ TextOut( "\c[BLUE]それがどうした!" );
+ Enemy();
+ TextOut( "\c[RED]あなたのことも\n例外なく全部ばら撒かれるわよ" );
+ TextOut( "\c[RED]例えばこの前の××××したとことか\n夜な夜な△△△△△してることとか" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa4 );
+ TextOut( "\c[BLUE]ッ!・・・なんでそれを知ってるんだよ" );
+ Enemy();
+ TextOut( "\c[RED]魔方陣から聞いた" );
+ Player();
+ TextOut( "\c[BLUE]・・・・・・" );
+ Enemy();
+ TextOut( "\c[RED]他にもあるわ、そうね・・・昨日あなたが\n完成させた符の名前とか・・・(クスッ)" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa3 );
+ TextOut( "\c[BLUE]・・・もう好きにしろよ!私は帰るぜ!" );
+ Enemy();
+ TextOut( "\c[RED]あらあなた、弾幕ごっこ以外は\nそんな言うほど大したこと無いのね" );
+ SetStep( 1 );
+ Player();
+ SetChar( LEFT, imgCutInMarisa4 );
+ TextOut( "\c[BLUE]あーっ!今日はもう最悪だあっ!!" );
+ }
+ AllBack();
+ Wait( 5 );
+ StageClear();
+ }
+}
diff --git a/th_dnh/script/thA/Renko_.dnh b/th_dnh/script/thA/Renko_.dnh
new file mode 100644
index 0000000..25a0344
--- /dev/null
+++ b/th_dnh/script/thA/Renko_.dnh
@@ -0,0 +1,26 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ Wait( 180 );
+ AddLife( -1 );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetInvincibility( 120 );
+ SetDamageRate( 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleBig, count, 256 );
+ DrawBossChr( imgEnemyRenko, 1, 1, 43, 72, count );
+ }
+}
diff --git a/th_dnh/script/thA/SE/Hidden.wav b/th_dnh/script/thA/SE/Hidden.wav
new file mode 100644
index 0000000..ad3ec2b
--- /dev/null
+++ b/th_dnh/script/thA/SE/Hidden.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6cc45fbb2a0cf856221355de82ab5d3fab0381c668cddcf8dd062dd9066dc148
+size 26504
diff --git a/th_dnh/script/thA/SE/Shadow.wav b/th_dnh/script/thA/SE/Shadow.wav
new file mode 100644
index 0000000..a030b22
--- /dev/null
+++ b/th_dnh/script/thA/SE/Shadow.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:d2ad607ad93f469a964c69cc6592ac48b8ac6f11a5667463a34cc7a50334e182
+size 176684
diff --git a/th_dnh/script/thA/SE/Sudden.wav b/th_dnh/script/thA/SE/Sudden.wav
new file mode 100644
index 0000000..0c841ed
--- /dev/null
+++ b/th_dnh/script/thA/SE/Sudden.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:f6577368cfd9c8fa4b6ea8e7d5f820f281e056b63ddcab4d0b34d3b079ba08c1
+size 26504
diff --git a/th_dnh/script/thA/SE/cancel00.wav b/th_dnh/script/thA/SE/cancel00.wav
new file mode 100644
index 0000000..360d44b
--- /dev/null
+++ b/th_dnh/script/thA/SE/cancel00.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:ac15f457189b4fd0a0c9bd1715012e2c95cb3a36c016b2296f3cffb5d2619159
+size 300004
diff --git a/th_dnh/script/thA/SE/damage00.wav b/th_dnh/script/thA/SE/damage00.wav
new file mode 100644
index 0000000..976d489
--- /dev/null
+++ b/th_dnh/script/thA/SE/damage00.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:56ab3a9519666a08f76f1ad26863fcb03fd558d38260ae3cc8b49519cb370e52
+size 17272
diff --git a/th_dnh/script/thA/SE/enep01.wav b/th_dnh/script/thA/SE/enep01.wav
new file mode 100644
index 0000000..c1c0cae
--- /dev/null
+++ b/th_dnh/script/thA/SE/enep01.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:6054e82315c97689e9279bbae4a25311e990cfcec8b8908dccbdfcc36d3da87d
+size 831532
diff --git a/th_dnh/script/thA/SE/index.dnh b/th_dnh/script/thA/SE/index.dnh
new file mode 100644
index 0000000..74f2554
--- /dev/null
+++ b/th_dnh/script/thA/SE/index.dnh
@@ -0,0 +1,19 @@
+let seCancel = GetCurrentScriptDirectory() ~ "SE\cancel00.wav";
+let seDamage = GetCurrentScriptDirectory() ~ "SE\damage00.wav";
+let seBossExplode = GetCurrentScriptDirectory() ~ "SE\enep01.wav";
+let seHidden = GetCurrentScriptDirectory() ~ "SE\Hidden.wav";
+let seKira1 = GetCurrentScriptDirectory() ~ "SE\kira00.wav";
+let seKira2 = GetCurrentScriptDirectory() ~ "SE\kira01.wav";
+let seKira3 = GetCurrentScriptDirectory() ~ "SE\kira02.wav";
+let seLaser1 = GetCurrentScriptDirectory() ~ "SE\lazer00.wav";
+let seLaser2 = GetCurrentScriptDirectory() ~ "SE\lazer00.wav";
+let seOk = GetCurrentScriptDirectory() ~ "SE\ok00.wav";
+let sePower1 = GetCurrentScriptDirectory() ~ "SE\power0.wav";
+let sePower2 = GetCurrentScriptDirectory() ~ "SE\power0.wav";
+let seSelect = GetCurrentScriptDirectory() ~ "SE\select00.wav";
+let seShadow = GetCurrentScriptDirectory() ~ "SE\Shadow.wav";
+let seShot1 = GetCurrentScriptDirectory() ~ "SE\tan00.wav";
+let seShot2 = GetCurrentScriptDirectory() ~ "SE\tan01.wav";
+let seShot3 = GetCurrentScriptDirectory() ~ "SE\tan02.wav";
+let seSudden = GetCurrentScriptDirectory() ~ "SE\Sudden.wav";
+let seTimeOut = GetCurrentScriptDirectory() ~ "SE\timeout.wav";
diff --git a/th_dnh/script/thA/SE/kira00.wav b/th_dnh/script/thA/SE/kira00.wav
new file mode 100644
index 0000000..667878d
--- /dev/null
+++ b/th_dnh/script/thA/SE/kira00.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:2b5d2c26685de146b68e84e935da4bb7143132f51a3dcdfb1f836c282ca6feee
+size 280026
diff --git a/th_dnh/script/thA/SE/kira01.wav b/th_dnh/script/thA/SE/kira01.wav
new file mode 100644
index 0000000..b9a3c7c
--- /dev/null
+++ b/th_dnh/script/thA/SE/kira01.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:0a819d5e8a4b204ae02f2e955a5be761f22fd8dcee5aad360856c98518310543
+size 352844
diff --git a/th_dnh/script/thA/SE/kira02.wav b/th_dnh/script/thA/SE/kira02.wav
new file mode 100644
index 0000000..f6ceb86
--- /dev/null
+++ b/th_dnh/script/thA/SE/kira02.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:4cf6ee9a334c265bb483a91728e761485b9ac233945c101916610bb6de94a239
+size 18634
diff --git a/th_dnh/script/thA/SE/lazer00.wav b/th_dnh/script/thA/SE/lazer00.wav
new file mode 100644
index 0000000..4cc29e9
--- /dev/null
+++ b/th_dnh/script/thA/SE/lazer00.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:547310d505de782ccb6bd74c031010b00e938aba03197786c44bb24baff49c91
+size 24140
diff --git a/th_dnh/script/thA/SE/ok00.wav b/th_dnh/script/thA/SE/ok00.wav
new file mode 100644
index 0000000..de14030
--- /dev/null
+++ b/th_dnh/script/thA/SE/ok00.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:a6d623b9bb36eb6a60388db7b4ea627eedc6274e244569c5d3cd81f83330d3db
+size 297848
diff --git a/th_dnh/script/thA/SE/power0.wav b/th_dnh/script/thA/SE/power0.wav
new file mode 100644
index 0000000..9584638
--- /dev/null
+++ b/th_dnh/script/thA/SE/power0.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e72767799456a02426cfb4931c362622533f8b8aa2d77459053f93bb8ef609a9
+size 882044
diff --git a/th_dnh/script/thA/SE/select00.wav b/th_dnh/script/thA/SE/select00.wav
new file mode 100644
index 0000000..aad7162
--- /dev/null
+++ b/th_dnh/script/thA/SE/select00.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:7b68f2e5f062b1d315a71fc8ea0594dd8f6287074d43efc77b809ad1fd72eead
+size 300152
diff --git a/th_dnh/script/thA/SE/tan00.wav b/th_dnh/script/thA/SE/tan00.wav
new file mode 100644
index 0000000..13d6ee5
--- /dev/null
+++ b/th_dnh/script/thA/SE/tan00.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:85d79d59c69aa1c10197526707a931477df6d79b1cf15b0cff624629d30acaef
+size 29486
diff --git a/th_dnh/script/thA/SE/tan01.wav b/th_dnh/script/thA/SE/tan01.wav
new file mode 100644
index 0000000..dd77baf
--- /dev/null
+++ b/th_dnh/script/thA/SE/tan01.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:533fdf5d4073bc93e34902ad6a5a86ab6d63edc40dfee779c1d2e7f1bd3f669e
+size 29486
diff --git a/th_dnh/script/thA/SE/tan02.wav b/th_dnh/script/thA/SE/tan02.wav
new file mode 100644
index 0000000..e036a9c
--- /dev/null
+++ b/th_dnh/script/thA/SE/tan02.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e3021ca6f479534e5bfd53fa5031f2bf30dc04ff210c1a14a96dfe80b42cb9ec
+size 14776
diff --git a/th_dnh/script/thA/SE/timeout.wav b/th_dnh/script/thA/SE/timeout.wav
new file mode 100644
index 0000000..0418c6a
--- /dev/null
+++ b/th_dnh/script/thA/SE/timeout.wav
@@ -0,0 +1,3 @@
+version https://git-lfs.github.com/spec/v1
+oid sha256:e368ea4dff410fc66eaa280129ebd8f2149a8a8d1ee76737074e53457c75fafd
+size 324140
diff --git a/th_dnh/script/thA/STAGE/1.dnh b/th_dnh/script/thA/STAGE/1.dnh
new file mode 100644
index 0000000..1e6bd96
--- /dev/null
+++ b/th_dnh/script/thA/STAGE/1.dnh
@@ -0,0 +1,204 @@
+function GetStage1BGLoadList(){ return [ imgMapGround, imgMapTree ]; }
+function GetStage1AliceLoadList(){ return [ imgEnemyAlice, imgCutInAlice, imgNameAlice, imgSpellAlice, imgSpellBigCircle ]; }
+task Stage1(){
+ MuteMusic();
+ let loadgraphiclist = [ imgEnemyDaiyosei, imgStage[ 0 ] ];
+ loadgraphiclist = loadgraphiclist ~ GetStage1BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage1AliceLoadList();
+ Stage1LoopInit();
+ StageLoad( DefaultStageLoadGraphicList ~ loadgraphiclist, DefaultStageLoadSEList, [ _enemyBlur, enemyYosei01, enemyYosei02, enemyYosei03, enemyKedama01, bossAliceE ] );
+ ForbidBomb( false );
+ ForbidShot( false );
+ SetCommonData( "Stage", 0 );
+ SetCommonData( "BGStep", 0 );
+ PlayMusicEx( 2 );
+ MusicRelease[ 2 ] = true;
+ StageRelease[ 0 ] = true;
+ CreateSaveData();
+ SaveEx();
+ Wait( 130 );
+ SetCommonData( "StageTitle", true );
+ Wait( 360 );
+ SetCommonData( "StageTitle", false );
+ Wait( 300 );
+ local{
+ loop( 2 ){
+ ascent( let i in 0..2 ){
+ ascent( let argv in 0..8 ){
+ CreateEnemyFromFile( enemyYosei01, GetCenterX() + GetCommonData( "NowCount" ) * [ -2, 2 ][ i ] % 192, 0, 0, 0, argv );
+ Wait( 18 );
+ }
+ Wait( 30 );
+ }
+ Wait( 20 );
+ }
+ }
+ Wait( 260 );
+ local{ ascent( let i in 0..2 ){ CreateEnemyFromFile( enemyYosei02, GetCenterX() + 96 * [ -1, 1 ][ i ], 0, 0, 0, 0 ); } }
+ Wait( 180 );
+ local{
+ ascent( let i in 0..4 ){
+ let dir = 1;
+ loop( 2 ){
+ CreateEnemyFromFile( enemyYosei03, GetCenterX() + Smooth( 32, 160, i, 4 ) * dir, 0, 0, 0, 0 );
+ dir = -dir;
+ }
+ Wait( 60 );
+ }
+ }
+ local{
+ ascent( let i in 0..30 ){
+ CreateEnemyFromFile( enemyKedama01, GetCenterX() + 192 * [ 1, -1 ][ i % 2 ], GetCommonData( "NowCount" ) * 11 % ( GetCenterY() - 96 ), 0, 0, i );
+ Wait( 12 );
+ }
+ }
+ SetCommonData( "BGStep", 1 );
+ Wait( 100 );
+ local{
+ loop( 2 ){
+ ascent( let i in 0..2 ){
+ ascent( let argv in 0..10 ){
+ CreateEnemyFromFile( enemyYosei01, GetCenterX() + GetCommonData( "NowCount" ) * [ -2, 2 ][ i ] % 192, 0, 0, 0, argv );
+ Wait( 12 );
+ }
+ Wait( 20 );
+ }
+ Wait( 30 );
+ }
+ }
+ Wait( 200 );
+ ascent( let i in 0..4 ){ CreateEnemyFromFile( enemyYosei02, GetCenterX() + 64 * trunc( i / 2 + 1 ) * [ -1, 1 ][ i % 2 ], 0, 0, 0, 0 ); }
+ Wait( 360 );
+ let bossstart = GetCommonData( "NowCount" );
+ CreateEnemyBossFromFile( bossDaiyosei, GetCenterX(), GetClipMinY() + 96, 0, 0, 0 );
+ SetCommonData( "BGStep", 2 );
+ WaitZeroEnemy();
+ while( GetCommonData( "NowCount" ) < bossstart + 1900 ){
+ Wait( 80 );
+ CreateEnemyFromFile( enemyYosei03, GetCenterX() - 96 + sin( GetCommonData( "NowCount" ) ) * 80, 0, 0, 0, 0 );
+ CreateEnemyFromFile( enemyYosei03, GetCenterX() + 96 - sin( GetCommonData( "NowCount" ) ) * 80, 0, 0, 0, 0 );
+ }
+ Wait( 300 );
+ local{
+ loop( 2 ){
+ ascent( let i in 0..2 ){
+ ascent( let argv in 0..8 ){
+ CreateEnemyFromFile( enemyYosei01, GetCenterX() + GetCommonData( "NowCount" ) * [ -2, 2 ][ i ] % 192, 0, 0, 0, argv );
+ Wait( 15 );
+ }
+ Wait( 30 );
+ }
+ Wait( 20 );
+ }
+ }
+ SetCommonData( "BGStep", 3 );
+ Wait( 240 );
+ MusicRelease[ 3 ] = true;
+ CreateSaveData();
+ SaveEx();
+ CreateEnemyBossFromFile( bossAlice, 0, -128, 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SetCommonData( "ShowName", -1 );
+ CreateEnemyFromFile( bossAliceE, -128, -128, 0, 0, 0 );
+ ForbidBomb( true );
+ WaitZeroEnemy();
+ StageHighScore[ 0 ] = GetCommonDataDefault( "ResultTotal", 0 );
+ CreateSaveData();
+ SaveEx();
+ if( GetCommonDataDefault( "Practice", false ) ){
+ CreateSaveData();
+ SaveEx();
+ Clear();
+ return;
+ }
+ DeleteGraphicList( loadgraphiclist, [] );
+ ClearByteCodeCash();
+ Stage2();
+}
+
+function Stage1LoopInit(){
+ SetCommonData( "PrevBG", [ 0, 0 ] );
+ SetCommonData( "BGViewTo", [ 0, 0, 0 ] );
+}
+
+function Stage1Loop( let count ){
+ function Plant( let gap_z, let z ){
+ let step = GetCommonDataDefault( "BGStep", 0 );
+ let dir = -1;
+ loop( 2 ){
+ AddBGEffect( rand( [ 210, 200 ][ step == 0 ], 280 ) * dir, rand( 3, 10 ), gap_z + z + RandBlur( [ 80, 48 ][ step == 0 ] ), 0, 0, 0, -65535, 0 );
+ AddBGEffect( rand( [ 120, 50 ][ step == 0 ], [ 170, 150 ][ step == 0 ] ) * dir, rand( 1, 6 ), gap_z + z + RandBlur( [ 80, 48 ][ step == 0 ] ), 0, 0, 0, -65535, 0 );
+ dir = -dir;
+ }
+ }
+ let speed = [ 0.7, 1, 0.35, 2, 0.15 ];
+ let step = GetCommonDataDefault( "BGStep", 0 );
+ let prev = GetCommonData( "PrevBG" );
+ let to = GetCommonData( "BGViewTo" );
+ if( step != prev[ 0 ] ){
+ prev = [ step, count ];
+ SetCommonData( "PrevBG", prev );
+ }
+ let bgphasecount = count - prev[ 1 ];
+ to[ 2 ] = to[ 2 ] - Smooth( speed[ Max( step - 1, 0 ) ], speed[ step ], bgphasecount, 300 );
+ SetCommonData( "BGViewFrom", [ SlowDown( 800, 555, 0 - to[ 2 ], 500 ), 90, SlowDown( 78, 36.5, 0 - to[ 2 ], 1000 ) ] );
+ SetCommonData( "BGViewTo", to );
+ if( count == 0 ){
+ let z = -1000;
+ loop( 11 ){
+ Plant( z, to[ 2 ] );
+ z += 128;
+ }
+ }
+ if( to[ 2 ] < GetCommonDataDefault( "Stage1LastPlant", 0 ) - [ 288, 256, 240, 224, 256 ][ step ] ){
+ Plant( -1000, to[ 2 ] );
+ SetCommonData( "Stage1LastPlant", to[ 2 ] );
+ }
+ let i = 0;
+ while( i < length( BGEffectX ) ){
+ if( BGEffectZ[ i ] > 512 + to[ 2 ] ){
+ BGEffectX = erase( BGEffectX, i );
+ BGEffectY = erase( BGEffectY, i );
+ BGEffectZ = erase( BGEffectZ, i );
+ BGEffectLife = erase( BGEffectLife, i );
+ BGEffectParam = erase( BGEffectParam, i );
+ BGEffectVectorX = erase( BGEffectVectorX, i );
+ BGEffectVectorY = erase( BGEffectVectorY, i );
+ BGEffectVectorZ = erase( BGEffectVectorZ, i );
+ }
+ else{ i++; }
+ }
+}
+
+function Stage1BG( let count ){
+ let from = GetCommonData( "BGViewFrom" );
+ let to = GetCommonData( "BGViewTo" );
+ SetFog( Smooth( 0, 200, count, 600 ), Smooth( 100, 800, count, 500 ), 0, 0, Smooth( 0, 80, count, 500 ) );
+ SetViewFrom( from[ 0 ], from[ 1 ], from[ 2 ] );
+ SetViewTo( to[ 0 ], to[ 1 ], to[ 2 ] );
+ SetPerspectiveClip( 10, 2000 );
+ SetTexture( imgMapGround );
+ SetGraphicRect( 0, 0, 512, 512 );
+ SetGraphicAngle( 90, 0, 0 );
+ SetGraphicScale( 2, 1 );
+ let z = truncEx( to[ 2 ], 512 ) - 1536;
+ loop( [ 4, 5 ][ count < 300 ] ){
+ DrawGraphic3D( 0, 0, z );
+ z += 512;
+ }
+ SetTexture( imgMapTree );
+ SetGraphicRect( 0, 0, 128, 128 );
+ SetGraphicAngle( Smooth( -80, -50, 0 - to[ 2 ], 1000 ), 0, 0 );
+ ascent( let i in 0..length( BGEffectX ) ){
+ ascent( let y in 0..3 ){
+ SetAlpha( Smooth( 128, 224, y, 3 ) );
+ let ex = Smooth( 1, 0.25, y, 3 );
+ SetGraphicScale( ex, ex );
+ DrawGraphic3D( BGEffectX[ i ] + BGEffectY[ i ] * y * GetDir( BGEffectX[ i ] ), 65 + y * 40, BGEffectZ[ i ] );
+ }
+ }
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ SetGraphicAngle( 0, 0, 0 );
+}
diff --git a/th_dnh/script/thA/STAGE/2.dnh b/th_dnh/script/thA/STAGE/2.dnh
new file mode 100644
index 0000000..cbae853
--- /dev/null
+++ b/th_dnh/script/thA/STAGE/2.dnh
@@ -0,0 +1,163 @@
+function GetStage2BGLoadList(){ return [ imgMapSky, imgMapWater1, imgMapWater2 ]; }
+function GetStage2SakuyaLoadList(){ return [ imgCutInSakuya, imgNameSakuya, imgEnemySakuya, imgSpellRotateStone, imgSpellBlood ]; }
+task Stage2(){
+ MuteMusic();
+ let loadgraphiclist = [ imgEnemyChina, imgStage[ 1 ] ];
+ loadgraphiclist = loadgraphiclist ~ GetStage2BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage2SakuyaLoadList();
+ let loadenemylist = [ _enemyBlur, enemyYosei04, enemyYosei05, enemyYosei06, enemyYosei07, enemyYosei08, enemyKedama01, bossSakuyaE ];
+ if( GetCommonDataDefault( "Practice", false ) ){ StageLoad( DefaultStageLoadGraphicList ~ loadgraphiclist, DefaultStageLoadSEList, loadenemylist ); }
+ else{ StageLoad( loadgraphiclist, [], loadenemylist ); }
+ Ready( seOk );
+ Stage2LoopInit();
+ ForbidBomb( false );
+ ForbidShot( false );
+ SetCommonData( "Stage", 1 );
+ SetCommonData( "BGStep", 0 );
+ PlayMusicEx( 4 );
+ MusicRelease[ 4 ] = true;
+ StageRelease[ 1 ] = true;
+ CreateSaveData();
+ SaveEx();
+ SetCommonData( "Result", false );
+ Wait( 130 );
+ SetCommonData( "StageTitle", true );
+ Wait( 360 );
+ SetCommonData( "StageTitle", false );
+ Wait( 180 );
+ CreateEnemyFromFile( enemyYosei04, GetClipMinX() + 32, 0, 0, 0, 0 );
+ Wait( 180 );
+ local{
+ ascent( let i in 0..36 ){
+ CreateEnemyFromFile( [ enemyYosei05, enemyYosei06, enemyYosei05, enemyYosei07, enemyYosei06 ][ i % 5 ], GetClipMinX() + ( i * 119 ) % 384, 0, 0, 0, i );
+ Wait( 20 );
+ }
+ }
+ local{
+ ascent( let i in 0..4 ){
+ Wait( 100 );
+ CreateEnemyFromFile( enemyYosei08, GetClipMinX() + 48 + i * 96, 0, 0, 0, 0 );
+ }
+ }
+ let dir = 1;
+ local{
+ loop( 2 ){
+ Wait( 50 );
+ CreateEnemyFromFile( enemyYosei08, GetCenterX() + 64 * dir, 0, 0, 0, 0 );
+ dir = -dir;
+ }
+ }
+ Wait( 150 );
+ local{ ascent( let i in 0..4 ){ CreateEnemyFromFile( enemyYosei08, GetClipMinX() + 48 + i * 96, 0, 0, 0, 0 ); } }
+ SetCommonData( "BGStep", 1 );
+ Wait( 300 );
+ local{
+ ascent( let i in 0..4 ){
+ Wait( 133 );
+ CreateEnemyFromFile( enemyYosei04, GetClipMinX() + [ 32, 64, 320, 288 ][ i ], 0, 0, 0, 0 );
+ }
+ }
+ Wait( 80 );
+ CreateEnemyFromFile( enemyYosei04, GetCenterX(), 0, 0, 0, 0 );
+ Wait( 180 );
+ local{
+ ascent( let i in 0..12 ){
+ CreateEnemyFromFile( [ enemyYosei04, enemyYosei04, enemyYosei08 ][ i % 3 ], GetCenterX() + ( ( i * 119 ) % 80 + 96 ) * [ 1, -1 ][ i % 2 ], 0, 0, 0, i );
+ Wait( [ 60, 35 ][ i > 5 ] );
+ }
+ }
+ Wait( 300 );
+ let bossstart = GetCommonData( "NowCount" );
+ CreateEnemyBossFromFile( bossChina, -128, GetClipMinY() + 96, 0, 0, 0 );
+ WaitZeroEnemy();
+ Wait( 100 );
+ local{
+ let num = 0;
+ while( GetCommonData( "NowCount" ) < bossstart + 1500 ){
+ loop( 5 ){
+ CreateEnemyFromFile( enemyKedama01, GetCenterX() + 192 * [ 1, -1 ][ num % 2 ], GetCommonData( "NowCount" ) * 11 % ( GetCenterY() - 96 ), 0, 0, num );
+ num++;
+ Wait( 10 );
+ }
+ CreateEnemyFromFile( [ enemyYosei05, enemyYosei06, enemyYosei05, enemyYosei07, enemyYosei06 ][ num / 5 % 5 ], GetClipMinX() + ( num * 119 ) % 384, 0, 0, 0, num );
+ }
+ }
+ Wait( 100 );
+ local{
+ let num = 0;
+ while( GetCommonData( "NowCount" ) < bossstart + 2160 || num <= 8 ){
+ CreateEnemyFromFile( [ enemyYosei04, enemyYosei04, enemyYosei08 ][ num % 3 ], GetCenterX() + ( ( num * 119 ) % 80 + 96 ) * [ 1, -1 ][ num % 2 ], 0, 0, 0, num );
+ Wait( [ 60, 45 ][ num > 5 ] );
+ num++;
+ }
+ }
+ Wait( 300 );
+ MusicRelease[ 5 ] = true;
+ CreateSaveData();
+ SaveEx();
+ SetCommonData( "BGStep", 2 );
+ CreateEnemyBossFromFile( bossSakuya, -128, GetCenterY(), 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SetCommonData( "ShowName", -1 );
+ CreateEnemyFromFile( bossSakuyaE, -128, -128, 0, 0, 0 );
+ ForbidBomb( true );
+ WaitZeroEnemy();
+ StageHighScore[ 1 ] = GetCommonDataDefault( "ResultTotal", 0 );
+ CreateSaveData();
+ SaveEx();
+ if( GetCommonDataDefault( "Practice", false ) ){
+ Clear();
+ return;
+ }
+ DeleteGraphicList( loadgraphiclist, [] );
+ ClearByteCodeCash();
+ Stage3();
+}
+function Stage2LoopInit(){
+ ClearBGEffect();
+ SetCommonData( "PrevBG", [ 0, 0 ] );
+ SetCommonData( "BGViewTo", [ 0, 50, 0 ] );
+}
+function Stage2Loop( let count ){
+ let speed = [ 0.5, 2.2, 0.25 ];
+ let step = GetCommonDataDefault( "BGStep", 0 );
+ let prev = GetCommonData( "PrevBG" );
+ let to = GetCommonData( "BGViewTo" );
+ if( step != prev[ 0 ] ){
+ prev = [ step, count ];
+ SetCommonData( "PrevBG", prev );
+ }
+ let bgphasecount = count - prev[ 1 ];
+ SetCommonData( "Stage2Bank", SplineFakeSFS( 0, -20, count - 2500, 2000 ) );
+ SetCommonData( "Stage2Angle", SplineFakeSFS( 18, 24, count - 2500, 2000 ) );
+ to[ 2 ] = to[ 2 ] - Smooth( speed[ Max( step - 1, 0 ) ], speed[ step ], bgphasecount, 600 );
+ SetCommonData( "BGViewTo", to );
+}
+function Stage2BG( let count ){
+ let to = GetCommonData( "BGViewTo" );
+ if( count < 2400 ){ SetFog( Smooth( 0, 266, count, 1000 ), Smooth( 100, 500, count, 1000 ), Smooth( 255, 240, count, 1000 ), 255, 255 ); }
+ else{ SetFog( Smooth( 266, 900, count - 2500, 300 ), Smooth( 500, 1800, count - 2500, 300 ), 240, Smooth( 255, 240, count - 2500, 300 ), 255 ); }
+ SetViewFrom( 400, 90, GetCommonDataDefault( "Stage2Angle", 18 ) );
+ SetViewTo( to[ 0 ], to[ 1 ], to[ 2 ] );
+ SetPerspectiveClip( 10, 2000 );
+ SetTexture( imgMapSky );
+ SetGraphicAngle( 180, 0, 0 );
+ SetGraphicRect( 1, 1, 384, 256 );
+ SetGraphicScale( 3.3, 1.5 );
+ DrawGraphic3D( 0, 180, to[ 2 ] - 1300 );
+ SetGraphicScale( 3, 1 );
+ SetGraphicAngle( 90, GetCommonDataDefault( "Stage2Bank", 0 ), 0 );
+ SetTexture( imgMapWater1 );
+ SetGraphicRect( 0, 0, 512, 512 );
+ let z = truncEx( to[ 2 ], 512 ) - 2048;
+ loop( 5 ){
+ ascent( let i in 0..2 ){
+ SetAlpha( [ 255, 96 ][ i ] );
+ DrawGraphic3D( 0, i * 30, z );
+ }
+ z += 512;
+ }
+ SetGraphicScale( 1, 1 );
+ SetGraphicAngle( 0, 0, 0 );
+}
diff --git a/th_dnh/script/thA/STAGE/3.dnh b/th_dnh/script/thA/STAGE/3.dnh
new file mode 100644
index 0000000..82b3bb9
--- /dev/null
+++ b/th_dnh/script/thA/STAGE/3.dnh
@@ -0,0 +1,235 @@
+function GetStage3BGLoadList(){ return [ imgMapSnowField, imgMapSnowTree, imgMapGround, imgMapSnow ]; }
+function GetStage3LettyLoadList(){ return [ imgCutInLetty, imgEnemyLetty, imgSpellIceWall ]; }
+function GetStage3LilyLoadList(){ return [ imgCutInLily, imgCutInLilyCry, imgNameLily, imgEnemyLily, imgSpellBamboo ]; }
+task Stage3(){
+ MuteMusic();
+ let loadgraphiclist = [ imgStage[ 2 ] ];
+ loadgraphiclist = loadgraphiclist ~ GetStage3BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage3LettyLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage3LilyLoadList();
+ let loadenemylist = [ _enemyBlur, enemyYosei15, enemyYosei16, enemyYosei17, enemyYosei18, enemyYosei19, enemyKedama06, bossLilyE ];
+ if( GetCommonDataDefault( "Practice", false ) ){ StageLoad( DefaultStageLoadGraphicList ~ loadgraphiclist, DefaultStageLoadSEList, loadenemylist ); }
+ else{ StageLoad( loadgraphiclist, [], loadenemylist ); }
+ Ready( seOk );
+ ForbidBomb( false );
+ ForbidShot( false );
+ Stage3LoopInit();
+ SetCommonData( "Result", false );
+ SetCommonData( "Stage", 2 );
+ SetCommonData( "BGStep", 0 );
+ PlayMusicEx( 6 );
+ MusicRelease[ 6 ] = true;
+ StageRelease[ 2 ] = true;
+ CreateSaveData();
+ SaveEx();
+ Wait( 130 );
+ SetCommonData( "StageTitle", true );
+ Wait( 360 );
+ SetCommonData( "StageTitle", false );
+ Wait( 150 );
+ YoseiSlide( 2, enemyYosei15 );
+ Wait( 130 );
+ KedamaRush( 500, 20, 2, 45 );
+ Wait( 300 );
+ YoseiLineRush( 300 );
+ Wait( 400 );
+ YoseiSlide( 1, enemyYosei16 );
+ Wait( 400 );
+ YoseiDual( 800 );
+ Wait( 240 );
+ KedamaRush( 500, 10, 3.6, 30 );
+ Wait( 660 );
+ CreateEnemyBossFromFile( bossLetty, GetCenterX(), GetClipMinY() - 64, 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SaveEx();
+ KedamaRush( 1000, 40, 2, 45 );
+ Wait( 100 );
+ YoseiBasic();
+ Wait( 500 );
+ YoseiDual( 500 );
+ Wait( 500 );
+ local{
+ let x = GetClipMinX() + 16;
+ while( x < GetClipMaxX() - 16 ){
+ CreateEnemyFromFile( enemyYosei17, x, 0, 0, 0, 0 );
+ x += 64;
+ }
+ }
+ WaitZeroEnemy();
+ SetCommonData( "BGStep", 1 );
+ Wait( 150 );
+ MusicRelease[ 7 ] = true;
+ CreateSaveData();
+ SaveEx();
+ CreateEnemyBossFromFile( bossLily, GetCenterX(), GetClipMinY() - 64, 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SetCommonData( "ShowName", -1 );
+ CreateEnemyFromFile( bossLilyE, -128, -128, 0, 0, 0 );
+ ForbidBomb( true );
+ WaitZeroEnemy();
+ StageHighScore[ 2 ] = GetCommonDataDefault( "ResultTotal", 0 );
+ CreateSaveData();
+ SaveEx();
+ if( GetCommonDataDefault( "Practice", false ) ){
+ Clear();
+ return;
+ }
+ DeleteGraphicList( loadgraphiclist, [] );
+ ClearByteCodeCash();
+ Stage4();
+ task YoseiSlide( let l, let file ){
+ let dir = -1;
+ loop( l ){
+ loop( 2 ){
+ ascent( let i in 0..5 ){
+ CreateEnemyFromFile( file, GetCenterX() + 192 * dir, GetClipMinY() + 32 + ( 5 - i ) * 24, 0, 0, ( 5 - i ) * 64 + i % 2 );
+ Wait( 8 );
+ }
+ Wait( 120 );
+ dir = -dir;
+ }
+ Wait( 120 );
+ }
+ }
+ task YoseiLine( let x, let dir ){
+ let xx = -48 * dir;
+ loop( 3 ){
+ CreateEnemyFromFile( enemyYosei17, x + xx, 0, 0, 0, 0 );
+ Wait( 5 );
+ xx += 48 * dir;
+ }
+ }
+ task YoseiLineRush( let time ){
+ ascent( let i in 0..trunc( time / 100 ) ){
+ YoseiLine( GetCenterX() + sin( GetCommonData( "NowCount" ) * 1.5 ) * 128, [ 1, -1 ][ i % 2 ] );
+ Wait( [ 70, 30 ][ i % 2 ] );
+ }
+ }
+ task YoseiDual( let time ){
+ ascent( let i in 0..trunc( time / 100 ) ){
+ let dir = -1;
+ loop( 2 ){
+ CreateEnemyFromFile( enemyYosei18, GetCenterY() + 32 * dir, 0, 0, 0, 0 );
+ dir = -dir;
+ }
+ Wait( 100 );
+ }
+ }
+ task YoseiBasic(){
+ ascent( let i in 0..6 ){
+ ascent( let argv in 0..12 ){
+ CreateEnemyFromFile( enemyYosei19, GetCenterX() + GetCommonData( "NowCount" ) * [ -2, 2 ][ i % 2 ] % 192, 0, 0, 0, argv );
+ Wait( 10 );
+ }
+ Wait( [ 30, 60 ][ i % 2 ] );
+ }
+ }
+ task KedamaRush( let time, let space, let speed, let angle ){
+ ascent( let i in 0..trunc( time / space ) ){
+ CreateEnemyFromFile( enemyKedama06, rand( GetClipMinX(), GetClipMaxX() ), 0, speed, 90 + RandBlur( angle ), i );
+ Wait( space );
+ }
+ }
+}
+function Stage3LoopInit(){
+ ClearBGEffect();
+ SetCommonData( "PrevBG", [ 0, 0 ] );
+ SetCommonData( "BGViewTo", [ 0, 50, 0 ] );
+}
+function Stage3Loop( let count ){
+ let speed = [ 0.7, 0.3 ];
+ let step = GetCommonDataDefault( "BGStep", 0 );
+ let prev = GetCommonData( "PrevBG" );
+ let to = GetCommonData( "BGViewTo" );
+ if( step != prev[ 0 ] ){
+ prev = [ step, count ];
+ SetCommonData( "PrevBG", prev );
+ }
+ let bgphasecount = count - prev[ 1 ];
+ let zspeed = Smooth( speed[ Max( step - 1, 0 ) ], speed[ step ], bgphasecount, 300 );
+ to[ 1 ] = to[ 1 ] + zspeed / 3.4375;
+ to[ 2 ] = to[ 2 ] - zspeed;
+ SetCommonData( "BGViewTo", to );
+ if( count % trunc( Smooth( 60, 5, count, 3600 ) ) == 0 ){
+ AddBGEffect( RandBlur( 200 ), rand( 50, 300 ) + to[ 1 ], to[ 2 ] - rand( 50, 300 ), RandBlur( 2 ), -rand( 0, 2 ), rand( 1, 2.5 ), 250, 0 );
+ }
+}
+function Stage3BG( let count ){
+ let to = GetCommonData( "BGViewTo" );
+ let zangle = SlowDown( 0, 40, count, 600 );
+ SetPerspectiveClip( 10, 2000 );
+ SetFog( Smooth( 0, 500, count, 600 ), Smooth( 0, 1000, count, 600 ), 255, 255, 255 );
+ SetViewFrom( Smooth( 300, 600, count, 1000 ), 90, zangle );
+ SetViewTo( to[ 0 ], to[ 1 ], to[ 2 ] );
+
+ let z = truncEx( to[ 2 ], 1650 );
+ let y = ( -z / 1650 ) * 480;
+ if( count < 500 ){
+ SetTexture( imgMapWhite );
+ SetGraphicScale( 100, 100 );
+ SetGraphicAngle( 0, 0, 0 );
+ DrawGraphic3D( 0, 500, to[ 2 ] - 1000 );
+ }
+ loop( 2 ){
+ SetGraphicRect( 0, 0, 512, 512 );
+ SetGraphicScale( 4, 1 );
+ SetTexture( imgMapGround );
+ SetGraphicAngle( 120, 330, 0 );
+ DrawGraphic3D( -240, y, z );
+ SetTexture( imgMapSnowField );
+ SetGraphicAngle( 90, 0, 30 );
+ DrawGraphic3D( 0, y + 120, z - 400 );
+ DrawGraphic3D( 250, y + 120, z - 846 );
+ SetTexture( imgMapGround );
+ SetGraphicAngle( 120, -350, 0 );
+ DrawGraphic3D( 50, y + 240, z - 800 );
+ SetTexture( imgMapSnowField );
+ SetGraphicAngle( 90, 0, 170 );
+ DrawGraphic3D( 0, y + 360, z - 1270 );
+ DrawGraphic3D( -100, y + 360, z - 1770 );
+ SetTexture( imgMapSnowTree );
+ SetGraphicRect( 0, 0, 128, 128 );
+ SetGraphicAngle( 180 - zangle, 0, 0 );
+ Tree( 160, y, z + 200 );
+ Tree( -240, y, z );
+ Tree( -50, y + 50, z );
+ Tree( 120, y + 120, z - 150 );
+ Tree( -200, y + 120, z - 240 );
+ Tree( 60, y + 120, z - 350 );
+ Tree( 220, y + 120, z - 380 );
+ Tree( -100, y + 120, z - 420 );
+ Tree( -300, y + 150, z - 500 );
+ Tree( 100, y + 160, z - 600 );
+ Tree( -180, y + 180, z - 700 );
+ Tree( 250, y + 220, z - 750 );
+ Tree( 50, y + 240, z - 800 );
+ Tree( -210, y + 330, z - 960 );
+ Tree( 20, y + 360, z - 1120 );
+ Tree( -180, y + 360, z - 1200 );
+ z -= 1650;
+ y += 480;
+ }
+ if( GetCommonDataDefault( "BGEEnable", true ) ){
+ SetTexture( imgMapSnow );
+ SetGraphicRect( 0, 0, 128, 128 );
+ SetGraphicScale( 0.3, 0.3 );
+ ascent( let i in 0..length( BGEffectX ) ){
+ SetGraphicAngle( 180 - zangle, 0, count * 3 + i * 2 );
+ SetAlpha( [ BGEffectLife[ i ], Smooth( 0, 255, 250 - BGEffectLife[ i ], 64 ) ][ BGEffectLife[ i ] > 192 ] );
+ DrawGraphic3D( BGEffectX[ i ], BGEffectY[ i ], BGEffectZ[ i ] );
+ }
+ }
+ SetGraphicAngle( 0, 0, 0 );
+ SetGraphicScale( 1, 1 );
+ function Tree( let x, let y, let z ){
+ ascent( let height in 0..3 ){
+ SetAlpha( Smooth( 192, 255, height, 2 ) );
+ let ex = Smooth( 1, 0.36, height, 2 );
+ SetGraphicScale( ex, ex );
+ DrawGraphic3D( x + Smooth( 0, 10, absolute( x ), 300 ) * height * GetDir( x ), 65 + height * 40 + y, z );
+ }
+ SetAlpha( 255 );
+ }
+}
diff --git a/th_dnh/script/thA/STAGE/4.dnh b/th_dnh/script/thA/STAGE/4.dnh
new file mode 100644
index 0000000..2271bdd
--- /dev/null
+++ b/th_dnh/script/thA/STAGE/4.dnh
@@ -0,0 +1,278 @@
+function GetStage4BGLoadList(){ return [ imgMapSnow, imgMapChirch, imgMapFloor, imgMapWood1, imgMapWood2 ]; }
+function GetStage4LeilaLoadList(){ return [ imgCutInLeila, imgCutInLeilaCry, imgNameLeila, imgEnemyLeila, imgSpellChirch, imgSpellLuna, imgSpellRedWall ]; }
+task Stage4(){
+ MuteMusic();
+ let loadgraphiclist = [ imgStage[ 3 ] ];
+ loadgraphiclist = loadgraphiclist ~ GetStage4BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage4LeilaLoadList();
+ let loadenemylist = [ _enemyBlur, enemyYosei09, enemyYosei15, enemyYosei20, enemyYosei21, enemyKedama02, enemyKedama03, enemyDoll01, enemyDoll02, enemyDoll04, bossLeilaBE ];
+ if( GetCommonDataDefault( "Practice", false ) ){ StageLoad( DefaultStageLoadGraphicList ~ loadgraphiclist, DefaultStageLoadSEList, loadenemylist ); }
+ else{ StageLoad( loadgraphiclist, [], loadenemylist ); }
+ Ready( seOk );
+ Stage4LoopInit();
+ ForbidBomb( false );
+ ForbidShot( false );
+ SetCommonData( "Result", false );
+ SetCommonData( "Stage", 3 );
+ SetCommonData( "BGStep", 0 );
+ PlayMusicEx( 8 );
+ MusicRelease[ 8 ] = true;
+ StageRelease[ 3 ] = true;
+ CreateSaveData();
+ SaveEx();
+ Wait( 90 );
+ SetCommonData( "StageTitle", true );
+ Wait( 400 );
+ SetCommonData( "StageTitle", false );
+ Wait( 200 );
+ CreateEnemyFromFile( enemyYosei09, GetCenterX() + 96, 0, 0, 0, 0 );
+ Wait( 300 );
+ local{
+ ascent( let i in 0..16 ){
+ CreateEnemyFromFile( [ enemyKedama02, enemyKedama03 ][ trunc( i / 2 ) % 2 ], GetCenterX() + 202 * [ 1, -1 ][ i % 2 ], GetCenterY() - 96, 0, sin( GetCommonData( "NowCount" ) ) * 45 + [ 180, 0 ][ i % 2 ], i );
+ Wait( 20 );
+ }
+ }
+ Wait( 60 );
+ CreateEnemyFromFile( enemyYosei09, GetCenterX() + 96, 0, 0, 0, 0 );
+ Wait( 123 );
+ CreateEnemyFromFile( enemyYosei09, GetCenterX() + 128, 0, 0, 0, 0 );
+ Wait( 123 );
+ CreateEnemyFromFile( enemyYosei09, GetCenterX() - 64, 0, 0, 0, 0 );
+ Wait( 450 );
+ Doll1();
+ Wait( 400 );
+ local{
+ ascent( let i in 0..3 ){
+ loop( 8 ){
+ if( i != 0 ){ CreateEnemyFromFile( [ enemyKedama02, enemyKedama03 ][ i == 2 ], GetClipMinX() - 16, GetCenterY() - [ 32, 64 ][ i == 1 ], 0, [ 0, 315 ][ i == 2 ], GetCommonData( "NowCount" ) ); }
+ Wait( 10 );
+ }
+ Wait( 140 );
+ loop( 6 ){
+ CreateEnemyFromFile( [ enemyKedama02, enemyKedama03 ][ i == 2 ], GetClipMaxX() + 16, GetCenterY() - [ 32, 64 ][ i == 1 ], 0, [ 180, 225 ][ i == 2 ], GetCommonData( "NowCount" ) );
+ Wait( 10 );
+ }
+ Wait( 51 );
+ loop( 6 ){
+ CreateEnemyFromFile( [ enemyKedama02, enemyKedama03 ][ i == 2 ], GetClipMinX() - 16, GetCenterY() - [ 32, 64 ][ i == 1 ], 0, [ 0, 315 ][ i == 2 ], GetCommonData( "NowCount" ) );
+ Wait( 10 );
+ }
+ Wait( 51 );
+ }
+ }
+ Wait( 60 );
+ DeleteEnemyShotToItem( ALL );
+ CreateEnemyFromFile( enemyDoll02, GetCenterX() + 160, 0, 0, 0, 0 );
+ Wait( 400 );
+ CreateEnemyFromFile( enemyDoll02, GetCenterX() - 128, 0, 0, 0, 0 );
+ Wait( 440 );
+ CreateEnemyFromFile( enemyDoll02, GetCenterX() + 128, 0, 0, 0, 0 );
+ Wait( 440 );
+ CreateEnemyFromFile( enemyDoll02, GetCenterX() - 96, 0, 0, 0, 0 );
+ Wait( 100 );
+ CreateEnemyFromFile( enemyDoll02, GetCenterX() + 96, 0, 0, 0, 0 );
+ Wait( 360 );
+ let bossstart = GetCommonData( "NowCount" );
+ CreateEnemyBossFromFile( bossLeilaA, GetCenterX(), GetClipMinY() + 96, 0, 0, 0 );
+ WaitZeroEnemy();
+ Wait( 300 );
+ while( GetCommonData( "NowCount" ) < bossstart + 700 ){ yield; }
+ while( truncEx( GetCommonData( "NowCount" ), 444 ) + 444 <= bossstart + 1600 ){
+ let dir = -1;
+ loop( 2 ){
+ Doll1_2( dir );
+ Wait( 94 );
+ CreateEnemyFromFile( enemyYosei20, GetCenterX() - 96 * dir, 0, 0, 0, 0 );
+ Wait( 350 );
+ dir = -dir;
+ }
+ }
+ local{
+ let dir = -1;
+ loop( 2 ){
+ Doll1_2( dir );
+ Wait( 100 );
+ CreateEnemyFromFile( enemyYosei09, GetCenterX() + 96 * dir, 0, 0, 0, 0 );
+ Wait( 150 );
+ ascent( let i in 0..2 ){
+ CreateEnemyFromFile( enemyDoll04, GetCenterX() - [ 80, 144 ][ i ] * dir, GetCenterY() - 128, 0, 0, 0 );
+ Wait( 50 );
+ }
+ Wait( 94 );
+ dir = -dir;
+ }
+ }
+ Wait( 222 );
+ local{
+ ascent( let i in 0..4 ){
+ loop( 8 ){
+ if( i != 0 ){ CreateEnemyFromFile( [ enemyKedama02, enemyKedama03 ][ i % 2 ], GetClipMinX() - 16, GetCenterY() - [ 32, 64 ][ i % 2 ], 0, [ 0, 315 ][ i % 2 ], GetCommonData( "NowCount" ) ); }
+ Wait( 10 );
+ }
+ if( i == 0 ){ YoseiSlide(); }
+ if( i == 2 ){ YoseiSlide2(); }
+ Wait( 140 );
+ loop( 6 ){
+ CreateEnemyFromFile( [ enemyKedama02, enemyKedama03 ][ i % 2 ], GetClipMaxX() + 16, GetCenterY() - [ 32, 64 ][ i % 2 ], 0, [ 180, 225 ][ i % 2 ], GetCommonData( "NowCount" ) );
+ Wait( 10 );
+ }
+ Wait( 52 );
+ loop( 6 ){
+ CreateEnemyFromFile( [ enemyKedama02, enemyKedama03 ][ i % 2 ], GetClipMinX() - 16, GetCenterY() - [ 32, 64 ][ i % 2 ], 0, [ 0, 315 ][ i % 2 ], GetCommonData( "NowCount" ) );
+ Wait( 10 );
+ }
+ Wait( 52 );
+ }
+ }
+ Wait( 300 );
+ DeleteEnemyShotToItem( ALL );
+ local{
+ let x = GetClipMinX() + 96;
+ while( x <= GetClipMaxX() - 96 ){
+ CreateEnemyFromFile( enemyDoll02, x, 0, 0, 0, 0 );
+ x += 96;
+ }
+ }
+ Wait( 777 );
+ MusicRelease[ 9 ] = true;
+ CreateSaveData();
+ SaveEx();
+ CreateEnemyBossFromFile( bossLeilaB, GetCenterX(), GetClipMinY() + 96, 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SetCommonData( "ShowName", -1 );
+ CreateEnemyFromFile( bossLeilaBE, -128, -128, 0, 0, 0 );
+ ForbidBomb( true );
+ WaitZeroEnemy();
+ StageHighScore[ 3 ] = GetCommonDataDefault( "ResultTotal", 0 );
+ CreateSaveData();
+ SaveEx();
+ if( GetCommonDataDefault( "Practice", false ) ){
+ Clear();
+ return;
+ }
+ DeleteGraphicList( loadgraphiclist, [] );
+ ClearByteCodeCash();
+ Stage5();
+ task Doll1(){
+ ascent( let i in 0..3 ){
+ loop( 3 ){
+ CreateEnemyFromFile( enemyDoll01, GetCenterX() + sin( GetCommonData( "NowCount" ) * 5 ) * 128, GetCenterY() - 128 + cos( GetCommonData( "NowCount" ) * 2 ) * 64, 0, 0, 0 );
+ Wait( 111 );
+ }
+ loop( 2 ){
+ if( i != 2 ){ CreateEnemyFromFile( enemyDoll01, GetCenterX() + sin( GetCommonData( "NowCount" ) * 5 ) * 128, GetCenterY() - 128 + cos( GetCommonData( "NowCount" ) * 2 ) * 64, 0, 0, 0 ); }
+ Wait( 55 );
+ }
+ }
+ }
+ task Doll1_2( let dir ){
+ loop( 5 ){
+ CreateEnemyFromFile( enemyDoll01, GetCenterX() + 96 * dir + sin( GetCommonData( "NowCount" ) / 1.6 * dir ) * 64, GetCenterY() - 80 + cos( GetCommonData( "NowCount" ) / 2 * dir ) * 16, 0, 0, 0 );
+ Wait( 55 );
+ }
+ }
+ task YoseiSlide(){
+ loop( 2 ){
+ let dir = -1;
+ loop( 2 ){
+ ascent( let i in 0..5 ){
+ CreateEnemyFromFile( enemyYosei15, GetCenterX() + 192 * dir, GetClipMinY() + 32 + ( 5 - i ) * 24, 0, 0, ( ( 5 - i ) * 64 + i % 2 ) * -1 );
+ Wait( 7 );
+ }
+ Wait( 187 );
+ dir = -dir;
+ }
+ }
+ }
+ task YoseiSlide2(){
+ loop( 2 ){
+ let dir = -1;
+ loop( 2 ){
+ ascent( let i in 0..5 ){
+ CreateEnemyFromFile( enemyYosei21, GetCenterX() + 192 * dir, GetClipMinY() + 32 + ( 5 - i ) * 24, 0, 0, ( ( 5 - i ) * 64 + i % 2 ) * -1 );
+ Wait( 28 );
+ }
+ Wait( 82 );
+ dir = -dir;
+ }
+ }
+ }
+}
+function Stage4LoopInit(){
+ SetCommonData( "PrevBG", [ 0, 0 ] );
+ SetCommonData( "BGViewTo", [ 0, 0, 0 ] );
+ ClearBGEffect();
+}
+function Stage4Loop( let count ){
+ if( count < 2700 ){
+ let x = [ rand( -200, 50 ), RandBlur( 100 ) ][ count > 1900 ];
+ let y = RandBlur( 200 ) + SplineFakeSFS( 288, -224, count - 800, 1200 );
+ let z = rand( 200, 600 ) - Max( count - 2000, 0 ) * Accelerate( 0, 1.5, count - 2000, 200 );
+ let VectorX = [ rand( 1, 4 ), rand( Smooth( 1, -1, count - 1900, 200 ), Smooth( 4, 1, count - 1900, 200 ) ) ][ count > 1900 ];
+ let VectorZ = [ -rand( 1, 5 ), -rand( Smooth( 1, 4, count - 1900, 200 ), Smooth( 5, 9, count - 1900, 200 ) ) ][ count > 1900 ];
+ AddBGEffect( x, y, z, VectorX, -rand( 1, 3 ), VectorZ, 250, 0 );
+ }
+ if( count == 2700 ){ ClearBGEffect(); }
+}
+function Stage4BG( let count ){
+ if( count >= 2700 ){
+ let lcount = count - 2700;
+ SetFog( Smooth( 0, 300, lcount, 600 ), Smooth( 0, 600, lcount, 600 ), 0, 0, 0 );
+ SetViewFrom( SlowDown( 600, 500, lcount, 600 ), [ 90, 90 - sin( ( count - 3900 ) / 5 ) * 10 ][ count >= 3900 ], SlowDown( 8, 3, lcount, 600 ) );
+ SetViewTo( [ 0, MinMax( -sin( ( count - 3900 ) / 5 ) * 88, -80, 80 ) ][ count >= 3900 ], 133, -lcount % 510 );
+ let z = -1020;
+ loop( 4 ){
+ let dir = -1;
+ loop( 2 ){
+ SetGraphicAngle( 90, 0, 0 );
+ SetGraphicRect( 1, 1, 512, 512 );
+ SetTexture( imgMapFloor );
+ DrawGraphic3D( 250 * dir, 0, z );
+ let bz = 0;
+ loop( 2 ){
+ SetGraphicAngle( 180, 90, 0 );
+ SetGraphicRect( 1, 1, 90, 63 );
+ SetTexture( imgMapWood2 );
+ DrawGraphic3D( 65 * dir, 31, z + bz - 44 );
+ SetGraphicScale( 1, 0.5 );
+ SetGraphicAngle( 90, 0, 0 );
+ SetGraphicRect( 1, 1, 256, 101 );
+ SetTexture( imgMapWood1 );
+ DrawGraphic3D( 192 * dir, 48, z + bz - 26 );
+ SetGraphicScale( 1, 1 );
+ SetGraphicAngle( 180, 0, 0 );
+ DrawGraphic3D( 192 * dir, 51, z + bz );
+ bz -= 255;
+ }
+ dir = -dir;
+ }
+ z += 510;
+ }
+ }
+ if( count < 2700 ){
+ SetFog( Smooth( 0, 300, count, 500 ), Smooth( 400, 700, count, 500 ), 0, 0, 0 );
+ SetViewFrom( SlowDown( 512, 448, count, 1000 ), 90, Smooth( 16, 8, count, 2000 ) );
+ SetViewTo( 0, SplineFakeSFS( 288, -224, count - 800, 1200 ), -Max( count - 1900, 0 ) * Accelerate( 0, 1.5, count - 1900, 200 ) );
+ let rgb = Smooth( 255, 0, count - 1900, 750 );
+ SetColor( rgb, rgb, rgb );
+ SetGraphicAngle( 180, 0, 0 );
+ SetGraphicRect( 1, 1, 512, 1024 );
+ SetTexture( imgMapChirch );
+ DrawGraphic3D( 0, 0, 0 );
+ if( GetCommonDataDefault( "BGEEnable", true ) ){
+ SetTexture( imgMapSnow );
+ SetGraphicRect( 1, 1, 128, 128 );
+ SetGraphicScale( 0.1, 0.1 );
+ ascent( let i in 0..length( BGEffectX ) ){
+ SetGraphicAngle( 180, 0, count * 3 + i * 2 );
+ SetAlpha( [ BGEffectLife[ i ], Smooth( 0, 255, 250 - BGEffectLife[ i ], 64 ) ][ BGEffectLife[ i ] > 192 ] );
+ DrawGraphic3D( BGEffectX[ i ], BGEffectY[ i ], BGEffectZ[ i ] );
+ }
+ }
+ }
+ SetColor( 255, 255, 255 );
+ SetGraphicScale( 1, 1 );
+ SetGraphicAngle( 0, 0, 0 );
+}
diff --git a/th_dnh/script/thA/STAGE/5.dnh b/th_dnh/script/thA/STAGE/5.dnh
new file mode 100644
index 0000000..a1c7c4a
--- /dev/null
+++ b/th_dnh/script/thA/STAGE/5.dnh
@@ -0,0 +1,168 @@
+function GetStage5BGLoadList(){ return [ imgMapPoll, imgMapRock, imgMapLight2 ]; }
+function GetStage5MerryLoadList(){ return [ imgSpellKhan, imgNameMerry, imgCutInMerry, imgCutInMerryCry, imgEnemyMerry, imgSystemCircleBig ]; }
+task Stage5(){
+ MuteMusic();
+ let loadgraphiclist = [ imgStage[ 4 ] ];
+ loadgraphiclist = loadgraphiclist ~ GetStage5BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage5MerryLoadList();
+ let loadenemylist = [ _enemyBlur, enemyDoll03, enemyYosei10, enemyYosei11, enemyYosei12, enemyYosei13, bossMerryBE ];
+ if( GetCommonDataDefault( "Practice", false ) ){ StageLoad( DefaultStageLoadGraphicList ~ loadgraphiclist, DefaultStageLoadSEList, loadenemylist ); }
+ else{ StageLoad( loadgraphiclist, [], loadenemylist ); }
+ Ready( seOk );
+ Stage5LoopInit();
+ ForbidBomb( false );
+ ForbidShot( false );
+ SetCommonData( "Result", false );
+ SetCommonData( "Stage", 4 );
+ SetCommonData( "BGStep", 0 );
+ PlayMusicEx( 10 );
+ MusicRelease[ 10 ] = true;
+ StageRelease[ 4 ] = true;
+ CreateSaveData();
+ SaveEx();
+ Wait( 230 );
+ CreateEnemyFromFile( enemyYosei10, GetCenterX() + 128, 0, 0, 0, 0 );
+ Wait( 500 );
+ SetCommonData( "StageTitle", true );
+ Wait( 430 );
+ SetCommonData( "StageTitle", false );
+ Wait( 100 );
+ SetCommonData( "BGStep", 1 );
+ Wait( 120 );
+ SetCommonData( "BGStep", 2 );
+ Rush1();
+ SetCommonData( "BGStep", 3 );
+ Wait( 80 );
+ CreateEnemyFromFile( enemyYosei13, GetCenterX() + 128, 0, 0, 0, 0 );
+ Wait( 300 );
+ CreateEnemyFromFile( enemyYosei13, GetCenterX() - 128, 0, 0, 0, 0 );
+ Wait( 300 );
+ CreateEnemyFromFile( enemyYosei13, GetCenterX() + 96, 0, 0, 0, 0 );
+ Wait( 300 );
+ CreateEnemyFromFile( enemyYosei13, GetCenterX() - 80, 0, 0, 0, 0 );
+ Wait( 60 );
+ CreateEnemyFromFile( enemyYosei13, GetCenterX() + 72, 0, 0, 0, 0 );
+ SetCommonData( "BGStep", 4 );
+ Wait( 210 );
+ let bossstart = GetCommonData( "NowCount" );
+ CreateEnemyBossFromFile( bossMerryA, GetClipMaxX() + 64, GetClipMinY() - 64, 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SaveEx();
+ Wait( 160 );
+ while( GetCommonData( "NowCount" ) < bossstart + 2700 ){
+ Wait( 20 );
+ CreateEnemyFromFile( enemyDoll03, GetCenterX() + sin( GetCommonData( "NowCount" ) / 3.4 ) * 160, GetClipMinX() + 128 + sin( GetCommonData( "NowCount" ) / 1.7 ) * 96, 0, 0, 0 );
+ }
+ Wait( 300 );
+ Rush2();
+ WaitZeroEnemy();
+ Wait( 150 );
+ MusicRelease[ 11 ] = true;
+ CreateSaveData();
+ SaveEx();
+ CreateEnemyBossFromFile( bossMerryB, GetClipMaxX() + 64, GetClipMinY() - 64, 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SetCommonData( "ShowName", -1 );
+ CreateEnemyFromFile( bossMerryBE, -128, -128, 0, 0, 0 );
+ ForbidBomb( true );
+ WaitZeroEnemy();
+ StageHighScore[ 4 ] = GetCommonDataDefault( "ResultTotal", 0 );
+ CreateSaveData();
+ SaveEx();
+ if( GetCommonDataDefault( "Practice", false ) ){
+ Clear();
+ return;
+ }
+ DeleteGraphicList( loadgraphiclist, [] );
+ ClearByteCodeCash();
+ Stage6();
+ function Rush1(){
+ ascent( let i in 0..4 ){
+ Rush1Yosei11( [ -1, 1 ][ i % 2 ] );
+ Wait( [ 120, 100 ][ i == 3 ] );
+ Rush1Yosei12( [ -1, 1 ][ i % 2 ] );
+ Wait( [ 260, 200 ][ i == 2 ] );
+ }
+ }
+ function Rush2(){
+ ascent( let i in 0..4 ){
+ Rush1Yosei11( [ 1, -1 ][ i % 2 ] );
+ Wait( [ 120, 100 ][ i == 3 ] );
+ CreateEnemyFromFile( enemyYosei13, GetCenterX() + 96 * [ -1, 1 ][ i % 2 ], 0, 0, 0, trunc( i / 2 ) );
+ Wait( [ 240, 160 ][ i == 2 ] );
+ }
+ }
+ task Rush1Yosei11( let dir ){
+ ascent( let i in 0..12 ){
+ CreateEnemyFromFile( enemyYosei11, GetCenterX() + 192 * dir, GetClipMinY() + 32 + ( i * 96 ) % 224, 0, 0, 128 + sin( i * 320 ) * 80 );
+ Wait( 20 );
+ }
+ }
+ task Rush1Yosei12( let dir ){
+ ascent( let i in 0..4 ){
+ CreateEnemyFromFile( enemyYosei12, GetCenterX() - 160 * dir + i * 64 * dir, 0, 1.5, 90, 0 );
+ Wait( 60 );
+ }
+ }
+}
+function Stage5LoopInit(){
+ ClearBGEffect();
+ SetCommonData( "PrevBG", [ 0, 0 ] );
+ SetCommonData( "BGViewTo", [ 0, 0, 0 ] );
+ SetCommonData( "BGViewFrom", [ 500, 90, 20 ] );
+}
+function Stage5Loop( let count ){
+ let speed = [ 0.45, 0.15, 2.5, 2.8, 2.5 ];
+ let step = GetCommonDataDefault( "BGStep", 0 );
+ let prev = GetCommonData( "PrevBG" );
+ let to = GetCommonData( "BGViewTo" );
+ let from = GetCommonData( "BGViewFrom" );
+ if( step != prev[ 0 ] ){
+ prev = [ step, count ];
+ SetCommonData( "PrevBG", prev );
+ }
+ let bgphasecount = count - prev[ 1 ];
+ to[ 2 ] = to[ 2 ] - Smooth( speed[ Max( step - 1, 0 ) ], speed[ step ], bgphasecount, 150 );
+ if( step == 2 ){ to[ 0 ] = SlowDown( 0, -50, bgphasecount, 100 ); }
+ SetCommonData( "BGViewTo", to );
+ SetCommonData( "BGViewFrom", from );
+}
+function Stage5BG( let count ){
+ let to = GetCommonData( "BGViewTo" );
+ let from = GetCommonData( "BGViewFrom" );
+ let color = [ 255, 240 ][ trunc( GetCommonDataDefault( "DrawFrameCount", 0 ) / 2 ) % 2 ];
+ SetFog( Smooth( 0, 700, count, 150 ), Smooth( 0, 1000, count, 300 ), 0, 0, 0 );
+ SetViewFrom( from[ 0 ], from[ 1 ], from[ 2 ] );
+ SetViewTo( to[ 0 ], to[ 1 ], to[ 2 ] );
+ SetColor( color, color, color );
+ local{
+ let z = truncEx( to[ 2 ], 512 ) - 1536;
+ loop( [ 4, 5 ][ count < 300 ] ){
+ SetTexture( imgMapRock );
+ SetGraphicRect( 0, 0, 512, 512 );
+ SetGraphicAngle( -10, 90, 0 );
+ DrawGraphic3D( 100, -50, z );
+ SetTexture( imgMapLight2 );
+ SetGraphicRect( 0, 0, 128, 128 );
+ SetGraphicAngle( 0, 0, 0 );
+ DrawGraphic3D( 70, -50, z );
+ z += 512;
+ }
+ }
+ local{
+ SetTexture( imgMapPoll );
+ SetGraphicRect( 0, 0, 512, 48 );
+ let z = truncEx( to[ 2 ], 512 ) - 1344;
+ loop( [ 4, 5 ][ count < 300 ] ){
+ SetGraphicAngle( 0, 0, 20 );
+ DrawGraphic3D( -160, 0, z );
+ SetGraphicAngle( 30, 0, 85 );
+ DrawGraphic3D( -200, 0, z - 60 );
+ z += 512;
+ }
+ }
+ SetColor( 255, 255, 255 );
+ SetGraphicAngle( 0, 0, 0 );
+}
diff --git a/th_dnh/script/thA/STAGE/6.dnh b/th_dnh/script/thA/STAGE/6.dnh
new file mode 100644
index 0000000..6f3d539
--- /dev/null
+++ b/th_dnh/script/thA/STAGE/6.dnh
@@ -0,0 +1,202 @@
+function GetStage6BGLoadList(){ return [ imgMapCandle1, imgMapCandle8, imgMapLight1, imgMapSeal ]; }
+function GetStage6KeneLoadList(){ return [ imgSpellWheel, imgSpellStar, imgSpellKene, imgCutInKene, imgNameKene, imgEnemyKene, imgSystemCircleBig ]; }
+task Stage6(){
+ MuteMusic();
+ let loadgraphiclist = [ imgStage[ 5 ] ];
+ loadgraphiclist = loadgraphiclist ~ GetStage6BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage5MerryLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage6KeneLoadList();
+ loadgraphiclist = loadgraphiclist ~ imgEnemySense;
+ loadgraphiclist = loadgraphiclist ~ imgEnemyBat;
+ loadgraphiclist = loadgraphiclist ~ imgEnemyPhoenix;
+ let loadenemylist = [ _enemyBlur, enemyKedama04, enemyKedama05, enemyYosei14 ];
+ if( GetCommonDataDefault( "Practice", false ) ){ StageLoad( DefaultStageLoadGraphicList ~ loadgraphiclist, DefaultStageLoadSEList, loadenemylist ); }
+ else{ StageLoad( loadgraphiclist, [], loadenemylist ); }
+ Ready( seOk );
+ Stage6LoopInit();
+ ForbidBomb( false );
+ ForbidShot( false );
+ SetCommonData( "Result", false );
+ SetCommonData( "Stage", 5 );
+ SetCommonData( "BGStep", 0 );
+ PlayMusicEx( 12 );
+ MusicRelease[ 12 ] = true;
+ StageRelease[ 5 ] = true;
+ CreateSaveData();
+ SaveEx();
+ let startcount = GetCommonData( "GlobalCount" );
+ //Globalにしないとどういうわけかこの先でループし続けてしまう
+ Wait( 180 );
+// /*
+ SetCommonData( "StageTitle", true );
+ Wait( 360 );
+ SetCommonData( "StageTitle", false );
+ Wait( 400 );
+ local{
+ ascent( let i in 0..44 ){
+ CreateEnemyFromFile( [ enemyKedama05, enemyKedama04 ][ trunc( i / 2 ) % 2 ], GetCenterX() + 202 * [ 1, -1 ][ i % 2 ], GetClipMinY() + 96 + i * 197 % 104, 0, sin( GetCommonData( "NowCount" ) ) * 45 + [ 180, 0 ][ i % 2 ], i );
+ Wait( 15 );
+ }
+ }
+ Wait( 240 );
+ CreateEnemyFromFile( enemyYosei14, GetCenterX(), GetClipMinY() + 96, 0, 0, 0 );
+ Wait( 480 );
+ CreateEnemyFromFile( enemyYosei14, GetCenterX(), GetClipMinY() + 96, 0, 0, 1 );
+ Wait( 480 );
+ CreateEnemyFromFile( enemyYosei14, GetCenterX(), GetClipMinY() + 96, 0, 0, 2 );
+ Wait( 180 );
+ SetCommonData( "StartCount", startcount );
+ CreateEnemyBossFromFile( bossMerryC, -32, GetClipMaxY(), 0, 0, startcount );
+ WaitZeroEnemy();
+ DeleteCommonData( "StartCount" );
+ ReadData();
+ SaveEx();
+ while( GetCommonData( "GlobalCount" ) < startcount + 5100 ){ yield; }
+ //Globalにしないとどういうわけかここでループし続けてしまう
+ SetCommonData( "BGStep", 1 );
+ Wait( 360 );
+ MusicRelease[ 13 ] = true;
+ CreateSaveData();
+ SaveEx();
+ CreateEnemyBossFromFile( bossCavedA, GetCenterX(), GetCenterY() - 96, 0, 0, 0 );
+ WaitZeroEnemy();
+ ForbidBomb( true );
+ ReadData();
+ SaveEx();
+ SetCommonData( "BGStep", 5 );
+ PlaySEEx( seBossExplode );
+ MuteMusic();
+ LoadMusic( bgmList[ 14 ] );
+ Wait( 240 );
+ CreateEnemyFromFile( _enemyConcentrate, GetCenterX(), GetCenterY(), 0, 0, 0 );
+ Wait( 120 );
+ PlayMusicEx( 14 );
+ MusicRelease[ 14 ] = true;
+ CreateSaveData();
+ SaveEx();
+ CreateEnemyBossFromFile( bossCavedB, GetCenterX(), GetCenterY(), 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SaveEx();
+ SetCommonData( "ShowName", -1 );
+// */
+ CreateEnemyFromFile( bossCavedBE, -128, -128, 0, 0, 0 );
+ ForbidShot( true );
+ WaitZeroEnemy();
+ StageHighScore[ 5 ] = GetCommonDataDefault( "ResultTotal", 0 );
+ CreateSaveData();
+ SaveEx();
+ Wait( 600 );
+ if( IsReplay() || GetCommonDataDefault( "Practice", false ) ){
+ Clear(); // EDを見せないためにも必要
+ return;
+ }
+ ClearByteCodeCash();
+ DeleteGraphicList( loadgraphiclist, [] );
+ LoadGraphicList( imgED );
+ LoadGraphicList( [ imgSystemStaffRoll, imgSystemExtra, imgSystemNextAge, imgMapSeal, imgMapSnow ] );
+ SetCommonData( "BGStep", 32767 );
+ SetCommonData( "WhiteFadeOut", 0 );
+ SetCommonData( "EDStep", [ 0, GetCommonData( "NowCount" ) ] );
+ SetCommonData( "Result", false );
+ MuteMusic();
+ PlayMusicEx( 17 );
+ MusicRelease[ 17 ] = true;
+ CreateSaveData();
+ SaveEx();
+ Wait( 200 );
+ CreateEnemyFromFile( _enemyED, 0, 0, 0, 0, 0 );
+ WaitZeroEnemy();
+ MuteMusic();
+ PlayMusicEx( 18 );
+ MusicRelease[ 18 ] = true;
+ CreateSaveData();
+ SaveEx();
+}
+function Stage6LoopInit(){
+ ClearBGEffect();
+ SetCommonData( "PrevBG", [ 0, 0 ] );
+ SetCommonData( "BGViewTo", [ 0, 0, 0 ] );
+ SetCommonData( "BGViewFrom", [ 500, 90, 0 ] );
+ SetCommonData( "SealRGB", [ 0, 0, 0 ] );
+}
+function Stage6Loop( let count ){
+ let speed = [ 0.5, 0, 0, 0, 0, 0 ];
+ let step = GetCommonDataDefault( "BGStep", 0 );
+ let prev = GetCommonData( "PrevBG" );
+ let from = GetCommonData( "BGViewFrom" );
+ let to = GetCommonData( "BGViewTo" );
+ let sealrgb = GetCommonData( "SealRGB" );
+ if( step != prev[ 0 ] ){
+ prev = [ step, count ];
+ SetCommonData( "PrevBG", prev );
+ }
+ let bgphasecount = count - prev[ 1 ];
+ to[ 2 ] = to[ 2 ] - Smooth( speed[ Max( step - 1, 0 ) ], speed[ step ], bgphasecount, 200 );
+ alternative( step )
+ case( 1 ){
+ from[ 2 ] = SplineFakeSFS( 0, 90, bgphasecount, 200 );
+ let rgb = Smooth( 0, 255, bgphasecount - 100, 300 );
+ ascent( let i in 0..3 ){ sealrgb[ i ] = rgb; }
+ }
+ case( 2 ){
+ sealrgb[ 0 ] = Smooth( 255, 96, bgphasecount, 300 );
+ sealrgb[ 1 ] = Smooth( 255, 0, bgphasecount, 300 );
+ sealrgb[ 2 ] = 255;
+ }
+ case( 3 ){
+ sealrgb[ 0 ] = Smooth( 96, 255, bgphasecount, 300 );
+ sealrgb[ 1 ] = Smooth( 0, 192, bgphasecount, 300 );
+ sealrgb[ 2 ] = Smooth( 255, 224, bgphasecount, 300 );
+ }
+ case( 4 ){
+ sealrgb[ 0 ] = 255;
+ sealrgb[ 1 ] = Smooth( 192, 64, bgphasecount, 300 );
+ sealrgb[ 2 ] = Smooth( 224, 0, bgphasecount, 300 );
+ }
+ case( 5 ){
+ sealrgb[ 0 ] = Smooth( 255, 64, bgphasecount, 300 );
+ sealrgb[ 1 ] = Smooth( 64, 0, bgphasecount, 300 );
+ sealrgb[ 2 ] = Smooth( 0, 64, bgphasecount, 300 );
+ }
+ SetCommonData( "BGViewFrom", from );
+ SetCommonData( "BGViewTo", to );
+ SetCommonData( "SealRGB", sealrgb );
+}
+function Stage6BG( let count ){
+ let from = GetCommonData( "BGViewFrom" );
+ let to = GetCommonData( "BGViewTo" );
+ let sealrgb = GetCommonData( "SealRGB" );
+ SetFog( 700, 1000, 0, 0, 0 );
+ SetViewFrom( from[ 0 ], from[ 1 ], from[ 2 ] );
+ SetViewTo( to[ 0 ], to[ 1 ], to[ 2 ] );
+ SetGraphicAngle( 90, 0, count / 2 );
+ SetGraphicRect( 0, 0, 512, 512 );
+ SetTexture( imgMapSeal );
+ SetAlpha( 128 );
+ SetColor( sealrgb[ 0 ], sealrgb[ 1 ], sealrgb[ 2 ] );
+ DrawGraphic3D( 0, -133, -2666 );
+ SetColor( 255, 255, 255 );
+ SetAlpha( 255 );
+ if( GetCommonData( "BGStep" ) <= 1 ){
+ SetGraphicAngle( 180, 0, 0 );
+ let z = -2304;
+ loop( 10 ){
+ let x = -128;
+ loop( 2 ){
+ if( GetCommonData( "BGStep" ) == 0 ){
+ SetGraphicRect( 0, 0, 256, 256 );
+ SetTexture( [ imgMapCandle1, imgMapCandle8 ][ GetCommonDataDefault( "DrawFrameCount", 0 ) % 2 ] );
+ DrawGraphic3D( x, -96, z );
+ }
+ else{ SetGraphicAngle( to[ 2 ], 0, 0 ); }
+ SetGraphicRect( 0, 0, 128, 128 );
+ SetTexture( imgMapLight1 );
+ DrawGraphic3D( x, -36, z );
+ x += 256;
+ }
+ z += 256;
+ }
+ }
+ SetGraphicAngle( 0, 0, 0 );
+}
diff --git a/th_dnh/script/thA/STAGE/EX.dnh b/th_dnh/script/thA/STAGE/EX.dnh
new file mode 100644
index 0000000..d90e15b
--- /dev/null
+++ b/th_dnh/script/thA/STAGE/EX.dnh
@@ -0,0 +1,247 @@
+function GetStageEXBGLoadList(){ return [ imgMapPollEx, imgMapRockEx, imgMapLight1 ]; }
+function GetStageEXRenkoLoadList(){ return [ imgSpellRenko, imgCutInRenko, imgCutInRenkoCry, imgNameRenko, imgEnemyRenko, imgSystemCircleBig ]; }
+task StageEX(){
+ MuteMusic();
+ let loadgraphiclist = [ imgStage[ 6 ] ];
+ loadgraphiclist = loadgraphiclist ~ GetStageEXBGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage5MerryLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStageEXRenkoLoadList();
+ let loadenemylist = [ _enemyBlur, enemyYoseiX01, enemyYoseiX02, enemyYoseiX03, enemyYoseiX04, enemyYoseiX05, enemyYoseiX06, enemyYoseiX07, enemyYoseiX08, enemyYoseiX09, enemyYoseiX10, enemyDollX01 ];
+ StageLoad( DefaultStageLoadGraphicList ~ loadgraphiclist, DefaultStageLoadSEList, loadenemylist );
+ StageEXLoopInit();
+ ForbidBomb( false );
+ ForbidShot( false );
+ SetCommonData( "Result", false );
+ SetCommonData( "Stage", 6 );
+ SetCommonData( "BGStep", 0 );
+ PlayMusicEx( 15 );
+ MusicRelease[ 15 ] = true;
+ CreateSaveData();
+ SaveEx();
+ Wait( 130 );
+ SetCommonData( "StageTitle", true );
+ Wait( 360 );
+ SetCommonData( "StageTitle", false );
+ Wait( 120 );
+ SetCommonData( "BGStep", 1 );
+ Wait( 120 );
+ SetCommonData( "BGStep", 2 );
+// /*
+ Rush1();
+ Wait( 120 );
+ CreateEnemyFromFile( enemyYoseiX03, GetCenterX() + 128, 0, 0, 0, 0 );
+ Wait( 8 );
+ CreateEnemyFromFile( enemyYoseiX03, GetCenterX() + 80, 0, 0, 0, 0 );
+ Wait( 180 );
+ CreateEnemyFromFile( enemyYoseiX03, GetCenterX() - 128, 0, 0, 0, 0 );
+ Wait( 8 );
+ CreateEnemyFromFile( enemyYoseiX03, GetCenterX() - 80, 0, 0, 0, 0 );
+ Wait( 180 );
+ CreateEnemyFromFile( enemyYoseiX03, GetCenterX() + 128, 0, 0, 0, 0 );
+ Wait( 8 );
+ CreateEnemyFromFile( enemyYoseiX03, GetCenterX() + 80, 0, 0, 0, 0 );
+ Wait( 20 );
+ CreateEnemyFromFile( enemyYoseiX04, GetCenterX() - 80, 0, 0, 0, 0 );
+ Wait( 160 );
+ CreateEnemyFromFile( enemyYoseiX03, GetCenterX() - 128, 0, 0, 0, 0 );
+ Wait( 8 );
+ CreateEnemyFromFile( enemyYoseiX03, GetCenterX() - 80, 0, 0, 0, 0 );
+ Wait( 20 );
+ CreateEnemyFromFile( enemyYoseiX04, GetCenterX() + 80, 0, 0, 0, 0 );
+ Wait( 220 );
+ Rush2();
+ Wait( 200 );
+ CreateEnemyBossFromFile( bossMerryX, GetCenterX(), GetCenterY() - 96, 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SaveEx();
+ Wait( 240 );
+ local{
+ ascent( let n in 0..4 ){
+ ascent( let i in 0..3 ){
+ CreateEnemyFromFile( [ enemyYoseiX04, enemyYoseiX07 ][ n == 3 ], GetCenterX() + ( 32 + ( 2 - i ) * 48 ) * [ 1, -1 ][ n % 2 ], 0, 0, 0, [ 0, 1 ][ i == 2 ] );
+ Wait( 6 );
+ }
+ Wait( [ 190, 30 ][ n == 3 ] );
+ }
+ ascent( let i in 0..6 ){
+ CreateEnemyFromFile( enemyYoseiX08, GetCenterX() + 192, GetClipMinY() + 32 + ( i * 96 ) % 128, 0, 0, 128 + sin( i * 320 ) * 80 );
+ Wait( 4 );
+ }
+ }
+ Wait( 100 );
+ local{
+ ascent( let i in 0..2 ){
+ Rush1YoseiBasic( enemyYoseiX09, [ -1, 1 ][ i % 2 ] );
+ Wait( 250 );
+ }
+ }
+ Wait( 180 );
+ DollX1();
+ Wait( 340 );
+ ascent( let l in 0..3 ){
+ ascent( let i in 0..6 ){
+ CreateEnemyFromFile( enemyYoseiX08, GetCenterX() + 192 * [ -1, 1 ][ l % 2 ], GetClipMinY() + 32 + ( i * 96 ) % 128, 0, 0, 128 + sin( i * 320 ) * 80 );
+ Wait( 4 );
+ }
+ Wait( [ 130, 30 ][ l == 2 ] );
+ }
+ ascent( let i in 0..3 ){
+ CreateEnemyFromFile( enemyYoseiX07, GetCenterX() + ( 32 + ( 2 - i ) * 48 ), 0, 0, 0, [ 0, 1 ][ i == 2 ] );
+ Wait( 6 );
+ }
+ Wait( 240 );
+// */
+ local{
+ let xtable = [
+ GetClipMaxX() - 48, GetClipMaxX() - 32, GetClipMinX() + 40, GetCenterX(), GetClipMinX() + 96,
+ GetCenterX() - 16, GetCenterX() + 32, GetClipMinX() + 16, GetClipMaxX() - 16, GetClipMinX() + 16,
+ GetCenterX() - 64, GetCenterX() + 64, GetCenterX(), GetClipMaxX() - 64, GetClipMinX() + 64
+ ];
+ let ytable = [
+ GetClipMinY() + 32, GetClipMinY() + 64, GetClipMinY() + 40, GetClipMinY() + 48, GetClipMinY() + 16,
+ GetClipMinY() + 48, GetClipMinY() + 64, GetClipMinY() + 16, GetClipMinY() + 16, GetClipMinY(),
+ GetClipMinY() + 96, GetClipMinY() + 96, GetClipMinY(), GetClipMinY() + 64, GetClipMinY() + 64
+ ];
+ ascent( let i in 0..15 ){
+ CreateEnemyFromFile( enemyDollX01, xtable[ i ], ytable[ i ], 0, 0, 0 );
+ Wait( 5 );
+ }
+ }
+ Wait( 360 );
+ local{
+ ascent( let i in 0..4 ){
+ Rush1YoseiSide( enemyYoseiX01, [ -1, 1 ][ i % 2 ], 8, i == 3 );
+ Wait( [ 200, 160 ][ i == 2 ] );
+ }
+ }
+ WaitZeroEnemy();
+ Wait( 300 );
+ MusicRelease[ 16 ] = true;
+ CreateSaveData();
+ SaveEx();
+ CreateEnemyBossFromFile( bossRenko, GetCenterX(), GetCenterY() - 96, 0, 0, 0 );
+ WaitZeroEnemy();
+ ReadData();
+ SaveEx();
+ CreateEnemyFromFile( bossRenkoE, -128, -128, 0, 0, 0 );
+ ForbidBomb( true );
+ WaitZeroEnemy();
+ Clear();
+ function Rush2(){
+ ascent( let i in 0..2 ){
+ Rush1YoseiSide( [ enemyYoseiX05, enemyYoseiX06 ][ i % 2 ], [ -1, 1 ][ i % 2 ], [ 12, 8 ][ i % 2 ], false );
+ Wait( [ 260, 160 ][ i % 2 ] );
+ }
+ }
+ function Rush1(){
+ ascent( let i in 0..4 ){
+ Rush1YoseiSide( enemyYoseiX01, [ -1, 1 ][ i % 2 ], 12, false );
+ Wait( [ 120, 100 ][ i == 3 ] );
+ Rush1YoseiBasic( enemyYoseiX02, [ 1, -1 ][ i % 2 ] );
+ Wait( [ 260, 200 ][ i == 2 ] );
+ }
+ }
+ task Rush1YoseiSide( let file, let dir, let num, let ex ){
+ ascent( let i in 0..num ){
+ CreateEnemyFromFile( [ file, enemyYoseiX10 ][ ex && i == num - 1 ], GetCenterX() + 192 * dir, GetClipMinY() + 32 + ( i * 96 ) % 224, 0, 0, 128 + sin( i * 320 ) * 80 );
+ Wait( 20 );
+ }
+ }
+ task Rush1YoseiBasic( let file, let dir ){
+ ascent( let argv in 0..12 ){
+ Wait( 10 );
+ CreateEnemyFromFile( file, GetCenterX() + argv * 444 * dir % 192, 0, 0, 0, argv );
+ Wait( 10 );
+ }
+ }
+ task DollX1(){
+ let start = GetCommonData( "NowCount" );
+ ascent( let i in 0..2 ){
+ loop( 3 ){
+ CreateEnemyFromFile(
+ enemyDollX01, GetCenterX() + sin( ( GetCommonData( "NowCount" ) - start ) * 5 ) * 128, GetCenterY() - 128 + cos( ( GetCommonData( "NowCount" ) - start ) * 2 ) * 64, 0, 0, 0
+ );
+ Wait( 86 );
+ }
+ loop( 2 ){
+ CreateEnemyFromFile(
+ enemyDollX01, GetCenterX() + sin( ( GetCommonData( "NowCount" ) - start ) * 5 ) * 128, GetCenterY() - 128 + cos( ( GetCommonData( "NowCount" ) - start ) * 2 ) * 64, 0, 0, 0
+ );
+ Wait( 43 );
+ }
+ }
+ }
+}
+function StageEXLoopInit(){
+ ClearBGEffect();
+ SetCommonData( "PrevBG", [ 0, 0 ] );
+ SetCommonData( "BGViewTo", [ 0, 0, 0 ] );
+}
+function StageEXLoop( let count ){
+ let speed = [ 0.8, 0.4, 4, 3 ];
+ let step = GetCommonDataDefault( "BGStep", 0 );
+ let prev = GetCommonData( "PrevBG" );
+ let to = GetCommonData( "BGViewTo" );
+ if( step != prev[ 0 ] ){
+ prev = [ step, count ];
+ SetCommonData( "PrevBG", prev );
+ }
+ let bgphasecount = count - prev[ 1 ];
+ to[ 2 ] = to[ 2 ] - Smooth( speed[ Max( step - 1, 0 ) ], speed[ step ], bgphasecount, 150 );
+ if( step == 2 ){ to[ 0 ] = SlowDown( 0, -66, bgphasecount, 100 ); }
+ SetCommonData( "BGViewTo", to );
+}
+function StageEXBG( let count ){
+ let to = GetCommonData( "BGViewTo" );
+ SetFog( Smooth( 0, 700, count, 150 ), Smooth( 0, 1000, count, 300 ), 16, 0, 32 );
+ SetPerspectiveClip( 10, 2000 );
+ SetViewFrom( 500, 90, 20 );
+ SetViewTo( to[ 0 ], to[ 1 ], to[ 2 ] );
+ SetTexture( imgMapBlack );
+ SetGraphicRect( 0, 0, 512, 512 );
+ SetGraphicScale( 10, 10 );
+ SetGraphicAngle( 0, 0, 0 );
+ DrawGraphic3D( 0, 0, to[ 2 ] - 1400 );
+ SetGraphicAngle( 90, 0, 0 );
+ DrawGraphic3D( 0, -500, to[ 2 ] );
+ SetGraphicScale( 1, 1 );
+ SetColor( 192, 160, 255 );
+ local{
+ let z = truncEx( to[ 2 ], 512 ) - 1536;
+ loop( [ 4, 5 ][ count < 300 ] ){
+ SetTexture( imgMapBlack );
+ SetGraphicRect( 0, 0, 512, 512 );
+ SetGraphicAngle( -10, 90, 0 );
+ SetGraphicScale( 1, 3 );
+ DrawGraphic3D( 103, -50, z );
+ SetGraphicScale( 1, 1 );
+ SetTexture( imgMapRockEx );
+ SetGraphicRect( 0, 0, 512, 512 );
+ SetGraphicAngle( -10, 90, 0 );
+ DrawGraphic3D( 100, -50, z );
+ SetTexture( imgMapLight1 );
+ SetAlpha( [ 255, 224 ][ count % 2 ] );
+ SetGraphicRect( 0, 0, 128, 128 );
+ SetGraphicAngle( 0, 0, 0 );
+ DrawGraphic3D( 70, -50, z );
+ z += 512;
+ }
+ }
+ local{
+ SetTexture( imgMapPollEx );
+ SetGraphicRect( 0, 0, 512, 48 );
+ let z = truncEx( to[ 2 ], 512 ) - 1344;
+ loop( [ 4, 5 ][ count < 300 ] ){
+ SetGraphicAngle( 0, 0, 20 );
+ DrawGraphic3D( -160, 0, z );
+ SetGraphicScale( 3, 1 );
+ SetGraphicAngle( 30, 0, 85 );
+ DrawGraphic3D( -200, -100, z - 130 );
+ SetGraphicScale( 1, 1 );
+ z += 512;
+ }
+ }
+ SetColor( 255, 255, 255 );
+ SetGraphicAngle( 0, 0, 0 );
+}
diff --git a/th_dnh/script/thA/STAGE/Spell.dnh b/th_dnh/script/thA/STAGE/Spell.dnh
new file mode 100644
index 0000000..94f3676
--- /dev/null
+++ b/th_dnh/script/thA/STAGE/Spell.dnh
@@ -0,0 +1,98 @@
+task SpellPractice( let code ){
+ MuteMusic();
+ let current = GetCurrentScriptDirectory();
+ let SpellFile = [
+ current ~ "Alice1S.dnh", current ~ "Alice2S.dnh", current ~ "Sakuya1S.dnh", current ~ "Sakuya2S.dnh", current ~ "Sakuya3S.dnh",
+ current ~ "Letty1S.dnh", current ~ "Lily1S.dnh", current ~ "Lily2S.dnh", current ~ "Lily3S.dnh", current ~ "Lily4S.dnh",
+ current ~ "LeilaB1S.dnh", current ~ "LeilaB2S.dnh", current ~ "LeilaB3S.dnh", current ~ "LeilaB4S.dnh", current ~ "LeilaB5S.dnh",
+ current ~ "MerryA1S.dnh", current ~ "MerryB1S.dnh", current ~ "MerryB2S.dnh", current ~ "MerryB3S.dnh", current ~ "MerryB4S.dnh",
+ current ~ "MerryC1S.dnh", current ~ "CavedA1S.dnh", current ~ "CavedA2S.dnh", current ~ "CavedA3S.dnh", current ~ "CavedA4S.dnh",
+ current ~ "CavedA5S.dnh", current ~ "CavedB1S.dnh"
+ ];
+ let SpellEXFile = [
+ current ~ "MerryX1S.dnh", current ~ "MerryX2S.dnh",
+ current ~ "Renko1S.dnh", current ~ "Renko2S.dnh", current ~ "Renko3S.dnh", current ~ "Renko4S.dnh", current ~ "Renko5S.dnh",
+ current ~ "Renko6S.dnh", current ~ "Renko7S.dnh", current ~ "Renko8S.dnh", current ~ "Renko9S.dnh", current ~ "Renko10S.dnh",
+ ];
+ let bgm;
+ let stage;
+ let codediv = trunc( code / 4 );
+ let loadgraphiclist = SpellPracticeDefaultLoadGraphicList;
+ if( codediv < 2 ) { bgm = 3; stage = 0; }
+ if( codediv >= 2 && codediv < 5 ) { bgm = 5; stage = 1; }
+ if( codediv == 5 ) { bgm = 6; stage = 2; }
+ if( codediv >= 6 && codediv < 10 ) { bgm = 7; stage = 2; }
+ if( codediv >= 10 && codediv < 15 ) { bgm = 9; stage = 3; }
+ if( codediv == 15 ) { bgm = 10; stage = 4; }
+ if( codediv >= 16 && codediv < 20 ) { bgm = 11; stage = 4; }
+ if( codediv == 20 ) { bgm = 12; stage = 5; }
+ if( codediv >= 21 && codediv < 26 ) { bgm = 13; stage = 5; }
+ if( codediv == 26 ) { bgm = 14; stage = 5; }
+ if( code >= 108 && code < 110 ) { bgm = 15; stage = 6; }
+ if( code >= 110 ) { bgm = 16; stage = 6; }
+ alternative( stage )
+ case( 0 ){
+ Stage1LoopInit();
+ loadgraphiclist = loadgraphiclist ~ GetStage1BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage1AliceLoadList();
+ }
+ case( 1 ){
+ Stage2LoopInit();
+ loadgraphiclist = loadgraphiclist ~ GetStage2BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage2SakuyaLoadList();
+ }
+ case( 2 ){
+ Stage3LoopInit();
+ loadgraphiclist = loadgraphiclist ~ GetStage3BGLoadList();
+ alternative( bgm )
+ case( 6 ){ loadgraphiclist = loadgraphiclist ~ GetStage3LettyLoadList(); }
+ case( 7 ){ loadgraphiclist = loadgraphiclist ~ GetStage3LilyLoadList(); }
+ }
+ case( 3 ){
+ Stage4LoopInit();
+ loadgraphiclist = loadgraphiclist ~ GetStage4BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage4LeilaLoadList();
+ }
+ case( 4 ){
+ Stage5LoopInit();
+ loadgraphiclist = loadgraphiclist ~ GetStage5BGLoadList();
+ loadgraphiclist = loadgraphiclist ~ GetStage5MerryLoadList();
+ }
+ case( 5 ){
+ Stage6LoopInit();
+ loadgraphiclist = loadgraphiclist ~ GetStage6BGLoadList();
+ alternative( bgm )
+ case( 12 ){ loadgraphiclist = loadgraphiclist ~ GetStage5MerryLoadList(); }
+ case( 13, 14 ){
+ loadgraphiclist = loadgraphiclist ~ GetStage6KeneLoadList();
+ }
+ alternative( codediv )
+ case( 22 ){ loadgraphiclist = loadgraphiclist ~ imgEnemyPhoenix; }
+ case( 23 ){ loadgraphiclist = loadgraphiclist ~ imgEnemySense; }
+ case( 24 ){ loadgraphiclist = loadgraphiclist ~ imgEnemyBat; }
+ }
+ case( 6 ){
+ StageEXLoopInit();
+ loadgraphiclist = loadgraphiclist ~ GetStageEXBGLoadList();
+ alternative( bgm )
+ case( 15 ){ loadgraphiclist = loadgraphiclist ~ GetStage5MerryLoadList(); }
+ case( 16 ){ loadgraphiclist = loadgraphiclist ~ GetStageEXRenkoLoadList(); }
+ }
+ StageLoad( loadgraphiclist, DefaultStageLoadSEList, [ _enemyBlur ] );
+ ForbidShot( false );
+ SetCommonData( "Stage", stage );
+ SetCommonData( "BGStep", 0 );
+ PlayMusicEx( bgm );
+ Wait( 60 );
+ CreateSaveData();
+ CreateEnemyFromFile( _enemyConcentrate, GetCenterX(), GetClipMinY() + 96, 0, 0, 0 );
+ WaitZeroEnemy();
+ if( codediv < 27 ){ CreateEnemyBossFromFile( SpellFile[ codediv ], GetCenterX(), GetClipMinY() + 96, 0, 0, 0 ); }
+ else{ CreateEnemyBossFromFile( SpellEXFile[ code - 108 ], GetCenterX(), GetClipMinY() + 96, 0, 0, 0 ); }
+ WaitZeroEnemy();
+ PlaySEEx( seBossExplode );
+ SetCommonData( "ShowName", -1 );
+ Wait( 250 );
+ Clear();
+ return;
+}
diff --git a/th_dnh/script/thA/STAGE/index.dnh b/th_dnh/script/thA/STAGE/index.dnh
new file mode 100644
index 0000000..b48687a
--- /dev/null
+++ b/th_dnh/script/thA/STAGE/index.dnh
@@ -0,0 +1,8 @@
+#include_function ".\STAGE\1.dnh"
+#include_function ".\STAGE\2.dnh"
+#include_function ".\STAGE\3.dnh"
+#include_function ".\STAGE\4.dnh"
+#include_function ".\STAGE\5.dnh"
+#include_function ".\STAGE\6.dnh"
+#include_function ".\STAGE\EX.dnh"
+#include_function ".\STAGE\Spell.dnh"
diff --git a/th_dnh/script/thA/Sakuya.dnh b/th_dnh/script/thA/Sakuya.dnh
new file mode 100644
index 0000000..1494cb3
--- /dev/null
+++ b/th_dnh/script/thA/Sakuya.dnh
@@ -0,0 +1,11 @@
+#ScriptPathData
+#ScriptPath[.\Sakuya0.dnh]
+#ScriptPath[.\Sakuya1.dnh]
+#ScriptPath[.\Sakuya1S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Sakuya2.dnh]
+#ScriptPath[.\Sakuya2S.dnh]
+#ScriptNextStep
+#ScriptPath[.\Sakuya3_.dnh]
+#ScriptPath[.\Sakuya3S.dnh]
+#EndScriptPathData
diff --git a/th_dnh/script/thA/Sakuya0.dnh b/th_dnh/script/thA/Sakuya0.dnh
new file mode 100644
index 0000000..717d43b
--- /dev/null
+++ b/th_dnh/script/thA/Sakuya0.dnh
@@ -0,0 +1,97 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let bgm = false;
+ task Behavior(){
+ yield;
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 8 );
+ CreateEventFromScript( "Talk" );
+ while( GetEventStep() != 1 ){ yield; }
+ PlayMusicEx( 5 );
+ Wait( 30 );
+ bgm = true;
+ }
+ @Initialize{
+ SetLife( 1 );
+ DeleteEnemyShotToItem( ALL );
+ SetDamageRate( 0, 0 );
+ SetX( -64 );
+ SetY( GetCenterY() );
+ SetEnemyMarker( true );
+ Behavior();
+ SetCommonData( "ShowName", 3 );
+ }
+ @MainLoop{
+ if( !OnEvent() && bgm ){ AddLife( -1 ); }
+ SEShotHit( seDamage, count );
+ Collision( 32, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{ DrawBossChr( imgEnemySakuya, 1, 1, 44, 86, count ); }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( RIGHT, imgCutInSakuya );
+ SetGraphicRect( RIGHT, 1, 1, 192, 320 );
+ Enemy();
+ TextOut( "\c[RED]ちょっと待ちな。" );
+ SetNameFromTexture( RIGHT, imgNameSakuya );
+ TextOut( "\c[RED]あんた、またウチで\nろくでもないことやらかす気ね?" );
+ SetChar( LEFT, imgCutInReimu );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ Player();
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]おあいにくさま。今日は用ないわよ" );
+ Enemy();
+ TextOut( "\c[RED]あんたが外で弾幕散らす騒音が\n中まで聞こえてくるのよ" );
+ DeleteName( RIGHT );
+ TextOut( "\c[RED]今すぐ帰るか\nこの場で掃除されるか選びなさい" );
+ SetChar( LEFT, imgCutInReimu5 );
+ Player();
+ TextOut( "\c[BLUE]飛び越えて先へ進む選択肢はないのね?" );
+ SetChar( LEFT, imgCutInReimu );
+ TextOut( "\c[BLUE]大体、外の掃除は\n中国っぽい人の仕事じゃない?" );
+ Enemy();
+ TextOut( "\c[RED]あれが余りに使えないから\n私が掃除しに来たのよ" );
+ TextOut( "\c[RED]それにあれは人じゃないわ" );
+ SetStep( 1 );
+ TextOut( "\c[RED]さっき滅多刺しにして来たけど\nそれでも死ななかったし" );
+ Player();
+ SetChar( LEFT, imgCutInReimu4 );
+ TextOut( "\c[BLUE]・・・戦う気満々ね。\n不死身の方が掃除人には向いてそうだけど" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( RIGHT, imgCutInSakuya );
+ SetGraphicRect( RIGHT, 1, 1, 192, 320 );
+ Enemy();
+ TextOut( "\c[RED]ちょっと待ちな。" );
+ SetNameFromTexture( RIGHT, imgNameSakuya );
+ TextOut( "\c[RED]あんた、またウチで\nろくでもないことやらかす気ね?" );
+ SetChar( LEFT, imgCutInMarisa4 );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ Player();
+ TextOut( "\c[BLUE]あー、さっきの中国っぽいやつの\n敵討ちでもしたいのか?" );
+ Enemy();
+ TextOut( "\c[RED]あんなのはどうでもいいわ。" );
+ DeleteName( RIGHT );
+ TextOut( "\c[RED]ただ、少々あんたがやかましいから\nお掃除しに来ただけに過ぎない" );
+ Player();
+ SetChar( LEFT, imgCutInMarisa );
+ TextOut( "\c[BLUE]館の中の掃除は済んだのか?" );
+ Enemy();
+ TextOut( "\c[RED]あんたが外で弾幕散らす騒音が中まで\n聞こえてきて掃除に集中できやしないわ" );
+ TextOut( "\c[RED]と、言うわけで\n先に掃除されてもらおうかしら" );
+ Player();
+ TextOut( "\c[BLUE]あぁいいぜ。あんたを倒して後は魔砲で\nきれいさっぱり掃除しといてやるよ。" );
+ SetStep( 1 );
+ TextOut( "\c[BLUE]ナイフと違って回収する手間も省けて楽だぜ" );
+ Enemy();
+ TextOut( "\c[RED]今は低燃費の時代よ" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/Sakuya1.dnh b/th_dnh/script/thA/Sakuya1.dnh
new file mode 100644
index 0000000..bb9eb85
--- /dev/null
+++ b/th_dnh/script/thA/Sakuya1.dnh
@@ -0,0 +1,121 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ let uniquestr = "G_SAKUYA1";
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ Wait( 120 );
+ let pattern = 0;
+ while( 1 ){
+ let limit = [ 60, 120 ][ trunc( Level / 2 ) ];
+ let angle = -limit;
+ while( angle <= limit ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 1, angle + GetAngleToPlayer(), pattern );
+ angle += [ 120, 80 ][ trunc( Level / 2 ) ];
+ }
+ PlaySEEx( seShadow );
+ Wait( 60 );
+ SetShotDirectionType( PLAYER );
+ let speed = 1;
+ loop( [ 1, 2 ][ Level == 3 ] ){
+ CircleShot01( [ 60, 10, 6, 8 ][ Level ], speed, GREEN12, 10 );
+ speed += 0.3;
+ }
+ Wait( 30 );
+ loop( 4 ){
+ if( Level != 0 ){
+ SetShotDirectionType( PLAYER );
+ let speed = 1.2;
+ loop( 3 ){
+ WayShot01( 6, 3, speed, RED32, 5 );
+ speed += 0.2;
+ }
+ PlaySEEx( seShot2 );
+ }
+ Wait( 45 );
+ }
+ ExMove( false, count );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2000 );
+ SetTimer( 60 );
+ SetInvincibility( 30 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ TaskShadowInterface( uniquestr, [ -1, 12 ][ count > 130 ] );
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 20 );
+ count++;
+ }
+ @Finalize{ ReleaseShadowInterface( uniquestr ); }
+ @DrawLoop{ DrawBossChr( imgEnemySakuya, 1, 1, 44, 86, count ); }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = "G_SAKUYA1";
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let Argv = GetArgument();
+ task SpellShot( let angle ){
+ let obj = Obj_Create( OBJ_SHOT );
+ Obj_SetX( obj, GetX() );
+ Obj_SetY( obj, GetY() );
+ Obj_SetSpeed( obj, 16 );
+ Obj_SetAngle( obj, angle );
+ Obj_SetAlpha( obj, 0 );
+ Obj_SetCollisionToPlayer( obj, false );
+ Wait( 3 );
+ SetShotDirectionType( ABSOLUTE );
+ let speed = 1;
+ loop( Min( Level + 1, 2 ) ){
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), speed, Obj_GetAngle( obj ) + [ 160, 90 ][ IsHidden() ], [ BLUE31, PURPLE31 ][ IsHidden() ], 3 );
+ speed += 0.3;
+ }
+ PlaySEEx( seShot1 );
+ Obj_Delete( obj );
+ }
+ task Behavior(){
+ Wait( 60 );
+ let pattern = 0;
+ loop{
+ Wait( 8 );
+ SetShotDirectionType( PLAYER );
+ let angle = rand( 0, 360 );
+ let limit = [ 4, 5, 5, 6 ][ Level ];
+ let gap = -limit;
+ while( gap <= limit ){
+ SpellShot( angle + gap );
+ gap += 2;
+ }
+ if( IsOut( -16 ) || GetY() > GetCenterY() + 80 ){ return; }
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 222 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DestructShadow( 68 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleGreen, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Sakuya1S.dnh b/th_dnh/script/thA/Sakuya1S.dnh
new file mode 100644
index 0000000..3cffcac
--- /dev/null
+++ b/th_dnh/script/thA/Sakuya1S.dnh
@@ -0,0 +1,70 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let BlackOutCount = -100;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ let pattern = 0;
+ while( 1 ){
+ Concentration01( [ 50, 120 ][ pattern < 3 ] );
+ PlaySEEx( sePower1 );
+ Wait( [ 50, 120 ][ pattern < 3 ] );
+ descent( let i in 0..5 ){
+ let color = [ BLUE32, RED32 ][ i % 2 ];
+ let dir = [ 1, -1 ][ i % 2 ];
+ let angle = 0;
+ while( angle < 360 ){
+ let firstangle = angle;
+ CreateShotA( 0, GetX(), GetY(), 10 );
+ SetShotDataA( 0, 0, 6, firstangle, 0, -0.03, 3, color );
+ SetShotDataA( 0, 5 + i * 5, 0, firstangle + [ 10, 30, 60, 90, 120, 160 ][ pattern % 6 ] * dir, 0, 0, 0, color );
+ SetShotDataA( 0, 30 + i * 5, 1, NULL, 0, 0.1, 2, color );
+ FireShot( 0 );
+ angle += [ 20, 12, 8, 6 ][ Level ];
+ }
+ PlaySEEx( seShot1 );
+ Wait( 5 );
+ }
+ Wait( 10 );
+ if( pattern % 3 == 2 ){ ExMove( false, count ); }
+ BlackOutCount = count;
+ TimeStop( 20, 1, 0, 1 );
+ MotionBlur( SHOT, 20, 244 );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 398 );
+ SetScore( 880000 );
+ SetTimer( 65 );
+ SetInvincibility( 130 );
+ SetDamageRate( 18, 5 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 3 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 2, imgCutInSakuya, 192, 320 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 20 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 8 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{ DrawBossChr( imgEnemySakuya, 1, 1, 44, 86, count ); }
+ @BackGround{ SakuyaBG( imgSpellRotateStone, imgSpellBlood, BlackOutCount, 20, count ); }
+}
diff --git a/th_dnh/script/thA/Sakuya2.dnh b/th_dnh/script/thA/Sakuya2.dnh
new file mode 100644
index 0000000..c41ba90
--- /dev/null
+++ b/th_dnh/script/thA/Sakuya2.dnh
@@ -0,0 +1,54 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 180 );
+ let pattern = 0;
+ let speed = 2.7;
+ loop{
+ ascent( let i in 0..3 ){
+ loop( 8 ){
+ let angle = 0;
+ while( angle < 360 ){
+ CreateShotA( 0, GetX(), GetY(), 0 );
+ SetShotDataA( 0, 0, speed, angle + GetAngleToPlayer(), 0, 0, speed, RED32 );
+ ascent( let j in 0..10 ){
+ CreateShotA( 1, 0, 0, 0 );
+ SetShotDataA( 1, 0, 0, angle + GetAngleToPlayer() + [ 0, -20, 20 ][ i ] * ( pattern + 1 ), 0, 0, 0, PURPLE32 );
+ SetShotDataA( 1, 100, NULL, NULL, 0, 0.02, 3, PURPLE32 );
+ AddShot( 30 + j * 20, 0, 1, 0 );
+ }
+ FireShot( 0 );
+ angle += [ 60, 45, 30, 20 ][ Level ];
+ }
+ PlaySEEx( seShot1 );
+ Wait( 12 );
+ }
+ ExMove( false, count );
+ Wait( [ 60, 24, 140 - Level * 10 ][ i ] );
+ }
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 2400 );
+ SetTimer( 55 );
+ SetInvincibility( 30 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 20 );
+ count++;
+ }
+ @DrawLoop{ DrawBossChr( imgEnemySakuya, 1, 1, 44, 86, count ); }
+}
diff --git a/th_dnh/script/thA/Sakuya2S.dnh b/th_dnh/script/thA/Sakuya2S.dnh
new file mode 100644
index 0000000..771804f
--- /dev/null
+++ b/th_dnh/script/thA/Sakuya2S.dnh
@@ -0,0 +1,87 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let BlackOutCount = -100;
+ let FreezeTime = 150;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 120 );
+ SetShotDirectionType( PLAYER );
+ let pattern = 0;
+ while( 1 ){
+ ascent( let i in 0..365 ){
+ let color = [ BLUE32, YELLOW32 ][ i % 2 ];
+ let speed = rand( 0.5, 5 );
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, speed, rand( 60, 300 ), 0, -speed / 120, 0, color );
+ SetShotDataA( 0, 50, 0, NULL, 0, 0, 0, color );
+ SetShotDataA( 0, 170, 0, NULL, 10 * [ 1, -1 ][ i % 2 ], 0, 0, color );
+ SetShotDataA( 0, 190 + Smooth( 0, 120 + 18 * Level, i, 365 ), [ 3, 4, 5, 4 ][ Level ] + Smooth( 0, 4, i, 180 ), 0, 0, 0.1, 16, color );
+ FireShot( 0 );
+ }
+ PlaySEEx( seShot1 );
+ Wait( 50 );
+ BlackOutCount = count;
+ TimeStop( FreezeTime, 1, 0, 1 );
+ MotionBlur( SHOT, FreezeTime, 192 );
+ Concentration01( 130 );
+ PlaySEEx( sePower1 );
+ Wait( 150 );
+ ExMove( false, count );
+ loop( 6 ){
+ loop( [ 2, 5, 8, 8 ][ Level ] ){
+ let speed = rand( 1, 1.8 ) * [ 1, 1.5 ][ Level == 3 ];
+ let angle = GetAngleToPlayer() + rand( -80, 80 );
+ ascent( let i in 0..2 ){ RandShot( speed / [ 1, 2 ][ i ], angle, [ GREEN04, RED01 ][ i ] ); }
+ }
+ PlaySEEx( seShot2 );
+ Wait( 20 );
+ }
+ pattern++;
+ }
+ }
+ task RandShot( let speed, let angle, let color ){
+ let obj = SetShotObject( GetX(), GetY(), speed, angle, color, 5 );
+ while( !Obj_BeDeleted( obj ) ){
+ if( BlackOutCount + 1 == count ){ Obj_SetSpeed( obj, 0 ); }
+ if( BlackOutCount + FreezeTime == count ){
+ let gap = [ 0, 1, 8, 10 ][ Level ];
+ Obj_SetSpeed( obj, speed );
+ Obj_SetAngle( obj, Obj_GetAngle( obj ) + RandBlur( gap ) );
+ }
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 398 );
+ SetScore( 1200000 );
+ SetTimer( 75 );
+ SetInvincibility( 130 );
+ SetDamageRate( 20, 8 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 128, 20, 2.5 );
+ SetEffectForZeroLife( 1, 0, 0 );
+ SetCommonData( "ShowName", 3 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 3, imgCutInSakuya, 192, 320 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 20 );
+ yield;
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 12 + Level );
+ EndSpell();
+ DropItem( 10, 64 );
+ }
+ @DrawLoop{ DrawBossChr( imgEnemySakuya, 1, 1, 44, 86, count ); }
+ @BackGround{ SakuyaBG( imgSpellRotateStone, imgSpellBlood, BlackOutCount, 150, count ); }
+}
diff --git a/th_dnh/script/thA/Sakuya3S.dnh b/th_dnh/script/thA/Sakuya3S.dnh
new file mode 100644
index 0000000..89392ff
--- /dev/null
+++ b/th_dnh/script/thA/Sakuya3S.dnh
@@ -0,0 +1,68 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let BlackOutCount = -100;
+ let FreezeTime = 150;
+ let PrevTime = GetTimer();
+ task Behavior(){
+ Wait( 90 );
+ SetShotDirectionType( PLAYER );
+ while( 1 ){
+ loop( rand_int( 1, 4 ) ){
+ ascent( let i in 0..4 ){
+ let angle = RandBlur( [ [ 100, 180 ][ trunc( Level / 2 ) ], 5 ][ trunc( i / 2 ) ] );
+ let x = GetX() + RandBlur( 48 );
+ let y = GetY() + RandBlur( 48 );
+ alternative( i % 2 )
+ case( 0 ){
+ loop( [ 3, 5, 5, 6 ][ Level ] ){
+ let speed = rand( 6, 10 );
+ CreateShot02( x, y, speed, angle + RandBlur( 8 ), -speed / 30, speed / 6, BLUE32, 10 );
+ }
+ }
+ case( 1 ){
+ let speed = rand( 6, 10 );
+ CircleShot02( [ 90, 60, 45, 20 ][ Level ], speed, -speed / 30, speed / 6, BLUE32, 10 );
+ }
+ PlaySEEx( seShot3 );
+ if( GetLife() <= 0 ){ return; }
+ Wait( [ 15, 12, 8, 5 ][ Level ] );
+ }
+ }
+ Wait( 10 );
+ }
+ }
+ @Initialize{
+ SetLife( 398 );
+ SetScore( 639800 );
+ SetTimer( 50 );
+ SetInvincibility( 130 );
+ SetDamageRate( 20, 24 );
+ SetEffectForZeroLife( [ 60, 1 ][ GetCommonDataDefault( "SpellPractice", false ) ], 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 128, 20, 2.5 );
+ SetCommonData( "ShowName", 3 );
+ if( GetCommonDataDefault( "SpellPractice", false ) ){ LastSpell(); }
+ StartSpell( 4, imgCutInSakuya, 192, 320 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "SpellBonus", [ GetSpellCardBonusScore(), count ] );
+ if( PrevTime != GetTimer() ){
+ PrevTime = GetTimer();
+ if( GetTimer() < 10 ){ PlaySEEx( seTimeOut ); }
+ }
+ if( count > 180 && count % [ 50, 30 ][ GetTimer() < 30 ] == 0 ){ ExMove( true, count ); }
+ if( GetLife() <= 0 ){ if( count % 15 == 0 ){ PlaySEEx( seShot1 ); } }
+ else{ yield; }
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 20 );
+ count++;
+ }
+ @Finalize{
+ CreateSpellResult( 16 + Level );
+ EndSpell();
+ }
+ @DrawLoop{ DrawBossChr( imgEnemySakuya, 1, 1, 44, 86, count ); }
+ @BackGround{ SakuyaBG( imgSpellRotateStone, imgSpellBlood, BlackOutCount, 150, count ); }
+}
diff --git a/th_dnh/script/thA/Sakuya3_.dnh b/th_dnh/script/thA/Sakuya3_.dnh
new file mode 100644
index 0000000..a79a544
--- /dev/null
+++ b/th_dnh/script/thA/Sakuya3_.dnh
@@ -0,0 +1,23 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ Wait( 60 );
+ AddLife( -1 );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetInvincibility( 120 );
+ SetDamageRate( 0, 0 );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + 96, 20, 2.5 );
+ SetEnemyMarker( true );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHitBoss( seDamage, count );
+ Collision( 32, 0 );
+ yield;
+ count++;
+ }
+ @DrawLoop{ DrawBossChr( imgEnemySakuya, 1, 1, 44, 86, count ); }
+}
diff --git a/th_dnh/script/thA/SakuyaE.dnh b/th_dnh/script/thA/SakuyaE.dnh
new file mode 100644
index 0000000..7ddd6bc
--- /dev/null
+++ b/th_dnh/script/thA/SakuyaE.dnh
@@ -0,0 +1,59 @@
+script_enemy_main{
+#include_function ".\FUNC\Boss.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ PlaySEEx( seBossExplode );
+ CreateEventFromScript( "Talk" );
+ while( GetEventStep() != 1 ){ yield; }
+ SetCommonData( "Result", true );
+ let clear = 20000000;
+ let point = GetPoint() * 50000 - GetCommonDataDefault( "ResultPoint", 0 );
+ let graze = GetGraze() * 500 - GetCommonDataDefault( "ResultGraze", 0 );
+ let rank = [ 50, 100, 120, 150 ][ GetCommonDataDefault( "Level", 1 ) ];
+ let total = ( clear + point + graze ) * ( rank / 100 );
+ SetCommonData( "ResultClear", clear );
+ SetCommonData( "ResultPoint", point );
+ SetCommonData( "ResultGraze", graze );
+ SetCommonData( "ResultRank", rank );
+ SetCommonData( "ResultTotal", total );
+ AddScore( total );
+ }
+ @Initialize{
+ SetLife( 1 );
+ SetX( -128 );
+ SetY( -128 );
+ LoadSE( seBossExplode );
+ ForbidBomb( true );
+ ForbidShot( true );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( !OnEvent() ){ VanishEnemy(); }
+ }
+}
+script_event Talk{
+#include_function ".\FUNC\Event.dnh"
+ @MainLoop{
+ alternative( GetPlayerType() )
+ case( REIMU_A, REIMU_B ){
+ SetChar( LEFT, imgCutInReimu3 );
+ SetGraphicRect( LEFT, 1, 1, 192, 320 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]ほらあんたは中の掃除でも\nしてた方がいいじゃない" );
+ SetChar( LEFT, imgCutInReimu );
+ SetStep( 1 );
+ TextOut( "\c[BLUE]今頃魔理沙が入り込んでお嬢様は気化して\n妹様は破壊の限りを尽くしてるわ、きっと" );
+ }
+ case( MARISA_A, MARISA_B ){
+ SetChar( LEFT, imgCutInMarisa );
+ SetGraphicRect( LEFT, 1, 1, 192, 296 );
+ MoveChar( LEFT, FRONT );
+ TextOut( "\c[BLUE]さて、面倒だけど紅魔館の掃除でもするか\n茶摘みして帰ってきてからだけどな" );
+ SetStep( 1 );
+ TextOut( "\c[BLUE]あぁ、おまけに帰る頃には\n忘れてるかもしれないけどな" );
+ }
+ End();
+ }
+}
diff --git a/th_dnh/script/thA/UserGraphicShot.dnh b/th_dnh/script/thA/UserGraphicShot.dnh
new file mode 100644
index 0000000..dd0a28b
--- /dev/null
+++ b/th_dnh/script/thA/UserGraphicShot.dnh
@@ -0,0 +1,10 @@
+#UserShotData
+
+ShotImage = ".\IMAGE\SYSTEM\UserShot.png"
+
+ShotData{
+ id = 1
+ render = ALPHA
+ rect = ( 0, 0, 20, 20 )
+ delay_color = ( 153, 153, 153 )
+}
diff --git a/th_dnh/script/thA/Yosei01.dnh b/th_dnh/script/thA/Yosei01.dnh
new file mode 100644
index 0000000..edc7b9a
--- /dev/null
+++ b/th_dnh/script/thA/Yosei01.dnh
@@ -0,0 +1,52 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() < GetCenterX() ];
+ SetMovePosition03( GetX() + ( GetCommonDataDefault( "GlobalCount", count ) % 32 + 64 ) * dir, Max( GetPlayerY() / [ 3, 2 ][ Argv % 2 ], GetClipMinY() + 8 ), 20, Smooth( 1, [ 3, 5 ][ Argv % 2 ], GetPlayerY(), GetClipMaxY() ) );
+ WaitZeroSpeed();
+ if( Level == 3 ){
+ SetShotDirectionType( ABSOLUTE );
+ WayShotGap01( 45, 15, 0.6, AQUA05, 5, 90 );
+ WayShotGap01( 6, 2, 1, AQUA05, 5, 90 );
+ PlaySEEx( seShot2 );
+ }
+ SetMovePosition03( GetX() - 12 * dir, GetY() + 8, 20, 0.5 );
+ WaitZeroSpeed();
+ Wait( 20 );
+ SetShotDirectionType( PLAYER );
+ let speed = 1;
+ loop( [ 0, 1, 3, 5 ][ Level ] ){
+ if( Level == 3 ){ WayShot01( 15, 15, speed, WHITE05, 5 ); }
+ else{ CreateShot01( GetX(), GetY(), speed, dir * 2, WHITE05, 5 ); }
+ speed += 0.8;
+ }
+ if( Level != 0 ){ PlaySEEx( seShot1 ); }
+ SetAngle( [ 150, 30 ][ GetX() < GetCenterX() ] );
+ while( GetSpeed() < 2 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 10 );
+ SetDamageRate( 0, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 3 ){ SetDamageRate( 100, 100 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ if( count > 180 || Argv % 3 == 0 ){ DropItem( 1, 8 ); } }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei1, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei02.dnh b/th_dnh/script/thA/Yosei02.dnh
new file mode 100644
index 0000000..878f6a2
--- /dev/null
+++ b/th_dnh/script/thA/Yosei02.dnh
@@ -0,0 +1,50 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ SetMovePosition03( GetX(), GetClipMinY() + 96, 20, 4 );
+ WaitZeroSpeed();
+ let speed = 1.5;
+ loop( [ 5, 2 ][ Level == 0 ] ){
+ if( Level < 2 ){ CreateShot01( GetX(), GetY(), speed, 0, BLUE12, 10 ); }
+ else{ WayShot01( 10, 4, speed, BLUE12, 10 ); }
+ speed += 0.4;
+ }
+ PlaySEEx( seShot1 );
+ SetAngle( [ 230, 300 ][ GetX() < GetCenterX() ] );
+ while( GetSpeed() < 4 ){
+ SetSpeed( GetSpeed() + 0.3 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ SetDamageRate( 0, 1 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 95 ){ SetDamageRate( 100, 30 ); }
+ if( count == 30 && Level != 0 ){
+ let speed = 0.8;
+ loop( [ 1, 2 ][ Level == 3 ] ){
+ CircleShot01( [ 30, 10 ][ trunc( Level / 2 ) ], speed, GREEN04, 5 );
+ speed += 0.4;
+ }
+ PlaySEEx( seShot2 );
+ }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei03.dnh b/th_dnh/script/thA/Yosei03.dnh
new file mode 100644
index 0000000..61df7ea
--- /dev/null
+++ b/th_dnh/script/thA/Yosei03.dnh
@@ -0,0 +1,54 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ let dir = [ -1, 1 ][ GetX() < GetCenterX() ];
+ SetMovePosition03( GetX(), GetClipMinY() + 32, 20, 3 );
+ WaitZeroSpeed();
+ SetSpeed( 0.35 );
+ SetAngle( 90 );
+ let turn = 0;
+ while( GetY() < GetCenterY() - 64 ){
+ alternative( [ rand_int( 0, 600 - Level * 150 ), rand_int( 0, 1 ) ][ Level >= 2 && turn == 0 ] )
+ case( 0 ){
+ let speed = 1.5;
+ loop( [ 5, 2 ][ Level == 0 ] ){
+ CreateShot01( GetX(), GetY(), speed, 0, BLUE05, 10 );
+ speed += 0.7;
+ }
+ PlaySEEx( seShot1 );
+ }
+ case( 1 ){
+ WayShot01( 30, 10, 2.5, BLUE05, 10 );
+ PlaySEEx( seShot1 );
+ }
+ yield;
+ turn++;
+ }
+ while( GetSpeed() < 5 ){
+ SetSpeed( GetSpeed() + 0.03 );
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 20 );
+ SetDamageRate( 0, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 70 ){ SetDamageRate( 100, 100 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 32 ); }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei2, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei04.dnh b/th_dnh/script/thA/Yosei04.dnh
new file mode 100644
index 0000000..8af20c6
--- /dev/null
+++ b/th_dnh/script/thA/Yosei04.dnh
@@ -0,0 +1,42 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ SetMovePosition03( GetX(), GetClipMinY() + 128, 20, 5.5 );
+ WaitSpeedDown( 0.5 );
+ let dir = GetX() < GetCenterX();
+ SetAngle( [ 210, 330 ][ dir ] );
+ let num = 0;
+ while( GetSpeed() < 4 ){
+ if( Level == 0 ){ CreateShot02( GetX(), GetY(), 5, 0, -0.1, 0.8, [ BLUE21, AQUA21 ][ dir ], 10 ); }
+ else{ WayShot02( 20 + num, ( 20 + num ) / Level, 5 + Level / 2, -0.1, 1 + Level / 2, [ BLUE21, AQUA21 ][ dir ], 10 ); }
+ PlaySEEx( seShot1 );
+ loop( [ 8, 6, 5, 4 ][ Level ] ){
+ SetSpeed( GetSpeed() + 0.1 );
+ yield;
+ }
+ num++;
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ SetDamageRate( 0, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 90 ){ SetDamageRate( 100, 100 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 32 ); }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei4, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei05.dnh b/th_dnh/script/thA/Yosei05.dnh
new file mode 100644
index 0000000..2a3b149
--- /dev/null
+++ b/th_dnh/script/thA/Yosei05.dnh
@@ -0,0 +1,50 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ SetSpeed( 2 );
+ SetAngle( 90 );
+ Wait( 30 );
+ let dir = [ -1, 1 ][ Argv % 2 ];
+ loop( 2 ){
+ loop( 100 ){
+ SetAngle( GetAngle() - dir );
+ yield;
+ }
+ let speed = 0.5;
+ loop( Level + 1 ){
+ CreateShot01( GetX(), GetY(), speed, 0, WHITE05, 5 );
+ speed += 0.4;
+ }
+ PlaySEEx( seShot1 );
+ dir = -dir;
+ }
+ }
+ @Initialize{
+ SetLife( 3 );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{
+ if( !IsOut( 32 ) && GetY() < GetCenterY() + 64 && ( Level != 0 || Argv % 2 == 0 ) ){
+ let color = [ BLUE04, RED04 ][ Argv % 2 ];
+ ascent( let i in 1..[ 1, 2, 5, 6 ][ Level ] ){ WayShot02( 120, 30, 0, 0.05, i / 4, color, 8 + i * 3 ); }
+ PlaySEEx( seShot3 );
+ }
+ if( count > 180 || Argv % 4 == 0 ){ DropItem( 1, 8 ); }
+ }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei5, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei06.dnh b/th_dnh/script/thA/Yosei06.dnh
new file mode 100644
index 0000000..58b34a2
--- /dev/null
+++ b/th_dnh/script/thA/Yosei06.dnh
@@ -0,0 +1,58 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ SetMovePosition03( GetX(), GetClipMinY() + 128, 20, 5 );
+ WaitSpeedDown( 0.3 );
+ let speed = 0.5;
+ loop( Level + 1 ){
+ CreateShot01( GetX(), GetY(), speed, 0, WHITE05, 5 );
+ speed += 0.4;
+ }
+ PlaySEEx( seShot1 );
+ SetSpeed( 0 );
+ Wait( 10 );
+ SetAngle( [ 150, 30, 145, 35 ][ Argv % 4 ] );
+ SetSpeed( 1.8 );
+ }
+ @Initialize{
+ SetLife( 3 );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{
+ if( !IsOut( 32 ) && GetY() < GetCenterY() + 64 && ( Level != 0 || Argv % 2 == 0 ) ){
+ let color = [ PURPLE04, GREEN04, AQUA04 ][ Argv % 3 ];
+ let dir = 1;
+ loop( 2 ){
+ let speed = Level / 2 + 1;
+ loop( 2 ){
+ let limit = 2 + Level;
+ let angle = -2;
+ while( angle <= limit ){
+ CreateShot02( GetX() + 16 * dir, GetY(), 0, angle + dir, 0.1, speed, color, 15 );
+ angle += 2;
+ }
+ speed = speed / 2;
+ }
+ dir = -dir;
+ }
+ PlaySEEx( seShot3 );
+ }
+ if( count > 180 || Argv % 4 == 0 ){ DropItem( 1, 8 ); }
+ }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei1, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei07.dnh b/th_dnh/script/thA/Yosei07.dnh
new file mode 100644
index 0000000..85212e9
--- /dev/null
+++ b/th_dnh/script/thA/Yosei07.dnh
@@ -0,0 +1,45 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ SetMovePosition03( GetCenterX(), GetClipMinY() + Smooth( 0, 256, GetPlayerY(), GetClipMaxY() ), 20, 5 );
+ WaitSpeedDown( 0.3 );
+ let angle = GetAngle();
+ let speed = 0.5;
+ loop( Level + 1 ){
+ CreateShot01( GetX(), GetY(), speed, 0, WHITE05, 5 );
+ speed += 0.4;
+ }
+ PlaySEEx( seShot1 );
+ SetSpeed( 0 );
+ Wait( 10 );
+ SetAngle( angle + 180 );
+ SetSpeed( 2.5 );
+ }
+ @Initialize{
+ SetLife( 3 );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{
+ if( !IsOut( 32 ) && GetY() < GetCenterY() + 64 && ( Level != 0 || Argv % 2 == 0 ) ){
+ CircleShot02( ( 4 - Level ) * 10, 0, 0.05, 1, [ YELLOW12, ORANGE12 ][ Argv % 2 ], 15 );
+ PlaySEEx( seShot3 );
+ }
+ if( count > 180 || Argv % 4 == 0 ){ DropItem( 1, 8 ); }
+ }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei2, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei08.dnh b/th_dnh/script/thA/Yosei08.dnh
new file mode 100644
index 0000000..bc65f1a
--- /dev/null
+++ b/th_dnh/script/thA/Yosei08.dnh
@@ -0,0 +1,80 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquecode = RandBlur( 32767 );
+ let uniquestr = ToString( uniquecode );
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ SetShotDirectionType( PLAYER );
+ SetMovePosition03( GetX(), GetCenterY() + 64, 20, 4 );
+ yield;
+ while( GetSpeed() > 0.3 ){
+ CreateShot01( GetX(), GetY(), 1.3, 0, BLUE12, 5 );
+ PlaySEEx( seShot1 );
+ Wait( [ 10, 8, 5, 3 ][ Level ] );
+ }
+ SetSpeed( 0 );
+ Wait( 10 );
+ let dir = 1;
+ loop( 2 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 2, GetAngleToPlayer() + 8 * dir, uniquecode );
+ dir = -dir;
+ }
+ PlaySEEx( seShadow );
+ SetAngle( [ 230, 300 ][ GetX() < GetCenterX() ] );
+ while( GetSpeed() < 4 ){
+ SetSpeed( GetSpeed() + 0.3 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ SetDamageRate( 1, 1 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( count == 30 && Level >= 2 ){
+ let speed = 0.6;
+ loop( [ 1, 2 ][ Level == 3 ] ){
+ CircleShot01( 10, speed, BLUE11, 5 );
+ speed += 0.4;
+ }
+ PlaySEEx( seShot2 );
+ }
+ if( count == 95 ){ SetDamageRate( 100, 50 ); }
+ TaskShadowInterface( uniquestr, 25 );
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ DropItem( 1, 32 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = ToString( GetArgument() );
+ let PrevLife;
+ @Initialize{
+ SetLife( 30 );
+ PrevLife = GetLife();
+ }
+ @MainLoop{
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Yosei09.dnh b/th_dnh/script/thA/Yosei09.dnh
new file mode 100644
index 0000000..af39f7d
--- /dev/null
+++ b/th_dnh/script/thA/Yosei09.dnh
@@ -0,0 +1,47 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 3 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetX(), GetClipMinY() + 96, 20, 4 );
+ WaitZeroSpeed();
+ let angle = 0;
+ while( absolute( angle ) <= 360 ){
+ SetShotDirectionType( ABSOLUTE );
+ let speed = 1;
+ loop( 2 + Level ){
+ CreateShot01( GetX(), GetY(), speed + Smooth( -0.5, 1 + Level, angle, 360 ), angle - 90, WHITE04, 10 );
+ speed += 0.3;
+ }
+ PlaySEEx( seShot2 );
+ Wait( 3 );
+ angle += 12 * dir;
+ }
+ SetAngle( [ 150, 30 ][ GetX() < GetCenterX() ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 256 );
+ SetDamageRate( 0, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 50 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei10.dnh b/th_dnh/script/thA/Yosei10.dnh
new file mode 100644
index 0000000..d61bdac
--- /dev/null
+++ b/th_dnh/script/thA/Yosei10.dnh
@@ -0,0 +1,83 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let uniquecode = RandBlur( 32767 );
+ let uniquestr = ToString( uniquecode );
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let firstx = GetX();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ SetShotDirectionType( ABSOLUTE );
+ SetMovePosition03( GetCenterX(), GetCenterY() - 64, 20, 4 );
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, angle, uniquecode );
+ angle += 60;
+ }
+ PlaySE( seShadow );
+ Wait( 280 );
+ SetSpeed( 2 );
+ SetAngle( [ 310, 240 ][ firstx < GetCenterX() ] );
+ }
+ @Initialize{
+ SetLife( 360 );
+ SetDamageRate( 1, 1 );
+ SetMovePosition03( GetCenterX(), GetCenterY() - 96, 7, 20 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( count == 130 ){ SetDamageRate( 100, 10 ); }
+ TaskShadowInterface( uniquestr, [ -1, 30 ][ count > 130 ] );
+ SEShotHit( seDamage, count );
+ Collision( 40, 0 );
+ Gone();
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ DropItem( 3, 48 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = ToString( GetArgument() );
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let RotateSpeed = 6;
+ task Behavior(){
+ Wait( 20 );
+ loop{
+ SetShotDirectionType( ABSOLUTE );
+ CreateShot01( GetX(), GetY(), [ 0.8, 1.2 ][ trunc( Level / 2 ) ], GetAngle() - count * RotateSpeed + 70, RED04, 5 );
+ let speed = [ 1.2, 1.8 ][ trunc( Level / 2 ) ];
+ ascent( let i in 0..[ 2, 3, 3, 4 ][ Level ] ){
+ CreateShot01( GetX(), GetY(), speed, GetAngle() - count * RotateSpeed + 70 + count * 0.05 + i * 5, BLUE04, 10 );
+ speed += 0.4;
+ }
+ if( count > 120 && Level != 0 ){ WayShotGap01( [ 10, 15 ][ trunc( Level / 2 ) ], [ 10, 5 ][ Level == 3 ], 0.7, RED12, 5, GetAngle() - count * RotateSpeed + 90 ); }
+ PlaySE( seShot1 );
+ Wait( round( Smooth( [ 20, 16, 16, 12 ][ Level ], 8, count, 320 ) ) );
+ }
+ }
+ @Initialize{
+ SetLife( 200 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count, 80 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Yosei11.dnh b/th_dnh/script/thA/Yosei11.dnh
new file mode 100644
index 0000000..143123a
--- /dev/null
+++ b/th_dnh/script/thA/Yosei11.dnh
@@ -0,0 +1,43 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 64 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetCenterX() + 192 * dir - Argv * dir, GetY(), 20, 4 );
+ WaitSpeedDown( 0.3 );
+ ascent( let i in 0..10 ){
+ SetShotDirectionType( ABSOLUTE );
+ if( Level != 0 ){ WayShotGap01( 30, [ 30, 60 ][ i % 2 ], 3, BLUE12, 5, GetAngleToPlayer() ); }
+ WayShotGap01( [ 25, 75 ][ trunc( Level / 2 ) ], 50, 4, RED12, 5, GetAngleToPlayer() + RandBlur( ( Level + 1 ) * 4 ) );
+ PlaySE( seShot1 );
+ Wait( [ 5, 8 ][ Level == 1 ] );
+ }
+ SetAngle( [ 300, 240 ][ dir == 1 ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 50 );
+ SetDamageRate( 2, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 40 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei12.dnh b/th_dnh/script/thA/Yosei12.dnh
new file mode 100644
index 0000000..74bc2d9
--- /dev/null
+++ b/th_dnh/script/thA/Yosei12.dnh
@@ -0,0 +1,58 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 2 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ Wait( 30 );
+ SetShotDirectionType( ABSOLUTE );
+ if( Level < 2 ){ Lump( 0 ); }
+ else{
+ let limit = [ 20, 40 ][ Level == 3 ];
+ let angle = -limit;
+ while( angle <= limit ){
+ Lump( angle );
+ angle += 20;
+ }
+ }
+ PlaySE( seShot1 );
+ Wait( 60 );
+ while( GetY() < GetClipMaxY() - 180 ){
+ loop( ( Level + 1 ) * 4 ){
+ let speed = rand( 0, 0.5 );
+ CreateShot02( GetX(), GetY(), 0, GetAngleToPlayer() + RandBlur( [ 3, 5, 8, 10 ][ Level ] ), 0.01, speed + Level / 2, PURPLE31, 15 );
+ }
+ PlaySE( seShot1 );
+ Wait( [ 30, 60 ][ Level == 0 ] );
+ }
+ }
+ function Lump( let masterangle ){
+ let maxangle = [ 10, 16, 13, 16 ][ Level ];
+ loop( ( Level + 2 ) * 8 ){
+ let angle = RandBlur( maxangle );
+ let speed = rand( 4, 6 ) + Smooth( 2, 0, absolute( angle ), maxangle ) - [ 0, 1 ][ Level == 0 ];
+ CreateShotA( 0, GetX(), GetY(), 5 );
+ SetShotDataA( 0, 0, speed, 90 + masterangle + angle, 0 - GetDir( trunc( angle ) ), -0.01, speed - 1, ORANGE04 );
+ SetShotDataA( 0, trunc( absolute( angle ) ), NULL, NULL, 0, -0.01, speed - 1, ORANGE04 );
+ FireShot( 0 );
+ }
+ }
+ @Initialize{
+ SetLife( 133 );
+ SetDamageRate( 100, 100 );
+ Behavior();
+ }
+ @MainLoop{
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 32 ); }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei1, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei13.dnh b/th_dnh/script/thA/Yosei13.dnh
new file mode 100644
index 0000000..4d90808
--- /dev/null
+++ b/th_dnh/script/thA/Yosei13.dnh
@@ -0,0 +1,148 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let uniquecode = RandBlur( 32767 );
+ let uniquestr = ToString( uniquecode );
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgument();
+ let firstx = GetX();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ SetShotDirectionType( ABSOLUTE );
+ SetMovePosition03( GetX(), GetCenterY() - 64, 20, 4 );
+ local{
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, angle, uniquecode );
+ angle += 60;
+ }
+ }
+ local{
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow2", GetX(), GetY(), 0, angle, uniquecode );
+ angle += 72;
+ }
+ }
+ PlaySEEx( seShadow );
+ Wait( 80 );
+ local{
+ let angle = GetAngleToPlayer();
+ loop( 10 ){
+ if( Argv != 0 ){ CircleShotGap01( 90, 2, BLUE03, 25, angle ); }
+ angle += 13;
+ Wait( 20 );
+ }
+ }
+ Wait( 200 );
+ SetSpeed( 2 );
+ SetAngle( [ 310, 240 ][ firstx < GetCenterX() ] );
+ }
+ @Initialize{
+ SetLife( 120 );
+ SetDamageRate( 1, 1 );
+ SetMovePosition03( GetCenterX(), GetCenterY() - 96, 7, 20 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( count == 130 ){ SetDamageRate( 100, 10 ); }
+ TaskShadowInterface( uniquestr, [ -1, 10 ][ count > 130 ] );
+ SEShotHit( seDamage, count );
+ Collision( 40, 0 );
+ Gone();
+ if( IsBossExisting() ){ VanishEnemy(); }
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ DropItem( 4, 48 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei2, count );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = ToString( GetArgument() );
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let RotateSpeed = 3;
+ task ObjShot( let angle ){
+ let color = YELLOW12;
+ let speed = [ 1.5, 2.4, 3, 3 ][ Level ];
+ let obj = SetShotObject( GetX(), GetY(), speed, GetAngle() - count * RotateSpeed + 40 + angle / 6, color, 16 );
+ loop( 40 ){
+ if( Obj_BeDeleted( obj ) ){ return; }
+ yield;
+ }
+ PlaySEEx( seKira1 );
+ CreateShot01( Obj_GetX( obj ), Obj_GetY( obj ), speed, angle + GetAngleToPlayerObject( obj ), color, 0 );
+ Obj_Delete( obj );
+ }
+ task Behavior(){
+ Wait( 20 );
+ loop( 20 ){
+ SetShotDirectionType( ABSOLUTE );
+ let limit = [ 120, 120, 144, 160 ][ Level ];
+ let angle = -limit;
+ while( angle <= limit ){
+ ObjShot( angle );
+ angle += [ 120, 120, 72, 40 ][ Level ];
+ }
+ PlaySEEx( seShot1 );
+ Wait( 16 );
+ }
+ }
+ @Initialize{
+ SetLife( 200 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count, 80 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
+script_enemy Shadow2{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = ToString( GetArgument() );
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ let RotateSpeed = -2;
+ task Behavior(){
+ Wait( 20 );
+ loop( 20 ){
+ SetShotDirectionType( ABSOLUTE );
+ let speed = [ 2, 1.5 ][ Level == 0 ];
+ loop( Max( Level, 1 ) ){
+ CreateShot01( GetX(), GetY(), speed, GetAngle() - count * RotateSpeed + 70, RED02, 15 );
+ speed += 0.8;
+ }
+ PlaySEEx( seShot1 );
+ Wait( 16 );
+ }
+ }
+ @Initialize{
+ SetLife( 200 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count * 2, 133 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Yosei14.dnh b/th_dnh/script/thA/Yosei14.dnh
new file mode 100644
index 0000000..a4033bc
--- /dev/null
+++ b/th_dnh/script/thA/Yosei14.dnh
@@ -0,0 +1,122 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquecode = RandBlur( 32767 );
+ let uniquestr = ToString( uniquecode );
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ CreateShadowInterface( uniquestr );
+ PlaySEEx( seShadow );
+ Wait( 20 );
+ let tablex = [];
+ let tabley = [];
+ alternative( Argv )
+ case( 0 ){
+ tablex = tablex ~ [ -180, -112, 112, 180 ];
+ tabley = tabley ~ [ 144, -208, 208, -144 ];
+ }
+ case( 1 ){
+ tablex = tablex ~ [ -160, -160, -160, 160, 160, 160 ];
+ tabley = tabley ~ [ -192, 0, 192, -192, 0, 192 ];
+ }
+ case( 2 ){
+ tablex = tablex ~ [ -196, -196, -196, -196, -140, -84, -28, 28, 84, 140, 196, 196, 196, 196 ];
+ tabley = tabley ~ [ -232, -104, 24, 152, 216, -232, 216, -232, 216, -232, 216, 86, -40, -168 ];
+ }
+ ascent( let i in 0..length( tablex ) ){ CreateEnemyFromScript( "Shadow", GetCenterX() + tablex[ i ], GetCenterY() + tabley[ i ], 0, [ 0, 45 ][ Argv == 1 ], uniquecode ); }
+ PlaySEEx( seShadow );
+ Wait( 60 );
+ let angle = GetAngleToPlayer();
+ let pattern = 0;
+ loop( 6 ){
+ let speed = 1;
+ loop( 14 ){
+ SetShotDirectionType( ABSOLUTE );
+ CircleShotGap01( 360 / ( 6 + Level + pattern ), speed * [ 0.8, 1, 1.2, 1.5 ][ Level ], PURPLE12, 25, angle );
+ PlaySE( seShot1 );
+ Wait( 5 );
+ speed += 0.35;
+ angle += 8 - Level;
+ }
+ speed = 2.4;
+ loop( 8 ){
+ SetShotDirectionType( ABSOLUTE );
+ CircleShotGap01( 360 / ( 6 + Level + pattern ), speed * [ 0.8, 1, 1.2, 1.5 ][ Level ], GREEN12, 25, angle );
+ PlaySE( seShot1 );
+ Wait( 5 );
+ speed += 0.2;
+ angle -= 3.3 - Level / 2;
+ }
+ pattern++;
+ }
+ Wait( 120 );
+ SetSpeed( 0.8 );
+ SetAngle( 270 );
+ }
+ @Initialize{
+ SetLife( 80 );
+ SetDamageRate( 2, 100 );
+ SetX( GetCenterX() );
+ SetY( GetClipMinY() + 96 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( count == 400 ){ SetDamageRate( 100, 50 ); }
+ TaskShadowInterface( uniquestr, [ -1, 3 ][ count > 420 ] );
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ if( IsBossExisting() ){ VanishEnemy(); }
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ DropItem( 8, 32 );
+ if( Argv == 2 && !BeVanished() ){
+ DropItem( 32, 64 );
+ DropExtend();
+ }
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicScale( Accelerate( 0, 1, count, 20 ), Accelerate( 2, 1, count, 20 ) );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ SetGraphicScale( 1, 1 );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = ToString( GetArgument() );
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let PrevLife;
+ task Behavior(){
+ Wait( 30 );
+ let pattern = 0;
+ loop{
+ SetShotDirectionType( ABSOLUTE );
+ CircleShotGap01( 90, Smooth( 1, [ 2.5, 4, 4.4, 4.5 ][ Level ], pattern, 8 ), YELLOW02, 5, GetAngle() );
+ PlaySEEx( seShot1 );
+ Wait( 10 );
+ pattern++;
+ }
+ }
+ @Initialize{
+ SetLife( 200 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Yosei15.dnh b/th_dnh/script/thA/Yosei15.dnh
new file mode 100644
index 0000000..697a614
--- /dev/null
+++ b/th_dnh/script/thA/Yosei15.dnh
@@ -0,0 +1,55 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 64 );
+ task HiddenShot( let dir ){
+ let obj = SetHiddenObject( GetX(), GetY(), 5, GetAngleToPlayer() + 90 * dir, 0, true, false );
+ Wait( 2 );
+ SetShotDirectionType( PLAYER );
+ let halflevel = trunc( Level / 2 );
+ let speed = 1.2;
+ loop( [ 3, 5 ][ Level % 2 ] ){
+ WayShotObject01( obj, [ 1, 5 ][ halflevel ], [ 2, 10 ][ halflevel ], speed, [ BLUE04, RED04 ][ Argv < 0 ], 20 );
+ WayShotObject01( obj, 20, 20, speed, [ BLUE01, RED01 ][ Argv < 0 ], 16 );
+ speed += 0.5;
+ }
+ Obj_Delete( obj );
+ }
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetCenterX() + 192 * dir - absolute( Argv ) * dir, GetY(), 24, 5 );
+ WaitSpeedDown( 0.12 );
+ let d = -1;
+ loop( 2 ){
+ HiddenShot( d );
+ d = -d;
+ }
+ PlaySEEx( seShot1 );
+ SetAngle( [ 300, 240 ][ dir == 1 ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ SetDamageRate( 2, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 50 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei16.dnh b/th_dnh/script/thA/Yosei16.dnh
new file mode 100644
index 0000000..c41c23c
--- /dev/null
+++ b/th_dnh/script/thA/Yosei16.dnh
@@ -0,0 +1,43 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 64 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetCenterX() + 192 * dir - Argv * dir, GetY(), 24, 5 );
+ WaitSpeedDown( 0.12 );
+ SetShotDirectionType( PLAYER );
+ let speed = 10;
+ loop( 2 ){
+ WayShot02( [ 80, 72 ][ Argv % 2 ], 16, speed, -speed / 20, speed / 5, [ AQUA04, YELLOW04 ][ Argv % 2 ], 10 );
+ speed += 1;
+ }
+ PlaySEEx( seShot1 );
+ SetAngle( [ 300, 240 ][ dir == 1 ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ SetDamageRate( 2, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 50 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei17.dnh b/th_dnh/script/thA/Yosei17.dnh
new file mode 100644
index 0000000..00a509a
--- /dev/null
+++ b/th_dnh/script/thA/Yosei17.dnh
@@ -0,0 +1,93 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquecode = RandBlur( 32767 );
+ let uniquestr = ToString( uniquecode );
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ SetMovePosition03( GetX(), GetClipMinY() + 32, 20, 3 );
+ WaitSpeedDown( 0.6 );
+ SetShotDirectionType( PLAYER );
+ local{
+ let speed = [ 1, 1.5 ][ Level == 0 ];
+ loop( 2 + Level ){
+ CreateShot01( GetX(), GetY(), speed, 0, AQUA04, 20 );
+ speed += 0.5;
+ }
+ }
+ PlaySEEx( seShot1 );
+ Wait( 100 );
+ SetShotDirectionType( PLAYER );
+ local{
+ let speed = 1;
+ loop( 2 ){
+ CircleShot01( [ 10, 20 ][ Level == 0 ], speed, WHITE12, 10 );
+ speed += 0.3;
+ }
+ }
+ PlaySEEx( seShot2 );
+ Wait( 20 );
+ SetShotDirectionType( PLAYER );
+ if( Level != 0 ){
+ let speed = 1.5;
+ loop( Max( Level, 2 ) ){
+ WayShot01( [ 3, 7.5 ][ trunc( Level / 2 ) ], 3, speed, WHITE12, 10 );
+ speed += 0.5;
+ }
+ }
+ PlaySEEx( seShot1 );
+ Wait( 120 );
+ let pangle = GetAngleToPlayer();
+ loop( 4 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 5, pangle, uniquecode );
+ PlaySEEx( seShadow );
+ Wait( 10 );
+ }
+ Wait( 60 );
+ while( GetSpeed() < 5 ){
+ SetSpeed( GetSpeed() + 0.03 );
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 20 );
+ SetDamageRate( 1, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( count == 50 ){ SetDamageRate( 100, 100 ); }
+ TaskShadowInterface( uniquestr, 100 );
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ DropItem( [ 1, 3 ][ count > 240 ], 32 );
+ }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei2, count );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = ToString( GetArgument() );
+ let PrevLife;
+ @Initialize{
+ SetLife( 5 );
+ PrevLife = GetLife();
+ }
+ @MainLoop{
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Yosei18.dnh b/th_dnh/script/thA/Yosei18.dnh
new file mode 100644
index 0000000..b85ce23
--- /dev/null
+++ b/th_dnh/script/thA/Yosei18.dnh
@@ -0,0 +1,46 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() < GetCenterX() ];
+ let halflevel = trunc( Level / 2 );
+ SetMovePosition03( GetX() - 64 * dir, GetClipMinY() + 32, 20, 3 );
+ WaitSpeedDown( 0.6 );
+ loop( 12 ){
+ SetShotDirectionType( PLAYER );
+ let angle = RandBlur( 80 );
+ let speed = 1.5;
+ loop( 1 + halflevel ){
+ WayShotGap01( [ 2, 1 ][ Level == 0 ], [ 2, 1 ][ Level == 0 ], speed, WHITE04, 15, angle );
+ speed += 0.7;
+ }
+ PlaySEEx( seShot1 );
+ Wait( [ 12, 10, 10, 8 ][ Level ] );
+ }
+ SetAngle( 90 );
+ while( GetSpeed() < 5 ){
+ SetSpeed( GetSpeed() + 0.03 );
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 20 );
+ SetDamageRate( 1, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( count == 50 ){ SetDamageRate( 100, 100 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ count++;
+ }
+ @Finalize{ DropItem( [ 1, 3 ][ count > 240 ], 32 ); }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei2, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei19.dnh b/th_dnh/script/thA/Yosei19.dnh
new file mode 100644
index 0000000..8a2163a
--- /dev/null
+++ b/th_dnh/script/thA/Yosei19.dnh
@@ -0,0 +1,56 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 0 );
+ task Shot(){
+ loop( Level ){
+ WayShot01( 7, 7, 1.6, AQUA05, 10 );
+ PlaySEEx( seShot3 );
+ Wait( 10 );
+ }
+ }
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() < GetCenterX() ];
+ SetMovePosition03( GetX() + ( GetCommonDataDefault( "GlobalCount", count ) % 32 + 64 ) * dir, Max( GetPlayerY() / [ 3, 2 ][ Argv % 2 ], GetClipMinY() + 8 ), 20, Smooth( 1, [ 3, 5 ][ Argv % 2 ], GetPlayerY(), GetClipMaxY() ) );
+ WaitSpeedDown( 2.5 );
+ SetShotDirectionType( PLAYER );
+ if( Level != 0 ){ Shot(); }
+ WaitZeroSpeed();
+ SetMovePosition03( GetX() - 12 * dir, GetY() + 8, 20, 0.5 );
+ WaitZeroSpeed();
+ Wait( 20 );
+ SetShotDirectionType( PLAYER );
+ let speed = 1;
+ loop( [ 0, 1, 3, 5 ][ Level ] ){
+ if( Level == 3 ){ WayShot01( 15, 15, speed, WHITE05, 5 ); }
+ else{ CreateShot01( GetX(), GetY(), speed, dir * 2, WHITE05, 5 ); }
+ speed += 0.8;
+ }
+ if( Level != 0 ){ PlaySEEx( seShot1 ); }
+ SetAngle( [ 150, 30 ][ GetX() < GetCenterX() ] );
+ while( GetSpeed() < 2 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 10 );
+ SetDamageRate( 0, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 3 ){ SetDamageRate( 100, 100 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ if( count > 180 || Argv % 3 == 0 ){ DropItem( 1, 8 ); } }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei1, count );
+ }
+}
diff --git a/th_dnh/script/thA/Yosei20.dnh b/th_dnh/script/thA/Yosei20.dnh
new file mode 100644
index 0000000..5f69e6d
--- /dev/null
+++ b/th_dnh/script/thA/Yosei20.dnh
@@ -0,0 +1,68 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquecode = RandBlur( 32767 );
+ let uniquestr = ToString( uniquecode );
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ SetShotDirectionType( ABSOLUTE );
+ let dir = GetX() < GetCenterX();
+ SetMovePosition03( GetX(), GetClipMinY() + 96, 20, 4 );
+ WaitZeroSpeed();
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 2, angle + GetAngleToPlayer(), uniquecode );
+ angle += 45;
+ }
+ PlaySEEx( seShadow );
+ SetAngle( [ 150, 30 ][ GetX() < GetCenterX() ] );
+ while( GetSpeed() < 2 ){
+ SetSpeed( GetSpeed() + 0.05 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 100 );
+ SetDamageRate( 2, 3 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( count == 100 ){ SetDamageRate( 100, 30 ); }
+ TaskShadowInterface( uniquestr, 50 );
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ if( IsBossExisting() ){ VanishEnemy(); }
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ DropItem( 1, 68 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei1, count );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let uniquecode = ToString( GetArgument() );
+ let PrevLife;
+ @Initialize{
+ SetLife( 30 );
+ PrevLife = GetLife();
+ }
+ @MainLoop{
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ Gone();
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/Yosei21.dnh b/th_dnh/script/thA/Yosei21.dnh
new file mode 100644
index 0000000..20d9553
--- /dev/null
+++ b/th_dnh/script/thA/Yosei21.dnh
@@ -0,0 +1,47 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Level = GetCommonDataDefault( "Level", 1 );
+ let Argv = GetArgumentDefault( 64 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetCenterX() + 192 * dir - absolute( Argv ) * dir, GetY(), 24, 5 );
+ WaitSpeedDown( 0.3 );
+ ascent( let i in 0..2 ){
+ ascent( let l in 0..30 ){
+ Wait( 3 );
+ SetShotDirectionType( PLAYER );
+ CircleShotGap01( [ 120, 72 ][ trunc( Level / 2 ) ], Smooth( 1, [ 3.8, 4.5, 4.8, 6 ][ Level ], l, 29 ) + RandBlur( 0.3 ), ORANGE04, 5, RandBlur( 3 + Level * 2 ) );
+ PlaySEEx( seShot1 );
+ }
+ if( i == 0 ){ CircleShot01( 15, 2, WHITE04, 30 ); }
+ PlaySEEx( seShot3 );
+ Wait( 30 );
+ }
+ SetAngle( [ 300, 240 ][ dir == 1 ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ SetDamageRate( 2, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 50 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
diff --git a/th_dnh/script/thA/YoseiX01.dnh b/th_dnh/script/thA/YoseiX01.dnh
new file mode 100644
index 0000000..e444749
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX01.dnh
@@ -0,0 +1,38 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Argv = GetArgumentDefault( 64 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetCenterX() + 192 * dir - Argv * dir, GetY(), 20, 4 );
+ WaitSpeedDown( 0.3 );
+ SetShotDirectionType( PLAYER );
+ ascent( let i in 2..13 ){ CreateShot01( GetX(), GetY(), i / 2, 0, [ BLUE04, RED04 ][ dir == 1 ], 10 ); }
+ PlaySE( seShot1 );
+ SetAngle( [ 300, 240 ][ dir == 1 ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 50 );
+ SetDamageRate( 2, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 40 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
diff --git a/th_dnh/script/thA/YoseiX02.dnh b/th_dnh/script/thA/YoseiX02.dnh
new file mode 100644
index 0000000..0768fdb
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX02.dnh
@@ -0,0 +1,53 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() < GetCenterX() ];
+ SetMovePosition03( GetX() + ( GetCommonDataDefault( "GlobalCount", count ) % 32 + 64 ) * dir, Max( GetPlayerY() / [ 3, 2 ][ Argv % 2 ], GetClipMinY() + 8 ), 20, Smooth( 1, [ 3, 5 ][ Argv % 2 ], GetPlayerY(), GetClipMaxY() ) );
+ yield;
+ while( GetSpeed() > 0 ){
+ ascent( let i in 2..6 ){ CircleShot01( 90, i, [ YELLOW05, PURPLE05 ][ Argv % 2 ], 5 ); }
+ PlaySEEx( seShot1 );
+ Wait( 20 );
+ }
+ SetShotDirectionType( ABSOLUTE );
+ WayShotGap01( 45, 15, 0.6, AQUA05, 5, 90 );
+ WayShotGap01( 6, 2, 1, AQUA05, 5, 90 );
+ PlaySEEx( seShot2 );
+ SetMovePosition03( GetX() - 12 * dir, GetY() + 8, 20, 0.5 );
+ WaitZeroSpeed();
+ Wait( 20 );
+ SetShotDirectionType( PLAYER );
+ let speed = 1;
+ loop( 5 ){
+ WayShot01( 15, 15, speed, WHITE05, 5 );
+ speed += 0.8;
+ }
+ PlaySEEx( seShot1 );
+ SetAngle( [ 150, 30 ][ GetX() < GetCenterX() ] );
+ while( GetSpeed() < 2 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 10 );
+ SetDamageRate( 0, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 3 ){ SetDamageRate( 100, 100 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 8 ); }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei1, count );
+ }
+}
diff --git a/th_dnh/script/thA/YoseiX03.dnh b/th_dnh/script/thA/YoseiX03.dnh
new file mode 100644
index 0000000..a47a222
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX03.dnh
@@ -0,0 +1,113 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let uniquecode = RandBlur( 32767 );
+ let uniquestr = ToString( uniquecode );
+ let Argv = GetArgument();
+ let firstx = GetX();
+ task Behavior(){
+ yield;
+ CreateShadowInterface( uniquestr );
+ SetShotDirectionType( ABSOLUTE );
+ SetMovePosition03( GetX(), GetCenterY() - 64, 20, 5 );
+ local{
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow", GetX(), GetY(), 0, angle, uniquecode );
+ angle += 72;
+ }
+ }
+ local{
+ let angle = 0;
+ while( angle < 360 ){
+ CreateEnemyFromScript( "Shadow2", GetX(), GetY(), 0, angle, uniquecode );
+ angle += 72;
+ }
+ }
+ PlaySE( seShadow );
+ Wait( 60 );
+ SetSpeed( 2 );
+ SetAngle( [ 310, 240 ][ firstx < GetCenterX() ] );
+ }
+ @Initialize{
+ SetLife( 10 );
+ SetDamageRate( 2, 2 );
+ SetMovePosition03( GetCenterX(), GetCenterY() - 96, 7, 20 );
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ if( count == 60 ){ SetDamageRate( 100, 10 ); }
+ TaskShadowInterface( uniquestr, [ -1, 10 ][ count > 130 ] );
+ SEShotHit( seDamage, count );
+ Collision( 40, 0 );
+ Gone();
+ if( GetCommonDataDefault( "Stage5Boss", false ) ){ VanishEnemy(); }
+ count++;
+ }
+ @Finalize{
+ ReleaseShadowInterface( uniquestr );
+ DropItem( 4, 48 );
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei2, count );
+ }
+}
+script_enemy Shadow{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = ToString( GetArgument() );
+ let PrevLife;
+ let RotateSpeed = 3;
+ task Behavior(){
+ Wait( 30 );
+ loop( 12 ){
+ ascent( let i in 1..6 ){ CreateShot01( GetX(), GetY(), i, GetAngle() - count * RotateSpeed + 70, GREEN01, 10 ); }
+ PlaySEEx( seShot1 );
+ Wait( 8 );
+ }
+ }
+ @Initialize{
+ SetLife( 300 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count, 80 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
+script_enemy Shadow2{
+#include_function ".\FUNC\Shadow.dnh"
+ let count = 0;
+ let uniquecode = ToString( GetArgument() );
+ let PrevLife;
+ let RotateSpeed = -2;
+ task Behavior(){
+ Wait( 30 );
+ loop( 12 ){
+ ascent( let i in 1..6 ){ CreateShot01( GetX(), GetY(), i, GetAngle() - count * RotateSpeed - 70, AQUA01, 10 ); }
+ PlaySEEx( seShot1 );
+ Wait( 8 );
+ }
+ }
+ @Initialize{
+ SetLife( 300 );
+ PrevLife = GetLife();
+ Behavior();
+ }
+ @MainLoop{
+ yield;
+ MoveRotate( RotateSpeed, Min( count * 2, 133 ), count, uniquecode );
+ PrevLife = StandardBehaviorShadow( seHidden, seSudden, PrevLife, uniquecode, false );
+ count++;
+ }
+ @Finalize{ DestructShadow( 40 ); }
+ @DrawLoop{ DrawShadow( imgSystemCircleBlue, imgEnemyShadow, count ); }
+}
diff --git a/th_dnh/script/thA/YoseiX04.dnh b/th_dnh/script/thA/YoseiX04.dnh
new file mode 100644
index 0000000..24f41ba
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX04.dnh
@@ -0,0 +1,47 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ task Behavior(){
+ yield;
+ SetShotDirectionType( ABSOLUTE );
+ let dir = [ -1, 1 ][ GetX() < GetCenterX() ];
+ SetMovePosition03( GetX(), GetClipMinY() + 128, 20, 6 );
+ WaitSpeedDown( 0.3 );
+ SetSpeed( 0.35 );
+ SetAngle( 90 );
+ ascent( let i in 1..3 ){
+ let gap = 0;
+ let speed = 1.5 * i;
+ while( gap <= 60 ){
+ CircleShotGap01( 45, speed, RED01, 10, gap * dir );
+ PlaySEEx( seShot1 );
+ Wait( 3 );
+ speed += 0.2 * i;
+ gap += 5;
+ }
+ }
+ while( GetSpeed() < 5 ){
+ SetSpeed( GetSpeed() + 0.03 );
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 20 );
+ SetDamageRate( 0, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 88 ){ SetDamageRate( 100, 100 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ if( IsBossExisting() ){ VanishEnemy(); }
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 32 ); }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei2, count );
+ }
+}
diff --git a/th_dnh/script/thA/YoseiX05.dnh b/th_dnh/script/thA/YoseiX05.dnh
new file mode 100644
index 0000000..3b3d554
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX05.dnh
@@ -0,0 +1,38 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Argv = GetArgumentDefault( 64 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetCenterX() + 192 * dir - Argv * dir, GetY(), 20, 4 );
+ WaitSpeedDown( 0.3 );
+ SetShotDirectionType( PLAYER );
+ ascent( let i in 1..7 ){ WayShot01( 15, 10, i, [ BLUE04, RED04 ][ dir == 1 ], 10 ); }
+ PlaySE( seShot1 );
+ SetAngle( [ 300, 240 ][ dir == 1 ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 50 );
+ SetDamageRate( 2, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 40 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
diff --git a/th_dnh/script/thA/YoseiX06.dnh b/th_dnh/script/thA/YoseiX06.dnh
new file mode 100644
index 0000000..e41db7c
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX06.dnh
@@ -0,0 +1,38 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Argv = GetArgumentDefault( 64 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetCenterX() + 192 * dir - Argv * dir, GetY(), 20, 4 );
+ WaitSpeedDown( 0.3 );
+ SetShotDirectionType( PLAYER );
+ ascent( let i in 1..7 ){ WayShot01( 30, 15, i, [ PURPLE01, GREEN01 ][ dir == 1 ], 10 ); }
+ PlaySE( seShot1 );
+ SetAngle( [ 300, 240 ][ dir == 1 ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 50 );
+ SetDamageRate( 2, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 40 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 0 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei5, count );
+ }
+}
diff --git a/th_dnh/script/thA/YoseiX07.dnh b/th_dnh/script/thA/YoseiX07.dnh
new file mode 100644
index 0000000..8586ce3
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX07.dnh
@@ -0,0 +1,43 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Argv = GetArgumentDefault( 1 );
+ task Behavior(){
+ yield;
+ SetShotDirectionType( PLAYER );
+ let dir = [ -1, 1 ][ GetX() < GetCenterX() ];
+ SetMovePosition03( GetX(), GetClipMinY() + 128, 20, 6 );
+ WaitSpeedDown( 1 );
+ SetSpeed( 0.8 );
+ SetAngle( 90 );
+ let speed = 12;
+ loop( 5 ){
+ WayShot02( [ 96, 88 ][ Argv % 2 ], 16, speed, -speed / 20, speed / 5, [ PURPLE04, YELLOW04 ][ Argv % 2 ], 10 );
+ speed += 1;
+ }
+ PlaySEEx( seShot1 );
+ while( GetSpeed() < 5 ){
+ SetSpeed( GetSpeed() + 0.03 );
+ yield;
+ }
+ }
+ @Initialize{
+ SetLife( 20 );
+ SetDamageRate( 0, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 88 ){ SetDamageRate( 100, 100 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ if( IsBossExisting() ){ VanishEnemy(); }
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 2, 32 ); }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei5, count );
+ }
+}
diff --git a/th_dnh/script/thA/YoseiX08.dnh b/th_dnh/script/thA/YoseiX08.dnh
new file mode 100644
index 0000000..1c32a74
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX08.dnh
@@ -0,0 +1,52 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Argv = GetArgumentDefault( 64 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetCenterX() + 192 * dir - Argv * dir, GetY(), 20, 4 );
+ WaitSpeedDown( 1 );
+ SetSpeed( 0.8 );
+ SetShotDirectionType( PLAYER );
+ local{
+ let speed = 9;
+ loop( 4 ){
+ WayShot02( 2, 1.5, speed + 8, -1, speed / 1.5, BLUE04, 12 );
+ speed++;
+ }
+ }
+ local{
+ let speed = 9;
+ loop( 3 ){
+ WayShot02( 1.5, 1.5, speed + 10, -1, speed / 1.5, BLUE04, 10 );
+ speed += 1.5;
+ }
+ }
+ PlaySE( seShot1 );
+ SetAngle( [ 300, 240 ][ dir == 1 ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 30 );
+ SetDamageRate( 2, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 40 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 32 ); }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei3, count );
+ }
+}
diff --git a/th_dnh/script/thA/YoseiX09.dnh b/th_dnh/script/thA/YoseiX09.dnh
new file mode 100644
index 0000000..bbd628b
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX09.dnh
@@ -0,0 +1,53 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Argv = GetArgumentDefault( 0 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() < GetCenterX() ];
+ SetMovePosition03( GetX() + ( GetCommonDataDefault( "GlobalCount", count ) % 32 + 64 ) * dir, Max( GetPlayerY() / [ 3, 2 ][ Argv % 2 ], GetClipMinY() + 8 ), 20, Smooth( 1, [ 3, 5 ][ Argv % 2 ], GetPlayerY(), GetClipMaxY() ) );
+ yield;
+ while( GetSpeed() > 0 ){
+ ascent( let i in 4..6 ){ CircleShot01( 60, i, [ YELLOW05, PURPLE05 ][ Argv % 2 ], 5 ); }
+ PlaySEEx( seShot1 );
+ Wait( 15 );
+ }
+ SetShotDirectionType( ABSOLUTE );
+ WayShotGap01( 45, 15, 0.6, AQUA05, 5, 90 );
+ WayShotGap01( 6, 2, 1, AQUA05, 5, 90 );
+ PlaySEEx( seShot2 );
+ SetMovePosition03( GetX() - 12 * dir, GetY() + 8, 20, 0.5 );
+ WaitZeroSpeed();
+ Wait( 20 );
+ SetShotDirectionType( PLAYER );
+ let speed = 1;
+ loop( 6 ){
+ WayShot01( 15, 15, speed, WHITE05, 5 );
+ speed += 0.8;
+ }
+ PlaySEEx( seShot1 );
+ SetAngle( [ 150, 30 ][ GetX() < GetCenterX() ] );
+ while( GetSpeed() < 2 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 12 );
+ SetDamageRate( 0, 10 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 3 ){ SetDamageRate( 100, 100 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{ DropItem( 1, 8 ); }
+ @DrawLoop{
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei4, count );
+ }
+}
diff --git a/th_dnh/script/thA/YoseiX10.dnh b/th_dnh/script/thA/YoseiX10.dnh
new file mode 100644
index 0000000..d078752
--- /dev/null
+++ b/th_dnh/script/thA/YoseiX10.dnh
@@ -0,0 +1,55 @@
+script_enemy_main{
+#include_function ".\FUNC\Zako.dnh"
+ let count = 0;
+ let Argv = GetArgumentDefault( 64 );
+ task Behavior(){
+ yield;
+ let dir = [ -1, 1 ][ GetX() > GetCenterX() ];
+ SetMovePosition03( GetCenterX() + 192 * dir - Argv * dir, GetY(), 20, 4 );
+ WaitSpeedDown( 0.3 );
+ SetShotDirectionType( PLAYER );
+ ascent( let i in 2..13 ){ CreateShot01( GetX(), GetY(), i / 2, 0, [ BLUE04, RED04 ][ dir == 1 ], 10 ); }
+ PlaySE( seShot1 );
+ SetAngle( [ 300, 240 ][ dir == 1 ] );
+ while( GetSpeed() < 3 ){
+ SetSpeed( GetSpeed() + 0.1 );
+ Wait( 2 );
+ }
+ }
+ @Initialize{
+ SetLife( 50 );
+ SetDamageRate( 2, 2 );
+ Behavior();
+ }
+ @MainLoop{
+ if( count == 40 ){ SetDamageRate( 100, 30 ); }
+ SEShotHit( seDamage, count );
+ Collision( 20, 8 );
+ Gone();
+ yield;
+ count++;
+ }
+ @Finalize{
+ if( !BeVanished() ){
+ SetShotDirectionType( PLAYER );
+ let angle = 0;
+ while( angle < 360 ){
+ ascent( let speed in 1..6 ){
+ let dir = 1;
+ loop( 2 ){
+ CreateShot02( GetX(), GetY(), 15 + speed, angle + speed * 2 * dir, -1.2, speed * 2, WHITE02, 0 );
+ dir = -dir;
+ }
+ }
+ angle += 10;
+ }
+ PlaySE( seShot1 );
+ CreateItem( ITEM_1UP, GetX(), GetY() );
+ }
+ }
+ @DrawLoop{
+ DrawCircle( imgSystemCircleWhite, count, 64 );
+ SetGraphicRect( 1, 1, 32, 32 );
+ DrawYosei( imgEnemyYosei5, count );
+ }
+}
diff --git a/th_dnh/script/thA/index_boss.dnh b/th_dnh/script/thA/index_boss.dnh
new file mode 100644
index 0000000..d445e58
--- /dev/null
+++ b/th_dnh/script/thA/index_boss.dnh
@@ -0,0 +1,22 @@
+let bossDaiyosei = GetCurrentScriptDirectory() ~ "Daiyosei.dnh";
+let bossAlice = GetCurrentScriptDirectory() ~ "Alice.dnh";
+let bossAliceE = GetCurrentScriptDirectory() ~ "AliceE.dnh";
+let bossChina = GetCurrentScriptDirectory() ~ "China.dnh";
+let bossSakuya = GetCurrentScriptDirectory() ~ "Sakuya.dnh";
+let bossSakuyaE = GetCurrentScriptDirectory() ~ "SakuyaE.dnh";
+let bossLetty = GetCurrentScriptDirectory() ~ "Letty.dnh";
+let bossLily = GetCurrentScriptDirectory() ~ "Lily.dnh";
+let bossLilyE = GetCurrentScriptDirectory() ~ "LilyE.dnh";
+let bossLeilaA = GetCurrentScriptDirectory() ~ "LeilaA.dnh";
+let bossLeilaB = GetCurrentScriptDirectory() ~ "LeilaB.dnh";
+let bossLeilaBE = GetCurrentScriptDirectory() ~ "LeilaBE.dnh";
+let bossMerryA = GetCurrentScriptDirectory() ~ "MerryA.dnh";
+let bossMerryB = GetCurrentScriptDirectory() ~ "MerryB.dnh";
+let bossMerryBE = GetCurrentScriptDirectory() ~ "MerryBE.dnh";
+let bossMerryC = GetCurrentScriptDirectory() ~ "MerryC.dnh";
+let bossCavedA = GetCurrentScriptDirectory() ~ "CavedA.dnh";
+let bossCavedB = GetCurrentScriptDirectory() ~ "CavedB.dnh";
+let bossCavedBE = GetCurrentScriptDirectory() ~ "CavedBE.dnh";
+let bossMerryX = GetCurrentScriptDirectory() ~ "MerryX.dnh";
+let bossRenko = GetCurrentScriptDirectory() ~ "Renko.dnh";
+let bossRenkoE = GetCurrentScriptDirectory() ~ "RenkoE.dnh";
diff --git a/th_dnh/script/thA/index_zako.dnh b/th_dnh/script/thA/index_zako.dnh
new file mode 100644
index 0000000..7962532
--- /dev/null
+++ b/th_dnh/script/thA/index_zako.dnh
@@ -0,0 +1,46 @@
+let _enemyBlur = GetCurrentScriptDirectory() ~ "Blur.dnh";
+let _enemyConcentrate = GetCurrentScriptDirectory() ~ "Concentrate.dnh";
+let _enemyED = GetCurrentScriptDirectory() ~ "ED.dnh";
+let _enemyExtend = GetCurrentScriptDirectory() ~ "Extend.dnh";
+let enemyDoll01 = GetCurrentScriptDirectory() ~ "Doll01.dnh";
+let enemyDoll02 = GetCurrentScriptDirectory() ~ "Doll02.dnh";
+let enemyDoll03 = GetCurrentScriptDirectory() ~ "Doll03.dnh";
+let enemyDoll04 = GetCurrentScriptDirectory() ~ "Doll04.dnh";
+let enemyDollX01 = GetCurrentScriptDirectory() ~ "DollX01.dnh";
+let enemyKedama01 = GetCurrentScriptDirectory() ~ "Kedama01.dnh";
+let enemyKedama02 = GetCurrentScriptDirectory() ~ "Kedama02.dnh";
+let enemyKedama03 = GetCurrentScriptDirectory() ~ "Kedama03.dnh";
+let enemyKedama04 = GetCurrentScriptDirectory() ~ "Kedama04.dnh";
+let enemyKedama05 = GetCurrentScriptDirectory() ~ "Kedama05.dnh";
+let enemyKedama06 = GetCurrentScriptDirectory() ~ "Kedama06.dnh";
+let enemyYosei01 = GetCurrentScriptDirectory() ~ "Yosei01.dnh";
+let enemyYosei02 = GetCurrentScriptDirectory() ~ "Yosei02.dnh";
+let enemyYosei03 = GetCurrentScriptDirectory() ~ "Yosei03.dnh";
+let enemyYosei04 = GetCurrentScriptDirectory() ~ "Yosei04.dnh";
+let enemyYosei05 = GetCurrentScriptDirectory() ~ "Yosei05.dnh";
+let enemyYosei06 = GetCurrentScriptDirectory() ~ "Yosei06.dnh";
+let enemyYosei07 = GetCurrentScriptDirectory() ~ "Yosei07.dnh";
+let enemyYosei08 = GetCurrentScriptDirectory() ~ "Yosei08.dnh";
+let enemyYosei09 = GetCurrentScriptDirectory() ~ "Yosei09.dnh";
+let enemyYosei10 = GetCurrentScriptDirectory() ~ "Yosei10.dnh";
+let enemyYosei11 = GetCurrentScriptDirectory() ~ "Yosei11.dnh";
+let enemyYosei12 = GetCurrentScriptDirectory() ~ "Yosei12.dnh";
+let enemyYosei13 = GetCurrentScriptDirectory() ~ "Yosei13.dnh";
+let enemyYosei14 = GetCurrentScriptDirectory() ~ "Yosei14.dnh";
+let enemyYosei15 = GetCurrentScriptDirectory() ~ "Yosei15.dnh";
+let enemyYosei16 = GetCurrentScriptDirectory() ~ "Yosei16.dnh";
+let enemyYosei17 = GetCurrentScriptDirectory() ~ "Yosei17.dnh";
+let enemyYosei18 = GetCurrentScriptDirectory() ~ "Yosei18.dnh";
+let enemyYosei19 = GetCurrentScriptDirectory() ~ "Yosei19.dnh";
+let enemyYosei20 = GetCurrentScriptDirectory() ~ "Yosei20.dnh";
+let enemyYosei21 = GetCurrentScriptDirectory() ~ "Yosei21.dnh";
+let enemyYoseiX01 = GetCurrentScriptDirectory() ~ "YoseiX01.dnh";
+let enemyYoseiX02 = GetCurrentScriptDirectory() ~ "YoseiX02.dnh";
+let enemyYoseiX03 = GetCurrentScriptDirectory() ~ "YoseiX03.dnh";
+let enemyYoseiX04 = GetCurrentScriptDirectory() ~ "YoseiX04.dnh";
+let enemyYoseiX05 = GetCurrentScriptDirectory() ~ "YoseiX05.dnh";
+let enemyYoseiX06 = GetCurrentScriptDirectory() ~ "YoseiX06.dnh";
+let enemyYoseiX07 = GetCurrentScriptDirectory() ~ "YoseiX07.dnh";
+let enemyYoseiX08 = GetCurrentScriptDirectory() ~ "YoseiX08.dnh";
+let enemyYoseiX09 = GetCurrentScriptDirectory() ~ "YoseiX09.dnh";
+let enemyYoseiX10 = GetCurrentScriptDirectory() ~ "YoseiX10.dnh";
diff --git a/th_dnh/script/thA/thA.dnh b/th_dnh/script/thA/thA.dnh
new file mode 100644
index 0000000..06016a9
--- /dev/null
+++ b/th_dnh/script/thA/thA.dnh
@@ -0,0 +1,746 @@
+#東方弾幕風[Stage]
+#Title[東方時封城 〜 the Alternative Age]
+#Text[THA_VERSION1.00(R140)]
+#ScriptVersion[2]
+#BGM[]
+#Image[.\IMAGE\SYSTEM\Jacket.png]
+
+script_stage_main{
+#include_function ".\FUNC\Stage.dnh"
+#include_function ".\STAGE\index.dnh"
+ let count = 0;
+ let Phase = 0;
+ let PrevStage = -1;
+ let PhaseStartCount = 1;
+ let now = 0;
+ let DrawFrameCount = 0;
+ let LogoAnimeSkip = false;
+ let Level = 1;
+ let MainMenu = 0;
+ let MusicRoom = 0;
+ let ExtraSelect = 0;
+ let PracticeMode = 0;
+ let PracticeStage = 0;
+ let OptionSelect = 0;
+ let SpellSelect = 0;
+ let StageTitleAlpha = 0;
+ let SlowEffectAlpha = 0;
+ let WhiteFadeOutAlpha = 0;
+ let ShowNameAlpha = 0;
+ let ShowName = 0;
+ let PrevBGM = 0;
+ let PrevBGStep = 0;
+ let BGMStartCount = 0;
+ let NormIndex = 0;
+ let PlayerDefaultX;
+ let PlayerDefaultY;
+ let BGEffectX = [];
+ let BGEffectY = [];
+ let BGEffectZ = [];
+ let BGEffectLife = [];
+ let BGEffectParam = [];
+ let BGEffectVectorX = [];
+ let BGEffectVectorY = [];
+ let BGEffectVectorZ = [];
+ let SpellCardPlayHistory = [];
+ let SpellCardGetHistory = [];
+ let SpellCardHighScore = [];
+ let MusicRelease = [];
+ let StageRelease = [];
+ let StageHighScore = [];
+ let SpellPracticeDefaultLoadGraphicList = [
+ imgSystemCircleWhite, imgSystemCircleYellow, imgSystemCircleRed, imgSystemCircleGreen, imgSystemCircleBlue, imgSystemPlayerBorder, imgSystemLevel, imgMapWhite, imgEnemyShadow
+ ];
+ let DefaultStageLoadGraphicList = SpellPracticeDefaultLoadGraphicList ~ [
+ imgSystemEqual, imgSystemResult, imgSystemResultNum, imgSystemClear, imgSystemPushKey, imgEnemyYosei1, imgEnemyYosei2, imgEnemyYosei3, imgEnemyYosei4, imgEnemyYosei5,
+ imgEnemyKedamaAqua, imgEnemyKedamaBlue, imgEnemyKedamaGreen, imgEnemyKedamaOrange, imgEnemyKedamaPurple, imgEnemyKedamaRed, imgEnemyKedamaWhite, imgEnemyKedamaYellow,
+ imgCutInReimu, imgCutInReimu2, imgCutInReimu3, imgCutInReimu4, imgCutInReimu5, imgCutInMarisa, imgCutInMarisa2, imgCutInMarisa3, imgCutInMarisa4
+ ];
+ let DefaultStageLoadSEList = [
+ seDamage, seBossExplode, seKira1, seKira2, seKira3, seLaser1, seLaser2, sePower1, sePower2, seShot1, seShot2, seShot3, seTimeOut, seHidden, seSudden, seShadow
+ ];
+ let DeleteLoadGraphicList = [
+ imgSystemLogo, imgSystemLogoBG, imgSystemLevelSelect, imgSystemMenu, imgSystemCopyright, imgSystemNumMiddle, imgSystemSpellResult,
+ imgSystemPractice, imgSystemOption, imgSystemBoolean, imgSystemMusicComment, imgSystemStage, imgSystemNetabare,
+ imgCutInAlice, imgCutInKene, imgCutInLeila, imgCutInLetty, imgCutInLily, imgCutInMerry, imgCutInRenko, imgCutInSakuya
+ ];
+ let DeleteLoadSEList = [ seCancel, seSelect ];
+ let NormList = [ 0, 200, 450, 800, 1300, 1900, 9999, 99999, -1 ];
+ let debug = false;
+ let EXGuard = true;
+ task Behavior(){
+ yield;
+ ForbidBomb( true );
+ ForbidShot( true );
+ PlayerDefaultX = GetPlayerX();
+ PlayerDefaultY = GetPlayerY();
+ while( GetCommonDataDefault( "LoadingProgress", 0 ) != -1 ){
+ LoadProgress( now, [
+ imgSystemProgress, imgSystemProgressBG, imgSystemNumSmall, imgSystemLogo, imgSystemLogoBG, imgSystemLevelSelect, imgSystemMenu,
+ imgSystemMusicComment, imgSystemCopyright, imgSystemPractice, imgSystemMusicList, imgSystemOption, imgSystemNum, imgSystemSpellResult,
+ imgSystemNumMiddle, imgSystemBoolean, imgSystemStage, imgSystemOtama, imgSystemName, imgSystemSpellName, imgSystemSpellBonus, imgSystemNetabare,
+ imgCutInAlice, imgCutInKene, imgCutInLeila, imgCutInLetty, imgCutInLily, imgCutInMerry, imgCutInRenko, imgCutInSakuya
+ ], [ seCancel, seOk, seSelect, seTimeOut ], [ _enemyExtend ] );
+ yield;
+ }
+ PlayMusicEx( 1 );
+ NextPhase();
+ while( now < 160 || !LogoAnimeSkip ){
+ if( !LogoAnimeSkip && GetKeyState( VK_SHOT ) == KEY_PUSH ){
+ PlaySEEx( seOk );
+ if( GetKeyState( VK_BOMB ) == KEY_HOLD ){
+ EXGuard = false;
+ PlaySEEx( seTimeOut );
+ }
+ LogoAnimeSkip = true;
+ }
+ yield;
+ }
+ NextPhase();
+ Wait( 30 ); // 背景フェード用ウェイト:触るな危険
+ NextPhase();
+ yield;
+ while( GetCommonDataDefault( "Stage", -1 ) == -1 ){
+ yield;
+ alternative( Phase )
+ case( 3 ){
+ SetCommonData( "Practice", false );
+ while( GetKeyState( VK_SHOT ) != KEY_PUSH ){
+ MainMenu = MenuSelect( MainMenu, seSelect, 4 );
+ if( MainMenu == 1 && EXGuard ){ MainMenu = MenuSelect( MainMenu, seSelect, 4 ); }
+ yield;
+ }
+ PlaySEEx( seOk );
+ SetPhase( Phase + MainMenu + 1 );
+ }
+ case( 4 ){
+ while( GetKeyState( VK_SHOT ) != KEY_PUSH && GetKeyState( VK_BOMB ) != KEY_PUSH ){
+ Level = MenuSelect( Level, seSelect, 3 );
+ yield;
+ }
+ if( GetKeyState( VK_SHOT ) == KEY_PUSH ){
+ SetCommonData( "Level", Level );
+ PlaySEEx( seOk );
+ SetPhase( 20 + [ 0, PracticeStage ][ GetCommonDataDefault( "Practice", false ) ] );
+ DeleteGraphicList( DeleteLoadGraphicList, DeleteLoadSEList );
+ if( !GetCommonDataDefault( "Practice", false ) ){ Stage1(); }
+ else{
+ Extend( 5 );
+ if( !debug ){ SetAllowedContinueCount( 0 ); }
+ alternative( PracticeStage )
+ case( 0 ){ Stage1(); }
+ case( 1 ){ Stage2(); }
+ case( 2 ){ Stage3(); }
+ case( 3 ){ Stage4(); }
+ case( 4 ){ Stage5(); }
+ case( 5 ){ Stage6(); }
+ }
+ return;
+ }
+ else{
+ PlaySEEx( seCancel );
+ SetPhase( [ 3, 9 ][ GetCommonDataDefault( "Practice", false ) ] );
+ }
+ }
+ case( 5 ){
+ while( GetKeyState( VK_SHOT ) != KEY_PUSH && GetKeyState( VK_BOMB ) != KEY_PUSH ){
+ ExtraSelect = MenuSelect( ExtraSelect, seSelect, 0 );
+ yield;
+ }
+ if( GetKeyState( VK_SHOT ) == KEY_PUSH ){
+ PlaySEEx( seOk );
+ SetCommonData( "Level", 4 );
+ SetPhase( 26 );
+ DeleteGraphicList( DeleteLoadGraphicList, DeleteLoadSEList );
+ SetAllowedContinueCount( 0 );
+ StageEX();
+ return;
+ }
+ else{
+ PlaySEEx( seCancel );
+ SetPhase( 3 );
+ }
+ }
+ case( 6 ){
+ while( GetKeyState( VK_SHOT ) != KEY_PUSH && GetKeyState( VK_BOMB ) != KEY_PUSH ){
+ PracticeMode = MenuSelect( PracticeMode, seSelect, 1 );
+ yield;
+ }
+ if( GetKeyState( VK_SHOT ) == KEY_PUSH ){
+ PlaySEEx( seOk );
+ SetPhase( 9 + PracticeMode );
+ }
+ else{
+ PlaySEEx( seCancel );
+ SetPhase( 3 );
+ }
+ }
+ case( 7 ){
+ while( GetKeyState( VK_BOMB ) != KEY_PUSH ){
+ MusicRoom = MenuSelect( MusicRoom, seSelect, 17 );
+ if( GetKeyState( VK_SHOT ) == KEY_PUSH ){
+ MusicRelease[ MusicRoom + 1 ] = true;
+ PlaySEEx( seOk );
+ PlayMusicEx( MusicRoom + 1 );
+ }
+ yield;
+ }
+ PlaySEEx( seCancel );
+ CreateSaveData();
+ SaveEx();
+ MuteMusic();
+ PlayMusicEx( 1 );
+ SetPhase( 3 );
+ }
+ case( 8 ){
+ while( GetKeyState( VK_BOMB ) != KEY_PUSH ){
+ OptionSelect = MenuSelect( OptionSelect, seSelect, 4 );
+ if( GetKeyState( VK_SHOT ) == KEY_PUSH ){
+ PlaySEEx( seOk );
+ if( OptionSelect == 0 ){ SetCommonData( "Continue", MinMaxLoop( GetCommonDataDefault( "Continue", 1 ) + 1, 0, 3 ) ); }
+ else{
+ let key = [ "BGGEnable", "BGEEnable", "BGMEnable", "SEEnable" ][ OptionSelect - 1 ];
+ SetCommonData( key, !GetCommonDataDefault( key, true ) );
+ }
+ }
+ yield;
+ }
+ PlaySEEx( seCancel );
+ CreateSaveData();
+ SaveEx();
+ PlayMusicEx( [ 0, 1 ][ GetCommonDataDefault( "BGMEnable", true ) ] );
+ SetPhase( 3 );
+ }
+ case( 9 ){
+ while( GetKeyState( VK_SHOT ) != KEY_PUSH && GetKeyState( VK_BOMB ) != KEY_PUSH ){
+ PracticeStage = MenuSelect( PracticeStage, seSelect, 5 );
+ yield;
+ }
+ if( GetKeyState( VK_SHOT ) == KEY_PUSH ){
+ PlaySEEx( seOk );
+ SetCommonData( "Practice", true );
+ StageRelease[ PracticeStage ] = true;
+ CreateSaveData();
+ SaveEx();
+ SetPhase( 4 );
+ }
+ else{
+ PlaySEEx( seCancel );
+ SetPhase( 3 );
+ }
+ }
+ case( 10 ){
+ while( GetKeyState( VK_SHOT ) != KEY_PUSH && GetKeyState( VK_BOMB ) != KEY_PUSH ){
+ if( IsPushDirKey() ){
+ PlaySEEx( seSelect );
+ if( GetKeyState( VK_UP ) == KEY_PUSH ){ SpellSelect--; }
+ if( GetKeyState( VK_DOWN ) == KEY_PUSH ){ SpellSelect++; }
+ if( GetKeyState( VK_LEFT ) == KEY_PUSH ){ SpellSelect -= 12; }
+ if( GetKeyState( VK_RIGHT ) == KEY_PUSH ){ SpellSelect += 12; }
+ }
+ SpellSelect = MinMaxLoop( SpellSelect, 0, 119 );
+ yield;
+ }
+ if( GetKeyState( VK_SHOT ) == KEY_PUSH ){
+ SetCommonData( "SpellPractice", true );
+ SetCommonData( "Level", [ 4, SpellSelect % 4 ][ SpellSelect < 108 ] );
+ PlaySEEx( seOk );
+ SetPhase( 30 + SpellSelect );
+ DeleteGraphicList( DeleteLoadGraphicList, DeleteLoadSEList );
+ SpellPractice( SpellSelect );
+ return;
+ }
+ else{
+ PlaySEEx( seCancel );
+ SetPhase( [ 3, 9 ][ GetCommonDataDefault( "Practice", false ) ] );
+ }
+ }
+ others{
+ SetPhase( 3 );
+ }
+ }
+ }
+ @Initialize{
+ SetCommonData( "Continue", 1 );
+ SetCommonData( "BGGEnable", true );
+ SetCommonData( "BGEEnable", true );
+ SetCommonData( "BGMEnable", true );
+ SetCommonData( "SEEnable", true );
+ local{
+ ascent( let i in 0..120 ){
+ SpellCardGetHistory = SpellCardGetHistory ~ [ 0 ];
+ SpellCardPlayHistory = SpellCardPlayHistory ~ [ 0 ];
+ SpellCardHighScore = SpellCardHighScore ~ [ 0 ];
+ }
+ }
+ local{
+ ascent( let i in 0..6 ){
+ StageRelease = StageRelease ~ [ i == 0 ];
+ StageHighScore = StageHighScore ~ [ 0 ];
+ }
+ }
+ local{ ascent( let i in 0..19 ){ MusicRelease = MusicRelease ~ [ i <= 1 ]; } }
+ LoadCommonData();
+ DataMinimize();
+ SetCommonData( "LoadingProgress", 0 );
+ SetCommonData( "Stage", -1 );
+ SetCommonData( "StageTitle", false );
+ LoadGraphic( imgMapBlack );
+ ExpertEx( debug, GetCommonDataDefault( "Continue", 1 ), 3 );
+ // ↑弄ると正常にリプレイが再生できなくなりますのでご注意を。
+ PlayMusic( bgmList[ 0 ] );
+ SetShotAutoDeleteClip( 64, 64, 64, 64 );
+ Behavior();
+ }
+ @MainLoop{
+ SetCommonData( "GlobalCount", count );
+ SetCommonData( "NowCount", now );
+ SetCommonData( "DrawFrameCount", DrawFrameCount );
+ if( PrevStage != GetCommonDataDefault( "Stage", -1 ) ){
+ PrevStage = GetCommonDataDefault( "Stage", -1 );
+ NextPhase();
+ }
+ if( PrevStage != -1 ){
+ if( SlowEffectAlpha != 0 || GetKeyState( VK_SLOWMOVE ) == KEY_HOLD ){ SlowEffectAlpha = MinMax( SlowEffectAlpha + [ -1, 1 ][ GetKeyState( VK_SLOWMOVE ) == KEY_HOLD ], 0, 64 ); }
+ if( StageTitleAlpha != 0 || GetCommonDataDefault( "StageTitle", false ) ){
+ StageTitleAlpha = MinMax( StageTitleAlpha + [ -4, 3 ][ GetCommonDataDefault( "StageTitle", false ) ] , 0, 255 );
+ }
+ if( ShowNameAlpha != 0 || GetCommonDataDefault( "ShowName", -1 ) != -1 ){
+ ShowNameAlpha = MinMax( ShowNameAlpha + [ -5, 1.5 ][ GetCommonDataDefault( "ShowName", -1 ) != -1 ], 0, 255 );
+ if( GetCommonDataDefault( "ShowName", -1 ) != -1 ){ ShowName = GetCommonDataDefault( "ShowName", -1 ); }
+ }
+ if( PrevBGStep != GetCommonDataDefault( "BGStep", 0 ) ){
+ PrevBGStep = GetCommonDataDefault( "BGStep", 0 );
+ SetCommonData( "BGStepChangeCount", now );
+ }
+ if( NormList[ NormIndex ] >= 0 && GetPoint() >= NormList[ NormIndex ] ){
+ if( NormIndex != 0 ){ Extend( 1 ); }
+ NormIndex = Min( NormIndex + 1, length( NormList ) - 1 );
+ SetNormPoint( NormList[ NormIndex ] );
+ }
+ if( Continued() ){
+ if( GetPoint() * 50000 < GetCommonDataDefault( "ResultPoint", 0 ) ){ SetCommonData( "ResultPoint", 0 ) }
+ if( GetGraze() * 500 < GetCommonDataDefault( "ResultGraze", 0 ) ){ SetCommonData( "ResultGraze", 0 ) }
+ }
+ }
+ if( PrevBGM != GetCommonDataDefault( "NowBGM", 0 ) ){
+ PrevBGM = GetCommonDataDefault( "NowBGM", 0 );
+ BGMStartCount = count;
+ }
+ if( WhiteFadeOutAlpha != 0 || GetCommonDataDefault( "WhiteFadeOut", 0 ) != 0 ){
+ WhiteFadeOutAlpha = MinMax( WhiteFadeOutAlpha + [ -1, 0.5 ][ GetCommonDataDefault( "WhiteFadeOut", 0 ) != 0 ], 0, 255 );
+ }
+ yield;
+ if( GetCommonDataDefault( "Stage", -1 ) == -1 || GetCommonDataDefault( "Ready", false ) ){
+ SetPlayerX( PlayerDefaultX );
+ SetPlayerY( PlayerDefaultY );
+ }
+ MoveBGEffect();
+ if( !GetCommonDataDefault( "Ready", false ) && GetCommonDataDefault( "LoadingProgress", -1 ) == -1 && GetCommonDataDefault( "BGStep", 0 ) != 32767 ){
+ alternative( GetCommonDataDefault( "Stage", -1 ) )
+ case( 0 ){ Stage1Loop( now ); }
+ case( 1 ){ Stage2Loop( now ); }
+ case( 2 ){ Stage3Loop( now ); }
+ case( 3 ){ Stage4Loop( now ); }
+ case( 4 ){ Stage5Loop( now ); }
+ case( 5 ){ Stage6Loop( now ); }
+ case( 6 ){ StageEXLoop( now ); }
+ }
+ if( PrevBGM == 18 && GetCommonDataDefault( "BGStep", 0 ) == 32767 && GetCommonDataDefault( "BGGEnable", true ) ){
+ let scount = count - BGMStartCount;
+ if( scount % trunc( Smooth( 30, 5, scount, 5000 ) ) == 0 ){ AddBGEffect( -50, 0, 0, RandBlur( 1.2 ), rand( 1, 4 ), RandBlur( 1.2 ), 255, 0 ); }
+ if( scount > 11555 ){ Clear(); }
+ }
+ count += [ 1, 5 ][ Phase == 1 && LogoAnimeSkip ];
+ now = count - PhaseStartCount;
+ }
+ @BackGround{
+ if( GetCommonDataDefault( "BGGEnable", true ) && !GetCommonDataDefault( "Ready", false ) && GetCommonDataDefault( "LoadingProgress", -1 ) == -1 && GetCommonDataDefault( "BGStep", 0 ) != 32767 ){
+ UseZBuffer( true );
+ WriteZBuffer( true );
+ alternative( GetCommonDataDefault( "Stage", -1 ) )
+ case( 0 ){ Stage1BG( now ); }
+ case( 1 ){ Stage2BG( now ); }
+ case( 2 ){ Stage3BG( now ); }
+ case( 3 ){ Stage4BG( now ); }
+ case( 4 ){ Stage5BG( now ); }
+ case( 5 ){ Stage6BG( now ); }
+ case( 6 ){ StageEXBG( now ); }
+ }
+ DrawFrameCount++;
+ }
+ @DrawBottomObject{ if( debug ){ DrawNumSmall( imgSystemNumSmall, now / 6, GetClipMinX() + 32, GetClipMaxY() - 24 ); } }
+ @DrawTopObject{
+ if( GetCommonDataDefault( "Stage", -1 ) == -1 || GetCommonDataDefault( "BGStep", 0 ) == 32767 ){
+ SetGraphicRect( 0, 0, 512, 512 );
+ DrawCenter( imgMapBlack );
+ }
+ if( Phase >= 1 && Phase < 20 ){
+ if( Phase == 1 && now < 150 ){
+ if( now > 80 ){
+ let rgb = Smooth( 0, 255, now - 80, 60 );
+ SetColor( rgb, rgb, rgb );
+ }
+ else{ SetColor( 0, 0, 0 ); }
+ }
+ if( Phase == 2 ){
+ let rgb = Smooth( 255, 96, now, 30 );
+ SetColor( rgb, rgb, rgb );
+ }
+ if( Phase > 2 ){ SetColor( 96, 96, 96 ); }
+ SetGraphicRect( 0, 0, 384, 448 );
+ DrawCenter( imgSystemLogoBG );
+ if( Phase == 1 && now < 150 ){
+ if( now > 80 ){ SetColor( Smooth( 96, 255, now - 80, 60 ), Smooth( 0, 255, now - 80, 60 ), 255 ); }
+ else{ SetColor( Smooth( 0, 96, now, 80 ), 0, Smooth( 0, 255, now, 80 ) ); }
+ }
+ _DrawChrRect( imgSystemLogo, GetClipMinX() + 96, GetCenterY() - [ 0, SlowDown( 32, 0, now, 90 ) ][ Phase == 1 ], 0, 0, 192, 448 );
+ SetColor( 255, 255, 255 );
+ alternative( Phase )
+ case( 3 ){
+ ascent( let y in 0..5 ){
+ let ex = [ 0.7, 1 ][ y == MainMenu ];
+ SetAlpha( Smooth( 0, [ 96, 255 ][ y == MainMenu ], now, 20 ) );
+ SetColor( 255, 255, [ 255, 240 + sin( now * 3 ) * 16 ][ y == MainMenu ] );
+ SetGraphicScale( ex, ex );
+ DrawMainMenu( imgSystemMenu, y, SlowDown( [ 32, 64 ][ y % 2 ], 48, now, 20 ) + [ 16, 0 ][ y == MainMenu ] );
+ }
+ }
+ case( 4 ){
+ ascent( let i in 0..4 ){
+ let ex = [ 0.86, 1 ][ i == Level ];
+ let posx = [ 0, 160 ][ i % 2 ];
+ let posy = [ 0, 96 ][ trunc( i / 2 ) ];
+ SetGraphicScale( ex, ex );
+ SetAlpha( Smooth( 0, [ 96, 255 ][ i == Level ], now, 20 ) );
+ _DrawChrRect( imgSystemLevelSelect, GetCenterX() + [ 64, 48 ][ i == Level ] + ( i - 1.5 ) * SlowDown( 0, 16, now, 20 ), 112 + i * 88, posx, posy, 160 + posx, 96 + posy );
+ }
+ }
+ case( 5 ){
+ let y = 0;
+ let ex = [ 0.86, 1 ][ y == ExtraSelect ];
+ let posy = 96 * y;
+ let posx = 160 * y;
+ SetGraphicScale( ex, ex );
+ SetAlpha( Smooth( 0, [ 96, 255 ][ y == ExtraSelect ], now, 20 ) );
+ _DrawChrRect( imgSystemLevelSelect, GetCenterX() + [ 64, 48 ][ y == ExtraSelect ] + ( y - 0.5 ) * SlowDown( 0, 24, now, 20 ), 160 + y * 128, 320, posy, 480, posy + 96 );
+ }
+ case( 6 ){
+ ascent( let y in 0..2 ){
+ let ex = [ 0.7, 1 ][ y == PracticeMode ];
+ SetAlpha( Smooth( 0, [ 96, 255 ][ y == PracticeMode ], now, 20 ) );
+ SetColor( 255, 255, [ 255, 240 + sin( now * 3 ) * 16 ][ y == PracticeMode ] );
+ SetGraphicScale( ex, ex );
+ DrawMainMenu( imgSystemPractice, y, SlowDown( [ 32, 64 ][ y % 2 ], 48, now, 20 ) + [ 16, 0 ][ y == PracticeMode ] );
+ }
+ }
+ case( 7 ){
+ let height = 27;
+ ascent( let i in 0..12 ){
+ let xx = GetCenterX() + [ 32, 0 ][ i == 5 ] + i * 3 + SlowDown( [ 0, -16, 0, 16 ][ i % 4 ], 0, now, 20 );
+ let yy = GetClipMinY() + 64 + i * 20 + SlowDown( [ -16, 0, 16, 0 ][ i % 4 ], 0, now, 20 );
+ let title = ( 18 + i + MusicRoom - 4 ) % 18;
+ if( title == 0 ){ title = 18; }
+ SetMainMenuRect( [ 0, title ][ debug || MusicRelease[ title ] ], height, 256, height - 1 );
+ SetAlpha( Smooth( 0, [ Smooth( [ 96, 32 ][ i < 5 ], [ 32, 96 ][ i < 5 ], i - [ 6, 0 ][ i < 5 ], [ 6, 4 ][ i < 5 ] ), 255 ][ i == 5 ], now, 20 ) );
+ SetColor( 255, 255, [ 255, 240 + sin( now * 3 ) * 16 ][ i == 5 ] );
+ _DrawChr( imgSystemMusicList, xx, yy );
+ DrawNumMiddle( imgSystemNumMiddle, title, xx - 144, yy );
+ }
+ SetColor( 255, 255, 255 );
+ SetAlpha( Smooth( 0, 255, now, 20 ) );
+ SetMainMenuRect( GetCommonDataDefault( "NowBGM", 1 ), height, 256, height - 1 );
+ _DrawChr( imgSystemMusicList, GetCenterX() + 32, GetClipMaxY() - 56 );
+ _DrawChrRect( imgSystemOtama, GetCenterX() - 144, GetClipMaxY() - 54, 0, 0, 24, 28 );
+ DrawNumMiddle( imgSystemNumMiddle, GetCommonDataDefault( "NowBGM", 1 ), GetCenterX() - 112, GetClipMaxY() - 56 );
+ let commentheight = 72;
+ let posx = 333 * trunc( MusicRoom / 9 );
+ let posy = commentheight * ( MusicRoom % 9 );
+ if( MusicRelease[ MusicRoom + 1 ] ){ _DrawChrRect( imgSystemMusicComment, GetCenterX(), GetCenterY() + 112, 1 + posx, 1 + posy, 334 + posx, 1 + commentheight + posy ); }
+ else{ _DrawChrRect( imgSystemNetabare, GetCenterX(), GetCenterY() + 104, 0, 0, 320, 96 ); }
+ }
+ case( 8 ){
+ ascent( let y in 0..5 ){
+ let yy = GetClipMinY() + 64 + y * 40 + SlowDown( [ 0, -16, 0, 16 ][ y % 4 ], 0, now, 20 );
+ let xx = GetClipMinX() + 128 + SlowDown( [ -16, 0, 16, 0 ][ y % 4 ], 0, now, 20 );
+ SetMainMenuRect( y, 44, 202, 44 );
+ SetAlpha( Smooth( 0, [ 96, 255 ][ y == OptionSelect ], now, 20 ) );
+ SetColor( 255, 255, [ 255, 240 + sin( now * 3 ) * 16 ][ y == OptionSelect ] );
+ _DrawChr( imgSystemOption, xx, yy );
+ if( y == 0 ){ DrawNum( imgSystemNum, GetCommonDataDefault( "Continue", 1 ), xx + 192, yy ); }
+ else{
+ let key = [ "BGGEnable", "BGEEnable", "BGMEnable", "SEEnable" ][ y - 1 ];
+ DrawBoolean( imgSystemBoolean, GetCommonDataDefault( key, true ), xx + 192, yy );
+ }
+ }
+ }
+ case( 9 ){
+ ascent( let y in 0..6 ){
+ let yy = GetClipMinY() + 88 + y * 36 + SlowDown( [ 0, -16, 0, 16 ][ y % 4 ], 0, now, 20 );
+ let xx = GetClipMinX() + 128 + SlowDown( [ -16, 0, 16, 0 ][ y % 4 ], 0, now, 20 );
+ let ex = [ 0.7, 1 ][ y == PracticeStage ];
+ SetAlpha( Smooth( 0, [ 96, 255 ][ y == PracticeStage ], now, 20 ) );
+ SetColor( 255, 255, [ 255, 240 + sin( now * 3 ) * 16 ][ y == PracticeStage ] );
+ SetGraphicScale( ex, ex );
+ _DrawChrRect( imgSystemStage, xx, yy, 1, 1, 145, 44 );
+ DrawNum( imgSystemNum, [ 0, y + 1 ][ debug || StageRelease[ y ] ], xx + 160, yy );
+ }
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ SetColor( 255, 255, 255 );
+ if( !StageRelease[ PracticeStage ] ){
+ _DrawChrRect( imgSystemNetabare, GetCenterX(), GetCenterY() + 104, 0, 0, 320, 96 );
+ }
+ else{
+ _DrawChrRect( imgSystemSpellResult, GetClipMinX() + 96, GetClipMaxY() - 96, 0, 0, 128, 20 );
+ DrawNumMiddle( imgSystemNumMiddle, StageHighScore[ PracticeStage ], GetCenterX() + 96, GetClipMaxY() - 96 );
+ }
+ }
+ case( 10 ){
+ let height = 24;
+ let width = 256;
+ let cutin = "";
+ let cutinheight = 344;
+ let name = 0;
+ if( SpellSelect >= 0 && SpellSelect < 8 ){
+ cutin = imgCutInAlice;
+ cutinheight = 320;
+ name = 1;
+ }
+ if( SpellSelect >= 8 && SpellSelect < 20 ){
+ cutin = imgCutInSakuya;
+ cutinheight = 320;
+ name = 3;
+ }
+ if( SpellSelect >= 20 && SpellSelect < 24 ){
+ cutin = imgCutInLetty;
+ cutinheight = 304;
+ name = 4;
+ }
+ if( SpellSelect >= 24 && SpellSelect < 40 ){
+ cutin = imgCutInLily;
+ cutinheight = 288;
+ name = 5;
+ }
+ if( SpellSelect >= 40 && SpellSelect < 60 ){
+ cutin = imgCutInLeila;
+ cutinheight = 304;
+ name = 6;
+ }
+ if( ( SpellSelect >= 60 && SpellSelect < 84 ) || ( SpellSelect >= 108 && SpellSelect < 110 ) ){
+ cutin = imgCutInMerry;
+ cutinheight = 256;
+ name = 7;
+ }
+ if( SpellSelect >= 84 && SpellSelect < 108 ){
+ cutin = imgCutInKene;
+ cutinheight = 344;
+ name = 8;
+ }
+ if( SpellSelect >= 110 ){
+ cutin = imgCutInRenko;
+ cutinheight = 288;
+ name = 9;
+ }
+ if( SpellCardPlayHistory[ SpellSelect ] != 0 ){
+ SetAlpha( 96 );
+ _DrawChrRect( cutin, GetClipMaxX() - 96, GetClipMaxY() - cutinheight / 2, 0, 0, 192, cutinheight );
+ SetAlpha( 255 );
+ _DrawChrRect( imgSystemSpellResult, GetClipMinX() + 96, GetClipMaxY() - 128, 0, 20, 128, 40 );
+ _DrawChrRect( imgSystemSpellResult, GetCenterX() + 32, GetClipMaxY() - 128, 0, 40, 32, 60 );
+ _DrawChrRect( imgSystemSpellResult, GetClipMinX() + 96, GetClipMaxY() - 96, 0, 0, 128, 20 );
+ DrawNumMiddle( imgSystemNumMiddle, SpellCardGetHistory[ SpellSelect ], GetCenterX(), GetClipMaxY() - 128 );
+ DrawNumMiddle( imgSystemNumMiddle, SpellCardPlayHistory[ SpellSelect ], GetCenterX() + 96, GetClipMaxY() - 128 );
+ DrawNumMiddle( imgSystemNumMiddle, SpellCardHighScore[ SpellSelect ], GetCenterX() + 96, GetClipMaxY() - 96 );
+ SetMainMenuRect( name, 21.5, 128, 22 );
+ _DrawChr( imgSystemName, GetClipMaxX() - 128, GetClipMaxY() - 56 );
+ }
+ ascent( let i in 0..12 ){
+ let xx = GetCenterX() + [ 32, 0 ][ i == 5 ] + i * 3 + SlowDown( [ 0, -16, 0, 16 ][ i % 4 ], 0, now, 20 );
+ let yy = GetClipMinY() + 64 + i * 20 + SlowDown( [ -16, 0, 16, 0 ][ i % 4 ], 0, now, 20 );
+ let title = ( 120 + i + SpellSelect - 5 ) % 120;
+ SetAlpha( Smooth( 0, [ Smooth( [ 96, 32 ][ i < 5 ], [ 32, 96 ][ i < 5 ], i - [ 6, 0 ][ i < 5 ], [ 6, 4 ][ i < 5 ] ), 255 ][ i == 5 ], now, 20 ) );
+ SetColor( 255, 255, [ 255, 240 + sin( now * 3 ) * 16 ][ i == 5 ] );
+ DrawNumMiddle( imgSystemNumMiddle, title + 1, xx - 144, yy );
+ if( !debug && SpellCardPlayHistory[ title ] == 0 ){ title = 120; }
+ let srcx = ( title % 4 ) * width;
+ let srcy = trunc( title / 4 ) * height;
+ SetGraphicRect( srcx, srcy, srcx + width, srcy + height );
+ _DrawChr( imgSystemSpellName, xx, yy );
+ }
+ if( SpellCardPlayHistory[ SpellSelect ] == 0 ){
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ SetColor( 255, 255, 255 );
+ _DrawChrRect( imgSystemNetabare, GetCenterX(), GetCenterY() + 112, 0, 0, 320, 96 );
+ }
+ }
+ SetGraphicScale( 1, 1 );
+ SetAlpha( 255 );
+ SetColor( 255, 255, 255 );
+ if( Phase >= 4 && Phase <= 8 && !GetCommonDataDefault( "Practice", false ) ){
+ DrawMenuHeading( imgSystemMenu, MainMenu, now );
+ FadeMainMenu( imgSystemMenu, MainMenu, now );
+ }
+ if( Phase >= 9 && Phase <= 10 ){
+ DrawMenuHeading( imgSystemPractice, PracticeMode, now );
+ FadeMainMenu( imgSystemPractice, PracticeMode, now );
+ }
+ if( Phase == 1 && now < 150 ){ SetAlpha( Smooth( 48, 255, now, 150 ) ); }
+ _DrawChrRect( imgSystemCopyright, GetClipMaxX() - 104, GetClipMaxY() - 20, 1, 1, 164, 40 );
+ SetAlpha( 255 );
+ }
+ if( GetCommonData( "Stage" ) != -1 && GetCommonDataDefault( "BGStep", 0 ) != 32767 ){
+ if( SlowEffectAlpha != 0 ){
+ SetGraphicRect( 0, 0, 64, 64 );
+ SetGraphicAngle( 0, 0, count );
+ SetAlpha( SlowEffectAlpha );
+ DrawPlayer( imgSystemPlayerBorder );
+ SetGraphicAngle( 0, 0, 0 );
+ SetAlpha( 255 );
+ }
+ local{
+ let levelx = GetClipMaxX() - 52;
+ let levely = GetClipMaxY() - 7;
+ SetAlpha( Smooth( 32, 255, Hypot( levelx - GetPlayerX(), levely - GetPlayerY() ), 80 ) );
+ SetMainMenuRect( GetCommonDataDefault( "Level", 1 ), 14, 64, 13 );
+ _DrawChr( imgSystemLevel, levelx, levely );
+ if( GetCommonDataDefault( "Practice", false ) ){
+ SetMainMenuRect( 6, 14, 64, 13 );
+ _DrawChr( imgSystemLevel, levelx, levely - 9 );
+ }
+ if( GetCommonDataDefault( "SpellPractice", false ) ){
+ SetMainMenuRect( 7, 14, 64, 13 );
+ _DrawChr( imgSystemLevel, levelx, levely - 9 );
+ }
+ SetAlpha( 255 );
+ }
+ DrawSpell( imgSystemSpellName, imgSystemSpellBonus, imgSystemNumSmall );
+ if( BGMStartCount != 0 && BGMStartCount + 400 > count ){
+ let y = GetClipMaxY() + [ Smooth( -16, 16, count - ( BGMStartCount + 300 ), 100 ), -16 ][ BGMStartCount + 300 > count ];
+ if( BGMStartCount + 100 > count ){ SetAlpha( Smooth( 0, 255, count - BGMStartCount, 100 ) ); }
+ SetMainMenuRect( GetCommonDataDefault( "NowBGM", 0 ), 27, 256, 26 );
+ _DrawChr( imgSystemMusicList, GetClipMaxX() - 128, y );
+ _DrawChrRect( imgSystemOtama, GetClipMaxX() - 272, y, 1, 1, 23, 28 );
+ }
+ if( StageTitleAlpha != 0 ){
+ SetGraphicRect( 0, 0, 256, 128 );
+ SetAlpha( StageTitleAlpha );
+ DrawCenter( imgStage[ GetCommonData( "Stage" ) ] );
+ }
+ if( ShowNameAlpha != 0 ){
+ let namex = GetClipMaxX() - 104;
+ let namey = GetClipMinY() + 24;
+ SetMainMenuRect( ShowName, 21.5, 128, 22 );
+ SetAlpha( Smooth( Min( 32, ShowNameAlpha ), ShowNameAlpha, Hypot( namex - GetPlayerX(), namey - GetPlayerY() ), 112 ) );
+ _DrawChr( imgSystemName, namex, namey );
+ }
+ }
+ SetAlpha( 255 );
+ if( GetCommonDataDefault( "LoadingProgress", -1 ) != -1 ){
+ SetGraphicRect( 0, 0, 512, 512 );
+ DrawCenter( imgMapBlack );
+ DrawProgress( imgSystemProgress, imgSystemProgressBG, imgSystemNumSmall, 256, 12, 96 );
+ }
+ if( GetCommonDataDefault( "Ready", false ) ){
+ SetGraphicRect( 0, 0, 512, 512 );
+ DrawCenter( imgMapBlack );
+ SetGraphicRect( 1, 1, 256, 27 );
+ _DrawChrRect( imgSystemPushKey, GetClipMaxX() - 128, GetClipMaxY() - 14, 1, 1, 256, 27 );
+ }
+ if( GetCommonDataDefault( "Result", false ) ){
+ SetMainMenuRect( [ 0, 1 ][ GetCommonData( "Stage" ) >= 5 ], 25, 192, 26 );
+ _DrawChr( imgSystemClear, GetCenterX(), GetClipMinY() + 64 );
+ ascent( let i in 0..9 ){
+ let y = GetClipMinY() + 96 + i * 24;
+ if( ( GetCommonData( "Stage" ) >= 5 && ( i == 3 || i == 4 ) ) || ( i != 3 && i != 4 && i != 5 && i != 7 ) ){
+ SetMainMenuRect( [ [ 10, 5 + GetCommonDataDefault( "Level", 1 ) ][ i == 6 ], i ][ i < 5 ], 23.2, 118, 23 );
+ _DrawChr( imgSystemResult, GetClipMinX() + 128, y );
+ let width = 25.4 * [ 0, 0, 0, 1, 1, 0, 3, 0, 2 ][ i ];
+ _DrawChrRect( imgSystemEqual, GetCenterX() + 16, y, 1 + width, 1, 1 + 25.6 + width, 31 );
+ DrawResultNum( imgSystemResultNum, GetCommonDataDefault( "Result" ~ [ "Clear", "Point", "Graze", "Player", "Bomb", "0", "Rank", "0", "Total" ][ i ], 3679 ), i, y );
+ }
+ }
+ }
+ local{
+ let step = GetCommonDataDefault( "EDStep", [ -1, 0 ] );
+ if( step[ 0 ] >= 0 ){
+ if( step[ 0 ] != 0 && IsMarisa() ){ step[ 0 ] = step[ 0 ] + 3; }
+ SetGraphicRect( 0, 0, 384, 448 );
+ if( GetCommonDataDefault( "EDFade", 0 ) != 0 ){ SetAlpha( Smooth( 255, 0, now - GetCommonDataDefault( "EDFade", 0 ), 300 ) ); }
+ DrawCenter( imgED[ step[ 0 ] ] );
+ if( step[ 0 ] != 0 ){
+ SetAlpha( Smooth( 255, 0, now - step[ 1 ], 30 ) );
+ DrawCenter( imgED[ step[ 0 ] - [ 1, 4 ][ IsMarisa() && step[ 0 ] == 4 ] ] );
+ }
+ SetAlpha( 255 );
+ }
+ }
+ if( PrevBGM == 18 && GetCommonDataDefault( "BGStep", 0 ) == 32767 ){
+ let scount = count - BGMStartCount;
+ UseZBuffer( true );
+ WriteZBuffer( true );
+ SetViewFrom( 300, 90, 5 );
+ SetViewTo( 0, 100, 0 );
+ SetFog( Smooth( 50, 500, scount, 1800 ), Smooth( 50, 1000, scount, 1800 ), 0, 0, 0 );
+ if( GetCommonDataDefault( "BGGEnable", true ) ){
+ SetGraphicRect( 0, 0, 512, 512 );
+ SetGraphicAngle( 0, 0, 0 );
+ SetGraphicScale( 10, 10 );
+ SetTexture( imgMapBlack );
+ DrawGraphic3D( 0, 0, -300 );
+ SetGraphicAngle( 90, 0, -count / 2.5 );
+ SetGraphicScale( 0.3, 0.3 );
+ SetTexture( imgMapSeal );
+ DrawGraphic3D( -50, 0, 0 );
+ SetTexture( imgMapSnow );
+ SetGraphicRect( 0, 0, 128, 128 );
+ ascent( let i in 0..length( BGEffectX ) ){
+ SetGraphicAngle( 0, 0, count * 2 );
+ SetAlpha( [ BGEffectLife[ i ], Smooth( 0, 255, 250 - BGEffectLife[ i ], 48 ) ][ BGEffectLife[ i ] > 208 ] );
+ SetColor( 255, 255, BGEffectLife[ i ] );
+ DrawGraphic3D( BGEffectX[ i ], BGEffectY[ i ], BGEffectZ[ i ] );
+ }
+ }
+ SetGraphicScale( 0.2, 0.2 );
+ SetGraphicAngle( 180, 0, 0 );
+ SetTexture( imgSystemStaffRoll );
+ ascent( let i in 0..15 ){
+ let srcx = trunc( i / 8 ) * 256;
+ let srcy = ( i % 8 ) * 64;
+ let dsty = scount / 19 - i * 32 + 50;
+ SetGraphicRect( srcx, srcy, srcx + 256, srcy + 64 );
+ SetAlpha( MinMax( ( dsty - 64 ) * 5, 0, 255 ) );
+ DrawGraphic3D( 8, Max( dsty, 100 ), 200 );
+ }
+ if( scount > 2200 ){
+ if( scount > 2900 ){ SetAlpha( Smooth( 255, 0, scount - 2900, 300 ) ); }
+ else{ SetAlpha( Smooth( 0, 255, scount - 2200, 200 ) ); }
+ SetMainMenuRect( 18, 27, 256, 26 );
+ SetTexture( imgSystemMusicList );
+ DrawGraphic3D( 15, 78, 200 );
+ SetGraphicRect( 0, 0, 24, 28 );
+ SetTexture( imgSystemOtama );
+ DrawGraphic3D( -15, 78, 200 );
+ }
+ if( scount > 10000 ){
+ if( !Continued() ){
+ SetAlpha( Smooth( 0, 255, scount - 10555, 300 ) );
+ SetGraphicRect( 0, 0, 256, 128 );
+ SetTexture( imgSystemExtra );
+ DrawGraphic3D( 8, 112, 200 );
+ }
+ SetAlpha( Smooth( 0, 255, scount - [ 11010, 10555 ][ Continued() ], 300 ) );
+ SetGraphicRect( 0, 0, 128, 32 );
+ SetTexture( imgSystemNextAge );
+ DrawGraphic3D( 24, 78, 200 );
+ }
+ }
+ if( WhiteFadeOutAlpha != 0 ){
+ SetAlpha( WhiteFadeOutAlpha );
+ SetGraphicRect( 0, 0, 512, 512 );
+ DrawCenter( imgMapWhite );
+ SetAlpha( 255 );
+ }
+ }
+}