跳到主要内容

attrib_calc

简介

主要目的是为特定对象计算属性最终值提供一个常见的处理流程

常见的计算流程如下:

  1. 收集指定来源的属性词条
  2. 属性词条转换为标准的属性提升数值
  3. 合并属性提升数值
  4. 计算最终值

整个处理流程中,需要由使用者提供定制的计算模块对象(未提供时使用默认的计算模块对象)

组件接口

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());
}