SDL中文论坛

标题: app私有bin [打印本页]

作者: ancientcc    时间: 2016-6-18 21:33
标题: app私有bin
本帖最后由 ancientcc 于 2016-6-18 21:56 编辑

私有bin要解决两个问题,一是有哪些bin,二是如何构造这些bin。要回答这个两个问题,先了解bin.cfg,和Rose生成私有bin的过程。

一、bin.cfg
如果app有私有bin,那需要在它的<res>/app-<appid>目录下创建bin.cfg,通过该文件描述私有bin情况。对于bin.cfg的内容,它只有四个字段,没有块,以下是一个实例。
  1. [bin]
  2.         id_child = "campaign"
  3.         scenario_child = "campaign_addon"
  4.         macros = "data/core/app-kingdom/macros"
  5.         path = "data/app-kingdom/campaigns"
  6. [/bin]
复制代码

字段描述是否必须
id_childconfig块名。含有id字段的块,除id外,该块下还有个特殊字段:define必须
scenario_childconfig块名。该块下的内容将成为私有bin内容必须
macros路径。构造私有bin的脚本来源1,用于定义宏。注1。它的前面部分是<res>可选
path路径。构造私有bin的脚本来源2,用于定义内容。它的前面部分<res>必须


1:macros、path的前面部分是<res>。举个例子,macros = "data/core/app-kingdom/macros",res是c:/sample,那macros的完整路径是“c:/sample/data/core/app-kingdom/macros”。

二、Rose生成私有bin的过程
让就以上面的bin.cfg实现描述生成过程。假设<res>是c:/sample


接下让回答开始提的两个问题。
问题一:有哪些bin
解析“path”字段指示的脚本(注意此时不解析“macros”),形成一个config。枚举该config下子config(只是第一级),对于块名是campaign(id_child字段值)的就会对应一个bin,即有几个<id_child>块该app就有几个bin。

问题二:如何构造这些bin
构造分四个步骤,1)如果[id_child]指定块中含有define字段,在构造时首先会定义该宏。2)如果“macros”指定了路径,构造该路径。3)构造“path”指定的路径。4)从形成的config下子config(只是第一级)搜到第一个块名(只关心第一个)是“scenario_child”值的,该块内容就是最后bin文件内容。

几个要点


要形成私有bin,app应该怎么做


作者: ancientcc    时间: 2017-1-30 20:32
本帖最后由 ancientcc 于 2017-7-18 09:27 编辑

按要求把指定的多个cfg目录/文件转换成一个*.bin文件或另外cfg。

语法
  1. bool editor::cfgs_2_cfg(const editor::BIN_TYPE type, const std::string& name, const std::string& app, bool write_file, uint32_t nfiles, uint32_t sum_size, uint32_t modified)
复制代码


参数
type间接指示要生成的是哪个bin文件
name在生成一些bin时须要这个值
appapp标识,在生成一些bin时须要这个值
write_filetrue时把结果写入bin文件,false则不写
nfilesbin头四元组中的nfiles
sum_sizebin头四元组中的sum_size
modifiedbin头四元组中的modified


返回值
成功返回true,否则false。

范例
  1. <Example>
复制代码


注释
类型(type)文件名描述name
TB_DATtb-hexagonal.dat/tb-square.dat地形数据tb-hexagonal.dat/tb-square.dat
SCENARIO_DATAduel.bin/hero_race.binapp私有bin
GUIgui.bin窗口子系统不须要
EXTENDABLE不会生成文件目的是生成campaigns_config_、tbs_config_。是概述,不是具体bin不须要
MAIN_DATAdata.bin主配置不须要


相关类、函数
<Relative class, function>
作者: ancientcc    时间: 2017-7-18 09:37
本帖最后由 ancientcc 于 2017-7-18 10:23 编辑

按要求把指定的多个cfg目录/文件重新生成wml2bin_descs_。

语法
  1. void teditor_::get_wml2bin_desc_from_wml(const std::vector<BIN_TYPE>& system_bin_types)
复制代码


参数
system_bin_types要重新计算的系统bin


返回值
void

范例
  1. <Example>
复制代码


注释
每个bin有个时间戳,这个时间戳是个四元组,
字段类型描述
namestd::string短文件名
nfilesuint32_t文件数,只累计文件不包括目录。
sum_sizeuint32_t总字节数,只累计文件不包括目录。
modifieduint32_t最近文件的修改时间,只计算文件不包括目录。

从硬盘上读出*.bin,基于目录中cfg计算出的四元组,如果要正确,须严格按cfg扩展机制计算出的四元组,但要能计算出这个值,那就意要深入每个cfg文件!
  1. void data_tree_checksum(const std::vector<std::string>& defines, const std::vector<std::string>& paths, file_tree_checksum& checksum)
复制代码

这函数要耗不少cpu,但studio首页总是要重新计算所有bin,用这方法会有较大延迟。这里用种不深入每个cfg的替换方法。
  1. void data_tree_checksum(const std::vector<std::string>& paths, file_tree_checksum& checksum, int filter)
复制代码

变量use_should_method指示构造该bin使用哪种方法。data.bin涉及到目录多,一定要用第一种方案。


相关类、函数
<Relative class, function>




欢迎光临 SDL中文论坛 (http://www.libsdl.cn/bbs/) Powered by Discuz! X3.3