code:
;---------------------------
;ARG:0の腋毛目標値をARG:1に設定する関数
;---------------------------
@SET_ARMPIT_DEFAULT(ARG:0, ARG:1)
SIF !INRANGE_ARMPIT(ARG:1)
	RETURN 0
TALENT:(ARG:0):腋毛目標値 = ARG:1
RETURN 1

;---------------------------
;ARG:0の腋毛現在値を取得する
;---------------------------
@GET_ARMPIT(ARG:0)
#FUNCTION
;SIF TALENT:(ARG:0):腋毛現在値 == 腋毛_ハート型
;	RETURNF 腋毛_標準
RETURNF TALENT:(ARG:0):腋毛現在値

;---------------------------
;ARG:0の腋毛現在値が目標値に向けて変化する関数
;---------------------------
@ARMPIT_GROW(ARG:0)
#DIM 現在
#DIM 目標

;パイパンなら育たない
SIF !IS_GROW_ARMPIT(ARG:0)
	RETURN 0

現在 = TALENT:(ARG:0):腋毛現在値
目標 = TALENT:(ARG:0):腋毛目標値

LOCAL:1 = 0

;ハート型は標準相当
;IF 現在 == 腋毛_ハート型
;	現在 = 腋毛_標準
;ENDIF
;IF 目標 == 腋毛_ハート型
;	目標 = 腋毛_標準
;	LOCAL:1 = 1
;ENDIF

;目標より少ない場合は1育つ
IF 目標 - 現在 > 0
	現在 ++
;目標より育っている場合は刈る
ELSEIF 目標 - 現在 < 0
	現在 = 目標
ENDIF

;ハート型の場合、標準相当になっていたら刈り揃える
;IF 目標 == 現在 && LOCAL:1 == 1
;	現在 = 腋毛_ハート型
;ENDIF

TALENT:(ARG:0):腋毛現在値 = 現在
RETURN 1

;---------------------------
;ARG:0の腋毛が成長するか
;---------------------------
@IS_GROW_ARMPIT(ARG:0)
#FUNCTION
RETURNF TALENT:(ARG:0):腋毛現在値 != -1

;---------------------------
;ARG:0に対応する腋毛の成長度合いを返す
;---------------------------
@GET_ARMPIT_NAME(ARG:0)
#FUNCTIONS

SELECTCASE ARG:0
	CASE 腋毛_脱毛済み
		RETURNF "脱毛済み"
	CASE 腋毛_つるつる
		RETURNF "つるつる"
	CASE 腋毛_手入れ済み
		RETURNF "手入れ済み"
	CASE 腋毛_うっすら
		RETURNF "うっすら"
	CASE 腋毛_ふんわり
		RETURNF "ふんわり"
	CASE 腋毛_普通
		RETURNF "普通"
	CASE 腋毛_多め
		RETURNF "多め"
	CASE 腋毛_ふさふさ
		RETURNF "ふさふさ"
	CASE 腋毛_もっさり
		RETURNF "もっさり"
	CASE 腋毛_剛毛
		RETURNF "剛毛"
	CASE 腋毛_密林
		RETURNF "密林"
	CASEELSE
		RETURNF "不明"
ENDSELECT

;---------------------------
;与えられた引数の成長度合いが存在するか
;---------------------------
@INRANGE_ARMPIT(ARG:0)
#FUNCTION
RETURNF GET_ARMPIT_NAME(ARG:0) != "不明"

;---------------------------
;与えられたキャラの腋毛具合がどんなものか返す
;-2 無毛 -1 薄め 0 標準 1 多め 2剛毛 3 ハート
;---------------------------
@GET_ARMPIT_LEVEL(ARG:0)
#FUNCTION
SELECTCASE TALENT:(ARG:0):腋毛現在値
	CASE 腋毛_脱毛済み, 腋毛_つるつる
		RETURNF -2
	CASE 腋毛_手入れ済み, 腋毛_うっすら, 腋毛_ふんわり
		RETURNF -1
	CASE 腋毛_普通
		RETURNF 0
	CASE 腋毛_多め, 腋毛_ふさふさ, 腋毛_もっさり
		RETURNF 1
	CASE 腋毛_剛毛, 腋毛_密林
		RETURNF 2
ENDSELECT

;---------------------------
;腋毛の状態を画面に出力する
;---------------------------
@PRINT_ARMPIT(ARG:0)
LOCALS:0 = %GET_ARMPIT_NAME(TALENT:(ARG:0):腋毛現在値)%
PRINTFORM %LOCALS:0%

repo_name: napo/erafl

license: unknown


code:
;■関数デザイン回り

;==============================================================================
;◆RGBカラーを色名単語で指定する関数（使用頻度の高そうな色のみ）
;　使い方：　SETCOLOR COLOR("レッド")
;　tohoK参考にしました。感謝。
;==============================================================================
@C2H(COLOR_CODE)
#FUNCTIONS
#DIM COLOR_CODE
RETURNF "#" + @"%TOSTR(COLOR_CODE, "X6")%"

@CVH(HEX_COLOR)
#FUNCTIONS
#DIM HEX_COLOR
RETURNF CONVERT(HEX_COLOR, 16)

@COLOR(ARGS:0)
#FUNCTION

;基本デザインカラー
;　選択中メニューの着色等
IF ARGS:0 == "メインカラー"
	RETURNF 0x47B0A0
	;　カテゴリータイトル色等
ELSEIF ARGS:0 == "サブカラー"
	RETURNF 0x888E7E
	;　選択不可色等、使用不可であることを示す
ELSEIF ARGS:0 == "ダークグレー"
	RETURNF 0x303030
	;　時間やムードのデフォルト色等、不可ではないがオフを示す
ELSEIF ARGS:0 == "グレー"
	RETURNF 0x505050
	;　注釈等、注目して欲しい部分が他にあるときの引き算色
ELSEIF ARGS:0 == "シルバー"
	RETURNF 0x808992
	;　基本的な強調色
ELSEIF ARGS:0 == "オレンジ"
	RETURNF 0xCE7A19
	;　基本的な強調色と対立する色（現在のメインカラーに近いため注意）
ELSEIF ARGS:0 == "シアン"
	RETURNF 0x47B3A5
	;　注意喚起・最も目立つ色
ELSEIF ARGS:0 == "イエロー"
	RETURNF 0xCFBF30
	;　強調色が足りない時用
ELSEIF ARGS:0 == "オリーブ"
	RETURNF 0x8B9E53
	;補佐色
ELSEIF ARGS:0 == "ダークオレンジ"
	RETURNF 0xC66630
ELSEIF ARGS:0 == "ダークイエロー"
	RETURNF 0x999939
ELSEIF ARGS:0 == "ダークレッド"
	RETURNF 0x942C2C
	;深陥落カラー
ELSEIF ARGS:0 == "レッド"
	RETURNF 0xD04040
ELSEIF ARGS:0 == "グリーン"
	RETURNF 0x609040
ELSEIF ARGS:0 == "パープル"
	RETURNF 0x8970DF
	;浅陥落カラー
ELSEIF ARGS:0 == "ピンク"
	RETURNF 0xD97980
ELSEIF ARGS:0 == "イエローグリーン"
	RETURNF 0x809940
ELSEIF ARGS:0 == "ブルー"
	RETURNF 0x6070DC
	;既成事実Lv2誓約カラー
ELSEIF ARGS:0 == "ライトピンク"
	RETURNF 0xF09CA3
ELSEIF ARGS:0 == "ライトグリーン"
	RETURNF 0x90A060
ELSEIF ARGS:0 == "ライトブルー"
	RETURNF 0x7090D0
	;既成事実Lv3情交カラー
ELSEIF ARGS:0 == "パステルピンク"
	RETURNF 0xE5ABBE
ELSEIF ARGS:0 == "パステルグリーン"
	RETURNF 0xA0A966
ELSEIF ARGS:0 == "パステルブルー"
	RETURNF 0x87A8DB
	;暴君に服従（服従ルートはブルー～パープル、少しずらしてシアン系）
ELSEIF ARGS:0 == "暴君カラー"
	RETURNF 0x50A0A0
	;好敵手に恋慕（恋慕ルートはピンク～レッド、少しずらしてオレンジ系）
ELSEIF ARGS:0 == "好敵手カラー"
	RETURNF 0xCC9930
	;小町を愛玩（愛玩ルートはグリーン～イエローグリーン、少しずらしてミントグリーン系）
ELSEIF ARGS:0 == "小町カラー"
	RETURNF 0x70BB90
	;シルバーのバリエーション
ELSEIF ARGS:0 == "シルバーブルー"
	RETURNF 0x90A9BF
	;季節
ELSEIF ARGS:0 == "春"
	RETURNF 0xE597B2
ELSEIF ARGS:0 == "夏"
	RETURNF 0x72AE66
ELSEIF ARGS:0 == "秋"
	RETURNF 0xC53D43
ELSEIF ARGS:0 == "冬"
	RETURNF 0x99B3DB
	;天候
ELSEIF ARGS:0 == "雪天"
	RETURNF 0x98AAAB
ELSEIF ARGS:0 == "曇天"
	RETURNF 0x708E94
ELSEIF ARGS:0 == "雨天"
	RETURNF 0x5383C3
ELSEIF ARGS:0 == "晴天"
	RETURNF 0xD9D09F
	;マップ用
ELSEIF ARGS:0 == "土"
	RETURNF 0x302010
ELSEIF ARGS:0 == "樹"
	RETURNF 0x555555
ELSEIF ARGS:0 == "畳床"
	RETURNF 0x363910
ELSEIF ARGS:0 == "板壁"
	RETURNF 0x736950
ELSEIF ARGS:0 == "板床"
	RETURNF 0x332C16
ELSEIF ARGS:0 == "石壁"
	RETURNF 0x606066
ELSEIF ARGS:0 == "石床"
	RETURNF 0x202029
ELSEIF ARGS:0 == "水場"
	RETURNF 0x105060
ELSEIF ARGS:0 == "春の樹"
	RETURNF 0xB38699
ELSEIF ARGS:0 == "夏の樹"
	RETURNF 0x0e6953
ELSEIF ARGS:0 == "秋の樹"
	RETURNF 0x652D30
ELSEIF ARGS:0 == "冬の樹"
	RETURNF 0x39435B
ELSEIF ARGS:0 == "春の土"
	RETURNF 0x283020
ELSEIF ARGS:0 == "夏の土"
	RETURNF 0x0e3129
ELSEIF ARGS:0 == "秋の土"
	RETURNF 0x403029
ELSEIF ARGS:0 == "冬の土"
	RETURNF 0x262C39
ELSEIF ARGS:0 == "春の夜の樹"
	RETURNF 0x3f212d
ELSEIF ARGS:0 == "夏の夜の樹"
	RETURNF 0x031611
ELSEIF ARGS:0 == "秋の夜の樹"
	RETURNF 0x2b0508
ELSEIF ARGS:0 == "冬の夜の樹"
	RETURNF 0x1e2330
ELSEIF ARGS:0 == "春の夜の土"
	RETURNF 0x101c0a
ELSEIF ARGS:0 == "夏の夜の土"
	RETURNF 0x051c1a
ELSEIF ARGS:0 == "秋の夜の土"
	RETURNF 0x0f0b09
ELSEIF ARGS:0 == "冬の夜の土"
	RETURNF 0x0d0f14

	;デフォルトカラー
ELSEIF ARGS:0 == "デフォルト"
	RETURNF GETDEFCOLOR()
	;エラー回避
ELSE
	RETURNF GETDEFCOLOR()
ENDIF

;==============================================================================
;◆多色使いのテキストを一行で書く関数
;　デフォルトカラーは指定不要
;　CALL COLOR_PRINTFORML("オレンジで表示", COLOR("オレンジ"))
;　CALL COLOR_PRINTFORML("ここはいつも通り", , "ここはオレンジ色", COLOR("オレンジ"), "ここもいつも通り", , "ここはブルー", COLOR("ブルー"))
;==============================================================================
@COLOR_PRINT(テキスト１, カラー１, テキスト２, カラー２, テキスト３, カラー３, テキスト４, カラー４, テキスト５, カラー５, テキスト６, カラー６, テキスト７, カラー７, テキスト８, カラー８, テキスト９, カラー９, テキスト１０, カラー１０)
#DIMS テキスト１
#DIM カラー１
#DIMS テキスト２
#DIM カラー２
#DIMS テキスト３
#DIM カラー３
#DIMS テキスト４
#DIM カラー４
#DIMS テキスト５
#DIM カラー５
#DIMS テキスト６
#DIM カラー６
#DIMS テキスト７
#DIM カラー７
#DIMS テキスト８
#DIM カラー８
#DIMS テキスト９
#DIM カラー９
#DIMS テキスト１０
#DIM カラー１０
IF テキスト１ != ""
	IF カラー１
		SETCOLOR カラー１
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト１%
ENDIF
IF テキスト２ != ""
	IF カラー２
		SETCOLOR カラー２
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト２%
ENDIF
IF テキスト３ != ""
	IF カラー３
		SETCOLOR カラー３
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト３%
ENDIF
IF テキスト４ != ""
	IF カラー４
		SETCOLOR カラー４
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト４%
ENDIF
IF テキスト５ != ""
	IF カラー５
		SETCOLOR カラー５
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト５%
ENDIF
IF テキスト６ != ""
	IF カラー６
		SETCOLOR カラー６
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト６%
ENDIF
IF テキスト７ != ""
	IF カラー７
		SETCOLOR カラー７
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト７%
ENDIF
IF テキスト８ != ""
	IF カラー８
		SETCOLOR カラー８
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト８%
ENDIF
IF テキスト９ != ""
	IF カラー９
		SETCOLOR カラー９
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト９%
ENDIF
IF テキスト１０ != ""
	IF カラー１０
		SETCOLOR カラー１０
	ELSE
		SETCOLOR GETDEFCOLOR()
	ENDIF
	PRINTFORM %テキスト１０%
ENDIF
SETCOLOR GETDEFCOLOR()

;==============================================================================
;◆多色使いのテキストを一行で書く関数
;　デフォルトカラーは指定不要
;　CALL COLOR_PRINTFORML("オレンジで表示", COLOR("オレンジ"))
;　CALL COLOR_PRINTFORML("ここはいつも通り", , "ここはオレンジ色", COLOR("オレンジ"), "ここもいつも通り", , "ここはブルー", COLOR("ブルー"))
;==============================================================================
@COLOR_PRINTL(テキスト１, カラー１, テキスト２, カラー２, テキスト３, カラー３, テキスト４, カラー４, テキスト５, カラー５, テキスト６, カラー６, テキスト７, カラー７, テキスト８, カラー８, テキスト９, カラー９, テキスト１０, カラー１０)
#DIMS テキスト１
#DIM カラー１
#DIMS テキスト２
#DIM カラー２
#DIMS テキスト３
#DIM カラー３
#DIMS テキスト４
#DIM カラー４
#DIMS テキスト５
#DIM カラー５
#DIMS テキスト６
#DIM カラー６
#DIMS テキスト７
#DIM カラー７
#DIMS テキスト８
#DIM カラー８
#DIMS テキスト９
#DIM カラー９
#DIMS テキスト１０
#DIM カラー１０
CALL COLOR_PRINT(テキスト１, カラー１, テキスト２, カラー２, テキスト３, カラー３, テキスト４, カラー４, テキスト５, カラー５, テキスト６, カラー６, テキスト７, カラー７, テキスト８, カラー８, テキスト９, カラー９, テキスト１０, カラー１０)
PRINTL

@COLOR_PRINTW(テキスト１, カラー１, テキスト２, カラー２, テキスト３, カラー３, テキスト４, カラー４, テキスト５, カラー５, テキスト６, カラー６, テキスト７, カラー７, テキスト８, カラー８, テキスト９, カラー９, テキスト１０, カラー１０)
#DIMS テキスト１
#DIM カラー１
#DIMS テキスト２
#DIM カラー２
#DIMS テキスト３
#DIM カラー３
#DIMS テキスト４
#DIM カラー４
#DIMS テキスト５
#DIM カラー５
#DIMS テキスト６
#DIM カラー６
#DIMS テキスト７
#DIM カラー７
#DIMS テキスト８
#DIM カラー８
#DIMS テキスト９
#DIM カラー９
#DIMS テキスト１０
#DIM カラー１０
CALL COLOR_PRINT(テキスト１, カラー１, テキスト２, カラー２, テキスト３, カラー３, テキスト４, カラー４, テキスト５, カラー５, テキスト６, カラー６, テキスト７, カラー７, テキスト８, カラー８, テキスト９, カラー９, テキスト１０, カラー１０)
PRINTW

;==============================================================================
;◆バーとして数値を表示する関数（Kh）
;最小値は0とする
;ARG:0=最小値 ARG:1=バーの表示上の最大値、ARG:2=バーの値、ARG:3=バーの幅、ARG:4=バーの色(オン)、ARG:5=バーの色(オフ)
;==============================================================================
@PRINT_KANNRAKU_BAR(ARG:0 = 0, ARG:1, ARG:2, ARG:3, ARG:4, ARG:5)
#DIM Ｈ = 0
#DIM Ｓ = 0
#DIM Ｖ = 0
#DIM ひとつのマス = 0
#DIM バーの幅 = 0
#DIM バーの値 = 0
#DIM 値マス = 0
#DIM 最大値 = 0

;カラー初期値調整
Ｈ = RGB_TO_H(ARG:4) - 15
Ｓ = RGB_TO_S(ARG:4) - 5
Ｖ = RGB_TO_V(ARG:4) - 20
IF Ｈ <= 0
	Ｈ = 359 + Ｈ
ENDIF
IF Ｓ <= 0
	Ｓ = 0
ENDIF
IF Ｖ <= 0
	Ｖ = 0
ENDIF

;バーの初期値調整
最大値 = ARG:1
バーの値 = ARG:2
バーの幅 = ARG:3
ひとつのマス = 0
値マス = 0

;もしバーの表示上の最大値がバー幅より小さいなら
IF 最大値 < バーの幅
	最大値 = バーの幅
ENDIF

;バーの値が一つのマスより小さいなら
IF バーの値 < ひとつのマス
	バーの値 = ひとつのマス
ENDIF

;バーひとつのマスの値を求める 最大値 ÷ バーの幅
ひとつのマス = 最大値 / バーの幅

;値は何マス分かを求める
;（値 ー 最小値）÷ バーひとつのマスの値
値マス = バーの値 / ひとつのマス
;０マス以下だったら０マスに
IF 値マス < 0
	値マス = 0
ENDIF

;色相変化のリズムカウント用
LOCAL:3 = 0

;バーの幅まで繰り返し
FOR LOCAL:0, 0, バーの幅
	;値マスの数以下なら色付け
	IF LOCAL:0 <= 値マス
		SETCOLOR HSV_TO_RGB(Ｈ, Ｓ, Ｖ)
		PRINT_RECT 0, 30, 30, 45
		LOCAL:3 += 4
		;3回に1色相変化
		IF LOCAL:3 % 2 == 0
			Ｈ += 1
			IF Ｈ >= 360
				Ｈ = 1
			ENDIF
			Ｖ += 1
			IF Ｖ >= 100
				Ｖ = 100
			ENDIF
		ENDIF
		;指定されたマスの数以上ならグレー
	ELSE
		SETCOLOR ARG:5
		PRINT_RECT 0, 40, 30, 20
	ENDIF
NEXT

RESETCOLOR

RETURN 0

;==============================================================================
;◆色つきのラインを指定する CALL COLOR_LINE(0, "グレー")
;ARG:1は線の太さ、0細、1そこそこ、2太
;==============================================================================
@COLOR_LINE(ARG:0, 指定カラー = カラー_ダークグレー)
#DIM 指定カラー = GETDEFCOLOR()
#DIM Ｈ = 0
#DIM Ｓ = 0
#DIM Ｖ = 0
#DIM グラデーション開始 = 0
#DIM 線の太さ = 0

;フォントのリセット
CALL SETFONT_MEYRYOKE
;カウンタ
LOCAL:0 = 0
;色の明るさを最大値として指定する用
LOCAL:1 = 0
;カウンタ２
LOCAL:3 = 0

IF ARG:0 == 2
	線の太さ = 30
ELSEIF ARG:0 == 1
	線の太さ = 20
ELSE
	線の太さ = 10
ENDIF

;カラー調整
Ｈ = RGB_TO_H(指定カラー)
Ｓ = RGB_TO_S(指定カラー)
Ｖ = RGB_TO_V(指定カラー)

;一行に入る文字数は49文字分rectは全角１文字が100
グラデーション開始 = 6400 - Ｖ / 5 * 100

IF グラデーション開始 <= 0
	グラデーション開始 = 100
ENDIF

;グラデーション開始する位置まで同じ色
SETCOLOR HSV_TO_RGB(Ｈ, Ｓ, Ｖ)
PRINT_RECT 0, 50-(線の太さ/2), グラデーション開始, 線の太さ

;最大値
LOCAL:1 = Ｖ / 5
FOR LOCAL:0, 0, LOCAL:1
	SETCOLOR HSV_TO_RGB(Ｈ, Ｓ, Ｖ)
	PRINT_RECT 0, 50-(線の太さ/2), 100, 線の太さ
	LOCAL:3 += 1
	;3回に1色相変化
	IF LOCAL:3 % 3 == 0
		Ｈ += 1
		IF Ｈ >= 360
			Ｈ = 1
		ENDIF
	ENDIF
	Ｖ -= 5
NEXT

PRINTL

RESETCOLOR

RETURN 0

;==============================================================================
;◆フォント・emuera.configの指定がＭＳ ゴシック（デフォルトの指定）の場合
;　MeiryoKe_Consoleがインストールされていたらセットする CALL SETFONT_MEYRYOKE
;==============================================================================
@SETFONT_MEYRYOKE
;デフォルト指定のフォントをチェック
GETFONT
;プレイヤーにより変更されていなければ
IF RESULTS == "ＭＳ ゴシック"
	;インストール確認
	CHKFONT "MeiryoKe_Console"
	;存在したら
	IF RESULT
		SETFONT "MeiryoKe_Console"
	ENDIF
ENDIF

RETURN 0

;==============================================================================
;◆タイトルラベル CALL TITLE_LABEL_START("タイトル", 1 , "画像名", "説明文簡易表示")
;ARGS:0 タイトル
; ARG:1 改行＆末尾のライン表示したくないときはARG:1を1にして
;       改行とラインは別に表示する（タイトルの横にボタンを置くときやフォントの色変えたいときの指定）
; ARG:2 画像パターン（省略するとデフォルト・画像を変えたい場合に指定する・現状なし）
;==============================================================================
@TITLE_LABEL_START(ARGS:0, ARG:1, ARGS:2, ARGS:3)
CALL COLOR_LINE(0, GETDEFCOLOR())
PRINT_SPACE 20
IF ARG:1
	PRINTFORM %ARGS:0%
ELSE
	PRINTFORM %ARGS:0%
	IF ARGS:3 != ""
		SETCOLOR COLOR("シルバー")
		PRINTFORML  %ARGS:3%
		RESETCOLOR
	ENDIF
	CALL COLOR_LINE
ENDIF

RETURN 0

;==============================================================================
;◆タイトルラベル・汎用カテゴリタイトル表示   CALL TITLE_CATEGORY_GENERAL("親交", 4)
;==============================================================================
@TITLE_CATEGORY_GENERAL(ARGS:0, ARG:1)
PRINT_SPACE 20
SETCOLOR COLOR("サブカラー")
LOCALS:0 = ◇%ARGS:0%◇
PRINTFORM %LOCALS:0, ARG:1, LEFT%
RESETCOLOR
PRINT_SPACE 80

;==============================================================================
;◆タイトルラベル・指定されたテキスト(ARGS:0)を指定された文字数(ARG:1)になるまでスペースで埋めて-をつける
;　コンフィグとかヘルプのデザイン整理用
;　%FILL_SPACE("テキスト", 24)%
;==============================================================================
@FILL_SPACE(ARGS:0, ARG:1)
#FUNCTIONS
;指定されたテキストの文字数をチェック
LOCALS:0 = %ARGS:0%
STRLENFORM %LOCALS:0%
LOCAL:1 = RESULT:0

FOR LOCAL:0, 0, ARG:1 - LOCAL:1
	LOCALS:0 += " "
NEXT
LOCALS:0 = %LOCALS:0%-

RETURNF LOCALS:0


code:
;---------------------------
;ARG:0の陰毛目標値をARG:1に設定する関数
;---------------------------
@SET_INMOU_DEFAULT(ARG:0, ARG:1)
SIF !INRANGE_INMOU(ARG:1)
	RETURN 0
TALENT:(ARG:0):陰毛目標値 = ARG:1
RETURN 1

;---------------------------
;ARG:0の陰毛現在値を取得する
;ハート型は標準に読み替えられる
;---------------------------
@GET_INMOU(ARG:0)
#FUNCTION
SIF TALENT:(ARG:0):陰毛現在値 == 陰毛_ハート型
	RETURNF 陰毛_標準
RETURNF TALENT:(ARG:0):陰毛現在値

;---------------------------
;ARG:0の陰毛現在値が目標値に向けて変化する関数
;---------------------------
@INMOU_GROW(ARG:0)
#DIM 現在
#DIM 目標

;パイパンなら育たない
SIF !IS_GROW_INMOU(ARG:0)
	RETURN 0

現在 = TALENT:(ARG:0):陰毛現在値
目標 = TALENT:(ARG:0):陰毛目標値

LOCAL:1 = 0

;ハート型は標準相当
IF 現在 == 陰毛_ハート型
	現在 = 陰毛_標準
ENDIF
IF 目標 == 陰毛_ハート型
	目標 = 陰毛_標準
	LOCAL:1 = 1
ENDIF

;目標より少ない場合は1育つ
IF 目標 - 現在 > 0
	現在 ++
;目標より育っている場合は刈る
ELSEIF 目標 - 現在 < 0
	現在 = 目標
ENDIF

;ハート型の場合、標準相当になっていたら刈り揃える
IF 目標 == 現在 && LOCAL:1 == 1
	現在 = 陰毛_ハート型
ENDIF

TALENT:(ARG:0):陰毛現在値 = 現在
RETURN 1

;---------------------------
;ARG:0の陰毛が成長するか
;---------------------------
@IS_GROW_INMOU(ARG:0)
#FUNCTION
RETURNF TALENT:(ARG:0):陰毛現在値 != -1

;---------------------------
;ARG:0に対応する陰毛の成長度合いを返す
;---------------------------
@GET_INMOU_NAME(ARG:0)
#FUNCTIONS
SELECTCASE ARG:0
	CASE 陰毛_パイパン
		RETURNF "パイパン"
	CASE 陰毛_つるつる
		RETURNF "つるつる"
	CASE 陰毛_うっすら
		RETURNF "うっすら"
	CASE 陰毛_柔毛
		RETURNF "柔毛"
	CASE 陰毛_ふんわり
		RETURNF "ふんわり"
	CASE 陰毛_標準
		RETURNF "標準"
	CASE 陰毛_多め
		RETURNF "多め"
	CASE 陰毛_ふさふさ
		RETURNF "ふさふさ"
	CASE 陰毛_もっさり
		RETURNF "もっさり"
	CASE 陰毛_剛毛
		RETURNF "剛毛"
	CASE 陰毛_尻毛
		RETURNF "尻まで毛まみれ"
	CASE 陰毛_ハート型
		RETURNF "ハート型"
	CASEELSE
		RETURNF "不明"
ENDSELECT

;---------------------------
;与えられた引数の成長度合いが存在するか
;---------------------------
@INRANGE_INMOU(ARG:0)
#FUNCTION
RETURNF GET_INMOU_NAME(ARG:0) != "不明"

;---------------------------
;与えられたキャラの陰毛具合がどんなものか返す
;-2 無毛 -1 薄め 0 標準 1 多め 2剛毛 3 ハート
;---------------------------
@GET_INMOU_LEVEL(ARG:0)
#FUNCTION
SELECTCASE TALENT:(ARG:0):陰毛現在値
	CASE 陰毛_パイパン, 陰毛_つるつる
		RETURNF -2
	CASE 陰毛_うっすら, 陰毛_柔毛, 陰毛_ふんわり
		RETURNF -1
	CASE 陰毛_標準
		RETURNF 0
	CASE 陰毛_多め, 陰毛_ふさふさ, 陰毛_もっさり
		RETURNF 1
	CASE 陰毛_剛毛, 陰毛_尻毛
		RETURNF 2
	CASE 陰毛_ハート型
		RETURNF 3
ENDSELECT

;---------------------------
;陰毛がハート型かを単純に返す
;---------------------------
@IS_INMOU_HEART(ARG:0)
#FUNCTION
RETURNF TALENT:(ARG:0):陰毛現在値 == 陰毛_ハート型

;---------------------------
;陰毛の状態を画面に出力する
;---------------------------
@PRINT_INMOU(ARG:0)
LOCALS:0 = %GET_INMOU_NAME(TALENT:(ARG:0):陰毛現在値)%
CALL COLOR_PRINT(@"%LOCALS:0%", LOCALS:0 == "ハート型" ? カラー_ピンク # GETDEFCOLOR())


code:
;-------------------------------------------------
;名前の変更
;-------------------------------------------------
@CHANGE_NAME(ID)
#DIM  ID
#DIMS DYNAMIC INPUT_NAME
#DIMS DYNAMIC INPUT_CALLNAME
#DIM  DYNAMIC FIRST_LINE

FIRST_LINE = LINECOUNT
DO
	PRINTFORML %CALLNAME:ID%の新しい名前を入力してください
	INPUTS
	INPUT_NAME '= RESULTS
	CLEARLINE 1
	IF INPUT_NAME == ""
		INPUT_NAME '= CALLNAME:ID
	ENDIF
	PRINTFORML 新しい名前は「%INPUT_NAME%」でよろしいですか？
	CALL ASK_YN
	IF RESULT == 0
		BREAK
	ENDIF
	CLEARLINE LINECOUNT - FIRST_LINE
LOOP 1

CSTR:ID:姓     '= ""
CSTR:ID:名     '= ""
CSTR:ID:姓カナ '= ""
CSTR:ID:名カナ '= ""

CSTR:ID:愛称 '= INPUT_NAME
NAME:ID      '= INPUT_NAME

FIRST_LINE = LINECOUNT
DO
	PRINTFORML %CALLNAME:ID%の新しい呼び名を入力してください
	INPUTS
	INPUT_CALLNAME '= RESULTS
	CLEARLINE 1
	IF INPUT_CALLNAME == ""
		INPUT_CALLNAME '= CALLNAME:ID
	ENDIF
	PRINTFORML 新しい呼び名は「%INPUT_CALLNAME%」でよろしいですか？
	CALL ASK_YN
	IF RESULT == 0
		BREAK
	ENDIF
	CLEARLINE LINECOUNT - FIRST_LINE
LOOP 1

CSTR:ID:CALLNAMEカナ '= ""
CALLNAME:ID '= INPUT_CALLNAME

;-------------------------------------------------
;名前の変更(ランダム)
;-------------------------------------------------
;・NAME_TYPEで名前の種類を指定可能(0:洋名 1:和名 2:中華)
;・固定_姓, 固定_名, 固定_字を指定すると一部固定一部ランダムにできる
;  3つとも指定するとランダムの意味がなくなるけど特に例外処理はしない
;・名称固定は,で区切ることでルビも指定可能
;  例.固定_名 = "芒,ススキ" → 名:芒 , 名カナ:ススキ
;・姓名逆転指定、ミドルネーム指定でTALENT:姓名逆転設定、TALENT:ミドルネーム洋風を指定可能(0 or 1)
@CHANGE_NAME_RANDOM(ID, ARG_NAME_TYPE = -1, 固定_姓 = "", 固定_名 = "", 固定_字 = "", 姓名逆転指定 = -1, ミドルネーム指定 = -1)
;引数
#DIM  ID
#DIM  ARG_NAME_TYPE
#DIMS 固定_姓
#DIMS 固定_名
#DIMS 固定_字
#DIM  姓名逆転指定
#DIM  ミドルネーム指定
;名前の種類名リスト(処理の簡略化のために末尾に最初の要素を追加)
#DIMS  CONST ARY_NAME_TYPE = "洋名", "和名", "中華", "洋名"
;設定退避
#DIM  DYNAMIC REDRAW_TEMP
#DIM  DYNAMIC TARGET_TEMP
#DIM  DYNAMIC FIRST_LINE
;選択肢関連
#DIM  DYNAMIC ASK_RESULT
#DIMS DYNAMIC ARY_ASK_OPT, 5
#DIM  DYNAMIC ARY_ASK_JDG, 5
;オプション項目用
#DIM  DYNAMIC NAME_TYPE
#DIM  DYNAMIC CALLNAME_KANA
#DIM  DYNAMIC NAME_ONLY
#DIMS DYNAMIC 姓_TEMP
#DIMS DYNAMIC 字_TEMP
#DIMS DYNAMIC NAME_TEMP
#DIMS DYNAMIC NAMEKANA_TEMP
;実行制御
#DIM  DYNAMIC CHANGE_NAME = 1
#DIM  DYNAMIC FLAG_RESTART
;その他
#DIMS DYNAMIC ARY_SPLIT_FIXED_NAME, 2

;---------------------------
; 事前処理
;---------------------------
;初回だけ実行(RESTART時に実行しない)
IF !FLAG_RESTART
	;TARGET, REDRAW情報を退避＆設定
	TARGET_TEMP = TARGET
	TARGET = ID
	REDRAW_TEMP = CURRENTREDRAW()
	REDRAW 0

	;描画開始地点の行数を記憶
	FIRST_LINE = LINECOUNT

	;「名前の種類」の初期化
	;・引数で指定がある場合は引数をそのまま使用
	;・引数で指定がない場合は初期値に「洋名」を設定
	IF ARG_NAME_TYPE == -1
		NAME_TYPE = 0
	ELSE
		NAME_TYPE = ARG_NAME_TYPE
	ENDIF
;RESTART時
ELSE
	;RESTART前に描画した行の削除
	CLEARLINE LINECOUNT - FIRST_LINE
ENDIF

;---------------------------
; ランダム命名処理
;---------------------------
;名前変更判定(RESTART用)
IF CHANGE_NAME
	;■ランダム命名実行
	CALL RANDOM_CHARA_NAMING(NAME_TYPE)

	;■引数の反映
	IF 固定_姓 + 固定_名 + 固定_字 != ""
		;引数による名前の固定
		IF 固定_姓 != ""
			SPLIT 固定_姓, ",", ARY_SPLIT_FIXED_NAME
			CSTR:ID:姓     '= ARY_SPLIT_FIXED_NAME:0
			CSTR:ID:姓カナ '= ARY_SPLIT_FIXED_NAME:1
		ENDIF
		IF 固定_名 != ""
			SPLIT 固定_名, ",", ARY_SPLIT_FIXED_NAME
			CSTR:ID:名     '= ARY_SPLIT_FIXED_NAME:0
			CSTR:ID:名カナ '= ARY_SPLIT_FIXED_NAME:1
		ENDIF
		IF 固定_字 != ""
			SPLIT 固定_字, ",", ARY_SPLIT_FIXED_NAME
			CSTR:ID:字     '= ARY_SPLIT_FIXED_NAME:0
			CSTR:ID:字カナ '= ARY_SPLIT_FIXED_NAME:1
		ENDIF
		;変更した内容でNAME, CALLNAMEを更新
		SELECTCASE NAME_TYPE
			CASE 2
				;■中華
				;姓名を合わせてNAMEを設定
				NAME:ID          '= CSTR:ID:姓     + CSTR:ID:名
				CSTR:ID:NAMEカナ '= CSTR:ID:姓カナ + CSTR:ID:名カナ
				CALLNAME:ID      '= CSTR:ID:姓     + CSTR:ID:名
			CASEELSE
				;■洋名, 和名
				NAME:ID          '= CSTR:ID:名
				CSTR:ID:NAMEカナ '= CSTR:ID:名カナ
				CALLNAME:ID      '= CSTR:ID:名
		ENDSELECT
	ENDIF
	;名前の順序の指定
	IF 姓名逆転指定 >= 0
		TALENT:ID:姓名逆転 = 姓名逆転指定
	ENDIF
	IF ミドルネーム指定 >= 0
		TALENT:ID:ミドルネーム洋風 = ミドルネーム指定
	ENDIF
	;切替用に退避
	姓_TEMP '= CSTR:ID:姓
	字_TEMP '= CSTR:ID:字
	NAME_TEMP     '= NAME:ID
	NAMEKANA_TEMP '= CSTR:ID:NAMEカナ
ENDIF

;------------------
; 名前の切替処理
;------------------
;名前だけにする
IF NAME_ONLY
	IF NAME_TYPE == 2
		CSTR:ID:字 '= ""
	ELSE
		CSTR:ID:姓 '= ""
		CSTR:ID:字 '= ""
	ENDIF
ELSE
	IF NAME_TYPE == 2
		CSTR:ID:字 '= 字_TEMP
	ELSE
		CSTR:ID:姓 '= 姓_TEMP
		CSTR:ID:字 '= 字_TEMP
	ENDIF
ENDIF

;呼び名をカナにする
IF CALLNAME_KANA
	CALLNAME:ID      '= NAMEKANA_TEMP
	NAME:ID          '= NAMEKANA_TEMP
	CSTR:ID:NAMEカナ '= ""
ELSE
	CALLNAME:ID      '= NAME_TEMP
	NAME:ID          '= NAME_TEMP
	CSTR:ID:NAMEカナ '= NAMEKANA_TEMP
ENDIF

;---------------------------
; 命名結果の確認/選択処理
;---------------------------
;■現在の内容を表示
PRINTL
PRINTFORML 新しい名前は「%GET_FULL_NAME(ID)%」、呼び名は「%CALLNAME:ID%」でよろしいですか？
PRINTL
;■選択肢の設定
VARSET ARY_ASK_JDG, 1
;基本セット
ARY_ASK_OPT:0 '= "[はい]"
ARY_ASK_OPT:2 '= "[いいえ (再抽選)]"

;名前だけにする
IF NAME_ONLY
	ARY_ASK_OPT:1 '= "☑名前だけにする"
ELSE
	ARY_ASK_OPT:1 '= "□名前だけにする"
ENDIF

;呼び名をカナにする
;・ルビを表示する名前の場合のみ有効
IF CALLNAME_KANA
	ARY_ASK_OPT:3 '= "☑呼び名をカナにする"
ELSE
	ARY_ASK_OPT:3 '= "□呼び名をカナにする"
ENDIF
IF !(CSTR:ID:名カナ != "" && NAME:ID != CSTR:ID:NAMEカナ)
	ARY_ASK_JDG:3 = 0
ENDIF

;名前の種類の変更
;・名前の種類が未指定の場合のみ有効
ARY_ASK_OPT:4 '= @"[名前の種類を変更]"
IF !(ARG_NAME_TYPE == -1)
	ARY_ASK_JDG:4 = 0
ENDIF

;■選択肢を表示
{
CALL ASK_MULTI_JUDGE_TWO_COLUMN(
	ARY_ASK_OPT:0, ARY_ASK_JDG:0,
	ARY_ASK_OPT:1, ARY_ASK_JDG:1,
	ARY_ASK_OPT:2, ARY_ASK_JDG:2,
	ARY_ASK_OPT:3, ARY_ASK_JDG:3,
	ARY_ASK_OPT:4, ARY_ASK_JDG:4
)
}
ASK_RESULT = RESULT

;----------------------
; 選択結果による処理
;----------------------
SELECTCASE ASK_RESULT
CASE 0
	;■はい
	;リスタートせずに終了
	FLAG_RESTART = 0
CASE 2
	;■いいえ
	;リスタートして名前を再生成
	FLAG_RESTART = 1
	CHANGE_NAME = 1
CASE 1
	;■名前だけにする
	;名前だけにするフラグの切替
	NAME_ONLY = ROUND_INCREMENT(NAME_ONLY, 0, 1)
	;リスタートして再確認(名前を再生成しない)
	FLAG_RESTART = 1
	CHANGE_NAME = 0
CASE 3
	;■呼び名の変更
	CALLNAME_KANA = ROUND_INCREMENT(CALLNAME_KANA, 0, 1)
	;リスタートして再確認(名前を再生成しない)
	FLAG_RESTART = 1
	CHANGE_NAME = 0
CASE 4
	;■名前タイプの変更
	NAME_TYPE = ROUND_INCREMENT(NAME_TYPE, 0, 2)
	;リスタートして名前を再生成
	FLAG_RESTART = 1
	CHANGE_NAME = 1
ENDSELECT

;----------------------
; 決定 or リスタート
;----------------------
;■リスタート(関数の最初に戻る)
SIF FLAG_RESTART
	RESTART

;■状態を復元して終了
TARGET = TARGET_TEMP
REDRAW REDRAW_TEMP
RETURN

;-------------------------------------------------
;フルネーム(ルビ付)の取得
;-------------------------------------------------
@GET_FULL_NAME(ID, WITH_RUBY = 1)
#FUNCTIONS
#DIM  ID
#DIM  WITH_RUBY
#DIMS FULL_NAME
#DIM  ARY_CSTR_NUM_NAME, 3
#DIM  ARY_CSTR_NUM_KANA, 3
#DIM  CSTR_NUM_NAME
#DIM  CSTR_NUM_KANA
#DIM  L_CNT
#DIM  FULL_NAME_LEN
#DIM  CSTR_NUM_姓
#DIM  CSTR_NUM_名
#DIM  CSTR_NUM_字
#DIM  CSTR_NUM_姓カナ
#DIM  CSTR_NUM_名カナ
#DIM  CSTR_NUM_字カナ

;使用するCSTRの要素番号を取得
CSTR_NUM_姓     = GETNUM(CSTR, "姓")
CSTR_NUM_名     = GETNUM(CSTR, "名")
CSTR_NUM_字     = GETNUM(CSTR, "字")
CSTR_NUM_姓カナ = GETNUM(CSTR, "姓カナ")
CSTR_NUM_名カナ = GETNUM(CSTR, "名カナ")
CSTR_NUM_字カナ = GETNUM(CSTR, "字カナ")

VARSET FULL_NAME
;姓,名が非設定で名前と呼び名が一致する場合はANAMEを使用
IF CSTR:ID:姓 == "" && CSTR:ID:名 == "" && NAME:ID == CALLNAME:ID
	FULL_NAME '= ANAME(ID)
ELSE
	;■名前の順番を決定
	;姓名逆転しない
	IF !TALENT:ID:姓名逆転
		;「ミドルネームの並び順を洋風にする」(和名)
		IF TALENT:ID:ミドルネーム洋風
			ARY_CSTR_NUM_NAME = CSTR_NUM_姓    , CSTR_NUM_字    , CSTR_NUM_名
			ARY_CSTR_NUM_KANA = CSTR_NUM_姓カナ, CSTR_NUM_字カナ, CSTR_NUM_名カナ
		;「ミドルネームの並び順を洋風にしない」(中華)
		ELSE
			ARY_CSTR_NUM_NAME = CSTR_NUM_姓    , CSTR_NUM_名    , CSTR_NUM_字
			ARY_CSTR_NUM_KANA = CSTR_NUM_姓カナ, CSTR_NUM_名カナ, CSTR_NUM_字カナ
		ENDIF
	;姓名逆転する
	ELSE
		;「ミドルネームの並び順を洋風にする」(洋名)
		IF TALENT:ID:ミドルネーム洋風
			ARY_CSTR_NUM_NAME = CSTR_NUM_名    , CSTR_NUM_字    , CSTR_NUM_姓
			ARY_CSTR_NUM_KANA = CSTR_NUM_名カナ, CSTR_NUM_字カナ, CSTR_NUM_姓カナ
		;「ミドルネームの並び順を洋風にしない」(？？)
		ELSE
			ARY_CSTR_NUM_NAME = CSTR_NUM_名    , CSTR_NUM_姓    , CSTR_NUM_字
			ARY_CSTR_NUM_KANA = CSTR_NUM_名カナ, CSTR_NUM_姓カナ, CSTR_NUM_字カナ
		ENDIF
	ENDIF

	;■決定した順番で名前を追加
	FOR L_CNT, 0, 3
		CSTR_NUM_NAME = ARY_CSTR_NUM_NAME:L_CNT
		CSTR_NUM_KANA = ARY_CSTR_NUM_KANA:L_CNT

		;■空の項目は飛ばす
		SIF CSTR:ID:CSTR_NUM_NAME == ""
			CONTINUE

		;■名前の追加
		;余白の追加
		SIF FULL_NAME != ""
			FULL_NAME += " "

		;名前を追加
		FULL_NAME += CSTR:ID:CSTR_NUM_NAME

		;■ルビの追加
		;引数か設定が「表示しない」の場合は表示しない
		SIF !WITH_RUBY || !FLCONFIG:ルビ表示
			CONTINUE

		;表示する内容がない場合は表示しない
		SIF CSTR:ID:CSTR_NUM_KANA == ""
			CONTINUE

		;表示する必要がない場合は表示しない (本文とルビが同じ)
		SIF CSTR:ID:CSTR_NUM_NAME == CSTR:ID:CSTR_NUM_KANA
			CONTINUE

		;表示する必要がない場合は表示しない (カタカナに変換した本文とルビが同じ)
		;・設定が「漢字を含む場合のみ表示する」のみ判定
		SIF FLCONFIG:ルビ表示 == 1 && TOKANA(CSTR:ID:CSTR_NUM_NAME) == CSTR:ID:CSTR_NUM_KANA
			CONTINUE

		;ルビを追加
		FULL_NAME += @"(%TOHALF(CSTR:ID:CSTR_NUM_KANA)%)"
	NEXT

	;名前が空だった場合はANAMEを使用
	IF FULL_NAME == ""
		;ANAME > 愛称 or NAME
		FULL_NAME '= ANAME(ID)
	ENDIF
ENDIF
RETURNF FULL_NAME

;-------------------------------------------------
;選択肢を2段組で表示し入力結果を返す関数
;・他のASK_*****系と違い、選択肢に[]を付与しない
;-------------------------------------------------
@ASK_MULTI_JUDGE_TWO_COLUMN(ARGS:0, ARG:0, ARGS:1, ARG:1, ARGS:2, ARG:2, ARGS:3, ARG:3, ARGS:4, ARG:4, ARGS:5, ARG:5, ARGS:6, ARG:6, ARGS:7, ARG:7, ARGS:8, ARG:8, ARGS:9, ARG:9, ARGS:10, ARG:10, ARGS:11, ARG:11, ARGS:12, ARG:12, ARGS:13, ARG:13, ARGS:14, ARG:14, ARGS:15, ARG:15, ARGS:16, ARG:16, ARGS:17, ARG:17, ARGS:18, ARG:18, ARGS:19, ARG:19, ARGS:20, ARG:20, ARGS:21, ARG:21, ARGS:22, ARG:22, ARGS:23, ARG:23, ARGS:24, ARG:24, ARGS:25, ARG:25, ARGS:26, ARG:26, ARGS:27, ARG:27, ARGS:28, ARG:28, ARGS:29, ARG:29)
#DIM  CONST OPTIONS_MAX = 30
#DIM  INPUT_VALUE
#DIM  REDRAW_TEMP
#DIM  OPT_LEN_MAX
#DIM  SELECTED_OPT_COUNT
#DIM  L_CNT
#DIM  INPUT_NO
#DIMS BUTTON_TEXT

;REDRAW設定を変更
REDRAW_TEMP = CURRENTREDRAW()
REDRAW 0

;選択肢表示前のチェックループ
;・右側の表示位置調整用に選択肢の長さをチェック
;・選択可能な選択肢が1つでもあるかチェック
OPT_LEN_MAX = 0
SELECTED_OPT_COUNT = 0
FOR L_CNT, 0, OPTIONS_MAX
	;選択可能な選択肢をカウント
	SIF ARG:L_CNT
		SELECTED_OPT_COUNT ++

	;偶数番号(左側)のみ選択肢の長さをチェック
	SIF L_CNT % 2 == 1
		CONTINUE
	SIF STRLENS(ARGS:L_CNT) > OPT_LEN_MAX
		OPT_LEN_MAX = STRLENS(ARGS:L_CNT)
NEXT

;選択可能な選択肢が1つもない場合、入力ループから抜けられなくなるのでエラー通知
SIF !SELECTED_OPT_COUNT
	THROW 関数「ASK_MULTI_JUDGE_TWO_COLUMN」：選択可能な選択肢がありません

;選択肢を表示
FOR L_CNT, 0, OPTIONS_MAX
	;ARGSの参照位置を計算

	;選択肢が設定されている場合は表示
	IF ARGS:L_CNT != ""
		;位置調整
		PRINTS " " * 2
		BUTTON_TEXT = %ARGS:L_CNT%
		;ボタンを表示：選択可能
		IF ARG:L_CNT
			PRINTBUTTON ARGS:L_CNT, L_CNT
		;ボタンを表示：選択不可
		ELSE
			SETCOLOR 0x606060
			PRINTPLAINFORM %ARGS:L_CNT%
			RESETCOLOR
		ENDIF

		;左側：右側用に位置調整
		IF L_CNT % 2 == 0
			PRINTS " " * (OPT_LEN_MAX - STRLENS(ARGS:L_CNT))
		;右側：改行
		ELSE
			PRINTL
		ENDIF
	ENDIF
NEXT

;入力ループ
DO
	INPUT
	INPUT_NO = RESULT
	;再入力条件
	;引数の範囲外、選択肢が設定されていない番号、選択不可の選択肢
	IF !INRANGE(INPUT_NO ,0 ,OPTIONS_MAX - 1) || ARGS:INPUT_NO == "" || !ARG:INPUT_NO
		CLEARLINE 1
	ELSE
		BREAK
	ENDIF
LOOP 1

CLEARLINE 1
SETCOLOR 0xFFFF00
PRINTS @"    ⇒%ARGS:INPUT_VALUE%"
RESETCOLOR
PRINTL

;REDRAW設定を復元
REDRAW REDRAW_TEMP

;結果を返す
RETURN INPUT_NO


code:
@PIERCE_MENU(対象, 編集モード = 0)
#DIM 対象
#DIM 編集モード
#DIM FIRST_LINE

FIRST_LINE = LINECOUNT

FOR LOCAL, 0, ピアス_最大ビット + 1
	IF IS_PIERCED(対象, LOCAL)
		PRINTFORML [{LOCAL:0, 3}] %GET_PIERCE_NAME(LOCAL:0)%のピアスを外す
	ELSEIF IS_HOLED(対象, LOCAL) && CAN_PIERCE(対象, LOCAL) && (編集モード || ITEM:ピアス)
		PRINTFORML [{LOCAL:0, 3}] %GET_PIERCE_NAME(LOCAL:0)%にピアスをつける
	ENDIF

	IF IS_HOLED(対象, LOCAL) && 編集モード
		PRINTFORML [{LOCAL:0 + 100, 3}] %GET_PIERCE_NAME(LOCAL:0)%のピアス穴を塞ぐ
	ENDIF
	SIF CAN_PIERCE(対象, LOCAL) && (編集モード || ITEM:ピアス)
		PRINTFORML [{LOCAL:0, 3}] %GET_PIERCE_NAME(LOCAL:0)%にピアス穴を開け、ピアスをつける
NEXT

PRINTFORML [99] 戻る

INPUT

IF RESULT == 99
	PRINTFORML やはりやめておいた
	RETURN 0
ELSEIF RESULT < 100 && IS_PIERCED(対象, RESULT) && 編集モード
	CALL REMOVE_PIERCE(対象, RESULT)
	IF 編集モード
		CLEARLINE LINECOUNT - FIRST_LINE
		RESTART
	ELSE
		ITEM:ピアス ++
		RETURN 1
	ENDIF
ELSEIF RESULT < 100 && CAN_PIERCE(対象, RESULT) && (編集モード || ITEM:ピアス)
	CALL SET_PIERCE(対象, RESULT)
	IF 編集モード
		CLEARLINE LINECOUNT - FIRST_LINE
		RESTART
	ELSE
		ITEM:ピアス --
		RETURN 1
	ENDIF
ELSEIF IS_HOLED(対象, RESULT - 100) && 編集モード
	LOCAL = RESULT - 100
	PRINTFORML %ANAME(対象)%の%GET_PIERCE_NAME(LOCAL)%のピアス穴を塞いだ
	CALL CLEAR_PIERCE_HOLE(対象, LOCAL)
	CLEARLINE LINECOUNT - FIRST_LINE
	RESTART
ENDIF

CLEARLINE LINECOUNT - FIRST_LINE
RESTART

;---------------------------
;ARG:0のARG:1ビットにピアスを通す関数
;穴があいてなければ開ける
;穴を開けて通したら2、通しただけなら1、無理なら0が返る
;ARG:2はメッセージを表示するフラグ
;---------------------------
@SET_PIERCE(ARG:0, ARG:1, ARG:2 = 1)
LOCAL:0 = 0
LOCALS:0 = %GET_PIERCE_NAME(ARG:1)%
SIF !CAN_PIERCE(ARG:0, ARG:1)
	RETURN LOCAL:0
IF !IS_HOLED(ARG:0, ARG:1)
	SIF ARG:2
		CALL COLOR_PRINTW(@"%ANAME(ARG:0)%の%LOCALS:0%に穴が開けられた……", カラー_注意)
	LOCAL:0 ++
	SETBIT TALENT:(ARG:0):ピアス穴, ARG:1
ENDIF
SIF ARG:2
	CALL COLOR_PRINTW(@"%ANAME(ARG:0)%の%LOCALS:0%にピアスが取り付けられた……", カラー_注意)
SETBIT TALENT:(ARG:0):ピアス, ARG:1
LOCAL:0 ++
RETURN LOCAL:0

;---------------------------
;ARG:0のARG:1ビットのピアスを外す関数
;もちろん穴は消えない
;外したら1、そもそも付いていなかったら0が返る
;ARG:2はメッセージを表示するフラグ
;---------------------------
@REMOVE_PIERCE(ARG:0, ARG:1, ARG:2 = 1)
IF IS_PIERCED(ARG:0, ARG:1)
	SIF ARG:2
		CALL COLOR_PRINTW(@"%ANAME(ARG:0)%の%GET_PIERCE_NAME(ARG:1)%からピアスを外した……", カラー_注意)
	CLEARBIT TALENT:(ARG:0):ピアス, ARG:1
	RETURN 1
ENDIF
RETURN 0

;---------------------------
;ARG:0ビットに対応する装着部位の文字列を返す関数
;---------------------------
@GET_PIERCE_NAME(ARG:0)
#FUNCTIONS
SELECTCASE ARG:0
	CASE ピアス_鼻
		RETURNF "鼻"
	CASE ピアス_耳
		RETURNF "耳"
	CASE ピアス_舌
		RETURNF "舌"
	CASE ピアス_乳首
		RETURNF "乳首"
	CASE ピアス_へそ
		RETURNF "へそ"
	CASE ピアス_クリトリス
		RETURNF "クリトリス"
	CASE ピアス_ラビア
		RETURNF "ラビア"
	CASE ピアス_ペニス
		RETURNF "ペニス"
	CASEELSE
		RETURNF "不明"
ENDSELECT

;---------------------------
;ARG:0に、ARG:2 ~ ARG:8番の優先順でピアスを通す関数
;ARG:1を1にするとメッセージを表示。
;一部だけ設定するとかいうこともできる
;取り付けた場合は、取り付けたピアス穴の部位ビットが返る
;---------------------------
@SET_PIERCE_RANKED(ARG:0, ARG:1, ARG:2 = 99, ARG:3 = 99, ARG:4 = 99, ARG:5 = 99, ARG:6 = 99, ARG:7 = 99, ARG:8 = 99, ARG:9 = 99)
FOR LOCAL:0, 2, ピアス_最大ビット + 3
	CALL SET_PIERCE(ARG:0, ARG:(LOCAL:0), ARG:1)
	SIF RESULT
		RETURN ARG:(LOCAL:0)
NEXT
RETURN -1

;---------------------------
;ARG:0番のキャラの、ランダムな部位にピアスを取り付ける
;ARG:1はメッセージ表示フラグ。0なら非表示。
;戻り値は取り付けた部位ビット
;どこも空いてなかったら-1が戻ってくるので、その辺考えずに単純にGET_PIERCE_NAMEしないこと
;---------------------------
@SET_PIERCE_RANDOM(ARG:0, ARG:1  = 1)
#DIM 空き部位, ピアス_最大ビット + 1
#DIM 空き数
VARSET 空き部位, -1
VARSET 空き数
FOR LOCAL, 0, ピアス_最大ビット + 1
	IF CAN_PIERCE(ARG:0, LOCAL:0)
		空き部位:空き数 = LOCAL:0
		空き数 ++
	ENDIF
NEXT

;どこも空いてなかったら-1
SIF 空き数 == 0
	RETURN -1

LOCAL = 空き部位:(RAND:空き数)
CALL SET_PIERCE(ARG:0, LOCAL, ARG:1)
SIF RESULT
	RETURN LOCAL
;多分こないはず
RETURN -1

;---------------------------
;ARG:0番のキャラが、ARG:1番のビットにピアスできるか
;---------------------------
@CAN_PIERCE(ARG:0, ARG:1)
#FUNCTION
;範囲外なら不可
SIF ARG:1 < 0 || ピアス_最大ビット < ARG:1
	RETURNF 0
;装着済みなら不可
SIF IS_PIERCED(ARG:0, ARG:1)
	RETURNF 0
;ラビアピアスはヴァギナが必要
SIF ARG:1 == ピアス_ラビア
	RETURNF HAS_VAGINA(ARG:0)
;クリトリスはペニスがあってはならない
SIF ARG:1 == ピアス_クリトリス
	RETURNF !HAS_PENIS(ARG:0)
;ペニスはチンポがなくてはならない
SIF ARG:1 == ピアス_ペニス
	RETURNF HAS_PENIS(ARG:0)
;それ以外は通す
RETURNF 1

;---------------------------
;ARG:0番のキャラが、どこでもいいからピアスできるか
;---------------------------
@CAN_PIERCE_ANYWHERE(ARG:0)
#FUNCTION
FOR LOCAL, 0, ピアス_最大ビット + 1
	SIF CAN_PIERCE(ARG:0, LOCAL)
		RETURNF 1
NEXT
RETURNF 0

;---------------------------
;ARG:0番のキャラが、ARG:1番のビットにピアスをしているか
;着けてれば1が戻る
;---------------------------
@IS_PIERCED(ARG:0, ARG:1)
#FUNCTION
LOCAL:0 = 0
;範囲外なら不可
SIF ARG:1 < 0 || ピアス_最大ビット < ARG:1
	RETURNF 0
SIF GETBIT(TALENT:(ARG:0):ピアス, ARG:1)
	LOCAL:0 ++
RETURNF LOCAL:0

;---------------------------
;ARG:0番のキャラが、ARG:1番のビットにピアス穴をしているか
;着けてれば1が戻る
;---------------------------
@IS_HOLED(ARG:0, ARG:1)
#FUNCTION
LOCAL:0 = 0
;範囲外なら不可
SIF ARG:1 < 0 || ピアス_最大ビット < ARG:1
	RETURNF 0
SIF GETBIT(TALENT:(ARG:0):ピアス穴, ARG:1)
	LOCAL:0 ++
RETURNF LOCAL:0

;---------------------------
;ARG:0番のキャラがつけているピアスと穴について、文字列で返す
;---------------------------
@TOSTR_PIERCE(ARG:0)
#FUNCTIONS
LOCALS:0 =
FOR LOCAL:0, 0, ピアス_最大ビット + 1
	SELECTCASE IS_PIERCED(ARG:0, LOCAL:0)
		CASE 2
			LOCALS:0 = %LOCALS:0%%GET_PIERCE_NAME(LOCAL:0)%
		CASE 1
			LOCALS:0 = %LOCALS:0%%GET_PIERCE_NAME(LOCAL:0)%(穴のみ)
	ENDSELECT
NEXT
RETURNF LOCALS:0

;---------------------------
;ARG:0番のキャラがつけているピアスと穴について、PRINTする
;---------------------------
@PRINT_PIERCE(ARG:0)
LOCAL:1 = 0
FOR LOCAL:0, 0, ピアス_最大ビット + 1
	IF IS_PIERCED(ARG:0, LOCAL:0)
		LOCAL:1 = 1
		BREAK
	ENDIF
NEXT

IF !LOCAL:1
	PRINTFORM なし
	RETURN
ENDIF

FOR LOCAL:0, 0, ピアス_最大ビット + 1
	IF IS_PIERCED(ARG:0, LOCAL:0)
		CALL COLOR_PRINT(@"%GET_PIERCE_NAME(LOCAL:0)%", GROUPMATCH(GET_PIERCE_NAME(LOCAL:0), "乳首", "ラビア", "クリトリス", "ペニス") ? カラー_ピンク # GETDEFCOLOR())
		PRINT
	ELSEIF IS_HOLED(ARG:0, LOCAL:0)
		CALL COLOR_PRINT(@"%GET_PIERCE_NAME(LOCAL:0)%(穴のみ)", カラー_選択不可)
		PRINT
	ENDIF
NEXT

;---------------------------
;対象キャラのピアス穴を塞ぐ
;---------------------------
@CLEAR_PIERCE_HOLE(ARG:0, ARG:1)
IF GETBIT(TALENT:(ARG:0):ピアス穴, ARG:1)
	CALL REMOVE_PIERCE(ARG:0, ARG:1, 0)
	CLEARBIT TALENT:(ARG:0):ピアス穴, ARG:1
	RETURN 1
ENDIF
RETURN 0

;---------------------------
;対象キャラのペニスとクリトリスとラビアのピアス穴を塞ぐ
;性転換した直後に呼ぶ
;---------------------------
@CLEAR_PIERCE_HOLE_SEX_CHANGE(ARG:0)
IF HAS_PENIS(ARG:0)
	CALL CLEAR_PIERCE_HOLE(ARG:0, ピアス_クリトリス)
ELSE
	CALL CLEAR_PIERCE_HOLE(ARG:0, ピアス_ペニス)
ENDIF
IF !HAS_VAGINA(ARG:0)
	CALL CLEAR_PIERCE_HOLE(ARG:0, ピアス_ラビア)
ENDIF


code:
;--------------------------------
;性的嗜好の変化を行う
;--------------------------------
@CHECK_SEXUAL_PREFERENCE(対象)
#DIM 対象
#DIM 嗜好数
VARSET 嗜好数

FOR LOCAL, 0, VARSIZE("SEXUAL_PREFERENCE_EXP")
	SIF GETBIT(SEXUAL_PREFERENCE:対象:0, LOCAL)
		嗜好数 ++
NEXT

FOR LOCAL, 0, VARSIZE("SEXUAL_PREFERENCE_EXP")
	;嗜好獲得に必要な最低経験値は100。ただし嗜好をふたつ獲得するごとに50ふえていく
	IF !GETBIT(SEXUAL_PREFERENCE:対象:0, LOCAL) && SEXUAL_PREFERENCE_EXP:対象:LOCAL > 100 + 嗜好数 / 2 * 50
		PRINTFORML %ANAME(対象)%の様子がおかしい……
		CALL COLOR_PRINTW(@"様々な性経験を経て、%ANAME(対象)%は", GETDEFCOLOR(), @"<%SEXUAL_PREFERENCE_STR:LOCAL%>", カラー_ピンク, "と感じるようになったようだ……", GETDEFCOLOR())
		SETBIT SEXUAL_PREFERENCE:対象:0, LOCAL
		;嗜好数1->2みたいな変動をしたときのために嗜好数を増やす
		;一度に複数個取得可能な状態になることはまずないと思われるが、仕様としてはこうするのが正しいので
		嗜好数 ++
	ENDIF
NEXT


code:
;-------------------------------------------------
;;;@SET_TALENT
;;;@概要 :排他関係にある素質をチェックし、素質設定を行う
;
;;;@IN
;;; - CHARA_ID
;;; - TALENT_NAME : セットする素質（名称指定）
;;; - VALUE : セットする値
;;; - CHECK_EXCLUDE : (省略可) !0で排他チェックを行う
;;; - REPLACE_TALENT : (省略可) 排他関係にある素質を削除し素質をセット(要CHECK_EXCLUDE = 1)
;;;@OUT
;;; - RESULT:0 - 0=セット失敗,1=セット成功,-1=指定した素質が存在しない
;-------------------------------------------------
@SET_TALENT(CHARA_ID, TALENT_NAME, VALUE, CHECK_EXCLUDE = 0, REPLACE_TALENT = 0)
#DIM  CHARA_ID
#DIMS TALENT_NAME
#DIM  VALUE
#DIM  CHECK_EXCLUDE
#DIM  REPLACE_TALENT

#DIM  DYNAMIC TALENT_ID

TALENT_ID = GETNUM(TALENT, TALENT_NAME)
IF TALENT_ID == -1
    DEBUGPRINTFORML 存在しないTALENT名%TALENT_NAME%が指定されました
    RETURN 0
ENDIF

IF !CHECK_EXCLUDE
    TALENT:TALENT_ID = VALUE
    RETURN 1
ENDIF

SELECTCASE TALENT_ID
    CASE GETNUM(TALENTNAME, "反抗的")
        IF TALENT:CHARA_ID:素直
            IF REPLACE_TALENT
                TALENT:CHARA_ID:素直 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "素直")
        IF TALENT:CHARA_ID:反抗的
            IF REPLACE_TALENT
                TALENT:CHARA_ID:反抗的 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "プライド低い")
        IF TALENT:CHARA_ID:プライド高い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:プライド高い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "プライド高い")
        IF TALENT:CHARA_ID:プライド低い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:プライド低い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "好奇心")
        IF TALENT:CHARA_ID:感情乏しい
            IF REPLACE_TALENT
                TALENT:CHARA_ID:感情乏しい = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "悲観的")
        IF TALENT:CHARA_ID:楽観的
            IF REPLACE_TALENT
                TALENT:CHARA_ID:楽観的 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "一線越えない")
        IF TALENT:CHARA_ID:目立ちたがり
            IF REPLACE_TALENT
                TALENT:CHARA_ID:目立ちたがり = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "目立ちたがり")
        IF TALENT:CHARA_ID:一線越えない
            IF REPLACE_TALENT
                TALENT:CHARA_ID:一線越えない = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "貞操観念")
        IF TALENT:CHARA_ID:貞操無頓着
            IF REPLACE_TALENT
                TALENT:CHARA_ID:貞操無頓着 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "貞操無頓着")
        IF TALENT:CHARA_ID:貞操観念
            IF REPLACE_TALENT
                TALENT:CHARA_ID:貞操観念 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "解放")
        IF TALENT:CHARA_ID:抑圧
            IF REPLACE_TALENT
                TALENT:CHARA_ID:抑圧 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "抑圧")
        IF TALENT:CHARA_ID:解放
            IF REPLACE_TALENT
                TALENT:CHARA_ID:解放 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "恥薄い")
        IF TALENT:CHARA_ID:恥じらい
            IF REPLACE_TALENT
                TALENT:CHARA_ID:恥じらい = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "恥じらい")
        IF TALENT:CHARA_ID:恥薄い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:恥薄い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "痛みに強い")
        IF TALENT:CHARA_ID:痛みに弱い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:痛みに弱い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "痛みに弱い")
        IF TALENT:CHARA_ID:痛みに強い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:痛みに強い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "濡れにくい")
        IF TALENT:CHARA_ID:濡れやすい
            IF REPLACE_TALENT
                TALENT:CHARA_ID:濡れやすい = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "濡れやすい")
        IF TALENT:CHARA_ID:濡れにくい
            IF REPLACE_TALENT
                TALENT:CHARA_ID:濡れにくい = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "習得遅い")
        IF TALENT:CHARA_ID:習得早い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:習得早い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "習得早い")
        IF TALENT:CHARA_ID:習得遅い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:習得遅い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "汚臭敏感")
        IF TALENT:CHARA_ID:汚臭鈍感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:汚臭鈍感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "汚臭鈍感")
        IF TALENT:CHARA_ID:汚臭敏感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:汚臭敏感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "快感の否定")
        IF TALENT:CHARA_ID:快感に素直
            IF REPLACE_TALENT
                TALENT:CHARA_ID:快感に素直 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "快感に素直")
        IF TALENT:CHARA_ID:快感の否定
            IF REPLACE_TALENT
                TALENT:CHARA_ID:快感の否定 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "倒錯的")
        IF TALENT:CHARA_ID:男嫌い || TALENT:CHARA_ID:女嫌い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:男嫌い = 0
                TALENT:CHARA_ID:女嫌い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "男嫌い") || GETNUM(TALENTNAME, "女嫌い")
        IF TALENT:CHARA_ID:倒錯的
            IF REPLACE_TALENT
                TALENT:CHARA_ID:倒錯的 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｃ敏感")
        IF TALENT:CHARA_ID:Ｃ鈍感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｃ鈍感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｃ鈍感")
        IF TALENT:CHARA_ID:Ｃ敏感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｃ敏感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｖ敏感")
        IF TALENT:CHARA_ID:Ｖ鈍感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｖ鈍感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｖ鈍感")
        IF TALENT:CHARA_ID:Ｖ敏感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｖ敏感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｂ敏感")
        IF TALENT:CHARA_ID:Ｂ鈍感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｂ鈍感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｂ鈍感")
        IF TALENT:CHARA_ID:Ｂ敏感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｂ敏感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ａ敏感")
        IF TALENT:CHARA_ID:Ａ鈍感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ａ鈍感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ａ鈍感")
        IF TALENT:CHARA_ID:Ａ敏感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ａ敏感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｍ敏感")
        IF TALENT:CHARA_ID:Ｍ鈍感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｍ鈍感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｍ鈍感")
        IF TALENT:CHARA_ID:Ｍ敏感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｍ敏感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｕ敏感")
        IF TALENT:CHARA_ID:Ｕ鈍感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｕ鈍感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "Ｕ鈍感")
        IF TALENT:CHARA_ID:Ｕ敏感
            IF REPLACE_TALENT
                TALENT:CHARA_ID:Ｕ敏感 = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "回復早い")
        IF TALENT:CHARA_ID:回復遅い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:回復遅い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
    CASE GETNUM(TALENTNAME, "回復遅い")
        IF TALENT:CHARA_ID:回復早い
            IF REPLACE_TALENT
                TALENT:CHARA_ID:回復早い = 0
            ELSE
                RETURN 0
            ENDIF
        ENDIF
ENDSELECT

TALENT:CHARA_ID:TALENT_ID = VALUE
RETURN 1


code:
@TATTOO_MENU(対象, 編集モード = 0)
#DIM 対象
#DIM 編集モード
#DIM FIRST_LINE, 2
FIRST_LINE = LINECOUNT

FOR LOCAL, 0, VARSIZE("TATTOO")
	IF IS_TATTOOED(対象, LOCAL:0)
		PRINTBUTTON @"[{LOCAL:0}] %GET_TATTOO_NAME(LOCAL:0)% : %TATTOO:(対象):(LOCAL:0)%", LOCAL:0
		PRINTL
	ELSE
		PRINTBUTTON @"[{LOCAL:0}] %GET_TATTOO_NAME(LOCAL:0), 8, LEFT%", LOCAL:0
		PRINTBUTTON @"[{LOCAL:0 + 100}] %GET_TATTOO_NAME(LOCAL:0) + "(ランダム)", 20, LEFT%", LOCAL:0 + 100
		PRINTL
	ENDIF
NEXT
PRINTFORML [99] 戻る

INPUT
LOCAL:1 = RESULT
IF LOCAL:1 == 99
	PRINTFORML やはりやめておいた
	RETURN 0
ELSEIF INRANGE(LOCAL:1, 0, VARSIZE("TATTOO") - 1) && CAN_TATTOO(対象, LOCAL:1)
	PRINTFORML 何と彫り入れますか？(未入力でキャンセル)
	INPUTS
	CALL SET_TATTOO(対象, LOCAL:1, RESULTS:0)
	IF 編集モード
		CLEARLINE LINECOUNT - FIRST_LINE
		RESTART
	ELSE
		RETURN 1
	ENDIF
ELSEIF INRANGE(LOCAL:1, 0, VARSIZE("TATTOO") - 1) && 編集モード
	PRINTFORML %ANAME(対象)%の%GET_TATTOO_NAME(RESULT:0)%のタトゥーを消去しました
	TATTOO:(対象):RESULT =
	CLEARLINE LINECOUNT - FIRST_LINE
	RESTART
ELSEIF INRANGE(LOCAL:1, 100, 99 + VARSIZE("TATTOO")) && CAN_TATTOO(対象, LOCAL:1 - 100)
	FIRST_LINE:1 = LINECOUNT
	$RANDOM_LOOP_TATTOO
	LOCALS:0 = %STR_FOR_TATTOO(LOCAL:1 - 100)%
	PRINTFORML 「%LOCALS:0%」を彫り入れるのはどうだろう……
	CALL ASK_MULTI("彫る", "別ので", "やめる")
	IF RESULT == 0
		CALL SET_TATTOO(対象, LOCAL:1 - 100, LOCALS:0)
		IF 編集モード
			CLEARLINE LINECOUNT - FIRST_LINE
			RESTART
		ELSE
			RETURN 1
		ENDIF
	ELSEIF RESULT == 1
		CLEARLINE LINECOUNT - FIRST_LINE:1
		GOTO RANDOM_LOOP_TATTOO
	ELSEIF RESULT == 2
		CLEARLINE LINECOUNT -FIRST_LINE
		RESTART
	ENDIF
ENDIF

CLEARLINE LINECOUNT - FIRST_LINE
RESTART

;---------------------------
;ARG:0のARG:1番にARG:2でタトゥーを入れる関数
;既に入っている場合は無理
;ARG:2はメッセージを表示するフラグ
;---------------------------
@SET_TATTOO(ARG:0, ARG:1, ARGS:0, ARG:2 = 1)
SIF !CAN_TATTOO(ARG:0, ARG:1)
	RETURN 0
SIF ARG:2
CALL COLOR_PRINTW(@"%ANAME(ARG:0)%の%GET_TATTOO_NAME(ARG:1)%に「%ARGS:0%」が刻まれた……", カラー_注意)
TATTOO:(ARG:0):(ARG:1) = %ARGS:0%
RETURN 1

;---------------------------
;ARG:0番のキャラが、ARG:1番のビットにタトゥーできるか
;---------------------------
@CAN_TATTOO(ARG:0, ARG:1)
#FUNCTION
;範囲外なら不可
SIF ARG:1 < 0 || VARSIZE("TATTOO") <= ARG:1
	RETURNF 0
;装着済みなら不可
SIF IS_TATTOOED(ARG:0, ARG:1)
	RETURNF 0
;それ以外は通す
RETURNF 1

;---------------------------
;ARG:0番のキャラが、どこでもいいからタトゥーできるか
;---------------------------
@CAN_TATTOO_ANYWHERE(ARG:0)
#FUNCTION
FOR LOCAL, 0, VARSIZE("TATTOO")
	SIF !IS_TATTOOED(ARG:0, LOCAL)
		RETURNF 1
NEXT
RETURNF 0

;---------------------------
;ARG:0のARG:1ビットのタトゥーを消す関数
;消したら1、そもそもなかったら0が返る
;タトゥーについてはピアスと違って、ゲーム内でユーザが任意に削除できる正規の方法を与えるつもりはない。この関数はデバッグ用
;というわけで、この関数を使用するパッチを作成するつもりの方はその辺お願いします
;---------------------------
@REMOVE_TATTOO(ARG:0, ARG:1, ARG:2 = 1)
IF IS_TATTOOED(ARG:0, ARG:1)
	TATTOO:(ARG:0):(ARG:1) =
	RETURN 1
ENDIF
RETURN 0

;---------------------------
;TATTOO:キャラ名:部位　の部位の各番号に対応する部位名を返す関数
;---------------------------
@GET_TATTOO_NAME(ARG:0)
#FUNCTIONS
SELECTCASE ARG:0
	CASE タトゥー_額
		RETURNF "額"
	CASE タトゥー_頬
		RETURNF "頬"
	CASE タトゥー_肩
		RETURNF "肩"
	CASE タトゥー_胸
		RETURNF "胸"
	CASE タトゥー_背
		RETURNF "背"
	CASE タトゥー_腹
		RETURNF "腹"
	CASE タトゥー_秘部
		RETURNF "秘部"
	CASE タトゥー_尻
		RETURNF "尻"
	CASE タトゥー_腿
		RETURNF "腿"
	CASE タトゥー_足首
		RETURNF "足首"
	CASEELSE
		RETURNF "不明"
ENDSELECT

;---------------------------
;ARG:0のARG:1部位のタトゥーの有無を調べる関数
;---------------------------
@IS_TATTOOED(ARG:0, ARG:1)
#FUNCTION
SIF ARG:1 < 0 || VARSIZE("TATTOO") <= ARG:1
	RETURNF 0
RETURNF TATTOO:(ARG:0):(ARG:1) != ""

;---------------------------
;ARG:0に、ARG:2 ~ ARG:12番の優先順でARGS:0のタトゥーを入れる関数
;ARG:1を1にするとメッセージを表示。
;一部だけ設定するとかいうこともできる
;取り付けた場合は、彫ったタトゥーの部位番号が返る
;---------------------------
@SET_TATTOO_RANKED(ARG:0, ARGS:0, ARG:1, ARG:2 = 99, ARG:3 = 99, ARG:4 = 99, ARG:5 = 99, ARG:6 = 99, ARG:7 = 99, ARG:8 = 99, ARG:9 = 99, ARG:10 = 99, ARG:11 = 99)
FOR LOCAL:0, 2, VARSIZE("TATTOO") + 2
	CALL SET_TATTOO(ARG:0, ARG:(LOCAL:0), ARGS:0, ARG:1)
	SIF RESULT
		RETURN ARG:(LOCAL:0)
NEXT
RETURN -1

;---------------------------
;ARG:0番のキャラの、ランダムな部位にタトゥーを入れる
;ARG:1はメッセージ表示フラグ。0なら非表示。
;戻り値は取り付けた部位番号
;どこも空いてなかったら-1が戻ってくるので、その辺考えずに単純にRESULTをGET_TATTOO_NAMEにかけたりしないことこと
;---------------------------
@SET_TATTOO_RANDOM(ARG:0, ARGS:0, ARG:1  = 1)
#DIM 空き部位, VARSIZE("TATTOO")
#DIM 空き数
VARSET 空き部位, -1
VARSET 空き数

FOR LOCAL, 0, VARSIZE("TATTOO")
	IF CAN_TATTOO(ARG:0, LOCAL:0)
		空き部位:空き数 = LOCAL:0
		空き数 ++
	ENDIF
NEXT

;どこも空いてなかったら-1
SIF 空き数 == 0
	RETURN -1

LOCAL = 空き部位:(RAND:空き数)
CALL SET_TATTOO(ARG:0, LOCAL, ARGS:0, ARG:1)
SIF RESULT
	RETURN LOCAL
;多分こないはず
RETURN -1
;---------------------------
;ARG:0番のキャラがつけているタトゥーについて、PRINTする
;---------------------------
@PRINT_TATTOO(ARG:0)
LOCAL:1 = 0
FOR LOCAL:0, 0, VARSIZE("TATTOO")
	IF IS_TATTOOED(ARG:0, LOCAL:0)
		LOCAL:1 = 1
		BREAK
	ENDIF
NEXT

IF !LOCAL:1
	PRINTFORM なし
	RETURN
ENDIF

FOR LOCAL:0, 0, VARSIZE("TATTOO")
	IF IS_TATTOOED(ARG:0, LOCAL:0)
		PRINTFORM <%GET_TATTOO_NAME(LOCAL:0)% : %TATTOO:(ARG:0):(LOCAL:0)%>
	ENDIF
NEXT

;---------------------
;ARG:0番の部位番号に対応するランダムなタトゥー用文字列を返す
;TATTOO_SAMPLE_LIST_COMMONに一つは入ってないとエラー落ちするので注意
;---------------------
@STR_FOR_TATTOO(ARG:0)
#FUNCTIONS
SIF ARG:0 < -1 || VARSIZE("TATTOO") <= ARG:0
	THROW STR_FOR_TATTOOの引数に異常な数値が渡されました 引数:{ARG:0}
IF RAND:2 && 0 < ARG:0 && TATTOO_SAMPLE_ADDRESS:(ARG:0)
	RETURNF TATTOO_SAMPLE_LIST:(ARG:0):(RAND:(TATTOO_SAMPLE_ADDRESS:(ARG:0)))
ELSE
	RETURNF TATTOO_SAMPLE_LIST_COMMON:(RAND:TATTOO_SAMPLE_COMMON_ADDRESS)
ENDIF

;---------------------
;各部位番号に対応するランダムなタトゥー用文字列を用意する
;---------------------
@CREATE_TATTOO_LIST
CALL ADD_TATTOO_SAMPLE(-1, "肉便器")
CALL ADD_TATTOO_SAMPLE(-1, "犯罪者")
CALL ADD_TATTOO_SAMPLE(タトゥー_額, "肉")
CALL ADD_TATTOO_SAMPLE(-1, "売女")
CALL ADD_TATTOO_SAMPLE(-1, "ダッチワイフ")
CALL ADD_TATTOO_SAMPLE(-1, "公衆便所")
CALL ADD_TATTOO_SAMPLE(-1, "性奴隷")
CALL ADD_TATTOO_SAMPLE(-1, "ビッチ")
CALL ADD_TATTOO_SAMPLE(-1, "変態")
CALL ADD_TATTOO_SAMPLE(-1, "痴女")
CALL ADD_TATTOO_SAMPLE(-1, "ドスケベ女")
CALL ADD_TATTOO_SAMPLE(-1, "雌犬")
CALL ADD_TATTOO_SAMPLE(-1, "オナホ女")
CALL ADD_TATTOO_SAMPLE(-1, "マゾ")
CALL ADD_TATTOO_SAMPLE(-1, "真剣勝負エロ大根")
CALL ADD_TATTOO_SAMPLE(-1, "淫乱")
CALL ADD_TATTOO_SAMPLE(-1, "精液中毒")
CALL ADD_TATTOO_SAMPLE(-1, "セックス中毒")
CALL ADD_TATTOO_SAMPLE(-1, "オナニー猿")
CALL ADD_TATTOO_SAMPLE(-1, "苗床")
CALL ADD_TATTOO_SAMPLE(-1, "慰み者")
CALL ADD_TATTOO_SAMPLE(-1, "淫乱家畜女")
CALL ADD_TATTOO_SAMPLE(-1, "無　料")
CALL ADD_TATTOO_SAMPLE(-1, "色気違い")
CALL ADD_TATTOO_SAMPLE(-1, "ザーメン乞食")
CALL ADD_TATTOO_SAMPLE(-1, "職業：便器")
CALL ADD_TATTOO_SAMPLE(-1, "私は家畜です")
CALL ADD_TATTOO_SAMPLE(-1, "ペット")
CALL ADD_TATTOO_SAMPLE(タトゥー_尻, "精液で浣腸して")
CALL ADD_TATTOO_SAMPLE(-1, "露出狂")
CALL ADD_TATTOO_SAMPLE(タトゥー_尻, "アナル気違い")
CALL ADD_TATTOO_SAMPLE(タトゥー_胸, "変態乳")
CALL ADD_TATTOO_SAMPLE(タトゥー_頬, "口まんこ")
CALL ADD_TATTOO_SAMPLE(タトゥー_胸, "乳まんこ")
CALL ADD_TATTOO_SAMPLE(タトゥー_尻, "ケツまんこ")
CALL ADD_TATTOO_SAMPLE(-1, "外に射精さないでください")
CALL ADD_TATTOO_SAMPLE(-1, "ぶっかけてください")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "ユルマン使って下さい")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "グロマン")
CALL ADD_TATTOO_SAMPLE(タトゥー_尻, "ケツハメ最高")
CALL ADD_TATTOO_SAMPLE(-1, "全身開発済み")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "膣内射精専用")
CALL ADD_TATTOO_SAMPLE(タトゥー_尻, "アナル便所")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "子宮姦して")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "変態まんこ")
CALL ADD_TATTOO_SAMPLE(-1, "I LOVE SEX")
CALL ADD_TATTOO_SAMPLE(-1, "ザーメンタンク")
CALL ADD_TATTOO_SAMPLE(-1, "チンポ依存症")
CALL ADD_TATTOO_SAMPLE(-1, "触手依存症")
CALL ADD_TATTOO_SAMPLE(-1, "精液依存症")
CALL ADD_TATTOO_SAMPLE(-1, "雌豚")
CALL ADD_TATTOO_SAMPLE(-1, "特技・アヘ顔")
CALL ADD_TATTOO_SAMPLE(-1, "ドブスでごめんなさい")
CALL ADD_TATTOO_SAMPLE(-1, "肉人形")
CALL ADD_TATTOO_SAMPLE(-1, "私は変態です")
CALL ADD_TATTOO_SAMPLE(-1, "お精子恵んで♥")
CALL ADD_TATTOO_SAMPLE(-1, "I LOVE FUCKING")
CALL ADD_TATTOO_SAMPLE(-1, "好物：精液")
CALL ADD_TATTOO_SAMPLE(-1, "好物：ちんぽ")
CALL ADD_TATTOO_SAMPLE(タトゥー_腿, "正")
CALL ADD_TATTOO_SAMPLE(タトゥー_腿, "正正")
CALL ADD_TATTOO_SAMPLE(タトゥー_腿, "正正正")
CALL ADD_TATTOO_SAMPLE(タトゥー_腿, "正正正正")
CALL ADD_TATTOO_SAMPLE(タトゥー_腿, "正正正正正")
CALL ADD_TATTOO_SAMPLE(タトゥー_腿, "正正Ｔ")
CALL ADD_TATTOO_SAMPLE(タトゥー_腿, "正正正一")
CALL ADD_TATTOO_SAMPLE(-1, "おちんぽ様に絶対服従")
CALL ADD_TATTOO_SAMPLE(-1, "ちんぽの嫁")
CALL ADD_TATTOO_SAMPLE(-1, "ちんぽ奴隷")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "FUCK ME♥")
CALL ADD_TATTOO_SAMPLE(-1, "RAPE ME♥")
CALL ADD_TATTOO_SAMPLE(-1, "気持よくなかったらお詫びします♥")
CALL ADD_TATTOO_SAMPLE(-1, "種付け最高♥")
CALL ADD_TATTOO_SAMPLE(-1, "一生性奴隷でいい♥")
CALL ADD_TATTOO_SAMPLE(-1, "いつでも使ってね♥")
CALL ADD_TATTOO_SAMPLE(-1, "輪姦希望♥")
CALL ADD_TATTOO_SAMPLE(-1, "奴隷志願♥")
CALL ADD_TATTOO_SAMPLE(-1, "レイプ歓迎♥")
CALL ADD_TATTOO_SAMPLE(-1, "汚ちんぽ大歓迎♥")
CALL ADD_TATTOO_SAMPLE(-1, "ちんぽでほじって♥")
CALL ADD_TATTOO_SAMPLE(-1, "ハメ逃げ歓迎♥")
CALL ADD_TATTOO_SAMPLE(タトゥー_胸, "パイズリさせてください♥")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "子宮ほじほじして♥")
CALL ADD_TATTOO_SAMPLE(-1, "精液飲ませて♥")
CALL ADD_TATTOO_SAMPLE(-1, "獣姦大好き♥")
CALL ADD_TATTOO_SAMPLE(-1, "♥♥♥♥♥")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "膣内射精専用まんこ")
CALL ADD_TATTOO_SAMPLE(-1, "犯して下さいお願いします♥")
CALL ADD_TATTOO_SAMPLE(-1, "目指せ！　セックス100万回♥")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "ママにして♥")
CALL ADD_TATTOO_SAMPLE(タトゥー_胸, "乳首も苛めて♥")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "新品")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "中古")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "ガバマンでごめんなさい♥")
CALL ADD_TATTOO_SAMPLE(タトゥー_腹, "パパ募集中♥")
CALL ADD_TATTOO_SAMPLE(タトゥー_腹, "妊娠マシーン")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "孕み頃奴隷まんこ")
CALL ADD_TATTOO_SAMPLE(-1, "タダハメOK♥")
CALL ADD_TATTOO_SAMPLE(-1, "二穴責めして♥")
CALL ADD_TATTOO_SAMPLE(-1, "パコリ手")
CALL ADD_TATTOO_SAMPLE(タトゥー_頬, "チンしゃぶ大好き♥")
CALL ADD_TATTOO_SAMPLE(-1, "犯されるの大好き♥")
CALL ADD_TATTOO_SAMPLE(-1, "人間便器")
CALL ADD_TATTOO_SAMPLE(-1, "精液便所")
CALL ADD_TATTOO_SAMPLE(-1, "♥")
CALL ADD_TATTOO_SAMPLE(-1, "★")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "無料")
CALL ADD_TATTOO_SAMPLE(タトゥー_尻, "無料")
CALL ADD_TATTOO_SAMPLE(-1, "♪")
CALL ADD_TATTOO_SAMPLE(タトゥー_秘部, "insert free")
CALL ADD_TATTOO_SAMPLE(タトゥー_尻, "insert free")
CALL ADD_TATTOO_SAMPLE(-1, "ご自由にお使い下さい")
CALL ADD_TATTOO_SAMPLE(-1, "一発百円")
CALL ADD_TATTOO_SAMPLE(-1, "一発百円(私が払います♥)")
CALL ADD_TATTOO_SAMPLE(-1, "一発十円")
CALL ADD_TATTOO_SAMPLE(-1, "【バラのマーク】")
CALL ADD_TATTOO_SAMPLE(-1, "【蝶のマーク】")
CALL ADD_TATTOO_SAMPLE(-1, "【ドクロのマーク】")
CALL ADD_TATTOO_SAMPLE(-1, "【スペードのエース】")
CALL ADD_TATTOO_SAMPLE(-1, "レイプして♥")
CALL ADD_TATTOO_SAMPLE(-1, "【般若の柄】")
CALL ADD_TATTOO_SAMPLE(-1, "【昇り龍】")
CALL ADD_TATTOO_SAMPLE(-1, "マンコ使い放題")
CALL ADD_TATTOO_SAMPLE(-1, "奴隷")
CALL ADD_TATTOO_SAMPLE(-1, "エロ女")
CALL ADD_TATTOO_SAMPLE(-1, "犯してね♥")
CALL ADD_TATTOO_SAMPLE(-1, "bitch")
CALL ADD_TATTOO_SAMPLE(-1, "マゾ豚")
CALL ADD_TATTOO_SAMPLE(-1, "獣姦女")
CALL ADD_TATTOO_SAMPLE(-1, "輪姦中毒")
CALL ADD_TATTOO_SAMPLE(-1, "ヤク中")
CALL ADD_TATTOO_SAMPLE(-1, "産む機械")
CALL ADD_TATTOO_SAMPLE(-1, "妊娠マシン")

;---------------------
;各部位番号に対応するランダムなタトゥー用文字列を追加する
;---------------------
@ADD_TATTOO_SAMPLE(ARG:0, ARGS:0)
IF ARG:0 == -1 && TATTOO_SAMPLE_COMMON_ADDRESS < VARSIZE("TATTOO_SAMPLE_LIST_COMMON")
	TATTOO_SAMPLE_LIST_COMMON:(TATTOO_SAMPLE_COMMON_ADDRESS) = %ARGS:0%
	TATTOO_SAMPLE_COMMON_ADDRESS ++
ELSEIF 0 <= ARG:0 && ARG:0 < VARSIZE("TATTOO_SAMPLE_LIST") && TATTOO_SAMPLE_ADDRESS:(ARG:0) < VARSIZE("TATTOO_SAMPLE_LIST", 1)
	TATTOO_SAMPLE_LIST:(ARG:0):(TATTOO_SAMPLE_ADDRESS:(ARG:0)) = %ARGS:0%
	TATTOO_SAMPLE_ADDRESS:(ARG:0) ++
ELSE
	RETURN 0
ENDIF
RETURN 1


code:
;-------------------------------------------------
; 頻出の表現について類語から選出して返す
; 基本的に地の文用
;-------------------------------------------------
@語彙_ペニス()
#FUNCTIONS
RETURNF S_R("ペニス/竿/陰茎/肉茎/淫棒/肉棒")
@語彙_秘部()
#FUNCTIONS
RETURNF S_R("膣/膣口/秘貝/秘裂/蜜口/子宮/姫宮/淫口/性器")
@語彙_秘貝()
#FUNCTIONS
RETURNF S_R("膣口/秘貝/秘裂/蜜口/姫口/性器/割れ目")
@語彙_陰核()
#FUNCTIONS
RETURNF S_R("陰核/秘部/クリトリス")
@語彙_精液()
#FUNCTIONS
RETURNF S_R("白濁/白濁液/精子/ザーメン/体液/淫汁/子種/雄汁")
@語彙_愛液()
#FUNCTIONS
RETURNF S_R("愛液/愛蜜/淫汁/雌汁/姫汁/姫蜜/淫蜜")
@語彙_夢中()
#FUNCTIONS
RETURNF S_R("無我夢中/しゃにむ/懸命/ひたすら/一心不乱/脇目も振らず")
@語彙_潤滑()
#FUNCTIONS
RETURNF S_R("びしょびしょに濡れた/濡れそぼった/とろとろに湿った/滴るほど濡れた/すっかりぬめり気を帯びた/湿りを帯びた/ぐっしょりとした/とろとろに湿った")
@語彙_肛門
#FUNCTIONS
RETURNF S_R("アナル/肛門/アヌス/尻穴/肛口")
@語彙_穴(ARG:0)
#FUNCTIONS
RETURNF !ARG:0 ? @"%語彙_秘部()%" # @"%語彙_肛門()%"


code:
#DIM CONST MAX_HELP_CONTENT = 1000
#DIM HELP_CONTENT_NUM
#DIMS HELP_CONTENT_NAME, MAX_HELP_CONTENT
#DIMS HELP_CONTENT_NAME_ENG, MAX_HELP_CONTENT
#DIM CONST MAX_HELP_CONTENT_LINE = 200
#DIMS HELP_CONTENT_LINE, MAX_HELP_CONTENT_LINE
#DIM HELP_CONTENT_LINE_NUM


code:
;-------------------------------------------------
;;; FL用語集用定数・変数
;-------------------------------------------------
#DIM FLPEDIA_CURRENT_PAGE
#DIM FLPEDIA_CURRENT_CATEGORY
#DIM FLPEDIA_CURRENT_CONTENTS_DID
#DIM FLPEDIA_UIC_ID
#DIM CONST FLPEDIA_MAX_CONTENTS_NUM = 100

#DIM CONST FLPEDIA_CATEGORY_地理 = 0
#DIM CONST FLPEDIA_CATEGORY_勢力 = 1
#DIM CONST FLPEDIA_CATEGORY_種族 = 2
#DIM CONST FLPEDIA_CATEGORY_用語 = 3
#DIM CONST FLPEDIA_CATEGORY_歴史 = 4
{
    #DIMS CONST FLPEDIA_MAIN_CATEGORY =
        "地理",
        "勢力",
        "種族",
        "用語",
        "歴史"
}


code:
;-------------------------------------------------
;;; FL用語集
;-------------------------------------------------
@FLPEDIA_MAIN

CALL FLPEDIA_INIT()

CALL PRINTLINE_RESERVE()
WHILE 1
    CALL FLPEDIA_INDEX(FLPEDIA_UIC_ID)
    IF FLPEDIA_CURRENT_CONTENTS_DID
        CALL FLPEDIA_SHOW_CONTENTS()
    ENDIF
    CALL UIC_SHOW(FLPEDIA_UIC_ID)
    CALL NEWLINE(UI_MAXHEIGHT)
    CALL FLPEDIA_INPUT()
    IF RESULT == -1
        BREAK
    ENDIF
    REDRAW 0
    CALL PRINTLINE_CLEAR()
WEND
REDRAW 0

CALL UIC_DISPOSE(FLPEDIA_UIC_ID)
CALL PRINTLINE_CLEAR()
RETURN 1

;-------------------------------------------------
;;; 用語集初期処理
;-------------------------------------------------
@FLPEDIA_INIT()
FLPEDIA_CURRENT_CATEGORY = -1
FLPEDIA_CURRENT_PAGE = 0
FLPEDIA_CURRENT_CONTENTS_DID = 0
CALL FLPEDIA_UIC_CREATE()
FLPEDIA_UIC_ID = RESULT
RETURN 1
;-------------------------------------------------
;;; 用語集入力部
;-------------------------------------------------
@FLPEDIA_INPUT()
VARS INPUT_VALUES
VARI VALUE
VARS FUNC_NAME
BINPUTS
CLEARLINE 1
INPUT_VALUES = %RESULTS%
IF DIC_CONTAINSKEY(INPUT_VALUES, "EXIT")
    RETURN -1
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "CHANGE_CATEGORY")
    VALUE = DIC_GETINT(INPUT_VALUES, "CHANGE_CATEGORY")
    IF FLPEDIA_CURRENT_CATEGORY != VALUE
        FLPEDIA_CURRENT_PAGE = 0
        FLPEDIA_CURRENT_CATEGORY = DIC_GETINT(INPUT_VALUES, "CHANGE_CATEGORY")
    ELSE
        FLPEDIA_CURRENT_PAGE = 0
        FLPEDIA_CURRENT_CATEGORY = -1
    ENDIF
ELSEIF DIC_CONTAINSKEY(INPUT_VALUES, "CONTENTS_DID")
    FLPEDIA_CURRENT_CONTENTS_DID = DIC_GETINT(INPUT_VALUES, "CONTENTS_DID")
ENDIF
;-------------------------------------------------
;;; 記事の表示
;-------------------------------------------------
@FLPEDIA_SHOW_CONTENTS()
#DIMS FUNC_NAME
VARS SPLIT_ARRAY, 2500
VARS TEXT
VARI LINE_CNT

FUNC_NAME = %DT_CELL_GETS("FLPEDIA_TABLE", FLPEDIA_CURRENT_CONTENTS_DID, "FUNC_NAME", 1)%

TRYCALLFORM FLPEDIA_TITLE_%FUNC_NAME%()
CALL UIC_SET_TEXT(FLPEDIA_UIC_ID, "UIC_RIGHT_HEADER", @"◆ %RESULTS%")

TRYCALLFORM FLPEDIA_CONTENTS_%FUNC_NAME%()
CALL TEXT_SPLIT_RAWTEXT(RESULTS, SPLIT_ARRAY)
LINE_CNT = RESULT
VARI I
FOR I, 0, LINE_CNT
    TEXT += @"%SPLIT_ARRAY:I%" + @"
"
NEXT

CALL UIC_SET_TEXT(FLPEDIA_UIC_ID, "UIC_RIGHT_MAIN", TEXT)
RETURN

;-------------------------------------------------
;;; 用語集コンテナ作成
;-------------------------------------------------
@FLPEDIA_UIC_CREATE()
VARI UIC_ID

VARI WIDTH  = UI_MAXWIDTH * 100
VARI HEIGHT = UI_MAXHEIGHT * 100
;コンテナ初期化
CALL UIC_INIT()
UIC_ID = RESULT

;親コンテナ
CALL UIC_ADD(UIC_ID, "UIC_PARENT", "", @"[BORDER:0PX][SIZE:{WIDTH},{HEIGHT}][PADDING:50]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_PARENT", "[TARGET:LINE_LEFT][ANCHOR:LEFT_TOP][TARGET_PIVOT:LEFT_TOP][PADDING:50,0]")

;;本文
;-------------------------------------------------
;右側親コンテナ
VARS TEXT
CALL UIC_ADD(UIC_ID, "UIC_RIGHT_PARENT", "", @"[BORDER:0PX][BCOLOR:%C2H(カラー_明灰色)%][SIZE:7000,{HEIGHT}][PADDING:50]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_RIGHT_PARENT", "[TARGET:UIC_PARENT][ANCHOR:RIGHT][TARGET_PIVOT:RIGHT]")

;本文見出し
CALL UIC_ADD(UIC_ID, "UIC_RIGHT_HEADER", "FLpediaへようこそ！", @"[BORDER:0PX][BCOLOR:%C2H(カラー_明灰色)%][COLOR:%C2H(0x202020)%][SIZE:7000,225][PADDING:50]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_RIGHT_HEADER", "[TARGET:UIC_RIGHT_PARENT][ANCHOR:TOP][TARGET_PIVOT:TOP]")

;本文
CALL UIC_ADD(UIC_ID, "UIC_RIGHT_MAIN", "ここではeraFL内に登場する用語や勢力、種族などの情報を確認することができる", @"[BORDER:0PX][BCOLOR:%C2H(カラー_明灰色)%][SIZE:7000,{HEIGHT - 225}][PADDING:50]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_RIGHT_MAIN", "[TARGET:UIC_RIGHT_HEADER][ANCHOR:TOP][TARGET_PIVOT:BOTTOM]")

;;目次
;-------------------------------------------------
;左側親コンテナ
CALL UIC_ADD(UIC_ID, "UIC_LEFT_PARENT", "", @"[BORDER:1PX][BCOLOR:%C2H(カラー_明灰色)%][SIZE:1600,{HEIGHT}][PADDING:50]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_LEFT_PARENT", "[TARGET:UIC_PARENT][ANCHOR:LEFT][TARGET_PIVOT:LEFT]")

;目次タイトル
CALL UIC_ADD(UIC_ID, "UIC_INDEX_HEADER", "目次", @"[BORDER:0PX][SIZE:1600,225][PADDING:50]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_INDEX_HEADER", "[TARGET:UIC_LEFT_PARENT][ANCHOR:LEFT_TOP][TARGET_PIVOT:LEFT_TOP]")

;目次
CALL UIC_ADD(UIC_ID, "UIC_INDEX", "", @"[BORDER:0PX][BCOLOR:%C2H(カラー_明灰色)%][SIZE:1600,{HEIGHT - 225}][PADDING:50]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_INDEX", "[TARGET:UIC_INDEX_HEADER][ANCHOR:TOP][TARGET_PIVOT:BOTTOM]")

;目次下部のボタン用バー
CALL UIC_ADD(UIC_ID, "UIC_INDEX_BOTTOM", "画面下のメニュー領域", @"[BORDER:0PX][SIZE:1600,225][PADDING:50]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_INDEX_BOTTOM", "[TARGET:UIC_INDEX][ANCHOR:LEFT_BOTTOM][TARGET_PIVOT:LEFT_BOTTOM]")

;;外枠
;-------------------------------------------------
;外側の枠線
CALL UIC_ADD(UIC_ID, "UIC_OUTER_FRAME", "", @"[BORDER:2PX][BCOLOR:%C2H(カラー_明灰色)%][SIZE:{WIDTH + 50},{HEIGHT + 50}]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_OUTER_FRAME", "[TARGET:UIC_PARENT][ANCHOR:CENTER][TARGET_PIVOT:CENTER]")

;内側の枠線
CALL UIC_ADD(UIC_ID, "UIC_INNER_FRAME", "", @"[BORDER:1PX][BCOLOR:%C2H(カラー_明灰色)%][SIZE:{WIDTH},{HEIGHT}]")
CALL UIC_SET_LAYOUT(UIC_ID, "UIC_INNER_FRAME", "[TARGET:UIC_PARENT][ANCHOR:CENTER][TARGET_PIVOT:CENTER]")

RETURN UIC_ID

;-------------------------------------------------
;;; メニュー用テキスト
;-------------------------------------------------
@FLPEDIA_INDEX(UIC_ID)
#DIM UIC_ID
#DIM DYNAMIC CONTENTS_DID, FLPEDIA_MAX_CONTENTS_NUM
VARS TEXT
TEXT '= @"%TAG_PRINT_SHAPE("◇ FLpedia ◇", 26, 1, 2)%"
CALL UIC_SET_TEXT(UIC_ID, "UIC_INDEX_HEADER", TEXT)

;メニュー用テキスト
VARI I
TEXT '= ""
IF FLPEDIA_CURRENT_CATEGORY == -1
    FOR I, 0, VARSIZE("FLPEDIA_MAIN_CATEGORY")
        {
            TEXT += ""
                + @"<button value='@[CHANGE_CATEGORY:{I}]'>[+]%FLPEDIA_MAIN_CATEGORY:I%</button>"
                + @"

"
        }
    NEXT
ELSE
    VARS CATEGORY_NAME
    CATEGORY_NAME = %FLPEDIA_MAIN_CATEGORY:FLPEDIA_CURRENT_CATEGORY%
    {
        TEXT += ""
            + @"<button value='@[CHANGE_CATEGORY:{FLPEDIA_CURRENT_CATEGORY}]'>[-]%CATEGORY_NAME%</button>"
    }
    VARI CONTENTS_NUM
    VARS FUNC_NAME
    VARS TITLE
    VARI IS_ACTIVE
    DT_SELECT "FLPEDIA_TABLE", @"MAIN_CATEGORY = '%CATEGORY_NAME%'",,CONTENTS_DID
    CONTENTS_NUM = RESULT
    IF CONTENTS_NUM > 0
        TEXT += "
┃
"
        FOR I, 0, CONTENTS_NUM
            ;関数名取得
            FUNC_NAME = %DT_CELL_GETS("FLPEDIA_TABLE", CONTENTS_DID:I, "FUNC_NAME", 1)%
            ;記事有効チェック
            IS_ACTIVE = 1
            TRYCCALLFORM FLPEDIA_IS_ACTIVE_%FUNC_NAME%
                IF !RESULT
                    IS_ACTIVE = 0
                ENDIF
            CATCH
                IS_ACTIVE = 0
            ENDCATCH
            ;記事タイトル取得
            RESULTS '= ""
            TRYCALLFORM FLPEDIA_TITLE_%FUNC_NAME%
            TITLE = %RESULTS%
            ;ボタン生成
            TEXT += @"%I == CONTENTS_NUM - 1 ? "┗" # "┣"%"
            IF IS_ACTIVE
                TEXT += @"<button value='@[CONTENTS_DID:{CONTENTS_DID:I}]'>[+]%TITLE%</button>"
            ELSE
                TEXT += @" -------- "
            ENDIF
            TEXT += @"
%I == CONTENTS_NUM - 1 ? "" # "┃"%
"
        NEXT
    ENDIF
ENDIF
CALL UIC_SET_TEXT(UIC_ID, "UIC_INDEX", TEXT)

TEXT '= "<button value='[EXIT:1]'>[閉じる]</button>"
CALL UIC_SET_TEXT(UIC_ID, "UIC_INDEX_BOTTOM", TEXT)
RETURN 1


code:
;-------------------------------------------------
;;; FL用語集
;-------------------------------------------------
@FLPEDIA_ARTICLE_REGISTER
;種族に関する記事]
CALL FLP_REGISTER("種族_人間", "種族")
CALL FLP_REGISTER("種族_エルフ", "種族")
CALL FLP_REGISTER("種族_ドワーフ", "種族")
CALL FLP_REGISTER("種族_獣人", "種族")
CALL FLP_REGISTER("種族_魔物", "種族")
;勢力に関する記事
CALL FLP_REGISTER("勢力_古帝国", "勢力")
CALL FLP_REGISTER("勢力_コモンウェルス", "勢力")
CALL FLP_REGISTER("勢力_フロリア", "勢力")
CALL FLP_REGISTER("勢力_ノアレルム", "勢力")
CALL FLP_REGISTER("勢力_教皇領", "勢力")
;用語に関する記事
CALL FLP_REGISTER("用語_中央世界", "用語")
CALL FLP_REGISTER("用語_魔導工学", "用語")
CALL FLP_REGISTER("用語_オリエンス・ゲーム", "用語")
;歴史に関する記事
CALL FLP_REGISTER("歴史_年代区分", "歴史")
CALL FLP_REGISTER("歴史_大戦", "歴史")
CALL FLP_REGISTER("歴史_コモンウェルスの成立", "歴史")
CALL FLP_REGISTER("歴史_フロリア王国の隆盛", "歴史")
CALL FLP_REGISTER("歴史_ノアレルム共和国", "歴史")
;地理に関する記事
CALL FLP_REGISTER("地理_主人公の領地", "地理")
CALL FLP_REGISTER("地理_中央大陸", "地理")
CALL FLP_REGISTER("地理_東方辺境", "地理")
CALL FLP_REGISTER("地理_フォルメン", "地理")
CALL FLP_REGISTER("地理_大内海", "地理")
CALL FLP_REGISTER("地理_白霜山脈", "地理")

;-------------------------------------------------
;;; 記事のマッピング関数
;-------------------------------------------------
@FLP_REGISTER(FUNC_NAME, MAIN_CATEGORY)
#DIMS MAIN_CATEGORY
#DIMS FUNC_NAME

;既に登録済みなら登録しない
IF DT_SELECT("FLPEDIA_TABLE", @"FUNC_NAME = '%FUNC_NAME%'")
    RETURN 2
ENDIF
IF FINDELEMENT(FLPEDIA_MAIN_CATEGORY, MAIN_CATEGORY) == -1
    PRINTFORMW エラー:@FLP_REGISTER 未定義のカテゴリ%MAIN_CATEGORY%が指定されました
    RETURN 0
ENDIF

IF !EXISTFUNCTION(@"FLPEDIA_CONTENTS_%FUNC_NAME%")
    PRINTFORMW エラー:@FLP_REGISTER 関数「FLPEDIA_CONTENTS_%FUNC_NAME%」が未定義です
    RETURN 0
ENDIF

{
    DT_ROW_ADD "FLPEDIA_TABLE"
        , "MAIN_CATEGORY", MAIN_CATEGORY
        , "FUNC_NAME", FUNC_NAME
}
RETURN 1


code:
;-------------------------------------------------
;;; 勢力_コモンウェルス
;-------------------------------------------------
@FLPEDIA_TITLE_勢力_コモンウェルス()
RESULTS '= "コモンウェルス"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_勢力_コモンウェルス()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_勢力_コモンウェルス()
{
    RESULTS '=  @"
        北方列島諸国家の共同体。北方諸島連合国とも
        同一の主君を奉じた同君連合でありながらも王家は統治にほぼ関与せず、列島諸国家の政府によって執り行われる
        連邦制に近い政治体系の国家である

        古くから海運で栄えた地域であり、開明で冒険主義的な気風が強い
        商人たちの投資による後押しもあり、ノルディア島の首都、ノルディアは経済、科学、産業の発展が著しい
        ノルディアのアカデミーは魔法・魔導工学やその他各種研究、学術調査の中心地である
        一方で貧富の差の急速な拡大や公害といった新たな問題にも直面し始めているようだ

        また、列島各地には古帝国以前の旧文明の遺構が点在している。構造物は海面下にも広がっており今なお謎が残る
        "
}
RETURN


code:
;-------------------------------------------------
;;; 勢力_ノアレルム
;-------------------------------------------------
@FLPEDIA_TITLE_勢力_ノアレルム()
RESULTS '= "ノアレルム"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_勢力_ノアレルム()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_勢力_ノアレルム()
{
    RESULTS '=  @"
        レルム半島北部に位置する共和制国家

        単一の国家というよりは都市国家の寄り合いとしての性格が強いが、古帝国の正統な継承者という旗印のもとに一応の結束を見せている
        レルム半島の南部は古帝国崩壊とともに魑魅魍魎の跋扈する魔境と成り果てており、その奪還が彼らにとって国是となっている

        彼らは故地の回復運動をリナシメントと呼び、建国以来幾度となく遠征を繰り返している
        しかし、今日に至るまで成果は実を結んでいない

        戦力の集中を欠く、後援する商人の意向により遠征目的が迷走する、失敗の理由は様々なようだ
        しかし、実際のところ彼らがどこまで本気なのか疑問が残る点は多い
        "
}
RETURN


code:
;-------------------------------------------------
;;; 勢力_フロリア
;-------------------------------------------------
@FLPEDIA_TITLE_勢力_フロリア()
RESULTS '= "フロリア"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_勢力_フロリア()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_勢力_フロリア()
{
    RESULTS '=  @"
        白霜山脈で二分される中央世界の西側、フロリア半島に国土を持つ伝統的な王政国家
        かつては大陸の覇権を掌握していたが、深刻化する中央の腐敗とともに王国は急速に崩壊に向かっている

        腐敗の打破や既得権益の廃絶を謳う自由主義者の主張が広く支持を集め、ついには王党派と共和派で国家を二分する内戦に突入した
        戦いは激化の一途を辿っており、各地で血で血を争う戦いが繰り広げられている

        各地から傭兵や戦争利権に与ろうとするものが続々と流入しており、水面下では諸外国の介入も続いている
        戦いは収拾の気配が見えない
        "
}
RETURN


code:
;-------------------------------------------------
;;; 勢力_古帝国
;-------------------------------------------------
@FLPEDIA_TITLE_勢力_古帝国()
RESULTS '= "古帝国"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_勢力_古帝国()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_勢力_古帝国()
{
    RESULTS '=  @"
        かつて存在し、中央世界全土を版図に治めた人間の帝国。レルム帝国とも
        レルム半島を中心として栄え、全盛期である第三紀中期に北は北方列島、西はフロリア半島全土、
        東は東方辺境の大半を支配下に置いた
        また、エルフやドワーフの諸族と同盟を結び、大いなる繁栄を謳歌した

        第三紀中期から末期にかけて魔物の組織的な大量侵入を受け、大戦と呼ばれる全面戦争に突入する
        凄絶な総力戦の末これを退けたものの、広大な国土を維持する力を失い瓦解した

        広く中央世界、レルム半島南端からはじまりフロリア西端、東方辺境東端から北海列島に至るまでの地域において、
        人々のアイデンティティを問えば、自身が古帝国の民の末裔であることを否定する者は僅かであろう

        帝国は始めレルム半島の南端において小規模な都市国家として産声を上げる
        始祖帝タウレンドールが周辺領域を次々と併呑し、レルム半島全土を支配下に置き、帝国の建国を宣言したその瞬間は
        人類の年代記における第三紀の始まりとして記憶されることとなった

        帝国の黄金時代として知られる第三紀中期に至って、帝国は現在我々が中央世界として認識する領域の大半をその版図に置いており、
        この時代における中央世界の人間とはすなわち、帝国の市民とほぼ同義であった
        また今日私たちが文化や法、慣習、社会制度として享受する概念の原型はその殆どがこの時代に形成されたといってよいだろう

        従って第三紀中期の終わりから末期にかけて起きた二度に渡る魔物の大侵攻、大戦の結果
        帝国の滅亡によって引き起こされたアイデンティティの喪失もまた凄まじいものであった

        帝国の市民という自己の喪失と共に第四紀が幕を開けて以来、中央世界に暮らすものが、
        例えば王国の臣民や自由都市の民といった、新たな自己を定義出来るようになるまでには数世紀の歳月が必要であった

        もっとも今日においてさえなお、自らのバックグラウンドを喪われた帝国に求めるものは少なくはないのである
        "
}
RETURN


code:
;-------------------------------------------------
;;; 勢力_教皇領
;-------------------------------------------------
@FLPEDIA_TITLE_勢力_教皇領()
RESULTS '= "教皇領"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_勢力_教皇領()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_勢力_教皇領()
{
    RESULTS '=  @"
        中央世界における主たる信仰、大陸正教の総本山
        現在の教皇庁はノアレルムとフロリア国境付近の古都マルティウスに置かれている

        古帝国が大陸正教を国教と定めて以来、教皇と教皇庁の宗教的権威は絶大なものであった
        古帝国の崩壊を受けその力は一旦の衰えを見せたものの、大戦終結の追い風を受け再び中央世界に権勢を誇った

        近年の世俗化の流れを受けてその権威は過去のものになりつつある
        時代の流れと甘受する者、過去の権勢に縋る者、再び神の権威と威光を取り戻さんとするもの、
        宗教家たちの姿勢もまた三者三様である

        彼らの思惑がどのように向こうが、大陸各地に点在する教会が正教の信仰の拠り所であることには変わりはなく、
        インテリジェンスの拠点としてそのネットワークが機能し続けていることもまた確かである
        "
}
RETURN


code:
;-------------------------------------------------
;;; 地理_フォルメン
;-------------------------------------------------
@FLPEDIA_TITLE_地理_フォルメン()
RESULTS '= "フォルメン"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_地理_フォルメン()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_地理_フォルメン()
{
    RESULTS '=  @"
        東方辺境を南北に貫く大河、パラドゥイン河下流域の西岸に築かれたフォルメン市は
        北は北海を経由して乗り入れてくる交易船が、南はレルム半島を介してやってくる行商人が集い、東方辺境の玄関口として大いに発展を遂げている

        第三紀初頭、東方辺境領の属州化に乗り出した古帝国はパラドゥイン河を遡上し略奪を繰り返す北海海賊への対応を迫られる
        フォルメンはその防衛拠点として発展、拡充が重ねられていった

        その後、第三紀中期から末期にかけての大戦の勃発に際して、遡上してくる脅威は海賊から魔物へと変わる
        しかしこの街が地域防衛の要所であることに変わりはなかった

        街をぐるりと囲む背の高い赤レンガの市壁は大戦と続く混迷の時代を通じて拡大拡張を繰り返され、
        今日においては街のトレードマークとして市民や行きかう商人、冒険者に愛されている
        "
}
RETURN


code:
;-------------------------------------------------
;;; 地理_中央大陸
;-------------------------------------------------
@FLPEDIA_TITLE_地理_中央大陸()
RESULTS '= "中央大陸"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_地理_中央大陸()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_地理_中央大陸()
{
    RESULTS '=  @"
        この世界最大の大陸
        %ANAME(MASTER)%の領地を含む中央世界と称される地域は中央大陸西岸の地域にあたる

        大陸の西岸部、内陸部、東岸部及びその周辺には複数の人類文明が栄えている
        相互の交流は僅かながらに存在するものの、地理的要因や魔物のような脅威によって
        大きく阻まれ、隔絶されてきた

        そのため、中央大陸の各地においては、それぞれの文明が独自の文化や歴史を持ち、
        独自の発展を遂げている
        "
}
RETURN


code:
;-------------------------------------------------
;;; 地理_主人公の領地
;-------------------------------------------------
@FLPEDIA_TITLE_地理_主人公の領地()
RESULTS '= "主人公の領地について"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_地理_主人公の領地()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_地理_主人公の領地()
{
    RESULTS '=  @"
        %ANAME(MASTER)%の領地がどこにあるのか？　それは%ANAME(MASTER)%自身が知るところであろう

        東方辺境の僻地か、北方列島に連なる小島か、ある街の郊外か、孤立無縁の地か？
        その答えはおそらく%ANAME(MASTER)%の胸中にあろう

        確かなことは%ANAME(MASTER)%に与えられた小地域は豊かな植生と自然、豊富な鉱物資源に恵まれており
        開拓如何によっては、大きな可能性を秘めているということだ

        さて、何から始めようか？　資材を採集し、工作し、生活の基盤を盤石なものにしてもよい
        あるいはこの土地で商売を始めるのも良いだろう
        むろん開拓など放り出して冒険に明け暮れてもよいし、何もかも放り出して仲間と放埓の日々に耽るのもよい

        ……すべては%ANAME(MASTER)%の手に委ねられている
        "
}
RETURN


code:
;-------------------------------------------------
;;; 地理_大内海
;-------------------------------------------------
@FLPEDIA_TITLE_地理_大内海()
RESULTS '= "大内海"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_地理_大内海()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_地理_大内海()
{
    RESULTS '=  @"
        中央大陸と南方大陸の間に存在する広大な内海
        フロリア半島の南端と南方大陸北岸の接近点であるアノンアンヌーナ海峡
        東はオリエンス地域西南部と南方大陸の接近点であるローメンハイラ海峡によって閉じられた、東西に延びる海である

        両海峡はエルフ語でそれぞれ「西への門」、「東の果て」を意味し、
        古帝国がこの地域の覇権を握る以前、エルフにとっても大内海沿岸地域が彼らの認識する世界の全てであったことを伺わせる

        大内海は中央世界を生きる者すべてにとっての要衝であり、富と繁栄の源であった
        第三紀中期においては帝国と南方大陸北岸のドワーフが海を挟んで活発な交易を行っており、
        大戦終結後においてはノアレルムの商船団が西へ東へと行き交っている
        "
}
RETURN


code:
;-------------------------------------------------
;;; 地理_東方辺境
;-------------------------------------------------
@FLPEDIA_TITLE_地理_東方辺境()
RESULTS '= "東方辺境"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_地理_東方辺境()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_地理_東方辺境()
{
    RESULTS '=  @"
        中央世界を東西に二分する山脈、白霜山脈より東側の地域一帯を指す
        大部分が森林と荒野に覆われた未開拓地帯である
        古来より無数の小勢力が割拠しては消えを繰り返し、今日においてなお各勢力の支配が及ぶことのない空白地帯であり続けている

        この地への本格的な人間の植民が進んだのは第三紀中期、古帝国全盛の時代においてである
        当時最盛を誇っていた古帝国はフロリアム属州、ノルドリアム属州に次ぐ第三の属州として東方属州の開拓に乗り出した
        フォルメンやソドミアのような今日知られる東方属州の有力都市の発展の礎が築かれたのもこの時期のことである

        第三紀末の大戦においては他の地域同様戦火に晒され、北方や東方から流入する魔物の大群との激闘が繰り広げられた

        帝国の崩壊以後は無数の勢力、小国家がこの地で名乗りを上げ、群雄割拠を呈した
        しかしいずれの勢力が勝利を収めることもなく、今日の自由都市による統治に至る

        支配の在り方はその地の都市に委ねられており、街が変われば法と秩序も様変わる
        そして街を一歩出れば、魔物や野盗が闊歩する無秩序で死と危険が隣り合わせの世界が広がっている

        東方辺境は未だ甚だ混沌とした、無秩序で危険な土地である
        しかし、そのコインの裏側には無数の機会と可能性が刻まれている
        故にこの地を訪れる冒険者は後を絶えない
        "
}
RETURN


code:
;-------------------------------------------------
;;; 地理_白霜山脈
;-------------------------------------------------
@FLPEDIA_TITLE_地理_白霜山脈()
RESULTS '= "白霜山脈"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_地理_白霜山脈()
;湯泡郷クエストが攻略済みであること
RETURN QST_SV_QUEST_FLAG:6 == 2

;;; 記事の内容
@FLPEDIA_CONTENTS_地理_白霜山脈()
{
    RESULTS '=  @"
        中央世界の中央を縦断する形で走る大山脈
        北は北海から南はレルム半島北部まで峻厳な山脈が連なっており、この山脈によって中央世界は東西に分断されている
        第四紀現在では山脈より以西はフロリア王国領、以東は東方辺境と区別されている

        白霜山脈のほぼ中心に位置する大山が一つ、ファヌイリエルは古の時代からの霊峰として知られており、
        大陸正教が中央世界の主信仰になる以前から信仰の対象として知られてきた

        山脈の各地には第二紀以前のものと思われる遺跡が点在している
        かつて全盛を誇ったエルフの国家のものと類推されるもの、そしてそれよりはるかに上古、第一紀以前のもの等々
        未だ全容が明らかになっていないものがほとんどである
        "
}
RETURN


code:
;-------------------------------------------------
;;; 歴史_コモンウェルスの成立
;-------------------------------------------------
@FLPEDIA_TITLE_歴史_コモンウェルスの成立()
RESULTS '= "コモンウェルスの成立"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_歴史_コモンウェルスの成立()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_歴史_コモンウェルスの成立()
{
    RESULTS '=  @"
        大戦の終結後、北方諸島の帝国属州ノルドリアムはいくつかの島嶼国家に分裂した
        中でも最大のものは州都が置かれていたノルディア島を治めたノルディア王国である

        ノルディア島は古帝国の成立以前より北海地域における漁業、造船、海運の要衝であり商業で栄えていた
        古帝国の属州ノルドリアムとして帝国に編入された後も、その役割は変わることがなく、
        支配階級の中心である商人と彼らにより結成された商人ギルドが北海地域における貿易と海上防衛を一手に担っていた
        大戦終結後の新秩序の中で属州ノルドリアムはノルディア王国として生まれ変わったが、
        軍事力の要は依然として商人たちが提供する海軍であり続けた

        ノルディア王国は王家を抱きながらも、王の実権そのものはフロリア王国に比して非常に限定されたものであった
        王家の役割は古帝国における属州総督から連なる伝統に根ざした支配の正当性の確保と、
        域内紛争の調停や外交、祭事の執行に限られていたのである

        この流れに一石が投じられたのは第四紀初頭、アイオアニス王の治世のことであった
        彼は古帝国時代の属州総督に与えられた臨時条項を持ち出し、フロリア王国に倣った強固な王権による支配体制の構築を目論んだ
        しかし議会側は王の議会解散の布告を一蹴し、逆にアイオアニスを捕縛し王権を完全に法の支配下に置いた
        国王の統治上の実権の大半は剥奪され、王の失脚とともノルディア王国は北方諸島連合国(コモンウェルス)として再編されることとなる

        こうして名実ともに王国としてのノルディアは終焉を迎えたが、王家自体は象徴的権威として今日も存続している
        大半の実権を議会が掌握した後も、民衆の間では王家がかつての帝権に連なる国家の象徴であることには変わりが無かったし、
        また儀礼的存在の域を出ない以上、あえてそれを改める必要も無かったのである
        "
}
RETURN


code:
;-------------------------------------------------
;;; 歴史_ノアレルム共和国
;-------------------------------------------------
@FLPEDIA_TITLE_歴史_ノアレルム共和国()
RESULTS '= "ノアレルム共和国"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_歴史_ノアレルム共和国()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_歴史_ノアレルム共和国()
{
    RESULTS '=  @"
        古帝国の滅亡後のレルム半島の情勢は混沌の極みであった
        半島南部には魔物の群れがひしめいており、北部には各地から大量に流入した難民で溢れかえっていた
        神出鬼没の魔物の襲撃は止む気配を見せず、政治的空白は解消されぬまま、いたずらに人命だけが喪失されていった

        人類の命運が風前の灯火となったところで、その原因が如何なるものであったかは今なお明らかになってはいないが
        魔物の組織的な侵攻は滞りを見せ、次第に収束していった
        こうして辛うじて人類は一命を繋ぎとめたものの、帝都を含むレルム半島南部は魑魅魍魎が跋扈する地と成り果てており、
        半島北部の帝国都市もその大半が灰燼に帰していた

        帝国の消滅後、皇帝や執政官、元老院議長、議員、あるいはその代理を僭称する者たちが次から次へと現れ、帝国の後継を巡って相争った
        もっとも帝都の失陥時に皇帝と元老院、そして無数の記録の数々はほとんど全て失われており、
        彼らの正当性を証明できる確固たる根拠は何もなかった

        帝国後期における混迷は長きに渡って続いたが、その中でも次第に秩序は再編されていった
        レルム半島北部の無数の勢力が同盟、糾合を繰り返した果に誕生したのがノアレルム共和国である
        極めて分権的な性質を持ち、基本的な統治は各地域を治める共同体によって為された
        外交をはじめ、国家的な意思決定は各共同体の代表によって形成された新元老院によって執り行われている

        共和国の国土はレルム半島北部の東西の要衝を掌握している
        白霜山脈によって隔てられた東西地域間の物流の要として、交易によって各都市は大きく発展した

        一方で半島南部は依然として魔物の支配下であり、深刻な脅威であり続けている
        帝国の後継国家を自任する彼らにとって、かつての帝国領、帝都の奪還は国家の正当性に直結する宿願であった
        リナシメントと呼ばれる国土奪還運動が今日に至るまで幾度となく行われてきたが、なお完遂には至っていない
        "
}
RETURN


code:
;-------------------------------------------------
;;; 歴史_フロリア王国の隆盛
;-------------------------------------------------
@FLPEDIA_TITLE_歴史_フロリア王国の隆盛()
RESULTS '= "フロリア王国の隆盛"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_歴史_フロリア王国の隆盛()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_歴史_フロリア王国の隆盛()
{
    RESULTS '=  @"
        古帝国の滅亡以降魔物の侵攻もまた次第に勢いを失っていったが、それでもなお散発的な人類の支配圏への侵入、攻撃は続いた
        中央の統制が消滅した後も各々の帝国属州、植民市は独自の皇帝や執政官、その代理を擁立し、帝国の後継者を僭称した
        しかしそのいずれも確固たる正当性を欠いており、大戦の終結とともに秩序の再編を余儀なくされた

        フロリア王国は古帝国の崩壊後、かつての帝国属州フロリアムを母体として生まれた王国である
        フロリアム属州は白霜山脈より西側から大洋までを管下に置く古帝国最大の属州であった
        大戦の終結後フロリア王国は属州としての領土を殆どそのまま継承する形で成立し、
        帝国後期における中央世界最大の国家となった

        国土の大半を肥沃な平野と森林が占めており、その恵まれた地理的条件はフロリア王国の発展の基盤となった
        豊かな土地は農業を盛んにし、穀物や果実の生産と森林から得られる豊富な木材は、大戦による荒廃から立ち直ろうとする人類を支え続けた

        しかし大戦の終結後も脅威は完全には去っていなかった
        当時各地に勃興した諸勢力との紛争に加え、魔物の脅威も依然として深刻であった
        国境の森林や山岳地帯は魔物たちの巣窟であり、国防は常に最優先の課題となった
        それらの脅威に対応するべく王権とそれを支える貴族による官僚機構は強化され続け、フロリア王国は強固な中央集権国家的性質を帯びていく

        豊かな経済土壌を地盤としたこの体制はフロリア王国に数世紀に渡る繁栄をもたらした
        しかし長期にわたる安寧の期間において、一極に集中した権力は権益の独占や腐敗、
        それらからくる貧富の差の拡大といった負の側面を次第に顕在化させていった

        既得権益を独占する貴族ら支配階級と、商人を中心とする新興富裕層、彼らの搾取的な支配下におかれた農民、
        これらの階級間の対立は次第に激しさを増し、ついには今日におけるフロリア内戦という形で炸裂することとなる
        "
}
RETURN


code:
;-------------------------------------------------
;;; 歴史_大戦
;-------------------------------------------------
@FLPEDIA_TITLE_歴史_大戦()
RESULTS '= "大戦"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_歴史_大戦()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_歴史_大戦()
{
    RESULTS '=  @"
        第三紀中期から末期にかけて発生した魔物の人類社会への大量侵入を契機とした戦い
        南方大陸の南部から北岸へかけて行われた第一次侵攻とその約五十年後の中央大陸全土における第二次侵攻からなる

        第一第侵攻においては南方大陸北岸を東西に走る黒山脈及びその南部平野において主にドワーフと魔物の間で激戦が繰り広げられた
        この戦いは魔物に大規模な損害を与え侵攻を頓挫させたが、代償としてドワーフの王国の滅亡を招くに至る

        第一次侵攻の結果に危機感を覚えた人間、ドワーフの残存勢力、エルフは諸族の同盟を結び、再び来たるであろう戦いに備えた
        この戦間期の約半世紀間は諸族の交流も極めて活発に行われた

        来る第二次侵攻は、第一次侵攻を遥かに上回る規模で行われた
        中央大陸全土、海という海、あらゆる森林山河、その全て戦域となり、夥しい数の犠牲者を出した
        最盛を誇った古帝国はこの戦いにより帝都を含むレルム半島南部を失陥、瓦解する

        その後も戦いは始終人類の不利に進み、滅亡も時間の問題のように思われた
        しかし魔物の侵攻は次第に勢いを失い自然消滅。人類はすんでのところで命脈を保つに至った
        "
}
RETURN


code:
;-------------------------------------------------
;;; 歴史_年代区分
;-------------------------------------------------
@FLPEDIA_TITLE_歴史_年代区分()
RESULTS '= "年代区分"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_歴史_年代区分()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_歴史_年代区分()
{
    RESULTS '=  @"
        我々中央世界の人間は、その歴史を四つの時代に区分し表現することが殆どである
        すなわち神話の時代である第一紀、人類の有史の幕開けとされる第二紀、
        古帝国が建国により幕を開け、隆盛と滅亡によって幕を閉じた第三紀、
        そして今日に至る第四紀である

        第三紀以前の時代の記録は極めて乏しく、またわずかに存在した資料も大戦により大半が滅失した
        今日においては各地に点在する遺跡や伝承、民話、エルフの語る詩からその様子を断片的にうかがえるのみである
        さらに遡り、神と被造物の関係性が今よりもずっと近かったとされる第一紀に至っては、知る由は殆どない

        しかしながら人類社会の発展とそれに伴う調査手法の発達により、
        第二紀より遥か以前にも高度な文明が盛衰を繰り返していたことが徐々に明らかになりつつある
        我々の歴史をめぐる探求はまだ幕を開けたばかりなのである
        "
}
RETURN


code:
;-------------------------------------------------
;;; 用語_オリエンス・ゲーム
;-------------------------------------------------
@FLPEDIA_TITLE_用語_オリエンス・ゲーム()
RESULTS '= "オリエンス・ゲーム"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_用語_オリエンス・ゲーム()
RETURN IS_SAME_FACTION(NAME_TO_CHARA("UC_オリヴィア"))

;;; 記事の内容
@FLPEDIA_CONTENTS_用語_オリエンス・ゲーム()
{
    RESULTS '=  @"
        レルム半島西岸の付け根に位置する商都リヴィエラと東岸の付け根に位置する干潟の都エスターリア、
        このノアレルムの二大海都は長らくこの地域の商業覇権を巡る好敵手であり、同時に協業者でもあった

        レルム半島南端から南方大陸までの『大内海の喉仏』と呼ばれる海域は海獣、海魔の襲撃が頻発する航行が極めて困難な海域である
        大戦以後の大内海はレルム半島によって東西に分断され、西はリヴィエラ、東はエスターリアの商人の独壇場となった

        大戦以降の時代においてオリエンス以東の地域との交易が活発になると、中央世界の物品はまずリヴィエラで陸揚げされ、
        陸路沿いに東のエスターリアを経由した後、再び海路を行くか、そのまま海岸線伝いにオリエンスへと運ばれるのが常であった
        オリエンスからの物品はその逆を経由し、中央世界へと流入した
        この東方貿易において二つの海都は物品が経由する交易上の要衝だったのである

        これに一石を投じたのはコモンウェルス、ノルディアの台頭である
        近年の産業分野での発展は造船分野にも及んだ。ノルディアの鉄製、鋼製の汽船はその抗堪性、火力においてこれまでの木造帆船を凌駕しており、
        大内海の喉仏に巣くう海魔の脅威を退けることさえ可能であった
        海上戦力の増強はノルディアの商人たちをしてリヴィエラ、エスターリアを経由せずとも独力でレルム半島南端を通過しオリエンス以東へ進出することを可能にした

        これは、これまで交易の中継点として東方貿易の富を独占してきたリヴィエラ、エスターリアにとっては由々しき事態であり、
        彼らもまたレルム半島南端の制海権、そして大内海全体の航路覇権をめぐる鍔迫り合いに身を投じていくことになる
        こうして大内海はノルディアとリヴィエラ、エスターリアの三商人が東方の富を求めてしのぎを削る戦いの場となった

        この東方貿易を巡る商人たちの覇権争いはオリエンス・ゲームと俗称されている
        "
}
RETURN


code:
;-------------------------------------------------
;;; 用語_中央世界
;-------------------------------------------------
@FLPEDIA_TITLE_用語_中央世界()
RESULTS '= "中央世界"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_用語_中央世界()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_用語_中央世界()
{
    RESULTS '=  @"
        中央大陸西岸部、レルム半島を中心とし、東は東方辺境、北は北海列島、西はフロリア半島、
        そして南方大陸北岸部を指す地域の総称

        古帝国、そして古帝国をルーツに持つ人間たちにとって世界の中心とは帝都のあるレルム半島であった
        従って、実際には中央大陸全体の西側の一部地域であるにもかかわらず、この地は中央世界と呼称され
        そう呼ばれることに特段誰も疑念を抱きはしなかった

        古帝国の時代において、帝国こそが人類社会の中心であることは疑いようのない事実であったし
        そもそもこの地に暮らす人間にとって、既知世界とは中央大陸西岸部と南方大陸北岸の一部の域を出なかったからである

        しかしながら今日において、このいわゆる『帝国史観』に対して、疑念を抱き始めた歴史学者は少なくはない
        なぜなら広く中央大陸全体で見れば、帝国以外にも無数の人類の勢力が存在しており、
        それらは単に地理的な要因や魔物のような脅威によって相互に隔絶されていたに過ぎなかったからである

        実際に遠洋航海に従事する船乗りや隊商を率い東の地、オリエンスやヒンダースに向かう貿易商人たちは
        世界がよりずっと広いことを知っている

        もっともこの地に住まう大部分の人間にとって、世界の中心は未だ帝国の故地であり、
        そのことは今後もそう変わることはないであろう
        "
}
RETURN


code:
;-------------------------------------------------
;;; 用語_魔導工学
;-------------------------------------------------
@FLPEDIA_TITLE_用語_魔導工学()
RESULTS '= "魔導工学"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_用語_魔導工学()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_用語_魔導工学()
{
    RESULTS '=  @"
        マナを用いた魔術の行使には先天的な才覚が必要である。これは長らく覆すことのできない真理とされてきた
        錬金術師たちは魔術師たちの唱えるこの定説を覆すべく、魔術の動作原理を論理的、科学的に解明することに心血を注ぎ続けた

        魔術師の詠唱を介在しないマナの行使の形態として、巻物やアーティファクト、付呪といった手法はこれまでも存在した
        彼らはこれに着目し、その原理の体系化、論理化をはかり、触媒を用いることで魔術師の詠唱を介在しない形での力の発現を可能にした
        この試みはついには魔導工学という形で結実し、先天的な才覚に依らずとも一定のマナの行使が可能となったのである

        規格化、非属人化されたマナの行使は特に産業分野において目覚ましい活躍を見せ、
        魔導工学研究の中心地であるアカデミーを有するノルディアは魔導工学の産業的利活用によって爆発的な発展を遂げつつある
        "
}
RETURN


code:
;-------------------------------------------------
;;; 種族_エルフ
;-------------------------------------------------
@FLPEDIA_TITLE_種族_エルフ()
RESULTS '= "エルフ"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_種族_エルフ()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_種族_エルフ()
{
    RESULTS '=  @"
        流麗な長命の種族。古来から魔法の取り扱いに長けているが肉体的には華奢
        古帝国時代には人間と同盟関係にあったが、古帝国の崩壊とともに中央世界からは緩やかに姿を消しつつある

        エルフが中央世界に姿を現したのは第二紀の初頭とされている
        彼らが西方の地と呼ぶ世界から入植を開始し、その高度な文明力と知識を持って、瞬く間に中央世界を席巻した
        しかしその後は緩やかに衰退し、その覇権を人間に譲ることとなる

        第四紀の今日においては概して定住することは少なく、小規模なコミュニティを形成して各地を流浪している
        種族全体としてどこか隠者めいた雰囲気を漂わせ、概ね自らの衰退を受け入れているようである
        一方で人間社会に順応し、一定の地位を得る者もわずかながら存在するようだ

        魔法に対して優れた洞察を持つものの魔導工学には大半の者が興味を示さず、唯物的すぎるとして忌み嫌う者もいる
        "
}
RETURN


code:
;-------------------------------------------------
;;; 種族_ドワーフ
;-------------------------------------------------
@FLPEDIA_TITLE_種族_ドワーフ()
RESULTS '= "ドワーフ"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_種族_ドワーフ()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_種族_ドワーフ()
{
    RESULTS '=  @"
        極めて手先が器用なことで知られる種族
        男女ともに低身長で男性は頑強で筋肉質、女性は肉感的で豊満な肉体が特徴

        地下を好みかつては鉱石の採掘や加工で南方大陸を中心に反映した
        南方大陸北岸、黒山脈の地下には彼らの巨大な都が存在したが、第三紀中期の戦いの末都が滅亡すると四散、
        多くの者は大内海を渡って人間の勢力圏に移住した

        生来手先が器用であり道具や器具の製造に長けていおり、鍛冶や冶金分野では特に優れた能力を発揮した
        そのことから職人として重用され比較的スムーズに人間社会に順応したようだ
        現存する都市の工房や工場で出自が彼らに由来するものは少なくない

        人間社会への適合とともに混血が進み、純血種のドワーフの姿は減りつつある
        "
}
RETURN


code:
;-------------------------------------------------
;;; 種族_人間
;-------------------------------------------------
@FLPEDIA_TITLE_種族_人間()
RESULTS '= "人間"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_種族_人間()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_種族_人間()
{
    RESULTS '=  @"
        今日の中央世界においてもっとも栄える種族
        長命で百年弱程度の寿命を持ち、そつのない身体能力と高度な組織性を持つ

        人間の最大の国家である古帝国が崩壊して以来、その勢力圏は大幅に減退したが
        近世紀の文明の復興と発展により勢いを盛り返しつつあり、各地へ盛んに進出している

        大戦の災禍から復興した人間は新たな時代を迎えつつある
        魔物は依然として脅威であることに変わりはない
        しかし銃や火器の発達、魔法の研究開発、そしてそれらを駆使した軍事力の強大化
        それらを後押しする工業、産業の発展は人間とその社会に、脅威に対抗しそれを克服する力を与えつつある

        一方でそれは人間と魔物の対立に加え、国家間、人間同士の戦いという新たな図式をも生み出しつつあった

        帝国という時代が終わり、長く暗き夜の時代も終わりを迎えつつある
        我々は、窓から差し込む払暁の先に何を見るのだろうか？
        "
}
RETURN


code:
;-------------------------------------------------
;;; 種族_獣人
;-------------------------------------------------
@FLPEDIA_TITLE_種族_獣人()
RESULTS '= "獣人"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_種族_獣人()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_種族_獣人()
{
    RESULTS '=  @"
        おおよそ人類に酷似しているが、身体に動物的な器官（尻尾や頭頂の耳、毛皮質の体毛など）と
        特性（鋭敏な嗅覚や聴覚、虚弱な視力や色覚など）を色濃く有した種族の総称

        犬人（カニノール）、猫人（フェリノール）、狐人（ヴルピノール）、兎人（レプノール）などにさらに細分化される
        なお半身がほぼ完全に馬であるケンタウロスをこの属として扱うかは議論の分かれるところである

        その大半が南方大陸にルーツを持ち、黒山脈以南に彼ら独自のコミュニティを築いて暮らしていた
        第二紀末から第三紀初頭にかけて、ドワーフにより彼らの多くは征服され、奴隷として農耕や鉱山労働に使役される
        第三紀中期以降に古帝国とドワーフの間で活発な貿易が取り交わされるようになると、彼らは\"商品\"として中央世界に流入した
        中央世界での彼らの地位にはさほど変わりはなく使役者がドワーフから人間に変化しただけである
        ごく稀に自ら自由民の地位を獲得する者もいたが、大半は奴隷として一生を終えた

        彼らに転機が訪れたのは第三紀中期の終わりに生起した大戦である

        緒戦の敗北により人的資源の払底した帝国は形振り構わぬ戦力の再結集を図らねばならなくなった
        そこで目を付けられたのが中央世界に多数流入していた獣人奴隷の存在であった
        帝国は彼らに自由民の地位と引き替えに軍役を課し、奴隷たちも数多くが自由を求めて戦いに身を投じた
        結局のところこの契約は、帝国の崩壊によって空手形に終わるが、帝国の消滅とともに獣人たちに課せられていた奴隷契約も
        大半が霧散してしまったため、彼らはなし崩し的に自由を得る格好となった

        今日において獣人を巡る境遇は多様であり、社会的成功を収める者も少なくはない
        だが、永らく奴隷待遇にあった歴史が、差別や偏見という形で彼らの健全な社会参与を阻む重しとなっているのは確かである

        結果として再び奴隷的地位に置かれるもの、傭兵や冒険者といった非定形的な生業を営むもの、
        売春、犯罪、密輸、その他反社会的な稼業に手を染めるものなど彼らの地位を下層に押し止めている

        そのこと自体が彼らの差別や偏見を増長する負の循環を生んでいるようだ
        "
}
RETURN


code:
;-------------------------------------------------
;;; 種族_魔物
;-------------------------------------------------
@FLPEDIA_TITLE_種族_魔物()
RESULTS '= "魔物・魔獣・魔族"
RETURN

;;; 記事の表示フラグ
@FLPEDIA_IS_ACTIVE_種族_魔物()
RETURN 1

;;; 記事の内容
@FLPEDIA_CONTENTS_種族_魔物()
{
    RESULTS '=  @"
        人に対して害をなす生き物の総称
        ゴブリンからドラゴン、アンデッドまで広く含まれる

        人間を含む人類種に対して明確な敵意を抱いている点で動物と区別される
        動物と同じく生態は様々であり、基本的には各々が本能の向くがままに行動しているようだ

        例外は第三紀中期から末期にかけて発生した大戦と呼ばれる魔物の人類圏への大量流入である
        これは人類種を滅亡させるという明白な意思のもと、極めて組織的に行われた

        何が彼らを突き動かしたのかは定かではない
        しかし、南方大陸南部から北岸へかけて行われた一次侵攻、中央大陸全域において発生した二次侵攻は
        古帝国を死に至らしめ、おびただしい量の犠牲者とともに人類の歴史と社会に癒えがたい爪痕を残した
        "
}
RETURN


code:
;-------------------------------------------------
;;; アイコン表示関連
;;; TAG_PRINTで表示する前提(HTMLの場合はIS_HTML = 1)
;;; 追加する際のUNICODE値は以下を参照
;;; font\game-icons.txt
;-------------------------------------------------
@ICON(ICON_ID, IS_HTML = 0)
#FUNCTIONS
#DIMS ICON_ID
#DIM  IS_HTML
#DIMS DYNAMIC ICON_STR
SELECTCASE ICON_ID
    CASE "HRT", "HEART"
        ICON_STR = %UNICODE(0xf738)%
    CASE "CHARM"
        ICON_STR = %UNICODE(0xf333)%
    CASE "CHESS-KING"
        ICON_STR = %UNICODE(0xf347)%
    CASE "CHESS-BISHOP"
        ICON_STR = %UNICODE(0xf346)%
    CASE "CHESS-PAWN"
        ICON_STR = %UNICODE(0xf349)%
    CASE "CHESS-QUEEN"
        ICON_STR = %UNICODE(0xf34a)%
    CASE "CHESS-KNIGHT"
        ICON_STR = %UNICODE(0xf348)%
    CASE "CHESS-ROOK"
        ICON_STR = %UNICODE(0xf34b)%
    CASE "TALK"
        ICON_STR = %UNICODE(0xf335)%
    CASE "TALK2"
        ICON_STR = %UNICODE(0xfe1f)%
    CASE "CHEST"
        ICON_STR = %UNICODE(0xf8b3)%
    CASE "SHOP"
        ICON_STR = %UNICODE(0xfc6a)%
    CASE "HEALTH"
        ICON_STR = %UNICODE(0xf724)%
    CASE "TENT"
        ICON_STR = %UNICODE(0xf158)%
    CASE "SWORD-CROSS", "BATTLE"
        ICON_STR = %UNICODE(0xf40c)%
    CASE "DOOR"
        ICON_STR = %UNICODE(0xf37f)%
    CASE "ANVIL"
        ICON_STR = %UNICODE(0xf0d4)%
    CASE "HORSE"
        ICON_STR = %UNICODE(0xf785)%
    CASE "ATK"
        ICON_STR = %UNICODE(0xfb6c)%
    CASE "DEF", "SHIELD"
        ICON_STR = %UNICODE(0xfc57)%
    CASE "MAG"
        ICON_STR = %UNICODE(0xf8a2)%
    CASE "ARMOR"
        ICON_STR = %UNICODE(0xf34c)%
    CASE "AGI"
        ICON_STR = %UNICODE(0xff6f)%
    CASE "TARGET"
        ICON_STR = %UNICODE(0xfe2f)%
    CASE "BOOK"
        ICON_STR = %UNICODE(0xfa00)%
    CASEELSE
        RETURNF @"%UNICODE(TOINT(ICON_ID))%"
ENDSELECT

IF IS_HTML
    RETURNF @"%ICON_STR%"
ELSE
    RETURNF @"@F:game-icons@%ICON_STR%@/F@"
ENDIF