零基础开发 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:BOUGHTITEM: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 在不同的存档之间共享数据。