code:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:element name="kojodef">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="command" maxOccurs="unbounded" />
			</xs:sequence>
		</xs:complexType>
	</xs:element>
	<xs:element name="command">
		<xs:complexType>
			<xs:sequence>
				<xs:element ref="kojo" />
			</xs:sequence>
			<xs:attribute name="com" use="required" />
			<xs:attribute name="name" use="required" />
		</xs:complexType>
	</xs:element>
	<xs:element name="kojo">
		<xs:complexType>
			<xs:simpleContent>
				<xs:extension base="xs:string">
					<xs:attribute name="place" use="required" />
					<xs:attribute name="isInitiative" use="optional" />
					<xs:attribute name="isPlayer" use="optional" />
					<xs:attribute name="isFall" use="optional" />
					<xs:attribute name="withMaster" use="optional" />
					<xs:attribute name="emotion" use="optional" />
					<xs:attribute name="estrus" use="optional" />
					<xs:attribute name="isMob" use="optional" />
					<xs:attribute name="priority" use="optional" />
					<xs:attribute name="ufufu" use="optional" />
					<xs:attribute name="cutDescription" use="optional" />
					<xs:attribute name="eval" use="optional" />
					<xs:attribute name="function" use="optional" />
				</xs:extension>
			</xs:simpleContent>
		</xs:complexType>
	</xs:element>
</xs:schema>


code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<kojodef>
	<command com="300" name="会話">
		<kojo place="TOP" priority="1">「ごきんげんよう、奇遇ですね～」
「よろしければ少しご一緒にお散歩しませんか？」</kojo>
	</command>
	<command com="300" name="会話">
		<kojo place="TOP" isFall="恋慕" priority="1">「ごきんげんよう、%ANAME(MASTER)%様」</kojo>
	</command>
	<command com="300" name="会話">
		<kojo place="TOP" isFall="親愛" priority="1">「ふふ、ご機嫌麗しゅう。%ANAME(MASTER)%様」</kojo>
	</command>
	<command com="300" name="会話">
		<kojo place="TOP" isInitiative="無" priority="1">「何かご用でしょうか？」</kojo>
	</command>
	<command com="300" name="会話">
		<kojo place="TOP" isInitiative="有" priority="1">「お暇でしたら……少しお話しませんか？」</kojo>
	</command>
	<command com="320" name="スキンシップ">
		<kojo place="TOP" priority="1">「あらあら……、あまりベタベタ触ると女の子に嫌われちゃいますよ」</kojo>
	</command>
	<command com="320" name="スキンシップ">
		<kojo place="TOP" priority="1">「マッサージ？　ではお願いしちゃいましょうか」</kojo>
	</command>
	<command com="320" name="スキンシップ">
		<kojo place="TOP" priority="1">「凝ってますね～。　運動の後はよくほぐした方がいいですよ」</kojo>
	</command>
	<command com="321" name="頭を撫でる">
		<kojo place="TOP" isPlayer="実行" priority="1">「よしよし」</kojo>
	</command>
	<command com="321" name="頭を撫でる">
		<kojo place="TOP" isPlayer="対象" priority="1">「ふふっ、なでなでされるのも悪い気はしませんね」</kojo>
	</command>
	<command com="327" name="抱きしめる">
		<kojo place="TOP" isPlayer="実行" priority="1">「ぎゅってして欲しい？　では……どうぞ❤」</kojo>
	</command>
	<command com="327" name="抱きしめる">
		<kojo place="TOP" isPlayer="対象" priority="1">「もーっと、甘やかしてくれても……いいんですよ？」</kojo>
	</command>
	<command com="704" name="食事する">
		<kojo place="TOP" priority="1">「いただきまーす」
「うん、美味しいです」</kojo>
	</command>
	<command com="30" name="正常位">
		<kojo place="TOP" isInitiative="有" priority="1">「動きますね……。　力を抜いて……」</kojo>
	</command>
	<command com="30" name="正常位">
		<kojo place="TOP" isInitiative="無" priority="1">「んっ、や、優しくしてください……」</kojo>
	</command>
</kojodef>

repo_name: pervysquirrelz/erafl

license: unknown


code:
<?xml version="1.0" encoding="UTF-8"?>
<skilldef>
	<defname parentname="TESTSKILL1">
		<skillname>テストスキル１</skillname>
		<category>PRODUCTION</category>
		<type>COMMON</type>
		<reqParam name="戦闘" value="1"></reqParam>
		<description>テストスキル１ちゃん</description>
		<funcname>TESTSKILL_1</funcname>
	</defname>
	<defname parentname="TESTSKILL2">
		<skillname>テストスキル２</skillname>
		<category>BATTLE</category>
		<reqParam name="身体" value="2"></reqParam>
		<reqParam name="知識" value="3"></reqParam>
		<description>テストスキル２ちゃん</description>
	</defname>
	<defname parentname="SKILL_FORESTERY">
		<skillname>The blessings of the forest</skillname>
		<category>PRODUCTION</category>
		<reqParam name="身体" value="2"></reqParam>
		<reqParam name="知識" value="3"></reqParam>
		<description>More items available in forests</description>
	</defname>
	<defname parentname="SKILL_MINING">
		<skillname>Geological scholars</skillname>
		<category>PRODUCTION</category>
		<reqParam name="身体" value="2"></reqParam>
		<reqParam name="知識" value="3"></reqParam>
		<description>More items available through mining</description>
	</defname>
</skilldef>


code:
;-------------------------------------------------
; eraFL licence
; ※emuera本体のライセンスについてはemueraのライセンスをご参照ください
;-------------------------------------------------
(JP)
1.以下のリソースは記載条件を満たす場合全部または一部を自由に使用できます
# '\ERB' フォルダ配下の.ERB、.ERH、その他設定ファイル
    ・eraに関する非営利の創作活動に限った利用であること
    ・当バリアントの引用元バリアント(Credit.txt参照)を含め、出典元が任意の箇所にクレジットされていること
    ・クエストデータや口上などについて、下位フォルダにパッチ提供者の個別のreadmeファイルが同梱されており、
    　ライセンスが明記されている場合は当該ライセンスに準じてください

2.上記以外のリソースについてeraFL及びeraFL関連の非営利の創作活動を除く利用を禁止します

(ENG)
1.You are free to use the following resources within the specified conditions.
# Under the '\ERB' folder: .ERB, .ERH files, and other configuration files
    ・Usage is limited to non-profit creative activities related to era.
    ・Including the source variant of this variant (refer to the Credit.txt), the original sources must be credited at any given point.
    ・For quest data, dialogue data(kojo,口上), etc., if a patch provider's individual readme file is included in a subfolder and a license is specified, please adhere to that license.

2. Use of resources other than the above is prohibited, except for non-profit creative activities related to eraFL and eraFL-associated works.


code:
MAP_NAME = "サンプル湾地方"
MAP_IMAGE = "bg01.webp"
PATH_COLOR = "0xbc5800"
PATH_ALPHA = "0x7d"
NODE_BASE_COLOR = "0x380000"


code:
<DocumentElement>
  <GMAPDATA>
    <id>638132111005945864</id>
    <NODE_ID>0</NODE_ID>
    <NODE_NAME>開始地点</NODE_NAME>
    <POS_X>120</POS_X>
    <POS_Y>40</POS_Y>
    <PATH_LIST>1,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638132111033352208</id>
    <NODE_ID>1</NODE_ID>
    <NODE_NAME>河口</NODE_NAME>
    <POS_X>140</POS_X>
    <POS_Y>120</POS_Y>
    <PATH_LIST>0,2,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638132111061328182</id>
    <NODE_ID>2</NODE_ID>
    <NODE_NAME>中継地点</NODE_NAME>
    <POS_X>160</POS_X>
    <POS_Y>200</POS_Y>
    <PATH_LIST>1,3,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638132111104710255</id>
    <NODE_ID>3</NODE_ID>
    <NODE_NAME>河口</NODE_NAME>
    <POS_X>240</POS_X>
    <POS_Y>240</POS_Y>
    <PATH_LIST>2,6,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638132111165052839</id>
    <NODE_ID>4</NODE_ID>
    <NODE_NAME>森林</NODE_NAME>
    <POS_X>380</POS_X>
    <POS_Y>280</POS_Y>
    <PATH_LIST>6,7,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638132111205627830</id>
    <NODE_ID>5</NODE_ID>
    <NODE_NAME>南の街道</NODE_NAME>
    <POS_X>240</POS_X>
    <POS_Y>320</POS_Y>
    <PATH_LIST>9,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638132111252109954</id>
    <NODE_ID>6</NODE_ID>
    <NODE_NAME>森林</NODE_NAME>
    <POS_X>300</POS_X>
    <POS_Y>280</POS_Y>
    <PATH_LIST>3,4,9,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638132111338516795</id>
    <NODE_ID>7</NODE_ID>
    <NODE_NAME>中継地点</NODE_NAME>
    <POS_X>460</POS_X>
    <POS_Y>260</POS_Y>
    <PATH_LIST>4,8,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638132111371666588</id>
    <NODE_ID>8</NODE_ID>
    <NODE_NAME>野獣の荒野</NODE_NAME>
    <POS_X>520</POS_X>
    <POS_Y>220</POS_Y>
    <PATH_LIST>7,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638135526512727269</id>
    <NODE_ID>9</NODE_ID>
    <NODE_NAME>港町</NODE_NAME>
    <POS_X>300</POS_X>
    <POS_Y>320</POS_Y>
    <PATH_LIST>6,5,</PATH_LIST>
  </GMAPDATA>
</DocumentElement>


code:
MAP_NAME = "海岸の探索"
MAP_IMAGE = "coast01.webp"
PATH_COLOR = "0x401008"
PATH_ALPHA = "0xff"
NODE_BASE_COLOR = "0x4007c"


code:
<DocumentElement>
  <GMAPDATA>
    <id>638465506330299747</id>
    <NODE_ID>0</NODE_ID>
    <NODE_NAME>海沿いの街</NODE_NAME>
    <POS_X>320</POS_X>
    <POS_Y>320</POS_Y>
    <PATH_LIST>1,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465506650520506</id>
    <NODE_ID>1</NODE_ID>
    <NODE_NAME>ロングビーチ</NODE_NAME>
    <POS_X>300</POS_X>
    <POS_Y>220</POS_Y>
    <PATH_LIST>0,2,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465506779047977</id>
    <NODE_ID>2</NODE_ID>
    <NODE_NAME>干潟の渡</NODE_NAME>
    <POS_X>340</POS_X>
    <POS_Y>200</POS_Y>
    <PATH_LIST>1,3,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465506808927172</id>
    <NODE_ID>3</NODE_ID>
    <NODE_NAME>海神の上顎</NODE_NAME>
    <POS_X>320</POS_X>
    <POS_Y>160</POS_Y>
    <PATH_LIST>2,9,4,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465506827910053</id>
    <NODE_ID>4</NODE_ID>
    <NODE_NAME>難破船</NODE_NAME>
    <POS_X>340</POS_X>
    <POS_Y>120</POS_Y>
    <PATH_LIST>3,5,7,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465506925168239</id>
    <NODE_ID>5</NODE_ID>
    <NODE_NAME>岬への道</NODE_NAME>
    <POS_X>300</POS_X>
    <POS_Y>60</POS_Y>
    <PATH_LIST>4,6,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465506954387945</id>
    <NODE_ID>6</NODE_ID>
    <NODE_NAME>灯台跡</NODE_NAME>
    <POS_X>180</POS_X>
    <POS_Y>80</POS_Y>
    <PATH_LIST>5,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465507033928423</id>
    <NODE_ID>7</NODE_ID>
    <NODE_NAME>悪魔の岩礁</NODE_NAME>
    <POS_X>460</POS_X>
    <POS_Y>80</POS_Y>
    <PATH_LIST>4,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465507082969356</id>
    <NODE_ID>8</NODE_ID>
    <NODE_NAME>イラス=ネレイス</NODE_NAME>
    <POS_X>520</POS_X>
    <POS_Y>80</POS_Y>
    <PATH_LIST />
  </GMAPDATA>
  <GMAPDATA>
    <id>638465507192248791</id>
    <NODE_ID>9</NODE_ID>
    <NODE_NAME>入り江</NODE_NAME>
    <POS_X>420</POS_X>
    <POS_Y>160</POS_Y>
    <PATH_LIST>3,10,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465507220849302</id>
    <NODE_ID>10</NODE_ID>
    <NODE_NAME>入り江</NODE_NAME>
    <POS_X>500</POS_X>
    <POS_Y>200</POS_Y>
    <PATH_LIST>9,11,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465507248188408</id>
    <NODE_ID>11</NODE_ID>
    <NODE_NAME>入り江の洞窟</NODE_NAME>
    <POS_X>520</POS_X>
    <POS_Y>260</POS_Y>
    <PATH_LIST>10,12,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638465507268628282</id>
    <NODE_ID>12</NODE_ID>
    <NODE_NAME>海魔の巣窟</NODE_NAME>
    <POS_X>560</POS_X>
    <POS_Y>260</POS_Y>
    <PATH_LIST>11,</PATH_LIST>
  </GMAPDATA>
</DocumentElement>


code:
MAP_NAME = "深森の忘都"
MAP_IMAGE = "ruin01.webp"
PATH_COLOR = "0x401800"
PATH_ALPHA = "0x5a"
NODE_BASE_COLOR = "0x402828"


code:
<DocumentElement>
  <GMAPDATA>
    <id>638304523773293067</id>
    <NODE_ID>0</NODE_ID>
    <NODE_NAME>入り口</NODE_NAME>
    <POS_X>20</POS_X>
    <POS_Y>360</POS_Y>
    <PATH_LIST>1,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524102094969</id>
    <NODE_ID>1</NODE_ID>
    <NODE_NAME>忘れられた凱旋門</NODE_NAME>
    <POS_X>60</POS_X>
    <POS_Y>300</POS_Y>
    <PATH_LIST>0,2,3,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524133455830</id>
    <NODE_ID>2</NODE_ID>
    <NODE_NAME>皇帝像</NODE_NAME>
    <POS_X>140</POS_X>
    <POS_Y>340</POS_Y>
    <PATH_LIST>1,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524196886589</id>
    <NODE_ID>3</NODE_ID>
    <NODE_NAME>広場跡</NODE_NAME>
    <POS_X>180</POS_X>
    <POS_Y>220</POS_Y>
    <PATH_LIST>1,4,5,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524234985752</id>
    <NODE_ID>4</NODE_ID>
    <NODE_NAME>昔日の練兵廟</NODE_NAME>
    <POS_X>40</POS_X>
    <POS_Y>180</POS_Y>
    <PATH_LIST>3,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524328409347</id>
    <NODE_ID>5</NODE_ID>
    <NODE_NAME>大通り</NODE_NAME>
    <POS_X>300</POS_X>
    <POS_Y>260</POS_Y>
    <PATH_LIST>3,6,14,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524394875610</id>
    <NODE_ID>6</NODE_ID>
    <NODE_NAME>鬱蒼たる森林</NODE_NAME>
    <POS_X>380</POS_X>
    <POS_Y>340</POS_Y>
    <PATH_LIST>5,12,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524462036246</id>
    <NODE_ID>7</NODE_ID>
    <NODE_NAME>森没のバシリカ</NODE_NAME>
    <POS_X>240</POS_X>
    <POS_Y>180</POS_Y>
    <PATH_LIST>8,14,15,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524517886558</id>
    <NODE_ID>8</NODE_ID>
    <NODE_NAME>茫漠の回廊</NODE_NAME>
    <POS_X>360</POS_X>
    <POS_Y>140</POS_Y>
    <PATH_LIST>7,9,10,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524555844689</id>
    <NODE_ID>9</NODE_ID>
    <NODE_NAME>大庭園</NODE_NAME>
    <POS_X>240</POS_X>
    <POS_Y>100</POS_Y>
    <PATH_LIST>8,13,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524612886053</id>
    <NODE_ID>10</NODE_ID>
    <NODE_NAME>森奥宮</NODE_NAME>
    <POS_X>420</POS_X>
    <POS_Y>120</POS_Y>
    <PATH_LIST>8,11,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524649983886</id>
    <NODE_ID>11</NODE_ID>
    <NODE_NAME>観者無きオルケストラ</NODE_NAME>
    <POS_X>540</POS_X>
    <POS_Y>100</POS_Y>
    <PATH_LIST>10,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524785885582</id>
    <NODE_ID>12</NODE_ID>
    <NODE_NAME>鬱蒼たる深林</NODE_NAME>
    <POS_X>520</POS_X>
    <POS_Y>300</POS_Y>
    <PATH_LIST>6,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304524898103672</id>
    <NODE_ID>13</NODE_ID>
    <NODE_NAME>過栄の丘</NODE_NAME>
    <POS_X>240</POS_X>
    <POS_Y>60</POS_Y>
    <PATH_LIST>9,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304528156357980</id>
    <NODE_ID>14</NODE_ID>
    <NODE_NAME>大通り</NODE_NAME>
    <POS_X>360</POS_X>
    <POS_Y>200</POS_Y>
    <PATH_LIST>0,5,7,</PATH_LIST>
  </GMAPDATA>
  <GMAPDATA>
    <id>638304528468791989</id>
    <NODE_ID>15</NODE_ID>
    <NODE_NAME>書庫</NODE_NAME>
    <POS_X>140</POS_X>
    <POS_Y>160</POS_Y>
    <PATH_LIST>7,</PATH_LIST>
  </GMAPDATA>
</DocumentElement>


code:
eraFL
著作者:kom1
====================

## このバリアントについて
ファンタジー世界を舞台にサンドボックス的な要素を持つ箱庭でキャラクターたちとキャッキャウフフしつつ、
TRPG的なテイストを持つクエストをこなしていくゲームを構想しています。
編集可能な箱庭内でのライフシミュ的な要素と恋姫/tohoK由来の多人数交流の組み合わせが主な特色です。

## 導入について
eraFLはサウンド再生に対応しています。サウンドファイルは以下から取得可能です。

## お知らせ
1.ご意見・感想・バグ報告その他もろもろのことについてはしたらばの開発スレまたは以下のdiscordにてお気軽にお伝えください
https://discord.gg/Hyr5hRsxd9

2.随時フィードバックを目的としたアンケートを受け付けております
アカウント情報は匿名で回答が外部に公開されることもないのでお気軽に回答いただけますと幸いです。
https://forms.gle/TD9x6SPLfHZuSEaHA

3.まだまだ作成途上のアルファ版のため、大半の要素は仮組みや未実装です。
また、更新によってセーブデータの互換性がしばしば断たれる可能性があります。

## 謝辞
このバリアントはera恋姫の改変バリアントであるeratohoKを改変したバリアントであるera4Xをさらに改変させていただいたものです。
上記バリアントの作者様及びパッチ製作者様にこの場を借りて謝辞を述べさせていただきます。

## 制約・免責
18歳未満の利用を禁止します。
ソフトウェア及び同梱ファイルによって生じたいかなる損害・障害・その他不利益に対して著作者は一切の責任を負わないものとします。

## ライセンス
licence_eraFL.txtを参照ください

##いただいたパッチに関する取り扱いについて
# ライセンス
・readmeに明記されていない限り、本体のライセンスに準ずる取り扱いとさせていただきます
・もし本体より強固なライセンス(再配布不可、改変不可など)をご希望される場合はご相談ください

# 取込について
・修正・仕様変更等に際し修正したり改変させていただく場合があります
・ケースバイケースで取込を遠慮させていただく場合があります
	・プレイヤーに無警告で行われる、過度に人を選ぶ性癖や嗜好のもの
	・世界観と著しく乖離すると判断したもの
		パロディやオマージュの粋を越えた他作品の二次創作などが該当します
		このあたりはほぼ私のさじ加減と独断である点ご了承ください
		これはどうだろう？と思った場合にはスレまたはdiscordにてご質問いただけると幸いです

## 既知の不具合、修正済不具合
https://gitgud.io/kom1t/erafl/-/issues/?sort=created_date&state=opened&first_page_size=20

;-------------------------------------------------
; 更新履歴
; ※既知の不具合、修正済み不具合については上述のリンク参照
;-------------------------------------------------
#V0.400
【取込させていただいたいただきものパッチ】(時系列順)
・「『ディアナ』口上更新パッチ」
・「欲望に従うコマンド追加パッチ」
・「『シルフィーユ』口上・スキル追加修正パッチ」
・「新ユニークキャラ『ロイド』口上・スキル・関連クエスト・デイリー追加／更新パッチ」
・「設備：独房追加パッチ」
・「樹精の森＆性転換薬改変パッチ」
・「ランダム生成ポートレイト多様化パッチ」
・「状態異常処理整理パッチ」
・「戦闘時中クリックでのオードモード実行パッチ」
・「明るいボクっ娘口上更新パッチ」
・「設備：サウナ追加パッチ」
・「足舐めＭ快楽パッチ」
・「ダメージ計算処理整理パッチ」
・「アイテムクラフト画面に料理効果表示パッチ」
・「調教コマンド拡張パッチ」
・「スキル：「背水」「根性」追加パッチ」
・「甘えん坊なロリっ子口上更新パッチ」
・「『オレーシャ』口上更新・汎用スキル追加パッチ」

【キャラクター・口上・キャラクターイベント・ポートレイト】
・新ユニークキャラクター「ロイド」及び関連口上、クエスト、デイリーを追加
・ディアナ、シルフィーユ、オレーシャの口上更新
・汎用口上「明るいボクっ娘口上」、「甘えん坊なロリっ子口上」を追加
・ランダムキャラがより多様なパーツで生成されるように

【クエスト】
・ロイドの関連クエスト「忌み地より来たる者」、「元騎士ロイド」を追加
・「月下離宮イシリオン」を追加
・樹精の森で性転換薬の素材を入手できるように
・北港都市リスノイでサウナに関連するイベントが発生するように

【スキル・戦闘】
・「シルフィール」、「ロイド」に関連するユニークスキルの追加
・汎用スキル「背水」、「根性」、「俘者への致命打」追加
・戦闘中任意の箇所をミドルクリックするとオードモードが実行されるように
・スキル習得画面を刷新
・戦闘関連処理のリファクタリング
　⇒ダメージ計算結果が微変

【交流・コマンド】
・「欲望に従う」コマンド追加
⇒プレイヤー側が主導権を持つおまかせ系コマンド
・設備「サウナ」及び「サウナ」コマンド追加
・既存コマンドの複数回自動実行コマンドの追加（「搾精する」、「なすがまま」の回数指定）
・設備「独房」を追加
⇒虜囚の捕縛に「独房」の設置を要求するように
・コマンド「足を舐める」でＭ快感を得るように

【アイテム】

・アイテムクラフト時に料理効果を確認できるように
・性転換薬の名称を「ティレシアスの秘薬」に変更。前提素材の変更
⇒「樹精の森」で入手できる「樹華結晶」を要求するように
・アイテム「プリアポスの恵み」を追加
⇒性器のサイズを変更できるように（要：淫魔の錬成陣）

【UI・UX】
・装備変更画面のUIを刷新
・スキル習得画面のUIを刷新

【その他】
・eraFL更新ツール(update.exe)を同梱
　⇒更新ツールを実行すると、本体のファイルを自動更新します(gitなどの導入は不要です)

#V0.390
【取込させていただいたいただきものパッチ】(時系列順)
・「UX改善」
・「『オレーシャ』口上・スキル・イベント更新」
・「『甘えん坊なロリっ子』口上追加・更新」
・「娼館処理の不具合修正」
・「クエスト『蛇竜討伐』追加」
・「縄コマンドの実行オプション追加」
・「『アルノー』スキル更新」
・「ポートレイト位置調整機能」
・「eraFL用スケベモブ化パッチ」
・「汎用口上『明るいボクっ娘口上』追加・更新」
・「汎用口上『妾っ娘口上』追加」
・「『ディアナ』口上更新パッチ」
・「オート戦闘倍速モード追加パッチ」
・「XML定義分割化パッチ」
・「性転換薬追加パッチ」

【キャラクター・口上・キャラクターイベント・ポートレイト】
・「オレーシャ」、「ススキ」、「アステ」に関連する口上、スキル、イベントの追加・更新
・「ディアナ」に関連する口上の更新
・汎用口上「甘えん坊なロリっ子」、「明るいボクっ娘口上」、「妾っ娘口上」の追加
・ポートレイトパーツの位置調整機能を追加、各パーツの位置、拡大率、角度を調整できるように
・ポートレイトパーツ区分「鼻」の追加
　⇒顔パーツ選択画面が長くなりすぎてしまったので修正予定です

【クエスト】
・「蛇竜討伐」追加
・「城塞都市ヴェロエア」イベント更新・調整

【スキル・戦闘】
・オレーシャ、ススキ、アステ、アルノーに関連するユニークスキルの追加
・スキル「追跡」、「くくり罠」、「イーグルアイ」、「アルカナクローク」、「アルカナフラッシュ」の追加
・「石の雨」、「追撃」他いくつかのスキルの効果を調整
・戦闘時にオート処理の速度倍率を変更できるように
・勇気の歌、鼓舞はスタン効果解消に加え、一定ターンスタン耐性を上昇させるように
　⇒特に問題がなければ他のデバフ解消系スキルも順次調整できればと思います

【アイテム】
・クエスト中の装備入手時に右クリックで往来通り即時入手できるように
・「性転換薬」を追加
・サルマキス薬で性器が生えた際、サイズを再計算するように

【交流・コマンド】
・「縄で縛る」コマンドのオプションとして「吊り下げ」、「縛り付け」が選択できるように

【UI・UX全般】
・設備表示ウィンドウ、関係性表示画面、行動一覧画面が見切れる場合があるため修正

【その他】
・デバッグモード限定でキャラクターに「スケベモブ」の素質を付与可能に
　⇒モブ専用の制御用素質なので、今後のVerUPでの動作は保証できない点ご了承ください
・いくつかの不具合・誤記の修正

【開発者向けの情報】
・スキル発動時の対象上書き処理の脅威選定に番号に加え脅威選定を指定できるようになりました（「高脅威」など）
　⇒あわせてスキル発動時用の脅威選定として「トークン」を追加しています。特定のトークンを持っているターゲットを優先攻撃する指定です
　　詳細な使い方はWPN_SKILL_ACTIVE.xmlの「スペルブレイク」を参照ください

#V0.380
【取込させていただいたいただきものパッチ】
・「売春関連機能追加パッチ」
・「新ユニークキャラ『アステ』追加パッチ」、「『アステ』口上・スキル拡張パッチ』」
・「新ユニークキャラ『スフレ』追加パッチ」
・「ポートレイト画面表情テスト機能パッチ」
・「新ユニークキャラ『オレーシャ』追加パッチ」、「『オレーシャ』スキル追加・更新パッチ」
・「汎用口上_甘えん坊なロリっ子口上追加パッチ」
・「ユニークキャラ『ディアナ』更新パッチ」
・「ポートレイトパーツ追加パッチ」
・「宿泊者カップル登場パッチ」
・「コンフィグ・子供の特殊性別許可パッチ」
・「スケジュールのコピペ機能」パッチ

【キャラクター・口上・キャラクターイベント・ポートレイト】
・新ユニークキャラクター「アステ」、「スフレ」、「オレーシャ」及び関連口上、デイリーイベントの追加
・ディアナの口上を更新
・エルの口上を加筆
・ポートレイト編集時に表情を確認できるように
・ポートレイトパーツの追加（髪型、包帯、傷）

【クエスト】
・アステの関連クエスト「飛竜退治」、「夜半の闖入者」追加
・スフレの関連クエスト「セイレーンの歌声」追加
・オレーシャの関連クエスト「ゴブリンと雪国の狩人」、「狩人救出作戦」、「北港都市リスノイ」追加

【交流・コマンド】
・娼館での「春をひさぐ」コマンド実行時に売春メニューを選べるように
・宿泊客に男女のカップルが登場し、個室や遮蔽された場所で逢瀬を交わすように
・領内活動でのキャラクターの行動が[ACTION]タブから確認できるように
・口内放尿・後背位のコマンド実行条件の調整

【スキル・戦闘】
・アステ、スフレ、オレーシャ、ディアナに関連するユニークスキルの追加
・スキル「ハイディング」、「アサシネイト」の追加
・エネミーの「リアクト」は連続で使用されないように

【コンフィグ】
・子供の特殊性別(ふたなり、男の娘)の可否を選択するコンフィグを「調教に関する設定」に追加
・宿泊客カップルに関するコンフィグを「領内活動に関する設定」に追加

【開発者向けの情報】
・口上エディタ：コマンド番号はTRAIN.CSVに表記されているコマンド名でも指定できるように
・口上エディタ：コマンド番号は','区切りで複数指定できるように。
　⇒'愛撫,胸愛撫'のように指定すると愛撫か胸愛撫の場合に出力対象になります
・エネミーに特定の行動を実行させるためのエネミールーチンを登録可能に
・ゲームデータエディタをtoolsフォルダ配下に追加。汎用エネミーデータを一括編集可能に
　⇒汎用エネミーのデータはXML\ENEMY_DATA.xmlから読み込むようになりました

【その他・不具合修正】
・（重篤）キャラクターを出稼ぎに送るなどして削除した際、キャラクターの関係性の更新が正しく行われない不具合を修正
・戦闘時に状態異常系トークンが正しく機能していない不具合の修正
・その他エラー、誤記、軽微な調整他

【既知の不具合】
・関係性他いくつかのウィンドウで表示行がウィンドウサイズを超過した際に表示が見切れてしまう

# V0.372
【スキル】
・ルーンの付呪画面で付呪のつけ外しができるように
・ルーン付呪時のコストは装備スロットにかかわらず一律1に変更
【交流】
・設備「王侯の食卓」を追加
・設備「こたつ」を追加
【その他】
・複数の不具合修正

# V0.371
【キャラクター・口上】
・いただきもの「顔・身体パーツ追加パッチ」取込
　⇒男性的な体形の身体パーツと輪郭を選択可能に
・いただきもの「『ススキ』口上・スキル拡張パッチ2」取込
・いただきもの「eraFL新ユニークキャラ『ルミナ』追加パッチ」取込
・いただきもの「『ミニョネット』口上小更新パッチ」取込
・いただきもの「『シルフィーユ』デイリー・戦闘時口上追加パッチ」取込
・いただきもの「eraFL新ユニークキャラ『ディアナ』追加パッチ、関連スキル追加パッチ」取込
・アルノー、アーレンのデフォルト身体パーツを男性タイプに変更(ニューゲーム時に反映)
・オリヴィアのデフォルト背面パーツを尻尾に変更(ニューゲーム時に反映)
	⇒この辺りのパーツはゲーム中でも変更できるようにする予定です
【クエスト】
・いただきもの「クエスト53『城塞都市ヴェロエア』追加パッチ」取込
・いただきもの「武器入手時のステータス表示パッチ」取込

【交流・コマンド】
・「私室」など特定のエリアで実行可能なコマンド「エリアを施錠する」を追加
・「誘い受け」の判定値を微減
・領内活動のマップ描画方法を変更しパフォーマンスを改善

【スキル・戦闘】
・いただきもの「通常攻撃・パッシブスキル新方式化パッチ」取込
・いただきもの「スキル画面でのトークン情報ツールチップ表示パッチ」取込
・スキル「カウンター」、「反撃の構え」の威力、条件を調整
　⇒「反撃」トークンは発動時に消費されるように

【その他】
・複数の不具合の修正

# V0.370
【キャラクター・口上】
	・いただきもの「新ユニークキャラ『アーレン』追加パッチ」取込
	・いただきもの「『アルノー』デイリー追加パッチ」取込
	・いただきもの「『シルフィーユ』口上・スキル追加パッチ」取込
	・いただきものパッチより戦闘時に口上を設定・表示できるように
	・各キャラクターは相互に関係性(好感度・依存度・従属度・支配度)を持つように
	・上記のパラメータに応じて陥落相当の関係性(恋慕、恋人、隷属等々)を構築できるように(デフォルトは友人、親友関係のみ)
	・能力情報 -> [関係] から対象キャラの関係性がみられるように
【交流】
	・キャラクター間の関係性パラメータが一定値に達した場合、ターン終了時にそのキャラ間で陥落相当のイベントが発生するように
	・領内活動時に同じ設備を使用し、一緒に活動している場合対象キャラクター間の好感度が上昇するように
	・ターン終了時に<知人>以上の関係性を持つキャラ同士で好感度が上昇する小イベントが発生するように
	・相互の関係性が<恋人>または<服従><支配>相当の関係である場合一定確率でターンエンド時にイベントが発生するように
	・モーニングコール「耳舐め手コキ」追加
【戦闘・スキル】
	・いただきもの「アクティブスキル新方式化パッチ」取込
【コマンド】
	・プレイヤー以外のキャラが主導権を握っており、他のプレイヤー以外のキャラに対してコマンドを実行した場合
	　プレイヤーの好感度系パラメータではなく、隊商キャラ間の関係性パラメータが変動するように
	・「舌を這わす」コマンドを継続できるように
	・「待機」コマンドは経過時間を選べるように
【その他】
	・用語集を追加。ホームメニューの情報欄から参照可能に
	・Emuere本体を更新
	・複数の不具合修正
【開発者向けの情報】
	・口上エディタv1.1aを戦闘口上に対応
	・デイリーイベントなどで使われる長文メッセージ出力用の関数@PRINT_DIAG 末尾の改行指定\nが不要になりました
	　(海岸の休日をご参考いただければ。互換性維持のため\nがあっても動きます)

# V0.362
【キャラクター】
	・エル、リュミエール、ソーニャ、オリヴィアについて、[情報]->[説明]タブにキャラクター説明を追加
【交流】
	・動作が軽量化するよういくつかの処理を修正
	・交流中ポートレイト右クリックにて表示されるメニューに「汚れを拭う」を追加。体表の汚れを落とせるように
	・奉仕系自動実行の挙動の修正
【アイテム・設備】
	・いただきもの「白濁した泉パッチ」取込。肉腫の檻に設置可能な設備を追加
	・いただきもの「バフ料理追加パッチ６」取込。新たな前提素材、料理、スキルを追加
【クエスト】
	・いただきもの「QUEST_52_東方世界への道追加パッチ」取込
	・いただきもの「開拓村の魔物退治シルフィーユ臨時加入パッチ」取込
【戦闘・スキル】
	・いただきもの「トークンアイコン表示パッチ」、「戦闘処理データテーブル化パッチ」取込
		より汎用的かつ複雑なスキル処理を行えるように
【コマンド】
	・コマンドオプションメニューの表示は右クリックではなくコマンド名をクリックすることで展開するように
	・いくつかの公衆の面前で実行できない想定のコマンドが実行できていたため修正
【その他】
	・複数の不具合の修正
	・口上エディタをv1.1aとして刷新

# V0.361
【キャラクター】
	・いただきもの「アルノー口上更新パッチ」、「アルノーデイリー追加パッチ」取込
	・いただきもの「フレーヴェデイリー追加パッチ」取込
	・いただきもの「汎用口上_冷然風味」取込
	・いただきもの「ススキ口上拡張パッチ」取込
	・いただきもの「インナーカラー用エクステ追加パッチ」取込
	・ソーニャのデイリーイベントを１つ追加
	・エルの口上を少量加筆（主人、所有者、舌を這わす他）
	・濃厚精液、母乳体質、雌牛の獲得条件を若干緩和
	・陥落済みの虜囚を解放し、仲間と同等として扱えるように
	・ポートレイト区分「インナーヘア」追加
【アイテム・設備】
	・ステータス画面からの装備を編集した際のUIを変更
【戦闘・スキル】
	・いただきもの「戦闘スキル追加パッチ」、「トークンのアイコン表示機能」取込
		⇒「アローレイン」、「秘孔」関連スキル、「カウンター」他多様なスキルが追加されます
	・性技スキル「魔力供給」を追加
	・主人公のスキル拡張上限を上方補正、仲間と同等になるように
【コマンド】
	・「舌を這わす」を追加 コマンド実行ボタン([単発])を右クリックすることでコマンドオプションを切り替え、舐める部位を変更できるように
	・「見つめる」の部位選択を上記の仕組みで処理するように
		⇒コマンド名の先頭に'*'が付いているものは右クリックで動作を切り替えられるようにしていく予定です
	・「入浴する」コマンドにて主人公が一人でお風呂に入れるように
	・「尻コキ」,「素股」,「囁きかける」は非押し倒しでも実行できるように
【設定】
	・[ゲームプレイに関する設定]を追加、サウンド設定はこれに統合
	・ゲームプレイに関する設定に「処理実行後のログを消去しない」を追加
	・[現在の設定を保存]にてサウンド設定などFLに関するコンフィグも保存されるように
	・[特典コードの入力]を追加
		⇒アンケート回答時に表示されるコードを入力すると粗品が受け取れます
【その他】
	・emuera本体の更新
	・いくつかの不具合修正、軽微な調整他

# V0.360
【キャラクター】
	・いただきもの汎用口上「先輩風口上」更新
	・素質＜サド＞の取得条件緩和
【アイテム・設備】
	・いただきもの「バフ料理・モジュール追加パッチ２～５」取込
		⇒料理に関する大量のアイテム、設備、スキルを追加していただきました
	・「鎮静剤」追加
	・設備「卑猥な書籍」追加
		⇒設備が存在するエリアで「勉強する」コマンドを実行すると性知識が上がるように
【戦闘】
	・スキルオート時に対象選択系スキルが選択された場合、停止せず対象をランダムに取るように
	・性的な攻撃による各種判定の調整
【クエスト】
	・「めくりめぐる淫魔の奇譚」追加
		「淫魔の小迷宮」、「深森の忘都」攻略後に挑戦可能に
	・「無限背塔・低層域」、「リナシメント」の装備ドロップに関する調整
		⇒無限背塔では装備、リナシメントではレリックが拾いやすくなるように
【その他・開発関連】
	・いただきもの「クエスト中パーティ編成機能」マージ
		⇒クエスト中にパーティを変更するイベント関数を提供していただきました
	・emuera本体の更新
	・いくつかの不具合修正、軽微な調整他

# V0.350
【キャラクター】
	・いただきもの「ユニークキャラ『シルフィーユ』追加パッチ」取込
		⇒シルフィーユの口上、デイリー、クエスト、専用スキルを追加
	・いただきもの「ススキ専用スキル追加パッチ2」取込
		⇒ススキの専用スキルを習得するイベントや口上の追加
【アイテム】
	・いただきもの「バフ料理・モジュール追加パッチ」取込
		⇒クエスト時に消費すると一定のバフを得られる料理群、及び素材を獲得できる設備を追加
	・いただきもの「純血保護パッチ」追加
		⇒ゴブリンの洞窟、フォルメンのスラムで純血を保護できるレリックを入手できるように
	・フォルメンの市場にアクセサリ屋を追加
		⇒スタン、毒等に耐性を付与できるレリックなどを販売
【クエスト】
	・リナシメント高難易度モードを若干易化
【スキル】
	・スキルの習得状況を個別にリセットできるように
	・アクティブ、パッシブスキルを複数追加
	・リュミエール専用スキル「女中的殴打」は装備スキル:重撃にも適用されるように
【戦闘】
	・自キャラクターの攻撃時に一定確率でクリティカルが生じるように
	・観察がクリティカル率、器用がクリティカルダメージ倍率に影響を与えるように
	・攻撃行動を行わず、自身に[バリア]を付与する防御行動が行えるように
	・[燃焼]の付与を確定から耐性を考慮するように変更、被ダメージ15%上昇の効果を追加
	・[挑発]保持対象はより優先的に攻撃されるように
【その他】
	・いくつかの不具合修正、バランス調整

# V0.341
【キャラクター】
	・いただきもののポートレートパーツを多数追加。併せてパーツ区分背面を追加
		⇒頭部位、背面、服etc,etc...
	・いただきもの「ユニークキャラ『アルノー』追加パッチ」取込
	・いただきもの「ミニョネット固有ポートレイト追加パッチ」取込
【交流】
	・ポートレイト右クリック時の動作を変更(クイックメニューからターゲットの切り替え、衣服の脱着、同行追加解除を行えるように)
	・往来の右クリックの機能はミドルクリックに割り当て
【戦闘】
	・戦闘時に発生するトークン（毒、スタンなど）にマウスカーソルを合わせると効果がわかるように
	・戦闘描画処理を変更
【クエスト・デイリー】
	・クエスト「アリーナ」受付嬢にポートレイトを追加
	・エル口上デイリー「海岸の休日」を追加
	　⇒バージョンアップ後一度「海岸の探索」クエストを実行する必要があります
	・「無限背塔」、「リナシメント」の宝箱、休憩イベントがわかりやすくなるように
【その他】
	・Emuera実行環境をEmuera.NET + EM-EE に変更

# V0.340
【キャラクター】
	・いただきもののポートレイトパーツを多数追加、口も複数種類から選択できるように
		⇒目、口、咥物、目隠、服、帽子etc,etc...
	・いただきもの「ユニークキャラクター『フレーヴェ』追加パッチ」取込
【交流】
	・いただきもの「施錠設備解錠パッチ」取込
	・アイテム「口枷」を所持している場合、コマンドとして実行できるように
	・「口枷」、「目隠」コマンド実行時にポートレイトに反映するように
	・スケジュール「搾乳」実行時対象キャラに「搾乳機」が装着されるように
【アイテム・スキル】
	・アイテムカテゴリー「ルーン」を追加
	・付呪システムを追加。ルーンを消費してクラフトした装備にスキルを追加できるように
	・「分身の術」の付与数を微減、クールタイムを増加
【クエスト】
	・いただきもの「採掘助手」「悪しき魔女の隠れ家更新パッチ」取込
	・いただきもの「炭鉱街イコン更新パッチ」取込
	・いただきもの「ノアレルム辺境の賊徒」取込
	・いただきもの「天才（災）魔導工学者フレーヴェ」「ドワーフの大坑道」取込
	・いただきもの「不思議なメダリオン」「夢幻の森の中で」取込
	・「平原の探索」にルーン入手イベントを追加
【戦闘】
	・いただきもの「スキルオート装備スキル対応パッチ」取込
	・いただきもの「戦闘時の性的ないやがらせパッチ」取込

# V0.332
【キャラクター】
	・いただきもののポートレイトパーツを多数追加
		⇒目、髪、化粧、首飾、帽子etc,etc...
	・いただきもの「ススキ専用スキル追加パッチ」取込
	・いただきもの「汎用_和風口上」取込
	・ポートレイト編集画面を刷新
【交流】
	・いただきもの「売春イベントの多様性強化パッチ」取込
	・いただきもののパッチより複数の陥落条件を同時に満たした場合、ルート選択ができるように
【スキル】
	・アレクシア専用スキル「挺身の盾」追加
	・「分身の術」の付与数を微減、クールタイムを増加
【クエスト】
	・いただきもの「アリーナエリア効果対応パッチ」取込
	・いただきもの「スキュラの女王ユニークキャラ化パッチ」取込
	・アレクシアの加入時の判定を微調整し緩和
【全般】
	・いただきもの「ユーザビリティ向上パッチ」取込

# V0.331
【キャラクター】
	・いただきものユニークキャラクター「ミニョネット」追加
		⇒ エリア「地下牢」建設で加入クエスト発生
	・いただきもの口上「汎用口上_陰気」更新
	・いただきもののポートレイトパーツを多数追加
		⇒目、髪、服、装飾etc,etc...
	・主人公のカスタマイズ機能を修正。姓名逆転や職業等々を設定できるように
	・主人公に汎用口上を割り当てられるように
	・いただきもの口上「女あなた汎用」追加
【交流】
	・虜囚の要素をテスト実装
	・エリア「地下牢」を建設可能に
	・スケジュール区分「搾乳」を追加
【クエスト】
	・いただきもの「アリーナ拡張パッチ」取込
	・エリア「地下牢」が建設済みの場合、対象護衛での野盗討伐時に名誉点と引き換えで虜囚にとれるように
	・リナシメントに高難易度モード追加。一定討伐時にランダム武器やレリックが得られるように

# V0.330
【キャラクター】
	・いただきもの「汎用口上_先輩風を吹かせる女の子」追加
	・いただきもの「汎用口上_陰気」更新
	・いただきもののポートレイトパーツを多数追加
		⇒髪、目、エクステ、衣服、帽子、エルフ耳etc,etc...
	・いただきものユニークキャラクター「ススキ」を追加
		⇒夜中にフォルメンの酒場『ヴァージン』で…？
	・いただきものパッチより、クエストクリア時にクエストに参加したキャラの好感度を得られるように
	・いただきものパッチより、モブキャラへの種付が記録されるように。また一部モブキャラの孕ませ・性交渉記録が自動生成されるように
	・リュミエールの「モーニングコール」、「公演」口上を微量加筆
【交流】
	・コマンド「囁きかける」実装
	・コマンド「待機」の経過時間を5分に変更
【クエスト】
	・いただきもののクエスト「悪しき魔女の隠れ家」追加
	・いただきもののクエスト「街角」更新
	・かたまりミルクの選択肢追加。少年の動的ポートレイトが生成されるように
【既知の不具合・修正済不具合】
	・https://gitgud.io/kom1t/erafl/-/issues/?sort=created_date&state=opened&first_page_size=20

# V0.322
【キャラクター】
	・いただきもののポートレイトパーツを多数追加
		⇒目、髪、ピアス、化粧、首飾　を追加
【交流】
	・スケジュール区分「訓練」を追加
	　・デスク、書架、広場、修練場で体力他対応するステータスの訓練が出来るように
	・スケジュール区分「クラフト」でのアイテム製造時、設備に対応する経験値が得られるように
【スキル】
	・以下のスキルを追加
	　クエストスキル「少数精鋭」、戦闘スキル「傭兵招集」
	　オリヴィア専用戦闘スキル「マーレノストラム」
【クエスト】
	・パーティプリセットを二枠追加
	・いただきもののミニゲーム「競馬」をフォルメンの南市門の先に配置
【その他】
	・内部処理の修正に関するパッチを適用
	　・いただきもの「重複関数削除パッチ」
	　・いただきもの「マジックナンバー修正パッチ」
	・その他不具合修正等
	※修正済不具合・既知の不具合参照

# V0.321
【キャラクター】
	・いただきもの「汎用_友人系青年」口上取込
	・いただきもの「汎用_僕っ子中性」口上取込
	・いただきもの「ポートレイトパーツ19点追加パッチ」重複パーツを修正
【交流】
	・いただきもの「モブ妊娠パッチ」取込
【クエスト】
	・いただきもの「採掘助手」の更新を反映
【スキル】
	・リアクト他、一部の攻撃を伴うスキルについて、パッシブスキルも発動するように
	・前衛防御の持続ターンを増加、攻撃を伴わない攻撃代替動作に変更
【不具合・軽微な修正】
	・淫魔の錬成陣が正常に機能しない不具合を修正
	・その他の修正不具合、既知の不具合は以下参照
	https://docs.google.com/spreadsheets/d/1Lc566lS0UgQ-DWvyMfcYPKxotGZp3Ljdx9_7UMicktQ/edit#gid=539688180
【その他】
	・Emuera本体を更新(Emuera1824+v21+EMv18+EEv46)

# V0.320
【キャラクター】
	・いただきもの「汎用_陰気口上」取込
	・いただきもの「ポートレイトパーツ19点追加パッチ」取込
【交流】
	・スケジュール区分「クラフト」を追加。仲間にアイテム生産を指示できるように
	・アイテム作成時にレシピを登録できるように(前述の作業指示で使用)
	・インテリア「淫魔の錬成陣」を追加
【クエスト】
	・いただきもの「街角」を取込
	・いただきもの「採掘助手」及びNPCを取込
	・いただきものフレーバーテキストより深森の忘都「碑文」イベントを加筆
	・海岸の探索「拠点」に商店を追加。水着着用時に「ロングビーチ」の海岸で水浴びコマンドを実行すると小イベントが発生するように
	・「トネリコの冒険」の一部OPなレリックを報酬から削除、名誉点等の報酬を微増
	・幾つかの初期クエストの前提条件を見直し
【スキル】
	・性技スキル「魔力供乳」を追加
	・性技スキル「経口摂取」の前提から誘蛾の色香を削除
【アイテム】
	・「海岸の探索」関連のアイテムを幾つか追加
【全般】
	・いただきもの「ユーザビリティ向上パッチ」取込
【不具合・軽微な修正】
	・一部のスキルが正常に機能しない不具合を修正
	・幾つかの不具合修正、バランス調整など
【その他】
	・Emuera本体を更新(Emuera1824+v18+EMv18+EEv45)
	・本体同梱のテキストファイFAQ

# V0.310
【交流・キャラクター】
	・いただきもののパッチ「ホームメニューでスケジュール管理」を取込
	・いただきもののパッチ「前髪追加パッチ」を取込
		⇒ランダムキャラ生成時に追加前髪を適用したキャラも生成されるように
	・オリヴィアの口上を加筆
【クエスト】
	・いただきもののパッチ「トネリコの冒険パッチ」を取込
	・「海岸の探索」を追加
		⇒「湯泡郷」クリア後挑戦可能です
【アイテム】
	・「海岸の探索」関連のアイテムを幾つか追加
【不具合・軽微な修正】
	・幾つかの不具合修正、バランス調整など

# V0.303
【交流・キャラクター】
	・いただきものの口上「友人系青年口上」「僕っ子中性」の更新・追加を反映
	・いただきものの口上「うふふお姉さん口上」を更新
	・いただきもののユニークキャラクター「アレクシア」を追加
【クエスト】
	・いただきもののクエスト「ゴブリン討伐」を追加
【その他】
	・いただきものの機能「カスタムキャラ雇用」を追加(デバッグモード時のみ有効)
【不具合・軽微な修正】
	・以下の不具合を修正
	・広場や酒場の演台で仲間一人で踊りや演奏をした後に眺めるを選ぶと操作不能になる
	・「アマゾネスの呼び出し」クエストで双方行動不能からの復帰後にコマンドの実行対象が正しくセットされない
	・クエスト「淫魔の小迷宮」の魔術書のイベントが実効値が足りない場合終了しない
	・修練場の人数上限で模擬戦を行った時登録メンバー上限を超えて強制終了する
	・あなたの客への奉仕終了後、店番をしていた奉仕不参加の店番キャラに＜春を売りたい＞の嗜好がつく
	・設定->既存キャラの保存で自陣営以外のキャラが保存できる
	・ホームメニューの改行不正による印字ずれ
	・DIALOGUE系クエストの調教画面で画面表示が崩れる
	・カスタムキャラに支配度を設定できない
	・道具系コマンドの実行後に継続状態の干渉判定が正しく機能しない
	・平原の探索、湯泡郷のフラグ管理不備
	・武器を大量に売却すると不正落ちする
	・ゲームロード時にサウンド再生オプションが正しく機能しない

# V0.302
【交流・キャラクター】
	・いただきものの口上「友人系青年口上」を追加
	・親愛など陥落度が2段階目まで到達している場合、鍵のかかっているキャラの部屋にも入れるように
	・炊事担当がなるべく配膳をサボらないように
	・Ｖ性交、Ａ性交系のモーニングコールを追加
【エリア・設備】
	・エリア「大居間」を追加
【クエスト】
	・かたまりミルクに選択肢を追加(誘蛾の色香LV3の場合4回目以降に出現)
【不具合・軽微な修正】
	・以下の不具合の修正
	　・特定の奉仕系イベントが正しく機能しない
	　・ギルドメニューのクエストが一部正しく表示されない
	　・技巧の宝玉で生活SPの拡張が出来ない
	　・コマンド対象選択状況次第で特定のコマンド処理で不正落ちが発生する
	　・能力一覧表示からNPCのステータスが参照できる
	　・その他誤記、軽微な不具合
	・サウンドファイルの適用方法にwin10でoggファイルを変更しようとした際に不正な負荷がかかる場合があるケースの対処法を記述

# V0.301
【全般】
	・いくつかのクエスト、イベント、コマンドにBGM、SEを追加
	・サウンドに関する設定に性交に関するサウンド設定を追加
【交流】
	・スケジュール区分[晩]を追加
	・スケジュール設定[芸能],[宿番]を追加
	・コマンド「じっと見る」で対象をとらず、同じエリア内で演奏や踊りを披露しているメンバーがいる場合、「眺める」が実行できるように
	・コマンド「演奏する」「踊る」
	・スケジュール芸能を設定されているキャラ、またはコマンド「演奏する」「踊る」を実行した場合、芸を鑑賞しているキャラがいれば時々おひねりがもらえるように
	・宿泊、バーカウンターでの飲酒時に宿泊客から代金を徴収できるように
【エリア・設備】
	・エリア「宿場」を追加
	・設備「宿場受付」「小舞台」「パーティステージ」を追加
【クエスト】
	・いただきもののクエスト「樹精の森」の更新を取り込み
	・ギルドメニューに簡易的なフィルターを追加
	・「平原の探索」ボス戦難易度の易化
	・「リナシメント」「無限背塔・低層部」の報酬を引き下げ
【スキル】
	・「再帰的詠唱」(ソーニャ専用)「揺ぎ無き言葉」を追加
	・いくつかのスキルのテキストを修正
	・「性主導」「性追随」の上昇補正を2倍から4倍に
【アイテム】
	・「ミルク」を追加。往来のミルクは「生乳」に変更
【不具合・軽微な修正】
	・以下の不具合の修正
	　・触手妊娠のフラグが適切に処理されていない
	　・ゲストとの逢瀬終了後に不正落ちする場合がある
	　・[SCHEDULE]メニューのページ処理が適切でない
	　・オリヴィアに動物耳としっぽ素質がない重篤な不具合
	・エリア内に8個以上の設備が存在する場合、スクロールボタンを表示するように
	・その他誤記、軽微な不具合

# V0.300
【全般】
	・BGM,SEに対応
		⇒適用方法はサウンドファイルの適用方法.txt参照
【キャラクター】
	・いただきものの汎用向上「うふふお姉さん口上」を取込
【交流】
	・露店での商談中、仲間が店員であり条件を満たした場合、イベント「お客様？　にご奉仕」が発生するように
	・キャラクターが特定の淫乱系素質を持っている場合、一定確率で領内活動開始時にイベント「モーニングコール」が発生するように
	・動物系モブを父親とする場合、父親が"不明"にならないように
	・コマンド「購入」を追加。商店に来店する買物客から素材などを買えるように
【戦闘・スキル】
	・いただきもののパッチよりオート戦闘機能を取込
	・任意のキャラを対象に取る歌唱・詠唱系スキル「アルカナミラージュ」「勇気の歌」「剣の舞」を追加
	・生活スキル「ミダスの手」「稲荷様の見えざる御手」(オリヴィア専用)を追加
【クエスト】
	・いただきもののクエスト「樹精の森」を取込
【設備・アイテム】
	・クリキャップ、ニプルキャップを追加
	・インテリア「蓄音機」を追加
【不具合・軽微な修正等】
	・V0.290_fix2までの修正の取込
	・いただきもののパッチより「酒恥肉倫」の不具合修正を取込
	・妊娠・触手妊娠関連の不具合の修正
	・特定条件で射精後の処理が正しく行われない不具合
	・その他バグ修正、軽微な修正等
【その他】
	・提供素材に関する提供元、権利者情報をCredit.txtに明記
	・リソース構成の変更に伴いライセンスを改訂

# V0.290
【キャラクター】
	・ユニークキャラクターとして行商人オリヴィアを追加
		⇒一定の商業評判値(後述)、好感度でデイリーイベントが発生し仲間になるように
【交流・キャラクター】
	・いただきもののパッチからランダムキャラ用命名リストを取り込み
	・ローター、バイブ、縄などの器具系コマンドは交流中つけっぱなしに出来るように
		⇒同行の解除や逢瀬の終了後も外さない限り継続が解除されません
	・条件を満たしている場合、非押し倒し状態でも嗜虐系コマンドから器具系コマンドが実行できるように
	・商業の評判の概念を追加、露店での取引に応じて評判が上昇するように
		現状では期終了時のレポートで評判値が確認可能
	・触手妊娠の出産に一定の期数を要求するように
	・ポートレイト用に眼鏡系パーツを追加
【スキル】
	・性技スキル「負け癖」を追加
【クエスト】
	・いただきもののパッチから「交易都市フォルメン」のイベントを追加(場末の酒場ヴァージン周辺のイベントを取り込み)
	・「交易都市フォルメン」スラムにイベントを追加
【不具合・軽微な修正等】
	・以下の不具合の修正を含む軽微な修正を実施
	　・継続コマンドの継続状態が複数の実行対象を取った際正しく機能しない場合がある
	　・汎用的な宝箱の解錠イベントの観察実行時の操作性を若干改善
	　・その他バグ修正、軽微な修正等
【その他】
	・emuera本体バージョンをEmuera1824+v18+EMv17+EEv43.exeに更新
	・口上エディタについて表示スケールが拡大されていても文字がぼやけないよう修正

# V0.283
【キャラクター】
	・エルの口上を加筆(告白、恋慕、親愛、服従、隷属取得時口上)
【交流・キャラクター】
	・バーカウンターで夜にキャラが飲酒を行うように(子供、幼稚を除く)
	・酒（現在は蒸留酒のみ）を所持している場合バーカウンターで「酒を飲ませる」コマンドが実行できるように
	・酔い潰れたキャラが寝落ちするように
	・あなたが酔い潰れた場合、状況に応じて仲間にお持ち帰りされるように
【不具合・軽微な修正等】
	・以下の不具合の修正を含む軽微な修正を実施
	　・いくつかのスキルが正しく動作していない
	　・武器強化時の改ページ処理が正しく機能していない
	　・特定のクエスト終了後に一部の一時パラメータが初期化されていない
	　・スキルクールタイムの減少処理が正しく機能していない
	　・「奉仕する」コマンド実行時の挙動が意図通りでない
	　・その他不具合、軽微な修正、バランス調整等

# V0.282
【設備・アイテム】
	・エリア、設備のクラフト画面を刷新
【交流・キャラクター】
	・武器、レリックをアイテムと同様露店で販売できるように
	・「政治」ステータスを「社交」にリネーム、露天販売時に経験値が入るように
		⇒現時点ではフレーバーに留まります
	・露店ゲストモブの所持金を上方修正
【クエスト】
	・「墳墓の小迷宮」に上位の難易度を追加
	・モブのみに行われる調教を中断(スキップ)できるように
【スキル】
	・「マナボルト」「戦歌」「ディミヌエンド」を追加
	・「戦術詠唱」をLV3まで強化できるように
【コマンド】
	・「性の知識を教える」を交流中実行できるように
	・「告白する」を非ウフフでも実行できるように
【その他】
	・ライセンスを改訂(licence_eraFL.txt 参照)
【不具合・軽微な修正等】
	・入浴時の経路探索挙動を修正
	・特定のポートレイトリソースを修正
	・衣装ドロアのいくつかの不具合を修正
	・スケベモブ以外の来客が身体を要求する挙動を修正
	・いくつかの不具合、軽微な修正を実施

# V0.281
【キャラクター・口上】
	・いただきものの衣装を追加
		・麗姫、隷姫シリーズ、チェーンブラ他
【ポートレイト】
	・いただきもののポートレイトパーツを追加
		・目隠れ、ブラウス
	・いくつかの髪、衣装、パーツを追加
	・色変更プリセットに[ミキサー]を試験実装
		⇒画像編集ソフトのチャンネルミキサーのようなものです
		　うまく使うと特定の色相だけ変更できます
【クエスト】
	・「深森の忘都」を追加
		・リナシメントの到達スコアが一定値で出現
		　※本アップデート後にリナシメントを再度攻略する必要があります
	・パッシブスキルやアクティブスキルをもつレリックが登場するように
【コマンド】
	・「膝枕する」を追加
【その他】
	・季節の概念を追加
		・8期毎に季節が切り替わるように
【不具合・軽微な修正等】
	・いくつかの不具合、誤記、バランス調整、軽微な修正を実施

# V0.280
【キャラクター・口上】
	・衣装ドロアの追加
		・[能力] ⇒ [衣装]メニューを拡張。拠点に在庫のある衣装を各キャラクターのドロアに割当することが可能に
		・ドロアに割当した衣装から状況に応じた衣装プリセットを設定することができます
		・衣装プリセットが設定されている場合状況に応じて自動的に衣装を適用します。今は以下が有効です
			・[通常]　…　基本の衣装。常に有効化される衣装プリセット
			・[夜着]　…　領内活動の夜の時間帯に適用
			・[ｸｴｽﾄ]　…　クエスト実施時に適用
	・衣装プリセットに応じてポートレイトの服装や帽子、アクセサリを設定可能に
	・エルの口上を加筆
【設備・アイテム】
	・いただきもののパッチ「eraFL_v0.273用ピアスタトゥーパッチ」を適用
		・追加アイテム「パシパエの小箱」「キルケの小箱」
	・ギルドの得点引換にレリックを追加
	・「触手の槽」で採集が可能に
【クエスト】
	・いただきもののクエストパッチ「炭鉱街イコン」を適用
【コマンド】
	・「着替え」を追加
		・衣装プリセットが指定されている場合着替えさせることが可能に
	・「勉強する」を追加
		・机、書架など用途タグ；勉強を持つ設備で知識の訓練が可能に
			・<教導>素質(現在はエルのユニーク素質)を持っているキャラが対象に含まれている場合、獲得経験値に補正がかかるように
	・リアクションコマンドの実行条件を追加・修正
	・<開発者向け>口上側から次に実行されるリアクションコマンドを直接指定可能に
 【その他】
	・Emuera実行環境をEmuera1824+v18+EMv17+EEv41に更新
		⇒webp脆弱性対応のためlibwebp.dllを更新、依存ライブラリlibsharpyuv.dllを新たに同梱
	・リアクションコマンド実行時の主導度の変化量を下方修正
	・コマンド実行時の主導権奪取発生確率を下方修正
 【不具合・軽微な修正等】
	・設置した設備の情報が一部不正になる不具合を修正
		⇒「採集」スケジュールでの採集先が正しく機能しない場合は設備を一度撤去して再度配置してみてください
	・「eraFL_v0.273_patch_fix1」までの不具合修正を取り込み
	・その他いくつかの不具合、軽微な修正を実施

# V0.273
 【設備】
	・追加設備：「ラージソファ」「鶏小屋」「厩」「豚小屋」「牛舎」「ワーグの檻」
	　⇒「厩」「豚小屋」「ワーグの檻」はコマンド「押し倒す」「奉仕を要求」で特殊なモブが調教に加わるように
	・採集における獲得経験値の変更：「薬草群生地」では知識、家畜系設備では観察の経験値を得るように
 【アイテム】
	・追加アイテム：「動物の卵」「動物性油」「鳥の羽」「動物の糞」
	・いくつかのアイテムのクラフト素材を変更
 【その他】
	・衣装画面での武器変更機能を削除
 【不具合・軽微な修正等】
	・「eraFL_v0.272_patch_fix2」までの不具合修正を取り込み
	・いくつかの不具合、軽微な修正を実施

# V0.272
 【キャラクター・口上】
	・戦闘の攻撃時にキャラクターのポートレイトが表示されるように
	・エルの口上を追加（横取りフェラなどエルが割込コマンドを実行した際の口上等々）
 【コマンド】
	・「休憩」の実行条件を変更。クエストであなた以外のキャラクターが一人の場合でもベンチなどで休憩コマンドが実行できるように
 【設備・アイテム】
	・新たな装備カテゴリとしてレリックを追加
	・「交易都市フォルメン」の露店にいくつかの装備・レリックを追加
	・アイテム「製材」のアイテム名を「建築資材」に変更
	・エリア「運動室」のエリア名を「訓練場」に変更
	・設備「修練場」を追加
 【その他】
	・キャラ情報に[ｽﾃｰﾀｽ]画面を追加。戦闘系ステータスやスキル、装備の状況が1画面で把握出来るように
 【不具合・軽微な修正等】
	・「eraFL_v0.271_patch_fix1」までの不具合修正を取り込み
	・いくつかの不具合、軽微な修正を実施
	・Emuera実行環境をEmuera1824+v18+EMv17+EEv39fixに更新

# V0.271
 【キャラクター・口上】
	・同梱ツールとして「eraFL口上エディタ」を追加。詳細は「readme_eraFL_口上エディタについて」参照
	・汎用口上「生意気」を追加
	・「魔術師」素質は子供に遺伝する可能性があるように
	・「人材を探す」で職業：「魔術師」を指定した場合、「魔術師」素質持ちキャラを割高で雇用できるように
 【スキル】
	・性技スキル「経口摂取」を追加
	・冒険スキルのスキルポイント拡張限界が陥落深度に応じて上昇するように
 【不具合・軽微な修正等】
	・「eraFL_v0.270_patch_fix4」までの不具合修正を取り込み
	・クエストのいくつかの不具合を修正
	・ゲーム開始時、あなたのスキル画面を開くと意図しない挙動が生じる不具合の修正

# V0.270
 ・交流
	・法務メニューの[領内活動]画面にて交流に参加させないキャラを選択できるように
	・NPC専用コマンドとして「服を脱がす」を追加
	・情事中などにNPCが能動的に服を脱いだり脱がせたりしてくるように
	・敗北調教中などにNPCがより積極的に服を破るように
	・特定のコマンドに対するリアクションを追加・修正
 ・クエスト
	・「アリーナ」を追加、「平原の探索」攻略後受注可能に
	・特定のエネミーが特殊な行動をしてくるように
 ・設備・アイテム
	・設備：「ラージベッド」「王侯のベッド」を追加
	・アイテム：「製材」「縄」「ローション」「工作技能書」を追加
 ・スキル・戦闘
	・パッシブスキル：「ミスディレクション」「戦術詠唱」「キャストオフ」を追加
	・アクティブスキル：「マナストーム」を追加
	・スキル習得、確認時の戦闘系スキルの説明を見直し。より効果を明瞭に
	・スキルのレベルアップ時の変化をより明瞭に
	・胸または秘部が露出している場合デバフ・バフを受けるように
	・戦闘決着時にスキルクールタイムが減少するように
 ・不具合・軽微な修正等
	・その他いくつかの不具合、修正、加筆、バランス調整等

# v0.263
 ・取り込ませていただいたパッチ
	・eraFLテキスト案+衣装.7z
		・交易都市フォルメンのスラムの会話イベント
		・衣装「踊り子」シリーズ
	・eraFL_v0.262用男の娘触手パッチ.7z
		・オート実行時の触手の挙動修正
		・触手による体質改造要素
		・男の娘の女性扱い(女性扱いがデフォルトです。男性扱いしたい場合は[設定]->[特殊な性癖に関する設定]より変更して下さい)
	・eraFL_v0.262用ふたなりゲストと男の娘パッチ.7z
		・ゲストモブ女性に一定確率でふたなりが生成されるように([設定]->[領内活動に関する設定]で変更可)
 ・交流
	・情事が他キャラに発覚した際、緊密な仲で欲望の高いキャラは乱入してくるように
 ・アイテム
	・「調合技能書」、「高効率魔導触媒」、「サルマキス薬」、「アンスロープ薬」、「母乳促進剤」を追加,
	・素質<調合>を持つキャラクターがクラフトに参加している場合、体質を変化させる薬剤の調合が可能に
	・ギルドの名誉店引換メニューに「調合技能書」を追加
	・「火薬」がクラフトできない不具合を修正
	・クラフト実行時に設備に応じて対応する経験値が獲得できるように
 ・その他
	・Emuera実行環境をEmuera1824+v18+EMv17+EEv38に更新
		・実行時に.NET 7フレームワークが必要です。実行時に警告メッセージが出た場合はメッセージに従ってＭＳから取得してください
		・WMPLIBに依存しなくなったので、実行にWindows Media Playerは不要になりました
		・本体実行時のパフォーマンスがやや向上するかもしれません
 ・不具合・軽微な修正等
	・その他いくつかの不具合、修正、加筆、バランス調整等

# v0.262
 ・交流・クエスト
	・いただきもののパッチを修正して適用。いくつかのクエストの生成モブはパーティメンバの最も高い「誘蛾の色香」スキルLVに応じた能力で生成されるように
	・かたまりミルクの2回目以降の挑戦時に選択肢を追加
	・編成プリセットの追加、４つまでのパーティ編成を保持できるように
	・コマンド「踊る」は一人でも実行可能に。露出に応じて露出経験が加算されるように
 ・スキル
	・生活スキルに「マイスタージンガー」、「エトワール」を追加
	・性技スキル「精飲発情体質」の発動確率を上方修正
 ・不具合・軽微な修正等
	・特定条件でグラフィックが正しく参照されない不具合を修正
	・その他いくつかの不具合、修正、加筆、バランス調整等

# v0.261
 ・キャラクター・口上
	・リュミエールの口上を加筆
 ・交流・クエスト
	・コマンド「踊る」を追加
	・「交易都市フォルメン」いただきもののパッチから教会の会話イベントを取込
	・スラムに公演系イベントを追加
 ・設備
	・「露天風呂」は<緑地>タグを持つエリアにも設置できるように
 ・ポートレイト
	・パーツ「頭部位」のカテゴリを追加、ケモミミはこのカテゴリでも設定可能に
 ・コンフィグ
	・ウィンドウサイズとフォントの既定値を変更
	・公演のゲストの男女比率を設定できるように
 ・不具合・軽微な修正等
	・いくつかの不具合、修正、加筆、バランス調整等

# v0.260
 ・キャラクター
	・ユニークキャラクター「ソーニャ」を追加
		→交易都市フォルメンの踊る子鹿亭で一定の名誉点と引換に仲間に
	・成長型「魔術」を追加
 ・交流
	・コマンド「入浴する」を追加
	・コマンド「休憩する」は浴槽を持つ設備では一日に一度だけ効果量が増大するように
	・スケジュール「売春」を追加
	・設備「娼館受付」使用時ゲストが来店し買春を試みるように
		「娼館受付」の他、娼館に適切な設備が配置されている必要があります　※現在は「娼館個室」、「グローリーホール」が対応
	・設備「娼婦のベッド」を「娼館個室」に変更
	・イベント「覗き見」を追加
		NPC同士が設備で特定の行動をしている場合、その設備を使用した際に覗き見イベントが発生するように
 ・衣装
	・いただきものの衣装「アシンメトリーレギンス」、「クロップトップ」を追加
 ・コンフィグ
	・娼館ゲストの男女比率を設定できるように
 ・不具合・軽微な修正等
	・いくつかの不具合、修正、加筆、バランス調整を実施

# v0.250
 ・クエスト
	・「無限背塔・低層域」を追加
 ・口上
	・いただきものの汎用口上「生真面目」追記分を取込
	・いただきもののエル口上デイリー「世界を学ぶ」を取込
 ・武器、スキル
	・武器のパッシブスキル、アクティブスキルをいくつか実装
		・「無限背塔・低層域」でドロップする武器はパッシブスキル、アクティブスキルが付与されている場合があります
		・スキルはレベルに応じて効果量が増減します
		・効果はアイテムメニューの武器スキル欄でスキル名にマウスカーソルを当てることで確認可能です
		・武器のパッシブスキルはキャラクタースキルに比べてクールタイムが長いですが、戦闘開始時にクールタイムがリセットされます
	・「夕暮港」の戦利品武器にアクティブスキルを追加
	・「レイピア」、「マスケット」を追加
 ・アイテム
	・「火薬」を追加
 ・不具合・軽微な修正等
	・いくつかの不具合、軽微な修正を実施

# v0.245
 ・クエスト
	・いただきもののクエスト「夕暮港」を取込
 ・口上
	・いただきもののリュミエール口上デイリー「メイドの嗜み」を取込
		口上外でも口上色を参照して出力できるPRINT関数を実装したので部分的に加筆、改変させていただきました
	・xml口上フォーマットをイベント口上に対応
		試験的にリュミエールの同行、押し倒し時の口上を少しだけ加筆
 ・交流
	・特定の条件を満たす場合、キャラクターが能動的に押し倒しを試みてくるように
		二人きりであること、極度に欲情値が高いこと、恋慕以上の関係であることなど等々の条件をみたす場合一定確率で押し倒しを試みてくるように
 ・スキル
	・「スケープゴート」、「女中的殴打」を追加
 ・不具合・軽微な修正等
	・ランダムキャラの職業に関連する設定値の不足によるクラッシュを修正
	・いくつかのクエストの不具合を修正
	・ユニークキャラクターの職業素質を設定
	・その他軽微な修正加筆等々

# v0.244
 ・口上
	・汎用娘口上「良家の娘」追加
		→男あなた前提の汎用娘口上
 ・武器
	・スキル枠を追加
		→スキル付武器を実装できるように
 ・不具合
	・特定の操作で衣装が消滅する不具合の修正
	・演奏中のモブ観客生成はコンフィグの値を参照するように(暫定で買物客の設定値を参照)
	・「淫堕の宝玉」使用後に「技巧の宝玉」が正常に機能しない不具合を修正
	・その他幾つかの不具合、軽微な修正・調整

# v0.243
 ・クエスト
	・「泥棒猫を捕まえて！」
			・いただいた修正パッチを取り込み
	・「交易都市フォルメン」
		・広場で演台を使用してる場合、[演奏]コマンドでパフォーマンスが可能に
		・スラムに商店を追加
 ・衣装
	・[全着]/[全脱]ボタンから一括着衣、一括脱衣をできるように
 ・エリア・設備
	・以下を追加。「蠢く洞窟」攻略後クラフト可能に
		・エリア:[肉腫の檻]
		・設備:[触手の槽]
 ・アイテム
	・ギルドメニューの[名誉点引換]を[得点の引換]にリネーム淫堕点の引き換えが可能に
	・アイテム「淫堕の宝玉」を追加
 ・地の文
	・「愛撫」などのコマンド実行時の着衣に関する描写を中心に加筆
 ・その他
	・ソース処理の一部見直しと調整
	・触手出産から副産物を得るように
 ・バグ修正
	・あなたのポートレイトが変更できな不具合を修正
	・その他バグ修正、バランス調整等

# v0.242
 ・クエスト
	・いただきもののクエストを追加。以下は取り込み時に修正・追加させていただいた点
		・「アマゾネスの呼び出し」
			・メスガキちゃんは固定のポートレイトを持ったゲストNPCとして生成されるように
			・簡易口上を追加
			・ゴブリン敗北時のイベントが未実装だったため追加
		・「泥棒猫を捕まえて！」
			・ネコちゃんに猫耳パーツが固定でつくように
	・「交易都市フォルメン」を仮実装
		・交流系コマンドが実行可能なマップとして追加
 ・衣装
	・「サテン生地の手袋」を追加
	・一部の衣装にタグを追加。特定の衣装を装備して特定のコマンドを実行した際対応する地の文を出力するように
 ・交流
	・「採掘」「採集」などのスケジュール割当行動の完遂時に実行キャラに行動に準じた経験値が入るように
 ・地の文の加筆
	・コマンド実行時の地の文をいくらか加筆
 ・バグ修正
	・武器の強化上限が機能していないバグを修正
	・その他バグ修正、バランス調整等

# v0.241
 ・クエスト
	・いただきもののクエストを「娼婦の競り市」として追加
		→ 私の嗜好で改題だけさせていただきました
 ・素質、スキル
	・淫乱系素質「精飲中毒」を追加
	・いくつかの性技スキルを追加
 ・交流
	・エリア効果、設備効果の実装
		→配置された設備やキャラクターの行動によって発生し、効果によってその場所でのコマンド実行結果や行動に補正が発生します
	・「観葉植物」、「茶器」他少量のインテリアを試験実装
 ・コマンド
	・「演奏する」を追加
	・「胸愛撫」を「胸愛撫」と「乳首責め」に分離
 ・地の文の加筆
	・設備やエリア、状況に応じた地の文をいくらか加筆
 ・バグ修正
	・武器の強化ステータスがロード時に初期化されてしまう不具合を修正
	・その他バグ修正バランス調整等

# v0.240
 ・クエスト
	・クエスト「淫魔の小迷宮」を追加
		→ クエスト「野盗討伐」 攻略後に挑戦可能に
	・いただきもののクエスト「アマゾネス成人の儀式」を追加
		→ 一先ずそのままの形で取り込ませていただきました
 ・ポートレイト
	・衣服・装飾類に幾つかのパーツを追加
 ・クラフト
	・設備[金床]から[武器の強化]を選ぶことで、武器の基本性能の強化が可能に
 ・交流
	・[商談]実行時、好色な客が一定の確率で特定の奉仕を要求してくるように
		→ 要求に応じた場合通常より好条件での購買が発生
 ・コマンド
	・{嗜虐}カテゴリに[服を破る]を追加
 ・ＵＩ
	・縦の表示幅を圧縮するため、幾つかの項目、ボタンを整理
 ・バグ修正・バランス調整等
	・[領地の手入れ]で不正な情報がセーブされる不具合を修正
		→ 客室が撤去出来ないなどの不具合が生じている場合、一度編集画面から保存し再編集することで解消されるはずです
	・カスタムキャラ作成時にプレイヤーの登録情報が不正になる不具合を修正
	・その他幾つかの不具合・軽微な調整を実施

# v0.230
 ・クエスト
	・クエスト「野盗討伐」を追加
		→「ゴブリンの洞窟」クリアで解放　※v0.230で一度ゴブリンの洞窟をクリアする必要有り
	・グラフィカルなマップ形式(GMAP)をサポートするように
 ・ポートレイト
	・ユニークキャラのポートレイト作成支援機能として<その他>に[キャラクターCSV用にパーツ情報を出力]を追加
		→ポートレイトパーツ・色情報をCSTRとしてsavフォルダに出力。内容をキャラCSVにコピペするとポートレイトとして適用可能に
 ・簡易マップエディタ
	・デバッグモードでemueraを起動した場合[DEBUG]->[マップエディタ]からクエスト用マップを編集可能に
 ・バグ修正
	・カスタムキャラ作成時に不正落ちする不具合を修正
	・特定条件で設備の施錠が解除されない不具合を修正
	・交流パート中は客室が撤去できないように

# v0.223
 ・バランス調整
	・ユニークキャラを選択してのニューゲーム時に「求人書類」を１つ所持してゲームを開始するように
 ・UI
	・交流パートで[MAP]ボタン左の[-]ボタンからマップや設備、ログウィンドウを開閉できるように
	・その他軽微な修正
 ・バグ修正
	・カスタムキャラエディット時に[情報]画面から服装を任意に選択できるように
	・戦闘処理時の不具合修正
	・キャラ削除時の不具合修正
	・クエスト「蠢く洞窟」で触手にやる気がない重篤な不具合の修正
 ・その他
	・ERBのフォルダ構成を見直し
	・いただいたパッチ取込に関してreadmeに追記
 ・既知の不具合
	・クエスト中の調教中にプレイヤーが行動不能になった場合、意図しない形でクエストが中断するケースがある

# v0.222
 ・クエスト
	・クエスト「薬草摘み」パッチを取込
 ・バグ修正
	・特定条件で戦闘が進行しなくなる不具合を修正
	・意図しないモブに女性ポートレイトが適用されるバグの修正
 ・その他
	・軽微な修正、UI改善等
	・いただいたパッチに関するライセンスの取り扱いをreadmeに追記

# v0.221
 ・ポートレイト
	・目、前髪、装飾のパーツを追加
	・カスタムキャラ編集で登録したポートレイト情報を読込むパッチを取込
		→[外見・口上設定]から呼び出し可能に
 ・戦闘
	・いくつかのスキルを追加
	・戦闘処理の全般的な見直し、バフ・デバフステータスの可視化など
 ・バグ修正等

# v0.220
 ・ポートレイト
	・[外見設定]からカスタムキャラの衣服、帽子、装飾が設定可能に。いくつかのパーツを追加
	・後髪のパーツを追加
 ・クエスト
	・以下を追加
		・「かたまりミルク」…性技スキル「誘蛾の色香」LV1以上を持っている仲間が存在する場合受注可能
		・「リナシメント」…「平原の探索」攻略後受注可能
 ・戦闘
	・操作性の改善
		・スキル発動を右クリックで受け付けるように
	・パラメータ「魔術」のダメージ計算が正常に行われていなかったため修正
 ・バグ修正等

# v0.214
 ・アイテムメニュー
	・タブ[武器]を有効化。所持状況や装備者の変更を一覧から実施できるように
 ・ポートレイト
	・一部のモブキャラ(買い物客、ゴブリンなど)はシルエットを表示するように
 ・いくつかの重篤なバグを修正

# v0.213
 ・口上
	・口上テンプレートのドキュメントを整理
		eraFL用口上XMLテンプレート記述サンプル
		https://docs.google.com/spreadsheets/d/1PeRfw8VfhQqUDLYAuE5BY1XNFvcx4Oii2V8OahN6uYI/edit?usp=sharing
	・XML口上の簡易的な構文確認機能を追加
		詳細は上記サンプルのデバッグ項を参照
	・リュミエールの口上を新フォーマットに対応、少量加筆
 ・ポートレイト
	・ポートレイトの性別による設定制限を廃止
	・.webpまたは.pngの画像ファイルをポートレイトとして設定できるように
		以下のフォルダに格納した画像ファイルをゲーム内でファイル名を指定することでポートレイトとして使用できます(正方形のみ対応)
		resources\portrait\prt_FIX
 ・タイトル画面
	[カスタムキャラ]作成機能の修正、有効化
	[最初から]押下時の操作性の口上
 ・バグ修正等

# v0.212
 ・コマンド「奉仕」を追加
	・キャラクターに対して奉仕する/要求することができるように
		→選択肢に応じたシチュのコマンドを数ターンの間自動的に実行する/させるように
		グローリーホールのような特定の用途用の設備で実行した場合は相応のコマンドを実行
	・新たな実装エリア：娼館
	・新たな実装設備：懺悔室、グローリーホール、娼婦のベッド
	・スケジュール：炊事の仮実装
		→炊事担当が存在する場合昼食時(12:00前後)と夕食時(18:00前後)の食事コマンド実行時の回復効果が上昇
		料理の質は炊事担当者の料理スキルに依存
	・十分に緊密な仲でない同行者は特定の設備への同行を拒否するように
	・Googleスプレッドシート + Export Sheet Data アドオンで出力した口上xmlを読み込めるように
	・バグ修正等

# v0.211
 ・コマンド実行時のプレイヤー/ターゲットをポートレートを右クリックすることで切り替えられるように
	 ・左クリック　…　同行に誘う(現行通り)
	 ・右クリック　…　対象キャラにターゲットを切替
	 ・Shift + 右クリック　…　対象キャラをターゲットに追加
	 ・Ctrl + 右クリック　…　対象キャラにプレイヤーを切替
	 ・Ctrl + Shift + 右クリック　…　対象キャラをプレイヤーに追加
 ・狩猟、伐採、採種コマンドを採集コマンドに統合
 ・採集/採掘コマンドの収穫量は参照ステータスに比例して増加するように
 ・採集/採掘実行時に参照ステータスに対して微量の経験値が入るように
 ・新たな実装エリア：農園
 ・新たな実装設備：キッチン,畑
 ・いくつかのアイテムを実装
 ・バグ修正、その他もろもろの微修正

# v0.21
 ・スケジュール機能の改修
	 採掘や採集で優先的に作業する設備を設定できるように
	 スケジュール管理機能は交流パートの[SCHEDULE]配下に集約。ホームメニューのスケジュール管理ボタンは廃止
 ・名誉点引換機能実装
	 クエスト選択画面より名誉点の引換ができるように
	 　⇒現時点ではスキルポイント追加、仲間の勧誘の必要なアイテムと交換が可能
 ・クエスト追加、修正
 ・武器、アイテムの追加
 ・アイテムメニューの実装
	 薬草やポーションなど特定のアイテムを任意のタイミングで使用できるように
 ・バランス調整・バグ修正など
	 全体的なステータス成長速度の鈍化(Kベースでは早すぎるため)

# v0.202
 ・バグ修正など
# v0.201
 ・コマンド「じっと見る」、「服を脱ぐ(※リアクション専用コマンド)」
 ・バグ修正など

# v0.200
 ・選択可能な汎用口上を追加
　　「汎用_クール」、「汎用_快活な少女」、「汎用_生真面目」
 ・キャラメイク時に汎用口上を設定可能に
 ・既存の汎用キャラのポートレイト、口上をメニュー画面の[能力表示] -> [外見・口上設定]から変更可能に
 ・NPCの自発的な行動として割込コマンド実行(Interruption)を追加。しばらくお預けされて焦れたキャラが自発的に絡んでくるように
 ・スケベなゲストがスキル<誘蛾の色香>を持つ仲間におさわりを仕掛けるように
 ・バグ修正、既存口上の加筆等々

# v0.190
 ・戦闘時にプレイヤーの任意のタイミングで発動可能なアクティブスキルの追加
 ・クエスト：墳墓の小迷宮を追加
 ・「なすがまま」実行時のモブの挙動を微調整
 ・バグ修正、微細な修正等

# v0.181
 ・バグ修正(体重算出時の不正値、[人材を探す]のフィルター条件が正しく初期化されない、カスタムキャラ画面のページ送りの不具合)
 ・リュミエールの口上を新フォーマットに置き換え
 ・デバッグモード時に交流・調教画面の[DEBUG]ボタンから口上XMLファイルを随時リロードできるように

# v0.180
・口上システムを拡張、指定のExcelフォーマットから出力した口上XMLファイルを口上として読み込めるように
   (現在はコマンド口上のみ、イベント口上は未対応)
・アイテム、武器のクラフト画面を刷新
・設備[織機]を追加、衣服を作成できるように
・その他バグ修正、微細な加筆等

# v0.171
 ・バグ修正(尿道関連、服を脱がすとあなたの股間が参照される重篤な不具合の修正)
 ・画像サイズに非表示(NONE)を選択できるように、コマンド欄を３列で表示するように。あわせてウィンドウ幅初期値を1100 -> 1200に修正
	   ⇒※既存のemuera.configを使用する場合は値を1100 -> 1200に修正してください
 ・スケベなゲストの生成率、男女比をコンフィグで変更可能に [設定] -> [領内活動に関する設定]
 ・PALAMLVテーブル修正、取得好感度を若干下方修正
    ⇒低レベル帯での要求SOURCE増大、高レベル帯での要求SOURCE低下
 ・リアクション処理の修正、あなたにハグを要求する、のよう命令してＸＸさせる形でのコマンドを処理できるように
 ・口上、地の文の加筆、その他微修正等

# v0.170
 ・スキルカテゴリ<性技>及びスキル3種を追加
 ・露店の販売システムを刷新。生成されるゲストNPCがそれぞれの購買意欲と予算に応じて商品を購入するように
 ・買物中の商品に対するコマンド[会話]は[商談]として機能し、成否に応じてNPCの購買意欲を引き上げるように
 ・あなたが特定のスキルを持っている場合、[商談]実行時に一部のNPCからを受けるように
 ・いくつかのコマンドの実行可能条件を修正
 ・ゲームロード時のポートレイト表示の不具合を修正

# v0.160
 ・カスタムキャラ作成時に瞳の色を変更可能に
 ・あなたの性別が女性の場合、キャラメイク時に表示の有無[表示する]でポートレイト表示が可能に
 ・あなたの作成時衣装を4種類の初期衣装プリセットから選択するように
 ・性別：男の娘の場合もポートレイトを生成するように
 ・リアクションコマンド実行時にコマンド固有の実行判定が行われていなかったため修正
 ・一部コマンドの実行判定を修正

# v0.151
 ・ポートレイト関連の不具合の修正

# v0.15
 ・クエスト：隊商護衛を追加
 ・パーティ編成からあなたを除外できるように
 ・広場での[運動する]や森林での[狩猟]、[採集]等のコマンドを実行した際、関連しそうなステータスの経験値が微量に得られるように
 ・リアクション実行時に一部のコマンドは確定で継続状態で実行されるように
 ・バグ修正、地の文加筆、バランス調整等々

# v0.14
 ・クエスト受注画面を追加、パーティ編成を可能に
 ・ポートレイト表示欄上部のボタンから画像サイズを変更可能に
 ・子ども生成時にもポートレイトを生成するように
 ・スキルシステムの追加。現在は戦闘系スキル4種のみ
 ・戦闘におけるスキル処理の追加
 ・コマンド[抱きしめる]を追加
 ・バグ修正等、地の文・口上の加筆等々

# v0.13
 ・ランダムキャラの顔グラ編集機能を追加（女性のみ）
 ・クエスト：平原の探索を追加
 ・戦闘時の標的選定処理の修正。設定された脅威選定により忠実に攻撃対象をとるように
 ・バグ修正等

# v0.12
 ・画像表示への一部対応
 ・顔グラを追加(エル、リュミエール)
 ・固有キャラクター、リュミエールを追加
 　　クエスト：女中リュミエールより仲間に勧誘することができます。口上、クエスト周りは現状動作確認レベルです
 ・バグ修正、UI微調整、その他微細な修正、加筆等々

# v0.11
 ・商店経営的な要素の基礎を実装。採集、クラフトしたアイテムをNPCが設備を通して販売できるように
 ・NPC間の関係性構築の基礎を実装。現在はＸＸとＹＹは一緒に食事をしている…などのフレーバーを出力するのみ
 ・NPCの自発的なコマンド実行(リアクション)の基礎を実装。条件をみたす場合プレイヤーの特定のコマンドに対して自発的にコマンドを実行して応じるように
 ・領内活動の交流中も[SCHEDULE]タブから各NPCに割り当てる作業を動的に変更できるように
 ・[人材を探す]コマンドでのNPC雇用時に外見的特徴も編集できるように
 ・文字サイズの既定値を縮小
 ・その他色々

# v0.10
初版


code:
;-------------------------------------------------
; ゲームの攻略、仕様に関するFAQ
; ゲーム内ヘルプで扱いきれていない情報は暫定でこちらに記載しています
; v0.320時点の情報です
;-------------------------------------------------

;-------------------------------------------------
; 領内活動・クエスト
;-------------------------------------------------
◇クエスト中撤退できなくなった！
撤退コマンドは0番の地点でコマンドのタブをクエストにしてみてください
それでも表示されない場合は[対象リセット]ボタンを押してみて下さい

◇クラフトについて
素質<技師>は作業台で、素質<調合>は錬金台でそれぞれクラフト可能なアイテムが増えます
クラフト時に同行してる仲間がこのスキルを持っている場合も効果を発揮します
これらの素質はギルドの[得点の利用]の交換アイテムから習得が可能です

◇建築資材の入手方法について
建築資材は<技師>素質持ちが作業台でクラフトを担当すると制作可能です
<技師>を習得するための「工作技能書」はギルドの得点の利用から交換可能です
割高ですが領地にやってくるNPCから買える場合もあります

◇露店の良い物が売れない！
お買い物に来るモブたちはそれぞれ買い物用の予算枠を持っていてそこから買える範囲の品物を買っています
村人のようなモブは数千ディナリ、行商人のようなモブは万単位のディナリを保持しています
領内活動での購買を繰り返すと、「商業活動の評判」が上昇し来店客の質が向上します

◇銀、金鉱石と石炭の入手方法が分からない
石炭・硫黄はクエストの攻略でアンロックされる設備、天然鉱から採掘できます
銀、金鉱石は採掘は出来ません。クエスト報酬やイベント、モブから購入する等々の手段で入手できます

◇もっと沢山のスキルを獲得したい
ギルドの「得点の利用」を覗いてみましょう
名誉点や淫堕点と引き換えにスキルポイントや上限を増大させるアイテムと引き換えることが出来ます
また、主人公はより多くの仲間と強固な関係を結ぶことでもスキルポイントの上限を伸ばすことも可能です

◇歌や踊りの評価について
公演の評価は実行者と共演者のステータスの合算により算出されます
（共演者は複数指定出来る分、実行者に比べていくらか割引して評価されます）
演奏の場合は歌唱と器用、踊りの場合は歌唱と身体の値で評価されます

現時点では大体歌唱50～70くらいのメンバーが2～3人入れば概ね成功するようなバランスです
場末の酒場の舞台のような、真っ当なパフォーマンスが評価されにくい環境では評価値に下方修正がかかり成功率が下がります
ただし観衆の要求に答えてあげれば成功しやすくなるかもしれません

◇脱げない！脱ぎたい！脱がせたい！
男性であれ女性であれ脱衣に人目を気にするのは仕様です
<露出狂>であっても衛兵にしょっぴかれて縛り首になるリスクを犯してまで脱ごうとは思わない程度の良識はあるようです
ただし、物陰や密室など、人気のつかない場所に連れ込めばその限りではありません

◇カスタムキャラが全裸だ……
カスタムキャラエディット時に[情報]画面から服装を任意に選択できます
忘れずに設定してあげてくださいね。

;-------------------------------------------------
; 戦闘・スキル
;-------------------------------------------------
◇戦闘に関するパラメーターについて
攻撃力　…　ダメージ決定に使用。キャラの戦闘を基準値として、装備の攻撃とあわせて算出。
魔力　　…　ダメージ点の上乗せ、防御時の魔力追加ダメージの相殺に使用。キャラの魔術(知識)を基準値として装備の魔力とあわせて算出(※1)
防御力　…　被ダメージの割合軽減に使用。装備の防御から算出。(※2)
軽減値　…　被ダメージの実数軽減に使用。装備の軽減から算出。(※2)
行動力　…　戦闘時の行動順決定に使用。キャラの身体を基準値として、装備の行動とあわせて算出
敵視　　…　ターゲット決定時の狙われやすさに影響。装備の敵視から算出
脅威選定　…　通常攻撃や標的の指定が無いスキルのターゲット決定基準に影響

※1、<魔術師>素質がない場合、魔力算出時にペナルティを受けます。知識の値で一定の軽減ができます
※2、<魔術師>素質がある場合、防御力、軽減値にペナルティを受けます。

◇トークンについて
トークンはバフやデバフ、状態異常を示すパラメーターの総称です。スキルなどによって付与されます
以下のようなものがあります。
【スタックし消費により減少するトークン】
詠唱　　…　詠唱系スキルの発動時に使用
歌唱　　…　歌唱系スキルの発動時に使用
発情　　　…　現在は特に効果なし

【行動により減少するトークン】
毒　　　…　行動毎に一定数の固定ダメージを受けます。
スタン　…　確定で行動に失敗
ガード　…　被ダメージが50%減少
脆弱　　…　被ダメージが25%上昇
強靭　　…　与ダメージが25%上昇
脱力　　…　与ダメージが25%減少
デコイ　…　被ダメージを無効化。無効化時にトークン消失
挑発　　…　攻撃の対象に取られやすくなる
追撃　　…　通常攻撃回数を1追加

【その他キャラクターの状態で付与される永続的なトークン】
胸露出　　…　被ダメージが10%上昇
秘部露出　…　被ダメージが25%上昇

◇スキル「誘蛾の色香」
基本的にはこのスキルがプレイヤー以外の他人からいやらしいことされ得るマーカーとして機能しています
「誘蛾の色香」スキルは蛾を引き寄せるターゲットマーカーとして機能するので、うちの子はあなた以外お触り厳禁だよ！という場合は獲得しないほうがよいです
スケベな客を増やしたい/減らしたい場合は[設定]->[領内活動に関する設定]->[好色なゲストの登場確率]の値を調整してみてください

◇スキル母乳量増強について
現状では搾乳機で搾乳したときの効果に作用しています
具体的にはアイテムの乳の収穫量がちょっと増えます
また魔力供乳の効果量にも上方補正がかかります

;-------------------------------------------------
; 特殊な操作
;-------------------------------------------------
◇ポートレイトをマウスクリックする際、キーボードと併用することで柔軟に実行／対象を切り替えられます
・左クリック　…　同行に誘う
・右クリック　…　対象キャラにターゲットを切替
・Shift + 右クリック　…　対象キャラをターゲットに追加
・Ctrl + 右クリック　…　対象キャラにプレイヤーを切替
・Ctrl + Shift + 右クリック　…　対象キャラをプレイヤーに追加

◆過去スレ
eraFL開発スレ - era板＋ - したらば掲示板
https://jbbs.shitaraba.net/bbs/read_archive.cgi/otaku/16783/1657102959/

eraFL開発スレ2 - era板＋ - したらば掲示板
https://jbbs.shitaraba.net/bbs/read_archive.cgi/otaku/16783/1687584404/

eraFL開発スレ3 - era板＋ - したらば掲示板
https://jbbs.shitaraba.net/bbs/read.cgi/otaku/16783/1702993997/

eraFL開発スレ4 - era板＋ - したらば掲示板
https://jbbs.shitaraba.net/bbs/read.cgi/otaku/16783/1712326640/


code:
;-------------------------------------------------
よくあるご質問など
;-------------------------------------------------
;-------------------------------------------------
;【eraFLに起因するバグについて】
;-------------------------------------------------
Q.エラーが発生し、ゲームが強制終了しました。おかしな動作をしました
A.以下の情報をスレまたはreadme記載のDiscordで教えていただけるととても助かります！

不具合かな？と思われる事象に遭遇した方は以下のテンプレートを参考にご報告いただけますと幸いです。

・不具合報告テンプレ
【本体バージョン】ver0.293 など（最新版では修正されている可能性があるため）
【導入パッチ】[パッチ]eraFL_v0.290_fix2／本体のみ
【不具合発生箇所】エラー発生時、エラー発生時の直前にどのような操作を行ったか(なるべく具体的に書いてもらえるととてもとても助かります!)
【不具合内容】エラーログが出力された場合はエラーログを、エラーログが出力されない場合はエラー内容を記入してください
【強制終了】する／しない
【再現性】あり／なし

・コピペ用
【本体バージョン】ver
【導入パッチ】
【不具合発生箇所】
【不具合内容】
【強制終了】
【再現性】

<エラーログの例>この関数と行数の情報がものすごーく大事なので、ここを教えてもらえるとすごーく助かります
HOUSING\EDIT_MODE\HOUSING_EDIT_MODE.ERBの379行目でエラーが発生しました:Emuera1824+v16+EMv17+EEv32
HO_MODULE_STOCK:MODULE_ID ++
エラー内容：配列変数"HO_MODULE_STOCK"の第1引数(1000)は配列の範囲外です
現在の関数：@HO_EDIT_UNDEPLOY_ALL_MODULE（HOUSING\EDIT_MODE\HOUSING_EDIT_MODE.ERBの366行目）
関数呼び出しスタック：
HOUSING\EDIT_MODE\HOUSING_EDIT_MODE.ERBの242行目（関数@HO_EDIT_INPUT内）
HOUSING\EDIT_MODE\HOUSING_EDIT_MODE.ERBの32行目（関数@HOUSING_EDIT_MODE_MAIN内）
SHOP\SHOP_LIFE\SHOP_LIFE14_居住区.ERBの87行目（関数@SHOP_LIFE_EVENTBUY_SUB14内）
SHOP\SHOP_LIFE.ERBの95行目（関数@EVENTBUY_LIFE内）
SHOP\SHOP.ERBの132行目（関数@EVENTBUY内）

;-------------------------------------------------
;【お使いの環境に起因する事象について】
;-------------------------------------------------
※基本的にERB以外問題についてはこちらではわからない可能性が高いです。ごめんね！

Q.起動時にボタンをクリックした際、勝手にウィンドウサイズが変わってしまう。文字が小さくなってしまう
A.DPIスケールの設定に関する問題の可能性があります

このあたりを参考に高DPIスケール設定の上書きをシステム(拡張)あたりに切り替えると改善されるかもしれません
https://novlog.me/win/win10-dpi-high/

Q.画面が縦に長く、見切れる
eraFLの推奨解像度は900px以上です。従って小型ノートＰＣや沢山のキャラクターと一度に交流した際見切れてしまうかもしれません
以下の方法で多少の調整が可能です

・交流パートの画像サイズボタンからポートレイトの表示サイズを縮小してみてください
・交流パートの [-] と表示されているボタンはクリックすることで折りたたみが可能です、必要に応じてたたんでみてください

Q.起動時に以下のようなエラーが出力されました
----
Now Loading...
予期しないエラーが発生しました:Emuera1824+XXXX
System.TypeInitializationException:'MinorShift.Emuera.GameProc.Function.FunctionIdentifier' のタイプ初期化子が例外をスローしました。
場所 MinorShift.Emuera.GameProc.Function.FunctionIdentifier.GetInstructionNameDic()

場所 MinorShift.Emuera.IdentifierDictionary..ctor(VariableData varData)

場所 MinorShift.Emuera.GameProc.Process.Initialize()
初期化中に致命的なエラーが発生したため処理を終了しました
----
A.以下を確認してみてください
・EM-EE版Emueraはメディア再生にWindows Media Playerに付属してるライブラリを一部使用しています(WMPLib)
Windows Media Playerが無い場合はインストールしてみてください
・PCの再起動で改善されるケースがあるようです。
それでもやはり改善されない場合は、WINDOWSにインストールされている.NET Frameworkランタイムの不具合の可能性があります

・PCの再起動
・.NET Framework 4.8の再インストール
・OSの再インストール

Q.webpの読込に失敗しました
A.WINDOWSにインストールされているランタイムの不具合の可能性があります。以下を確認してみてください
Visual C++ 再頒布可能パッケージの再インストール


code:
;-------------------------------------------------
; eraFL 口上エディタについて
;-------------------------------------------------
◆これはなに？
eraFLの口上用xmlファイルをExcelなどのスプレッドシート風に直接編集するための簡易編集ツールです
ExcelやGoogleSpreadSheet(以下GSS)などの外部サービスに頼らず直感的に手っ取り早く口上を弄り回せます。

※【重要】開発途上もいいところなので、使用する場合はこまめに保存することをオススメします。落ちても泣かないでください。

◆制約
一部の汎用口上などExcelで作成された古いフォーマットの口上xmlが正しく読み込みできません。

◆使い方
以下を参照ください
https://docs.google.com/spreadsheets/d/1THU0zlp2WFZzTKuAy5B5ZjhxJaqSWndKpku--18X3V8/edit?gid=572982793#gid=572982793

以下旧バージョンの資料
【参考】GoogleSpreadSheetを使用したFL口上作成メモ
以下を参照ください
往来のERBによる口上作成も可能です。エル口上は往来の方式で作成されています。

eraFL用口上XMLテンプレート記述サンプル
https://docs.google.com/spreadsheets/d/1PeRfw8VfhQqUDLYAuE5BY1XNFvcx4Oii2V8OahN6uYI/edit?usp=sharing

使用例:リュミエール口上
https://docs.google.com/spreadsheets/d/1ku4Yt_i-qnrOVyvd3Aa7GKayNJOKctZw7Ex4NtSnfMM/edit?usp=sharing


code:
import csv
import xml.etree.ElementTree as ET
import xml.dom.minidom
import re

def parse_drop_items(drop_list_str):
    """ドロップアイテムリストを解析して辞書形式で返す"""
    if not drop_list_str or drop_list_str == '""':
        return {}

    # @記号と引用符を削除
    drop_list_str = drop_list_str.strip('@"')
    if drop_list_str.endswith('""'):
        drop_list_str = drop_list_str[:-1]

    items = {}
    parts = drop_list_str.split(',')

    # 3つずつ処理（アイテム名、個数、確率）
    i = 0
    item_count = 1
    while i < len(parts):
        if i + 2 >= len(parts):
            break

        item_name = parts[i].strip()
        item_count_str = parts[i + 1].strip()
        item_rate = parts[i + 2].strip()

        if item_name == "MONEY":
            items["REWARD_MONEY"] = item_count_str
        else:
            # アイテム名から括弧を削除
            item_name = item_name.replace("{", "").replace("}", "")
            items[f"REWARD_ITEM_{item_count}"] = item_name
            items[f"REWARD_ITEM_{item_count}_COUNT"] = item_count_str
            items[f"REWARD_ITEM_{item_count}_RATE"] = item_rate
            item_count += 1

        i += 3

    return items

def convert_csv_to_xml(csv_path, output_path):
    """CSVファイルをXMLに変換する"""
    # XMLのルート要素を作成
    root = ET.Element("data")

    # CSVファイルを読み込む
    with open(csv_path, 'r', encoding='utf-8') as file:
        reader = csv.DictReader(file)

        for row in reader:
            # enemy_data要素を作成
            enemy = ET.SubElement(root, "enemy_data")

            # DROP_ITEM_LISTを解析
            drop_items = parse_drop_items(row.get('DROP_ITEM_LIST', ''))

            # 各属性を設定
            for key, value in row.items():
                if key != 'DROP_ITEM_LIST' and value:  # DROP_ITEM_LIST以外の属性を処理
                    enemy.set(key, value)

            # ドロップアイテム情報を設定
            for key, value in drop_items.items():
                enemy.set(key, value)

    # XMLを整形して保存
    xml_str = ET.tostring(root, encoding='unicode')
    dom = xml.dom.minidom.parseString(xml_str)
    pretty_xml = dom.toprettyxml(indent="  ")

    # XML宣言を追加して保存
    with open(output_path, 'w', encoding='utf-8') as f:
        f.write('<?xml version="1.0" encoding="utf-8"?>\n')
        # 最初の行（XML宣言）を除いて保存
        f.write('\n'.join(pretty_xml.split('\n')[1:]))

if __name__ == "__main__":
    input_csv = "ENEMY_DATACSV.csv"
    output_xml = "enemy_data.xml"
    convert_csv_to_xml(input_csv, output_xml)


code:
import re
import csv
import sys
from collections import OrderedDict

def parse_erb_file(file_content):
    pattern = r'DT_ROW_ADD\s+"ENEMY_DATA"(.*?)\n\}'
    enemy_data_blocks = re.findall(pattern, file_content, re.DOTALL)

    enemies = []
    all_attributes = OrderedDict()

    for block in enemy_data_blocks:
        enemy = OrderedDict()
        # 属性と値のペアを抽出
        pairs = re.findall(r',\s*"(\w+)",\s*(.+?)(?=,\s*"|\Z)', block + ',', re.DOTALL)

        for attr, value in pairs:
            if attr == 'DROP_ITEM_LIST':
                # DROP_ITEM_LISTの特別処理
                value = value.strip().strip('"')
                if not value.endswith(',"'):
                    value += ',"'
            else:
                # その他の属性の一般的な処理
                value = value.strip().strip('"').rstrip(',')

            enemy[attr] = value
            if attr not in all_attributes:
                all_attributes[attr] = None

        enemies.append(enemy)

    return enemies, list(all_attributes.keys())

def write_to_csv(enemies, attributes, output_file):
    with open(output_file, 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.DictWriter(csvfile, fieldnames=attributes, quoting=csv.QUOTE_ALL)
        writer.writeheader()
        for enemy in enemies:
            writer.writerow(enemy)

def main(input_file, output_file):
    try:
        with open(input_file, 'r', encoding='utf-8') as file:
            erb_content = file.read()

        enemies, attributes = parse_erb_file(erb_content)
        write_to_csv(enemies, attributes, output_file)

        print(f"{len(enemies)}体のエネミーデータを{output_file}に書き出しました。")
        print(f"列の順序: {', '.join(attributes)}")
    except FileNotFoundError:
        print(f"エラー: ファイル '{input_file}' が見つかりません。")
    except Exception as e:
        print(f"エラーが発生しました: {e}")

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("使用方法: python script.py 入力ファイル名.erb 出力ファイル名.csv")
    else:
        input_file = sys.argv[1]
        output_file = sys.argv[2]
        main(input_file, output_file)


code:
// 敵データ定義とXML設定を一元管理するための構成オブジェクト
const ENEMYDATA_CONFIG = {
    columns: [
        {
            type: 'text',
            title: '敵定義名',
            width: 180,
            key: 'ENEMY_DEF_NAME',
            xmlAttr: true,
            align: 'left',
            tooltip: '定義上のエネミー名。一意であること'
        },
        {
            type: 'text',
            title: '敵表示名',
            width: 180,
            key: 'ENEMY_NAME',
            xmlAttr: true,
            align: 'left',
            tooltip: 'ゲーム中に表示されるエネミー名'
        },
        {
            type: 'numeric',
            title: 'HP',
            width: 100,
            key: 'MAX_HP',
            xmlAttr: true,
            tooltip: '最大HP値'
        },
        {
            type: 'numeric',
            title: '攻撃力',
            width: 60,
            key: 'ATTACK',
            xmlAttr: true,
            tooltip: '攻撃力'
        },
        {
            type: 'numeric',
            title: '魔術値',
            width: 60,
            key: 'MAG',
            xmlAttr: true,
            tooltip: '魔術値'
        },
        {
            type: 'numeric',
            title: '防御力',
            width: 60,
            key: 'DEFENCE',
            xmlAttr: true,
            tooltip: 'ダメージの割合軽減率'
        },
        {
            type: 'numeric',
            title: '軽減値',
            width: 60,
            key: 'ARMOR',
            xmlAttr: true,
            tooltip: 'ダメージの実数軽減値'
        },
        {
            type: 'numeric',
            title: '行動値',
            width: 60,
            key: 'AGILITY',
            xmlAttr: true,
            tooltip: '高いほど行動順が早くなる'
        },
        {
            type: 'numeric',
            title: '敵視値',
            width: 60,
            key: 'HATE_RATE',
            xmlAttr: true,
            tooltip: '高いほど狙われやすくなる'
        },
        {
            type: 'dropdown',
            title: '脅威選定',
            width: 80,
            key: 'TARGETING',
            source: ['無作為', '低耐久', '高脅威', '低脅威', '魔術師'],
            xmlAttr: true,
            tooltip: 'どのような基準で攻撃対象を選定するか'
        },
        {
            type: 'dropdown',
            title: '敵種別',
            width: 80,
            key: 'ENEMY_TYPE',
            xmlAttr: true,
            source: ['人', '獣', '亜人系魔物', '蟲', '竜', '植物', '神聖', 'アンデッド', '不定形', '無生物', '魔族', '精霊', '触手', '機械'],
            tooltip: 'エネミーの種別'
        },
        {
            type: 'text',
            title: 'アクティブスキル',
            width: 200,
            key: 'ENEMY_ACTIVE_SKILL',
            xmlAttr: true,
            tooltip: '適用するアクティブスキル[定義名:スキルレベル]の書式で指定。複数指定可'
        },
        {
            type: 'text',
            title: 'パッシブスキル',
            width: 200,
            key: 'ENEMY_PASSIVE_SKILL',
            xmlAttr: true,
            tooltip: '適用するパッシブスキル[定義名:スキルレベル]の書式で指定。複数指定可'
        },
        {
            type: 'text',
            title: 'スキル発動率',
            width: 60,
            key: 'SKILL_USE_RATE',
            xmlAttr: true,
            tooltip: 'アクティブスキル発動率(百分率)'
        },
        {
            type: 'text',
            title: '性的スキル発動率',
            width: 60,
            key: 'SEX_SKILL_USE_RATE',
            xmlAttr: true,
            tooltip: '性的なスキル発動率(百分率)'
        },
        {
            type: 'text',
            title: '行動AI設定',
            width: 200,
            key: 'ENEMY_AI',
            xmlAttr: true,
            tooltip: 'AI動作の設定'
        },
        {
            type: 'numeric',
            title: '賞金',
            width: 80,
            key: 'REWARD_MONEY',
            xmlAttr: true,
            tooltip: '討伐時の獲得ディナリを指定'
        },
        {
            type: 'numeric',
            title: '経験値',
            width: 80,
            key: 'EXP',
            xmlAttr: true,
            tooltip: '撃破時の獲得経験値'
        },
        {
            type: 'text',
            title: 'ドロップアイテム1',
            width: 100,
            key: 'REWARD_ITEM_1',
            xmlAttr: true,
            tooltip: 'ドロップアイテム名を指定'
        },
        {
            type: 'text',
            title: 'ドロップ量1',
            width: 80,
            key: 'REWARD_ITEM_1_COUNT',
            xmlAttr: true,
            tooltip: 'ドロップアイテム1のドロップ量を指定。(個数は\'1-3\'のように表記すると１～３個のいずれかの量をドロップする)'
        },
        {
            type: 'numeric',
            title: '確率1',
            width: 80,
            key: 'REWARD_ITEM_1_RATE',
            xmlAttr: true,
            tooltip: 'ドロップアイテム1のドロップ率を指定(千分率)'
        },
        {
            type: 'text',
            title: 'ドロップアイテム2',
            width: 100,
            key: 'REWARD_ITEM_2',
            xmlAttr: true,
            tooltip: 'ドロップアイテム名を指定'
        },
        {
            type: 'text',
            title: 'ドロップ量2',
            width: 80,
            key: 'REWARD_ITEM_2_COUNT',
            xmlAttr: true,
            tooltip: 'ドロップアイテム1のドロップ量を指定。(個数は\'1-3\'のように表記すると１～３個のいずれかの量をドロップする)'
        },
        {
            type: 'numeric',
            title: '確率2',
            width: 80,
            key: 'REWARD_ITEM_2_RATE',
            xmlAttr: true,
            tooltip: 'ドロップアイテム2のドロップ率を指定(千分率)'
        },
        {
            type: 'text',
            title: 'ドロップアイテム3',
            width: 100,
            key: 'REWARD_ITEM_3',
            xmlAttr: true,
            tooltip: 'ドロップアイテム名を指定'
        },
        {
            type: 'text',
            title: 'ドロップ量3',
            width: 80,
            key: 'REWARD_ITEM_3_COUNT',
            xmlAttr: true,
            tooltip: 'ドロップアイテム3のドロップ量を指定。(個数は\'1-3\'のように表記すると１～３個のいずれかの量をドロップする)'
        },
        {
            type: 'numeric',
            title: '確率3',
            width: 80,
            key: 'REWARD_ITEM_3_RATE',
            xmlAttr: true,
            tooltip: 'ドロップアイテム3のドロップ率を指定(千分率)'
        },
        {
            type: 'text',
            title: 'ドロップアイテム4',
            width: 100,
            key: 'REWARD_ITEM_4',
            xmlAttr: true,
            tooltip: 'ドロップアイテム名を指定'
        },
        {
            type: 'text',
            title: 'ドロップ量4',
            width: 80,
            key: 'REWARD_ITEM_4_COUNT',
            xmlAttr: true,
            tooltip: 'ドロップアイテム1のドロップ量を指定。(個数は\'1-3\'のように表記すると１～３個のいずれかの量をドロップする)'
        },
        {
            type: 'numeric',
            title: '確率4',
            width: 80,
            key: 'REWARD_ITEM_4_RATE',
            xmlAttr: true,
            tooltip: 'ドロップアイテム4のドロップ率を指定(千分率)'
        },
        {
            type: 'text',
            title: 'ドロップアイテム5',
            width: 100,
            key: 'REWARD_ITEM_5',
            xmlAttr: true,
            tooltip: 'ドロップアイテム名を指定'
        },
        {
            type: 'text',
            title: 'ドロップ量5',
            width: 80,
            key: 'REWARD_ITEM_5_COUNT',
            xmlAttr: true,
            tooltip: 'ドロップアイテム5のドロップ量を指定。(個数は\'1-3\'のように表記すると１～３個のいずれかの量をドロップする)'
        },
        {
            type: 'numeric',
            title: '確率5',
            width: 80,
            key: 'REWARD_ITEM_5_RATE',
            xmlAttr: true,
            tooltip: 'ドロップアイテム5のドロップ率を指定(千分率)'
        },
    ],

    // XML関連の設定
    xml: {
        root: 'data',           // ルート要素名
        command: 'enemy_data',     // コマンド要素名
        contentTag: 'contents'  // 内容を格納するタグ名
    },

    // 表示設定
    display: {
        freezeColumns: 1  // 左から1列を固定表示
    }
};


code:
// カラム定義とXML設定を一元管理するための構成オブジェクト
// 実際にはjsファイル。corsを回避するため
const COMMAND_CONFIG = {
    columns: [
        {
            type: 'text',
            title: 'コマンド番号',
            width: 70,
            key: 'com',
            xmlAttr: true,
            align: 'center',
            tooltip: '【必須】口上の出力対象とするコマンド番号、またはコマンドグループ(VSEX,ASEXなど)を指定\nコマンド番号はtrain.csvに対応'
        },
        {
            type: 'text',
            title: 'オプション',
            width: 60,
            key: 'option',
            xmlAttr: true,
            tooltip: '【任意】コマンドオプションの指定'
        },
        {
            type: 'text',
            title: 'コマンド名',
            width: 100,
            key: 'name',
            tooltip: '【任意】口上識別上の名称\n判定には用いられないので自由に記述可',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '口上内容',
            width: 550,
            key: 'contents',
            tooltip: '【必須】表示される口上本文',
            xmlAttr: false,  // contents タグとして出力
            xmlTag: true,     // 独立したタグとして出力
        },
        {
            type: 'dropdown',
            title: '表示位置',
            width: 80,
            key: 'kojoPlace',
            tooltip: '【必須】口上の表示位置\nTOPはコマンドの実行直前\nMIDDLE以降はSOURCE処理後に呼び出される。\n射精などコマンドの実行結果を判定し表示を制御する場合はMIDDLE以降を指定',
            source: ['TOP', 'MIDDLE', 'BOTTOM'],
            xmlAttr: true
        },
        {
            type: 'numeric',
            title: '優先度',
            width: 60,
            key: 'priority',
            tooltip: '【必須】口上抽選時の重み\n条件を満たす口上が複数ある場合は優先度の重みに従って抽選される\n0は完全に抽選されない',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: '排他',
            width: 60,
            key: 'isExclusive',
            source: ['TRUE', 'FALSE'],
            tooltip: '【任意】他の口上と排他するかどうか\nTRUEの場合この口上の優先度未満の口上は完全に抽選されなくなる\n※このコマンドの優先度以上の口上は出力対象となる',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: '主導権',
            width: 60,
            key: 'isInitiative',
            source: ['TRUE', 'FALSE'],
            tooltip: '【任意】この口上の割当キャラがコマンドの主導権を持つかどうか\nTRUEの場合は主導権を持つ場合\nFALSEの場合は主導権を持たない場合出力対象となる',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: '実行／対象',
            width: 80,
            allowInvalid: true,
            key: 'PLYorTGT',
            source: ['PLAYER', 'TARGET'],
            tooltip: '【任意】この口上の割当キャラがコマンドの実行者(PLAYER)かコマンドのターゲット(TARGET)かどうか\n',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: '主人公有無',
            width: 60,
            key: 'forMaster',
            source: ['TRUE', 'FALSE'],
            tooltip: '【任意】この口上の割当キャラがコマンドの実行、対象となる際に主人公が実行、対象に含まれるかどうか\n対主人公を想定した口上の場合はTRUE指定を推奨',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '感情',
            width: 80,
            key: 'emotion',
            autocomplete: true,
            source: ['HAPPY', 'GOOD', 'ANGER', 'SAD', 'FEAR', 'NEGATIVE', 'BROKEN', "幸", "悦", "良", "憤", "怒", "恨", "鬱", "悲", "憂", "狂", "恐", "怯", "催", "壊", "虚"],
            tooltip: '【任意】 この口上の割当キャラの感情の値を文字列として条件に取る\n指定可能な文字列はヘルプ②条件指定詳説参照',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '陥落',
            width: 80,
            key: 'isFall',
            tooltip: '【任意】 この口上の割当キャラの陥落状態を文字列として条件に取る\n指定可能な文字列はヘルプ②条件指定詳説参照',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '欲情',
            width: 60,
            key: 'lust',
            tooltip: '【任意】 この口上の割当キャラの欲情レベルを条件に取る\n指定値以上の場合出力対象とする',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: 'ウフフフラグ',
            width: 60,
            key: 'isUfufu',
            source: ['TRUE', 'FALSE'],
            tooltip: '【任意】 ウフフフラグが立っている場合(押し倒しや奉仕、敗北調教などエロ系コマンドが許可されているケース)で対象となる',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '行動状態',
            width: 80,
            key: 'HO_Act',
            tooltip: '【任意】 口上キャラクターの領内交流パートにおける活動ステート(同行中、食事中など)に合致する場合出力対象\n指定可能な文字列はヘルプ②条件指定詳説参照',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '条件式',
            width: 200,
            key: 'eval',
            tooltip: '【任意】 {}に直接ERBの条件式を記述する\nERBのIF文の条件式として解釈され、条件が真となる場合出力対象となる',
            xmlAttr: true
        },
        {
            type: 'numeric',
            title: '有効化確率',
            width: 60,
            key: 'randRate',
            tooltip: '【任意】 口上の有効にする確率を指定する(0～100の範囲で指定)\n確率で対象となる/ならないを制御するために使用\n常に同じ口上を繰り返し出力したくない場合に指定するとよい',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: '凌辱時出力許可',
            width: 60,
            key: 'atRaped',
            source: ['TRUE', 'FALSE', 'ONLYRAPED'],
            tooltip: '【任意】 TRUEの場合、凌辱イベント(CFLAG:凌辱被害者フラグ)中での口上出力を許容する\nONLYRAPEDの場合は凌辱被害者フラグが立っている場合のみ口上を出力\n未指定、FALSEの場合は凌辱イベント中はこの口上を出力しない',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: '話者の性別',
            width: 60,
            key: 'speakerSex',
            source: ['MALE', 'FEMALE'],
            tooltip: '【任意】 口上の話者の性別が条件を満たす場合口上を出力\n※IS_MALE関数で判定される\nより詳細に性別を判定したい場合は条件式を併用するとよい',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: 'モブフラグ',
            width: 60,
            key: 'isMob',
            source: ['TRUE', 'FALSE'],
            tooltip: '【任意】 TRUEの場合、口上割り当てキャラがモブ(ランダムキャラの来客などモブフラグが立っている場合)の場合に出力対象となる',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: '地の文カット',
            width: 60,
            key: 'cutDescription',
            source: ['TRUE', 'FALSE'],
            tooltip: '【任意】 TRUEの場合、この口上出力時に汎用地の文をカットする\n(※表示位置次第だと正常に動作しない可能性あり)',
            xmlAttr: true
        },
        // ... 他のカラム定義
    ],

    // XML関連の設定
    xml: {
        root: 'data',           // ルート要素名
        command: 'command',     // コマンド要素名
        contentTag: 'contents'  // 内容を格納するタグ名
    }
};


code:
// カラム定義とXML設定を一元管理するための構成オブジェクト
// 実際にはjsファイル。corsを回避するため
const COMBAT_CONFIG = {
    columns: [
        {
            type: 'text',
            title: 'スキル定義名',
            width: 180,
            key: 'skillDefName',
            xmlAttr: true,
            align: 'left',
            tooltip: '【必須】スキルの定義上の名称'
        },
        {
            type: 'text',
            title: 'アクション名',
            width: 240,
            key: 'actionName',
            xmlAttr: true,
            tooltip: '【必須】コマンドオプションの指定' // 上手く表示されない
        },
        {
            type: 'text',
            title: '口上名',
            width: 120,
            key: 'name',
            xmlAttr: true,
            tooltip: '【任意】口上識別上の名称\n判定には用いられないので自由に記述可',
        },
        {
            type: 'text',
            title: '口上内容',
            width: 600,
            key: 'contents',
            xmlAttr: false,  // contents タグとして出力
            xmlTag: true     // 独立したタグとして出力
        },
        {
            type: 'dropdown',
            title: '実行／対象',
            width: 80,
            allowInvalid: true,
            key: 'ACTorTGT',
            source: ['ACTOR', 'TARGET'],
            tooltip: '【任意】この口上の割当キャラがアクションの実行者(PLAYER)かアクションのターゲット(TARGET)かどうか\n',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '表示位置',
            width: 80,
            key: 'kojoPlace',
            tooltip: '【必須】口上の表示位置',
            // source: ['TOP', 'MIDDLE', 'BOTTOM'],
            xmlAttr: true
        },
        {
            type: 'numeric',
            title: '優先度',
            width: 60,
            key: 'priority',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: '排他',
            width: 60,
            key: 'isExclusive',
            source: ['TRUE', 'FALSE'],
            tooltip: '【任意】他の口上と排他するかどうか\nTRUEの場合この口上の優先度未満の口上は完全に抽選されなくなる\n※このコマンドの優先度以上の口上は出力対象となる',
            xmlAttr: true
        },
        {
            type: 'numeric',
            title: 'シーケンス',
            width: 60,
            key: 'sequence',
            xmlAttr: true
        },
        {
            type: 'text',
            title: 'トークン',
            width: 60,
            key: 'token',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '条件式',
            width: 200,
            key: 'eval',
            xmlAttr: true
        },
        {
            type: 'numeric',
            title: '出力確率',
            width: 80,
            key: 'randRate',
            allowInvalid: true,
            xmlAttr: true
        }
    ],

    // XML関連の設定
    xml: {
        root: 'data',           // ルート要素名
        command: 'command',     // コマンド要素名
        contentTag: 'contents'  // 内容を格納するタグ名
    }
};


code:
// カラム定義とXML設定を一元管理するための構成オブジェクト
// 実際にはjsファイル。corsを回避するため
const EVENT_CONFIG = {
    columns: [
        {
            type: 'text',
            title: 'イベント番号',
            width: 120,
            key: 'eventId',
            xmlAttr: true,
            align: 'center',
            tooltip: '口上の出力対象とするコマンド番号、またはコマンドグループを指定。コマンド一覧はtrain.csvに対応' // 上手く表示されない
        },
        {
            type: 'text',
            title: 'オプション',
            width: 80,
            key: 'option',
            xmlAttr: true,
            tooltip: 'コマンドオプションの指定' // 上手く表示されない
        },
        {
            type: 'text',
            title: 'イベント名',
            width: 120,
            key: 'name',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '口上内容',
            width: 600,
            key: 'contents',
            xmlAttr: false,  // contents タグとして出力
            xmlTag: true     // 独立したタグとして出力
        },
        {
            type: 'numeric',
            title: '優先度',
            width: 60,
            key: 'priority',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '感情',
            width: 80,
            key: 'emotion',
            autocomplete: true,
            source: ['HAPPY', 'GOOD', 'ANGER', 'SAD', 'FEAR', 'NEGATIVE', 'BROKEN', "幸", "悦", "良", "憤", "怒", "恨", "鬱", "悲", "憂", "狂", "恐", "怯", "催", "壊", "虚"],
            xmlAttr: true
        },
        {
            type: 'text',
            title: '陥落',
            width: 80,
            key: 'isFall',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '欲情',
            width: 80,
            key: 'lust',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: 'ウフフフラグ',
            width: 80,
            key: 'isUfufu',
            source: ['TRUE', 'FALSE'],
            xmlAttr: true
        },
        {
            type: 'text',
            title: '行動状態',
            width: 80,
            key: 'HO_Act',
            xmlAttr: true
        },
        {
            type: 'text',
            title: '条件式',
            width: 200,
            key: 'eval',
            xmlAttr: true
        },
        {
            type: 'numeric',
            title: '出力確率',
            width: 80,
            key: 'randRate',
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: '地の文カット',
            width: 80,
            key: 'cutDescription',
            source: ['TRUE', 'FALSE'],
            xmlAttr: true
        },
        {
            type: 'dropdown',
            title: 'モブフラグ',
            width: 80,
            key: 'isMob',
            source: ['TRUE', 'FALSE'],
            xmlAttr: true
        },
    ],

    // XML関連の設定
    xml: {
        root: 'data',           // ルート要素名
        command: 'command',     // コマンド要素名
        contentTag: 'contents'  // 内容を格納するタグ名
    }
};


code:
// ハイライトパターンの定義
const HIGHLIGHT_PATTERNS = [
    {
        pattern: /\[\$[^\]]+\]/g,  // [$任意の文字列]のパターン
        className: 'highlight-variable'
    },
    {
        pattern: /%[^(%]+\([^)]*\)%/g,  // %任意の文字列(任意の文字列)%のパターン
        className: 'highlight-function'
    },

];


code:
table.jexcel
{
    border-right:1px solid transparent;
}

table.jexcel > thead
{
    background-color:#fff;
}

table.jexcel > thead > tr > td
{
    border-top:1px solid transparent;
    border-left:1px solid transparent;
    border-right:1px solid transparent;
    border-bottom:1px solid #000;
    background-color:#fff;
    padding:10px;
    font-weight:bold;
}

table.jexcel > thead > tr > td.selected
{
    background-color:#eee;
}

table.jexcel > tbody > tr > td
{
    padding:8px;
    border-right:1px solid transparent;
    border-left:1px solid transparent;
}

table.jexcel > tbody > tr > td:first-child
{
    background-color:#fff;
}

table.jexcel > tbody > tr.selected > td:first-child
{
    background-color:#eee;
}

.jexcel_toolbar {
    background-color: transparent;
    border: 0px;
    border-bottom: 1px solid #ccc;
    border-top: 1px solid #ccc;
    margin-bottom: 0px;
}

.jexcel_pagination > div > div
{
    border:1px solid transparent;
    background-color: #fff;
}

.jexcel_page_selected
{
    background: linear-gradient(to bottom, #fff 0%, #dcdcdc 100%);
    border:1px solid #979797 !important;
    font-weight:normal;
    color: #333 !important;
    border-radius:2px;
}

/*.jexcel > div > table > tbody > tr,
.jexcel > div > table > thead
{
    border-left:1px solid transparent;
}
.jexcel > div > table > tbody > tr > td
{
    padding:10px;
    border-right:1px solid transparent;
}
.jexcel > div > table > tbody > td.edition
{
    padding:0px;
    padding-left:4px;
}
.jexcel > div > table > tbody > tr > td:first-child
{
    background-color:#fff;
    font-weight:bold;
}
.jexcel > div > table > tbody > tr.selected > td:first-child
{
    background-color:#eee;
}
.jexcel > div > table > thead > tr > td.selected
{
    background-color:#eee;
}*/


code:
:root {
    --jexcel_header_color: #888;
    --jexcel_header_color_highlighted: #444;
    --jexcel_header_background: #313131;
    --jexcel_header_background_highlighted: #777;
    --jexcel_content_color: #777;
    --jexcel_content_color_highlighted: #333;
    --jexcel_content_background: #3e3e3e;
    --jexcel_content_background_highlighted: #777;
    --jexcel_menu_background: #7e7e7e;
    --jexcel_menu_background_highlighted: #ebebeb;
    --jexcel_menu_color: #ddd;
    --jexcel_menu_color_highlighted: #222;
    --jexcel_border_color: #5f5f5f;
    --jexcel_border_color_highlighted: #999;
    --active_color: #eee;
    --active-color: var(--active_color);
}

.jexcel {
    border-bottom: 1px solid var(--jexcel_border_color);
    border-right: 1px solid var(--jexcel_border_color);
}

.jexcel > tbody > tr > td,
.jexcel > thead > tr > td {
    border-top: 1px solid var(--jexcel_border_color);
    border-left: 1px solid var(--jexcel_border_color);
    background-color: var(--jexcel_content_background);
    color: var(--jexcel_content_color);
}

.jexcel > tbody > tr > td:first-child,
.jexcel > thead > tr > td {
    background-color: var(--jexcel_header_background);
    color: var(--jexcel_header_color);
}

.jexcel > thead > tr > td.selected,
.jexcel > tbody > tr.selected > td:first-child {
    background-color: var(--jexcel_header_background_highlighted);
    color: var(--jexcel_header_color_highlighted);
}

.jexcel > tbody > tr > td.jexcel_cursor a {
    color: var(--active-color);
}

.jexcel_pagination > div > div {
    color: var(--jexcel_header_color);
    background: var(--jexcel_header_background);
    border: 1px solid var(--jexcel_border_color);
}

.jexcel_page,
.jexcel_container input,
.jexcel_container select {
    color: var(--jexcel_header_color);
    background: var(--jexcel_header_background);
    border: 1px solid var(--jexcel_border_color);
}

.jexcel_contextmenu {
    border: 1px solid var(--jexcel_border_color);
    background: var(--jexcel_menu_background);
    color: var(--jexcel_menu_color);
    box-shadow: var(--jexcel_menu_box_shadow);
    -webkit-box-shadow: var(--jexcel_menu_box_shadow);
    -moz-box-shadow: var(--jexcel_menu_box_shadow);
}

.jexcel_contextmenu > div a {
    color: var(--jexcel_menu_color);
}

.jexcel_contextmenu > div:not(.contextmenu-line):hover a {
    color: var(--jexcel_menu_color_highlighted);
}

.jexcel_contextmenu > div:not(.contextmenu-line):hover {
    background: var(--jexcel_menu_background_highlighted);
}

.jexcel_dropdown .jdropdown-container,
.jexcel_dropdown .jdropdown-content {
    background-color: var(--jexcel_content_background);
    color: var(--jexcel_content_color);
}

.jexcel_dropdown .jdropdown-item {
    color: var(--jexcel_content_color);
}

.jexcel_dropdown .jdropdown-item:hover,
.jexcel_dropdown .jdropdown-selected,
.jexcel_dropdown .jdropdown-cursor {
    background-color: var(--jexcel_content_background_highlighted);
    color: var(--jexcel_content_color_highlighted);
}

.jexcel .jcalendar-content {
    background-color: var(--jexcel_header_background);
    color: var(--jexcel_header_color);
}

.jexcel .jcalendar-content > table {
    background-color: var(--jexcel_content_background);
    color: var(--jexcel_content_color);
}

.jexcel .jcalendar-weekday {
    background-color: var(--jexcel_content_background_highlighted);
    color: var(--jexcel_content_color_highlighted);
}

.jexcel .jcalendar-sunday {
    color: var(--jexcel_header_color);
}

.jexcel .jcalendar-selected {
    background-color: var(--jexcel_content_background_highlighted);
    color: var(--jexcel_content_color_highlighted);
}

.jexcel_toolbar i.jexcel_toolbar_item {
    color: var(--jexcel_content_color);
}

.jexcel_toolbar i.jexcel_toolbar_item:hover {
    background: var(--jexcel_content_background_highlighted);
    color: var(--jexcel_content_color_highlighted);
}

.jexcel_toolbar {
    background: var(--jexcel_header_background);
}

.jexcel_content::-webkit-scrollbar-track {
    background: var(--jexcel_background_head);
}

.jexcel_content::-webkit-scrollbar-thumb {
    background: var(--jexcel_background_head_highlighted);
}

.jexcel_border_main {
    border: 1px solid #000;
    border-color: var(--jexcel_border_color_highlighted);
}

.jexcel .highlight {
    background-color: var(--jexcel_content_background_highlighted);
}

.jexcel .highlight-bottom {
    border-bottom: 1px solid var(--jexcel_border_color_highlighted);
}
.jexcel .highlight-right {
    border-right: 1px solid var(--jexcel_border_color_highlighted);
}
.jexcel .highlight-left {
    border-left: 1px solid var(--jexcel_border_color_highlighted);
}
.jexcel .highlight-top {
    border-top: 1px solid var(--jexcel_border_color_highlighted);
}
.jexcel .copying-top {
    border-top-color: var(--jexcel_border_color_highlighted);
}
.jexcel .copying-right {
    border-right-color: var(--jexcel_border_color_highlighted);
}
.jexcel .copying-left {
    border-left-color: var(--jexcel_border_color_highlighted);
}
.jexcel .copying-bottom {
    border-bottom-color: var(--jexcel_border_color_highlighted);
}
.jexcel_border_main, .jexcel .highlight-top.highlight-left, .jexcel .highlight-top, .jexcel .highlight-left {
    -webkit-box-shadow: unset;
    box-shadow: unset;
}


code:
    /* ライトモード（デフォルト）のスタイル */
    :root {
        --bg-color: #ffffff;
        --text-color: #000000;
        --header-bg: #f8f9fa;
        --border-color: #ccc;
        --cell-bg: #ffffff;
        --cell-bg-selected: #eef5fa;
        --button-bg: #f8f9fa;
        --button-text: #000000;
        --cell-bg-even: #ffffff;
        --cell-bg-odd: #f5f5f5;
        --input-text-color: #000000;
        --row-number-color: #666;
        --highlight-text-color: #0066cc;
    }

    /* ダークモードのスタイル */
    [data-theme="dark"] {
        --bg-color: #1a1a1a;
        --text-color: #efefef;
        --header-bg: #2d2d2d;
        --border-color: #404040;
        --cell-bg: #2d2d2d;
        --cell-bg-selected: #404040;
        --button-bg: #404040;
        --button-text: #ffffff;
        --cell-bg-even: #2d2d2d;
        --cell-bg-odd: #363636;
        --input-text-color: ##efefef;
        --row-number-color: #888;
        --highlight-text-color: #66b3ff;
    }

    body {
        background-color: var(--bg-color);
        color: var(--text-color);
        transition: background-color 0.3s, color 0.3s;
    }

    /* コンテナのスタイル */
    .container {
        width: 95vw;  /* ビューポート幅の90% */
        margin: 0;
        padding: 0 20px;
        min-width: 800px;  /* 最小幅を設定（必要に応じて調整） */
    }

    /* スプレッドシートのスタイル */
    #spreadsheet {
        margin-top: 20px;
        height: calc(100vh - 150px);
        overflow: auto;
        width: 100% !important;
        overflow-x: auto;
    }

    /* ヘッダー行を固定するスタイル */
    .jexcel>thead {
        position: sticky !important;
        top: 0;
        z-index: 2;
        background-color: var(--header-bg);
    }

    /* ヘッダーセルのスタイル */
    .jexcel>thead>tr>td {
        background-color: var(--header-bg) !important;
        color: var(--text-color) !important;
        border-color: var(--border-color) !important;
        font-weight: bold;
        position: sticky !important;
        top: 0;
        z-index: 2;
        font-size: 0.85em !important;
        padding: 4px 6px !important;
    }

    /* jspreadsheetのカスタムスタイル */
    .jexcel {
        border-color: var(--border-color) !important;
    }

    .jexcel>tbody>tr>td {
        background-color: var(--cell-bg) !important;
        color: var(--text-color) !important;
        border-color: var(--border-color) !important;
    }

    /* 編集中のセルのスタイル */
    .jexcel>tbody>tr>td>input,
    .jexcel>tbody>tr>td>textarea {
        color: var(--input-text-color) !important;
        background-color: var(--cell-bg) !important;
        border: 1px solid var(--border-color) !important;
    }

    /* jsuites input スタイルの上書き */
    .jexcel .jexcel_richtext {
        color: var(--input-text-color) !important;
        background-color: var(--cell-bg) !important;
    }

    /* エディタモードのスタイル */
    .jexcel_content {
        color: var(--input-text-color) !important;
        background-color: var(--cell-bg) !important;
        width: 100% !important;
    }

    /* jsuites editor のスタイル */
    .jexcel .jexcel-editor {
        color: var(--input-text-color) !important;
        background-color: var(--cell-bg) !important;
    }

    /* インラインエディタのスタイル */
    .jexcel-editor {
        color: var(--input-text-color) !important;
        background-color: var(--cell-bg) !important;
    }

    /* ドロップダウンのスタイル */
    .jexcel>tbody>tr>td>select {
        color: var(--input-text-color) !important;
        background-color: var(--cell-bg) !important;
    }

    /* 編集モードのセルのスタイル */
    .jexcel>tbody>tr>td.edition {
        color: var(--input-text-color) !important;
        background-color: var(--cell-bg) !important;
    }

    .jexcel>tbody>tr>td.highlight {
        background-color: var(--cell-bg-selected) !important;
    }

    /* 偶数行と奇数行の背景色を設定 */
    .jexcel>tbody>tr:nth-child(even)>td {
        background-color: var(--cell-bg-even) !important;
    }

    .jexcel>tbody>tr:nth-child(odd)>td {
        background-color: var(--cell-bg-odd) !important;
    }

    /* 選択時のスタイルを優先 */
    .jexcel>tbody>tr>td.highlight {
        background-color: var(--cell-bg-selected) !important;
    }

    /* コントロール部分のスタイル */
    .controls {
        padding: 10px;
        background-color: var(--bg-color);
    }

    .controls button {
        background-color: var(--button-bg);
        color: var(--button-text);
        border: 1px solid var(--border-color);
        padding: 5px 10px;
        border-radius: 4px;
        cursor: pointer;
        transition: all 0.3s;
    }

    .controls button:hover {
        opacity: 0.8;
    }

    .controls button:disabled {
        opacity: 0.5;
        cursor: not-allowed;
    }

    #darkModeToggle {
        float: right;
        font-size: 1.2em;
        padding: 5px 10px;
    }

    /* ツールチップのスタイル */
    .tooltip {
        position: relative;
        display: inline-block;
    }

    .tooltip .tooltip-text {
        visibility: hidden;
        background-color: var(--header-bg);
        color: var(--text-color);
        text-align: center;
        padding: 5px 10px;
        border-radius: 6px;
        border: 1px solid var(--border-color);

        /* ツールチップの位置 */
        position: absolute;
        z-index: 1;
        width: 200px;
        bottom: 100%;
        left: 50%;
        margin-left: -100px;

        /* フェードイン効果 */
        opacity: 0;
        transition: opacity 0.3s;
    }

    /* 矢印 */
    .tooltip .tooltip-text::after {
        content: "";
        position: absolute;
        top: 100%;
        left: 50%;
        margin-left: -5px;
        border-width: 5px;
        border-style: solid;
        border-color: var(--border-color) transparent transparent transparent;
    }

    /* ホバー時の表示 */
    .tooltip:hover .tooltip-text {
        visibility: visible;
        opacity: 1;
    }

    /* 既存のtooltipスタイルを削除し、新しいスタイルを追加 */
    .jexcel-tooltip {
        position: relative;
        display: inline-block;
        width: 100%;
        height: 100%;
    }

    /* ヘルプボタンのスタイル */
    .help-link {
        text-decoration: none;
        float: right;
        margin-right: 10px;
    }

    .help-button {
        background-color: var(--button-bg);
        color: var(--button-text);
        border: 1px solid var(--border-color);
        padding: 5px 10px;
        border-radius: 4px;
        cursor: pointer;
        transition: all 0.3s;
        font-size: 1.2em;
    }

    .help-button:hover {
        opacity: 0.8;
        background-color: var(--cell-bg-selected);
    }

    .jexcel-tooltip-content {
        display: none;
        position: absolute;
        background-color: var(--header-bg);
        color: var(--text-color);
        padding: 8px;
        border-radius: 4px;
        border: 1px solid var(--border-color);
        width: 200px;
        z-index: 1000;
        top: 100%;
        left: 50%;
        transform: translateX(-50%);
        margin-top: 5px;
        box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);
        font-weight: normal;
        font-size: 12px;
        white-space: normal;
    }

    .jexcel-tooltip:hover .jexcel-tooltip-content {
        display: block;
    }

    /* 矢印の追加 */
    .jexcel-tooltip-content::before {
        content: '';
        position: absolute;
        top: -6px;
        left: 50%;
        transform: translateX(-50%);
        border-width: 0 6px 6px 6px;
        border-style: solid;
        border-color: transparent transparent var(--border-color) transparent;
    }

    /* ハイライトスタイル */
    .highlight-error {
        color: #e74c3c;
        /* font-weight: bold; */
    }

    .highlight-function {
        color: #e74c3c;
    }

    .highlight-variable {
        color: #007bff;
    }
    .highlight-green {
        color: #00533c;
    }
    /* ダークモード */
    [data-theme='dark'] .highlight-error {
        color: #ff7675;
    }

    [data-theme='dark'] .highlight-function {
        color: #f39212;
    }

    [data-theme='dark'] .highlight-variable {
        color: #00c3ff;
    }

    [data-theme='dark'] .highlight-green {
        color: #00c089;
    }
    /* テキストセルのスタイル調整 */
    .jexcel td {
        white-space: pre-wrap !important; /* 改行を保持 */
        line-height: 1.4;
    }

    /* ボタンセクションのスタイル */
    .button-section {
        display: flex;
        align-items: center;
        gap: 10px;  /* ボタン間の間隔を統一 */
        padding: 10px;
        background-color: #f8f9fa;
        border-bottom: 1px solid #dee2e6;
        width: 100%;
        margin-bottom: 10px;
    }

    /* 共通のボタンスタイル */
    .button-section button {
        padding: 8px 16px;
        border-radius: 4px;
        font-size: 14px;
        cursor: pointer;
        transition: all 0.2s ease;
        height: 36px;
        display: flex;
        align-items: center;
        justify-content: center;
    }

    /* インポートボタンのスタイル */
    .import-button {
        background-color: #4834d4;  /* 紫がかった青 */
        color: white;
        border: 1px solid #3c28b8;
    }

    .import-button:hover {
        background-color: #686de0;
        border-color: #4834d4;
    }

    /* エクスポートボタンのスタイル */
    .export-button {
        background-color: #2ecc71;  /* 緑 */
        color: white;
        border: 1px solid #27ae60;
    }

    .export-button:hover {
        background-color: #27ae60;
        border-color: #219a52;
    }

    /* 無効化状態のスタイル */
    .export-button:disabled {
        background-color: #95a5a6;
        border-color: #7f8c8d;
        cursor: not-allowed;
        opacity: 0.7;
    }

    /* ダークモード対応 */
    [data-theme='dark'] .import-button {
        background-color: #5f27cd;
        border-color: #4834d4;
    }

    [data-theme='dark'] .import-button:hover {
        background-color: #786fa6;
        border-color: #5f27cd;
    }

    [data-theme='dark'] .export-button {
        background-color: #00b894;
        border-color: #00a885;
    }

    [data-theme='dark'] .export-button:hover {
        background-color: #00a885;
        border-color: #009876;
    }

    [data-theme='dark'] .export-button:disabled {
        background-color: #636e72;
        border-color: #2d3436;
    }

    /* ユーティリティボタン（ダークモード・ヘルプ）のスタイル */
    .utility-button {
        width: 36px;  /* 正方形のボタン */
        padding: 0 !important;
        margin-right: auto;  /* 左寄せ */
    }

    /* ファイル情報のスタイル */
    #fileInfo {
        margin-left: auto;  /* 右寄せ */
        color: #6c757d;
        font-size: 14px;
    }

    /* ボタンホバー効果 */
    .button-section button:hover {
        background-color: #f8f9fa;
        border-color: #adb5bd;
    }

    /* ダークモード対応 */
    [data-theme='dark'] .button-section {
        background-color: #2d3436;
        border-bottom-color: #4a5568;
    }

    [data-theme='dark'] .button-section button {
        background-color: #2d3436;
        border-color: #4a5568;
        color: #f8f9fa;
    }

    [data-theme='dark'] .button-section button:hover {
        background-color: #4a5568;
        border-color: #718096;
    }

    [data-theme='dark'] #fileInfo {
        color: #a0aec0;
    }

    /* レスポンシブ対応 */
    @media screen and (max-width: 840px) {  /* スクロールバーの幅も考慮 */
        .container {
            padding: 0 10px;  /* 小さい画面では余白を減らす */
        }
    }


code:
<link rel="stylesheet" href="css/jsuites.css" type="text/css" />
<link rel="stylesheet" href="css/jspreadsheet.css" type="text/css" />
<link rel="stylesheet" href="css/styles.css" type="text/css" />

                <button id="darkModeToggle" class="utility-button">🌙</button>
                <button class="utility-button help-button" title="口上作成ガイドを開く"
                    onclick="window.open('https://docs.google.com/spreadsheets/d/1THU0zlp2WFZzTKuAy5B5ZjhxJaqSWndKpku--18X3V8/edit?gid=572982793#gid=572982793', '_blank')">❔</button>

            <input type="file" id="xmlFile" accept=".xml" style="display: none;" />
            <button id="importCommandXml" class="import-button">コマンド口上XMLをインポート</button>
            <button id="importEventXml" class="import-button">イベント口上XMLをインポート</button>
            <button id="importCombatXml" class="import-button">戦闘口上XMLをインポート</button>
            <button id="exportButton" class="export-button" disabled>口上XMLをエクスポート</button>
            ファイルが選択されていません


code:
<link rel="stylesheet" href="css/jsuites.css" type="text/css" />
<link rel="stylesheet" href="css/jspreadsheet.css" type="text/css" />
<link rel="stylesheet" href="css/styles.css" type="text/css" />

                <button id="darkModeToggle" class="utility-button">🌙</button>
                <button class="utility-button help-button" title="ヘルプを開く"
                    onclick="window.open('https://docs.google.com/spreadsheets/d/1THU0zlp2WFZzTKuAy5B5ZjhxJaqSWndKpku--18X3V8/edit?gid=572982793#gid=572982793', '_blank')">❔</button>

            <input type="file" id="xmlFile" accept=".xml" style="display: none;" />
            <button id="importCommandXml" class="import-button">エネミーデータXMLをインポート</button>
            <button id="saveAsButton" class="export-button" disabled>XMLをエクスポート</button>
            ファイルが選択されていません


code:
const sourceTableContextMenuItems = (obj, x, y, e) => {
    let items = [];
    if (obj.options.allowInsertRow == true) {
        items.push({
            title: obj.options.text.insertANewRowBefore,
            onclick: function() {
                obj.insertRow(1, parseInt(y), 1);
            }
        });

        items.push({
            title: obj.options.text.insertANewRowAfter,
            onclick: function() {
                obj.insertRow(1, parseInt(y));
            }
        });
    }
    // undoが正しく機能しないのでいったん保留
    // items.push({
    //     title: obj.options.text.duplicateSelectedRow,
    //     onclick: function() {
    //         // 現在の状態をundoスタックに保存
    //         // obj.undo.saveState();

    //         // 選択された行のデータを取得と複製
    //         const selectedRow = parseInt(y);
    //         const rowData = obj.getRowData(selectedRow);

    //         // 行を挿入してデータをセット
    //         obj.insertRow(1, selectedRow);
    //         const newRowIndex = selectedRow + 1;
    //         obj.setRowData(newRowIndex, rowData);

    //         // 新しい状態をundoスタックに保存
    //         // obj.undo.saveState();

    //         // エクスポートボタンを有効化
    //         document.getElementById('exportButton').disabled = false;
    //     }
    // });

    if (obj.options.allowDeleteRow == true) {
        items.push({
            title: obj.options.text.deleteSelectedRows,
            onclick: () => {
                obj.deleteRow(obj.getSelectedRows().length ? undefined : parseInt(y));
            },
        });
        items.push({
            title: obj.options.text.paste,
            shortcut: 'Ctrl + V',
            onclick: () => {
                if (obj.selectedCell) {
                    navigator.clipboard.readText().then((text) => {
                        if (text) {
                            jspreadsheet.current.paste(obj.selectedCell[0], obj.selectedCell[1], text);
                        }
                    });
                }
            },
        });
        items.push({
            title: obj.options.text.copy,
            shortcut: 'Ctrl + C',
            onclick: () => {
                obj.copy();
            },
        });
    }
    return items;
};