<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>だくまたゲーム制作ブログ</title>
	<atom:link href="https://d9m.one/feed/" rel="self" type="application/rss+xml" />
	<link>https://d9m.conohawing.com/</link>
	<description></description>
	<lastBuildDate>Thu, 07 Nov 2024 14:52:32 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	
	<item>
		<title>【RPGツクール】イベント変換プラグイン～ピクチャイベント</title>
		<link>https://d9m.one/mmz-plugin-009/</link>
					<comments>https://d9m.one/mmz-plugin-009/#respond</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Thu, 07 Nov 2024 14:52:29 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<category><![CDATA[プラグイン]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2617</guid>

					<description><![CDATA[<p>ピクチャイベントと画面系のイベントを追加しました。アニメーションの表示、picClear、パラメータ無しのコマンドに不具合があったため、この辺も修正しています。ということで、天候の設定イベントは次回に持越しとしました。プ [&#8230;]</p>
<p>投稿 <a href="https://d9m.one/mmz-plugin-009/">【RPGツクール】イベント変換プラグイン～ピクチャイベント</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p><mark style="background-color:#7bdcb5" class="has-inline-color"><strong>ピクチャイベントと画面系のイベントを追加</strong></mark>しました。<br>アニメーションの表示、picClear、パラメータ無しの<strong><mark style="background-color:#7bdcb5" class="has-inline-color">コマンドに不具合があった</mark></strong>ため、この辺も修正しています。ということで、天候の設定イベントは次回に持越しとしました。<br>プラグインは<a href="https://d9m.one/sample/js/d9mScriptToEvent/V0.8.0/d9mScriptToEvent.js">こちら</a>、サンプルスクリプトは<a href="https://d9m.one/sample/js/d9mScriptToEvent/V0.8.0/script000.txt">こちら</a>です。</p>



<p>色調変化系イベントの<strong><mark style="background-color:#7bdcb5" class="has-inline-color">色指定は16進数で指定</mark></strong>するように実装、HTMLのように指定します。パラメータが「R,G,B,グレー」などと４つも並ぶよりかは区別がつきやすくなるかな。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>今回はピクチャイベントと画面系のイベントを追加し、コマンドの不具合を修正しました。移動ルートの設定イベントは、一旦素直に実装してV0.9としよう。</p>



<p>…そういえば、「移動ルートの設定」がどんなイベントになるのか忘れてしまった。１移動ルート１イベントだった気もするし、ちょっと時間かかるかも。</p>



<h2 class="wp-block-heading">●実装済みのイベント</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>文章の表示</li>



<li>フキダシアイコンの表示</li>



<li>イベント処理の中断</li>



<li>イベントの一時消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ラベル</li>



<li>ラベルジャンプ</li>



<li>条件分岐</li>



<li>選択肢の表示</li>



<li>ループ</li>



<li>ループ中断</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>スイッチの操作</li>



<li>変数の操作</li>



<li>セルフスイッチの操作</li>
</ul>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ピクチャの表示</li>



<li>ピクチャの移動</li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">ピクチャの回転</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">ピクチャの色調変更</mark></strong></li>



<li>ピクチャの消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>BGMの再生</li>



<li>BGMのフェードアウト</li>



<li>BGSの再生</li>



<li>BGSのフェードアウト</li>



<li>SEの再生</li>



<li>SEの停止</li>



<li>MEの再生</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ウエイト</li>



<li>アニメーションの表示</li>



<li>透明状態の変更</li>



<li>隊列歩行の変更</li>



<li>隊列メンバーの集合</li>



<li>場所移動</li>
</ul>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">画面のフェードアウト</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">画面のフェードイン</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">画面の色調変更</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">画面のフラッシュ</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">画面のシェイク</mark></strong></li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>
</div>



<p></p>
<p>投稿 <a href="https://d9m.one/mmz-plugin-009/">【RPGツクール】イベント変換プラグイン～ピクチャイベント</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/mmz-plugin-009/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【RPGツクール】イベント変換プラグイン～場所移動</title>
		<link>https://d9m.one/mmz-plugin-008/</link>
					<comments>https://d9m.one/mmz-plugin-008/#respond</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Tue, 05 Nov 2024 15:15:18 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<category><![CDATA[プラグイン]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2614</guid>

					<description><![CDATA[<p>場所移動のイベントを追加しました。プラグインはこちら、サンプルスクリプトはこちらです。 場所移動は通常のイベントと同じパラメータを指定する形になっています。 コマンド名は「map」。向きとフェードは数値でも可能ですが、日 [&#8230;]</p>
<p>投稿 <a href="https://d9m.one/mmz-plugin-008/">【RPGツクール】イベント変換プラグイン～場所移動</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong><mark style="background-color:#7bdcb5" class="has-inline-color">場所移動のイベント</mark></strong>を追加しました。<br>プラグインは<a href="https://d9m.one/sample/js/d9mScriptToEvent/V0.7.0/d9mScriptToEvent.js">こちら</a>、サンプルスクリプトは<a href="https://d9m.one/sample/js/d9mScriptToEvent/V0.7.0/script000.txt">こちら</a>です。</p>



<p>場所移動は通常のイベントと同じパラメータを指定する形になっています。</p>



<p>コマンド名は「map」。<br>向きとフェードは数値でも可能ですが、日本語でも指定可能です。</p>



<p><strong><mark style="background-color:#7bdcb5" class="has-inline-color">　　向き：上向き/下向き/左向き/右向き<br>フェード：フェード黒/フェード白/フェードなし</mark></strong></p>



<p>マップIDと座標は必須、移動後の方向とフェードはデフォルトを利用できます。<br>例）map 2,3,4,右向き,フェード黒<br>　　マップID「2」の「X座標3、Y座標4」に右向き、黒色でフェード</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>今回は場所移動イベントを追加してマップを移動できるようになりました。アニメーションも追加したのでエフェクト表示もできるようになってます。</p>



<p>次回は移動ルートの設定を追加予定、だったけど時間かかりそうなのでピクチャや画面イベントを先に実装しようかな。</p>



<h2 class="wp-block-heading">●他の追加イベント</h2>



<p>場所移動には特に複雑なパラメータは無かったため、他のイベントも追加しています。<br>アニメーションは追加する気なかったですが、必要だったので慌てて追加。条件分岐や変数の操作に目が行き過ぎていたようです。</p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ウエイト</li>



<li>アニメーション表示</li>



<li>透明状態の変更</li>



<li>隊列歩行の変更</li>



<li>隊列メンバーの集合</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>
</div>



<h2 class="wp-block-heading">●実装済みのイベント</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>文章の表示</li>



<li>フキダシアイコンの表示</li>



<li>イベント処理の中断</li>



<li>イベントの一時消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ラベル</li>



<li>ラベルジャンプ</li>



<li>条件分岐</li>



<li>選択肢の表示</li>



<li>ループ</li>



<li>ループ中断</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>スイッチの操作</li>



<li>変数の操作</li>



<li>セルフスイッチの操作</li>
</ul>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ピクチャの表示</li>



<li>ピクチャの移動</li>



<li>ピクチャの消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>BGMの再生</li>



<li>BGMのフェードアウト</li>



<li>BGSの再生</li>



<li>BGSのフェードアウト</li>



<li>SEの再生</li>



<li>SEの停止</li>



<li>MEの再生</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li><mark style="background-color:#7bdcb5" class="has-inline-color"><strong>ウエイト</strong></mark></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">アニメーションの表示</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">透明状態の変更</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">隊列歩行の変更</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">隊列メンバーの集合</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">場所移動</mark></strong></li>
</ul>
</div>
</div>
<p>投稿 <a href="https://d9m.one/mmz-plugin-008/">【RPGツクール】イベント変換プラグイン～場所移動</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/mmz-plugin-008/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【RPGツクール】イベント変換プラグイン～スクリプト内部化</title>
		<link>https://d9m.one/rmmz-plugin-007/</link>
					<comments>https://d9m.one/rmmz-plugin-007/#respond</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Mon, 04 Nov 2024 15:34:35 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<category><![CDATA[プラグイン]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2610</guid>

					<description><![CDATA[<p>スクリプトを内部化し、プラグインパラメータで記述できるように修正しました。こちらからダウンロードできます。サンプルスクリプトはこちら。 また、問題が２点あったため修正しています。・「MEの再生」のコマンド名を「bgmPl [&#8230;]</p>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-007/">【RPGツクール】イベント変換プラグイン～スクリプト内部化</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong><mark style="background-color:#7bdcb5" class="has-inline-color">スクリプトを内部化</mark></strong>し、プラグインパラメータで記述できるように修正しました。<br><a href="https://d9m.one/sample/js/d9mScriptToEvent/V0.6.0/d9mScriptToEvent.js">こちら</a>からダウンロードできます。<br>サンプルスクリプトは<a href="https://d9m.one/sample/js/d9mScriptToEvent/V0.6.0/script000.txt">こちら</a>。</p>



<p>また、問題が２点あったため修正しています。<br>・「MEの再生」のコマンド名を「bgmPlay」から「mePlay」に変更<br>・サンプルスクリプトのBGM再生でファイル名を指定</p>



<p>開発時は外部スクリプトとし、公開時にプラグインパラメータへ移す、という運用を考えています。<br>プラグインパラメータにすることで、<strong><mark style="background-color:#7bdcb5" class="has-inline-color">未使用ファイルとして扱われる心配もありません。</mark></strong><br>全く読めないわけではないですが、「プレイヤーがスクリプトを読みにくくなる」という効果もあります。</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<p>今回はスクリプトを内部化し、プラグインパラメータとして扱えるようにしました。BGM再生やME再生も確認したつもりでしたが…、いつの間にか消してしまっていたようです。</p>



<p>次回はイベント「場所の移動」を追加する予定です。<br>スクリプトの記述方法をちゃんと説明していなかったので、解説ページも用意しないと。</p>



<p>…しかし、４日中にアップしたかったなぁ。</p>



<h2 class="wp-block-heading">●実装済みのイベント</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>文章の表示</li>



<li>フキダシアイコンの表示</li>



<li>イベント処理の中断</li>



<li>イベントの一時消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ラベル</li>



<li>ラベルジャンプ</li>



<li>条件分岐</li>



<li>選択肢の表示</li>



<li>ループ</li>



<li>ループ中断</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>スイッチの操作</li>



<li>変数の操作</li>



<li>セルフスイッチの操作</li>
</ul>
</div>
</div>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ピクチャの表示</li>



<li>ピクチャの移動</li>



<li>ピクチャの消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>BGMの再生</li>



<li>BGMのフェードアウト</li>



<li>BGSの再生</li>



<li>BGSのフェードアウト</li>



<li>SEの再生</li>



<li>SEの停止</li>



<li>MEの再生</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>
</div>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-007/">【RPGツクール】イベント変換プラグイン～スクリプト内部化</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/rmmz-plugin-007/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【RPGツクール】イベント変換プラグイン～ベータ公開</title>
		<link>https://d9m.one/rmmz-plugin-006/</link>
					<comments>https://d9m.one/rmmz-plugin-006/#respond</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Sun, 03 Nov 2024 14:57:57 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<category><![CDATA[プラグイン]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2599</guid>

					<description><![CDATA[<p>独自スクリプトからRPGツクールMZのイベントに変換して実行するプラグインを作成しました。こちらからダウンロードできます。 テキストファイルとして管理できるため、誤字脱字の修正や検索、一括変換などでメンテナンスが楽になり [&#8230;]</p>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-006/">【RPGツクール】イベント変換プラグイン～ベータ公開</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>独自スクリプトからRPGツクールMZの<mark style="background-color:#7bdcb5" class="has-inline-color"><strong>イベントに変換して実行するプラグイン</strong></mark>を作成しました。<br><a href="https://d9m.one/sample/js/d9mScriptToEvent/V0.5.0/d9mScriptToEvent.js">こちら</a>からダウンロードできます。</p>



<p>テキストファイルとして管理できるため、誤字脱字の修正や検索、一括変換などでメンテナンスが楽になります。共通イベントとして用意し、再利用するのも楽になります。</p>



<p>商用／非商用、改変／再配布も自由が、責任は一切負いません。<br>不具合報告、要望等はブログにコメントいただければ、可能な限り対応します。</p>



<p>※<a href="https://d9m.one/rmmz-plugin-005/">以前のツール</a>は破棄してプラグインとして再作成しました。想像以上に条件分岐が面倒だった…。</p>



<h2 class="wp-block-heading">●導入までの手順</h2>



<p><strong>・スクリプトを配置</strong></p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<div class="wp-block-group is-layout-flex wp-block-group-is-layout-flex">
<p>dataフォルダにscriptフォルダを作成し、<mark style="background-color:#7bdcb5" class="has-inline-color"><strong>スクリプトテキストを配置</strong></mark>します。</p>



<p>サンプルも<a href="https://d9m.one/sample/js/d9mScriptToEvent/V0.5.0/script000.txt">こちら</a>にありますのでお試しください。</p>
</div>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure data-wp-context="{&quot;imageId&quot;:&quot;683ace63edf77&quot;}" data-wp-interactive="core/image" class="wp-block-image alignright size-large wp-lightbox-container"><img fetchpriority="high" decoding="async" width="756" height="518" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://d9m.one/wp-content/uploads/2024/11/image.png" alt="スクリプトを配置" class="wp-image-2602" srcset="https://d9m.one/wp-content/uploads/2024/11/image.png 756w, https://d9m.one/wp-content/uploads/2024/11/image-300x206.png 300w" sizes="(max-width: 756px) 100vw, 756px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on-async--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>
</div>



<p><strong>・プラグインをプロジェクトに追加</strong></p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>d9mEventScript.jsをプラグインに追加し、<strong><mark style="background-color:#7bdcb5" class="has-inline-color">プラグインパラメータに配置したスクリプトを追加</mark></strong>します。</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure data-wp-context="{&quot;imageId&quot;:&quot;683ace63ee406&quot;}" data-wp-interactive="core/image" class="wp-block-image alignright size-full wp-lightbox-container"><img decoding="async" width="812" height="485" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://d9m.one/wp-content/uploads/2024/11/image-1.png" alt="プラグインをプロジェクトに追加" class="wp-image-2603" srcset="https://d9m.one/wp-content/uploads/2024/11/image-1.png 812w, https://d9m.one/wp-content/uploads/2024/11/image-1-300x179.png 300w, https://d9m.one/wp-content/uploads/2024/11/image-1-768x459.png 768w" sizes="(max-width: 812px) 100vw, 812px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on-async--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>
</div>



<p><strong>・イベントスクリプトで呼び出し</strong></p>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>イベントのスクリプトに<strong><mark style="background-color:#7bdcb5" class="has-inline-color">「d9mScriptParse(this, &#8216;スクリプトID&#8217;);」と記述して呼び出し</mark></strong>ます。</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure data-wp-context="{&quot;imageId&quot;:&quot;683ace63ee89c&quot;}" data-wp-interactive="core/image" class="wp-block-image alignright size-full wp-lightbox-container"><img decoding="async" width="1054" height="741" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://d9m.one/wp-content/uploads/2024/11/image-2.png" alt="イベントスクリプトで呼び出し" class="wp-image-2604" srcset="https://d9m.one/wp-content/uploads/2024/11/image-2.png 1054w, https://d9m.one/wp-content/uploads/2024/11/image-2-300x211.png 300w, https://d9m.one/wp-content/uploads/2024/11/image-2-1024x720.png 1024w, https://d9m.one/wp-content/uploads/2024/11/image-2-768x540.png 768w" sizes="(max-width: 1054px) 100vw, 1054px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on-async--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button></figure>
</div>
</div>



<h2 class="wp-block-heading">●独自スクリプトの記法</h2>



<p><strong>・命令[ パラメータ,パラメータ,&#8230;]</strong></p>



<p>命令とパラメータを組み合わせ、１行１命令で記述します。サンプルスクリプトを参考にしてください。</p>



<p><strong>・簡易命令</strong></p>



<p>文章の表示は「●」、条件分岐は「◆」、選択肢は「★」など、一目でどこにあるかがわかる記号でメンテナンス性を向上させています。</p>



<h2 class="wp-block-heading">●実装予定のイベント</h2>



<p><strong>・V0.6　プラグインパラメータでスクリプト記述</strong></p>



<p>現在IDとスクリプトファイル名を指定する形ですが、スクリプトそのものを追加する予定です。スクリプトにテキストがある場合はスクリプトファイル名を無視します。イベントスクリプトから呼ばれると、このスクリプトに記述された内容がイベントとして展開されるようになります。</p>



<p><strong>・V0.7　場所移動</strong></p>



<p>場所移動のイベントを追加します。難しくないので他の簡単なイベントも追加するかも知れません。</p>



<p>ウエイトやプレイヤーの透明化、集合ぐらいは追加するかも。</p>



<p><strong>・V0.8　移動ルートの設定</strong></p>



<p>まだ考察のみで設計はしていませんが、記号で移動ルートを指定できればいいなと思っています。</p>



<p>「(↑→↓←)4」で上下左右に４回まわる、とかできたら最高ですが、あまり期待はしないでください。</p>



<p><strong>・V0.9　ピクチャの回転、ピクチャの色調変更</strong></p>



<p>ピクチャ関連イベントの残り２つです。回転はできることが少ないので不要な気もしますが、せっかくなので。</p>



<p><strong>・画面カテゴリのイベント</strong></p>



<p>フェードイン、フェードアウト、色調変更、フラッシュ、シェイク、天候の設定です。</p>



<h2 class="wp-block-heading">●まとめ</h2>



<p><strong><mark style="background-color:#7bdcb5" class="has-inline-color">イベント変換プラグイン「d9mScriptToEvent.js」</mark></strong>の紹介でした。</p>



<p>関連プラグインが既に存在するかもですが、作るのが楽しかったので考えずに突き進みました。</p>



<p>副業も少し余裕ができたので、今月中に初版までもっていきたいと思います。</p>



<p></p>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-006/">【RPGツクール】イベント変換プラグイン～ベータ公開</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/rmmz-plugin-006/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【ARPG-PluginSet】向き固定慣性の不具合対応</title>
		<link>https://d9m.one/rmmz_arpgpluginset16/</link>
					<comments>https://d9m.one/rmmz_arpgpluginset16/#respond</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Thu, 11 Apr 2024 13:18:31 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<category><![CDATA[プラグイン]]></category>
		<category><![CDATA[ARPGプラグインセット]]></category>
		<category><![CDATA[アクション]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2573</guid>

					<description><![CDATA[<p>向き固定で慣性が狂う問題を回避するプラグインを作成しました。こちらからダウンロードできます。（右クリックからダウンロードでよろしく） 「カニ歩き＋剣振り」で判明したARPG_PluginSetの不具合の対策になります。向 [&#8230;]</p>
<p>投稿 <a href="https://d9m.one/rmmz_arpgpluginset16/">【ARPG-PluginSet】向き固定慣性の不具合対応</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong><mark style="background-color:#7bdcb5" class="has-inline-color">向き固定で慣性が狂う問題</mark></strong>を回避するプラグインを作成しました。<br><a href="https://d9m.one/game/RPGMaker/plugin/DotMoveSystem_d9mChange.js" target="_blank">こちら</a>からダウンロードできます。（右クリックからダウンロードでよろしく）</p>



<p><a href="https://d9m.one/rmmz_arpgpluginset15/">「カニ歩き＋剣振り」</a>で判明した<a href="https://rpgmakerofficial.com/product/mz/download/dlc/dl_02.html">ARPG_PluginSet</a>の不具合の対策になります。向きを固定した状態では慣性が現在方向に発生します。後退してキーを離すと慣性が前方に発生。タップしての移動では発生しないので、不具合と判断しています。</p>



<p>「DotMoveSystem_FunctionEx」の後にプラグインを追加し、プラグインパラメータ「適用スイッチID」をONにすることで現象が回避できます。</p>



<p>適用スイッチIDには「カニ歩き中であるかどうか」を持つスイッチを指定することを推奨します。副作用を懸念し、状況を限定して適用するようにしています。</p>



<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">※プラグインの適用によって生じた損害について、作者は一切責任を負いません。</mark></strong></p>



<p><a href="https://d9m.one/rmmz_arpgpluginset8/">アイテム掲げ</a>、<a href="https://d9m.one/rmmz_arpgpluginset6/">剣ビーム</a>、<a href="https://d9m.one/rmmz_arpgpluginset11/">盾ガード</a>、<a href="https://d9m.one/rmmz_arpgpluginset12/">ドロップアイテム</a>、<a href="https://d9m.one/rmmz_arpgpluginset13/">斜め方向の弾</a>を作ってきました。神トラをイメージしての<a href="https://d9m.one/rmmz_arpgpluginset9/">壺投げ</a>もありますので、是非過去記事も見てみてください。</p>



<p>以降、問題点と解決方法、苦労話が続きます。ご参考までに。</p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●向き固定の慣性問題</h2>



<p>ARPG-PluginSetでは移動キーが離された後も慣性で動きます。この状況では既にキーが離されているため方向が存在しません。現行バージョンでは「現在方向」を取ってくるため、<strong><mark style="background-color:#7bdcb5" class="has-inline-color">慣性方向が狂う</mark></strong>ようです。向き固定中では問題が発生します。</p>



<p>タップ／クリックによる移動は目的地から方向を求めている？ようなので発生しないようです。</p>



<p>今回の解決策が正しいかはともかく、恐らく不具合だと思います。</p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●解決方法</h2>



<p>慣性は「DotMoveSystem_FunctionEx.js」の「inertiaMoveProcess」で実施しています。「dotMoveByDirection」に渡しているのは現在方向となる「this.direction()」。ここを「this.mover()._lastDirection」にすることで解決しました。</p>



<p>慣性なので目的地から方向を求められそうです。が、「_lastDirection」で目的は達成できそうなのでソコまで調査を進めていません。そっちの方が完璧かもですが、既に戦意を失いかけていたので留まりました。</p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●苦労話</h2>



<p>現象からして「慣性」とアタリを付けられたので、スクリプトはすぐ見つかりました。しかし、１スクリプトでも流れが掴みにくくパニックになってました。</p>



<p>方向設定がキモなのは分かっていましたが、それっぽい所を変えても改善せず。最終キー入力を覚えておきたいけど色んな所で方向が更新されててパニック。大元で覚えておきたいけどキー入力直後はどこが呼ばれるか分からない。大元っぽいsetDirectionをいじるも改善せず、で大変でした。ほんと修行が足んねー。</p>



<p>初心に戻り、キーワード「慣性」から見直し。<br>慣性→setInertia→_inertia→inertiaMoveProcess→dotMoveByDirectionと進み、this.direction()をthis.mover()._lastDirectionに変更してみると改善。裏付けで関連場所を調査して問題なさそうな事を確認してプラグイン化しました。前半は_lastDirectionを見つけるまでの布石ということで、全てに意味がありましたね。</p>



<p>プロトタイプベースなので「今どこ見てたっけ？」となって迷子になったりもしました。<br>プロトタイプベースは影響範囲を小さくできるのでプラグインとは相性が良さそう。JavaScriptは昔から使ってるけどprototypeは見ないようにしてました。いいかげん、これを機に慣れるか。</p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●まとめ</h2>



<p>今回は「向き固定慣性」の不具合を対策しました。<br>「DotMoveSystem_FunctionEx.js」を調査し、慣性の移動方向が最終方向ではなく現在方向となっていることを確認。「向き固定中」かつ「適用スイッチON」の時のみ最終方向とするプラグインを作成しました。</p>



<p>「常に最終方向にする」という対応でも動きそうでしたが、副作用を考慮して状況を限定しています。</p>



<p>自分には扱いづらいけど、やっぱりARPG_PluginSetはすごいと再認識。<br>移動はイベントだけでなくパーティの隊列歩行や乗り物にも影響しているようです。かつ汎用的にも作られているため、スクリプトが長くなるのも当然ですね。ここだけ全体を考えて設計するとか、一通りrmmz_***系のスクリプトを把握してるってことですかね。おみそれしました。</p>



<p>僕はほどほどに頑張ります。</p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>
<p>投稿 <a href="https://d9m.one/rmmz_arpgpluginset16/">【ARPG-PluginSet】向き固定慣性の不具合対応</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/rmmz_arpgpluginset16/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【RPGツクール】イベント変換ツール～変数の操作</title>
		<link>https://d9m.one/rmmz-plugin-005/</link>
					<comments>https://d9m.one/rmmz-plugin-005/#respond</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Fri, 05 Apr 2024 14:56:13 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2526</guid>

					<description><![CDATA[<p>イベント変換ツールに変数の操作を追加</p>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-005/">【RPGツクール】イベント変換ツール～変数の操作</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p><strong><mark style="background-color:#7bdcb5" class="has-inline-color">「変数の操作」</mark></strong>と<strong><mark style="background-color:#7bdcb5" class="has-inline-color">「スイッチの操作」</mark></strong>をイベント変換ツールに追加しました。</p>



<p>スイッチ名、変数名の指定、ゲームデータの設定はプラグイン化が必要なため見送っています。指定範囲の操作、加算や減算といった操作、定数／変数／乱数／スクリプトの設定まで、他は一通り実装できています。</p>



<p>※　<a href="https://rpgmakerofficial.com/product/mz/download/dlc/dl_02.html">ARPGプラグインセット</a>を解析した記事もあります。<br>　　「<a href="https://d9m.one/rmmz_arpgpluginset1/">攻撃範囲の変更</a>」「<a href="https://d9m.one/rmmz_arpgpluginset2/">剣振りアニメ解析</a>」「<a href="https://d9m.one/rmmz_arpgpluginset14/">ブーメラン</a>」とか、よろしく。</p>



<h2 class="wp-block-heading">●バージョン0.05</h2>



<h3 class="wp-block-heading">・イベント変換ツール</h3>



<p>左側のテキストエリアにスクリプトを書き、変換ボタンを押すと右側のテキストエリアにコモンイベント置き換え用のJSONが出力されます。</p>



<div style="height: 300px; display: flex;">
<textarea id="input" style="width: 496px; height: 100%;"></textarea>
<span style="height: 100%; display: inline-block; vertical-align: middle;"><button style="background:#990099" onclick="run();">変換→</button></span>
<textarea id="output" style="width: 646px; height: 100%;"></textarea>
</div>
<script>
let clamp = function (num, min, max) {
  return Math.min(Math.max(num, min), max);
};

ENUM = {
    msg: {
        back: [ 'ウィンドウ', '暗くする', '透明' ],
        pos: [ '上', '中', '下' ],
    },
    pic: {
        pos: [ '左上', '中央' ],
        blend: [ '通常', '加算', '乗算', 'スクリーン' ],
        type: {
            '一定速度': 0,
            'ゆっくり始まる': 1,
            'ゆっくり終わる': 2,
            'ゆっくり始まってゆっくり終わる': 3,
        },
    },
    tone: {
        '通常':   [   0,   0,   0,   0 ],
        'ダーク': [ -68, -68, -68,   0 ],
        'セピア': [  34, -34, -68, 170 ],
        '夕暮れ': [  68, -34, -34,   0 ],
        '夜':     [ -68, -68,   0,  68 ],
    },
    formula: {
        mode: [ '=', '+=', '-=', '*=', '/=', '%=' ],
    }
}

let getEnum = function (enumObj, value, def) {
    let result = def;

    if (isNaN(value) === true) {
        if (Array.isArray(enumObj)) {
            if (enumObj.indexOf(value) !== -1) {
                result = enumObj.indexOf(value);
            }
        } else {
            if (enumObj[value]) {
                result = enumObj[value];
            }
        }
    } else {
        result = value;
    }

    return result;
}

let getMemoryName = function (range) {
    if (String(range).indexOf(':') !== -1) {
        range = range.split(':');
    } else {
        range = [range, range];
    }

    if (isNaN(range[0]) === true || isNaN(range[1]) === true) {
        return null;
    }

    if (isNaN(range[0]) === false) {
        range[0] = clamp(parseInt(range[0]), 1, 5000);
    }
    if (isNaN(range[1]) === false) {
        range[1] = clamp(parseInt(range[1]), 1, 5000);
    }

    return range;
}

CODE_TABLE = {
    '//':       108,    // 注釈（１行目）
    '//*':      408,    // 注釈（２行目以降）
    'msg':      101,    // 文字表示の初期化
    'msg*':     401,    // 文字表示（行単位）
    'wait':     230,    // ウエイト
    'pic':      231,    // ピクチャの表示
    'picMove':  232,    // ピクチャの移動
    'picTone':  234,    // ピクチャの色調変更
    'picClear': 235,    // ピクチャの消去
    'tone':     223,    // 画面の色調変更
    'flash':    224,    // 画面のフラッシュ
    'shake':    225,    // 画面のシェイク
    'flag':     121,    // スイッチの操作
    'var':      122,    // 変数の操作
    'end':      0,
}

let eventParser = {
    createTone: function (value) {
        let values = getEnum(ENUM.tone, value, value.split(':'));

        for (let i = 0; i < values.length; i++) {
            values[i] = clamp(values[i], -255, 255);
        }

        return values;
    },

    createFlash: function (value) {
        let values = value.split(':');

        for (let i = 0; i < values.length; i++) {
            values[i] = clamp(values[i], 0, 255);
        }

        return values;
    },

    '■': function (evInfo) {
        this.config.id = evInfo.params[0];
        this.config.name = evInfo.params[1];
    },

    '//': function (evInfo) {
        if (evInfo.blocks.length === 0) {
            this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
        } else {
            let command = '//';
            if (evInfo.params[0]) {
                this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
                command = '//*';
            }
            for (let i = 0; i < evInfo.blocks.length; i++) {
                this.eventAssign(command, [ evInfo.blocks[i] ]);
                command = '//*';
            }
        }
    },

    msgWnd: function (evInfo) {
        this.config.msg.back = getEnum(ENUM.msg.back, evInfo.params[0], 0);
        this.config.msg.pos = getEnum(ENUM.msg.pos, evInfo.params[1], 2);
    },

    msg: function (evInfo) {
        // 顔画像の位置指定が無い場合は0とする
        if (isNaN(evInfo.params[2]) === true || evInfo.params[2] < 0 || 8 <= evInfo.params[2]) {
            evInfo.params[2] = 0;
        }

        this.eventAssign(evInfo.command, [
            evInfo.params[1],
            evInfo.params[2],
            this.config.msg.back,
            this.config.msg.pos,
            evInfo.params[0],
        ]);

        for (let msgLine of evInfo.blocks) {
            this.eventAssign('msg*', [ msgLine ]);
        }
    },

    wait: function (evInfo) {
        this.eventAssign(evInfo.command, evInfo.params);
    },

    picDef: function (evInfo) {
        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(this.config.pic, params);
            }
        }
    },

    pic: function (evInfo) {
        let result = {
            number: clamp(evInfo.params[0], 1, 100),       // ピクチャ番号
            image:  evInfo.params[1],           // 画像
            pos:    this.config.pic.pos,        // 原点
            mode:   this.config.pic.mode,       // 指定（直接か変数か）
            x:      0,                          // X座標
            y:      0,                          // Y座標
            scaleX: this.config.pic.scaleX,     // 拡大率　幅
            scaleY: this.config.pic.scaleY,     // 拡大率　高さ
            alpha:  this.config.pic.alpha,      // 不透明度
            blend:  this.config.pic.blend,      // 合成方法
        };

        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(result, params);
            }
        }

        this.eventAssign(evInfo.command, [
            result.number,
            result.image,
            result.pos,
            result.mode,
            result.v1,
            result.v2,
            result.scaleX,
            result.scaleY,
            result.alpha,
            result.blend,
        ]);
    },

    picMove: function (evInfo) {
        let type = getEnum(ENUM.pic.type, evInfo.params[1], 0);

        let result = {
            number:   clamp(evInfo.params[0], 1, 100),        // ピクチャ番号
            image:    0,                                    // 画像
            pos:      this.config.pic.pos,                  // 原点
            mode:     this.config.pic.mode,                 // 指定（直接か変数か）
            x:        0,                                    // X座標
            y:        0,                                    // Y座標
            scaleX:   this.config.pic.scaleX,               // 拡大率　幅
            scaleY:   this.config.pic.scaleY,               // 拡大率　高さ
            alpha:    this.config.pic.alpha,                // 不透明度
            blend:    this.config.pic.blend,                // 合成方法
            waitTime: evInfo.params[2],                     // 経過時間：フレーム(1/60秒)
            waitFlag: evInfo.params[3] === 'wait',          // 完了までウエイト
            type:     type,                                 // イージングタイプ
        };

        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(result, params);
            }
        }

        this.eventAssign(evInfo.command, [
            result.number,
            result.image,
            result.pos,
            result.mode,
            result.v1,
            result.v2,
            result.scaleX,
            result.scaleY,
            result.alpha,
            result.blend,
            result.waitTime,
            result.waitFlag,
            result.type,
        ]);
    },

    picTone: function (evInfo) {
        let parameters = [
            evInfo.params[0],
            eventParser.createTone(evInfo.params[1]),
            evInfo.params[2],
            evInfo.params[3] === 'wait',
        ];
        this.eventAssign(evInfo.command, parameters);
    },

    picClear: function (evInfo) {
        this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
    },

    tone: function (evInfo) {
        this.eventAssign(evInfo.command, [
            eventParser.createTone(evInfo.params[0]),
            evInfo.params[1],
            evInfo.params[2] === 'wait',
        ]);
    },

    flash: function (evInfo) {
        this.eventAssign(evInfo.command, [
            eventParser.createFlash(evInfo.params[0]),
            evInfo.params[1],
            evInfo.params[2] === 'wait',
        ]);
    },

    shake: function (evInfo) {
        this.eventAssign(evInfo.command, [
            clamp(evInfo.params[0], 1, 9),
            clamp(evInfo.params[1], 1, 9),
            evInfo.params[2],
            evInfo.params[3] === 'wait',
        ]);
    },

    flag: function (evInfo) {
        let range = getMemoryName(evInfo.params[0]);
        if (range === null) {
            this.eventAssign('//', [ '変数名は未対応です。' ]);
            return;
        }

        if (isNaN(evInfo.params[1]) === true) {
            evInfo.params[1] = evInfo.params[1].toLowerCase();
        }

        let trueList = [ 0, 'true', 'on' ];
        this.eventAssign(evInfo.command, [
            clamp(range[0], 1, 9999),
            clamp(range[1], 1, 9999),
            trueList.indexOf(evInfo.params[1]) !== -1 ? 0 : 1,
        ]);
    },
    var: function (evInfo) {
        // 操作
        let eqIndex = evInfo.params[0].indexOf('=');
        let modeText = evInfo.params[0].charAt(eqIndex - 1) + ENUM.formula.mode[0];
        let mode = getEnum(ENUM.formula.mode, modeText, null);
        if (mode === null) {
            modeText = ENUM.formula.mode[0];
            mode = getEnum(ENUM.formula.mode, modeText);
        }

        // 変数
        let range = evInfo.params[0].substring(0, evInfo.params[0].indexOf(modeText));
        range = getMemoryName(range);
        if (range === null) {
            this.eventAssign('//', [ '変数名は未対応です。' ]);
            return;
        }

        let parameters = [
            range[0],
            range[1],
            mode,
        ];

        // 式
        let formula = evInfo.params[0].substring(eqIndex + 1);
        switch (formula.charAt(0)) {
            case '#':
                parameters[3] = 1;
                formula = getMemoryName(formula.substring(1));
                parameters.push(formula[0]);
                break;
            case '?':
                parameters[3] = 2;
                formula = formula.substring(1).split(':');
                parameters.push(parseInt(formula[0]));
                parameters.push(parseInt(formula[1]));
                break;
            case '@':
                parameters[3] = 4;
                parameters.push(formula.substring(1));
                break;
            default:
                parameters[3] = 0;
                parameters.push(parseInt(formula));
                break;
        }

        this.eventAssign(evInfo.command, parameters);
    },
}

let picParser = {
    pos: function (result, params) {
        result.pos = getEnum(ENUM.pic.pos, params[0], 0);

        if (isNaN(params[1]) === false) {
            // 直接指定
            result.mode = 0;
            result.v1 = params[1];
            result.v2 = params[2];
        } else {
            // 変数で指定
            result.mode = 1;
            result.v1 = this.getVarId(params[1]);
            result.v2 = this.getVarId(params[2]);
        }
    },
    scale: function (result, params) {
        result.scaleX = clamp(params[0], -2000, 2000);
        result.scaleY = Math.lamp(params[1], -2000, 2000);
    },
    alpha: function (result, params) {
        result.alpha = clamp(params[0], 0, 255);
    },
    blend: function (result, params) {
        result.blend = getEnum(ENUM.pic.blend, params[0], 0);
    },
}

class d9mScriptToEvent {
    constructor() {
        this.eventParser = eventParser;
        this.picParser = picParser;

        this.config = {
            prev: '',
            indent: 0,
            msg: { back: 0, pos: 2 },
            pic: {
                pos:      0,    // 0: 左上, 1: 中央
                mode:     0,    // 0: 直接指定, 1: 変数で指定
                scaleX: 100,    // 拡大率　幅
                scaleY: 100,    // 拡大率　高さ
                alpha:  255,    // 不透明度
                blend:    0,    // 合成方法
            },

            id: 0,
            name: '',
        }

        this.events = [];
    }

    scriptLineParse(script) {
        if (script.slice(-1) === '{') {
            script = script.substring(0, script.length - 1).trim();
        }
        let parts = script.split(' ');

        // コマンドを取得
        let command = parts[0];

        // パラメータを展開
        let params = parts[1] ? parts[1].split(',') : [];
        params = params.map(param => {
            return isNaN(param) ? param : Number(param);
        });

        return [command, params];
    }

    eventAssign (command, params = []) {
        this.events.push({ code: CODE_TABLE[command], indent: this.config.indent, parameters: params });
    }

    getVarId (varName) {
        return 0;
    }

    run (text) {
        const lines = text.split('\r\n').join('\n').split('\r').join('\n').split('\n');

        for (let i = 0; i < lines.length; i++) {
            let script = lines[i].trim();

            // 空行はスキップ
            if (script === '') {
                continue;
            }

            // スクリプト行を展開
            let [command, params] = this.scriptLineParse(script);

            // ブロックを取得
            let blocks = [];
            if (script.slice(-1) === '{') {
                for (i++; i < lines.length; i++) {
                    if (lines[i].charAt(0) === '}') {
                        break;
                    }
                    blocks.push(lines[i].trim());
               }
            }

            // イベント展開
            let evInfo = { command, params, blocks };
            if (this.eventParser[evInfo.command]) {
                (this.eventParser[evInfo.command].bind(this))(evInfo);
            } else {
                this.eventAssign('//',  [`イベントを認識できませんでした。`]);
                this.eventAssign('//*', [script]);
            }
        }

        this.eventAssign('end', []);

        return {
            id: this.config.id,
            list: this.events,
            name: this.config.name,
            switchId: 1,
            trigger: 0
        };
    }
}

function run() {
    document.getElementById('output').value = '';
    let scriptToEvent = new d9mScriptToEvent();
    const res = scriptToEvent.run(document.getElementById('input').value);
    document.getElementById('output').value = JSON.stringify(res);
}

document.getElementById('input').value = `■ 1,テスト
flag 1,on
var 1:6=10
var 2+=2
var 3-=2
var 4*=2
var 5/=2
var 6%=3
var 7=#1
var 8=?10:50
var 9=@(2+3)*4/5%3`;
</script>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・対応済みイベント</h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>文字の表示</li>



<li>注釈</li>



<li>ウエイト</li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">スイッチの操作</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">変数の操作</mark></strong></li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ピクチャの表示</li>



<li>ピクチャの移動</li>



<li>ピクチャの色調変更</li>



<li>ピクチャの消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>フェードアウト</li>



<li>フェードイン</li>



<li>色調変化</li>



<li>フラッシュ</li>



<li>シェイク</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>メニュー画面を開く</li>



<li>セーブ画面を開く</li>



<li>ゲームオーバー</li>



<li>タイトル画面に戻す</li>



<li>隊列メンバーの集合</li>



<li>イベントの一時消去</li>
</ul>
</div>
</div>



<h3 class="wp-block-heading">・ツクールへの適用方法</h3>



<p>▼コモンイベントの場合<br><strong><mark style="background-color:#7bdcb5" class="has-inline-color">data/CommonEvents.json</mark></strong>を開き、該当するIDの行と差し替えます。<strong><mark style="background-color:#f78da7" class="has-inline-color">最後のカンマは付いてない</mark></strong>ので注意してください。</p>



<p>▼マップイベントの場合<br><strong><mark style="background-color:#7bdcb5" class="has-inline-color">data/Map***.json</mark></strong>を開き、該当する行のlist:[…]を置き換え用JSON内にあるlist:[…]と差し替えます。</p>



<p>カンマ漏れやコピペミスをしたりするとエラーとなり、プロジェクトが閉じられます。jsonファイルを戻して開き直せば復活しますので慌てなくても大丈夫です。</p>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-0847c30d7adc199159c107d1c3ea0103"><strong>※発生した問題に責任は持てません。<br>　試す場合は該当するjsonだけでなく、プロジェクト全体をバックアップしてからご使用ください。</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●追加した機能</h2>



<h3 class="wp-block-heading">・flag</h3>



<p>スイッチに値を設定します。</p>



<p><strong>▼パラメータ　書式：【flag スイッチ=設定値】</strong></p>



<figure class="wp-block-table"><table><thead><tr><th>パラメータ名</th><th>内容</th></tr></thead><tbody><tr><td>スイッチ</td><td>1～5000の範囲でスイッチ番号を指定します。<br>「:」で区切ることで開始:終了の範囲のスイッチを格納先とします。<br><strong><mark style="background-color:#7bdcb5" class="has-inline-color">※変数名は指定できません。</mark></strong></td></tr><tr><td>設定値</td><td>「1」「ON」「true」でオン、それ以外はオフを設定します。</td></tr></tbody></table></figure>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・var</h3>



<p>変数に値を設定します。</p>



<p><strong>▼パラメータ　書式：【var 変数,操作,式】</strong></p>



<p>書式上は見やすくするためカンマで区切っています。実装上は不要、詰めて記述してください。</p>



<figure class="wp-block-table"><table><thead><tr><th>パラメータ名</th><th>内容</th></tr></thead><tbody><tr><td>変数</td><td>1～5000の範囲でスイッチ番号を指定します。<br>「:」で区切ることで開始:終了の範囲の変数を格納先とします。</td></tr><tr><td>操作</td><td>変数への格納方法を指定します。<br>=　変数に上書きして格納します。<br>+=　変数の値に式の結果を加算して格納します。<br>-=　変数の値に式の結果を減算して格納します。<br>*=　変数の値に式の結果を乗算して格納します。<br>/=　変数の値を式の結果で除算して格納します。<br>%=　変数の値を式の結果で剰余して格納します。</td></tr><tr><td>式</td><td>設定する数値を指定します。<br>先頭文字列に応じて処理が変わります。<br><br>#変数　#の後に続く番号の変数に格納された値を格納します。<br>?最小値:最大値　?の後に最小値～最大値の範囲で生成した乱数を格納します。<br>@スクリプト　@以降をスクリプトとし、そのまま格納します。</td></tr></tbody></table></figure>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●まとめ</h2>



<p>スイッチと変数の操作を追加しました。名前による指定、ゲームデータを指定できないという点以外は一通り実装できています。</p>



<p>次回は条件分岐その１として、<strong><mark style="background-color:#7bdcb5" class="has-inline-color">「スイッチ、変数、セルフスイッチを実装」</mark></strong>を素直な形で実装する予定です。タイマー、乗り物、お金、ボタン、スクリプトといったあたりも入れるかもですが、その２かな。それ以外は恐らくプラグイン化できてからになると思います。</p>



<p></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-005/">【RPGツクール】イベント変換ツール～変数の操作</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/rmmz-plugin-005/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【RPGツクール】イベント変換ツール～パラメータなしイベント</title>
		<link>https://d9m.one/rmmz-plugin-004/</link>
					<comments>https://d9m.one/rmmz-plugin-004/#respond</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Wed, 03 Apr 2024 16:38:22 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2545</guid>

					<description><![CDATA[<p>イベント変換ツールにパラメータなしイベントの機能を追加</p>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-004/">【RPGツクール】イベント変換ツール～パラメータなしイベント</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>パラメータなしで動くイベントを追加しました。<strong><mark style="background-color:#7bdcb5" class="has-inline-color">「フェードイン、フェードアウト、<strong><mark style="background-color:#7bdcb5" class="has-inline-color">メニュー画面を開く</mark></strong>、セーブ画面を開く、ゲームオーバー、タイトル画面に戻す、隊列メンバーの集合、イベントの一時消去」</mark></strong>の8種です。</p>



<p>今日は忙しかったので、パラメータが不要だった8種を選択しました。それなりに使うイベントもあるので、ここで実装を済ませてしまいます。</p>



<p>パラメータがないので命令をコードに置き換えてイベント作成関数を呼ぶだけ。記事としては特に面白みはないです。サンプルを実際にRPGツクールMZ上で動かしても確認できるようにはしていません。確かに指定したイベントが作られてるな、ぐらいの心づもりでお願いします。</p>



<p>※　<a href="https://rpgmakerofficial.com/product/mz/download/dlc/dl_02.html">ARPGプラグインセット</a>を解析した記事もあります。<br>　　「<a href="https://d9m.one/rmmz_arpgpluginset1/">攻撃範囲の変更</a>」「<a href="https://d9m.one/rmmz_arpgpluginset2/">剣振りアニメ解析</a>」「<a href="https://d9m.one/rmmz_arpgpluginset14/">ブーメラン</a>」とか、よろしく。</p>



<h2 class="wp-block-heading">●バージョン0.04</h2>



<h3 class="wp-block-heading">・イベント変換ツール</h3>



<p>左側のテキストエリアにスクリプトを書き、変換ボタンを押すと右側のテキストエリアにコモンイベント置き換え用のJSONが出力されます。</p>



<div style="height: 300px; display: flex;">
<textarea id="input" style="width: 496px; height: 100%;"></textarea>
<span style="height: 100%; display: inline-block; vertical-align: middle;"><button style="background:#990099" onclick="run();">変換→</button></span>
<textarea id="output" style="width: 646px; height: 100%;"></textarea>
</div>
<script>
let clamp = function (num, min, max) {
  return Math.min(Math.max(num, min), max);
};

ENUM = {
    msg: {
        back: [ 'ウィンドウ', '暗くする', '透明' ],
        pos: [ '上', '中', '下' ],
    },
    pic: {
        pos: [ '左上', '中央' ],
        blend: [ '通常', '加算', '乗算', 'スクリーン' ],
        type: {
            '一定速度': 0,
            'ゆっくり始まる': 1,
            'ゆっくり終わる': 2,
            'ゆっくり始まってゆっくり終わる': 3,
        },
    },
    tone: {
        '通常':   [   0,   0,   0,   0 ],
        'ダーク': [ -68, -68, -68,   0 ],
        'セピア': [  34, -34, -68, 170 ],
        '夕暮れ': [  68, -34, -34,   0 ],
        '夜':     [ -68, -68,   0,  68 ],
    },
}
let getEnum = function (enumObj, value, def) {
    let result = def;

    if (isNaN(value) === true) {
        if (Array.isArray(enumObj)) {
            if (enumObj.indexOf(value) !== -1) {
                result = enumObj.indexOf(value);
            }
        } else {
            if (enumObj[value]) {
                result = enumObj[value];
            }
        }
    } else {
        result = value;
    }

    return result;
}

CODE_TABLE = {
    '//':       108,    // 注釈（１行目）
    '//*':      408,    // 注釈（２行目以降）
    'msg':      101,    // 文字表示の初期化
    'msg*':     401,    // 文字表示（行単位）
    'wait':     230,    // ウエイト
    'pic':      231,    // ピクチャの表示
    'picMove':  232,    // ピクチャの移動
    'picTone':  234,    // ピクチャの色調変更
    'picClear': 235,    // ピクチャの消去
    'tone':     223,    // 画面の色調変更
    'flash':    224,    // 画面のフラッシュ
    'shake':    225,    // 画面のシェイク
    'fadeout':  221,    // フェードアウト
    'fadein':   222,    // フェードイン
    'menuOpen': 351,    // メニュー画面を開く
    'saveOpen': 352,    // セーブ画面を開く
    'gameover': 353,    // ゲームオーバー
    'title':    354,    // タイトル画面に戻す
    'gather':   217,    // 隊列メンバーの集合
    'evHide':   214,    // イベントの一時消去
    'end':      0,
}

let eventParser = {
    createTone: function (value) {
        let values = getEnum(ENUM.tone, value, value.split(':'));

        for (let i = 0; i < values.length; i++) {
            values[i] = clamp(values[i], -255, 255);
        }

        return values;
    },

    createFlash: function (value) {
        let values = value.split(':');

        for (let i = 0; i < values.length; i++) {
            values[i] = clamp(values[i], 0, 255);
        }

        return values;
    },

    '■': function (evInfo) {
        this.config.id = evInfo.params[0];
        this.config.name = evInfo.params[1];
    },

    '//': function (evInfo) {
        if (evInfo.blocks.length === 0) {
            this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
        } else {
            let command = '//';
            if (evInfo.params[0]) {
                this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
                command = '//*';
            }
            for (let i = 0; i < evInfo.blocks.length; i++) {
                this.eventAssign(command, [ evInfo.blocks[i] ]);
                command = '//*';
            }
        }
    },

    msgWnd: function (evInfo) {
        this.config.msg.back = getEnum(ENUM.msg.back, evInfo.params[0], 0);
        this.config.msg.pos = getEnum(ENUM.msg.pos, evInfo.params[1], 2);
    },

    msg: function (evInfo) {
        // 顔画像の位置指定が無い場合は0とする
        if (isNaN(evInfo.params[2]) === true || evInfo.params[2] < 0 || 8 <= evInfo.params[2]) {
            evInfo.params[2] = 0;
        }

        this.eventAssign(evInfo.command, [
            evInfo.params[1],
            evInfo.params[2],
            this.config.msg.back,
            this.config.msg.pos,
            evInfo.params[0],
        ]);

        for (let msgLine of evInfo.blocks) {
            this.eventAssign('msg*', [ msgLine ]);
        }
    },

    wait: function (evInfo) {
        this.eventAssign(evInfo.command, evInfo.params);
    },

    picDef: function (evInfo) {
        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(this.config.pic, params);
            }
        }
    },

    pic: function (evInfo) {
        let result = {
            number: clamp(evInfo.params[0], 1, 100),       // ピクチャ番号
            image:  evInfo.params[1],           // 画像
            pos:    this.config.pic.pos,        // 原点
            mode:   this.config.pic.mode,       // 指定（直接か変数か）
            x:      0,                          // X座標
            y:      0,                          // Y座標
            scaleX: this.config.pic.scaleX,     // 拡大率　幅
            scaleY: this.config.pic.scaleY,     // 拡大率　高さ
            alpha:  this.config.pic.alpha,      // 不透明度
            blend:  this.config.pic.blend,      // 合成方法
        };

        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(result, params);
            }
        }

        this.eventAssign(evInfo.command, [
            result.number,
            result.image,
            result.pos,
            result.mode,
            result.v1,
            result.v2,
            result.scaleX,
            result.scaleY,
            result.alpha,
            result.blend,
        ]);
    },

    picMove: function (evInfo) {
        let type = getEnum(ENUM.pic.type, evInfo.params[1], 0);

        let result = {
            number:   clamp(evInfo.params[0], 1, 100),        // ピクチャ番号
            image:    0,                                    // 画像
            pos:      this.config.pic.pos,                  // 原点
            mode:     this.config.pic.mode,                 // 指定（直接か変数か）
            x:        0,                                    // X座標
            y:        0,                                    // Y座標
            scaleX:   this.config.pic.scaleX,               // 拡大率　幅
            scaleY:   this.config.pic.scaleY,               // 拡大率　高さ
            alpha:    this.config.pic.alpha,                // 不透明度
            blend:    this.config.pic.blend,                // 合成方法
            waitTime: evInfo.params[2],                     // 経過時間：フレーム(1/60秒)
            waitFlag: evInfo.params[3] === 'wait',          // 完了までウエイト
            type:     type,                                 // イージングタイプ
        };

        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(result, params);
            }
        }

        this.eventAssign(evInfo.command, [
            result.number,
            result.image,
            result.pos,
            result.mode,
            result.v1,
            result.v2,
            result.scaleX,
            result.scaleY,
            result.alpha,
            result.blend,
            result.waitTime,
            result.waitFlag,
            result.type,
        ]);
    },

    picTone: function (evInfo) {
        let parameters = [
            evInfo.params[0],
            eventParser.createTone(evInfo.params[1]),
            evInfo.params[2],
            evInfo.params[3] === 'wait',
        ];
        this.eventAssign(evInfo.command, parameters);
    },

    picClear: function (evInfo) {
        this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
    },

    tone: function (evInfo) {
        this.eventAssign(evInfo.command, [
            eventParser.createTone(evInfo.params[0]),
            evInfo.params[1],
            evInfo.params[2] === 'wait',
        ]);
    },

    flash: function (evInfo) {
        this.eventAssign(evInfo.command, [
            eventParser.createFlash(evInfo.params[0]),
            evInfo.params[1],
            evInfo.params[2] === 'wait',
        ]);
    },

    shake: function (evInfo) {
        this.eventAssign(evInfo.command, [
            clamp(evInfo.params[0], 1, 9),     // 強度　揺れの大きさを1～9で指定します。
            clamp(evInfo.params[1], 1, 9),     // 速度　振幅の大きさを1～9で指定します。
            evInfo.params[2],                       // 
            evInfo.params[3] === 'wait',            // 
        ]);
    },

    fadeout:  function (evInfo) { this.eventAssign(evInfo.command, []); },
    fadein:   function (evInfo) { this.eventAssign(evInfo.command, []); },
    menuOpen: function (evInfo) { this.eventAssign(evInfo.command, []); },
    saveOpen: function (evInfo) { this.eventAssign(evInfo.command, []); },
    gameover: function (evInfo) { this.eventAssign(evInfo.command, []); },
    title:    function (evInfo) { this.eventAssign(evInfo.command, []); },
    gather:   function (evInfo) { this.eventAssign(evInfo.command, []); },
    evHide:   function (evInfo) { this.eventAssign(evInfo.command, []); },
}

let picParser = {
    pos: function (result, params) {
        result.pos = getEnum(ENUM.pic.pos, params[0], 0);

        if (isNaN(params[1]) === false) {
            // 直接指定
            result.mode = 0;
            result.v1 = params[1];
            result.v2 = params[2];
        } else {
            // 変数で指定
            result.mode = 1;
            result.v1 = this.getVarId(params[1]);
            result.v2 = this.getVarId(params[2]);
        }
    },
    scale: function (result, params) {
        result.scaleX = clamp(params[0], -2000, 2000);
        result.scaleY = Math.lamp(params[1], -2000, 2000);
    },
    alpha: function (result, params) {
        result.alpha = clamp(params[0], 0, 255);
    },
    blend: function (result, params) {
        result.blend = getEnum(ENUM.pic.blend, params[0], 0);
    },
}

class d9mScriptToEvent {
    constructor() {
        this.eventParser = eventParser;
        this.picParser = picParser;

        this.config = {
            prev: '',
            indent: 0,
            msg: { back: 0, pos: 2 },
            pic: {
                pos:      0,    // 0: 左上, 1: 中央
                mode:     0,    // 0: 直接指定, 1: 変数で指定
                scaleX: 100,    // 拡大率　幅
                scaleY: 100,    // 拡大率　高さ
                alpha:  255,    // 不透明度
                blend:    0,    // 合成方法
            },

            id: 0,
            name: '',
        }

        this.events = [];
    }

    scriptLineParse(script) {
        if (script.slice(-1) === '{') {
            script = script.substring(0, script.length - 1).trim();
        }
        let parts = script.split(' ');

        // コマンドを取得
        let command = parts[0];

        // パラメータを展開
        let params = parts[1] ? parts[1].split(',') : [];
        params = params.map(param => {
            return isNaN(param) ? param : Number(param);
        });

        return [command, params];
    }

    eventAssign (command, params = []) {
        this.events.push({ code: CODE_TABLE[command], indent: this.config.indent, parameters: params });
    }

    getVarId (varName) {
        return 0;
    }

    run (text) {
        const lines = text.split('\r\n').join('\n').split('\r').join('\n').split('\n');

        for (let i = 0; i < lines.length; i++) {
            let script = lines[i].trim();

            // 空行はスキップ
            if (script === '') {
                continue;
            }

            // スクリプト行を展開
            let [command, params] = this.scriptLineParse(script);

            // ブロックを取得
            let blocks = [];
            if (script.slice(-1) === '{') {
                for (i++; i < lines.length; i++) {
                    if (lines[i].charAt(0) === '}') {
                        break;
                    }
                    blocks.push(lines[i].trim());
               }
            }

            // イベント展開
            let evInfo = { command, params, blocks };
            if (this.eventParser[evInfo.command]) {
                (this.eventParser[evInfo.command].bind(this))(evInfo);
            } else {
                this.eventAssign('//',  [`イベントを認識できませんでした。`]);
                this.eventAssign('//*', [script]);
            }
        }

        this.eventAssign('end', []);

        return {
            id: this.config.id,
            list: this.events,
            name: this.config.name,
            switchId: 1,
            trigger: 0
        };
    }
}

function run() {
    document.getElementById('output').value = '';
    let scriptToEvent = new d9mScriptToEvent();
    const res = scriptToEvent.run(document.getElementById('input').value);
    document.getElementById('output').value = JSON.stringify(res);
}

document.getElementById('input').value = `■ 1,テスト
menuOpen
saveOpen
evHide
fadeout
fadein
gameover
title
gather
`;
</script>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・対応済みイベント</h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>文字の表示</li>



<li>注釈</li>



<li>ウエイト</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ピクチャの表示</li>



<li>ピクチャの移動</li>



<li>ピクチャの色調変更</li>



<li>ピクチャの消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">フェードアウト</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">フェードイン</mark></strong></li>



<li>色調変化</li>



<li>フラッシュ</li>



<li>シェイク</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">メニュー画面を開く</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">セーブ画面を開く</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">ゲームオーバー</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">タイトル画面に戻す</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">隊列メンバーの集合</mark></strong></li>



<li><strong><mark style="background-color:#7bdcb5" class="has-inline-color">イベントの一時消去</mark></strong></li>
</ul>
</div>
</div>



<h3 class="wp-block-heading">・ツクールへの適用方法</h3>



<p>▼コモンイベントの場合<br><strong><mark style="background-color:#7bdcb5" class="has-inline-color">data/CommonEvents.json</mark></strong>を開き、該当するIDの行と差し替えます。<strong><mark style="background-color:#f78da7" class="has-inline-color">最後のカンマは付いてない</mark></strong>ので注意してください。</p>



<p>▼マップイベントの場合<br><strong><mark style="background-color:#7bdcb5" class="has-inline-color">data/Map***.json</mark></strong>を開き、該当する行のlist:[…]を置き換え用JSON内にあるlist:[…]と差し替えます。</p>



<p>カンマ漏れやコピペミスをしたりするとエラーとなり、プロジェクトが閉じられます。jsonファイルを戻して開き直せば復活しますので慌てなくても大丈夫です。</p>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-0847c30d7adc199159c107d1c3ea0103"><strong>※発生した問題に責任は持てません。<br>　試す場合は該当するjsonだけでなく、プロジェクト全体をバックアップしてからご使用ください。</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●追加した機能</h2>



<h3 class="wp-block-heading">・fadein</h3>



<p>画面をフェードアウトさせます。色も速度も調整できません。</p>



<p><strong>▼パラメータ　なし</strong></p>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・fadeout</h3>



<p>画面をフェードインさせます。色も速度も調整できません。</p>



<p><strong>▼パラメータ　なし</strong></p>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・menuOpen</h3>



<p>メニュー画面を開きます。</p>



<p><strong>▼パラメータ　なし</strong></p>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading"><strong>・</strong>saveOpen</h3>



<p>セーブ画面を開きます。</p>



<p><strong>▼パラメータ　なし</strong></p>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・gameOver</h3>



<p>ゲームオーバー画面に移動します。</p>



<p><strong>▼パラメータ　なし</strong></p>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・title</h3>



<p>タイトル画面に移動します。</p>



<p><strong>▼パラメータ　なし</strong></p>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・gather</h3>



<p>後続の仲間をプレイヤー位置まで歩かせて集めます。</p>



<p><strong>▼パラメータ　なし</strong></p>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・evHide</h3>



<p>イベントを一時消去します。以降のイベントも処理される点には注意が必要です。使用するとイベントがマップ上から消えます。マップを移動して戻ってくると復活します。</p>



<p><strong>▼パラメータ　なし</strong></p>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●まとめ</h2>



<p>今回はパラメータなしのイベントを8種追加しました。</p>



<p>パラメータの指定が不要なため、特に言及することはありません。フェードやイベントの一時消去など、それなりに使うでイベントなので一気に追加しました。</p>



<p>変数操作の記事もちょこちょこ書いていたのですが、もう少し熟考もしたいので後回しとします。</p>



<p>今回はここまで。</p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-004/">【RPGツクール】イベント変換ツール～パラメータなしイベント</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/rmmz-plugin-004/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【RPGツクール】イベント変換ツール～画面演出</title>
		<link>https://d9m.one/rmmz-plugin-003/</link>
					<comments>https://d9m.one/rmmz-plugin-003/#respond</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Tue, 02 Apr 2024 15:20:44 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2497</guid>

					<description><![CDATA[<p>イベント変換ツールに画面演出の機能を追加</p>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-003/">【RPGツクール】イベント変換ツール～画面演出</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>画面演出の機能をイベント変換ツールに追加しました。<strong><mark style="background-color:#7bdcb5" class="has-inline-color">「色調変化、フラッシュ、シェイク」</mark></strong>の３種です。</p>



<p>今回はピクチャの色調変化を流用できるようにし、色調変化とフラッシュに活用。シェイクは引数が数値２つだったので楽に追加できました。昨夜は<a href="https://d9m.one/rmmz-plugin-002/">ピクチャ関連</a>で夜ふかしし、さらに<a href="https://d9m.one/rmmz_arpgpluginset15/">カニ歩き</a>も楽しんでしまった。もっと行けそうだけど、今日はこの３種のみにします。…眠い。</p>



<p>※　<a href="https://rpgmakerofficial.com/product/mz/download/dlc/dl_02.html">ARPGプラグインセット</a>を解析した記事もあります。<br>　　「<a href="https://d9m.one/rmmz_arpgpluginset1/">攻撃範囲の変更</a>」「<a href="https://d9m.one/rmmz_arpgpluginset2/">剣振りアニメ解析</a>」「<a href="https://d9m.one/rmmz_arpgpluginset14/">ブーメラン</a>」とか、よろしく。</p>



<h2 class="wp-block-heading">●バージョン0.03</h2>



<h3 class="wp-block-heading">・イベント変換ツール</h3>



<p>左側のテキストエリアにスクリプトを書き、変換ボタンを押すと右側のテキストエリアにコモンイベント置き換え用のJSONが出力されます。</p>



<div style="height: 300px; display: flex;">
<textarea id="input" style="width: 496px; height: 100%;"></textarea>
<span style="height: 100%; display: inline-block; vertical-align: middle;"><button style="background:#990099" onclick="run();">変換→</button></span>
<textarea id="output" style="width: 646px; height: 100%;"></textarea>
</div>
<script>
let clamp = function (num, min, max) {
  return Math.min(Math.max(num, min), max);
};

ENUM = {
    msg: {
        back: [ 'ウィンドウ', '暗くする', '透明' ],
        pos: [ '上', '中', '下' ],
    },
    pic: {
        pos: [ '左上', '中央' ],
        blend: [ '通常', '加算', '乗算', 'スクリーン' ],
        type: {
            '一定速度': 0,
            'ゆっくり始まる': 1,
            'ゆっくり終わる': 2,
            'ゆっくり始まってゆっくり終わる': 3,
        },
    },
    tone: {
        '通常':   [   0,   0,   0,   0 ],
        'ダーク': [ -68, -68, -68,   0 ],
        'セピア': [  34, -34, -68, 170 ],
        '夕暮れ': [  68, -34, -34,   0 ],
        '夜':     [ -68, -68,   0,  68 ],
    },
}
let getEnum = function (enumObj, value, def) {
    let result = def;

    if (isNaN(value) === true) {
        if (Array.isArray(enumObj)) {
            if (enumObj.indexOf(value) !== -1) {
                result = enumObj.indexOf(value);
            }
        } else {
            if (enumObj[value]) {
                result = enumObj[value];
            }
        }
    } else {
        result = value;
    }

    return result;
}

CODE_TABLE = {
    '//':       108,    // 注釈（１行目）
    '//*':      408,    // 注釈（２行目以降）
    'msg':      101,    // 文字表示の初期化
    'msg*':     401,    // 文字表示（行単位）
    'wait':     230,    // ウエイト
    'pic':      231,    // ピクチャの表示
    'picMove':  232,    // ピクチャの移動
    'picTone':  234,    // ピクチャの色調変更
    'picClear': 235,    // ピクチャの消去
    'tone':     223,    // 画面の色調変更
    'flash':    224,    // 画面のフラッシュ
    'shake':    225,    // 画面のシェイク
    'end':      0,
}

let eventParser = {
    createTone: function (value) {
        let values = getEnum(ENUM.tone, value, value.split(':'));

        for (let i = 0; i < values.length; i++) {
            values[i] = clamp(values[i], -255, 255);
        }

        return values;
    },

    createFlash: function (value) {
        let values = value.split(':');

        for (let i = 0; i < values.length; i++) {
            values[i] = clamp(values[i], 0, 255);
        }

        return values;
    },

    '■': function (evInfo) {
        this.config.id = evInfo.params[0];
        this.config.name = evInfo.params[1];
    },

    '//': function (evInfo) {
        if (evInfo.blocks.length === 0) {
            this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
        } else {
            let command = '//';
            if (evInfo.params[0]) {
                this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
                command = '//*';
            }
            for (let i = 0; i < evInfo.blocks.length; i++) {
                this.eventAssign(command, [ evInfo.blocks[i] ]);
                command = '//*';
            }
        }
    },

    msgWnd: function (evInfo) {
        this.config.msg.back = getEnum(ENUM.msg.back, evInfo.params[0], 0);
        this.config.msg.pos = getEnum(ENUM.msg.pos, evInfo.params[1], 2);
    },

    msg: function (evInfo) {
        // 顔画像の位置指定が無い場合は0とする
        if (isNaN(evInfo.params[2]) === true || evInfo.params[2] < 0 || 8 <= evInfo.params[2]) {
            evInfo.params[2] = 0;
        }

        this.eventAssign(evInfo.command, [
            evInfo.params[1],
            evInfo.params[2],
            this.config.msg.back,
            this.config.msg.pos,
            evInfo.params[0],
        ]);

        for (let msgLine of evInfo.blocks) {
            this.eventAssign('msg*', [ msgLine ]);
        }
    },

    wait: function (evInfo) {
        this.eventAssign(evInfo.command, evInfo.params);
    },

    picDef: function (evInfo) {
        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(this.config.pic, params);
            }
        }
    },

    pic: function (evInfo) {
        let result = {
            number: clamp(evInfo.params[0], 1, 100),       // ピクチャ番号
            image:  evInfo.params[1],           // 画像
            pos:    this.config.pic.pos,        // 原点
            mode:   this.config.pic.mode,       // 指定（直接か変数か）
            x:      0,                          // X座標
            y:      0,                          // Y座標
            scaleX: this.config.pic.scaleX,     // 拡大率　幅
            scaleY: this.config.pic.scaleY,     // 拡大率　高さ
            alpha:  this.config.pic.alpha,      // 不透明度
            blend:  this.config.pic.blend,      // 合成方法
        };

        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(result, params);
            }
        }

        this.eventAssign(evInfo.command, [
            result.number,
            result.image,
            result.pos,
            result.mode,
            result.v1,
            result.v2,
            result.scaleX,
            result.scaleY,
            result.alpha,
            result.blend,
        ]);
    },

    picMove: function (evInfo) {
        let type = getEnum(ENUM.pic.type, evInfo.params[1], 0);

        let result = {
            number:   clamp(evInfo.params[0], 1, 100),        // ピクチャ番号
            image:    0,                                    // 画像
            pos:      this.config.pic.pos,                  // 原点
            mode:     this.config.pic.mode,                 // 指定（直接か変数か）
            x:        0,                                    // X座標
            y:        0,                                    // Y座標
            scaleX:   this.config.pic.scaleX,               // 拡大率　幅
            scaleY:   this.config.pic.scaleY,               // 拡大率　高さ
            alpha:    this.config.pic.alpha,                // 不透明度
            blend:    this.config.pic.blend,                // 合成方法
            waitTime: evInfo.params[2],                     // 経過時間：フレーム(1/60秒)
            waitFlag: evInfo.params[3] === 'wait',          // 完了までウエイト
            type:     type,                                 // イージングタイプ
        };

        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(result, params);
            }
        }

        this.eventAssign(evInfo.command, [
            result.number,
            result.image,
            result.pos,
            result.mode,
            result.v1,
            result.v2,
            result.scaleX,
            result.scaleY,
            result.alpha,
            result.blend,
            result.waitTime,
            result.waitFlag,
            result.type,
        ]);
    },

    picTone: function (evInfo) {
        let parameters = [
            evInfo.params[0],
            eventParser.createTone(evInfo.params[1]),
            evInfo.params[2],
            evInfo.params[3] === 'wait',
        ];
        this.eventAssign(evInfo.command, parameters);
    },

    picClear: function (evInfo) {
        this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
    },

    tone: function (evInfo) {
        this.eventAssign(evInfo.command, [
            eventParser.createTone(evInfo.params[0]),
            evInfo.params[1],
            evInfo.params[2] === 'wait',
        ]);
    },

    flash: function (evInfo) {
        this.eventAssign(evInfo.command, [
            eventParser.createFlash(evInfo.params[0]),
            evInfo.params[1],
            evInfo.params[2] === 'wait',
        ]);
    },

    shake: function (evInfo) {
        this.eventAssign(evInfo.command, [
            clamp(evInfo.params[0], 1, 9),     // 強度　揺れの大きさを1～9で指定します。
            clamp(evInfo.params[1], 1, 9),     // 速度　振幅の大きさを1～9で指定します。
            evInfo.params[2],                       // 
            evInfo.params[3] === 'wait',            // 
        ]);
    },
}

let picParser = {
    pos: function (result, params) {
        result.pos = getEnum(ENUM.pic.pos, params[0], 0);

        if (isNaN(params[1]) === false) {
            // 直接指定
            result.mode = 0;
            result.v1 = params[1];
            result.v2 = params[2];
        } else {
            // 変数で指定
            result.mode = 1;
            result.v1 = this.getVarId(params[1]);
            result.v2 = this.getVarId(params[2]);
        }
    },
    scale: function (result, params) {
        result.scaleX = clamp(params[0], -2000, 2000);
        result.scaleY = Math.lamp(params[1], -2000, 2000);
    },
    alpha: function (result, params) {
        result.alpha = clamp(params[0], 0, 255);
    },
    blend: function (result, params) {
        result.blend = getEnum(ENUM.pic.blend, params[0], 0);
    },
}

class d9mScriptToEvent {
    constructor() {
        this.eventParser = eventParser;
        this.picParser = picParser;

        this.config = {
            prev: '',
            indent: 0,
            msg: { back: 0, pos: 2 },
            pic: {
                pos:      0,    // 0: 左上, 1: 中央
                mode:     0,    // 0: 直接指定, 1: 変数で指定
                scaleX: 100,    // 拡大率　幅
                scaleY: 100,    // 拡大率　高さ
                alpha:  255,    // 不透明度
                blend:    0,    // 合成方法
            },

            id: 0,
            name: '',
        }

        this.events = [];
    }

    scriptLineParse(script) {
        if (script.slice(-1) === '{') {
            script = script.substring(0, script.length - 1).trim();
        }
        let parts = script.split(' ');

        // コマンドを取得
        let command = parts[0];

        // パラメータを展開
        let params = parts[1] ? parts[1].split(',') : [];
        params = params.map(param => {
            return isNaN(param) ? param : Number(param);
        });

        return [command, params];
    }

    eventAssign (command, params = []) {
        this.events.push({ code: CODE_TABLE[command], indent: this.config.indent, parameters: params });
    }

    getVarId (varName) {
        return 0;
    }

    run (text) {
        const lines = text.split('\r\n').join('\n').split('\r').join('\n').split('\n');

        for (let i = 0; i < lines.length; i++) {
            let script = lines[i].trim();

            // 空行はスキップ
            if (script === '') {
                continue;
            }

            // スクリプト行を展開
            let [command, params] = this.scriptLineParse(script);

            // ブロックを取得
            let blocks = [];
            if (script.slice(-1) === '{') {
                for (i++; i < lines.length; i++) {
                    if (lines[i].charAt(0) === '}') {
                        break;
                    }
                    blocks.push(lines[i].trim());
               }
            }

            // イベント展開
            let evInfo = { command, params, blocks };
            if (this.eventParser[evInfo.command]) {
                (this.eventParser[evInfo.command].bind(this))(evInfo);
            } else {
                this.eventAssign('//',  [`イベントを認識できませんでした。`]);
                this.eventAssign('//*', [script]);
            }
        }

        this.eventAssign('end', []);

        return {
            id: this.config.id,
            list: this.events,
            name: this.config.name,
            switchId: 1,
            trigger: 0
        };
    }
}

function run() {
    document.getElementById('output').value = '';
    let scriptToEvent = new d9mScriptToEvent();
    const res = scriptToEvent.run(document.getElementById('input').value);
    document.getElementById('output').value = JSON.stringify(res);
}

document.getElementById('input').value = `■ 1,テスト
tone 夕暮れ,60,wait
wait 60
flash 255:255:255:127,60,wait
wait 60
shake 5,5,60,wait
`;
</script>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・対応済みイベント</h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>文字の表示</li>



<li>注釈</li>



<li>ウエイト</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ピクチャの表示</li>



<li>ピクチャの移動</li>



<li>ピクチャの色調変更</li>



<li>ピクチャの消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>色調変化</li>



<li>フラッシュ</li>



<li>シェイク</li>
</ul>
</div>
</div>



<h3 class="wp-block-heading">・ツクールへの適用方法</h3>



<p>▼コモンイベントの場合<br><strong><mark style="background-color:#7bdcb5" class="has-inline-color">data/CommonEvents.json</mark></strong>を開き、該当するIDの行と差し替えます。<strong><mark style="background-color:#f78da7" class="has-inline-color">最後のカンマは付いてない</mark></strong>ので注意してください。</p>



<p>▼マップイベントの場合<br><strong><mark style="background-color:#7bdcb5" class="has-inline-color">data/Map***.json</mark></strong>を開き、該当する行のlist:[…]を置き換え用JSON内にあるlist:[…]と差し替えます。</p>



<p>カンマ漏れやコピペミスをしたりするとエラーとなり、プロジェクトが閉じられます。jsonファイルを戻して開き直せば復活しますので慌てなくても大丈夫です。</p>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-0847c30d7adc199159c107d1c3ea0103"><strong>※発生した問題に責任は持てません。<br>　試す場合は該当するjsonだけでなく、プロジェクト全体をバックアップしてからご使用ください。</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●追加した機能</h2>



<h3 class="wp-block-heading">・tone</h3>



<p>画面の色調を指定した時間をかけて変化させます。</p>



<p><strong>▼パラメータ　書式：【色調,変化時間,完了までウエイト】</strong></p>



<figure class="wp-block-table"><table><thead><tr><th>パラメータ名</th><th>内容</th></tr></thead><tbody><tr><td>色調</td><td>「R:G:B:グレー」の順で各値を-255～255の範囲から選びます。<br>また、プリセットを指定して選ぶことも可能です。<br>「通常」<br>「ダーク」<br>「セピア」<br>「夕暮れ」<br>「夜」</td></tr><tr><td>変化時間</td><td>変化にかける時間をフレームで1～999の範囲から選びます。</td></tr><tr><td>完了までウエイト</td><td>完了までウエイトする場合は「wait」と記述します。<br>それ以外だった場合、変化完了を待たずに次のイベントに進みます。</td></tr></tbody></table></figure>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・flash</h3>



<p>画面を指定した強さ、時間で光らせます。</p>



<p><strong>▼パラメータ　書式：【フラッシュ色,変化時間,完了までウエイト】</strong></p>



<figure class="wp-block-table"><table><thead><tr><th>パラメータ名</th><th>内容</th></tr></thead><tbody><tr><td>フラッシュ色</td><td>「R:G:B:強さ」の順で各値を0～255の範囲から選びます。</td></tr><tr><td>変化時間</td><td>変化にかける時間をフレームで1～999の範囲から選びます。</td></tr><tr><td>完了までウエイト</td><td>完了までウエイトする場合は「wait」と記述します。<br>それ以外だった場合、変化完了を待たずに次のイベントに進みます。</td></tr></tbody></table></figure>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・shake</h3>



<p>画面を指定した強さ、速さ、時間で揺らします。</p>



<p><strong>▼パラメータ　書式：【強さ,速さ,変化時間,完了までウエイト】</strong></p>



<figure class="wp-block-table"><table><thead><tr><th>パラメータ名</th><th>内容</th></tr></thead><tbody><tr><td>強さ</td><td>ピクチャの配置先番号を1～100の範囲から選びます。</td></tr><tr><td>速さ</td><td>変化速度のタイプを以下から選択して指定します。<br>「一定速度」<br>「ゆっくり始まる」<br>「ゆっくり終わる」<br>「ゆっくり始まってゆっくり終わる」</td></tr><tr><td>変化時間</td><td>変化にかける時間をフレームで1～999の範囲から選びます。</td></tr><tr><td>完了までウエイト</td><td>完了までウエイトする場合は「wait」と記述します。<br>それ以外だった場合、変化完了を待たずに次のイベントに進みます。</td></tr></tbody></table></figure>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●まとめ</h2>



<p>イベント変換ツールに画面演出の機能を追加しました。対応イベントは<strong><mark style="background-color:#7bdcb5" class="has-inline-color">「色調変化、フラッシュ、シェイク」</mark></strong>の３種。</p>



<p>複雑なパラメータを持つイベントがなかったので楽に追加できました。色調変化がプリセットで指定できるのはお気に入り。</p>



<p>次は<strong><mark style="background-color:#7bdcb5" class="has-inline-color">「スイッチの操作、変数の操作」</mark></strong>を追加する予定です。どうせならシンプルに扱いたいので、ちょっと簡単さを熟考しないと。変数の操作にあるスクリプトに式を渡すだけになるかも知れませんが。</p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-003/">【RPGツクール】イベント変換ツール～画面演出</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/rmmz-plugin-003/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>【ARPG-PluginSet】カニ歩き＋剣振り</title>
		<link>https://d9m.one/rmmz_arpgpluginset15/</link>
					<comments>https://d9m.one/rmmz_arpgpluginset15/#comments</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Tue, 02 Apr 2024 14:20:29 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<category><![CDATA[プラグイン]]></category>
		<category><![CDATA[ARPGプラグインセット]]></category>
		<category><![CDATA[アクション]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2529</guid>

					<description><![CDATA[<p>「カニ歩き＋剣振り」、コメントで頂いたネタを記事にさせていただきました。 アイキャッチ画像の通りイベントを設定すればカニ歩きしつつ剣を振れます。標準キー以外だとスクリプトを触る必要があるかと思うので、とりあえず標準で使え [&#8230;]</p>
<p>投稿 <a href="https://d9m.one/rmmz_arpgpluginset15/">【ARPG-PluginSet】カニ歩き＋剣振り</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>「カニ歩き＋剣振り」、コメントで頂いたネタを記事にさせていただきました。</p>



<p><mark style="background-color:#7bdcb5" class="has-inline-color"><strong>アイキャッチ画像の通り</strong></mark>イベントを設定すればカニ歩きしつつ剣を振れます。標準キー以外だとスクリプトを触る必要があるかと思うので、とりあえず標準で使えて他に影響がない「tab」で試しています。（ない…よね？）</p>



<p>ただ、向き固定時の移動量が残っているようで<strong><mark style="background-color:#7bdcb5" class="has-inline-color">「後退時に押されるように戻る」</mark></strong>という問題が発生しています…。<a href="https://d9m.one/rmmz_arpgpluginset9/">壺投げ</a>でも発生していた位置ズレと似ているかも。移動を完全に停止するプラグインコマンドを作成すれば解決しそうなので、改めてこちらも調査してみようと思います。<br><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">※追記：2024/04/11　解決しました！→<a href="https://d9m.one/rmmz_arpgpluginset16/">【ARPG-PluginSet】向き固定慣性の不具合対応</a></mark></strong></p>



<p>カニ歩きスイッチがOFFの時に指定キーが押されたらカニ歩きスイッチをONにしてカニ歩きを開始。カニ歩きスイッチがONの時に指定キーが離されたらカニ歩きスイッチをOFFにしてカニ歩きを終了。この形で実装されています。</p>



<p><strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">※追記：2024/04/03　ソウルブレイダーのカニ歩きは剣を出したまま敵が倒せた気がするので、やりたいことは「剣振り」ではなく、「攻撃判定を持った剣を出したままにする」ことを指していたのでしょうかね。動的オブジェクトを向き固定のON/OFFと連動させれば可能です。<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">せっかくなので、</mark></strong>剣を突き出したまま動けるようにして記事を追記します。</mark></strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●向き固定→カニ歩き</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>RPGツクールMZには「向き固定」があり、移動ルートの設定で指定することができます。</p>



<p>透明化ONは通常イベントにあるけど、向き固定は移動ルートの設定だけなんですかね？画像の変更も通常イベントにはないし、時々見当たらずにとまどってしまう。</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure data-wp-context="{&quot;imageId&quot;:&quot;683ace64030aa&quot;}" data-wp-interactive="core/image" class="wp-block-image aligncenter size-medium wp-lightbox-container"><img decoding="async" width="300" height="172" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://d9m.one/wp-content/uploads/2024/04/image-300x172.png" alt="移動ルートの設定＞向き固定ON" class="wp-image-2531" srcset="https://d9m.one/wp-content/uploads/2024/04/image-300x172.png 300w, https://d9m.one/wp-content/uploads/2024/04/image-768x440.png 768w, https://d9m.one/wp-content/uploads/2024/04/image.png 884w" sizes="(max-width: 300px) 100vw, 300px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on-async--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">移動ルートの設定＞向き固定ON</figcaption></figure>
</div>
</div>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●指定キー判定</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>条件分岐ページ4のスクリプトに「Input.isPressed(&#8216;キー名&#8217;)」と書きます。これで、指定キーが押されたかどうかの判定ができます。</p>



<p>標準で用意されていないものはプラグインで追加しないと判定できません。プラグインで「これ使うよ」という指示が必要になります。</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure data-wp-context="{&quot;imageId&quot;:&quot;683ace640351c&quot;}" data-wp-interactive="core/image" class="wp-block-image aligncenter size-medium wp-lightbox-container"><img decoding="async" width="300" height="258" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://d9m.one/wp-content/uploads/2024/04/image-1-300x258.png" alt="条件分岐で指定キーの判定が可能" class="wp-image-2532" srcset="https://d9m.one/wp-content/uploads/2024/04/image-1-300x258.png 300w, https://d9m.one/wp-content/uploads/2024/04/image-1.png 478w" sizes="(max-width: 300px) 100vw, 300px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on-async--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">条件分岐で指定キーの判定が可能</figcaption></figure>
</div>
</div>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●スイッチで制御</h2>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:66.66%">
<p>キー判定でON/OFFすれば済むと思ってました…。並列処理で移動ルートの設定をプレイヤー対象で呼び出すと<strong><mark style="background-color:#7bdcb5" class="has-inline-color">処理落ち</mark></strong>します。一瞬安請け合いを後悔しました。しかし、スイッチで移動ルートの設定を１回だけ呼ぶようにして回避。一応カニ歩き＋剣振りができました。</p>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow" style="flex-basis:33.33%">
<figure data-wp-context="{&quot;imageId&quot;:&quot;683ace6403951&quot;}" data-wp-interactive="core/image" class="wp-block-image aligncenter size-medium wp-lightbox-container"><img decoding="async" width="300" height="258" data-wp-class--hide="state.isContentHidden" data-wp-class--show="state.isContentVisible" data-wp-init="callbacks.setButtonStyles" data-wp-on-async--click="actions.showLightbox" data-wp-on-async--load="callbacks.setButtonStyles" data-wp-on-async-window--resize="callbacks.setButtonStyles" src="https://d9m.one/wp-content/uploads/2024/04/image-3-300x258.png" alt="カニ歩き中ON/OFFが切り替わった時だけ移動ルートの設定を呼ぶ" class="wp-image-2534" srcset="https://d9m.one/wp-content/uploads/2024/04/image-3-300x258.png 300w, https://d9m.one/wp-content/uploads/2024/04/image-3.png 478w" sizes="(max-width: 300px) 100vw, 300px" /><button
			class="lightbox-trigger"
			type="button"
			aria-haspopup="dialog"
			aria-label="拡大する"
			data-wp-init="callbacks.initTriggerButton"
			data-wp-on-async--click="actions.showLightbox"
			data-wp-style--right="state.imageButtonRight"
			data-wp-style--top="state.imageButtonTop"
		>
			<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" fill="none" viewBox="0 0 12 12">
				<path fill="#fff" d="M2 0a2 2 0 0 0-2 2v2h1.5V2a.5.5 0 0 1 .5-.5h2V0H2Zm2 10.5H2a.5.5 0 0 1-.5-.5V8H0v2a2 2 0 0 0 2 2h2v-1.5ZM8 12v-1.5h2a.5.5 0 0 0 .5-.5V8H12v2a2 2 0 0 1-2 2H8Zm2-12a2 2 0 0 1 2 2v2h-1.5V2a.5.5 0 0 0-.5-.5H8V0h2Z" />
			</svg>
		</button><figcaption class="wp-element-caption">カニ歩き中ON/OFFが切り替わった時だけ移動ルートの設定を呼ぶ</figcaption></figure>
</div>
</div>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●まとめ</h2>



<p>指定キー押し下げ中は向き固定、というイベントでカニ歩き＋剣振りが実装できました。処理落ち回避のため「カニ歩き中」スイッチを使用。移動ルートの設定が何度も呼ばれないよう制御しています。</p>



<p>ただ、後退した時に押されるように戻されるという問題が残ってます。こればかりはすぐに解決出来そうにないですね。。。ARPG_Core.jsを調べる必要がでてきそう。</p>



<p>あーるさん、コメントありがとうございました。</p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>
<p>投稿 <a href="https://d9m.one/rmmz_arpgpluginset15/">【ARPG-PluginSet】カニ歩き＋剣振り</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/rmmz_arpgpluginset15/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>【RPGツクール】イベント変換ツール～ピクチャ関係</title>
		<link>https://d9m.one/rmmz-plugin-002/</link>
					<comments>https://d9m.one/rmmz-plugin-002/#respond</comments>
		
		<dc:creator><![CDATA[だくまた]]></dc:creator>
		<pubDate>Mon, 01 Apr 2024 05:45:06 +0000</pubDate>
				<category><![CDATA[RPGツクール]]></category>
		<guid isPermaLink="false">https://d9m.one/?p=2473</guid>

					<description><![CDATA[<p>イベント変換ツールにピクチャ関連の機能を追加</p>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-002/">【RPGツクール】イベント変換ツール～ピクチャ関係</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[
<p>ピクチャ関係の機能をイベント変換ツールに追加しました。<strong><mark style="background-color:#7bdcb5" class="has-inline-color">「ピクチャの表示、ピクチャの移動、ピクチャの色調変更、ピクチャの消去」</mark></strong>の４種です。</p>



<p>テキストの解析部分を変更し、変換イベントを追加しやすくしました。入れ子になるであろう条件分岐や選択肢で大きく修正が入りそうですが、一旦このまま突き進みます。</p>



<p>※　<a href="https://rpgmakerofficial.com/product/mz/download/dlc/dl_02.html">ARPGプラグインセット</a>を解析した記事もあります。<br>　　「<a href="https://d9m.one/rmmz_arpgpluginset1/">攻撃範囲の変更</a>」「<a href="https://d9m.one/rmmz_arpgpluginset2/">剣振りアニメ解析</a>」「<a href="https://d9m.one/rmmz_arpgpluginset14/">ブーメラン</a>」とか、よろしく。</p>



<h2 class="wp-block-heading">●バージョン0.02</h2>



<h3 class="wp-block-heading">・イベント変換ツール</h3>



<p>左側のテキストエリアにスクリプトを書き、変換ボタンを押すと右側のテキストエリアにコモンイベント置き換え用のJSONが出力されます。</p>



<div style="height: 300px; display: flex;">
<textarea id="input" style="width: 496px; height: 100%;"></textarea>
<span style="height: 100%; display: inline-block; vertical-align: middle;"><button style="background:#990099" onclick="run();">変換→</button></span>
<textarea id="output" style="width: 646px; height: 100%;"></textarea>
</div>
<script>
let clamp = function (num, min, max) {
  return Math.min(Math.max(num, min), max);
};

ENUM = {
    msg: {
        back: [ 'ウィンドウ', '暗くする', '透明' ],
        pos: [ '上', '中', '下' ],
    },
    pic: {
        pos: [ '左上', '中央' ],
        blend: [ '通常', '加算', '乗算', 'スクリーン' ],
        type: {
            '一定速度': 0,
            'ゆっくり始まる': 1,
            'ゆっくり終わる': 2,
            'ゆっくり始まってゆっくり終わる': 3,
        },
    },
    tone: {
        '通常':   [   0,   0,   0,   0 ],
        'ダーク': [ -68, -68, -68,   0 ],
        'セピア': [  34, -34, -68, 170 ],
        '夕暮れ': [  68, -34, -34,   0 ],
        '夜':     [ -68, -68,   0,  68 ],
    },
}

CODE_TABLE = {
    '//':       108,    // 注釈（１行目）
    '//*':      408,    // 注釈（２行目以降）
    'msg':      101,    // 文字表示の初期化
    'msg*':     401,    // 文字表示（行単位）
    'wait':     230,    // ウエイト
    'pic':      231,    // ピクチャの表示
    'picMove':  232,    // ピクチャの移動
    'picTone':  234,    // ピクチャの色調補正
    'picClear': 235,    // ピクチャの消去
    'end':      0,
}

let eventParser = {
    '■': function (evInfo) {
        this.config.id = evInfo.params[0];
        this.config.name = evInfo.params[1];
    },

    '//': function (evInfo) {
        if (evInfo.blocks.length === 0) {
            this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
        } else {
            let command = '//';
            if (evInfo.params[0]) {
                this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
                command = '//*';
            }
            for (let i = 0; i < evInfo.blocks.length; i++) {
                this.eventAssign(command, [ evInfo.blocks[i] ]);
                command = '//*';
            }
        }
    },

    msgWnd: function (evInfo) {
        this.config.msg.back = this.getEnum(ENUM.msg.back, evInfo.params[0], 0);
        this.config.msg.pos = this.getEnum(ENUM.msg.pos, evInfo.params[1], 2);
    },

    msg: function (evInfo) {
        // 顔画像の位置指定が無い場合は0とする
        if (isNaN(evInfo.params[2]) === true || evInfo.params[2] < 0 || 8 <= evInfo.params[2]) {
            evInfo.params[2] = 0;
        }

        this.eventAssign(evInfo.command, [
            evInfo.params[1],
            evInfo.params[2],
            this.config.msg.back,
            this.config.msg.pos,
            evInfo.params[0],
        ]);

        for (let msgLine of evInfo.blocks) {
            this.eventAssign('msg*', [ msgLine ]);
        }
    },

    wait: function (evInfo) {
        this.eventAssign(evInfo.command, evInfo.params);
    },

    picDef: function (evInfo) {
        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(this.config.pic, params);
            }
        }
    },

    pic: function (evInfo) {
        let result = {
            number: clamp(evInfo.params[0], 1, 100),       // ピクチャ番号
            image:  evInfo.params[1],           // 画像
            pos:    this.config.pic.pos,        // 原点
            mode:   this.config.pic.mode,       // 指定（直接か変数か）
            x:      0,                          // X座標
            y:      0,                          // Y座標
            scaleX: this.config.pic.scaleX,     // 拡大率　幅
            scaleY: this.config.pic.scaleY,     // 拡大率　高さ
            alpha:  this.config.pic.alpha,      // 不透明度
            blend:  this.config.pic.blend,      // 合成方法
        };

        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(result, params);
            }
        }

        this.eventAssign(evInfo.command, [
            result.number,
            result.image,
            result.pos,
            result.mode,
            result.v1,
            result.v2,
            result.scaleX,
            result.scaleY,
            result.alpha,
            result.blend,
        ]);
    },

    picMove: function (evInfo) {
        let type = this.getEnum(ENUM.pic.type, evInfo.params[1], 0);

        let result = {
            number:   clamp(evInfo.params[0], 1, 100),        // ピクチャ番号
            image:    0,                                    // 画像
            pos:      this.config.pic.pos,                  // 原点
            mode:     this.config.pic.mode,                 // 指定（直接か変数か）
            x:        0,                                    // X座標
            y:        0,                                    // Y座標
            scaleX:   this.config.pic.scaleX,               // 拡大率　幅
            scaleY:   this.config.pic.scaleY,               // 拡大率　高さ
            alpha:    this.config.pic.alpha,                // 不透明度
            blend:    this.config.pic.blend,                // 合成方法
            waitTime: evInfo.params[2],                     // 経過時間：フレーム(1/60秒)
            waitFlag: evInfo.params[3] === 'wait',          // 完了までウエイト
            type:     type,                                 // イージングタイプ
        };

        if (evInfo.blocks) {
            for (let block of evInfo.blocks) {
                let [command, params] = this.scriptLineParse(block);
                (this.picParser[command].bind(this))(result, params);
            }
        }

        this.eventAssign(evInfo.command, [
            result.number,
            result.image,
            result.pos,
            result.mode,
            result.v1,
            result.v2,
            result.scaleX,
            result.scaleY,
            result.alpha,
            result.blend,
            result.waitTime,
            result.waitFlag,
            result.type,
        ]);
    },

    picTone: function (evInfo) {
        let parameters = [
            evInfo.params[0],
            this.getEnum(ENUM.tone, evInfo.params[1], evInfo.params[1].split(':')),
            evInfo.params[2],
            evInfo.params[3] === 'wait',
        ];
        this.eventAssign(evInfo.command, parameters);
    },

    picClear: function (evInfo) {
        this.eventAssign(evInfo.command, [ evInfo.params[0] ]);
    },
}

let picParser = {
    pos: function (result, params) {
        result.pos = this.getEnum(ENUM.pic.pos, params[0], 0);

        if (isNaN(params[1]) === false) {
            // 直接指定
            result.mode = 0;
            result.v1 = params[1];
            result.v2 = params[2];
        } else {
            // 変数で指定
            result.mode = 1;
            result.v1 = this.getVarId(params[1]);
            result.v2 = this.getVarId(params[2]);
        }
    },
    scale: function (result, params) {
        result.scaleX = clamp(params[0], -2000, 2000);
        result.scaleY = Math.lamp(params[1], -2000, 2000);
    },
    alpha: function (result, params) {
        result.alpha = clamp(params[0], 0, 255);
    },
    blend: function (result, params) {
        result.blend = this.getEnum(ENUM.pic.blend, params[0], 0);
    },
}

class d9mScriptToEvent {
    constructor() {
        this.eventParser = eventParser;
        this.picParser = picParser;

        this.config = {
            prev: '',
            indent: 0,
            msg: { back: 0, pos: 2 },
            pic: {
                pos:      0,    // 0: 左上, 1: 中央
                mode:     0,    // 0: 直接指定, 1: 変数で指定
                scaleX: 100,    // 拡大率　幅
                scaleY: 100,    // 拡大率　高さ
                alpha:  255,    // 不透明度
                blend:    0,    // 合成方法
            },

            id: 0,
            name: '',
        }

        this.events = [];
    }

    scriptLineParse(script) {
        if (script.slice(-1) === '{') {
            script = script.substring(0, script.length - 1).trim();
        }
        let parts = script.split(' ');

        // コマンドを取得
        let command = parts[0];

        // パラメータを展開
        let params = parts[1] ? parts[1].split(',') : [];
        params = params.map(param => {
            return isNaN(param) ? param : Number(param);
        });

        return [command, params];
    }

    eventAssign (command, params = []) {
        this.events.push({ code: CODE_TABLE[command], indent: this.config.indent, parameters: params });
    }

    getEnum (enumObj, value, def) {
        let result = def;

        if (isNaN(value) === true) {
            if (Array.isArray(enumObj)) {
                if (enumObj.indexOf(value) !== -1) {
                    result = enumObj.indexOf(value);
                }
            } else {
                if (enumObj[value]) {
                    result = enumObj[value];
                }
            }
        } else {
            result = value;
        }

        return result;
    }

    getVarId (varName) {
        return 0;
    }

    run (text) {
        const lines = text.split('\r\n').join('\n').split('\r').join('\n').split('\n');

        for (let i = 0; i < lines.length; i++) {
            let script = lines[i].trim();

            // 空行はスキップ
            if (script === '') {
                continue;
            }

            // スクリプト行を展開
            let [command, params] = this.scriptLineParse(script);

            // ブロックを取得
            let blocks = [];
            if (script.slice(-1) === '{') {
                for (i++; i < lines.length; i++) {
                    if (lines[i].charAt(0) === '}') {
                        break;
                    }
                    blocks.push(lines[i].trim());
               }
            }

            // イベント展開
            let evInfo = { command, params, blocks };
            if (this.eventParser[evInfo.command]) {
                (this.eventParser[evInfo.command].bind(this))(evInfo);
            } else {
                this.eventAssign('//',  [`イベントを認識できませんでした。`]);
                this.eventAssign('//*', [script]);
            }
        }

        this.eventAssign('end', []);

        return {
            id: this.config.id,
            list: this.events,
            name: this.config.name,
            switchId: 1,
            trigger: 0
        };
    }
}

function run() {
    document.getElementById('output').value = '';
    let scriptToEvent = new d9mScriptToEvent();
    const res = scriptToEvent.run(document.getElementById('input').value);
    document.getElementById('output').value = JSON.stringify(res);
}

document.getElementById('input').value = `■ 1,テスト
// 最初の行{
comment1
comment2
comment3
}
msgWnd 暗くする,上
msg 名前,Monster,6 {
１行目
２行目
３行目
}
pic 1,Actor1_1 {
    pos 左上,488,280
    alpha 0
}
picMove 1,一定速度,60,wait {
    pos 左上,488,280
    alpha 255
}
picTone 1,夜,120,wait
picClear 1`;
</script>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・対応済みイベント</h3>



<div class="wp-block-columns is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex">
<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>文字の表示</li>



<li>注釈</li>



<li>ウエイト</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow">
<ul class="wp-block-list">
<li>ピクチャの表示</li>



<li>ピクチャの移動</li>



<li>ピクチャの色調変更</li>



<li>ピクチャの消去</li>
</ul>
</div>



<div class="wp-block-column is-layout-flow wp-block-column-is-layout-flow"></div>
</div>



<h3 class="wp-block-heading">・ツクールへの適用方法</h3>



<p>▼コモンイベントの場合<br><strong><mark style="background-color:#7bdcb5" class="has-inline-color">data/CommonEvents.json</mark></strong>を開き、該当するIDの行と差し替えます。<strong><mark style="background-color:#f78da7" class="has-inline-color">最後のカンマは付いてない</mark></strong>ので注意してください。</p>



<p>▼マップイベントの場合<br><strong><mark style="background-color:#7bdcb5" class="has-inline-color">data/Map***.json</mark></strong>を開き、該当する行のlist:[…]を置き換え用JSON内にあるlist:[…]と差し替えます。</p>



<p>カンマ漏れやコピペミスをしたりするとエラーとなり、プロジェクトが閉じられます。jsonファイルを戻して開き直せば復活しますので慌てなくても大丈夫です。</p>



<p class="has-vivid-red-color has-text-color has-link-color wp-elements-0847c30d7adc199159c107d1c3ea0103"><strong>※発生した問題に責任は持てません。<br>　試す場合は該当するjsonだけでなく、プロジェクト全体をバックアップしてからご使用ください。</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●追加した機能</h2>



<h3 class="wp-block-heading">・picDef</h3>



<p>ピクチャ関係の処理でデフォルトとして扱う値を事前登録します。</p>



<p><strong>▼パラメータ　なし</strong></p>



<p><strong>▼ブロック<br></strong>省略、順不同、１つだけでも指定可能です。</p>



<p><strong>【pos 位置原点,X,Y】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>位置原点</td><td>ピクチャ配置の原点を以下から選択して指定します。<br>「左上」<br>「中央」</td></tr><tr><td>X</td><td>ピクチャの原点からの相対X位置を-9999～9999の範囲から選びます。<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">※変数は未対応</mark></strong></td></tr><tr><td>Y</td><td>ピクチャの原点からの相対Y位置を-9999～9999の範囲から選びます。<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">※<strong>変数は未対応</strong></mark></strong></td></tr></tbody></table></figure>



<p><strong>【scale 幅拡大率,高さ拡大率】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>幅拡大率</td><td>ピクチャの幅の拡大率を-2000～2000の範囲から選びます。</td></tr><tr><td>高さ拡大率</td><td>ピクチャの高さの拡大率を-2000～2000の範囲から選びます。</td></tr></tbody></table></figure>



<p><strong>【alpha 不透明度】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>不透明度</td><td>ピクチャの不透明度を0～255の範囲から選びます。</td></tr></tbody></table></figure>



<p><strong>【blend 合成方法】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>合成方法</td><td>ピクチャの合成方法を以下から選択して指定します。<br>「通常」<br>「加算」<br>「乗算」<br>「スクリーン」</td></tr></tbody></table></figure>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・pic</h3>



<p>ピクチャを表示します。</p>



<p><strong>▼パラメータ　書式：【ピクチャ番号,画像】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>ピクチャ番号</td><td>ピクチャの配置先番号を1～100の範囲から選びます。</td></tr><tr><td>画像</td><td>ピクチャとして扱う画像ファイル名を指定します。（拡張子抜き）</td></tr></tbody></table></figure>



<p><strong>▼ブロック<br></strong>省略、順不同、１つだけでも指定可能です。</p>



<p><strong>【pos 位置原点,X,Y】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>位置原点</td><td>ピクチャ配置の原点を以下から選択して指定します。<br>「左上」<br>「中央」</td></tr><tr><td>X</td><td>ピクチャの原点からの相対X位置を-9999～9999の範囲から選びます。<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">※変数は未対応</mark></strong></td></tr><tr><td>Y</td><td>ピクチャの原点からの相対Y位置を-9999～9999の範囲から選びます。<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">※<strong>変数は未対応</strong></mark></strong></td></tr></tbody></table></figure>



<p><strong>【scale 幅拡大率,高さ拡大率】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>幅拡大率</td><td>ピクチャの幅の拡大率を-2000～2000の範囲から選びます。</td></tr><tr><td>高さ拡大率</td><td>ピクチャの高さの拡大率を-2000～2000の範囲から選びます。</td></tr></tbody></table></figure>



<p><strong>【alpha 不透明度】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>不透明度</td><td>ピクチャの不透明度を0～255の範囲から選びます。</td></tr></tbody></table></figure>



<p><strong>【blend 合成方法】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>合成方法</td><td>ピクチャの合成方法を以下から選択して指定します。<br>「通常」<br>「加算」<br>「乗算」<br>「スクリーン」</td></tr></tbody></table></figure>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・picMove</h3>



<p>ピクチャの位置、不透明度を変化させます。</p>



<p><strong>▼パラメータ　書式：【ピクチャ番号,イージング,かけるフレーム,完了までウエイト】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>ピクチャ番号</td><td>ピクチャの配置先番号を1～100の範囲から選びます。</td></tr><tr><td>イージング</td><td>変化速度のタイプを以下から選択して指定します。<br>「一定速度」<br>「ゆっくり始まる」<br>「ゆっくり終わる」<br>「ゆっくり始まってゆっくり終わる」</td></tr><tr><td>かけるフレーム</td><td>変化にかける時間をフレームで1～999の範囲から選びます。</td></tr><tr><td>完了までウエイト</td><td>完了までウエイトする場合は「wait」と記述します。<br>それ以外だった場合、変化完了を待たずに次のイベントに進みます。</td></tr></tbody></table></figure>



<p><strong>▼ブロック<br></strong>省略、順不同、１つだけでも指定可能です。</p>



<p><strong>【pos 位置原点,X,Y】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>位置原点</td><td>ピクチャ配置の原点を「左上」「中央」から選択して指定します。</td></tr><tr><td>X</td><td>ピクチャの原点からの相対X位置を-9999～9999の範囲から選びます。<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">※変数は未対応</mark></strong></td></tr><tr><td>Y</td><td>ピクチャの原点からの相対Y位置を-9999～9999の範囲から選びます。<strong><mark style="background-color:rgba(0, 0, 0, 0)" class="has-inline-color has-vivid-red-color">※<strong>変数は未対応</strong></mark></strong></td></tr></tbody></table></figure>



<p><strong>【scale 幅拡大率,高さ拡大率】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>幅拡大率</td><td>ピクチャの幅の拡大率を-2000～2000の範囲から選びます。</td></tr><tr><td>高さ拡大率</td><td>ピクチャの高さの拡大率を-2000～2000の範囲から選びます。</td></tr></tbody></table></figure>



<p><strong>【alpha 不透明度】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>不透明度</td><td>ピクチャの不透明度を0～255の範囲から選びます。</td></tr></tbody></table></figure>



<p><strong>【blend 合成方法】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>合成方法</td><td>ピクチャの合成方法を以下から選択して指定します。<br>「通常」<br>「加算」<br>「乗算」<br>「スクリーン」</td></tr></tbody></table></figure>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・picTone</h3>



<p>ピクチャの色調を変化させます。</p>



<p><strong>▼パラメータ　書式：【ピクチャ番号,色調,かけるフレーム,完了までウエイト】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>ピクチャ番号</td><td>ピクチャの配置先番号を1～100の範囲から選びます。</td></tr><tr><td>色調</td><td>「R:G:B:グレー」の順で各値を-255～255の範囲から選びます。<br>また、プリセットを指定して選ぶことも可能です。<br>「通常」<br>「ダーク」<br>「セピア」<br>「夕暮れ」<br>「夜」</td></tr><tr><td>かけるフレーム</td><td>変化にかける時間をフレームで1～999の範囲から選びます。</td></tr><tr><td>完了までウエイト</td><td>完了までウエイトする場合は「wait」と記述します。<br>それ以外だった場合、変化完了を待たずに次のイベントに進みます。</td></tr></tbody></table></figure>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h3 class="wp-block-heading">・picClear</h3>



<p>ピクチャを消去します。</p>



<p><strong>▼パラメータ　書式【ピクチャ番号】</strong></p>



<figure class="wp-block-table"><table><tbody><tr><td>ピクチャ番号</td><td>ピクチャの配置先番号を1～100の範囲から選びます。</td></tr><tr><td>イージング</td><td>変化速度のタイプを以下から選択して指定します。<br>「一定速度」<br>「ゆっくり始まる」<br>「ゆっくり終わる」<br>「ゆっくり始まってゆっくり終わる」</td></tr><tr><td>かけるフレーム</td><td>変化にかける時間をフレームで1～999の範囲から選びます。</td></tr><tr><td>完了までウエイト</td><td>完了までウエイトする場合は「wait」と記述します。<br>それ以外だった場合、変化完了を待たずに次のイベントに進みます。</td></tr></tbody></table></figure>



<p><strong>▼ブロック　なし</strong></p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>



<h2 class="wp-block-heading">●まとめ</h2>



<p>イベント変換ツールにピクチャ関係の機能を追加しました。</p>



<p>対応イベントは「ピクチャの表示、ピクチャの移動、ピクチャの色調変更、ピクチャの消去」の４種。回転はあまり使い勝手がよくないので今回はスキップしました。何度も回転したり、指定角度で止めたりを期待したのですが、１回転固定で速度指定しか無いというのはどのような用途を想定されてるんですかね？</p>



<p>次は画面演出関係、「シェイク、フラッシュ、色調補正」を追加する予定です。</p>



<div style="height:36px" aria-hidden="true" class="wp-block-spacer"></div>
<p>投稿 <a href="https://d9m.one/rmmz-plugin-002/">【RPGツクール】イベント変換ツール～ピクチャ関係</a> は <a href="https://d9m.one">だくまたゲーム制作ブログ</a> に最初に表示されました。</p>
]]></content:encoded>
					
					<wfw:commentRss>https://d9m.one/rmmz-plugin-002/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
