code:
�����Ɖ����łɂ���
�{��Emuera�̃o�O�C�����s�������̂ƂȂ�܂��B

���J�����j
Emuera�{�Ƃ��Ή���~��ԂƂȂ��Ă��邽�߁A���Ɖ����ł̓R�[�h�̃x�[�X�Ƃ��邽�߂Ƀo�O�C���ȊO�̕ύX���s��Ȃ����̂Ƃ��܂�

�����C�Z���X
Emuera�{�̂ɏ����܂��B

���h���\�t�g�̍쐬�ɂ���
Emuera�̃��C�Z���X�ɏ]���Ă���������Ύ��R�Ƀt�H�[�N���Ă��������č\���܂���B
�ނ���A�V�@�\���~�������̏ꍇ�ɂ͐ϋɓI�Ƀt�H�[�N���Ă���������΂Ǝv���܂��B
���̍ۂ�Emuera�̃��C�Z���X�t�@�C���̓Y�t�ƂƂ��ɁA�t�H�[�N���ɂȂ����x�[�X�o�[�W�����̖��L�����肢�������܂��B
�iEmuera�̃��C�Z���X�t�@�C�������\�t�g�̃��C�Z���X�t�@�C�������˂邽�߁A�{�t�@�C���̓Y�t�͕s�v�ł��B�j

�����݂̃x�[�X�o�[�W����
�EEmuera1824+v11
�@��v10�Ŏ�荞�񂾕ύX��F�X�`���[�j���O+���C��
�@�@�@�Â������ł�UI�̃��X�|���X������+�\���ʒu�������Ȃ�Ȃ�����

���ߋ��̏C�����e
�EEmuera1824+v10
�@��Emuera1823+v1�̃c�[���`�b�v����̕ύX��1824�Ɏ�荞�܂�ĂȂ������̂Œǉ�
�@��VARSET����������Ő���ɋ@�\���Ȃ��̂��C��

�EEmuera1824+v9
�@��ARRAYMSORT��Int32�͈̔͂��������Ȃ��̂�Int64�͈̔͑S�̂Ɋg��
�@�@�@���̂܂܂ł͂��܂������Ȃ����Ƃ��A������Ɠ����Ђ˂�΂ł��Ă��܂����̂ł���B
�@�������̕ϐ���`��TYPO���������̂��C��
�@�@�@����܂Ŗ��ɂȂ�Ȃ��������N���g���ĂȂ��@�Ƃ����킩��₷�����W�b�N

�EEmuera1824+v8.1
�@����O�������̃G���[���O�o�͎��̃t�@�C�����\�����t���p�X�Ȃ̂������łȂ��悤��

�EEmuera1824+v8
�@���ċN�����̉摜�f�[�^�̃N���A�������Ƃł��Ă��Ȃ��̂��C��
�@��WINAPI���[�h���̍ċN�����ɓ����ŗ�O���N���肻�̂܂ܗ����Ă��܂����Ƃ��������̂��C��

�EEmuera1824+v7
�@��ERH�t�@�C�����ŋN�����G���[�𐳂����L���b�`���ď������~�߂��Ă��Ȃ��o�O���C��
�@�@�@������ʂ̃G���[�Ղɂ��Ȃ�킯�ł���
�@�@�@���Ȃ݂ɍ\�����̂��̃G���[�ƁA�s��͎��̃G���[�̗���������Ƃ����������������Ă����Ƃ������M���O

�EEmuera1824+v6.2
�@��UNICODE�֐��̌x���\������Ŏ��O��͎���Restructure����Ă�ꍇ��.Net��O�ɂȂ�̂��C��
�@�@�@���s���ɔ��o�����ꍇ�Ƃ����ς��Ȃ��Ƃ����Ȃ������ł��ˁA�͂�

�EEmuera1824+v6.1
�@��UNICODE�֐�����̕ύX
�@�@�@���s�ɑΉ����鐧�䕶��0x0A��0x0D�͒ʂ��悤�ɕύX
�@�@�@���łɂ��肨���Œ��ӕ����o���V�X�e����������̂ŁA�x�����󕶎����Ԃ��悤�ɕύX

�EEmuera1824+v6
�@��UNICODE���\�b�h�����䕶���ɑΉ����鐔�����󂯕t���Ȃ��悤��
�@�@�@0�ł͎��Q����P�[�X�񍐂���Ă���̂̑��͂���܉e���Ȃ��Ƃ͎v���킯�����O�̂���
�@�@�@�킴�Ƃ����̈ȊO�Ȃ��Ǝv���̂ŃG���[�����ł�����
�@�������R�[�h�̖��ʂ𐮗����ێ�ʂł̕ύX���
�@�@�@�G�ȃR�[�h�̑������I�킷�����̂�

�EEmuera1824+v5
�@��STRJOIN���������̈����n���h�����O���U���Ŏ��̂�܂���Ȃ̂��C��
�@�@�@�ق�Ǝ��������r���[������orz

�EEmuera1824+v4
�@��+v1�̏C�������r���[�ł���ς�G���[�f���̂��C��
�@�@�@�`�F�b�N���Â�����
�@��HTML_PRINT��<button>�^�O��value��32bit�����𒴂���l�̏ꍇ�{�^���ɂȂ�Ȃ��̂��C��
�@�@�@���p�I�ɂ͖��ɂȂ�Ȃ��C�����邪

�EEmuera1824+v3
�@���s�A���ǂݍ��ݎ���FORM������{���l�ϐ�}���擪�ɂ���ƍ����Ɍ딚���ė�O����蓊���Ă���̂��C��
�@�@�@�����A���̔���̎d������딚�����ATrimStart�������ĂȂ��񂾂�H

�EEmuera1824+v2
�@��HTML_GETPRINTEDSTR���������Ȃ��Ԃ�l��Ԃ��P�[�X������̂��C��
�@�@�@���@��@�́@�Ё@�ǁ@��

�EEmuera1824+v1�i�����ւ��Łj
�@��STRJOIN�������Ƀo�O���Ă��ǂ��납�A�d�l�ɑ΂��Ď�����gdgd�ɂȂ��Ă����̂��C��
�@�@�@�����炭�A�����̎d�l�ς������Ɏ��������r���[���������ۂ�orz

�EEmuera1823+v1
�@��TOOLTIP_SETDELAY��TOOLTIP_SETDURATION�𕹗p�����ꍇ��DELAY�������Ȃ��o�O���C��
�@�@�@C#���ɕ��p�ł���d�g�݂��Ȃ��̂��������c
�@���e�X�g�łōs�����c�莞�Ԕ�\����TINPUT��AWAIT�̋����ύX����荞��
�@�@�@������񂪂񂪂�e�X�g��ԁA���̂�����ܰ��R(߁��)�(߁��)�(߁��)�ܰ�

�EEmuera1822+v1
�@����̓��[�h���̃`�F�b�N�t�@�C���̔���̃G���o�O�C��
�@�@�@1821+v11�̗���\���s���̃o�O�C���ɂ�鎖�̂ł���

�EEmuera1821+v11.1
�@��REPEAT�AFOR�̓���q���G���[��������x�������Ɉ�������
�@�@�@�l�I�ɂ̓G���[�ł��������A�����I�ɂ͂������̕����Ó����ȁ[�Ƃ��v���Ԃ��Ă݂�
�@�@�@���łɌx�����ɖ������[�v�̎w�E��ǉ�

�EEmuera1821+v11
�@������\���s�����ݒ�𖳎�����10000�s�Œ�ɂȂ��Ă����̂��C��
�@�@�@���ł���Ȓ��r���[�Ȃ��Ƃ��Ă��̂��c
�@��#REF�Œ�`���ꂽ�ϐ��̑z��d�l�Ɠ������������݂����ĂȂ��̂��C��
�@�@�@���������̖��Ȃ̂ŃR�[�f�B���O��̉e���͂Ȃ��ƐM������
�@��v9,v9.1�̒ǉ��x���܂��̐F�Xtweak
�@�@�@������COUNT�̈����i�萔�̏ꍇ�̂݁j������悤�ɁAeraMegaten�ꂿ��񂠂���ł������딚���Ă��̂Łc
�@�@�@��A���d���ň�����������REPEAT��FOR�ɑ΂��đΉ��Ȃ��x�����Z�b�g�ɂȂ��Ă��܂��̂ŁA������o�Ȃ��悤�ɂ�����Ƃ�������

�EEmuera1821+v10
�@��STRJOIN����1�������`�`NAME�̂悤�Ȓ萔������z��̏ꍇ�����ɗ�O�f���̂��C��
�@�@�@���̏ꍇ�����N���邩�����甲���Ă�
�@��v9�A9.1�̕ύX�����œ�������ŗ�O����Ԃ̂��C��
�@�@�@�������A���̗�O�����=���̍s���G���[���N�����Ă���A�Ȃ̂ŁA���ꂪ���낤�����̍s��100%�G���[�ł�

�EEmuera1821+v9.1
�@��REPEAT�Ȃ�т�COUNT�����[�v�ϐ��ɂƂ�FOR�����d�ɂȂ��Ă���ꍇ�̃G���[�\���ǉ����������`�F�b�N���Ȃ��ꍇ�����ɗ�O�f���̂��C��
�@�@�@����A���̐ݒ�̂��Ɠ����甲�������Ă�
�@�@�@
�EEmuera1821+v9
�@��PRINTBUTTON�n�Ȃ�т�PRINTPLAIN�n�����������SETCOLOR�𔽉f���Ȃ������C��
�@�@�@����A����͐݌v�������A�ԈႢ�Ȃ�����
�@��REPEAT�Ȃ�т�COUNT�����[�v�ϐ��ɂƂ�FOR�����d�ɂȂ��Ă���ꍇ�̃G���[�\���ǉ�
�@�@�@�֐��ׂ������͂������ɖ����ł�

�EEmuera1821+v8
�@��COPYCHARA�AADDCOPYCHARA�����[�U�[��`�L�����N�^�ϐ����R�s�[���Ȃ������C��
�@�@�@�������ɑ���������������AEmu�̐l�̍�ƘR��̌��Z��H

�EEmuera1821+v7.2
�@��������z��̌����֐�STRJOIN�̒ǉ�
�@�@�@�����FSTRJOIN(���z��ϐ���{, ����؂蕶����, ���z��Y�����J�n�ʒu��, ���z��Y�����v�f����})
�@�@�@���e�F�c�[���`�b�v�̍ő�\�����Ԃ�[�\������(ms)]�ɐݒ�
�@�@�@�����F���z��ϐ����F���������z��ϐ��A�L�����ϐ����w�肵���ꍇ�G���[�ɂȂ邩��
�@�@�@�@�@�@����؂蕶���񁄁F�����̂����ɗv�f�Ԃɉ����镶����A���̌���̓��ꏈ�����l�A�ȗ�����","�������I�ɓK�p����܂��i��؂蕶�����K�v�Ȃ��ꍇ��""��^���Ă��������j
�@�@�@�@�@�@���z��Y�����J�n�ʒu���A���z��Y�����v�f�����F�w�肵���ꍇ�@�z��Y�����J�n�ʒu��i���J�n�ʒu�{�z��Y�����v�f���@�͈̔͂Ō�������
�@�@�@�@�@�@��҂��w�肷��ꍇ�A�O�҂ȗ��s��
�@�@�@�ŏ�JOIN�ɂ��悤�Ǝv�������ǎ��̂����肻�������炱������
�@�@�@ver7.1�ň����d�l�ύX
�@�@�@ver7.2�Ő��l�z��ɕϐ��A��؂蕶����̏����ɖ�肪�������̂ŏC��

�EEmuera1821+v6
�@��SORTCHARA�����[�U�[��`�ϐ��ōs���Ɨ�O�`���h�[���ɂȂ�̂��C��
�@�@�@���̃p�^�[���z�肵�Ȃ��R�[�h�ŕ��u���Ă��́A�ǂ���Emu�̐l�ł����[�H

�EEmuera1821+v5.2
�@��@USERXXX�n�V�X�e���֐���REUSELASTLINE�𗘗p�����V�X�e�����������n���ɂ��āA
�@�@REUSELASTLINE���߂̈������󔒂łȂ��ꍇ�A�V�X�e�������b�Z�[�W�̕\�����s��Ȃ��悤�ɕύX
�@�@�@�������A����𗘗p���ăX�N���v�g����REUSELASTLINE��p���ă��b�Z�[�W��\�����������ꍇ�A
�@�@�@�V�X�e�����������ƃ^�C�~���O���قȂ�֌W��A���͒l�̕\���������ŃN���A�ł��Ȃ����߁A
�@�@�@���͒l�̕\�������������ꍇ�AREUSELASTLINE�̑O��CLEARLINE 1���s���K�v������܂��B

�EEmuera1821+v5.1
�@��v5�̕ύX��STRFORM�̈�����������ϐ��̏ꍇ�̋��������������Ȃ����̂��C��
�@�@�@�����`�F�b�N�̃^�C�~���O�ŋ������ς��͔̂��ɂ�낵���Ȃ�
�@��TOOLTIP_SETDURATION���ݒ肳��Ă���Ƃ��̃c�[���`�b�v�̕\���ʒu��tweak
�@�@�@�}�E�X�J�[�\���̂�≺�ɕ\�������悤�Ɉʒu�ݒ�

�EEmuera1821+v5
�@��STRFORM���������U�镑��Ȃ��o�O���C��
�@�@�@���Ȃ�N���e�B�J���ȃo�O�Ƃ������A�����܂Ŕ������Ȃ������̂������Ƃ������x��

�EEmuera1821+v4
�@���ꕔ���߂̃G���[���̕\�������������̂��C��
�@�@�@�R�s�y�����當�ʏC����Y��Ȃ��̂͑厖�ȍ�Ƃł���H
�@����̓��[�h���̓R���t�B�O�ɂ�炸10000�s�܂Ńf�[�^��ێ�����悤��
�@�@�@�ꕔ�o���A���g�͂���ł����܂�Ȃ����A����ȏ�̓������s���Ƃ̌��ˍ����������n�߂邽�߂������ɂ���ŋ����Ă�������

�EEmuera1821+v3.1
�@������TOOLTIP_SETDURATION�̋����Ɋւ���tweak
�@�@�@�\�����߂̎��Ԏw�������windows���̎d�l��short�̍ő�l�ł���32767���傫�Ȓl��n���Ɩ��������悤�Ȃ̂�
�@�@�@short�̍ő�l�𒴂���ꍇ��32767�������Ƃ���悤�ɕύX

�EEmuera1821+v3
�@���c�[���`�b�v�̕\�����Ԃ�ݒ肷�閽��TOOLTIP_SETDURATION��ǉ�
�@�@�@�����FTOOLTIP_SETDURATION [�\������(ms)]
�@�@�@���e�F�c�[���`�b�v�̍ő�\�����Ԃ�[�\������(ms)]�ɐݒ�
�@�@�@�����F[�\������(ms)]�F0�ȏ�̐����l�@0�̏ꍇ�f�t�H���g�̋����ɂȂ�܂��A��^�C�}�[�̓�����ɒ[�ɒZ�����Ԃ͑z��ʂ�ɓ����Ȃ������ˁ[

�EEmuera1821+v2.1�iýČ������J�j
�@���ċN�����A_fixed.config�̕ύX�ɑ΂��āA�R���t�B�O�_�C�A���O�̌Œ��Ԃ��ǐ����Ȃ��̂��C��

�EEmuera1821+v2
�@��PRINT�n���߂̑唼��SKIPDISP�𖳎�����Ƃ��������R����C��
�@�@�@CALLTRAIN�g���ƂЂǂ����ƂɂȂ�܂��ˁA�͂�

�EEmuera1821+v1
�@��1821+v2�̏C�����L�����N�^�ϐ��ɓK�p����ĂȂ��̂��C��

��Ə]���ҁF�D�j|�t�)�̒��̐l


code:
;関数置き場
;-------------------------------------------------
;アイテム販売状況@ITEMSTOCK
;戻り値1 アイテムが存在しない
;戻り値2 売切
;戻り値3 お金が足りない
;戻り値4 条件を満たしていない
;戻り値5 すでに99個所持している
;-------------------------------------------------
@ITEMSTOCK(ARG, 値段)
#FUNCTION
#DIM 値段
SIF !STRLENS(ITEMNAME:ARG)
	RETURNF 1
SIF ITEMSALES:ARG == -2
	RETURNF 4
SIF ITEMSALES:ARG == -1
	RETURNF 2
SIF MONEY < 値段
	RETURNF 3
SIF ITEM:ARG >= 99
	RETURNF 5
RETURNF 0

;-------------------------------------------------
;関数名:CHOICE
;概　要:２～４択関数
;引　数:ARGS:0…質問内容
;      :ARGS:1～4…選択肢の文字列(3,4は省略可)
;戻り値:ユーザ入力結果(0～3)
;選択条件の無い、シンプルな選択肢作成関数
;口上とかでも使えるかもしれない
;とりあえず4択まで。増やしてもいいけど
;-------------------------------------------------
@CHOICE(ARGS:0, ARGS:1, ARGS:2, ARGS:3, ARGS:4)
PRINTSL ARGS:0
FOR LOCAL, 0, 4
	PRINTFORML [{LOCAL}] - %ARGS:(1 + LOCAL)%
	SIF LOCAL && !STRLENS(ARGS:(2 + LOCAL))
		BREAK
NEXT
$INPUT_LOOP
INPUT
SELECTCASE RESULT
	CASE 0 TO LOCAL - 1
	CASEELSE
		CALL SIMATTYAUOJISAN
		CLEARLINE 1
		GOTO INPUT_LOOP
ENDSELECT
RETURN RESULT
;-------------------------------------------------
;選択肢を表示し入力結果を返す関数 条件を満たさない選択肢をグレー表示にして無効にすることが可能
;引数にセリフと条件(0で無効、非0で有効)を指定。最大7個まで
;戻り値は選択した選択肢の番号
;-------------------------------------------------
@ASK_M(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)
#DIM CONST 選択肢上限 = 6
CURRENTREDRAW
LOCAL:0 = RESULT
REDRAW 0
FOR LOCAL:0, 0, (選択肢上限 + 1)
	IF ARGS:(LOCAL:0) != ""
		IF ARG:(LOCAL:0)
			PRINTBUTTON @"{LOCAL:0, 2, RIGHT}[%ARGS:(LOCAL:0)%]", LOCAL:0
		ELSE
			SETCOLOR 0x606060
			PRINTPLAINFORM {LOCAL:0, 2, RIGHT}[%ARGS:(LOCAL:0)%]
			RESETCOLOR
		ENDIF
		PRINTL
	ENDIF
NEXT
$INPUT_LOOP
INPUT
IF RESULT < 0 || RESULT > 選択肢上限 || ARGS:RESULT == "" || !ARG:RESULT
	CLEARLINE 1
	GOTO INPUT_LOOP
ENDIF
REDRAW LOCAL:0
RETURN RESULT
;-------------------------------------------------
;現金とカリスマどちらでも払える選択肢のための関数
;-------------------------------------------------
@PAY_YEN_OR_CM(ARG,ARG:1)
PRINTFORML [0] やめる
PRINTFORML [1] %金額表示(ARG)%払う　　（現在の所持金：%金額表示(MONEY)%）
PRINTFORML [2] CM%三桁区切(ARG:1)%払う　（現在の所持カリスマ：CM%三桁区切(MONEY:2)%）
$INPUT_LOOP
INPUT
SELECTCASE RESULT
	CASE 0
	CASE 1
		IF MONEY < ARG
			PRINTFORMW お金が足りません
			GOTO INPUT_LOOP
		ENDIF
		MONEY -= ARG
	CASE 2
		IF MONEY < ARG:2
			PRINTFORMW カリスマが足りません
			GOTO INPUT_LOOP
		ENDIF
		MONEY -= ARG:2
	CASEELSE
		GOTO INPUT_LOOP
ENDSELECT
RETURN RESULT
;-------------------------------------------------
;関数名:GET_REVISION
;概　要:汎用補正値取得関数
;引　数:ARG:0…参照する数値
;戻り値:補正後の値
;備　考:式中関数
;ある数値を、上限値に漸近していく数値に変換したいときに
;上昇率が小さいとすぐに上限に達する、大きいと逆になかなか上限まで近づかない
;-------------------------------------------------
@GET_REVISION(ARG:0, 上限, 上昇率)
#FUNCTION
#DIM 上限
#DIM 上昇率
RETURNF 上限 - 上昇率 * 上限 / (上昇率 + ARG:0)

;eg 10000,2000,20000だと2000-2000*20000/30000

@GET_REVISION2(ARG:0, 上限, 上昇率)
#FUNCTION
#DIM 上限
#DIM 上昇率
RETURNF 上限 * (ARG:0 + 1) / (上昇率 + ARG:0 + 1)

;-------------------------------------------------
;関数名:GET_REVISION3
;概　要:汎用補正値取得関数
;引　数:num…参照する数値　TH:0~2…しきい値1~3
;-------------------------------------------------
@GET_REVISION3(num, TH:0, TH:1, TH:2)
#FUNCTION
#DIM TH, 3
#DIM num

FOR LOCAL,0,3
	SIF num <= TH:LOCAL || !TH:LOCAL
		RETURNF num
	;引数がTHを超えてたら超過分をSQRT*2
	num = TH:LOCAL + SQRT(num - TH:LOCAL) * 2
NEXT

RETURNF num

;10000, 50, 100, 200なら124

;-------------------------------------------------
;関数名:PRINT_BASE
;概　要:汎用補正値取得関数
;引　数:ARGS バーの名前
;		ARG:0…参照するキャラ番号
;       ARG:1…ベースの番号
;       ARG:2…バーの長さ
;BARを表示させたいときに
;-------------------------------------------------
@PRINT_BASE(ARGS,ARG:0,ARG:1,ARG:2)
PRINTFORM %ARGS,%
BAR BASE:ARG:(ARG:1),MAXBASE:ARG:(ARG:1),ARG:2
PRINTFORML ({BASE:ARG:(ARG:1)}/{MAXBASE:ARG:(ARG:1)})

;FileName_COMMON.ERB ------------------------------- Rev1.00
;文字入りライン表示関数
;CALL		USER
;ARG		ARGS:表示ライン名, ARG:0 line_to_"-", ARG:1 ライン長
;RETURN		VOID
;COMMENT
;-----------------------------------------------------------
@DRAW_INFORMATIONLINE(ARGS,ARG,ARG:1)
#DIMS EQUAL
#DIMS MINUS
EQUAL = =
MINUS = -
LOCAL = ARG:1

IF ARGS =="Info"
	SIF TFLAG:Info表示中
		RETURN
	TFLAG:Info表示中 = 1
ENDIF
SIF !ARG:1
	LOCAL = 150
IF ARG == 1
	PRINTSINGLEFORMS "-- %ARGS% " + "%(MINUS * MAX((LOCAL - STRLENS(ARGS)),0))%"
ELSE
	PRINTSINGLEFORMS "== %ARGS% " + "%(EQUAL * 150)%"
ENDIF
;-------------------------------------------------
;絶頂時など、ＡとＢとＤと…みたいな感じで「と」でつないで列挙するための関数
;引数に表示する文字列と条件(0で無効、非0で有効)を指定。最大5個まで
;-------------------------------------------------
@PRINT_EMUNERATE(表示:1,条件:1,表示:2,条件:2,表示:3,条件:3,表示:4,条件:4,表示:5,条件:5)
#DIMS 表示,6
#DIM 条件,6

SIF 条件:1
	PRINTFORM %表示:1%
SIF 条件:1 && (条件:2 || 条件:3 || 条件:4 || 条件:5)
	PRINT と
SIF 条件:2
	PRINTFORM %表示:2%
SIF 条件:2 && (条件:3 || 条件:4 || 条件:5)
	PRINT と
SIF 条件:3
	PRINTFORM %表示:3%
SIF 条件:3 && (条件:4 || 条件:5)
	PRINT と
SIF 条件:4
	PRINTFORM %表示:4%
SIF 条件:4 && 条件:5
	PRINT と
SIF 条件:5
	PRINTFORM %表示:5%
;-------------------------------------------------
;悪魔でメイドから流用させていただきました。多謝。
;単語1/単語2/…/単語n の書式で書かれたARGS:0～の単語のどれかを等確率で返す
;(ARGSが複数あるのは関数などが突っ込まれることを想定しているため)
;＿は何も出力しない選択とする
;選択肢の数を100まで拡張、RESULT退避処理追加
;抽選処理が等確率ならFOR-NEXT使わなくてよいと思ったのでRANDで済ませる
;-------------------------------------------------
@TEXTR(ARGS, ARGS:1, ARGS:2, ARGS:3, ARGS:4, ARGS:5, ARGS:6)
#FUNCTIONS
#DIM  L_RESULT               ;RESULT退避用
#DIMS DYNAMIC CHOICES        ;結果
#DIMS DYNAMIC STR_ARRAY, 100 ;選択肢格納用の一時変数
L_RESULT = RESULT
;まず一つにまとめる
ARGS = %ARGS%\/%ARGS:1%\/%ARGS:2%\/%ARGS:3%\/%ARGS:4%\/%ARGS:5%\/%ARGS:6%
;不要な"/"を削る作業
;空のARGSがあると//がたくさん出来て判定の邪魔になるので
;1.//は置換で削る
;2.最末尾が/なら削る（SPLITとRANDをそのまま使う都合上）
ARGS '= REPLACE(ARGS, "\/+", "/")
SIF CHARATU(ARGS, STRLENSU(ARGS) - 1) == "/"
	ARGS '= SUBSTRINGU(ARGS, 0, STRLENSU(ARGS) - 1)
SPLIT ARGS, "/", STR_ARRAY
CHOICES '= STR_ARRAY:(RAND:RESULT)
SIF CHOICES == "＿"
	CHOICES =
RESULT = L_RESULT
RETURNF CHOICES
;-------------------------------------------------
;未読判定関数@ONCE
;式中で使用する関数です
;ARGSはイベント番号、ARGは真だと初回判定を更新しない、ARG:1はキャラ登録番号（省略するとTARGET,-1ならMASTER）
;{イベント番号}/　という文字列をCSTR:1にぶっこんでいきます
;-------------------------------------------------
@ONCE(ARGS,ARG, ARG:1)
#FUNCTION
;ARG:2の変換
ARG:1 = ARG:1 ? ARG:1 # TARGET
ARG:1 = ARG:1 == -1 ? MASTER # ARG:1

SIF CSTR:(ARG:1):1 == ""
	CSTR:(ARG:1):1 = /

LOCALS = /%ARGS%/
IF STRCOUNT(CSTR:(ARG:1):1,LOCALS)
	RETURNF 0
ELSEIF ARG
	RETURNF 1
ENDIF
;初回判定更新
CSTR:(ARG:1):1 = %CSTR:(ARG:1):1%%ARGS%/
RETURNF 1

;FileName_COMMON.ERB ------------------------------- Rev1.00
;フラグリセット処理
;CALL		SYSTEM
;ARG		VOID
;RETURN		VOID
;COMMENT
;-----------------------------------------------------------
@EVENTTRAIN
FOR LOCAL,0,CHARANUM
	CSTR:LOCAL:1 =
NEXT

;-------------------------------------------------
;未読判定関数@FIRSTTIME
;式中で使用する関数です。
;ARGSはイベント番号、ARGは真だと初回判定を更新しない、ARG:1はキャラ登録番号（省略するとTARGET,-1ならMASTER）
;{イベント番号}/　という文字列をCSTR:0にぶっこんでいきます
;-------------------------------------------------
@FIRSTTIME(ARGS,ARG, ARG:1)
#FUNCTION
;ARG:1の変換
ARG:1 = ARG:1 ? ARG:1 # TARGET
ARG:1 = ARG:1 == -1 ? MASTER # ARG:1
SIF CSTR:(ARG:1):0 == ""
	CSTR:(ARG:1):0 = /

LOCALS = /%ARGS%/
IF STRCOUNT(CSTR:(ARG:1):0,LOCALS)
	RETURNF 0
ELSEIF ARG
	RETURNF 1
ENDIF
;初回判定更新
CSTR:(ARG:1):0 = %CSTR:(ARG:1):0%%ARGS%/
RETURNF 1

;-------------------------------------------------
;関数名:EXP_UP
;概　要:経験値変動チェック
;引　数:ARG:0…参照するEXP
;       ARG:1…参照するキャラ番号
;-------------------------------------------------
@EXP_UP(ARG,ARG:1)
#FUNCTION
RETURNF EXP:(ARG:1):ARG - TCVAR:(ARG:1):(400 + ARG)

;-------------------------------------------------
;関数名:INVAGINA
;概　要:Vに何が入っているのかを返す
;引　数:ARG:0…参照するキャラ番号
;戻り値:0なし
;戻り値:1 ペニス
;戻り値:2 バイブ
;-------------------------------------------------
@INVAGINA(ARG)
#FUNCTION
IF TEQUIP:ARG:50
	IF TALENT:PLAYER:2 & 2
		RETURNF 1
	ELSE
		RETURNF 3
	ENDIF
ELSEIF TEQUIP:ARG:バイブ
	RETURNF 2
ENDIF
;-------------------------------------------------
;関数名:INANAL
;概　要:Aに何が入っているのかを返す
;引　数:ARG:0…参照するキャラ番号
;戻り値:0なし
;戻り値:1 ペニス
;戻り値:2 アナルバイブ
;戻り値:3 アナルビーズ
;-------------------------------------------------
@INANAL(ARG)
#FUNCTION
IF TEQUIP:ARG:51
	RETURNF 1
ELSEIF TEQUIP:ARG:アナルバイブ
	RETURNF 2
ELSEIF TEQUIP:ARG:アナルビーズ
	RETURNF 3
ENDIF
;-------------------------------------------------
;関数名:HETEROSEX
;ARGとARG:1の性別が同じかどうかを返すほんとはHOMOSEXだけど語感が悪いので
;女性器を持つものは女、持たないものを男とする
;戻り値0=異性
;戻り値1=同性(レズ)
;戻り値2=同性(ゲイ)
;-------------------------------------------------
@HETEROSEX(ARG,ARG:1)
#FUNCTION
IF GETBIT(TALENT:ARG:2,0) == GETBIT(TALENT:(ARG:1):2,0)
	IF GETBIT(TALENT:ARG:2,0)
		RETURNF 1
	ELSE
		RETURNF 2
	ENDIF
ELSE
	RETURNF 0
ENDIF

;-------------------------------------------------
;関数名:NameToID
;引数にCALLNAMEを入れるとキャラ番号を返す
;-------------------------------------------------
@NameToID(ARGS)
#FUNCTION
LOCAL = FINDCHARA(CALLNAME, @"%ARGS%" , 1)
RETURNF LOCAL

;-------------------------------------------------
;関数名:GET_TARGETNUM
;同室中のTARGETの数を返す
;引数廃止してFOR-NEXTを排除して高速化
;-------------------------------------------------
@GET_TARGETNUM()
#FUNCTION
RETURNF MAX(0, FINDELEMENT(TARGET, 0) - 1)
;-------------------------------------------------
;関数名:IN_ROOM_MEMBER
;部屋の中で特定要素での最低・最高を持つキャラを取得
;ARGS MAXかMINかを選択
;ARG 部屋の番号
;ARGS:1 対象となる変数の名前
;ARG:1 変数の番号
;-------------------------------------------------
@IN_ROOM_MEMBER, ARGS, ARG, ARGS:1, ARG:1
#FUNCTION
VARSET LOCAL, 0
SELECTCASE ARGS:1
	CASE "CFLAG"
		FOR LOCAL, 1, CHARANUM
			SIF CFLAG:LOCAL:現在位置 != ARG
				CONTINUE
			IF LOCAL:3++ == 0
				LOCAL:1 = CFLAG:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF ARGS == "MAX" && LOCAL:1 < CFLAG:LOCAL:(ARG:1)
				LOCAL:1 = CFLAG:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF ARGS == "MIN" && LOCAL:1 > CFLAG:LOCAL:(ARG:1)
				LOCAL:1 = CFLAG:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF LOCAL:1 == CFLAG:LOCAL:(ARG:1) && RAND:2
				LOCAL:1 = CFLAG:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ENDIF
		NEXT
		RETURNF LOCAL:2
	CASE "TCVAR"
		FOR LOCAL, 1, CHARANUM
			SIF CFLAG:LOCAL:現在位置 != ARG
				CONTINUE
			IF LOCAL:3++ == 0
				LOCAL:1 = TCVAR:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF ARGS == "MAX" && LOCAL:1 < TCVAR:LOCAL:(ARG:1)
				LOCAL:1 = TCVAR:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF ARGS == "MIN" && LOCAL:1 > TCVAR:LOCAL:(ARG:1)
				LOCAL:1 = TCVAR:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF LOCAL:1 == TCVAR:LOCAL:(ARG:1) && RAND:2
				LOCAL:1 = TCVAR:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ENDIF
		NEXT
		RETURNF LOCAL:2
	CASE "ABL"
		FOR LOCAL, 1, CHARANUM
			SIF CFLAG:LOCAL:現在位置 != ARG
				CONTINUE
			IF LOCAL:3++ == 0
				LOCAL:1 = ABL:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF ARGS == "MAX" && LOCAL:1 < ABL:LOCAL:(ARG:1)
				LOCAL:1 = ABL:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF ARGS == "MIN" && LOCAL:1 > ABL:LOCAL:(ARG:1)
				LOCAL:1 = ABL:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF LOCAL:1 == ABL:LOCAL:(ARG:1) && RAND:2
				LOCAL:1 = ABL:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ENDIF
		NEXT
		RETURNF LOCAL:2
	CASE "TALENT"
		FOR LOCAL, 1, CHARANUM
			SIF CFLAG:LOCAL:現在位置 != ARG
				CONTINUE
			IF LOCAL:3++ == 0
				LOCAL:1 = TALENT:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF ARGS == "MAX" && LOCAL:1 < TALENT:LOCAL:(ARG:1)
				LOCAL:1 = TALENT:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF ARGS == "MIN" && LOCAL:1 > TALENT:LOCAL:(ARG:1)
				LOCAL:1 = TALENT:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ELSEIF LOCAL:1 == TALENT:LOCAL:(ARG:1) && RAND:2
				LOCAL:1 = TALENT:LOCAL:(ARG:1)
				LOCAL:2 = LOCAL
			ENDIF
		NEXT
		RETURNF LOCAL:2
ENDSELECT
;FileName_COMMON.ERB ------------------------------- Rev1.00
;TARGET再設定関数
;CALL		USER
;ARG		VOID
;RETURN		VOID
;COMMENT
;-----------------------------------------------------------
;
;リスト関数とソート関数ができたのでかなり簡易化できたかな
@TARGETSET_CHACK(OP)
#DIMS OP         ;SHOW_STATUSは同室更新入れるとマズイのでスキップする用
#DIM  TARGET_CNT ;ターゲットの数
#DIM  L_ID       ;REF対策、渡すだけ
#DIM  SWAP_ID    ;現在のTARGET指定処理用の一時変数
;うふふ中はTARGETを逃がす（情事発覚とかでズレちゃうので）
SIF !TFLAG:現在のTARGET && (CFLAG:TARGET:うふふ || CFLAG:MASTER:お招き)
	TFLAG:現在のTARGET = TARGET

CALL MAKE_CHARA_LIST("TARGETリスト", L_ID, TARGET, TARGET_CNT)
SIF !TARGET_CNT
	RETURN
CALL SORT_LIST("好感降順", TARGET, TARGET_CNT)

LOCAL:1 = TARGET
IF TFLAG:現在のTARGET > 0
	LOCAL:1 = FINDELEMENT(TARGET, TFLAG:現在のTARGET)
	IF LOCAL:1 == -1
		LOCAL:1 = 0
		TFLAG:現在のTARGET = 0
	ENDIF
	LOCAL:1 = TARGET:(LOCAL:1)
ENDIF
ARRAYSHIFT TARGET, 1, LOCAL:1
[SKIPSTART]
SIF STRCOUNT(OP, "「同室更新無し」")
	RETURN

;同室確認はリスト側でやっているのでここでは必要ない
FOR LOCAL, 1, 1 + TARGET_CNT
	CFLAG:(TARGET:LOCAL):同室 = 1
NEXT
[SKIPEND]

;FileName_COMMON.ERB ------------------------------- Rev1.00
;デート道中進行
;CALL		USER
;ARG		進める時間（10分単位）
;RETURN		VOID
;COMMENT
;-----------------------------------------------------------
@DATE_GOES_ON(ARG)
IF (CFLAG:MASTER:現在位置 % 100) % 10 && !AT_HOME(MASTER) && CFLAG:MASTER:現在位置 != OMANEKIBEYA()
	IF (CFLAG:MASTER:現在位置 % 100 % 10) - ARG < 0
		LOCAL:1 = CFLAG:MASTER:現在位置 - (CFLAG:MASTER:現在位置 % 100 % 10)
	ELSE
		LOCAL:1 = CFLAG:現在位置 - ARG
	ENDIF
	FOR LOCAL,0,CHARANUM
		SIF CHK_DATENOW(CFLAG:LOCAL:デート中)
			CFLAG:LOCAL:現在位置 = LOCAL:1
	NEXT
ENDIF
;====================================================
@性技補正(ARG)
#FUNCTION
RETURNF 1 + (ABL:PLAYER:ARG - 2) / 10
;====================================================

;-------------------------------------------------
;関数名:RECOVER
;概　要:BASE回復処理
;		表示文字列が空の場合かつ回復量が100未満非表示
;		表示文字列がある場合は表示
;引　数:ARG:0	参照するキャラ番号
;		回復量	ARGSに対応するBASEに加算する値（負数の場合は減らす）
;       ARGS	ベース名
;		ARGS:1	表示文字列
;-------------------------------------------------
@RECOVER(ARG,回復量,ARGS,ARGS:1)
#DIM BASE_ID
#DIM 回復量
SIF 回復量 == 0 || !CHECKE_BASE(ARG, ARGS)
	RETURN
;回復処理
BASE:ARG:(ARGS) = LIMIT(BASE:ARG:(ARGS) + 回復量, 0, MAXBASE:ARG:(ARGS))
;表示処理
SIF 回復量 > 0 && 回復量 < 100 && ARGS:1 == ""
	RETURN
IF CFLAG:ARG:現在位置 == CFLAG:MASTER:現在位置
	BASE_ID = FINDELEMENT(BASENAME, ARGS)
	LOCALS = \@ ARGS:1 != "" ? （%ARGS:1%） # \@
	IF 回復量 > 0
		CALL COLORMESSAGE(@"%BASENAME:BASE_ID%＋{回復量} （%CALLNAME:ARG%）%LOCALS%",C_GREEN,1)
	ELSEIF 回復量 < 0
		CALL COLORMESSAGE(@"%BASENAME:BASE_ID%－{ABS(回復量)} （%CALLNAME:ARG%）%LOCALS%",C_RED,1)
	ENDIF
ENDIF

;-------------------------------------------------
;関数名:RECOVER_PERMIL
;概　要:BASE割合回復処理
;引　数:ARG:0		参照するキャラ番号
;		回復割合	MAXBASE対して算出する値（負数の場合は減らす）
;       ARGS		ベース名
;       回復速度の影響
;		ARGS:1		表示文字列
;回復割合は0.1%単位
;-------------------------------------------------
@RECOVER_PERMIL(ARG,回復割合,ARGS,回復速度の影響,ARGS:1="")
#DIM 回復割合
#DIM 回復速度の影響
#DIM 回復量
SIF !CHECKE_BASE(ARG, ARGS)
	RETURN
回復量 = MAXBASE:ARG:(ARGS) * 回復割合 / 1000
SIF 回復速度の影響
	回復量 = 回復量 * (TALENT:ARG:回復速度 + 4) / 4
CALL RECOVER(ARG, 回復量, ARGS, ARGS:1)

;-------------------------------------------------
;関数名:CHECKE_BASE
;概　要:ARGが使えるBASEか判定
;戻り値:0：使用不可
;		1：使用可能
;-------------------------------------------------
@CHECKE_BASE(ARG, ARGS)
#FUNCTION
SELECTCASE ARGS
	CASE "体力", "気力"
	;竿なしならスキップ
	CASE "精力", "勃起", "射精"
		SIF !HAS_PENIS(ARG)
			RETURNF 0
	;あなた以外TSPスキップ
	CASE "TSP"
		SIF ARG != MASTER
			RETURNF 0
	CASE "母乳"
		SIF !TALENT:ARG:母乳体質
			RETURNF 0
ENDSELECT
RETURNF 1

;-------------------------------------------------
;関数名:BUFF_BASE
;概　要:特定BASEを一時的に強化
;-------------------------------------------------
@BUFF_BASE(ARG,強化能力,変動値,メッセージ)
#DIM 変動値
#DIM 強化能力
#DIM メッセージ
SIF !CHECKE_BASE(ARG, BASENAME:強化能力)
	RETURN
SIF 変動値 < 0 && ABS(変動値) > MAXBASE:ARG:強化能力
	変動値 = (MAXBASE:ARG:強化能力 -1) * -1

MAXBASE:ARG:強化能力 += 変動値
BASE:ARG:強化能力 += 変動値
BUFF:ARG:強化能力 += 変動値
SIF メッセージ
	CALL COLORMESSAGE(@"%CALLNAME:ARG%の%BASENAME:強化能力%が一時的に{ABS(変動値)}\@ 変動値 > 0? 上がった# 下がった\@",C_YELLOW,1)
;-------------------------------------------------
;関数名:BUFF_RESET
;概　要:バフを完全にリセット
;-------------------------------------------------
@BUFF_RESET
FOR LOCAL,0,CHARANUM
	FOR LOCAL:1, 0, 16
		MAXBASE:LOCAL:(LOCAL:1) -= BUFF:LOCAL:(LOCAL:1)
		BASE:LOCAL:(LOCAL:1) -= BUFF:LOCAL:(LOCAL:1)
		BUFF:LOCAL:(LOCAL:1) = 0
	NEXT
NEXT

;-------------------------------------------------
;関数名:CHANGE_CFLAG
;概　要:メッセージ付きCFLAG変動
;マイナスにはならないようになってるので注意
;-------------------------------------------------
@CHANGE_CFLAG(変動フラグ,対象,変動数)
#DIM 変動フラグ
#DIM 対象
#DIM 変動数

CFLAG:対象:変動フラグ = MAX(CFLAG:対象:変動フラグ + 変動数, 0)
IF 変動数 > 0
	CALL COLORMESSAGE(@"%CFLAGNAME:変動フラグ%＋{変動数}（%CALLNAME:対象%）",C_YELLOW,2,1)
ELSE
	CALL COLORMESSAGE(@"%CFLAGNAME:変動フラグ%－{-変動数}（%CALLNAME:対象%）",C_RED,2,1)
ENDIF

;-------------------------------------------------
;関数名:AddEXP
;概　要:メッセージ付きEXP加算
;マイナスにはならないようになってるので注意
;-------------------------------------------------
@AddEXP(VAR_NAME,C_ID,変動数)
#DIMS VAR_NAME
#DIM VAR_ID
#DIM C_ID
#DIM 変動数

SIF 変動数 == 0
	RETURN

VAR_ID = FINDELEMENT(EXPNAME, VAR_NAME)
EXP:C_ID:VAR_ID += 変動数
CALL COLORMESSAGE(@"%VAR_NAME%＋{変動数}（%CALLNAME:C_ID%）",C_YELLOW,2,1)

;-------------------------------------------------
;関数名:SHIRAHU
;概　要:普通に意識がある状態か　2だとウフフ中
;-------------------------------------------------
@SHIRAHU(ARG)
#FUNCTION
IF FLAG:70
	RETURNF 0
ELSEIF !CFLAG:ARG:睡眠 && !CFLAG:ARG:添い寝中 && !TCVAR:ARG:泥酔 && !CFLAG:ARG:衰弱
	IF TFLAG:102 == 2
		RETURNF 2
	ELSE
		RETURNF 1
	ENDIF
ELSE
	RETURNF 0
ENDIF

;-------------------------------------------------
;関数名:BETWEENTIME
;概　要:TIMEがARGからARG:1までの間なのか返す関数
;-------------------------------------------------
@BETWEENTIME(ARG,ARG:1)
#FUNCTION
IF ARG < ARG:1
	IF TIME >= ARG && TIME < ARG:1
		RETURNF 1
	ELSE
		RETURNF 0
	ENDIF
ELSE
	IF TIME >= ARG || TIME < ARG:1
		RETURNF 1
	ELSE
		RETURNF 0
	ENDIF
ENDIF
;-------------------------------------------------
;関数名:VISIT
;概　要:そのキャラの活動時間帯かどうかを返す関数
;-------------------------------------------------
@VISIT(ARG)
#FUNCTION
RETURNF BETWEENTIME(CFLAG:ARG:来訪時間,CFLAG:ARG:帰宅時間)
;-------------------------------------------------
;関数名:睡眠時間
;概　要:住み込みキャラが寝てるかどうかを返す関数だったのを全員使えるように
;寝てると1を返す
;-------------------------------------------------
@睡眠時間(ARG)
#FUNCTION
SIF ARG == MASTER
	RETURNF CFLAG:MASTER:睡眠
IF CFLAG:ARG:衰弱
	RETURNF 1
ELSEIF !BETWEENTIME(CFLAG:ARG:起床時間, CFLAG:ARG:就寝時間 + CFLAG:ARG:眠気覚まし)	;眠気覚まし強度分延長する
	RETURNF 1
ELSE
	RETURNF 0
ENDIF
;-------------------------------------------------
;関数名:子供の睡眠時間
;概　要:キャラARGの子供が寝てるかどうかを返す関数
;寝てると1を返す
;-------------------------------------------------
@子供の睡眠時間(ARG)
#FUNCTION
#DIM 子供の起床時間
#DIM 子供の就寝時間
SIF !TALENT:ARG:育児中
	RETURNF 0
子供の起床時間 = CFLAG:ARG:起床時間
子供の就寝時間 = CFLAG:ARG:就寝時間 - 120 + (CFLAG:ARG:就寝時間 - 120 < 0 ? 1440 # 0 )
IF !BETWEENTIME(子供の起床時間, 子供の就寝時間)
	RETURNF 1
ELSE
	RETURNF 0
ENDIF
;-------------------------------------------------
;関数名:WORKING
;概　要:そのキャラの仕事時間帯かどうかを返す関数
;-------------------------------------------------
@WORKING(ARG)
#FUNCTION
IF !SHIRAHU(ARG)
	RETURNF 0
ELSEIF !BETWEENTIME(TCVAR:ARG:仕事開始,TCVAR:ARG:仕事終了)
	RETURNF 0
ELSEIF BASE:ARG:仕事量 <= 0
	RETURNF 0
ELSEIF CHARA_HOLIDAY(ARG)
	RETURNF 0
ELSE
	RETURNF 1
ENDIF
;-------------------------------------------------
;関数名:連続実行
;概　要:同一コマンド連続実行した際ペナルティが発生するか
;戻り値:0だとペナが発生しない
;-------------------------------------------------
@連続実行()
#FUNCTION
SIF TARGET != TFLAG:103
	RETURNF 0
SELECTCASE PREVCOM
	CASE 1,60,61,65,67,68,300,304,368,410,442,445,446,604,621
		RETURNF 0
	CASEELSE
		RETURNF 1
ENDSELECT

;-------------------------------------------------
;関数名:カウンター不発コマンド
;戻り値:0でないとカウンター不発
;-------------------------------------------------
@カウンター不発コマンド(ARG)
#FUNCTION
SELECTCASE ARG
	CASE 697 TO 699
		RETURNF 1
	CASEELSE
		RETURNF 0
ENDSELECT
;-------------------------------------------------
;関数名:ENDUFUFU
;概　要:うふふ終了時リセット処理
;-------------------------------------------------
@ENDUFUFU(ARG)
[IF DEBUG]
	PRINTFORML うふふ終了処理
[ENDIF]
UFUFU_START_TIME = 0
UFUFU_START_DAY = 0
;時間停止中は服装セットしない
;睡眠中分岐などはすべてリセット処理側にあります
SIF !FLAG:70
	CALL CHANGE_CLOTHES(ARG, "衣装リセット")
;服装をTEQUIPへ
CALL CLOTHES_SETTING_TRAIN(ARG)

;ウフフ時系装備リセット
;TEQUIP:ARG:10-TEQUIP:ARG:149を初期化する
VARSET TEQUIP:ARG:0, 0, 10, 150

;射精関係リセット
IF TFLAG:102 < 2
	BASE:ARG:射精 = 0
	TCVAR:ARG:イきそう = 0
ENDIF
CFLAG:ARG:うふふ = 0
TEQUIP:ARG:50 = -1
TEQUIP:ARG:51 = -1
TEQUIP:ARG:上半身はだけ状態 = 0
TEQUIP:ARG:下半身ずらし状態 = 0
TEQUIP:ARG:上着脱衣済み = 0
TCVAR:ARG:無理矢理 = 0
TCVAR:ARG:好きにして = 0

;一応MASTERも初期化（しとかないと、終了後も○○装着中が表示される可能性があるので
IF CFLAG:MASTER:うふふ
	CFLAG:MASTER:うふふ = 0
	CALL CHANGE_CLOTHES(MASTER, "衣装リセット")
	CALL CLOTHES_SETTING_TRAIN(MASTER)
	VARSET TEQUIP:MASTER:0, 0, 10, 150
	TEQUIP:MASTER:50 = -1
	TEQUIP:MASTER:51 = -1
	TEQUIP:MASTER:上半身はだけ状態 = 0
	TEQUIP:MASTER:下半身ずらし状態 = 0
ENDIF

IF CFLAG:睡眠
	IF CFLAG:ARG:口に精液
		PRINTFORML %CALLNAME:MASTER%は%CALLNAME:ARG%の口の中に残っていた精液を始末した
		CFLAG:ARG:口に精液 = 0
	ENDIF
	IF CFLAG:ARG:顔に精液 || CFLAG:ARG:手に精液
		PRINTFORM %CALLNAME:MASTER%は%CALLNAME:ARG%の
		IF CFLAG:ARG:顔に精液 && !CFLAG:ARG:手に精液
			PRINTFORM 顔にへばりついた
		ELSEIF !CFLAG:ARG:顔に精液 && CFLAG:ARG:手に精液
			PRINTFORM 手にこびりついた
		ELSE
			PRINTFORM 顔と手を汚している
		ENDIF
		PRINTFORML 精液を拭きとった
		CFLAG:ARG:顔に精液 = 0
		CFLAG:ARG:手に精液 = 0
	ENDIF
ENDIF
IF !FLAG:70
	TFLAG:運搬 = 0
	IF CFLAG:ARG:口に精液
		PRINTFORML %CALLNAME:ARG%は口の中に残っていた精液を\@ ABL:ARG:精液中毒 > 2 ? 飲み干した # 吐き出した \@
		CFLAG:ARG:口に精液 = 0
	ENDIF
	IF CFLAG:ARG:顔に精液 || CFLAG:ARG:手に精液
		PRINTFORM %CALLNAME:ARG%は
		IF CFLAG:ARG:顔に精液 && !CFLAG:ARG:手に精液
			PRINTFORM 顔にへばりついた
		ELSEIF !CFLAG:ARG:顔に精液 && CFLAG:ARG:手に精液
			PRINTFORM 手にこびりついた
		ELSE
			PRINTFORM 顔と手を汚している
		ENDIF
		PRINTFORML 精液を\@ ABL:ARG:精液中毒 > 2 ? 口に含んだ # 拭った \@
		CFLAG:ARG:顔に精液 = 0
		CFLAG:ARG:手に精液 = 0
	ENDIF
ENDIF

;潜伏モード解除
SIF GETBIT(FLAG:潜伏,0)
	CALL 潜伏モード終了処理

;-------------------------------------------------------------
;ARGとあなたが同性だった場合、両者にレズ（ゲイ）経験を追加する関数
;-------------------------------------------------------------
@ADD_EXP_LESNIAN(UP_EXP,ARG,ARGS)
#DIM UP_EXP
#DIM SAMESEX

;第二引数を省略するとTARGET扱い
SIF !ARG
	ARG = TARGET
IF HETEROSEX(ARG,MASTER)
	SAMESEX = 50 + HETEROSEX(ARG,MASTER)
	EXP:SAMESEX += UP_EXP
	EXP:PLAYER:SAMESEX += UP_EXP
	IF ARGS != ""
		CALL COLORMESSAGE(@"%EXPNAME:SAMESEX%＋{UP_EXP}（%CALLNAME:ARG%）",C_YELLOW,2,1)
		CALL COLORMESSAGE(@"%EXPNAME:SAMESEX%＋{UP_EXP}（%CALLNAME:MASTER%）",C_YELLOW,2,1)
	ENDIF
ENDIF

;----------------------------------------------------
;性別判定用
;----------------------------------------------------
@HAS_PENIS(ARG)
#FUNCTION
SIF GETBIT(TALENT:ARG:性別, 1)
	RETURNF 1
RETURNF 0

;-------------------------------------------------
;イベントなどでキレた場合の処理
;-------------------------------------------------
@GET_ANGRY(ARG, 刻印付与)
#DIM 刻印付与

CFLAG:ARG:不機嫌 = 1
CFLAG:ARG:ブチギレ = 1
BASE:ARG:怒り = MAXBASE:ARG:怒り
TALENT:ARG:機嫌 = -1
MARK:ARG:反発刻印 = MIN(MARK:ARG:反発刻印 + 刻印付与, 3)
MARK:ARG:反発取得履歴 = MAX(MARK:ARG:反発取得履歴,MARK:ARG:反発刻印)

;FileName_COMMON.ERB ------------------------------- Rev1.00
;酒酔い状態取得
;CALL		USER
;ARG		キャラNo
;RETURN		酒酔い状態_toSTR
;COMMENT
;-----------------------------------------------------------
@ALCOHOL_FACE(ARG)
#FUNCTIONS
SIF BASE:ARG:酒気 <= 2
	RETURNF "　素面　"
SELECTCASE BASE:ARG:酒気
	CASE IS > (MAXBASE:ARG:酒気 / 10) * 8
		RETURNF "ぐでぐで"
;	CASE IS > (MAXBASE:ARG:酒気 / 10) * 7
;		RETURNF "へべれけ"
	CASE IS > (MAXBASE:ARG:酒気 / 10) * 5
		RETURNF "酔いどれ"
	CASE IS <= (MAXBASE:ARG:酒気 / 10) * 5
		RETURNF "ほろ酔い"
ENDSELECT
;-------------------------------------------------
;はい／いいえ の選択肢を表示し入力結果を返す関数
;引数 0=肯定選択肢の文字列、1=否定選択肢の文字列
;戻り値 0=はい、1=いいえ
;-------------------------------------------------
@ASK_YN(ARGS:0 = "は  い", ARGS:1 = "いいえ")
CURRENTREDRAW
LOCAL:0 = RESULT
REDRAW 0
PRINTBUTTON @" [%ARGS:0%]", 0
PRINTL
PRINTBUTTON @" [%ARGS:1%]", 1
PRINTL
$INPUT_LOOP
INPUT
IF RESULT != 0 && RESULT != 1
	CLEARLINE 1
	GOTO INPUT_LOOP
ENDIF
REDRAW LOCAL:0
RETURN RESULT
;-------------------------------------------------
;特殊な機能を持つボタンを作成する関数
;ARGは入力される数字、ARG:1に1を設定すると灰色に、
;ARG:2に1を設定するとボタンが黄色、ARG:3に1を設定するとボタンが無効(灰色)
;-------------------------------------------------
@PRINTBUTTON_EX(ARGS:0, ARG,ARG:1,ARG:2,ARG:3)
IF ARG:3
	SETCOLOR C_L_GRAY
	PRINTFORM %ARGS:0%
ELSE
	SIF ARG:2
		SETCOLOR C_YELLOW
	SIF ARG:1
		SETCOLOR C_L_GRAY
	PRINTBUTTON @"%ARGS:0%", ARG
ENDIF
RESETCOLOR
;-------------------------------------------------
;特殊な機能を持つボタンを作成する関数
;ARGは入力される数字、ARG:1に1を設定すると灰色に、
;ARG:2に1を設定するとボタンが黄色、ARG:3に1を設定するとボタンが無効(灰色)
;-------------------------------------------------
@PRINTBUTTON_EXC(ARGS:0, ARG,ARG:1,ARG:2,ARG:3)
IF ARG:3
	SETCOLOR C_L_GRAY
	PRINTFORMC %ARGS:0%
ELSE
	SIF ARG:2
		SETCOLOR C_YELLOW
	SIF ARG:1
		SETCOLOR C_L_GRAY
	PRINTBUTTONC @"%ARGS:0%", ARG
ENDIF
RESETCOLOR
;-------------------------------------------------
;Fisher-Yatesアルゴリズムによるシャッフル配列の作成
;専用配列SHAFFLE_ARRAYを使用
;引数 0:配列の長さ（0～ARG:0-1までのシャッフル）
;-------------------------------------------------
@FISHER_YATES_SHAFFLE(ARG:0)
;シャッフル配列の初期化
SIF !INRANGE(ARG:0 , 1 , 499)
	THROW 引数({ARG:0})が異常です。1～499の範囲で指定してください。
VARSET SHAFFLE_ARRAY , 0
;SHAFFLE_ARRAYの初期化
FOR LOCAL:0 , 0 , ARG:0
	SHAFFLE_ARRAY:(LOCAL:0) = LOCAL:0
NEXT

FOR LOCAL:0 , 0 , ARG:0 - 1
	LOCAL:1 = RAND(LOCAL:0 , ARG:0)
	SWAP SHAFFLE_ARRAY:(LOCAL:0), SHAFFLE_ARRAY:(LOCAL:1)
NEXT
;終端用に-1をセット
SHAFFLE_ARRAY:(ARG:0) = -1
RETURN 0

@NEMUKE()
#FUNCTION
LOCAL =  TIME + 1440 * DAY - TFLAG:あなた起床 - TFLAG:198 - CFLAG:MASTER:眠気覚まし
RETURNF LOCAL

;-------------------------------------------------
;時刻表示(ARG)
;与えられたTIMEをH時MM分表示に変換
;-------------------------------------------------
@時刻表示(ARG)
#FUNCTIONS
#DIM HOUR
#DIM MINUTE
#DIMS 時刻
HOUR   = ARG / 60
MINUTE = ARG % 60
時刻 = %TOSTR(HOUR)%時%TOSTR(MINUTE,"00")%分
RETURNF 時刻

;-------------------------------------------------
;時刻変換(HOUR, MINUTE)
;与えられたHOUR時MINUTE分をTIME用に変換
;念のためにHOURが25だったりMINUTEが61だったりした場合にも対応した
;例）CLOCK_TO_TIME(10, 0)をすると返る数値は600
;eraTWの一日は00:01～24:00の範囲、詳しくは@INFO_GO_NEXTDAYを見よ
;-------------------------------------------------
@CLOCK_TO_TIME(HOUR, MINUTE)
#FUNCTION
#DIM HOUR
#DIM MINUTE
SIF HOUR == 24 && MINUTE == 0
	RETURNF 24 * 60
HOUR   = (HOUR + MINUTE / 60) % 24
MINUTE = MINUTE % 60
RETURNF HOUR * 60 + MINUTE

;-------------------------------------------------
;TIMESTOP(ARG)
;そのキャラの時間停止状態を返す
;0=時間停止なし（意識あり）　1=時間停止世界入り（意識あり）　2=完全に止められてる（意識がない状態）
;-------------------------------------------------
@TIMESTOP(ARG)
#FUNCTION
;引数を略すとTARGET
SIF !ARG
	ARG = TARGET
IF !FLAG:70
	LOCAL = 0
ELSEIF CFLAG:ARG:344 == 1
	LOCAL = 1
ELSE
	LOCAL = 2
ENDIF
RETURNF LOCAL

@KIGEN_CHANGE(ARG,確率,傾向)
#DIM 確率
#DIM 傾向
;傾向を1にすると+のみ、-1にすると-のみ
SIF TALENT:ARG:感情乏しい
	確率 /= 2
IF RAND:100 < 確率
	IF !傾向
		IF !RAND:2
			TALENT:ARG:機嫌 ++
		ELSE
			TALENT:ARG:機嫌 --
		ENDIF
	ELSE
		TALENT:ARG:機嫌 += 傾向
	ENDIF
ENDIF
TALENT:ARG:機嫌 = LIMIT(TALENT:ARG:機嫌,-1,1)

;-------------------------------------------------
;ARGが男嫌いであなたが男なら1
;ARGが女嫌いであなたが女なら2を返す
;恋慕愛欲両刀で無効
;-------------------------------------------------
@OTOKOGIRAI(ARG)
#FUNCTION
;両刀
SIF TALENT:ARG:性別嗜好 == -1
	RETURNF 0
;恋慕
SIF TALENT:ARG:恋慕
	RETURNF 0
SIF TALENT:ARG:愛欲
	RETURNF 0
;男嫌い
IF TALENT:ARG:性別嗜好 & 1 && !(TALENT:PLAYER:2 & 1)
	RETURNF 1
;女嫌い
ELSEIF TALENT:ARG:性別嗜好 & 2 && !(TALENT:PLAYER:2 & 2)
	RETURNF 2
ENDIF
RETURNF 0

;-------------------------------------------------
;劣情察知の個別判定F関数
;-------------------------------------------------
;実績解除しなくても察知できるように
;コマンドとしての劣情察知は使用不可能
@NOTICE_LUST(C_ID)
#FUNCTION
#DIM C_ID
SIF C_ID == MASTER
	RETURNF 0
SIF TALENT:MASTER:劣情察知
	RETURNF 1
SIF EXP:C_ID:デート経験 + EXP:C_ID:愛情経験 >= 100
	RETURNF 1
RETURNF 0

;-------------------------------------------------
;生理周期可視化の個別判定F関数
;-------------------------------------------------
;実績解除しなくても可視化できるように
@NOTICE_CYCLE(C_ID)
#FUNCTION
#DIM C_ID
SIF !GETBIT(TALENT:C_ID:性別, 0)
	RETURNF 0
;自分のは把握しとるじゃろ
SIF C_ID == MASTER
	RETURNF 1
SIF FLAG:生理周期可視化
	RETURNF 1
SIF EXP:C_ID:デート経験 + EXP:C_ID:愛情経験 >= 200
	RETURNF 1
RETURNF 0

;-------------------------------------------------
;キャラチェックF関数
;-------------------------------------------------
;キャラクターが特定条件に合致しているかどうかを返す
;条件はTYPEごとに指定
;複合した条件に名前をつける時はキャラリストクラス関数を増設することにした
;-------------------------------------------------
@CHECK_CHARA(C_ID, TYPE = "存在")
#FUNCTION
#LOCALSIZE 1
#LOCALSSIZE 1
#DIMS DYNAMIC TYPE ;判定タイプ、DYNAMICしたので多重呼び出し可能
#DIM C_ID          ;登録番号
SELECTCASE TYPE
;基本条件
CASE "存在"
	RETURNF !CFLAG:C_ID:出禁
CASE "陥落"
	RETURNF (TALENT:C_ID:思慕 || TALENT:C_ID:恋慕 || TALENT:C_ID:愛欲 || TALENT:C_ID:恋人 || TALENT:C_ID:セフレ)
CASE "人間"
	RETURNF TALENT:C_ID:人間
CASE "仙人"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "人間")) == "仙人"
CASE "天人"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "人間")) == "天人"
CASE "月人"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "人間")) == "月人"
CASE "魔界人"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "人間")) == "魔界人"
CASE "外界人"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "人間")) == "外界人"
CASE "妖怪"
	RETURNF TALENT:C_ID:妖怪
CASE "鬼"
	RETURNF GROUPMATCH(GET_TRIBENAME(C_ID, GETNUM(TALENT, "妖怪")), "鬼", "吸血鬼")
CASE "吸血鬼"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "妖怪")) == "吸血鬼"
CASE "河童"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "妖怪")) == "河童"
CASE "天狗"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "妖怪")) == "天狗"
CASE "妖獣"
	RETURNF GROUPMATCH(GET_TRIBENAME(C_ID, GETNUM(TALENT, "妖怪")), "妖獣", "妖鳥", "妖蟲")
CASE "妖精"
	RETURNF TALENT:C_ID:妖精
CASE "神霊"
	RETURNF TALENT:C_ID:神霊
CASE "幽霊"
	RETURNF TALENT:C_ID:幽霊
CASE "付喪神"
	RETURNF TALENT:C_ID:付喪神
CASE "人形"
	RETURNF TALENT:C_ID:人形
CASE "巫女"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "追加種族")) == "巫女"
CASE "魔法使い"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "追加種族")) == "魔法使い"
CASE "メイド"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "追加種族")) == "メイド"
CASE "蓬莱人"
	RETURNF GET_TRIBENAME(C_ID, GETNUM(TALENT, "追加種族")) == "蓬莱人"
CASE "半人間"
	RETURNF TALENT:C_ID:人間 && (TALENT:C_ID:妖怪 || TALENT:C_ID:妖精 || TALENT:C_ID:神霊 || TALENT:C_ID:幽霊 || TALENT:C_ID:付喪神 || TALENT:C_ID:人形)
CASE "弱み握り"
;C_IDがMASTERの弱みを握っている
	RETURNF CFLAG:C_ID:弱み握り
CASE "弱み握られ"
;C_IDがMASTERに弱みを握られている
	RETURNF CFLAG:C_ID:弱み握られ
CASE "反発刻印"
	RETURNF (MARK:C_ID:反発刻印 >= 1)
CASE "時姦刻印"
	RETURNF (MARK:C_ID:時姦刻印 >= 1)
CASE "時姦経験"
	RETURNF (EXP:C_ID:時姦経験 >= 1)
CASE "清い交際"
	RETURNF (CFLAG:C_ID:清い交際 >= 1)
CASE "口上実装状況"
	RETURNF (CFLAG:C_ID:口上実装状況 >= 1)
CASE "子持ち"
	RETURNF (CFLAG:C_ID:子供人数 >= 1)
CASE "同室"
	RETURNF (CFLAG:C_ID:現在位置 == CFLAG:MASTER:現在位置)
CASE "全裸"
	{
	SIF EQUIP:C_ID:アクセサリ || EQUIP:C_ID:帽子
		 || EQUIP:C_ID:下半身下着１ || EQUIP:C_ID:下半身下着２
		 || EQUIP:C_ID:上半身下着１ || EQUIP:C_ID:上半身下着２
		 || EQUIP:C_ID:レオタード || EQUIP:C_ID:ボディースーツ || EQUIP:C_ID:ワンピース || EQUIP:C_ID:着物
		 || EQUIP:C_ID:ズボン || EQUIP:C_ID:下半身上着 || EQUIP:C_ID:スカート
		 || EQUIP:C_ID:上半身上着１ || EQUIP:C_ID:上半身上着２ || EQUIP:C_ID:外衣
		 || EQUIP:C_ID:その他１ || EQUIP:C_ID:その他２ || EQUIP:C_ID:その他３ || EQUIP:C_ID:腕部装束
	}
		RETURNF 0
	RETURNF 1
CASE "オンナ"
	RETURNF TALENT:C_ID:性別 == 1
CASE "妊娠"
	RETURNF TALENT:C_ID:妊娠
CASE "育児中"
	RETURNF TALENT:C_ID:育児中
CASE "ふたなり"
	RETURNF TALENT:C_ID:性別 == 3
CASE "ケモミミ"
	RETURNF TALENT:C_ID:動物耳 != 0
CASE "人間耳"
	RETURNF TALENT:C_ID:動物耳 == 0
CASE "非処女"
	SIF TALENT:C_ID:性別 == 2
		RETURNF 0
	RETURNF GROUPMATCH(TALENT:C_ID:処女, 0, -1)
CASEELSE
	THROW 不明なTYPE%TYPE%
ENDSELECT

;-------------------------------------------------
;キャラ比較関数
;-------------------------------------------------
;全引数必須
;スマートとは程遠いコピペゴリ押しである
;-------------------------------------------------
@CHARA_COMPARE(VAR_NAME, VAR_ID, CHARA_A, TYPE, CHARA_B)
#FUNCTION
#DIMS VAR_NAME ;比較対象キャラ変数
#DIM  VAR_ID   ;比較対象キャラ変数のID
#DIM  CHARA_A  ;比較対象キャラAの登録番号
#DIMS TYPE     ;比較内容
#DIM  CHARA_B  ;比較対象キャラBの登録番号
SELECTCASE VAR_NAME
CASE "ABL"
	SELECTCASE TYPE
	CASE "=="
		RETURNF ABL:CHARA_A:VAR_ID == ABL:CHARA_B:VAR_ID
	CASE ">"
		RETURNF ABL:CHARA_A:VAR_ID > ABL:CHARA_B:VAR_ID
	CASE ">="
		RETURNF ABL:CHARA_A:VAR_ID >= ABL:CHARA_B:VAR_ID
	CASE "<"
		RETURNF ABL:CHARA_A:VAR_ID < ABL:CHARA_B:VAR_ID
	CASE "<="
		RETURNF ABL:CHARA_A:VAR_ID <= ABL:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT

CASE "BASE"
	SELECTCASE TYPE
	CASE "=="
		RETURNF BASE:CHARA_A:VAR_ID == BASE:CHARA_B:VAR_ID
	CASE ">"
		RETURNF BASE:CHARA_A:VAR_ID > BASE:CHARA_B:VAR_ID
	CASE ">="
		RETURNF BASE:CHARA_A:VAR_ID >= BASE:CHARA_B:VAR_ID
	CASE "<"
		RETURNF BASE:CHARA_A:VAR_ID < BASE:CHARA_B:VAR_ID
	CASE "<="
		RETURNF BASE:CHARA_A:VAR_ID <= BASE:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT

CASE "MAXBASE"
	SELECTCASE TYPE
	CASE "=="
		RETURNF MAXBASE:CHARA_A:VAR_ID == MAXBASE:CHARA_B:VAR_ID
	CASE ">"
		RETURNF MAXBASE:CHARA_A:VAR_ID > MAXBASE:CHARA_B:VAR_ID
	CASE ">="
		RETURNF MAXBASE:CHARA_A:VAR_ID >= MAXBASE:CHARA_B:VAR_ID
	CASE "<"
		RETURNF MAXBASE:CHARA_A:VAR_ID < MAXBASE:CHARA_B:VAR_ID
	CASE "<="
		RETURNF MAXBASE:CHARA_A:VAR_ID <= MAXBASE:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT

CASE "EXP"
	SELECTCASE TYPE
	CASE "=="
		RETURNF EXP:CHARA_A:VAR_ID == EXP:CHARA_B:VAR_ID
	CASE ">"
		RETURNF EXP:CHARA_A:VAR_ID > EXP:CHARA_B:VAR_ID
	CASE ">="
		RETURNF EXP:CHARA_A:VAR_ID >= EXP:CHARA_B:VAR_ID
	CASE "<"
		RETURNF EXP:CHARA_A:VAR_ID < EXP:CHARA_B:VAR_ID
	CASE "<="
		RETURNF EXP:CHARA_A:VAR_ID <= EXP:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT

CASE "CFLAG"
	SELECTCASE TYPE
	CASE "=="
		RETURNF CFLAG:CHARA_A:VAR_ID == CFLAG:CHARA_B:VAR_ID
	CASE ">"
		RETURNF CFLAG:CHARA_A:VAR_ID > CFLAG:CHARA_B:VAR_ID
	CASE ">="
		RETURNF CFLAG:CHARA_A:VAR_ID >= CFLAG:CHARA_B:VAR_ID
	CASE "<"
		RETURNF CFLAG:CHARA_A:VAR_ID < CFLAG:CHARA_B:VAR_ID
	CASE "<="
		RETURNF CFLAG:CHARA_A:VAR_ID <= CFLAG:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT

CASE "PALAM"
	SELECTCASE TYPE
	CASE "=="
		RETURNF PALAM:CHARA_A:VAR_ID == PALAM:CHARA_B:VAR_ID
	CASE ">"
		RETURNF PALAM:CHARA_A:VAR_ID > PALAM:CHARA_B:VAR_ID
	CASE ">="
		RETURNF PALAM:CHARA_A:VAR_ID >= PALAM:CHARA_B:VAR_ID
	CASE "<"
		RETURNF PALAM:CHARA_A:VAR_ID < PALAM:CHARA_B:VAR_ID
	CASE "<="
		RETURNF PALAM:CHARA_A:VAR_ID <= PALAM:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT

CASE "TALENT"
	SELECTCASE TYPE
	CASE "=="
		RETURNF TALENT:CHARA_A:VAR_ID == TALENT:CHARA_B:VAR_ID
	CASE ">"
		RETURNF TALENT:CHARA_A:VAR_ID > TALENT:CHARA_B:VAR_ID
	CASE ">="
		RETURNF TALENT:CHARA_A:VAR_ID >= TALENT:CHARA_B:VAR_ID
	CASE "<"
		RETURNF TALENT:CHARA_A:VAR_ID < TALENT:CHARA_B:VAR_ID
	CASE "<="
		RETURNF TALENT:CHARA_A:VAR_ID <= TALENT:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT

CASE "TCVAR"
	SELECTCASE TYPE
	CASE "=="
		RETURNF TCVAR:CHARA_A:VAR_ID == TCVAR:CHARA_B:VAR_ID
	CASE ">"
		RETURNF TCVAR:CHARA_A:VAR_ID > TCVAR:CHARA_B:VAR_ID
	CASE ">="
		RETURNF TCVAR:CHARA_A:VAR_ID >= TCVAR:CHARA_B:VAR_ID
	CASE "<"
		RETURNF TCVAR:CHARA_A:VAR_ID < TCVAR:CHARA_B:VAR_ID
	CASE "<="
		RETURNF TCVAR:CHARA_A:VAR_ID <= TCVAR:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT

CASE "MARK"
	SELECTCASE TYPE
	CASE "=="
		RETURNF MARK:CHARA_A:VAR_ID == MARK:CHARA_B:VAR_ID
	CASE ">"
		RETURNF MARK:CHARA_A:VAR_ID > MARK:CHARA_B:VAR_ID
	CASE ">="
		RETURNF MARK:CHARA_A:VAR_ID >= MARK:CHARA_B:VAR_ID
	CASE "<"
		RETURNF MARK:CHARA_A:VAR_ID < MARK:CHARA_B:VAR_ID
	CASE "<="
		RETURNF MARK:CHARA_A:VAR_ID <= MARK:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT

CASEELSE
	THROW 不明なVAR_NAME　%VAR_NAME%
ENDSELECT

[SKIPSTART]
コレをコピペして置換すれば項目をふやせる
CASE "CVAR"
	SELECTCASE TYPE
	CASE "=="
		RETURNF CVAR:CHARA_A:VAR_ID == CVAR:CHARA_B:VAR_ID
	CASE ">"
		RETURNF CVAR:CHARA_A:VAR_ID > CVAR:CHARA_B:VAR_ID
	CASE ">="
		RETURNF CVAR:CHARA_A:VAR_ID >= CVAR:CHARA_B:VAR_ID
	CASE "<"
		RETURNF CVAR:CHARA_A:VAR_ID < CVAR:CHARA_B:VAR_ID
	CASE "<="
		RETURNF CVAR:CHARA_A:VAR_ID <= CVAR:CHARA_B:VAR_ID
	CASEELSE
		THROW 不明なTYPE　%TYPE%
	ENDSELECT
[SKIPEND]

;-------------------------------------------------
;ステータス評価表示関数
;-------------------------------------------------
;元は@PRINT_アルファベット評価
;引数を評価対象数値にすることで汎用化し
;RANK_SCALEの名称をわかりやすくした
;-------------------------------------------------
@PRINT_RANK(VAR_VALUE, RANK_SCALE)
#DIM  VAR_VALUE  ;評価対象数値
#DIMS RANK_SCALE ;評価に使用する尺度の種類
#DIM  RANK       ;評価ランク、数が小さいほど優秀
#DIM  RANK_NUM   ;評価尺度に含まれる評価の種数
CALL CALC_RANK(VAR_VALUE, RANK_SCALE, RANK, RANK_NUM)
CALL PRINT_ALPHABET(RANK, RANK_NUM)

;-------------------------------------------------
;ステータス評価算出関数
;-------------------------------------------------
;RANK_SCALEにもとづいてVAR_VALUEの評価を行う
;REFによりRANK/RANK_NUMとして渡された引数の数値を直接書き換える
;-------------------------------------------------
@CALC_RANK(VAR_VALUE, RANK_SCALE, RANK, RANK_NUM)
#DIM      VAR_VALUE  ;評価対象数値
#DIMS     RANK_SCALE ;評価に使用する尺度の種類
#DIM  REF RANK       ;評価ランク、数が小さいほど優秀
#DIM  REF RANK_NUM   ;評価尺度に含まれる評価の種数
SELECTCASE RANK_SCALE
CASE "MAX_50000"
;好感度用
	RANK_NUM = 10
	SELECTCASE VAR_VALUE
	CASE IS >= 50000
		RANK = 0
	CASE IS >= 30000
		RANK = 1
	CASE IS >= 10000
		RANK = 2
	CASE IS >=  5000
		RANK = 3
	CASE IS >=  3000
		RANK = 4
	CASE IS >=  1500
		RANK = 5
	CASE IS >=  1000
		RANK = 6
	CASE IS >=   500
		RANK = 7
	CASE IS >=   100
		RANK = 8
	CASEELSE
		RANK = 9
	ENDSELECT
CASE "MAX_20000"
;信頼度用
	RANK_NUM = 10
	SELECTCASE VAR_VALUE
	CASE IS >= 20000
		RANK = 0
	CASE IS >= 10000
		RANK = 1
	CASE IS >=  3000
		RANK = 2
	CASE IS >=  1000
		RANK = 3
	CASE IS >=   500
		RANK = 4
	CASE IS >=   150
		RANK = 5
	CASE IS >=   100
		RANK = 6
	CASE IS >=    50
		RANK = 7
	CASE IS >=    10
		RANK = 8
	CASEELSE
		RANK = 9
	ENDSELECT
CASE "MAX_99"
;技術系以外のABL
	;数字が縦に並ぶと非常に見にくかったんで意図的にインデントずらしてます
	RANK_NUM = 10
	SELECTCASE VAR_VALUE
	CASE IS >= 99
			RANK = 0
	CASE IS >= 75
			RANK = 1
	CASE IS >= 50
			RANK = 2
	CASE IS >= 20
			RANK = 3
	CASE IS >= 10
			RANK = 4
	CASE IS >=  5
			RANK = 5
	CASE IS >=  3
			RANK = 6
	CASE IS >=  2
			RANK = 7
	CASE IS >=  1
			RANK = 8
	CASEELSE
			RANK = 9
	ENDSELECT
CASE "MAX_6"
;技能系ABL
	RANK_NUM = 7
	RANK = MAX(6 - VAR_VALUE, 0)
CASEELSE
	THROW 不明なRANK_SCALE %RANK_SCALE%
ENDSELECT

;-------------------------------------------------
;ランク評価表示関数
;-------------------------------------------------
;ランク評価(数字が小さいほど優秀)の内容をアルファベット表記してカラー表示する
;形式さえあってりゃ別にPRINT_RANKでなくとも使えるぞ
;-------------------------------------------------
@PRINT_ALPHABET(RANK, RANK_NUM)
#DIM RANK
#DIM RANK_NUM
#DIMS CONST STR_RANK10, 10 = "Ex", "SS", " S", " A", " B", " C", " D", " E", " F", " G"
#DIMS CONST STR_RANK7,   7 = "Ex", " S", " A", " B", " C", " D", " E"
{
#DIMS  CONST C_RANK10, 10 =
	"C_P_PURPLE", "C_WHITE", "C_WHITE", "C_PINK", "C_RED",
	"C_ORANGE", "C_YELLOW", "C_GREEN", "C_AQUA", "C_GRAY"
}
#DIMS  CONST C_RANK7,   7 = "C_P_PURPLE", "C_WHITE", "C_PINK", "C_RED", "C_ORANGE", "C_YELLOW", "C_GRAY"
SELECTCASE RANK_NUM
CASE 10
	CALL COLOR_PRINT(STR_RANK10:RANK, C_RANK10:RANK, 2)
CASE  7
	CALL COLOR_PRINT(STR_RANK7:RANK, C_RANK7:RANK, 2)
CASEELSE
	THROW 不正なRANK_NUM {RANK_NUM}
ENDSELECT
RESETCOLOR

;-------------------------------------------------
;色付きPRINT関数
;-------------------------------------------------
;渡した文字を渡した色でPRINTしてRESETCOLOR
;広域変数でDIMってある色名のみ可能（追加は容易）
;-------------------------------------------------
@COLOR_PRINT(ARGS, C_NAME, STR_NUM = 2)
#DIMS C_NAME
#DIM  STR_NUM
SIF !STRLENS(ARGS)
	RETURN
SELECTCASE C_NAME
CASE "C_P_PURPLE"
	SETCOLOR C_P_PURPLE
CASE "C_WHITE"
	SETCOLOR C_WHITE
CASE "C_PINK"
	SETCOLOR C_PINK
CASE "C_RED"
	SETCOLOR C_RED
CASE "C_ORANGE"
	SETCOLOR C_ORANGE
CASE "C_YELLOW"
	SETCOLOR C_YELLOW
CASE "C_GREEN"
	SETCOLOR C_GREEN
CASE "C_AQUA"
	SETCOLOR C_AQUA
CASE "C_GRAY"
	SETCOLOR C_GRAY
CASEELSE
	THROW 不正なC_NAME %C_NAME%
ENDSELECT
PRINTFORM %ARGS, STR_NUM%
RESETCOLOR

;-------------------------------------------------
;BASEカラーバー関数
;-------------------------------------------------
;体力などのカラーバー
;-------------------------------------------------
@BASE_BAR(C_ID, BASE_NAME, BAR_LENGTH, COLOR_NAME, OP)
#DIM  C_ID
#DIMS BASE_NAME
#DIM  BAR_LENGTH
#DIMS COLOR_NAME
#DIMS OP
#DIM  BASE_ID
BASE_ID = FINDELEMENT(BASENAME, BASE_NAME)
SIF BASE_ID < 0
	THROW 存在しないBASE_NAME %BASE_NAME%
SIF !STRCOUNT(OP, "「種類表記無し」")
	PRINTFORM %BASE_NAME, 4%
CALL PRINT_COLORBAR(BASE:C_ID:BASE_ID, MAXBASE:C_ID:BASE_ID, BAR_LENGTH, UNICODE(0x2585), UNICODE(0x2585), BARCOLORSET(COLOR_NAME), RESULT:1)
IF !STRCOUNT(OP, "「数字表記無し」")
	IF BUFF:C_ID:BASE_ID > 0
		SETCOLOR C_AQUA
	ELSEIF BUFF:C_ID:BASE_ID < 0
		SETCOLOR C_YELLOW
	ENDIF
	PRINTFORM  ({BASE:C_ID:BASE_ID,5}/{MAXBASE:C_ID:BASE_ID,5})
	RESETCOLOR
ENDIF
SIF STRCOUNT(OP, "「改行」")
	PRINTFORML

;-------------------------------------------------
;INFO用の改良型BASEカラーバー関数
;-------------------------------------------------
@BASE_BAR_2(C_ID, BASE_NAME, BASE_NAME_SHORT, BAR_LENGTH, COLOR_NAME)
#DIM  C_ID
#DIMS BASE_NAME
#DIMS BASE_NAME_SHORT
#DIM  BAR_LENGTH
#DIMS COLOR_NAME
#DIM  BASE_ID
BASE_ID = FINDELEMENT(BASENAME, BASE_NAME)
SIF BASE_ID < 0
	THROW 存在しないBASE_NAME %BASE_NAME%
IF BASE_NAME == "精力" && TALENT:C_ID:濃厚精液
	FONTBOLD
	SETCOLOR C_CREAM
	PRINTFORM %BASE_NAME_SHORT%
	FONTREGULAR
	RESETCOLOR
ELSE
	PRINTFORM %BASE_NAME_SHORT%
ENDIF
CALL PRINT_COLORBAR(BASE:C_ID:BASE_ID, MAXBASE:C_ID:BASE_ID, BAR_LENGTH, UNICODE(0x2585), UNICODE(0x2585), BARCOLORSET(COLOR_NAME), RESULT:1)
IF BUFF:C_ID:BASE_ID > 0
	SETCOLOR C_AQUA
ELSEIF BUFF:C_ID:BASE_ID < 0
	SETCOLOR C_YELLOW
ENDIF
PRINTFORM ({BASE:C_ID:BASE_ID, 5})
RESETCOLOR

;-------------------------------------------------
;カラースタンプ関数
;-------------------------------------------------
;特定の記号を特定の色で並べる
;MARKの表示用だけどなんかその他にも使えるでしょう
;-------------------------------------------------
@COLOR_STAMP(STAMP_NUM, MAX_NUM, STAMP_STR, STAMP_COLOR)
#DIM  STAMP_NUM   ;並べるスタンプの数
#DIM  MAX_NUM     ;スタンプの最大数
#DIMS STAMP_STR   ;スタンプに使用する文字列
#DIM  STAMP_COLOR ;スタンプの色
#DIM  STAMP_LENGTH;スタンプ文字列の長さ
STAMP_LENGTH = STRLENS(STAMP_STR)
SIF !STAMP_LENGTH
	THROW STAMP_STRが指定されていません
SIF STAMP_COLOR
	SETCOLOR STAMP_COLOR
PRINTFORM %" " * (MAX_NUM - STAMP_NUM) * STAMP_LENGTH%
PRINTFORM %STAMP_STR * STAMP_NUM%
RESETCOLOR

;-------------------------------------------------
;キャラ抽選関数
;-------------------------------------------------
;キャラリストからランダムで1名を選出する
;戻り値は登録番号、失敗したら-1
;-------------------------------------------------
@RAND_CHARASELECT(L_TYPE = "主人公以外のキャラリスト")
#DIMS L_TYPE                       ;抽選対象タイプ
#DIM  L_ID                         ;リストのクラスID
#DIM  CHARA_LIST, キャラクタ数上限 ;作成するリスト
#DIM  CHARA_CNT                    ;キャラカウンタ
CALL MAKE_CHARA_LIST("主人公以外のキャラリスト", L_ID, CHARA_LIST, CHARA_CNT)
SIF !CHARA_CNT
	RETURN -1
RETURN CHARA_LIST:(RAND:CHARA_CNT)

;----------------------------------------------------------------------------------------------------
;キャラの登場判定
;とりあえずあなたは弾くようにした
;----------------------------------------------------------------------------------------------------
@CAN_MEET(CHARA)
#FUNCTION
#DIM CHARA
SIF !CHARA
	RETURNF 0
SIF !EXISTCSV(CHARA)
	RETURNF 0
SIF CFLAG:CHARA:出禁
	RETURNF 0
SIF CHARA == FLAG:なりきり
	RETURNF 0
RETURNF 1

;----------------------------------------------------------------------------------------------------
;現在地点から移動可能な場所へ移動
;部屋から追い出されるときなど
;----------------------------------------------------------------------------------------------------
@GETOUT(ARG)
TCVAR:ARG:追い出され時刻 = TIME
TCVAR:ARG:追い出され地点 = CFLAG:ARG:現在位置
FOR LOCAL,MINROOM(),MAXROOM
	;全くもってスマートでないが、番号の関係上幽香私室からはバルコニーに追い出されてしまうため個別処理する
	IF CFLAG:ARG:現在位置 == 463
		CFLAG:ARG:現在位置 = 465
		BREAK
	ENDIF
	IF CAN_MOVE(CFLAG:ARG:現在位置, LOCAL) & 1
		CFLAG:ARG:現在位置 = LOCAL
		BREAK
	ENDIF
NEXT

;----------------------------------------------------------------------------------------------------
;キャラのランダム選抜関数
;手抜き処理でできるだけ簡素な抽選関数をと思った（RAND_CHARASELECTはちと凝り過ぎ）
;渡したキャラは選ばれない
;出禁キャラが多すぎると無限ループのおそれがあるのが難点
;難点とはいうが全キャラ対象の抽選では
;極端なプレイングをしなければ問題にはならない、はず
;----------------------------------------------------------------------------------------------------
@RAND_PERSON(CHARA)
#FUNCTION
#DIM CHARA
#DIM HIT_CHARA
DO
	HIT_CHARA = RAND(1, キャラクタ数上限)
	SIF !CAN_MEET(HIT_CHARA) || HIT_CHARA == CHARA
		CONTINUE
	BREAK
LOOP 1
RETURNF HIT_CHARA

;----------------------------------------------------------------------------------------------------
;自宅位置取得関数
;----------------------------------------------------------------------------------------------------
@GET_CHARAHOME(CHARA)
#FUNCTION
#DIM CHARA
;MASTERは初期位置決まってる
SIF CHARA == MASTER
	RETURNF CFLAG:CHARA:初期位置
;住み込むフラグ立ってるなら決まってる
SIF CHARA == FLAG:住み込みキャラ
	RETURNF CFLAG:CHARA:初期位置
;住所不定のキャラは先に
SIF GROUPMATCH(CSVCFLAG(CHARA, GETNUM(CFLAG, "初期位置")), 0, 99)
	RETURNF -100
RETURNF CSVCFLAG(CHARA, GETNUM(CFLAG, "初期位置"))

;----------------------------------------------------------------------------------------------------
;場所名取得関数
;MAIN_MAP次第で挙動が変わってしまって個人的に気持ち悪い
;問題点：GET_MAP_REPLACEMENTを使用済みのPLACE_IDを受け取ると誤動作≒散策マップの場所IDは受け取れません
;----------------------------------------------------------------------------------------------------
@GET_PLACENAME(PLACE_ID)
#FUNCTIONS
#DIM PLACE_ID
SIF PLACE_ID == SUKIMA()
	RETURNF "スキマ空間"
SIF PLACE_ID == OMANEKIBEYA()
	RETURNF OMANEKI_PLACE()
IF GET_MAPID(PLACE_ID) == MAIN_MAP
	RETURNF NAME_FROM_PLACE(PLACE_ID)
ELSE
	RETURNF STR:(6000 + GET_MAP_REPLACEMENT(PLACE_ID) / 10)
ENDIF

;----------------------------------------------------------------------------------------------------
;初期位置の地域名取得関数
;未設定ならとりあえず"不明"で
;----------------------------------------------------------------------------------------------------
@AREANAME_CHARA_HOME(C_ID)
#FUNCTIONS
#LOCALSIZE 1
#LOCALSSIZE 1
#DIM C_ID
#DIM HOME_ID
HOME_ID = GET_CHARAHOME(C_ID)
SIF HOME_ID <= 0
	RETURNF "不明"
RETURNF MAP_AREANAME(HOME_ID)

;----------------------------------------------------------------------------------------------------
;現在位置の地域名取得関数
;----------------------------------------------------------------------------------------------------
@AREANAME_CHARA_NOW(C_ID)
#FUNCTIONS
#LOCALSIZE 1
#LOCALSSIZE 1
#DIM C_ID
RETURNF MAP_AREANAME(CFLAG:C_ID:現在位置)

;----------------------------------------------------------------------------------------------------
;配列抽選F関数
;----------------------------------------------------------------------------------------------------
@ARRAY_HIT(HIT_LIST, LIST_SIZE)
#FUNCTION
#DIM REF HIT_LIST ;確率分布リスト
#DIM     LIST_SIZE;確率分布リストのサイズ
#DIM     CHK_ID   ;判定対象となる要素
#DIM     HIT_RAND ;抽選乱数処理
LOCAL = MAX(SUMARRAY(HIT_LIST, 0, LIST_SIZE),1)
HIT_RAND = RAND(0, LOCAL)
;DEBUGPRINTFORML LIST_SIZE＝{LIST_SIZE}　HIT_RAND{HIT_RAND}
FOR CHK_ID, 0, LIST_SIZE
	SIF HIT_RAND < SUMARRAY(HIT_LIST, 0, CHK_ID + 1)
		RETURNF CHK_ID
NEXT
;THROW 抽選失敗
;カウンター抽選失敗によるTHROW落ちが発生してるのでｰ1を返すことにする
RETURNF -1

;----------------------------------------------------------------------------------------------------
;配列RAND化関数
;重複制限なしなので適宜FISHER_YATES_SHAFFLEと使い分けて下さい
;----------------------------------------------------------------------------------------------------
@ARRAY_RAND(RAND_ARRAY, ARRAY_SIZE, RAND_MIN, RAND_MAX)
#DIM REF RAND_ARRAY; 対象配列
#DIM     ARRAY_SIZE; 配列サイズ（1以上）
#DIM     RAND_MIN  ; RANDの下限（0以上）
#DIM     RAND_MAX  ; RANDの上限-1、この数自体は抽選に選ばれない（RAND_MIN+1以上）
#DIM     ID_ARRAY  ; ループ用
FOR ID_ARRAY, 0, ARRAY_SIZE
	RAND_ARRAY:ID_ARRAY = RAND(RAND_MIN, RAND_MAX)
NEXT

;----------------------------------------------------------------------------------------------------
;FISHER_YATES_SHAFFLE（F関数版）
;ソースはwikipedia
;CALLF FUNC_FISHER_YATES_SHAFFLE(LOCAL, 10)
;これでLOCAL:0～9に0～9が重複なしで代入される
;----------------------------------------------------------------------------------------------------
@FUNC_FISHER_YATES_SHAFFLE(ARRAY, ARRAY_SIZE)
#FUNCTION
#DIM REF ARRAY   ;対象配列
#DIM ARRAY_SIZE  ;配列の長さ（2以上の数値にして下さい）
#DIM ELE_SHAFFLE ;シャッフル対象要素
VARSET ARRAY, -1
ARRAY:0 = 0
;要素0に対する↓の処理は必ず0になるんだから1以降でおｋ
FOR LOCAL:0, 1, ARRAY_SIZE
	ELE_SHAFFLE = RAND(0, LOCAL:0 + 1)
	;挙動変わらないようならif設けるより素通しの方が処理数少なくなったりせんか？
	;SIF ELE_SHAFFLE != LOCAL:0
	ARRAY:(LOCAL:0) = ARRAY:ELE_SHAFFLE
	ARRAY:ELE_SHAFFLE = LOCAL:0
NEXT

;----------------------------------------------------------------------------------------------------
;複数行自動表示関数
;一種の超簡易アニメーション
;1秒に1行追記していくよ関数だよ
;渡された配列の要素を順番に表示する
;本格的に動かしたいならぱにめーしょん使え
;使用箇所はナズーリンのダウジングコマンド
;----------------------------------------------------------------------------------------------------
@PRINT_GROUP(COMMENT, NUM_COMMENT, TIME_REDRAW = 1000)
#DIMS REF COMMENT         ;表示する文字列の配列
#DIM  NUM_COMMENT         ;配列の要素数
#DIM  PREV_REDRAW         ;一時退避用
#DIM  TIME_REDRAW         ;行追加の間隔、標準で1秒
#DIM  DYNAMIC NOW_COMMENT ;表示隠蔽制御用
PREV_REDRAW = CURRENTREDRAW()
REDRAW 0
FOR LOCAL:0, 0, NUM_COMMENT
	FOR LOCAL:1, 0, NUM_COMMENT
		IF LOCAL:1 <= NOW_COMMENT
			PRINTFORML %COMMENT:(LOCAL:1)%
		ELSE
			PRINTFORML
		ENDIF
	NEXT
	TWAIT TIME_REDRAW, 0
	NOW_COMMENT ++
	SIF LOCAL:0 < NUM_COMMENT -1
		CLEARLINE NUM_COMMENT
NEXT
REDRAW PREV_REDRAW
WAIT

;----------------------------------------------------------------------------------------------------
;ARG(DAY)を年月日に変換する関数
;----------------------------------------------------------------------------------------------------
@DAY_TO_DATE(ARG)
#FUNCTION
VARSET LOCAL
;冬の月31日は例外
SIF ARG % 124 == 0
	LOCAL:5 = 1
;年目
LOCAL:1 = ARG / 124
SIF !LOCAL:5
	LOCAL:1 += 1
;月
IF LOCAL:5
	LOCAL:2 = 4
ELSEIF ARG % 124 % 31 == 0
	LOCAL:2 = ARG % 124 / 31
ELSE
	LOCAL:2 = ARG % 124 / 31 + 1
ENDIF
;日
IF LOCAL:5 || ARG % 124 % 31 == 0
	LOCAL:3 = 31
ELSE
	LOCAL:3 = ARG % 124 % 31
ENDIF
LOCAL = LOCAL:1 * 1000 + LOCAL:2 * 100 + LOCAL:3
RETURNF LOCAL

;----------------------------------------------------------------------------------------------------
;ARG(年月日)をDAYに変換する関数
;----------------------------------------------------------------------------------------------------
@DATE_TO_DAY(ARG)
#FUNCTION
VARSET LOCAL
LOCAL += (ARG / 1000 - 1) * 124
LOCAL += (ARG % 1000 / 100 - 1) * 31
LOCAL += ARG % 1000 % 100
RETURNF LOCAL

;----------------------------------------------------------------------------------------------------
;ARG(DAY)を年月日（曜日）で表示する関数
;ARGが年月日であるならARG:1を真にすること
;----------------------------------------------------------------------------------------------------
@PRINT_DATE(ARG, ARG:1)
;ARGをDAYと判定
IF !ARG:1
	LOCAL:1 = DAY_TO_DATE(ARG)
	LOCAL:2 = ARG
;ARGを年月日と判定
ELSE
	LOCAL:1 = ARG
	LOCAL:2 = DATE_TO_DAY(ARG)
ENDIF
LOCAL:3 = LOCAL:1 % 1000 / 100
PRINTFORM {LOCAL:1 / 1000}年目 %GET_MONTH(LOCAL:3)% {LOCAL:1 % 1000 % 100}日（%GET_DAY(LOCAL:2)%）

@PRINT_DATE_F(ARG)
#FUNCTIONS
LOCAL = DAY_TO_DATE(ARG)
LOCAL:1 = LOCAL / 1000
LOCAL:2 = LOCAL % 1000 / 100
LOCAL:3 = LOCAL % 1000 % 100
LOCALS = {LOCAL:1}年目 %GET_MONTH(LOCAL:2)%の{LOCAL:3}日
RETURNF LOCALS

;----------------------------------------------------------------------------------------------------
;複数文字列カウントF関数
;----------------------------------------------------------------------------------------------------
;TARGET_STRに含まれる複数の文字列の数を検索する
;TARGET_STR、KEY_STRともに"/"を仕切りとして複数の単語をカウントする
;TARGET_STR、KEY_STRで一度に渡す単語の種類はそれぞれ100種類未満、語群は1000個未満にすること
;
;動作例）
;TARGET_STR："うさぎ/うさぎ/うさぎ/きつね/ねこ/ねこ/"
;例１）
;　KEY_STR："うさぎ/ねこ/"
;　"うさぎ"が3、"ねこ"が2で合計値の5を返す
;例２）
;　KEY_STR："きつね/ねこ/"
;　"きつね"が1、"ねこ"が2で合計値の3を返す
;例３）
;　KEY_STR："うさぎ/うさぎ/"
;　"うさぎ"が3、の処理を2回分やって6を返す
;----------------------------------------------------------------------------------------------------
@STR_MULTI_COUNT(TARGET_STR, KEY_STR)
#FUNCTION
#DIMS TARGET_STR             ;検索対象文字列
#DIMS KEY_STR                ;検索したい語群、語群の種類の上限は100種類
#DIMS DYNAMIC KEY_LIST, 100  ;分割後の単語リスト
#DIM  DYNAMIC KEY_CNT,  100  ;各単語の出現回数
#DIM  DYNAMIC KEY_NUM        ;単語の総数
#DIM          KEY_ID         ;ループ処理用
#DIM  DYNAMIC STR_CNT        ;カウント個数
#DIMS DYNAMIC TEMP_STR, 1000 ;SPLIT用一次配列
#DIM  DYNAMIC TEMP_NUM       ;一次配列で使用した要素数
#DIM          TEMP_RESULT    ;RESULT退避
;念のため
TARGET_STR '= REPLACE(TARGET_STR, "\/+", "/")
CALLF CNT_SPLIT(KEY_STR, KEY_LIST, KEY_CNT, KEY_NUM)

TEMP_RESULT = RESULT
SPLIT TARGET_STR, "/", TEMP_STR
TEMP_NUM = RESULT
FOR KEY_ID, 0, KEY_NUM
	STR_CNT += MATCH(TEMP_STR, KEY_LIST:KEY_ID, 0, TEMP_NUM) * KEY_CNT:KEY_ID
NEXT
RESULT = TEMP_RESULT
RETURNF STR_CNT

;----------------------------------------------------------------------------------------------------
;カウント機能つきSPLIT関数
;----------------------------------------------------------------------------------------------------
;・RESULTを汚染せず、F関数中でも使用可能
;・CALLFで使用のこと、REFを使用して変数を直接書き換える
;・引数必須、単語リスト/出現個数リストの配列上限に注意！
;・区切り文字は"/"で固定
;・STR用の配列変数と別に、各単語の出現回数リストを追加
;・戻り値１）STR_LIST、"/"で分割され出力される単語リスト
;・戻り値２）CNT_LIST、各単語の出現回数リスト
;・戻り値３）STR_NUM、単語の種類の総数
;・TARGET_STRで一度に渡す単語の種類は100種類未満、語群は1000個未満にすること
;動作例)
;TARGET_STR："霊夢/霊夢/霊夢/霊夢/魔理沙/魔理沙/早苗/"
;　STR_LIST:0 == "霊夢"
;　STR_LIST:1 == "魔理沙"
;　STR_LIST:2 == "早苗"
;　CNT_LIST:0 == 4   ;"霊夢"の出現回数は4回
;　CNT_LIST:1 == 2   ;"魔理沙"の出現回数は2回
;　CNT_LIST:2 == 1   ;"早苗"の出現回数は1回
;　STR_NUM    == 3   ;"霊夢"、"魔理沙"、"早苗"で合計3種類
;----------------------------------------------------------------------------------------------------
@CNT_SPLIT(TARGET_STR, STR_LIST, CNT_LIST, STR_NUM)
#FUNCTION
#DIMS         TARGET_STR     ;分割対象STR
#DIMS         NEW_STR        ;更新用一時STR
#DIMS REF     STR_LIST       ;単語リスト
#DIM  REF     CNT_LIST       ;各単語の出現個数リスト
#DIM  REF     STR_NUM        ;単語の種類の総数
#DIMS DYNAMIC TEMP_STR, 1000 ;SPLIT用一次配列
#DIM  DYNAMIC TEMP_NUM       ;一次配列で使用した要素数
#DIM          TEMP_RESULT    ;RESULT退避
#DIM          TEMP_ID        ;ループ用
VARSET STR_LIST
VARSET CNT_LIST
STR_NUM = 0

TEMP_RESULT = RESULT
SPLIT TARGET_STR, "/", TEMP_STR
TEMP_NUM = RESULT
FOR TEMP_ID, 0, TEMP_NUM
	;文字長判定
	SIF !STRLENS(TEMP_STR:TEMP_ID)
		CONTINUE
	;重複判定
	SIF FINDELEMENT(STR_LIST, TEMP_STR:TEMP_ID, 0, STR_NUM, 1) != -1
		CONTINUE
	STR_LIST:STR_NUM '= TEMP_STR:TEMP_ID
	CNT_LIST:STR_NUM  = MATCH(TEMP_STR, TEMP_STR:TEMP_ID)
	STR_NUM ++
NEXT
RESULT = TEMP_RESULT

;----------------------------------------------------------------------------------------------------
;同行中の人数を返す関数
;----------------------------------------------------------------------------------------------------
@同行人数()
#FUNCTION
RETURNF (CHARANUM - 1) - CMATCH(CFLAG:同行 , 0, 1, CHARANUM)
;MASTERが数に入らないのでCHARANUM - 1です

;----------------------------------------------------------------------------------------------------
;DAILY_EV0から切り出し
;主にMAPのYOGORE関連判定
;懸念事項：名無し地点のYOGOREの扱いってどうなってんだろ？
;----------------------------------------------------------------------------------------------------
;拠点マップの汚れの合計値を返す
@SUM_ALL_YOGORE()
#FUNCTION
RETURNF SUMARRAY(YOGORE, MINROOM(), MAXROOM)

;拠点マップの汚れの平均値を返す
@AVERAGE_YOGORE()
#FUNCTION
RETURNF SUM_ALL_YOGORE() / ROOM_NUM()

;拠点マップに存在する地点の数を返す
;名無し地点を考慮してない点に注意
@ROOM_NUM()
#FUNCTION
RETURNF MAXROOM % 100

;----------------------------------------------------------------------------------------------------
;メッセージ付きでアイテム/円/カリスマを入手したり支払ったりする関数
;とりあえず正の数だけ
;----------------------------------------------------------------------------------------------------
@GET_ITEM(ITEM_NAME, ITEM_NUM, PRINT_TYPE)
#DIMS ITEM_NAME
#DIM ITEM_ID
#DIM ITEM_NUM
#DIM PRINT_TYPE;表示形式　0=通常　1=L　2=W

ITEM_ID = GETNUM(ITEM, ITEM_NAME)
IF ITEM_ID == -1
	PRINTFORML %ITEM_NAME%は存在しません
ENDIF
DEBUGPRINTFORML %ITEM_NAME%を取得、IDは{ITEM_ID}
IF ITEM:ITEM_ID + ITEM_NUM >= 100
	CALL COLORMESSAGE(@"%ITEMNAME:ITEM_ID%は持ちきれなかった", C_YELLOW, PRINT_TYPE)
	ITEM:ITEM_ID = MAX(ITEM:ITEM_ID, 99)
ELSE
	CALL COLORMESSAGE(@"%ITEMNAME:ITEM_ID%を{ITEM_NUM}個手に入れた", C_YELLOW, PRINT_TYPE)
	ITEM:ITEM_ID += ITEM_NUM
ENDIF

@LOST_ITEM(ITEM_NAME, ITEM_NUM, PRINT_TYPE)
#DIMS ITEM_NAME
#DIM ITEM_ID
#DIM ITEM_NUM
#DIM PRINT_TYPE;表示形式　0=通常　1=L　2=W

ITEM_ID = GETNUM(ITEM, ITEM_NAME)

SIF ITEM:ITEM_ID <= 0
	RETURN
CALL COLORMESSAGE(@"%ITEMNAME:ITEM_ID%を{ITEM_NUM}個失った", C_YELLOW, PRINT_TYPE)
ITEM:ITEM_ID = MAX(ITEM:ITEM_ID - ITEM_NUM, 0)

@GET_MONEY_YEN(VALUE, PRINT_TYPE)
#DIM VALUE
#DIM PRINT_TYPE;表示形式　0=通常　1=L　2=W
SIF VALUE <= 0
	RETURN
CALL COLORMESSAGE(@"\\{VALUE}を手に入れた", C_YELLOW, PRINT_TYPE)
MONEY += VALUE

@GET_SPELL_CARD_BONUS_YEN(VALUE, PRINT_TYPE)
#DIM VALUE
#DIM PRINT_TYPE;表示形式　0=通常　1=L　2=W
SIF VALUE <= 0
	RETURN
CALL COLORMESSAGE(@"GET ", 0xFFFFFF, 0)
CALL COLORMESSAGE(@"SpEll ", 0xC8FFFF, 0)
CALL COLORMESSAGE(@"CARd ", 0x64FFDC, 0)
CALL COLORMESSAGE(@"BONUS!!", 0x00FFB4, 1)
CALL COLORMESSAGE(@"        \\{VALUE}", C_YELLOW, PRINT_TYPE)
MONEY += VALUE

@GET_MONEY_CM(VALUE, PRINT_TYPE)
#DIM VALUE
#DIM PRINT_TYPE;表示形式　0=通常　1=L　2=W
SIF VALUE <= 0
	RETURN
CALL COLORMESSAGE(@"{VALUE}カリスマを手に入れた", C_YELLOW, PRINT_TYPE)
MONEY:2 += VALUE

@LOST_MONEY_YEN(VALUE, PRINT_TYPE)
#DIM VALUE
#DIM PRINT_TYPE;表示形式　0=通常　1=L　2=W
SIF VALUE <= 0
	RETURN
CALL COLORMESSAGE(@"\\{VALUE}を失った", C_YELLOW, PRINT_TYPE)
MONEY = MAX(0, MONEY - VALUE)

@LOST_MONEY_CM(VALUE, PRINT_TYPE)
#DIM VALUE
#DIM PRINT_TYPE;表示形式　0=通常　1=L　2=W
SIF VALUE <= 0
	RETURN
CALL COLORMESSAGE(@"{VALUE}カリスマを失った", C_YELLOW, PRINT_TYPE)
MONEY:2 = MAX(0, MONEY:2 - VALUE)

@PAY_MONEY_YEN(VALUE, PRINT_TYPE)
#DIM VALUE
#DIM PRINT_TYPE;表示形式　0=通常　1=L　2=W
SIF VALUE <= 0
	RETURN
CALL COLORMESSAGE(@"\\{VALUE}を支払った", C_YELLOW, PRINT_TYPE)
MONEY = MAX(0, MONEY - VALUE)

@PAY_MONEY_CM(VALUE, PRINT_TYPE)
#DIM VALUE
#DIM PRINT_TYPE;表示形式　0=通常　1=L　2=W
SIF VALUE <= 0
	RETURN
CALL COLORMESSAGE(@"{VALUE}カリスマを支払った", C_YELLOW, PRINT_TYPE)
MONEY:2 = MAX(0, MONEY:2 - VALUE)

;キャラ番号C_IDのABLをAvalue変化させる
@ChangeABL(C_ID, Aname, Avalue)
#DIM C_ID
#DIM A_ID
#DIMS Aname
#DIM Avalue

A_ID = FINDELEMENT(ABLNAME, Aname)
ABL:C_ID:A_ID += Avalue
CALL COLORMESSAGE(@"%CALLNAME:C_ID%の%Aname%が{ABL:C_ID:A_ID}に\@ Avalue > 0 ?上がった #下がった \@",C_YELLOW,2)
;----------------------------------------------------------------------------------------------
; Author: えにゅあら
; Licensed by: CC0
; L_SEEDの値が同じなら同じ結果を返す疑似乱数（ノイズ関数）
; 0～L_SCALEの数値を返す（L_SCALEは含まない）
; L_SCALEの最大値は多分8589934592　計算の都合上これ以上を指定しても切り捨てられるはず
;----------------------------------------------------------------------------------------------
@NOISE(L_SEED, L_SCALE)
#FUNCTION
#DIM L_SEED
#DIM L_VAL
#DIM L_SCALE
; 適当にgoogleでランダム生成した数値をシードの初期位置にした。これやらないと0付近に全然ランダム感が出ない気がする
L_SEED = L_SEED ^ 0x145579EC
L_VAL = (L_SEED >> 13) ^ L_SEED
L_VAL = (L_VAL * (L_VAL * L_VAL * 60493 + 19990303) + 1376312589) & 0x7fffffff
RETURNF L_VAL * L_SCALE / 0x80000000

; ノイズを二つ加算したものを返す。平均値付近の値が出やすい。出現分布はきれいな三角形。
@NOISE2(L_SEED, L_SCALE)
#FUNCTION
#DIM L_SCALE
#DIM L_SCALE2
#DIM L_SEED
L_SCALE2 = L_SCALE / 2
L_SCALE = L_SCALE - L_SCALE2
RETURNF NOISE(L_SEED, L_SCALE) + NOISE(L_SEED ^ 0x1D47E2A3, L_SCALE2)

; ノイズを三つ加算したものを返す。平均値付近の値がとても出やすい。出現分布は山なりの曲線(正規分布)。
@NOISE3(L_SEED, L_SCALE)
#FUNCTION
#DIM L_SCALE
#DIM L_SCALE2
#DIM L_SEED
L_SCALE2 = L_SCALE / 3
L_SCALE = L_SCALE - L_SCALE2*2
RETURNF NOISE(L_SEED, L_SCALE) + NOISE(L_SEED ^ 0xFA7B7E26, L_SCALE2) + NOISE(L_SEED ^ 0x1D47E2A3, L_SCALE2)

;４つ以上加算しても３つ版と分布の形状は変わらず、単に平均値を中心に縮小されたものになるので、省く

; 使えそうか試しに表示してみる
@TEST_PRINTNOISE()
#FUNCTION
PRINTL NOISE1
FOR LOCAL, 0, 100
	PRINTFORML {NOISE(LOCAL, 100)}
NEXT
PRINTL NOISE2
FOR LOCAL, 0, 100
	PRINTFORML {NOISE2(LOCAL, 100)}
NEXT
PRINTL NOISE3
FOR LOCAL, 0, 100
	PRINTFORML {NOISE3(LOCAL, 100)}
NEXT

;お金の単位付きで3桁ごとにカンマ表示（関数名は仮）
@金額表示(ARG)
#FUNCTIONS
RETURNF MONEYSTR(ARG, "#,##0")

@三桁区切(ARG)
#FUNCTIONS
RETURNF TOSTR(ARG, "#,##0")

@数え方(ITEM_NO, ITEM_NUM = 1)
#FUNCTIONS
#DIM ITEM_NO
#DIM ITEM_NUM
SELECTCASE ITEM_NO
	CASE 627
		RETURNF "瓶"
	CASE 706
		RETURNF "匹"
	CASE 707, 708
		RETURNF "尾"
	CASEELSE
		RETURNF \@ ITEM_NUM < 10 ? つ # 個 \@
ENDSELECT

@IS_LOVER(ARG)
#FUNCTION
SIF TALENT:ARG:恋慕
	RETURNF 1
SIF TALENT:ARG:愛欲
	RETURNF 1
RETURNF 0

repo_name: akadiya/eratw

license: unknown


code:
@BASE自然変動(ARG)
#DIM 体力回復量
#DIM 気力回復量
#DIM 欲求不満
#DIM 傘ダメージ
#DIM Lapse
Lapse = TIME_PROGRESS(TIME:1)

;MASTERと同じ場所にいないとき
IF CFLAG:ARG:現在位置 != CFLAG:MASTER:現在位置
	BASE:ARG:ムード = BASE:ARG:ムード - Lapse * 4 * (BASE:ARG:ムード + 500) / 500
	BASE:ARG:ムード = MAX(0,BASE:ARG:ムード)
	BASE:ARG:理性 = BASE:ARG:理性 + Lapse * (MAXBASE:ARG:理性 + 500) / (BASE:ARG:理性 + 500)
ELSE
	;仙香玉兎による補正　ムード↑理性↓怒り↓
	IF IsInsenceValid(ARG)
		BASE:ARG:ムード += Lapse * (SQRT(TFLAG:仙香玉兎) / 2)
		BASE:ARG:ムード = MIN(BASE:ARG:ムード , MAXBASE:ARG:ムード)
		BASE:ARG:理性 -= Lapse * (SQRT(TFLAG:仙香玉兎) / 2)
		BASE:ARG:怒り -= Lapse * SQRT(TFLAG:仙香玉兎) / (CFLAG:ARG:ブチギレ + 1)
	ENDIF
	;ポイズンボディの媚毒付与による補正　理性↓ 発情付与・無差別だがそれなり注ぐ必要あり
	;計算式が複雑すぎる
	IF TCVAR:ARG:ポイズンゲージ
		BASE:ARG:理性 -= Lapse * (MAX(SQRT(TCVAR:ARG:ポイズンゲージ) / 2, 1))
		IF BASE:ARG:理性 <= 0 && PALAM:ARG:欲情 >= PALAMLV:7 && TCVAR:ARG:発情 == 0 && !TALENT:ARG:妊娠
			;1000ほどゲージを稼ぐと3割程度で発情付与　欲求不満度が上がるほど確率向上
			IF RAND:(TCVAR:ARG:ポイズンゲージ + SQRT(TCVAR:ARG:ポイズンゲージ * CFLAG:ARG:溜まってる度 / 2)) > SQRT(TCVAR:ARG:ポイズンゲージ) * 20
				TCVAR:ARG:発情 = 1
				IF Lapse && !CFLAG:ARG:睡眠
					SETCOLOR C_PINK
					PRINTFORML 身体に\@ TCVAR:ARG:ポイズンゲージ > 1000 ? 十分に #  \@浸み込んだ媚毒が%CALLNAME:ARG%の理性を融かしていく…
					PRINTFORMW %CALLNAME:ARG%は発情してしまった
					RESETCOLOR
				ENDIF
			ENDIF
		ENDIF
	ENDIF
ENDIF
;ガシングガーデン　理性↓溜まってる度↑ 発情付与 薬毒耐性・非生物には効かない
IF IsGardenValid(ARG)
	BASE:ARG:理性 -= Lapse * MAX(RAND:(ABL:ARG:欲望 + 1), 4)
	欲求不満 = 欲求不満素質補正(ARG, (2 * Lapse))
	;自宅マップでないと上昇量が半減
	SIF !IN_HOME(TFLAG:GG設置位置)
		欲求不満 /= 2
	CFLAG:ARG:溜まってる度 = LIMIT(CFLAG:ARG:溜まってる度 + 欲求不満, 0, 1000)
	SIF BASE:ARG:理性 <= 0 && CFLAG:ARG:溜まってる度 >= 1000 && PALAM:ARG:欲情 >= PALAMLV:5 && !TALENT:ARG:妊娠
		TCVAR:ARG:発情 = 1
ENDIF
BASE:ARG:理性 = LIMIT(BASE:ARG:理性, 0, MAXBASE:ARG:理性)

;仕事中の場合、仕事量が減少する
IF CFLAG:ARG:行動 == 5
	BASE:ARG:仕事量 = MAX(BASE:ARG:仕事量 - Lapse * 10, 0)
	;宴会で呑んでる場合酒気が上昇
	SIF CFLAG:ARG:職種 == 49 && !(TALENT:ARG:酒耐性 == -2 || CFLAG:ARG:妊娠自覚状態 == 1)
		BASE:ARG:酒気 += Lapse * (RAND:3 * (4 - TALENT:ARG:酒耐性))
ENDIF
;怒りは常に減少する
BASE:ARG:怒り = BASE:ARG:怒り - Lapse * 5 / (CFLAG:ARG:ブチギレ + 1)
;宴会の席ならさらに減少する
SIF CFLAG:ARG:職種 == 49 && CFLAG:ARG:ブチギレ > 0
	BASE:ARG:怒り -= Lapse * 5 / (CFLAG:ARG:ブチギレ + 1)
SIF BASE:ARG:怒り <= 0
	CFLAG:ARG:ブチギレ = 0
BASE:ARG:怒り = MAX(0,BASE:ARG:怒り)
;酒気は常に減少する
BASE:ARG:酒気 = BASE:ARG:酒気 - Lapse
;泥酔時は減少量が増える
SIF TCVAR:ARG:泥酔
	BASE:ARG:酒気 -= Lapse * (RAND:4)
BASE:ARG:酒気 = MAX(0,BASE:ARG:酒気)
;睡眠深度の変動
IF CFLAG:ARG:睡眠
	;寝てる場合
	TCVAR:ARG:睡眠深度 += Lapse * 10 * MAX(TCVAR:ARG:睡眠薬強度, 1)
	TCVAR:ARG:睡眠深度 += (BASE:ARG:酒気 / 5 + TCVAR:ARG:疲労度 / 3)
	TCVAR:ARG:疲労度    = TCVAR:ARG:疲労度 * 2 / 3
	SIF TCVAR:ARG:疲労度 < 100
		TCVAR:ARG:疲労度 = 0
ELSE
	;寝てない
	IF TCVAR:ARG:睡眠深度 > 0
		TCVAR:ARG:睡眠深度 -= Lapse * 10
	ELSE
		TCVAR:ARG:睡眠深度 = 0
	ENDIF
ENDIF

;不機嫌
SIF CFLAG:ARG:不機嫌
	BASE:ARG:怒り = MAXBASE:ARG:怒り

;勃起度の自然増減
IF CFLAG:ARG:うふふ
	IF BASE:ARG:勃起 <= 900 && (BASE:ARG:精力 >= 500 || TCVAR:ARG:国士無双の薬)
		BASE:ARG:勃起 += Lapse * 2
		SIF BASE:ARG:精力 >= 1000 || TCVAR:ARG:国士無双の薬
			BASE:ARG:勃起 += Lapse * 5
	ENDIF
ELSE
	SIF CFLAG:ARG:勃起度２ <= CFLAG:ARG:勃起度 && !TCVAR:ARG:イきそう
		BASE:ARG:勃起 = MAX(0,BASE:ARG:勃起 - Lapse * 20)
ENDIF
IF ARG == MASTER
	IF BASE:ARG:勃起 <= 900 && (BASE:ARG:精力 >= 500 || TCVAR:ARG:国士無双の薬)
		FOR LOCAL, 1, GET_TARGETNUM() + 1
			SIF !CFLAG:(TARGET:LOCAL):うふふ
				CONTINUE
			;リアリティはともかくとしてとりあえず
			BASE:MASTER:勃起 += GET_TARGETNUM() * 5
			BREAK
		NEXT
		SIF TARGET
			BASE:MASTER:勃起 += MIN(10, 1 + ABL:TARGET:欲望 / 5) * Lapse
	ENDIF
	;仕様が正しいのかわからないが睡眠姦ボーナス
	SIF CFLAG:MASTER:イタズラ == 2 || FLAG:70
		BASE:MASTER:勃起 += 5
ENDIF
BASE:ARG:勃起 = MIN(BASE:ARG:勃起, MAXBASE:ARG:勃起)

;媚薬フラグ
TCVAR:ARG:媚薬 = MAX(TCVAR:ARG:媚薬 - Lapse,0)
;利尿剤
TCVAR:ARG:利尿剤 = MAX(TCVAR:ARG:利尿剤 - Lapse,0)
;惚れ薬フラグ
TCVAR:ARG:惚れ薬 = MAX(TCVAR:ARG:惚れ薬 - Lapse,0)
;仙香玉兎,ポイズンボディ
IF ARG == MASTER
	TFLAG:仙香玉兎 = MAX(TFLAG:仙香玉兎 - Lapse,0)
	TFLAG:ポイズンボディ = MAX(TFLAG:ポイズンボディ - Lapse, 0)
ENDIF
;ポイズンゲージ
TCVAR:ARG:ポイズンゲージ = MAX(TCVAR:ARG:ポイズンゲージ - (Lapse * MAX(TCVAR:ARG:ポイズンゲージ / 100, 1)), 0)

欲求不満 = 0
IF (TCVAR:ARG:媚薬 || TCVAR:ARG:発情 || IsInsenceValid(ARG)) && ARG != MASTER
	欲求不満 = 欲求不満素質補正(ARG,Lapse)
	CFLAG:ARG:溜まってる度 = LIMIT(CFLAG:ARG:溜まってる度 + 欲求不満, 0, 1000)
ENDIF
;ディレイ減算処理
CFLAG:ARG:ディレイ = MAX(CFLAG:ARG:ディレイ - Lapse,0)
;汚れを付ける
TCVAR:ARG:汚す量 = 0
IF AT_HOME(ARG) || CFLAG:ARG:現在位置 == OMANEKIBEYA()
	TCVAR:ARG:汚す量 = CFLAG:ARG:睡眠 ? 0 # 3 - ABL:ARG:清掃技能 / (1 + TALENT:ARG:ズボラ)
	SIF TALENT:ARG:幼稚
		TCVAR:ARG:汚す量 += 2
	SIF CFLAG:ARG:初期位置 == CFLAG:ARG:現在位置 && TALENT:ARG:ズボラ
		TCVAR:ARG:汚す量 += 3
	SIF CFLAG:ARG:大掃除 > 0
		TCVAR:ARG:汚す量 = CFLAG:ARG:睡眠 ? 0 # 1 + TALENT:ARG:幼稚 - 3 * (ABL:ARG:清掃技能 + 1)
	;掃除をしてる場合、汚れが減少
	IF CFLAG:ARG:職種 == 40 && CFLAG:ARG:行動 == 5
		TCVAR:ARG:汚す量 = -2 * (ABL:ARG:清掃技能 * 20 + 100)
	;掃除係は12～18時の間掃除する,あなたの技能が高いと掃除させてもらえない
	ELSEIF TALENT:ARG:掃除係 && CFLAG:ARG:神社在住 && BETWEENTIME(720,1080)
		TCVAR:ARG:汚す量 = -1 * MAX(ABL:ARG:清掃技能 + 2 - ABL:MASTER:清掃技能, 1)
	ENDIF
	YOGORE:(CFLAG:ARG:現在位置) += TCVAR:ARG:汚す量 * Lapse / 5
	YOGORE:(CFLAG:ARG:現在位置) = LIMIT(YOGORE:(CFLAG:ARG:現在位置), 0, 6000)
ENDIF
IF !CFLAG:ARG:うふふ && CFLAG:ARG:行動 != 5 && Lapse >= 10 && ARG
	体力回復量 = (10 + TALENT:ARG:回復速度) * Lapse / 20
	気力回復量 = (10 + TALENT:ARG:回復速度) * Lapse / 20
	;回復量が100未満の場合は非表示
	CALL RECOVER(ARG,体力回復量,"体力", 体力回復量 < 100 ? "" # "時間経過による自然回復" )
	CALL RECOVER(ARG,気力回復量,"気力", 気力回復量 < 100 ? "" # "時間経過による自然回復" )
ENDIF
;衰弱の処理
IF CFLAG:ARG:衰弱
	体力回復量 = (3 + TALENT:ARG:回復速度) * MAXBASE:ARG:体力/2000
	気力回復量 = (3 + TALENT:ARG:回復速度) * MAXBASE:ARG:気力/2000
	;添い寝状態だと相手の回復量が上昇
	IF CFLAG:ARG:添い寝中
		体力回復量 *= 2
		気力回復量 *= 2
	ENDIF
	CALL RECOVER(ARG,Lapse * 体力回復量,"体力")
	CALL RECOVER(ARG,Lapse * 気力回復量,"気力")
	CFLAG:ARG:衰弱 = MAX(CFLAG:ARG:衰弱 - Lapse,0)
	IF BASE:ARG:体力 > MAXBASE:ARG:体力 / 2
		CFLAG:ARG:衰弱 = 0
		TCVAR:ARG:休憩中 = 0
	ENDIF
ENDIF
;雨、雪が降っている場合、屋根がないなら体力がちょっとずつ減る
;神社外にいるキャラは減らないがあなたとデート中の相手は減る
;雨で衰弱状態にはならない
IF OUTROOF(CFLAG:ARG:現在位置) && (AT_HOME(ARG) || ARG == MASTER || FLAG:デート相手 == ARG)
	;あなたが折りたたみ傘を持っていない場合
	IF ARG == MASTER && !ITEM:折り畳み傘
		SELECTCASE TIME:5
			;雨・霧雨
			CASE 4, 6
				;余計なタイミングでメッセージが出ないように
				SIF Lapse && !TFLAG:195 && !CFLAG:ARG:うふふ && !CFLAG:ARG:睡眠
					PRINTW 雨にうたれて肌寒い
			;大雨
			CASE 5
				SIF Lapse && !TFLAG:195 && !CFLAG:ARG:うふふ && !CFLAG:ARG:睡眠
					PRINTW 冷たい雨が肌を刺す
			;雪・細雪・霧雪・みぞれ
			CASE 8, 10, 12, 13
				SIF Lapse && !TFLAG:195 && !CFLAG:ARG:うふふ && !CFLAG:ARG:睡眠
					PRINTW 雪に包まれて肌寒い
			;吹雪
			CASE 9
				SIF Lapse && !TFLAG:195 && !CFLAG:ARG:うふふ && !CFLAG:ARG:睡眠
					PRINTW 吹雪で身体が凍てつくようだ
		ENDSELECT
	;あなたが折りたたみ傘を持っていると体力の代わりに傘耐久度が減る
	ELSEIF ARG == MASTER
		SELECTCASE TIME:5
			;霧雨、霧雪
			CASE 6, 12
				傘ダメージ = 1
			;みぞれ
			CASE 13
				傘ダメージ = 5
			;雨・雪・細雪
			CASE 4, 6, 8, 10, 12
				傘ダメージ = 2
			;大雨・吹雪
			CASE 5, 9
				傘ダメージ = 50
			CASEELSE
				傘ダメージ = 0
		ENDSELECT
			FLAG:傘耐久度 += 傘ダメージ * Lapse
			IF FLAG:傘耐久度 > 10000
				ITEM:折り畳み傘 = 0
				ITEMSALES:36 ++
				FLAG:傘耐久度 = 0
				ITEM:壊れた傘 = 1
				SIF EQUIP:TARGET:アクセサリ != 6
					TEQUIP:TARGET:相合い傘 = 0
				CALL COLORMESSAGE(@"傘が壊れた！",C_YELLOW,2)
			ELSEIF FLAG:傘耐久度 > 8000 && 傘ダメージ
				SIF Lapse && !TFLAG:195 && !CFLAG:ARG:うふふ && !CFLAG:ARG:睡眠
					CALL COLORMESSAGE(@"傘が壊れそうだ…",C_YELLOW,1)
			ENDIF
	ENDIF
	SIF (CFLAG:ARG:うふふ == 2 && BASE:ARG:体力 > 500) || CFLAG:ARG:うふふ != 2
		BASE:ARG:体力 = MAX(BASE:ARG:体力 + 天候による影響(ARG, CFLAG:ARG:現在位置) * Lapse, 500)
ENDIF

;------------------------------------------
;キャラ(ARG)が地点(ARG:1)に居る時に受ける体力への増減値
;移動傾向でも使うので関数に分離
;------------------------------------------
@天候による影響(ARG, ARG:1)
#FUNCTION
VARSET LOCAL
;屋外、傘装備なし、相合い傘してない
IF OUTROOF(ARG:1) && EQUIP:ARG:アクセサリ != 6 && !TEQUIP:ARG:相合い傘
	;あなたは傘を持っていれば除外
	SIF ARG == MASTER && ITEM:折り畳み傘
		RETURNF 0
	SELECTCASE TIME:5
		;夏の晴れ
		CASE 0
			SIF DAY:2 == 2 && (TALENT:ARG:水棲 || TALENT:ARG:氷精 == 2)
				LOCAL = -2
		;夏の晴天
		CASE 1
			SIF DAY:2 == 2 && (TALENT:ARG:水棲 || TALENT:ARG:氷精 == 2)
				LOCAL = -3
		;雨・霧雨
		CASE 4, 6
			IF TALENT:ARG:水棲
				LOCAL = 3
			ELSE
				LOCAL = -2
			ENDIF
		;雪・細雪・霧雪・みぞれ
		CASE 8, 10, 12, 13
			IF TALENT:ARG:氷精
				LOCAL = 3
			ELSE
				LOCAL = -2
			ENDIF
		;大雨
		CASE 5
			IF TALENT:ARG:水棲
				LOCAL = 3
			ELSE
				LOCAL = -3
			ENDIF
		;吹雪
		CASE 9
			IF TALENT:ARG:氷精
				LOCAL = 3
			ELSE
				LOCAL = -3
			ENDIF
	ENDSELECT
ENDIF
;吸血鬼と氷精はダメージ2倍,あなたも防衛できるので影響を大きく
SIF LOCAL < 0 && (TALENT:ARG:吸血鬼 || TALENT:ARG:氷精 || ARG == MASTER)
	TIMES LOCAL, 2.0
RETURNF LOCAL

@IsGardenValid(ARG)
#FUNCTION
SIF CFLAG:ARG:現在位置 != TFLAG:GG設置位置
	RETURNF 0
SIF ARG == MASTER
	RETURNF 0
SIF TALENT:ARG:人形
	RETURNF 0
SIF TALENT:ARG:薬毒耐性
	RETURNF 0

RETURNF 1

@IsInsenceValid(ARG)
#FUNCTION
SIF !TFLAG:仙香玉兎
	RETURNF 0
SIF ARG == MASTER
	RETURNF 0
SIF CFLAG:ARG:現在位置 != CFLAG:MASTER:現在位置
	RETURNF 0
SIF TALENT:ARG:人形
	RETURNF 0
SIF TALENT:ARG:薬毒耐性
	RETURNF 0
RETURNF TFLAG:仙香玉兎

@IsHeat(ARG)
#FUNCTION
SIF TCVAR:ARG:媚薬 || TCVAR:ARG:発情 || IsGardenValid(ARG)
	RETURNF 1
RETURNF 0


code:
;アイテムの説明文
@ITEM_DESCRIPTION(ARG)
PRINTFORML %ITEMNAME:ARG%:%ITEM_EXPLANATION(ARG)%
;--------------------------------------------------------
;アイテムのボタン付き説明文
@ITEM_BUTTON(ARG)
PRINTFORML [{ARG}] %ITEMNAME:ARG%:%ITEM_EXPLANATION(ARG)%
;--------------------------------------------------------

@ITEM_EXPLANATION(ARG)
#FUNCTIONS
SELECTCASE ARG
	CASE 40
		RETURNF "ねっとりした液体　潤滑を大幅に上げ、プレイを文字通り円滑にする"
	CASE 41
		RETURNF "飲むとたちまち発情してしまう薬　欲情と感度向上、それ以外の場面でも効果を発揮"
	CASE 42
		RETURNF "飲むと尿意を催す薬"
	CASE 45
		RETURNF "定番の避妊具　十分な効果が期待できるが、使い捨て"
	CASE 48
		RETURNF "稗とか粟　貧乏人の主食"
	CASE 51
		RETURNF "濾していない濁り酒　ほんのり甘いが、酒に強い人には物足りないかも"
	CASE 52
		RETURNF "澄んだ醸造酒　甘さと辛さの均衡、キレと芳醇な香りが楽しめる、広く好まれる一品"
	CASE 53
		RETURNF "特殊な水を使用し、辛口に仕上げた醸造酒　酒に強い鬼をも酔い潰したと伝わる"
	CASE 55
		RETURNF "浄められた水を使用し、独特の風味に仕上げた、神に捧げるための醸造酒"
	CASE 56
		RETURNF "麹や酒粕から作られたごく微量のアルコールを含む酒　体力と気力をわずかに回復"
	CASE 58
		RETURNF "蒸留することで度数を上げた酒　酒好きにはたまらない"
	CASE 59
		RETURNF "薬草を蒸留酒に付け込んで作られる酒　独特の苦みが特徴　体力と気力を少し回復"
	CASE 71
		RETURNF "【ふたなり】にする薬を作る　即時使用するアイテム"
	CASE 72
		RETURNF "【ふたなり】でなくする薬を作る　即時使用するアイテム"
	CASE 74
		RETURNF "体を局所的に若返らせ【処女】にするキャンディを作る　即時使用するアイテム"
	CASE 77
		RETURNF "【獣耳】を生やすキャンディを作る　即時使用するアイテム"
	CASE 78
		RETURNF "【獣耳】を無くすキャンディを作る　即時使用するアイテム"
	CASE 91
		RETURNF "月のものの不順を軽減し、妊娠に備えやすくする薬"
	CASE 120
		RETURNF "コスパとカロリーに定評のあるクランチ　体力と気力をわずかに回復（おやつ）"
	CASE 121
		RETURNF "いただきもののチョコレート　甘くておいしいね　体力と気力を少し回復（おやつ）"
	CASE 122
		RETURNF "職人の手によって丁寧に作られたチョコレート　体力と気力を回復（おやつ）"
	CASE 123
		RETURNF "甘くて苦い、その一欠片に籠められた想いを味わう　体力と気力を大きく回復（おやつ）"
	CASE 131
		RETURNF "守矢くじに入っている霊験あらたかだが誰の念も込められてない御札…もといハズレくじ"
	CASE 195
		RETURNF "有機物を発酵させてできた肥料　畑に撒くと作物の生育を良くすることができる"
	CASE 212
		RETURNF "端午の節句の供物。小豆あん・みそあん派が鎬を削る　体力をわずかに回復（おやつ）"
	CASE 213
		RETURNF "冷たくておいしい氷菓子　みんなで仲良く食べよう　気力をわずかに回復（おやつ）"
	CASE 215
		RETURNF "完全発酵させた茶葉　芳醇な香りと味わい"
	CASE 216
		RETURNF "子どもが喜ぶ甘いお菓子　虫歯には気をつけて"
	CASE 250
		RETURNF "好意を抱きやすくなるという薬　…幻覚でも見せているのだろうか"
	CASE 252
		RETURNF "深い眠りに誘う薬　悪用はダメ、ゼッタイ"
	CASE 352
		RETURNF "甘くなったせいでイチゴ潰しスプーンが幻想入り　気力をほんのり回復"
	CASE 364
		RETURNF "夏の風物詩　キンキンに冷えたやつを縁側でかじりたい　気力をわずかに回復"
	CASE 500
		RETURNF "マズイ！もう一杯！　気力と体力をわずかに回復"
	CASE 501
		RETURNF "タウリン1000mg配合　体力と気力をわずかに回復（お薬）"
	CASE 502
		RETURNF "汚い金持ちご用達　精力を少し回復（お薬）"
	CASE 503
		RETURNF "ふぁいといっぱつ、まんたーん！　体力と気力を少し回復、眠気をわずかに覚ます（お薬）"
	CASE 505
		RETURNF "２４時間戦えますか？　体力と気力を回復、眠気を覚ます（お薬）"
	CASE 506
		RETURNF "おまえの×××で天を衝け！　精力を回復し、体力と気力もわずかに回復（お薬）"
	CASE 507
		RETURNF "魔女の釜でグツグツいってる、ある種のハーブティ・薬湯　TSPと気力をわずかに回復（お薬）"
	CASE 508
		RETURNF "魔力を持つ素材から抽出された魔力回復剤　TSPを回復し、気力も少し回復（お薬）"
	CASE 509
		RETURNF "植物の覚醒作用を持つ物質を濃縮した液剤　気力を少し回復し、眠気を強力に覚ます（お薬）"
	CASE 510
		RETURNF "肝機能をサポートする飲料　酒に酔いにくくなる"
	CASE 511
		RETURNF "究極の霊薬　勿体なくてコレを使えず死蔵する病気は治せない　完全回復（お薬）"
	CASE 512
		RETURNF "天界で作られる不老不死の薬…の海賊版　身体を頑健にできる　体力気力精力を一時的に増加"
	CASE 513
		IF ABL:[[阿求]]:親密 < 5
			RETURNF "神話に登場する、悪神を眠らせた伝説の酒　歴史学者にあたってみたい"
		ELSE
			RETURNF "阿求に学んだ、一撃必睡のカクテル　かの八岐大蛇を眠らせたという由緒正しいレシピ"
		ENDIF
	CASE 514
		IF ABL:[[永琳]]:親密 < 5
			RETURNF "月人が創り出したという、人妖関わりなく幻覚を見せる強い作用のお香"
		ELSE
			RETURNF "永琳直伝の強い幻覚・発情作用をもつお香　傍にいる者の心を蕩かす"
		ENDIF
	CASE 515
		IF ABL:[[永琳]]:親密 < 5
			RETURNF "鈴仙が使っていた身体強化薬　おそらく彼女の師匠の創薬だろう…"
		ELSE
			RETURNF "永琳直伝の連投可能な身体強化薬　体力精力を一時的に増加し、弾幕勝負にも有効だが…？"
		ENDIF
	CASE 516
		IF ABL:[[メディスン]]:親密 < 5
			RETURNF "植物には毒の花粉や胞子を散布する種もあるらしい　もっと健康的で有意義な成分を出せばいいのに"
		ELSE
			RETURNF "メディスンに学んだ魔法植物　芳香や花粉に媚薬と似た効用がある　一瞬で咲き一晩で枯れる儚い命"
		ENDIF
	CASE 517
		IF ABL:[[メディスン]]:親密 < 5
			RETURNF "肌に触れただけで毒に侵すという聞くだに恐ろしい体質　「毒も変じて甘露になる」とは言うが…"
		ELSE
			RETURNF "劇薬　代謝物が精液に浸透し媚毒化、粘膜摂取させると発情させられるようになるが健康には悪い"
		ENDIF
	CASE 518
		RETURNF "食事に混ぜ込むことで不足しがちな栄養を補える優れもの　ただし、完成した料理の味は保証しない"
	CASE 520
		RETURNF "故あって隠したいところに巻こう　バレたら仕方ない"
	CASE 521
		RETURNF "易者を呼び出すことができる書物　巫女さんのいない所で開こう"
	CASE 530
		RETURNF "狙いのあの子の愛欲を独占し、うふふな関係になりやすくする"
	CASE 550
		RETURNF "丸いお口の生きた化石、鰻と命名されてるけど別の生き物　体力気力精力を気持ち回復（軽食）"
	CASE 600
		RETURNF "食用できそうなキノコ"
	CASE 601
		RETURNF "毒があり食用できないキノコ"
	CASE 602
		RETURNF "ゼラチン質の粘性物質をまとうキノコ"
	CASE 603
		RETURNF "強壮作用のある、蛾の幼虫につくキノコ"
	CASE 604
		RETURNF "どう見ても生理的にヤバそうなキノコ"
	CASE 605
		RETURNF "瘴気を放ち、近寄るだけで幻覚を見てしまうキノコ"
	CASE 606
		RETURNF "幻想郷の最高神の一部と伝わるが、真偽は定かでない"
	CASE 607
		RETURNF "薬効を謳われる成分の含まれる草本"
	CASE 608
		RETURNF "薬効成分を豊富に含む質の良い薬草"
	CASE 609
		RETURNF "夏でも溶けることがないという水龍の魔力の結晶"
	CASE 610
		RETURNF "そこらの樹が折れたり、伐採してきたもの　建材や薪にどうぞ"
	CASE 611
		RETURNF "独特の苦みと灰汁の強さ　天ぷらにすると美味しいよ"
	CASE 612
		RETURNF "アルカロイドとか云々　毒と薬は紙一重"
	CASE 613
		RETURNF "高い薬理活性を持つが、大抵は栽培が非常に難しい"
	CASE 614
		RETURNF "曼珠沙華　鱗茎は毒を持つが救飢作物としての一面も"
	CASE 615
		RETURNF "高山の寒冷地で寒さを物ともせず生える究極の薬草"
	CASE 616
		RETURNF "自然薯　野生のものを先端まで掘るのは忍耐が要る"
	CASE 617
		RETURNF "根茎を利用する　肝機能を促進すると言われているが…"
	CASE 618
		RETURNF "強壮作用を持つウコギ科植物の根　野菜のニンジンとは別物"
	CASE 619
		RETURNF "さまざまな薬効を秘めた植物の根"
	CASE 620
		RETURNF "抜くと叫ぶ、人の形をした魔女の薬草　首を落とせば叫び声も関係ない"
	CASE 621
		RETURNF "自然に分泌される樹のヤニ　たいまつなどにも使える"
	CASE 622
		RETURNF "幹を傷つけると分泌される樹液が固化したもの"
	CASE 623
		RETURNF "芳しく香り高い樹脂　お香の材料にもなる"
	CASE 624
		RETURNF "花が枯れた直後の実に傷をつけ滲み出た白い乳液を集めたもの"
	CASE 625
		RETURNF "竜の血を謳った赤色の固体　実態はある稀少な大樹から得られた樹脂"
	CASE 626
		RETURNF "山野に自生する　甘酸っぱくておいしい　気力をほんのり回復"
	CASE 627
		RETURNF "蜂蜜の歴史は人類の歴史　食用、調味料、薬用、化粧品、香料、なんでもござれ"
	CASE 628
		RETURNF "つる性低木につく実　種子を包む胎座が甘みを持つ　体力と気力をほんのり回復"
	CASE 629
		RETURNF "春が旬　幻想郷ではやや劣勢か"
	CASE 630
		RETURNF "食べると体が頑健になるという天界の食物　体力気力精力を一時的に増加"
	CASE 631
		RETURNF "四散していた何かの骨をかき集めたもの"
	CASE 632
		RETURNF "せっこう　硫酸カルシウムが主成分の無色鉱物"
	CASE 633
		RETURNF "かっせき　含水ケイ酸アルミニウムが主成分の粘土鉱物"
	CASE 634
		RETURNF "石のように硬い竜の骨　おそらくは化石か何かだろう"
	CASE 635
		RETURNF "しんしゃ　丹、賢者の石とも。水銀の原料として重要な鉱物"
	CASE 636
		RETURNF "うおっぷ！　これは　たまらん！"
	CASE 637
		RETURNF "温泉に溶けていた成分が沈殿したもの　硫黄やミョウバンなどを含む"
	CASE 638
		RETURNF "絡んできて鬱陶しかったのでビン詰めにしてやった"
	CASE 639
		RETURNF "世界を構築する謎の暗黒物質"
	CASE 640
		RETURNF "フェニックスの尾羽　蘇生と何かと縁がある一品"
	CASE 641
		RETURNF "ヒキガエルの耳下腺から出た白い油　強心作用を持つが有毒なので扱いに注意"
	CASE 642
		RETURNF "魚を乾燥粉砕して粉末状にしたもの　これも時間停止能力のちょっとした応用だ"
	CASE 643
		RETURNF "龍の涎が凝固したものと伝わる、灰色で琥珀めいた光沢を持った塊"
	CASE 644
		RETURNF "木を切り倒したもの。時間停止能力で即乾燥、すぐに材として使えるぞ"
	CASE 645
		RETURNF "伐り出してきた竹。古来より様々な用途に用いられた万能材"
	CASE 646
		RETURNF "芳香成分を含む特殊な樹脂や精油を分泌する樹木。白檀や沈香などが有名"
	CASE 706
		RETURNF "肉としては水っぽい鶏肉のような風味がする"
	CASE 850
		IF ABL:[[魔理沙]]:親密 < 5
			RETURNF "弾幕勝負用に、携帯が楽な爆薬のようなものを考案中　魔力薬の研究者に意見を聞いてみたい"
		ELSE
			RETURNF "魔理沙に学んだ、衝撃を与えることで起爆する瓶詰の薬液　弾幕勝負でほんのり弾幕の威力を上げる"
		ENDIF
	CASE 851
		IF ABL:[[チルノ]]:親密 < 5
			RETURNF "弾幕勝負で、氷の魔力を活用する弾幕を考案中　氷精の力が参考になるかもしれない"
		ELSE
			RETURNF "チルノに学んだ、氷の魔力で水蒸気を氷礫と化して打ち放つアイテム　弾幕勝負でほんのり手数を増やす"
		ENDIF
	CASE 852
		IF ABL:[[布都]]:親密 < 5
			RETURNF "弾幕勝負で、火柱をあげるような派手さで魅せたい　焼き打ちとか得意そうな人はいただろうか"
		ELSE
			RETURNF "布都に学んだ、かつて仏閣を焼尽せしめた業火の火種　弾幕勝負で少し弾幕の威力を上げる"
		ENDIF
	CASE 853
		IF ABL:[[紫]]:親密 < 5
			RETURNF "弾幕勝負で、異界からの召喚獣的な何かにサポートしてもらう戦法を考案中　その手の能力者といえば…"
		ELSE
			RETURNF "紫に学んだ、未確認超高速飛行生物を呼び寄せる中毒性の高いエサ　弾幕勝負で少し手数を増やす"
		ENDIF
	CASE 854
		IF ABL:[[パチュリー]]:親密 < 5
			RETURNF "魔術行使を補助する触媒を作りたい　知識豊富な魔法使いに話を聞きに行こう"
		ELSE
			RETURNF "パチュリーに学んだ、五属性魔術行使の元素を凝縮した触媒　弾幕勝負で弾幕の威力を上げ、手数を増やす"
		ENDIF
	CASE 855
		IF ABL:[[成美]]:親密 < 5
			RETURNF "弾幕勝負でこちらが指示しなくても自律駆動する作動体を作りたい　その手の能力者はいただろうか"
		ELSE
			RETURNF "成美に学び再現した、自律駆動するゴーレム　盾にしかならないが、相手の弾幕の威力を少し下げる"
		ENDIF
	CASE 870
		RETURNF "十数秒先の未来を予見する能力　結果は変えられないが対応はできる　自動発動・TSP500消費"
	CASE 871
		RETURNF "時間を消し飛ばすという難解きわまる能力　TSPを大量消費するが効果は絶大"
ENDSELECT

path: 原版+前人整合等各种readme/パッチ/EratohoTW4.792用_アイテム食品味覚補正2/ERB/アイテム解説.ERB


code:
;-------------------------------------------------
;食事を取る
;日常系コマンド、レベル1
;-------------------------------------------------
@COM414
#DIM NOW_TARGET
#DIM EAT_TIME
CALL AssembleForMeal
CVARSET TCVAR, GETNUM(TCVAR, "料理評価値"), 0

IF DISH_TYPE == "主食"
	EAT_TIME = 40
ELSE
	EAT_TIME = 20
ENDIF

;特殊料理判定
IF DISH_NAME == "しゃぶしゃぶ" && TARGET
	FOR LOCAL, 1, GET_TARGETNUM() + 1
		SIF EQUIP:(TARGET:LOCAL):下半身下着２ > 0
			CONTINUE
		TFLAG:194 = 1
		DISH_TASTE += "精力/"
		BREAK
	NEXT
ELSEIF STRCOUNT(DISH_TASTE, "ローター/")
	TFLAG:194 = 2
ELSEIF DISH_NAME == "モッツァレラチーズとトマトのサラダ"
	TFLAG:194 = 30
ELSEIF DISH_NAME == "ドーピングコンソメスープ"
	TFLAG:194 = 31
ELSEIF DISH_NAME == "ギンギー料理"
	TFLAG:194 = 34
ENDIF

;まずMASTER以外から
IF TARGET
	;口上側による制御
	CALL KOJO_MESSAGE_SEND("SUCCESS",-1,TARGET,-1,-1)
	SELECTCASE TFLAG:192
	CASE 1
		IF RAND:(100 - ABL:MASTER:料理技能 * 2) <= 9
			TCVAR:TARGET:料理評価値 = 700
		ELSE
			TCVAR:TARGET:料理評価値 = 500
		ENDIF
	CASE -1
		TCVAR:TARGET:料理評価値 = 400
	CASE -2
		TFLAG:193 = -2
		RETURN
	CASEELSE
		TCVAR:TARGET:料理評価値 = 0
	ENDSELECT
	NOW_TARGET = TARGET
	;まず現在のTARGET以外が食べる
	FOR LOCAL, 1, GET_TARGETNUM() + 1
		TARGET = TARGET:LOCAL
		SIF TARGET == NOW_TARGET
			CONTINUE
		;口上側による制御
		CALL KOJO_MESSAGE_SEND("SUCCESS",-1,TARGET,-1,-1)
		SELECTCASE TFLAG:192
		CASE 1
			IF RAND:(100 - ABL:MASTER:料理技能 * 2) <= 9
				TCVAR:TARGET:料理評価値 = 700
			ELSE
				TCVAR:TARGET:料理評価値 = 500
			ENDIF
		CASE -1
			TCVAR:TARGET:料理評価値 = 300
		CASE -2
			CONTINUE
		CASEELSE
			TCVAR:TARGET:料理評価値 = 0
		ENDSELECT
		;実食
		CALL COM414_実食(TARGET, EAT_TIME, TARGET == DISH_ASSI || CFLAG:TARGET:行動 == 5)
	NEXT
	;その後にTARGETが食べる
	TARGET = NOW_TARGET
	;現在のTARGETはボーナス確定
	CALL COM414_実食(TARGET, EAT_TIME, 1)
	;信頼度,やや大きめ,平均3
	TFLAG:98 = (TCVAR:TARGET:料理評価値 / 100) / 2 + 1
ENDIF

CALL 食事(MASTER)
TIME += EAT_TIME
SIF CFLAG:MASTER:同行
	CFLAG:MASTER:同行 += EAT_TIME
RETURN 1

;-------------------------------------------------
;食べる処理と獲得ソースの計算
;CHARA     食べる人
;EAT_TIME  食べる時間
;BONUS     DISH_ASSIと現在のTARGETと仕事中のキャラはボーナス2倍
;-------------------------------------------------
@COM414_実食(CHARA, EAT_TIME, BONUS)
#DIM CHARA
#DIM EAT_TIME
#DIM BONUS
#DIM 空腹
#DIM 評価点係数
#DIM 好感度係数
#DIM 従順係数
#DIM 時間係数

#DIM DISH_ITAZURA
空腹 = 0
;食べられない状況
SIF CFLAG:CHARA:睡眠
	RETURN
SIF CFLAG:CHARA:衰弱
	RETURN
;満腹なので食べない
IF DISH_TYPE == "デザート"
	SIF TIME_PROGRESS(TCVAR:CHARA:デザート空腹時刻)
		空腹 = 1
ELSE
	SIF TIME_PROGRESS(TCVAR:CHARA:空腹時刻)
		空腹 = 1
ENDIF
SIF !空腹
	RETURN
;食べる
CALL 食事(CHARA)

;係数設定
IF ABL:CHARA:従順 <= 1
	従順係数 = 0
ELSEIF ABL:CHARA:従順 <= 3
	従順係数 = 1
ELSEIF ABL:CHARA:従順 <= 5
	従順係数 = 2
ELSEIF ABL:CHARA:従順 <= 8
	従順係数 = 3
ELSEIF ABL:CHARA:従順 <= 11
	従順係数 = 4
ELSEIF ABL:CHARA:従順 <= 14
	従順係数 = 5
ELSE
	従順係数 = 6
ENDIF
IF CFLAG:CHARA:好感度 < 100
	好感度係数 = 0
ELSEIF CFLAG:CHARA:好感度 < 500
	好感度係数 = 1
ELSEIF CFLAG:CHARA:好感度 < 1000
	好感度係数 = 2
ELSEIF CFLAG:CHARA:好感度 < 5000
	好感度係数 = 4
ELSEIF CFLAG:CHARA:好感度 < 10000
	好感度係数 = 6
ELSEIF CFLAG:CHARA:好感度 < 30000
	好感度係数 = 8
ELSE
	好感度係数 = 10
ENDIF
;1～3？,軽食&デザート1,主食2
時間係数 = EAT_TIME / 20
;1～9
IF TCVAR:CHARA:料理評価値 < 300
	評価点係数 = 0
ELSEIF TCVAR:CHARA:料理評価値 < 400
	評価点係数 = 1
ELSEIF TCVAR:CHARA:料理評価値 < 500
	評価点係数 = 3
ELSEIF TCVAR:CHARA:料理評価値 < 600
	評価点係数 = 12
ELSEIF TCVAR:CHARA:料理評価値 < 650
	評価点係数 = 16
ELSEIF TCVAR:CHARA:料理評価値 < 700
	評価点係数 = 20
ELSEIF TCVAR:CHARA:料理評価値 < 750
	評価点係数 = 24
ELSEIF TCVAR:CHARA:料理評価値 < 800
	評価点係数 = 30
ELSEIF TCVAR:CHARA:料理評価値 < 850
	評価点係数 = 36
ELSEIF TCVAR:CHARA:料理評価値 < 900
	評価点係数 = 40
ELSE
	評価点係数 = 45
ENDIF

;評価値の影響強め
SOURCE:CHARA:歓楽 = (100 * 評価点係数 + 500 * 好感度係数 + 30 * ABL:CHARA:親密) * 時間係数
SOURCE:CHARA:受動 = (20 * 評価点係数 + 300 * 従順係数 + 30 * ABL:CHARA:従順) * 時間係数
SIF CHARA == DISH_ASSI
	SOURCE:CHARA:征服 = (10 * 評価点係数 + ABL:CHARA:サドっ気 * 30) * 時間係数
SOURCE:CHARA:不潔 = STRCOUNT(DISH_TASTE, "劣化/") * (100 - TCVAR:CHARA:料理評価値 / 10) * 2
SOURCE:CHARA:反感 = STRCOUNT(DISH_TASTE, "劣化/") * (100 - TCVAR:CHARA:料理評価値 / 10) * 2
;ノーパンしゃぶしゃぶ
SIF TFLAG:194 == 1 && ! EQUIP:CHARA:下半身下着２
	SOURCE:CHARA:露出 = 1000

SIF TALENT:CHARA:健啖
	TIMES SOURCE:歓楽, 1.50
IF BONUS
	TIMES SOURCE:歓楽, 1.50
	TIMES SOURCE:受動, 1.50
	TIMES SOURCE:征服, 1.50
ENDIF

IF TCVAR:CHARA:料理評価値 >= 700
	IF TALENT:CHARA:機嫌 < 0
		CALL KIGEN_CHANGE(CHARA, 100, 1)
	ELSE
		CALL KIGEN_CHANGE(CHARA, 50, 1)
	ENDIF
	TFLAG:193 = 1
ELSEIF TCVAR:CHARA:料理評価値 >= 400
	CALL KIGEN_CHANGE(CHARA, 30, 1)
	TFLAG:193 = 0
ELSE
	SIF TALENT:CHARA:機嫌 >= 0
		CALL KIGEN_CHANGE(CHARA, 100, -1)
	TFLAG:193 = -1
ENDIF

SIF CFLAG:CHARA:同行
	CFLAG:CHARA:同行 += EAT_TIME
;-------------------------------------------------
;実行判定
;-------------------------------------------------
@COM_ABLE414
;食事実行判定
SIF !TFLAG:100
	RETURN 0
;一括管理
SIF GLOBAL_COMABLE(414)
	RETURN RESULT
;停止中は不可
SIF FLAG:70 == 1
	RETURN 0
;料理がない
SIF DISH_NAME == ""
	RETURN 0
;軽食以外は屋内じゃなきゃ無理
SIF DISH_TYPE != "軽食" && !INROOM(CFLAG:MASTER:現在位置)
	RETURN 0
;食べたばかり
IF DISH_TYPE == "デザート"
	SIF !TIME_PROGRESS(TCVAR:MASTER:デザート空腹時刻)
		RETURN 0
ELSE
	SIF !TIME_PROGRESS(TCVAR:MASTER:空腹時刻)
		RETURN 0
ENDIF
SIF CFLAG:MASTER:うふふ
	RETURN 0
RETURN 1

;-------------------------------------------------
;実際に料理を食べる処理
;-------------------------------------------------
@食事(ARG)
;#DIM 精力回復量
;#DIM 気力回復量
;#DIM 体力回復量
;#DIM TSP回復量
#DIM 精力回復率
#DIM 気力回復率
#DIM 体力回復率
#DIM TSP回復率
#DIM 満腹度
;回復率は0.1%単位

;TSP回復量 = 0
TSP回復率 = 0

;基本回復率と満腹度
SELECTCASE DISH_TYPE
	CASE "軽食"
		体力回復率 = 300
		気力回復率 = 300
		精力回復率 = 100
		満腹度 = 180
	CASE "主食"
		体力回復率 = 500
		気力回復率 = 500
		精力回復率 = 200
		満腹度 = 360
	CASE "デザート"
		体力回復率 = 300
		気力回復率 = 500
		精力回復率 = 100
		満腹度 = 180
ENDSELECT
;追加回復率
SIF STRCOUNT(DISH_TASTE, "神力/")
	TIMES 気力回復率, 1.2
SIF STRCOUNT(DISH_TASTE, "妖力/")
	TIMES 気力回復率, 1.2
SIF STRCOUNT(DISH_TASTE, "生命力/")
	TIMES 体力回復率, 1.2
SIF STRCOUNT(DISH_TASTE, "霊障/")
	TSP回復率 += 200
;鬼の魔力と区別
SIF STRCOUNT(DISH_TASTE, "/魔力/")
	TSP回復率 += 200
SIF STRCOUNT(DISH_TASTE, "仙術/")
	TSP回復率 += 200
SIF STRCOUNT(DISH_TASTE, "秘術/")
	TSP回復率 += 200
IF STRCOUNT(DISH_TASTE, "鬼の魔力/")
	精力回復率 = 1000
	;精力最大値バフ（未実装）
ENDIF
IF STRCOUNT(DISH_TASTE, "血の魔力/")
	TSP回復率 = 1000
	;TSP最大値バフ（未実装）
ENDIF
IF STRCOUNT(DISH_TASTE, "精力/")
	精力回復率 += 500
	SIF ARG == MASTER
		TALENT:MASTER:濃厚精液 = 1
ENDIF
;添加物
SELECTCASE DISH_DRG_2
CASE GETNUM(ITEM, "栄養強化剤")
	TIMES 気力回復率, 1.2
	TIMES 体力回復率, 1.2
	TIMES 精力回復率, 1.2
ENDSELECT
;バフ系,未実装
[SKIPSTART]
SIF STRCOUNT(DISH_TASTE, "薬効/") && ARG == MASTER
	;未定
SIF STRCOUNT(DISH_TASTE, "祝福/") && ARG == MASTER
	;未定
SIF STRCOUNT(DISH_TASTE, "エンチャント/") && ARG == MASTER
	;戦闘力強化１
SIF STRCOUNT(DISH_TASTE, "加護/") && ARG == MASTER
	;戦闘力強化２
SIF STRCOUNT(DISH_TASTE, "奇跡/") && ARG == MASTER
	;ラックアップ１
SIF STRCOUNT(DISH_TASTE, "幸運/") && ARG == MASTER
	;ラックアップ２
SIF STRCOUNT(DISH_TASTE, "豊穣/") && ARG == MASTER
	;未定
[SKIPEND]

;MASTER以外の処理
IF ARG != MASTER
	;味の評価,口上側で制御されている場合はカット
	SIF !TCVAR:ARG:料理評価値
		CALL REVIEW_DISH(ARG, DISH_TASTE)
	;仕込み
	SELECTCASE DISH_DRG
	CASE GETNUM(ITEM, "媚薬")
		TCVAR:ARG:媚薬 = 210
	CASE GETNUM(ITEM, "利尿剤")
		TCVAR:ARG:利尿剤 = 210
	CASE GETNUM(ITEM, "惚れ薬")
		TCVAR:ARG:惚れ薬 = 210
	CASE GETNUM(ITEM, "睡眠薬")
		IF TCVAR:ARG:睡眠薬強度 < 2
			TCVAR:ARG:睡眠薬強度 = 2
			TCVAR:ARG:睡眠薬お茶使用 = 1
		ENDIF
	ENDSELECT
	;;評価値補正,気力と体力のみ
	SELECTCASE TCVAR:ARG:料理評価値
	CASE IS < 400
		TIMES 体力回復率, 0.6
		TIMES 気力回復率, 0.6
	CASE IS < 500
		TIMES 体力回復率, 0.8
		TIMES 気力回復率, 0.8
	CASE IS < 600
		TIMES 体力回復率, 1.0
		TIMES 気力回復率, 1.0
	CASEELSE
		TIMES 体力回復率, 1.2
		TIMES 気力回復率, 1.2
	ENDSELECT
ENDIF

;回復量精算
;体力回復量 = MAXBASE:ARG:体力 * 体力回復率 / 1000
;気力回復量 = MAXBASE:ARG:気力 * 気力回復率 / 1000
;精力回復量 = MAXBASE:ARG:精力 * 精力回復率 / 1000
;TSP回復量 = MAXBASE:ARG:TSP * TSP回復率 / 1000

;ローター料理
SIF STRCOUNT(DISH_TASTE, "ローター/")
	EXP:ARG:Ｃ経験 += 30

;満腹度上昇
SIF TALENT:ARG:健啖
	TIMES 満腹度, 0.7
IF DISH_TYPE == "デザート"
	TCVAR:ARG:デザート空腹時刻 = 1440 * DAY + TIME + 満腹度
ELSE
	TCVAR:ARG:空腹時刻 = 1440 * DAY + TIME + 満腹度
ENDIF

;回復処理
;CALL RECOVER(ARG, 体力回復量, "体力", "食事による回復")
;CALL RECOVER(ARG, 気力回復量, "気力", "食事による回復")
CALL RECOVER_PERMIL(ARG, 体力回復率, "体力", 0, "食事による回復")
CALL RECOVER_PERMIL(ARG, 気力回復率, "気力", 0, "食事による回復")
CALL RECOVER_PERMIL(ARG, 精力回復率, "精力", 0, "食事による回復")
IF ARG == MASTER
;	CALL RECOVER(ARG, 精力回復量, "精力", "食事による回復")
;	CALL RECOVER(ARG, TSP回復量, "TSP", "食事による回復")
	CALL RECOVER_PERMIL(ARG, TSP回復率, "TSP", 0, "食事による回復")
ELSE
	PRINTFORML %CALLNAME:ARG + "の評価…………", 40, LEFT%{TCVAR:ARG:料理評価値 / 10, 3}点
ENDIF

;動かないフラグ
TCVAR:ARG:なるべく動かない = 1

;-------------------------------------------------
;料理を評価する関数
;ARGS	DISH_TASTE
;-------------------------------------------------
@REVIEW_DISH(CHARA, ARGS)
#DIM CHARA
#DIMS TASTE_CHARA_GOOD
#DIMS TASTE_CHARA_BAD
#DIM TASTE_GOOD
#DIM TASTE_BAD

TASTE_CHARA_GOOD = %GET_STR(, "キャラデータ", CHARA, "料理：好きな味")%
TASTE_CHARA_BAD = %GET_STR(, "キャラデータ", CHARA, "料理：嫌いな味")%

;共通設定；好き
;デザートはみんな好き
TASTE_CHARA_GOOD += "デザート/"
;できたてはみんな好き
TASTE_CHARA_GOOD += "できたて/"
;[妖怪]は妖力が好き
SIF CHECK_CHARA(CHARA, "妖怪") && !CHECK_CHARA(CHARA, "半人間")
	TASTE_CHARA_GOOD += "妖力/"
;[神霊][人間]は神力が好き
SIF CHECK_CHARA(CHARA, "神霊") || (CHECK_CHARA(CHARA, "人間") && !CHECK_CHARA(CHARA, "半人間"))
	TASTE_CHARA_GOOD += "神力/"
;[妖精]は生命力が好き
SIF CHECK_CHARA(CHARA, "妖精")
	TASTE_CHARA_GOOD += "生命力/"
;[魔法使い]は魔力が好き
SIF CHECK_CHARA(CHARA, "魔法使い")
	TASTE_CHARA_GOOD += "魔力/"
;[幽霊][付喪神]は霊障が嫌いじゃないなら好き
SIF (CHECK_CHARA(CHARA, "幽霊") || CHECK_CHARA(CHARA, "付喪神")) && !STRCOUNT(TASTE_CHARA_BAD, "霊障/")
	TASTE_CHARA_GOOD += "霊障/"
;[付喪神]は鬼の魔力が好き
SIF CHECK_CHARA(CHARA, "付喪神")
	TASTE_CHARA_GOOD += "鬼の魔力/" * 3
;[幼稚]はおふくろの味が好き
SIF TALENT:CHARA:幼稚
	TASTE_CHARA_GOOD += "おふくろの味/"
;[幼稚]はお子様ランチが好き
SIF TALENT:CHARA:幼稚
	TASTE_CHARA_GOOD += "お子様ランチ/" * 5
;DISH_ASSIなら嫉妬は好き（ボーナス）
SIF CHARA == DISH_ASSI
	TASTE_CHARA_GOOD += "嫉妬/" * 3
;BASEPOINTが500以上なら隠し味は好き（ボーナス）
SIF DISH_BASEPOINT >= 500
	TASTE_CHARA_GOOD += "隠し味/" * 2
;夏は冷たいものが、冬は温かいものが好き（嫌いじゃなければ）
IF GET_MONTH() == "夏の月" && !STRCOUNT(TASTE_CHARA_BAD, "冷たい/")
	TASTE_CHARA_GOOD += "冷たい/"
ELSEIF GET_MONTH() == "冬の月" && !STRCOUNT(TASTE_CHARA_BAD, "温かい/")
	TASTE_CHARA_GOOD += "温かい/"
ENDIF
;愛情,ASSI→MASTERへの愛情であって点数化できないのでは？,今のところフレーバー

;共通設定：嫌い
;[劣化]はみんな嫌い
TASTE_CHARA_BAD += "劣化/" * 3
;[季節外れ]はNG
TASTE_CHARA_BAD += "季節外れ/" * 6
;[妖怪][幽霊][付喪神]は神力が好きじゃないなら嫌い
SIF (CHECK_CHARA(CHARA, "妖怪") || CHECK_CHARA(CHARA, "幽霊") || CHECK_CHARA(CHARA, "付喪神")) && !STRCOUNT(TASTE_CHARA_GOOD, "神力/")
	TASTE_CHARA_BAD  += "神力/"
;[人間][神霊]は妖力が好きじゃないなら嫌い
SIF (CHECK_CHARA(CHARA, "人間") || CHECK_CHARA(CHARA, "神霊")) && !STRCOUNT(TASTE_CHARA_GOOD, "妖力/")
	TASTE_CHARA_BAD  += "妖力/"
;[人間]は霊障が好きじゃないなら嫌い
SIF CHECK_CHARA(CHARA, "人間") && !CHECK_CHARA(CHARA, "半人間") && !STRCOUNT(TASTE_CHARA_GOOD, "霊障/")
	TASTE_CHARA_BAD  += "霊障/"
;DISH_ASSIでないなら嫉妬は嫌い（減点）
IF CHARA != DISH_ASSI
	IF TALENT:CHARA:恋人
		TASTE_CHARA_BAD  += "嫉妬/" * 5
	ELSEIF TALENT:CHARA:恋慕
		TASTE_CHARA_BAD  += "嫉妬/" * 3
	ELSEIF TALENT:CHARA:思慕
		TASTE_CHARA_BAD  += "嫉妬/"
	ENDIF
ENDIF
;BASEPOINTが500未満なら隠し味は嫌い（減点）
SIF DISH_BASEPOINT < 500
	TASTE_CHARA_BAD += "隠し味/" * 2

;評価得点,得点はブレる
TASTE_GOOD = 300 + (80 + RAND:20) * STR_MULTI_COUNT(TASTE_CHARA_GOOD, ARGS)
;評価減点,減点は1.5倍
TASTE_BAD = 300 + 150 * STR_MULTI_COUNT(TASTE_CHARA_BAD, ARGS)

;総評
TCVAR:CHARA:料理評価値 = TASTE_GOOD * DISH_BASEPOINT * 2 / (TASTE_GOOD + TASTE_BAD)
[IF_DEBUG]
	PRINTFORML 好き：%TASTE_CHARA_GOOD%
	PRINTFORML 嫌い：%TASTE_CHARA_BAD%
	PRINTFORML 品物：%ARGS%
	PRINTFORML 基本：{DISH_BASEPOINT}
	PRINTFORML 得点：{TASTE_GOOD}
	PRINTFORML 減点：{TASTE_BAD}
	PRINTFORML 結果：{TCVAR:CHARA:料理評価値}
	WAIT
[ENDIF]

;-------------------------------------------------
;主に旧口上に合わせるための刺激的味覚関数
;激辛/激甘/超すっぱいには対応,わさびには対応できず……
;-------------------------------------------------
@TASTE_REACTION(ARGS)
#FUNCTION
SIF STRCOUNT(DISH_TASTE, ARGS + "/") >= 5
	RETURNF 1

;-------------------------------------------------
;満腹度上昇
;-------------------------------------------------
@満腹度上昇(ARG, ARGS, ARG:1 = 0)
#DIM 満腹度
IF ARG:1 == 0
	SELECTCASE ARGS
		CASE "軽食"
			満腹度 = 180
		CASE "主食"
			満腹度 = 360
		CASE "デザート"
			満腹度 = 180
	ENDSELECT
ELSE
	満腹度 = ARG:1
ENDIF

SIF TALENT:ARG:健啖
	TIMES 満腹度, 0.7
IF ARGS == "デザート"
	TCVAR:ARG:デザート空腹時刻 = 1440 * DAY + TIME + 満腹度
ELSE
	TCVAR:ARG:空腹時刻 = 1440 * DAY + TIME + 満腹度
ENDIF

path: 原版+前人整合等各种readme/パッチ/EratohoTW4.792用_アイテム食品味覚補正2/ERB/コマンド関連/COMF/日常系/COMF414 食事を取る.ERB