euremoのeramemo - 配列変数の添字に文字列を使いたい

配列変数の添字に文字列を使いたい


下記以外の変数では使えません。

http://sourceforge.jp/projects/emuera/wiki/exetc
以下の変数について、引数を*.csvで定義した文字列にして呼び出すことができます。
	ITEM (item.csv)
	ITEMSALES (item.csv)
	LOSEBASE (base.csv)
	BASE (base.csv)
	MAXBASE (base.csv)
	ABL (abl.csv)
	TALENT (talent.csv)
	EXP (exp.csv)
	MARK (mark.csv)
	RELATION (chara*.csv)
	UP (palam.csv)
	DOWN (palam.csv)
	PALAM (palam.csv)
	JUEL (palam.csv)
	GOTJUEL (palam.csv)
	STAIN (stain.csv)
	SOURCE (source.csv)
	EX (ex.csv)
	NOWEX (ex.csv)
	TEQUIP (tequip.csv)
	EQUIP (equip.csv)
	FLAG (flag.csv)
	TFLAG (tflag.csv)
	CFLAG (cflag.csv)
	STR (strname.csv)
	SAVESTR (savestr.csv)
	以下はEmueraから追加された変数
	ITEMPRICE (item.csv)
	DOWNBASE (base.csv)
	CUP (palam.csv)
	CDOWN (palam.csv)
	TCVAR (tcvar.csv)
	TSTR (tstr.csv)
	CSTR (cstr.csv)
	CDFLAG (cdflag1.csv, cdflag2.csv)
	GLOBAL (global.csv)
	GLOBALS (globals.csv)

妥協案1


使えないんだけど、GETNUMを使えばこういうことはできる。

A:(GETNUM(PALAM, "恭順")) = PALAM:恭順

下記のような関数を定義しておくと便利。

@PALAMID, ARGS
#FUNCTION
LOCAL = GETNUM(PALAM, ARGS)
RETURNF LOCAL

呼び出すときはこう。

A:(PALAMID("恭順")) = PALAM:恭順

CSVに定義されていない文字列を使いたい場合はSELECTCASEを使った関数を定義すればいい。
定義を列記する労力までは軽減できないものの、使用機会が多ければ多いほど、その労力を回収できるはず。

; A:(TIMEVALUE("早朝")) のように使う
@TIMEVALUE, ARGS
#FUNCTION
VARSET LOCAL
SELECTCASE ARGS
CASE "早朝"
    LOCAL = 0
CASE "朝"
    LOCAL = 1
CASE "昼"
    LOCAL = 2
CASE "夕"
    LOCAL = 3
CASE "夜"
    LOCAL = 4
CASE "深夜"
    LOCAL = 5
ENDSELECT
RETURNF LOCAL

問題は文字列そのものを変更したときに書き換えが必要になる点。
もっとも、数字を変更したときの書き換えに比べればいくぶんもマシではある。

妥協案2


ERHを使った黒魔術ならば、もうちょっといい書き方ができる。

;ERH
#DEFINE SKILL CFLAG

;CFLAG.CSV
0,剣技
1,魔法
2,祈祷

;ERB
A = SKILL:剣技
B = SKILL:魔法
C = SKILL:祈祷

もちろんこれはCFLAG:剣技などと書くのと何も変わらないのだが、CFLAG内で番号を範囲ごとにカテゴリ分けして使うなら、CFLAG自体のエイリアスをERHで定義するのもひとつの手だろうと思う。
欠点がないわけでもない。

;ERH
#DEFINE SKILL CFLAG
#DEFINE CLASS CFLAG

;CFLAG.CSV
0,剣技
1,魔法
2,祈祷

10,剣士
11,魔法使い
12,僧侶

こういう定義をしたところで、CLASS:剣技という書き方でエラーにはならないし、SKILL:魔法使いという書き方もエラーにならない。そういうところまで制御できるわけではない、ということだ。その点に目を瞑れば、まあなんとか使えるんじゃないだろうか。少なくとも、ERHで文字列を数字を置き換えさせるよりはよさそうだし。