|
沙发

楼主 |
发表于 2020-11-29 11:40:19
|
只看该作者
软件注释
治疗阶段在程序中对应着calculate_healing函数,函数大致逻辑是枚举地图上所有单位,对每一个单位执行:
- 1、找出可以治疗/治愈他的医生集合;
- 2、他是不是病人,如果是执行第3步;
- 3、执行治疗/治愈。
为叙述方便下的定义
当前单位:治疗阶段要对地图上所有单位进行枚举,正枚举到的单位定义为当前单位。(只是枚举本阵营单位是不够的,治疗阶段不仅能治疗本阵营单位,还有友邻单位。)
A:affect_self和[affect_adjacent]是如何生效的?
Q:calculate_healing调用当前单位的unit.get_abilities("heals"),后者返回一个含有治疗信息和施加该治疗的医生位置的unit_ability_list对象。unit_ability_list可看作是以下这样一个结构:- [#0]<config, loc>
- [#1]<config, loc>
- .............
- [#N-1]<config, loc>
复制代码 注:
config:治疗信息,它一般就是在cfg文件定义的[heals]块。
loc:当前情况下,对应施加治疗的医生的格子。除去自医疗,这个格子不是当前单位产生出的可治疗到格子,而是可以治疗他的医生所在的格子。
calculate_healing每次进入都会对当前单位从正站着格子获得unit_ability_list结构,从而使用自单位的affect_selft和其它单位的[afect_adjacent]动态获得可得到可以治疗/治愈当前单位的医生集合。- unit_ability_list unit::get_abilities(const std::string& ability, const map_location& loc) const
- {
- unit_ability_list res;
- // loc是当前单位所在格子
- // 检查当前单位是否能自治疗,能就加入医生列表
- if (const config &abilities = cfg_.child("abilities"))
- {
- foreach (const config &i, abilities.child_range(ability)) {
- if (ability_active(ability, i, loc) &&
- ability_affects_self(ability, i, loc))
- res.cfgs.push_back(std::pair<const config *, map_location>(&i, loc));
- }
- }
- assert(units_ != NULL);
- map_location adjacent[6];
- get_adjacent_tiles(loc,adjacent);
- // 检查周围6个格子是否站有能治疗到当前单位的医生,有就加入医生列表
- // 注:这里不判断医生和当前单位阵营关系,calculate_healing会在后面进行判断
- for(int i = 0; i != 6; ++i) {
- const unit_map::const_iterator it = units_->find(adjacent[i]);
- if (it == units_->end() || it->second.incapacitated())
- continue;
- const config &adj_abilities = it->second.cfg_.child("abilities");
- if (!adj_abilities)
- continue;
- foreach (const config &j, adj_abilities.child_range(ability)) {
- if (unit_abilities::affects_side(j, teams_manager::get_teams(), side(), it->second.side()) &&
- it->second.ability_active(ability, j, adjacent[i]) &&
- ability_affects_adjacent(ability, j, i, loc))
- res.cfgs.push_back(std::pair<const config *, map_location>(&j, adjacent[i]));
- }
- }
- return res;
- }
复制代码 |
|