零基础开发 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
  1. 后半部分没有亲自测试过,部分作用存疑,待验证。
  2. 想让 起動時簡略表示 生效需要设置 ロード時にレポートを表示する: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:角色编号:参数编号

注意:

  1. 取「珠的名称」要用 PALAMNAME,不存在 JUELNAME
  2. 取「珠的数量」要用 JUELPALAM(在未 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.csvMAXBASE基礎基础属性
Abl.csvABL能力技能
Talent.csvTALENT素質特性
CFlag.csvCFLAGフラグ角色 flag
CStr.csvCSTRCSTR角色备注
Chara*.csvRELATION相性好感度
Equip.csvEQUIP装着物初始装备
Mark.csvMARK刻印刻印
Exp.csvEXP経験经历
Palam.csvPALAM临时状态属性
JUEL角色状态属性

RELATION 数组的初始值可以在 _Replace.csv 指定 RELATIONの初期値 来修改。

调教系统#

文件变量名参考用途类比变量初始化时机
TEquip.csvTEQUIP调教时装备EQUIPBEGIN TRAIN
TFlag.csvTFLAG调教时 flagFLAGBEGIN TRAIN
TCVar.csvTCVAR特定角色版
调教时 flag
TFLAGBEGIN TRAIN
TStr.csvTSTR调教时字符串STRBEGIN TRAIN
Palam.csvPALAM参数BEGIN TRAIN
GOTJUEL新获得的珠JUELBEGIN TRAIN
Stain.csvSTAIN污渍BEGIN TRAIN
Source.csvSOURCEBEGIN TRAIN
@SOURCE_CHECK 之后
Ex.csvEX高潮BEGIN TRAIN
NOWEX@EVENTCOM 之前

全局变量#

旗标 Flag.csv

全局旗标flag数组。

编辑 ./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

每个角色Character独立的全局二维Double旗标Flag数组。

那 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

注意 GLOBALGLOBALS 是可以通过全局(公共)存档读写的。

  • SAVEGLOBAL:将 GLOBALGLOBALS 当前的值保存到 global.sav
  • LOADGLOBAL:从 global.sav 读取之前保存的值赋给 GLOBALGLOBALS

而且它最吊的地方在于「它 不会其他存档变量 一起保存 / 加载」。

他のデータと一緒にはセーブ・ロードされません。

你必须使用 SAVEGLOBAL / LOADGLOBAL 手动进行保存 / 加载。
这意味着:你可以利用 GLOBALGLOBALS 在不同的存档之间共享数据。

lackbfun © 2021 - 2024