零基础开发 era 游戏 #12 CSV 数据文件
本章主要介绍 ./csv/
目录下的数据文件用途。
_default.config
/ _fixed.config
#
虽然它们是配置文件 *.config
,但也是放在 ./csv/
目录下的。
详细用法已经在《配置文件》一章中讲过,此处不再赘述。
_Rename.csv
#
需要先启用
_Rename.csvを利用する:YES
配置项。
这是 eramaker 的衍生工具「EraMakerEx」开创的功能。
EraMakerEx 可以在「eramaker 予備うpろだ 1(通用密码
era
)」下载到。
(感谢 傲視長空 的帮忙考据。)
readme_EraMakerEx.txt
*********************************** プログラム名:EraMakerEx 作者:EXの人 最終更新日:2008 / 3 / 27 最終バージョン Ver. 1.01 *********************************** ●免責事項 ・このプログラムはEraMakerを改造する人を支援するために作られたツールです。 ・このプログラムを使用したことで発生した如何なるトラブルに、作者は責任をもちません。 自己責任でお願いします。(バックアップは各自で取ってねってことです) ●現在の機能: ・ERBファイル内にある特定の文字列を変換/復元する (Ver1.0a) (復元前にバックアップを行っています) ●バージョン情報 Ver 1.0 2008/3/27 ・ 公開 Ver 1.1 2008/3/27 ・csvファイルの前後の空白の除去忘れ ・csvファイルの入れ替え ●使い方: 1、EraMakerExを、eramaker.exeと同じフォルダにコピーする。 2、csvフォルダ内に「_Rename.csv」というファイルを作成する。 (同封のcsvファイルを入れてもかまいません) 2、_Rename.csv内に「変換させたいERB言語 , 変換させたい自作の文字列」 といった具合に記入していってください。書式は他のcsvファイルと同様です。 セミコロンによるコメントも適応されます(コメント文は変換の対象になりません) 3、EraMakerExを起動し、「文字列の変換」を実行する。 これでゲーム内で読める形式(ERB言語)の中にある特定の文字を、 自分の好きな文字に変換できます。 また、この際に変換対象となったファイルは、専用のフォルダが自動作成され、 その中に変換前のファイルがコピーされます。 ちなみに現在では、区切り文字として [[ ]] が使用されています。 []だけでは変換対象になりません。また、間にスペースを入れても変換対象になりません。 × [[ 調教:愛撫 ]] ○ [[調教:愛撫]] 4、ERBファイルを自分好みに改造する。 事前に_Rename.csvに記入があれば、直接 [[ ]] で囲ったものを書き込んでもかまいません。 5、ゲームに読み込ませる前にEraMakerExを起動し、「文字列の復元」を実行する。 これでeramakerに理解できるERB言語へ戻されます。 ●注意点 ・ csvには変換前のERBの対象に数字のみを登録しないでください。 普通の計算式で使われる数字まで誤変換されます。 例)CSVへの記入例 TALENT , 才能 ○ 0 , 処女 × 10 , 臆病 × ただし変換後の候補に数字だけというのはかまいません。 TALENT:0 , 処女 ○ TALENT:10 , 臆病 ○ チルノ : 9 ○ ・ csvファイル内に、1行に1つ以上のコンマ(,)を入れないでください。 メモリリークエラーで強制終了します。 また、行の末尾にセミコロン(;)を入れてコメントもしないでください。 同じくエラーで落ちます。 ・ 変換するたびにバックアップを取ります。 長くデバッグをしていると大量に増えて邪魔になると思うので、 各自で削除するなり別の場所へ大切に保管するなりしてください。 ・ 現在の使用では、ERBフォルダにある、拡張子がERBっぽいものまで対象にされます。 ABL.ERB ○ 対象 _ABL.ERB ○ 対象 能力.ERB ○ 対象 ABL.txt × 除外 ABL.ERB_0327 ● 対象になります… ABL.0327_ERB × 除外 バックアップは拡張子をまるきり別のものにしてください。 要望があれば今後改善します。 ●今後の予定 ・ERBファイル自動作成 (変数として用意されていないcsvファイル内のデータを弄れるようにする)
总之就是一个重命名功能。编辑 ./csv/_Rename.csv
:
147 , 关键词 A
258 , 关键词 B
三六九 , 关键词 C
PRINT , 打印
PRINTL , 打印单行
不一定非得是
新的代码 , 被替换的代码
这样用空格隔开,这样写只是为了好看而已。
两边的空格会自动去除,所以不用空格直接写成新的代码,被替换的代码
也是可以的。
然后在 erb 文件里就可以直接用 [[关键词]]
这个写法,在 Emuera 启动之初,读取源码时会自动替换。(有点类似 [[Wiki 内部链接]]
/ [[笔记软件双向链接]]
)
@SYSTEM_TITLE WHILE 1 PRINTL [[关键词 A]] [[关键词 B]] [[关键词 C]] [[打印单行]] --- 手动分隔线 --- [[打印]] 很神奇吧 WAIT WEND QUIT
_Replace.csv
#
需要先启用
_Replace.csvを利用する:YES
配置项。
仍然是按照 csv 格式编辑 ./csv/_Rename.csv
:
;---------------------------------------------------------------- ; 游戏内置常量替换表 _Replace.csv ; 相关官方文档 https://osdn.net/projects/emuera/wiki/replace ; 需要启用设置 _Replace.csvを利用する:YES ;---------------------------------------------------------------- ; 金钱的单位,默认为「$」 ;お金の単位,$ ; 金钱单位显示在数值前后的位置,默认为「後」 ;単位の位置,後 ; Emuera 刚启动时替换的加载语,默认为「Now Loading...」 起動時簡略表示,少女折寿中…… ; 商店默认的商品数量 ;販売アイテム数,99 ; DRAWLINE 命令使用的字符串,默认为「-」 ;DRAWLINE文字,- ; 显示进度条时使用的字符,默认为「*」和「.」(显示为 [****....]) ; 建议不要使用数字,比如 [11110000] 会被识别为按钮,可能会导致不必要的输入错误 ;BAR文字1,* ;BAR文字2,. ; 默认标题栏显示的内容,默认为「最初からはじめる」(从头开始)和「ロードしてはじめる」(加载存档后开始) システムメニュー0,开始新游戏 システムメニュー1,读取存档 ; 指定执行 TRAIN 时没有找到 @COM_ABLE{X} 指令的反应,是否将错误输入视为可行,默认为「1」(是) ;COM_ABLE初期値,0 ; 指定初始化 STAIN 时的默认值,「/」可以指定多个项,默认为「0/0/2/1/8」 ;汚れの初期値,0/0/2/1/8 ; 当执行 TINPUT 等需要等待的命令时,倒计时结束时显示的文本,默认为「時間切れ」(超时) 時間切れ表示,倒计时结束 ; 指定初始化 EXPLV 时的默认值,「/」可以指定多个项,默认为「0/1/4/20/50/200」 ;EXPLVの初期値,0/1/4/20/50/200 ; 指定初始化 PALAMLV 时的默认值,「/」可以指定多个项,默认为「0/100/500/3000/10000/30000/60000/100000/150000/250000」 ;PALAMLVの初期値,0/100/500/3000/10000/30000/60000/100000/150000/250000 ; 指定初始化 PBAND:0 时的默认值,默认为「4」 ;PBANDの初期値,4 ; 指定人设文件 Chara**.csv 文件中没有设定 RELATION(相性)时的默认值,默认为「0」 ;RELATIONの初期値,0
- 后半部分没有亲自测试过,部分作用存疑,待验证。
- 想让
起動時簡略表示
生效需要设置ロード時にレポートを表示する:NO
,否则会显示加载文件 / 函数的详情。
GameBase.csv
#
详细用法已经在《系统内置全局变量》一节中讲过,此处不再赘述。
VariableSize.csv
#
详细用法已经在《系统内置数组变量大小》一节中讲过,此处不再赘述。
TODO:
- 遍历所有存在的系统内置变量
- 分析每个内置变量的含义和用途(暫定的な仕様表)
其他 *.csv
#
强烈建议先阅读《Emuera 原生游戏运行流程浅析》一文对游戏流程形成初步认识。
商店系统 Item.csv
#
编辑 ./csv/Item.csv
文件:
;---------------------------------------------------------------- ; 道具 - Item.csv ;---------------------------------------------------------------- 0,商品名A,价格 1,商品名B,价格 2,商品名C,价格
来源 | 变量名 | 参考用途 | 具体用法 |
---|---|---|---|
由 Item.csv 定义 | ITEMNAME | 商品名 | ITEMNAME:商品编号 |
ITEMPRICE | 售价 | ITEMPRICE:商品编号 | |
其他相关变量 | ITEMSALES | 是否正在售卖 | ITEMSALES:商品编号 > 0 |
ITEM | 已持有的数量 | ITEM:商品编号 | |
BOUGHT | 上次购买的编号 | ITEMNAME:BOUGHT ITEM:BOUGHT …… |
角色系统#
首先是枚举所有可能存在的角色属性,分别包括以下内容。
基础属性 Base.csv
对应 Chara*.csv
中的 基礎,基础属性编号,基础属性值上限
,具体用法:
- 基础属性名:
BASENAME:基础属性编号
- 基础属性值上限(最大值):
MAXBASE:角色编号:基础属性编号
- 基础属性当前值:
BASE:角色编号:基础属性编号
注意这里的 基础属性编号
是可以替换为 BASENAME
的。
;---------------------------------------------------------------- ; 基础属性 - Base.csv ;---------------------------------------------------------------- 0,体力 1,精力
比如这里的 MAXBASE:角色编号:0
其实和 MAXBASE:角色编号:体力
是同一个东西。
但是,一般来说推荐优先使用 基础属性编号
,即 MAXBASE:角色编号:0
这种形式。
因为这样就不需要考虑翻译问题,已经自动兼容了。
(在 Chara*.csv
里自定义角色时也是同理。)
技能 Abl.csv
对应 Chara*.csv
中的 能力,技能编号,当前技能值
,具体用法:
- 技能名称:
ABLNAME:技能编号
- 当前技能等级:
ABL:角色编号:技能编号
;---------------------------------------------------------------- ; 技能 - Abl.csv ;---------------------------------------------------------------- 0,力量 1,敏捷 2,智力 3,信仰
特性 Talent.csv
对应 Chara*.csv
中的 素質,特性编号,当前特性值
,具体用法:
- 特性名称:
TALENTNAME:特性编号
- 当前特性值:
TALENT:角色编号:特性编号
;---------------------------------------------------------------- ; 特性 - Talent.csv ;---------------------------------------------------------------- 0,冷淡 1,热情 2,机敏 3,天然
角色 Flag CFlag.csv
对应 Chara*.csv
中的 フラグ,旗标编号,旗标值
,具体用法:
- 旗标名称:
CFLAGNAME:旗标编号
- 当前旗标值:
CFLAG:角色编号:旗标编号
;---------------------------------------------------------------- ; 角色 Flag - CFlag.csv ;---------------------------------------------------------------- 0,童贞 1,成年
角色字符串 CStr.csv
对应 Chara*.csv
中的 CSTR,备注编号,备注信息
,具体用法:
- 旗标名称:
CSTRNAME:备注编号
- 当前旗标值:
CSTR:角色编号:备注编号
其实就是字符串版本的 CFLAG
。
;---------------------------------------------------------------- ; 角色字符串 - CStr.csv ;---------------------------------------------------------------- ; 声望 10,红魔馆 11,迷途之家 12,永远亭 13,三途河 14,守矢神社 15,地灵殿 16,命莲寺 17,博丽神社 18,人间之里 ; 描述 100,出身 101,性格 ; 其他信息 110,当前所在地
装备 Equip.csv
对应 Chara*.csv
中的 装着物,装备部位编号,当前装备ID
,具体用法:
- 装备部位名称:
EQUIPNAME:装备部位编号
- 当前装备 ID:
EQUIP:角色编号:装备部位编号
;---------------------------------------------------------------- ; 装备 - Equip.csv ;---------------------------------------------------------------- 1,头部 2,颈部 3,肩部 4,背部 5,胸部 6,腕部 7,手部 8,腰部 9,腿部 10,脚部 11,戒指_1 12,戒指_2 13,饰品_1 14,饰品_2 15,主手 16,副手
刻印 Mark.csv
对应 Chara*.csv
中的 刻印,刻印编号,刻印等级
,具体用法:
- 刻印名称:
MARKNAME:刻印编号
- 当前刻印等级:
MARK:角色编号:刻印编号
;---------------------------------------------------------------- ; 刻印 - Mark.csv ;---------------------------------------------------------------- 0,苦痛刻印 1,快乐刻印 2,反感刻印
经验 Exp.csv
对应 Chara*.csv
中的 経験,经验编号,经验值
,具体用法:
- 经验类型名称:
EXPNAME:经验编号
- 当前经验值:
EXP:角色编号:经验编号
;---------------------------------------------------------------- ; 经验 - Exp.csv ;---------------------------------------------------------------- 0,杀戮经验 1,自慰经验 2,性交经验
角色参数 / 珠 - Palam.csv
对应 Chara*.csv
中的 珠,参数编号,珠的数量
,具体用法:
- 角色参数 / 珠的名称:
PALAMNAME:参数编号
- 当前珠的数量:
JUEL:角色编号:参数编号
注意:
- 取「珠的名称」要用
PALAMNAME
,不存在。JUELNAME
- 取「珠的数量」要用
JUEL
,PALAM
(在未TRAIN
时)永远为0
。
;---------------------------------------------------------------- ; 角色参数 - Palam.csv ;---------------------------------------------------------------- 0,幸运 1,欲望
自定义人物 Chara*.csv
配置文件设置为
サブディレクトリを検索する:YES
时,才能读取子目录下的对应文件(指Chara*.csv
和*.erb
)。
注意在 CSV 文件里 只有Chara*.csv
可以放到子目录中仍然能够识别,其他 CSV 文件是不能放到二级目录下的(会读取不到)。
最后根据之前的预设项目来捏人(设定游戏内置的人物 / NPC)即可。
除了前文提到的角色文件 Chara*.csv
可配置项,还有几个比较特殊的参数:
番号,角色编号
:顾名思义。名前,主角
:将主角
存入变量NAME:角色编号
。呼び名,你
:将你
存入变量CALLNAME:角色编号
。(已废弃)助手,1
:拥有这项配置的角色在新游戏开始之初就会成为「助手」。相性,目标角色编号,对目标的好感度
:可以同时设定多个,构成复杂 的人际关系网络。
编辑 ./csv/Chara/Chara*.csv
文件:
注意文件名只要是
Chara
开头就行,不用写编号其实也可以。
当我们通常都会在文件名里写上编号,是为了方便排序和查找。
;---------------------------------------------------------------- ; 主角 - Chara00_主角怎么说主角_随便你起什么都行_其实不影响_读取真正看的是[番号].csv ;---------------------------------------------------------------- 番号,0 名前,主角 呼び名,你 基礎,0,1000 ; 0,体力 基礎,1,800 ; 1,精力 能力,0,20 ; 0,力量 能力,1,15 ; 1,敏捷 能力,2,12 ; 2,智力 能力,3,18 ; 3,信仰 素質,1,10 ; 1,热情 素質,2,10 ; 2,机敏 フラグ,0,1 ; 0,童贞 フラグ,1,1 ; 1,成年 ; 18,人间之里声望 CSTR,18,友好 ; 100,出身 CSTR,100,现世 ; 101,性格 CSTR,101,憨批 ; 101,当前所在地(默认为 18,人间之里) CSTR,110,18 装着物,5,501 ; 5,胸部 装着物,9,901 ; 9,腿部 装着物,10,1001 ; 10,脚部 刻印,1,5 ; 1,快乐刻印 経験,0,1 ; 0,杀戮经验 経験,1,2 ; 1,自慰经验 経験,2,0 ; 2,性交经验 珠,0,123 ; 0,幸运 珠,1,222 ; 1,欲望
预定义文件 | 变量名 | Chara*.csv 中的名称 | 参考用途 |
---|---|---|---|
Base.csv | MAXBASE | 基礎 | 基础属性 |
Abl.csv | ABL | 能力 | 技能 |
Talent.csv | TALENT | 素質 | 特性 |
CFlag.csv | CFLAG | フラグ | 角色 flag |
CStr.csv | CSTR | CSTR | 角色备注 |
Chara*.csv | RELATION | 相性 | 好感度 |
Equip.csv | EQUIP | 装着物 | 初始装备 |
Mark.csv | MARK | 刻印 | 刻印 |
Exp.csv | EXP | 経験 | 经历 |
Palam.csv | PALAM | 临时状态属性 | |
JUEL | 珠 | 角色状态属性 |
RELATION
数组的初始值可以在_Replace.csv
指定RELATIONの初期値
来修改。
调教系统#
文件 | 变量名 | 参考用途 | 类比变量 | 初始化时机 |
---|---|---|---|---|
TEquip.csv | TEQUIP | 调教时装备 | EQUIP | BEGIN TRAIN |
TFlag.csv | TFLAG | 调教时 flag | FLAG | BEGIN TRAIN |
TCVar.csv | TCVAR | 特定角色版 调教时 flag | TFLAG | BEGIN TRAIN |
TStr.csv | TSTR | 调教时字符串 | STR | BEGIN TRAIN |
Palam.csv | PALAM | 参数 | BEGIN TRAIN | |
GOTJUEL | 新获得的珠 | JUEL | BEGIN TRAIN | |
Stain.csv | STAIN | 污渍 | BEGIN TRAIN | |
Source.csv | SOURCE | BEGIN TRAIN @SOURCE_CHECK 之后 | ||
Ex.csv | EX | 高潮 | BEGIN TRAIN | |
NOWEX | @EVENTCOM 之前 |
全局变量#
旗标 Flag.csv
全局
编辑 ./csv/Flag.csv
:
0,这波立大功 1,这波立天功 2,这波西湖湖底雅座一位 3,搞砸了,寄 4,我是菜鸟,想寄就寄
编辑 ./erb/游戏业务逻辑.erb
:
@SYSTEM_TITLE FLAG:这波立大功 = 100 FLAG:这波立天功 = 200 FLAG:这波西湖湖底雅座一位 = -100 FLAG:搞砸了,寄 = 0 FLAG:我是菜鸟,想寄就寄 = -1 REPEAT 5 PRINTFORML FLAG:{COUNT} = {FLAG:COUNT, 4} (%FLAGNAME:COUNT%) REND QUIT
字符串变量 SaveStr.csv
没有初始值(或者说初始值为空字符串 ""
)的全局字符串数组,一般当成变量使用。
用法示例和下面合在一起讲。
字符串常量 Str.csv
/ StrName.csv
自带初始值的全局字符串数组,一般当成常量使用。
注意这里说的 相当于 常量,实际上它是可以动态修改的。
只不过修改完并不能保存,下次启动还是预设的初始值,仅此而已。
编辑 ./csv/SaveStr.csv
:
0,大鸟转 1,大鸟转转 2,大鸟转转转
编辑 ./csv/Str.csv
:
0,大鸟转了一圈。 1,大鸟转了两圈。 2,大鸟转了三圈。
编辑 ./csv/StrName.csv
:
0,转一圈 1,转两圈 2,转三圈
编辑 ./erb/游戏业务逻辑.erb
:
@SYSTEM_TITLE DRAWLINE PRINTL 初始值 PRINTL CALL PRINT_STRINGS DRAWLINE PRINTL 赋予新值 PRINTL SAVESTR:大鸟转 = 大鸟很累了,大鸟并不想转。 SAVESTR:大鸟转转 = 你考虑过大鸟的感受吗? SAVESTR:大鸟转转转 = 没有,你只关心你自己。 STR:转一圈 = 大鸟转了十圈。 STR:转两圈 = 大鸟转了五十圈。 STR:转三圈 = 大鸟转了一伯圈。 CALL PRINT_STRINGS QUIT @PRINT_STRINGS PRINTFORML SaveStr:大鸟转 =「%SAVESTR:大鸟转%」 PRINTFORML SaveStr:大鸟转转 =「%SAVESTR:大鸟转转%」 PRINTFORML SaveStr:大鸟转转转 =「%SAVESTR:大鸟转转转%」 PRINTL PRINTFORML Str:转一圈 =「%STR:转一圈%」 PRINTFORML Str:转两圈 =「%STR:转两圈%」 PRINTFORML Str:转三圈 =「%STR:转三圈%」
角色二维数组 CDFlag1.csv
/ CDFlag2.csv
那 1、2 又是什么意思呢?是指「第一维数组索引」「第二维数组索引」。
编辑 ./csv/CDFlag1.csv
:
0,天干 1,甲 2,乙 3,丙 4,丁 5,戊 6,己 7,庚 8,辛 9,壬 10,癸
编辑 ./csv/CDFlag2.csv
:
0,地支 1,子 2,丑 3,寅 4,卯 5,辰 6,巳 7,午 8,未 9,申 10,酉 11,戌 12,亥
此时如果直接启动游戏会报一长串警告 Xは配列の範囲外です
(数组越界)。
这是因为 CDFLAG
的默认大小只有 CDFLAG, 1, 1
(即只有 CDFLAG:0:0
可用)。
编辑 ./csv/VariableSize.csv
修改内置数组变量的大小:
CDFLAG,11,13
疑惑为什么是 11 × 13 而不是 10 × 12 的,建议滑上去重新数一下。
编辑 ./erb/游戏业务逻辑.erb
:
@SYSTEM_TITLE #DIM CONST 角色编号 = 0 ADDVOIDCHARA 角色编号 CDFLAG:角色编号:戊:戌 = 1898 PRINTFORML CDFLAGNAME1(%CDFLAGNAME1:0%) CDFLAGNAME2(%CDFLAGNAME2:0%) PRINTFORML CDFLAG:角色编号:戊:戌={CDFLAG:角色编号:戊:戌} QUIT
全局存档变量 Global.csv
/ Globals.csv
正经(?真的吗)的全局变量。
编辑 ./csv/Global.csv
:
0,全局数值变量1 1,全局数值变量2 2,全局数值变量3
编辑 ./csv/Globals.csv
:
0,全局字符串变量A 1,全局字符串变量B 2,全局字符串变量C
编辑 ./erb/游戏业务逻辑.erb
:
@SYSTEM_TITLE GLOBAL:全局数值变量1 = 147 GLOBAL:全局数值变量2 = 258 GLOBAL:全局数值变量3 = 369 GLOBALS:全局字符串变量A = Apple GLOBALS:全局字符串变量B = Banana GLOBALS:全局字符串变量C = Candy PRINTFORML GLOBAL:0 = {GLOBAL:全局数值变量1} (%GLOBALNAME:0%) PRINTFORML GLOBAL:1 = {GLOBAL:全局数值变量2} (%GLOBALNAME:1%) PRINTFORML GLOBAL:2 = {GLOBAL:全局数值变量3} (%GLOBALNAME:2%) PRINTFORML GLOBALS:0 = %GLOBALS:全局字符串变量A, 6, LEFT% (%GLOBALSNAME:0%) PRINTFORML GLOBALS:1 = %GLOBALS:全局字符串变量B, 6, LEFT% (%GLOBALSNAME:1%) PRINTFORML GLOBALS:2 = %GLOBALS:全局字符串变量C, 6, LEFT% (%GLOBALSNAME:2%) QUIT
注意 GLOBAL
和 GLOBALS
是可以通过全局(公共)存档读写的。
SAVEGLOBAL
:将GLOBAL
和GLOBALS
当前的值保存到global.sav
。LOADGLOBAL
:从global.sav
读取之前保存的值赋给GLOBAL
和GLOBALS
。
而且它最吊的地方在于「它 不会 和 其他存档变量 一起保存 / 加载」。
他のデータと一緒にはセーブ・ロードされません。
你必须使用 SAVEGLOBAL
/ LOADGLOBAL
手动进行保存 / 加载。
这意味着:你可以利用 GLOBAL
和 GLOBALS
在不同的存档之间共享数据。