attrib_calc
简介
主要目的是为特定对象计算属性最终值提供一个常见的处理流程
常见的计算流程如下:
- 收集指定来源的属性词条
- 属性词条转换为标准的属性提升数值
- 合并属性提升数值
- 计算最终值
整个处理流程中,需要由使用者提供定制的计算模块对象(未提供时使用默认的计算模块对象)
组件接口
attrib_calc.gs
函数原型 | 函数作用 |
---|---|
object impl() | 获取属性计算处理流程中定制的计算模块对象 |
void setup(object impl_ob) | 为属性计算处理流程指定一个定制的计算模块对象 |
array get_sources(object ob) | 获取指定对象的属性来源列表 |
map calc_attribs(object ob, map improvments) | 根据目标对象的属性提升最终值,计算出属性的最终值 |
array collect_affixs(object ob, string source) | 收集目标对象指定类别来源的词条列表 |
mixed convert_to_improvement(mixed affix) | 属性词条的数据格式转化为属性提升的数据格式 |
void merge_improvments(map improvments, mixed improvement) | 将一个属性提升数据合并入属性提升最终数据中 |
FAttribCalc.gs
需要使用pkg.attrib_calc进行属性最终值计算的对象,必须包含本组件;
本组件提供了一些属性计算必要的接口函数;
函数原型 | 函数作用 |
---|---|
void refresh_attribs() | 强制刷新所有属性最终值,并将属性最终值通知给对象自身 |
void refresh_attrib(string source, bool notify_at_once = true) | 强制刷新由某个特定来源的属性加成值,并将属性最终值变更发送给对象自身 |
mixed query_attrib(string attrib) | 获取特定属性的属性最终值 |
map query_attribs() | 获取所有的属性最终值 |
map query_improvements() | 获取所有的属性加成值 |
void notify_attribs() | 将所有的属性最终值通知给对象自身 |
void notify_attribs_changed() | 将 变更的属性最终值通知给对象自身 |
FAttribCalcImplBase.gs
使用者所定制的计算模块对象必须包含本组件,本组件提供一些计算模块对象必须拥有的接口函数
函数原型 | 函数作用 |
---|---|
array get_sources(object ob) | 虚函数:获取目标对象的属性来源列表 |
map calc_attribs(object ob, map improvements) | 虚函数:根据目标对象的属性提升最终值,计算出属性的最终值 |
array collect_affixs(object ob, string source) | 虚函数:收集目标对象指定类别来源的词条列表 |
map convert_to_improvement(mixed affix) | 虚函数:属性词条的数据格式转化为属性提升的数据格式 |
void merge_improvments(map improvements, map improvement) | 虚函数:将一个属性提升数据合并入属性提升最终数据中 |
样例
#pragma parallel
import gs.lang.*;
import gs.util.*;
import pkg.attrib_calc;
import .test_char;
void create()
{
// 登记一些信息
// 标准值计算公式
attrib_calc.impl().register_std_value_func(test_char, (: callback_get_std_value :));;
// 词条收集函数
attrib_calc.impl().register_collect_func(test_char, "equip", (: callback_collect_affixs :));
attrib_calc.impl().register_collect_func(test_char, "status", (: callback_collect_affixs :));
// 登记词条模板信息
map affixs = {
1000 : { "attrib" : "attack", "value_type" : "value", },
1001 : { "attrib" : "str", "value_type" : "value", },
1002 : { "attrib" : "str", "value_type" : "percent", },
1003 : { "attrib" : "attack", "value_type" : "percent", },
1004 : { "attrib" : "dex", "value_type" : "value", },
};
for (int affix_id, map affix_info : affixs)
attrib_calc.impl().register_affix_info(affix_id, affix_info);
}
mixed callback_get_std_value(object ob, string attrib)
{
return (int) ob.get(attrib);
}
array callback_collect_affixs(object ob, string source)
{
array affixs = [];
switch (source)
{
case "equip" :
affixs.push_back([ 1000, 24 ]);
affixs.push_back([ 1001, 10 ]);
affixs.push_back([ 1002, 0.4 ]);
affixs.push_back([ 1003, 1.2 ]);
affixs.push_back([ 1004, 100 ]);
break;
case "status" :
affixs.push_back([ 1000, 24 ]);
affixs.push_back([ 1001, 10 ]);
affixs.push_back([ 1002, 0.4 ]);
affixs.push_back([ 1003, 1.2 ]);
affixs.push_back([ 1004, 200 ]);
break;
}
return affixs;
}
public object foo()
{
object ob = new_object(test_char, domain.create());
ob=>set("level", 30);
ob=>set("str", 100);
ob=>set("attack", 1000);
ob=>set("int", 100);
ob=>set("dex", 100);
ob=>refresh_attribs();
return ob;
}
import gs.lang.*;
import gs.util.*;
component pkg.attrib_calc.FAttribCalc;
map _dbase = {};
void create()
{
}
public void set(string k, mixed v)
{
_dbase.express_set(k, v);
}
public mixed get(string k)
{
return _dbase.express_query(k);
}
override void FAttribCalc.send_attribs()
{
printf("%O\n", query_attribs());
}