eratohoK デイリーイベントを作る
==========================

ver1.14.0移行でのデイリーイベントの制作方法を説明する。  
テンプレが`ERB/SYSTEM/EVENT/DAILY/テンプレ`にあるので利用を推奨。

## 事前準備

決めておくべきもの

+ デイリーイベントの種類
+ デイリーイベントの名前
+ デイリーイベントの識別子

### デイリーイベントの種類

デイリーイベントには、通常のデイリーイベントと、通常のデイリーを派生元として発動する「派生デイリーイベント」が存在する。  
派生デイリーイベントは、例えば「あるデイリーイベントで特定の選択をしたら、別のイベントが発生するようにしたい」というような時に使う。

通常のデイリーイベントはそれぞれ固有の発生確率をもち、コンフィグでの発生倍率や発生個数の影響を受ける。  
派生デイリーイベントには発生確率が存在しない。また、

+ 派生元となったデイリーがコンフィグでオフにされていない
+ 発生条件を満たす

以上を満たすことで、コンフィグでの発生倍率や発生個数の影響を受けることなく発動する。

### デイリーイベントの名前

デイリーイベントの名前である。例えば「薬売りの来訪」や「あついよる」などを指す。

### デイリーイベントの識別子

eratohoK本体にデイリーイベントを認識させるための文字列を指す。識別子を後述する関数群に含めることで、eratohoKがデイリーイベントを認識できる。通常のデイリーイベント、派生デイリーイベントそれぞれで、識別子は一意である必要がある。  
例えば「薬売りの来訪」の識別子は「SMUGGLER」である。

## イベントの登録

種類、名前、識別子が決まったら、`ERB\SYSTEM\EVENT_DAILYにCREATE_DAILY_MAP.ERB`を開く。  `REGISTER_DAILY`という関数が大量に呼び出されているはずなので、他の呼び出しに倣って呼び出しを追加する。 
 `CALL REGISTER_DAILY(デイリーの区分, デイリーの識別子, "デイリーの名前")`といった具合になる。  
これで、eratohoKは作ったデイリーイベントを認識できるようになる。

## 実装すべき関数

デイリーイベントが正しく動作するために、実装されているべき関数群について説明する。  
関数名を手書きしているとミスの元になるので、実装の際は前述のテンプレの利用を推奨する。  
XXの部分には前述した識別子を入力する。    
(DERIVATION_)となっているところは、それが派生デイリーである場合に入力する(テンプレを利用する限り意識する必要はないが)。


### EVENT_DAILY_XX_RATE

通常のデイリーイベントに必須。そのデイリーイベントの発動率を千分率で返す。  
20と書くと2%の確率で発動するデイリーイベントになるが、実際にはコンフィグの発動倍率の影響を受ける。

### EVENT_DAILY_DERIVATION_XX_DISABLE

派生デイリーイベントに必須。自身の派生元となるデイリーイベントの、コンフィグでのオンオフ設定を返す。  
コンフィグでオフにされている(配列変数DAILY_DISABLEの該当する要素の値が1)である場合には、派生デイリーイベントも発生しない。  
`RETURN DAILY_DISABLE:(FINDELEMENT(DAILY_EVENT_NAME_ENG, "XX"))`のように返却する。XXには**派生元デイリーイベントの**識別子が入る。

### EVENT_DAILY_(DERIVATION_)XX_DECISION

通常・派生デイリーイベントともに必須。  
発生確率以外の判定、例えば「特定のフラグが立っているか」といったチェックを行う。  
チェックをクリアした場合は1、クリアしなかった場合は0を返す。  0を返した場合、デイリーイベントは発動しない。
通常のデイリーイベントでは確率判定とこの関数を共にクリアしたイベントが「基本的には」発生する。  
派生デイリーイベントには確率判定がないため、この関数のクリアだけで「基本的には」発生する。

### EVENT_DAILY_(DERIVATION_)XX_SETTARGET

通常・派生デイリーイベントともに必須ではない。  
そのデイリーイベントが特定のキャラのみを対象としたい、かつ対象となるキャラが居なければ発動したくないという場合に実装する。  
このとき選出した対象は配列変数DAILY_TARGETに格納しておき、デイリーイベント本体関数で取り出す。
選出した対象が存在する場合は1、存在しない場合は0を返す。0を返した場合、デイリーイベントは発動しない。
たとえば通常デイリー「雌犬の生活」は、素質「雌犬」所持者のみを対象としている。この場合のコードは以下のようになる。

```
FOR LOCAL, 0, CHARANUM
	;女でないか、死んでいる、捕虜のキャラは駄目
	SIF !IS_FEMALE(LOCAL)
		CONTINUE
	SIF CFLAG:LOCAL:特殊状態 == 特殊状態_死亡
		CONTINUE
	SIF CFLAG:LOCAL:捕虜先
		CONTINUE
	;雌犬をもってないと駄目
	IF GETBIT(TALENT:LOCAL:素質_淫乱系, 素質_淫乱_雌犬)
		DAILY_TARGET:DAILY_TARGET_NUM = LOCAL
		DAILY_TARGET_NUM ++
	ENDIF
NEXT

SIF DAILY_TARGETNUM == 0
	RETURN 0

RETURN 1
```

### EVENT_DAILY_(DERIVATION_)XX_NAME

通常・派生デイリーイベントともに必須ではない。  
デイリーイベントが発動時、イベント名が表示される。  
このイベント名は基本的に登録時（後述）のものであるが、NAME関数が返した値はそれを上書きする。  
イベントの進行に応じてイベント名を書き換えたいというときに利用する。

###  EVENT_DAILY_XX_GENRE

通常のデイリーイベントに必須。デイリーイベントのジャンルを記述する。  
どのようなジャンルがあるかは、VARIABLE_DAILY.ERHに記述がある。  
実のところ実装しなくてもデイリーイベント自体は発動するのだが、コンフィグにてオンオフの設定ができなくなり、支障をきたす。

### EVENT_DAILY_XX_ALLOW_WHEN_WANDERING

通常・派生デイリーイベントともに必須ではない。
主人公が放浪している場合での発生を許可する。

### EVENT_DAILY_(DERIVATION_)XX

デイリーイベントの本体である。ここにイベントの本体を記述する。

## DVAR/DSTR

デイリーイベントに関連する値を格納するための配列変数。  セーブされる。
DAILY_CONST.ERHを開いて定数を宣言し、それを配列要素へのアクセスのインデックスとして利用する。  
たとえば「サンプル」イベントで「イベントが終了し、二度と発生しないことを示すフラグ」を用意するなら、以下のようにする。

1. DAILY_CONST.ERHに、`# DIM CONST サンプル_イベント終了フラグ = 400`と記述する(番号は適宜読み替える。ある程度余裕を持って、空いているものを指定する)。
2. イベント本体やDECISION関数などで、`DVAR:サンプル_イベント終了フラグ`への代入や参照を行う。

### 備考:DVARにキャラへの参照を保存

eratohoKではキャラの削除や入れ替えを行うことがあるため、単純にキャラ番号を格納してこれをやろうとした場合、格納時と取り出し時で別のキャラを参照してしまう可能性がある。  
こういったことを防ぐため、eratohoKではキャラの生成時、IDという不変の一意な値を割り振っている。DVARのようなセーブされる変数でキャラ参照を格納したいにはこちらを利用する。  
`DVAR:サンプル_対象 = GET_ID(対象)`のように格納し、`対象 = ID_TO_CHARA(DVAR:サンプル_対象)`のように取り出す。

## 口上デイリーについて

口上デイリーも概ね作成方法は同じであるが、以下の点において異なる。

### 各関数名

`EVENT_`とされていたところが`KOJO_`になる。またキャラNOを指定する`KXX`という句が各関数に含まれるようになり、XXをキャラNOで置換する必要がある。

### イベントの登録先

全イベントで共通のCREATE_DAILY_MAPでなく、各キャラ固有のCREATE_DAILY_MAPを呼び出すことになる。  
`CREATE_KOJO_DAILY_MAP_K{キャラNO}(対象)`という関数内で呼び出し、`CALL REGISTER_KOJO_DAILY(対象, デイリーの区分, デイリーの識別子, "デイリーの名前")`という具合に記述して登録する。
`

### 必須な関数

口上デイリーを発動させるために、最低限の口上本体も必要になる。
口上テンプレートの中の`KOJO_COMMON_KX.ERB`内、`KOJO_EXIST_KXXX`関数が必要になる。
