戻る

複数調教対応化

0.とりあえずサンプル
複数箇所を弄る上に、追加ファイルは無いのでサンプルを置いておきます。
なるべくサンプルを見ながら何処を弄ったかの解説をご覧下さい。
なお、大人数対応版に沿ってありますが、大人数対応版でなくても実装可能です。

1.;キャラカードを持っているか?

;キャラカードを持っているか?
C = 0
;ver1.40風新キャラ対応
REPEAT 50
	;既に登場中のキャラと同じキャラNOは排除
	B = COUNT+1
	IF CHARANUM >= 2
		SIF NO:1 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 3
		SIF NO:2 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 4
		SIF NO:3 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 5
		SIF NO:4 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 6
		SIF NO:5 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 7
		SIF NO:6 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 8
		SIF NO:7 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 9
		SIF NO:8 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 10
		SIF NO:9 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 11
		SIF NO:10 == B
			CONTINUE
	ENDIF
	N = 100+COUNT
	IF ITEM:N
		C = 1
		BREAK
	ENDIF
REND
CHARANUMは、登録CHARA数を返り値とする実数です。
初期値はMASTERだけなので1、調教対象か助手がいれば2、両方いれば3が通常です。
念のための仕組み解説として、
CHARANUM==4の時に2番目の人(番号は0基準なので1)を削除すると、
3番目の人(番号は0基準なので2)は、2番目(1)に置き換わります。
4番目の人(番号は0基準なので3)は、3番目(2)に置き換わります。
この辺は、実はFINISH.ERBの助手の売却時に対応されています。
例えば上記例で、ASSIが2番目の人、TARGETが3番目の人だった場合は、
IF ASSI >= 0		(ASSIが2番目(1)なのでIF文内が実行される)
	T = TARGET	(TARGETが3番目(2)なので、Tに2が入る)
	TARGET = ASSI	(TARGETに2番目(1)の人が入る)
	CALL SALE_CHARA	(TARGET=2番目(1)の人の売却計算をする)
	DELCHARA ASSI	(ASSI=2番目(1)の人を削除する、CHARANUMが1減って、最初のTARGETが2番目(1)に置き換わる)
	ASSI = T-1	(Tが2なので、T-1=1、つまり2番目(1)の人がASSIになる)
ELSE
という風に案外複雑な処理をしていたわけです。
逆に言えば、この実装があるため、今回の変更でFINISH.ERBはほんの少しです(→8)。
(元助手売却の実装も、コレの実装を夢見ながら俺が要望出したか、作った記憶が…)

補足:SPキャラを追加した場合
SPキャラ追加方法に沿って突発的なSPキャラを作った場合は以下の修正が必要です。
※変更前
B = COUNT+1	

※変更後
IF COUNT == 50
	B = 15
ELSE
	B = COUNT+1	
ENDIF
erakanonのように同数のSPキャラが存在する場合は以下のような修正が必要です。
※変更前
	B = COUNT+1
	IF CHARANUM >= 2
		SIF NO:1 == B
			CONTINUE
	ENDIF

※変更後
	B = COUNT+1
	D = COUNT+21
	IF CHARANUM >= 2
		SIF NO:1 == B
			CONTINUE
		SIF NO:1 == D
			CONTINUE
	ENDIF
	(以下略)

2.助手可能キャラ数と、調教可能キャラ数の確認

;現助手+元助手のキャラ数の確認
S = 0
REPEAT CHARANUM
	SIF ISASSI:COUNT == 1
		S += 1
REND

;TIMEに合った調教キャラが居るか
E = 0
REPEAT CHARANUM
	;主人公と助手と奴隷は排除
	SIF COUNT == 0
		CONTINUE
	SIF COUNT == ASSI
		CONTINUE
;	A = TIME+1
;	SIF COUNT == TARGET && CFLAG:COUNT:A == 0
;		TARGET = -1
	SIF COUNT == TARGET
		CONTINUE
;	SIF CFLAG:COUNT:A == 0
;		CONTINUE
	E += 1
REND
ISASSIというものはFINISH.ERBにもありますが、
助手が可能かどうかという特殊フラグです。
コレの実装が無ければ全くもって意味不明なおまじない的フラグでもあります、何だかなぁ…
最初のREPEAT文は、このISASSIを持つ助手が可能なキャラが何人居るかの計算です。

;TIMEに合った調教キャラが居るかというのは、当方の改造データの名残です。 気にしないで下さい。
初期設定でフラグ(CFLAG)を立てられる(SPキャラの追加方法参照)のを知って、
昼だけ調教可能な人妻とか、夜だけ調教可能なOLとかを妄想しただけなんです。
Chara**.csvにフラグを入れて、コメントアウトした条件文を有効にすればそのまま使えますけどね!
(助手化したならCFLAG取っ払っていつでも調教可能と考えていたので、助手のTIME条件は無いのですが…)
閑話休題
2つ目のREPEAT文は調教可能なキャラが何人居るかの計算です。
0番はMASTERになるので、またASSIは自分自身を調教出来ないので当然カウントしません。
TARGETもバグ回避のためカウントしません。

3.コマンド

SIF C || TARGET >= 0
	PRINTL [100] - 調教する
SIF CHARANUM > 1
	PRINTL [101] - 能力の表示
SIF TARGET >= 0
	PRINTL [102] - 休憩
SIF C && CHARANUM < 11
	PRINTL [105] - 新規調教
SIF S >= 2
	PRINTL [109] - 助手変更
SIF E >= 1
	PRINTL [110] - 調教対象切り替え
PRINTL [111] - 人身売買
PRINTL [200] - セーブ
PRINTL [300] - ロード

@USERSHOP

IF RESULT == 100 && (C || TARGET >= 0 )
	BEGIN TRAIN
	RETURN 1
ELSEIF RESULT == 101 && CHARANUM > 1
	CALL LIFE_LIST
	WAIT
	IF TARGET >= 0
		PRINTSL NAME:TARGET
		CALL SHOW_JUEL
		CALL SHOW_INFO
	ENDIF
ELSEIF RESULT == 102 && TARGET >= 0
	;休憩フラグを立てる
	FLAG:0 = 1
	BEGIN TURNEND
	RETURN 1
ELSEIF RESULT == 105 && C && CHARANUM < 11
	PRINTL SELECT_CHARACTER
	CALL SELECT_TARGET
ELSEIF RESULT == 109 && S >= 2
	CALL SELECT_ASSI
ELSEIF RESULT == 110 && E >= 1
	CALL CHANGE_TARGET
ELSEIF RESULT == 111
	CALL CHARA_BUY
ELSEIF RESULT == 200
	SAVEGAME
ELSEIF RESULT == 300
	LOADGAME
ENDIF

RETURN 0
赤太字のものは後述する実行コマンドです。
新規調教の条件がC && CHARANUM < 11となっております。
なお、CHARANUM < 11の条件文は他のものを弄れば変更可能です。
とりあえずサンプル版ではMASTERを含めて11人(助手と調教対象で10人)までです。
助手変更の条件がS >= 2(助手可能な人が2人以上)なのは、 他の条件を揃えるのが面倒なためです。
色々弄るのが面倒なので根性を出せば助手可能な1人を調教可能に切替出来ますが、
非常に面倒なのでサンプル版では省略しております。
調教対象切り替えの条件(E)でTARGETを数に含めないのはバグを回避出来ます。
(そうでないとTARGETを助手化した直後にエラーが発生しました(過去形))

4.@SELECT_TARGETの改造
元々ある@SELECT_TARGET(キャラクターの登録)を改造します。
サンプル版ではちょっと先に飛びます。

;調教するキャラを選ぶ
@SELECT_TARGET
;ver1.45大人数対応版
;REPEAT数は人数より多ければ問題ない
REPEAT 60
	;既に登場中のキャラと同じキャラNOは排除
	B = COUNT+1
	IF CHARANUM >= 2
		SIF NO:1 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 3
		SIF NO:2 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 4
		SIF NO:3 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 5
		SIF NO:4 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 6
		SIF NO:5 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 7
		SIF NO:6 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 8
		SIF NO:7 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 9
		SIF NO:8 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 10
		SIF NO:9 == B
			CONTINUE
	ENDIF
	IF CHARANUM >= 11
		SIF NO:10 == B
			CONTINUE
	ENDIF
	
	N = 100+COUNT
	IF ITEM:N
		PRINTFORML [{COUNT}]%ITEMNAME:N%
	ENDIF
;SPキャラ用処理
;	N = 200+COUNT
;	IF ITEM:N
;		PRINTFORML [{COUNT+100}]%ITEMNAME:N%
;	ENDIF
REND

$INPUT_LOOP
INPUT

;既に登場中のキャラと同じキャラNOは排除
R = RESULT + 1
REPEAT CHARANUM
	SIF NO:COUNT == R
		GOTO INPUT_LOOP
REND

(以下略)
前半部は1.で行ったことの繰り返しです。
SPキャラが居る場合の例外処理も1.と同じです。
後半のものは、やはり1.で行っていることとほぼ同じなのですが、
REPEAT文を用いてすっきりされております。
どちらも、同じキャラを登場させないための処置です。

5.@LIFE_LISTの追加
サンプル版だとさらに飛びます。
@LIFE_LISTの実行部分です。

@LIFE_LIST
IF TARGET >= 0
	PRINT 体力
	A = BASE:TARGET:0
	SIF BASE:TARGET:0 < 0
		A = 0
	BAR A,MAXBASE:TARGET:0,32
	PRINTFORM ({A}/{MAXBASE:TARGET:0})
	PRINTFORM  [0]%NAME:TARGET% 
	SIF ISASSI:TARGET == 1
		PRINT 助手可
	PRINTL 
ENDIF
REPEAT CHARANUM
	;主人公と助手対象と調教中キャラは排除
	SIF COUNT == 0
		CONTINUE
	SIF COUNT == ASSI
		CONTINUE
	SIF COUNT == TARGET
		CONTINUE
	PRINT 体力
	A = BASE:COUNT:0
	SIF BASE:COUNT:0 < 0
		A = 0
	BAR A,MAXBASE:COUNT:0,16
	PRINTFORM ({A}/{MAXBASE:COUNT:0})
	PRINTFORM  [{COUNT}]%NAME:COUNT% 
	SIF ISASSI:COUNT == 1
		PRINT 助手可
	PRINTL 
REND
やっていることはINFO.ERBにある@LIFE_BARのコピーと改造です。
まず、TARGETが居るのであればTARGETのLIFE_BAR処理です。
その際、助手可能フラグのISASSIがあれば助手可を表記させます。
PEREAT文内は残りのキャラクターのLIFE_BAR処理です。
その際、何番目のキャラクターであるかも記載しています([{COUNT}]%NAME:COUNT% )
当然、助手可能フラグのISASSIがあれば助手可を表記させます。
あとは、現在のTARGETとの比較のため、および文字数で弊害が起きないように、
バーの長さが半分になっていることくらいです。
この処理自体は能力表示時のほか、次で説明する調教対象選択の選択肢も兼ねています。

6.@CHANGE_TARGETの追加
サンプル版だと戻ります。
コマンド110で追加した調教対象の変更コマンドの実行部分です。

;調教対象選択(eratohoR+ 1.31)
@CHANGE_TARGET
IF TARGET >= 0
	PRINT 現在
	PRINTFORML %NAME:TARGET%を調教中
ENDIF
PRINTL 今回は誰を調教しますか?
CALL LIFE_LIST

$INPUT_LOOP
INPUT
IF RESULT < 0
	GOTO INPUT_LOOP
ELSEIF RESULT >= CHARANUM
	GOTO INPUT_LOOP
ELSEIF RESULT == ASSI
	GOTO INPUT_LOOP
ELSEIF RESULT == 0 && TARGET < 0
	GOTO INPUT_LOOP
ENDIF

SIF RESULT != 0
	TARGET = RESULT
2.でも少し触れましたが、1番目の人(番号は0基準なので0)はMASTERです。
流石にMASTERが自分自身を調教するわけにはいかないので
RESULTが0の時はTARGETを変更しません。
また、実際の画面では、現在のTARGETの番号は選択肢に出て来ないのですが、
処理上はそれを選択してもTARGETが変わらないものとして処理されます。

7.@CHANGE_TARGETの追加
更に助手の変更動作です。

@SELECT_ASSI
PRINT 現在
PRINTFORML [{ASSI}]%NAME:ASSI%が助手
PRINTL 今回は誰を助手にしますか?
REPEAT CHARANUM
	;0(主人公)とASSI以外は排除
	SIF COUNT == 0
		CONTINUE
	SIF ISASSI:COUNT == 0
		CONTINUE
	PRINTFORML  [{COUNT}]%NAME:COUNT% 
REND
PRINTFORML  [100]%NAME:ASSI%を売却

$INPUT_LOOP
INPUT
IF RESULT <= 0
	GOTO INPUT_LOOP
ELSEIF RESULT >= CHARANUM && RESULT != 100
	GOTO INPUT_LOOP
ELSEIF RESULT != 100
	SIF ISASSI:RESULT == 0 
		GOTO INPUT_LOOP
ENDIF

IF RESULT == 100
	T = TARGET
	TARGET = ASSI
	CALL SALE_CHARA
	DELCHARA ASSI
	REPEAT CHARANUM
		SIF ISASSI:COUNT == 1
			ASSI = COUNT
	REND
	PRINTFORMW %NAME:ASSI%を新しい助手にします
	TARGET = T-1
ELSE
	ASSI = RESULT
ENDIF
やってることは助手可能フラグがある人の一覧を出し、
100をINPUTするとFINISH.ERBの助手売却と似たことを行い、
100を除くINPUTなら、助手可能フラグがあれば変更を、それ以外はINPUTに戻るだけです。

8.FINISH.ERBの変更
サンプル版にはついておりませんが、FINISH.ERBの変更も必要です。
と言っても、調教対象を助手にした際に、元助手を残すかどうかの選択肢くらいです。

※変更後
IF RESULT == 2
	IF ASSI >= 0
		PRINTFORML %NAME:ASSI%をどうしますか?
		PRINTFORML [0]%NAME:ASSI%を残す
		PRINTFORML [1]%NAME:ASSI%を売る
		$INPUT_LOOP
		INPUT
		SIF RESULT < 0 || RESULT > 1
			GOTO INPUT_LOOP
		IF RESULT == 1
			T = TARGET
			TARGET = ASSI
			CALL SALE_CHARA
			DELCHARA ASSI
			ASSI = T-1
		ELSE
			ASSI = TARGET
		ENDIF
	ELSE
		ASSI = TARGET
	ENDIF
以上で全修正が完了となります。

戻る