-1: 表示永续,其持有者不会因为时间的流逝而移除这类buff;
0: 表示即时buff,其持有者在当前step结束后立即移除这类buff;
正整数: 表示持有者自动丢弃buff的时间步,其持有者在经过这段step数之后,会移除这类buff(与0在语义上是连续的)。
具体实例如下表所示:
BuffName | Enhance | Duration | Repeat | BuffWorkFunction |
---|---|---|---|---|
Night | Temperature:-5 | -1 | 0 | 1 |
Metabolic | Hunger:1;Thirst:1 | -1 | 1 | 2;50;1;10;1 |
equip_ColdStone | Temperature:-10 | -1 | 0 | 1 |
equip_Torch | NightVision:8 | -1 | 0 | 1 |
equip_Bow | ATK:20;AttackDistance:10 | -1 | 0 | 1 |
equip_Spear | ATK:30;AttackDistance:2 | -1 | 0 | 1 |
equip_WarmStone | Temperature:10 | -1 | 0 | 1 |
equip_LeatherArmor | DEF:10 | -1 | 0 | 1 |
equip_WoodArmor | DEF:40 | -1 | 0 | 1 |
consume_Meat | HP:10;Hunger:20 | 0 | 0 | 0 |
consume_Water | HP:10;Thirst:20 | 0 | 0 | 0 |
consume_Apple | HP:20;Hunger:15;Thirst:10 | 0 | 0 | 0 |
consume_Ice | Temperature:-2;Thirst:3 | 5 | 1 | 0 |
weather_Sunny | Vision:1 | -1 | 0 | 1 |
weather_Rainy | Vision:-1;Temperature:-10 | -1 | 0 | 1 |
weather_Snowy | Vision:-2;Temperature:-20 | -1 | 0 | 1 |
weather_Hot | Temperature:20 | -1 | 0 | 1 |
landform_Desert | Speed:-1 | 2 | 0 | 1 |
landform_Grassland | Vision:1 | -1 | 0 | 1 |
landform_Forest | Speed:-1;Vision:-1 | -1 | 0 | 1 |
编辑上述表格,如在表格中增加名为consume_Meat的buff,同时定义相关的属性。若想设计一种新的Buff机制,需要用户自行定义BuffWorkFunction函数。
一般的Buff添加示例如下
添加一种立即生效的consume_buff
假设需要引入一种新的食物FoodA,消耗后立即获得3点HP和5点饥渴度:
BuffName | Enhance | Duration | Repeat | BuffWorkFunction |
---|---|---|---|---|
consume_FoodA | HP:3;Thirst:5 | 0 | 0 | 0 |
Duration,Repeat,BuffWorkFunction在这种情形下都设为0。
添加一种持续生效的consume_buff
假设需要引入一种新的食物foodB,消耗后在5个step内,每个step结束时增加3点HP:
BuffName | Enhance | Duration | Repeat | BuffWorkFunction |
---|---|---|---|---|
consume_FoodB | HP:3 | 5 | 1 | 0 |
其中,Duration是持续发挥作用的step数,Repeat设置为1,BuffWorkFunction为0。
添加一种equip_buff
假设需要引入一种新的装备,名为Hammer,装备后攻击力上升20,卸下时攻击力下降20:
BuffName | Enhance | Duration | Repeat | BuffWorkFunction |
---|---|---|---|---|
equip_Hammer | ATK:20 | -1 | 0 | 1 |
一般来说,equip buff的Duration,Repeat,BuffWorkFunction依次为-1,0,1.
定义了四季对应天气的比例,天气A在一种Season B下的出现率=A在B的比重/总比重。
字段 | 类型 | 含义 | 例子 |
---|---|---|---|
Season | string | season的名称。 | spring |
Hot | int | 热天在该season的比重 | 100 |
Sunny | int | 晴天在该season的比重 | 1 |
Rainy | int | 雨天在该season的比重 | 1 |
Snowy | int | 雪天在该season的比重 | 1 |
配置示例见下表:
Season | Hot | Sunny | Rainy | Snowy |
---|---|---|---|---|
Spring | 100 | 1 | 1 | 1 |
Summer | 2 | 1 | 2 | 0 |
Autumn | 0 | 1 | 0 | 1 |
Winter | 0 | 1 | 0 | 2 |
根据每个季节所需要的天气占比,更改表中对应权重即可。
preset定义了各类object(agent,being,item,resource)在地图中的分布。若0_general.csv中定义的UsePreset为0,则不启用preset。
若地图大小为n*n,则表格大小为n*n,第i行j列第格子对应的是地图坐标(i,j)上的【地形id(int)-object名称(string)-数量(int)】。其中地形id要小于总地形数,object名称需要与2_agent.csv,3_being.csv,4_item.csv,5_resource.csv中一致,只有item的数量才可大于1。
若地图大小为4*4,可以通过如下形式定义地图:
0-Pig | 0 | 0 | 0 |
---|---|---|---|
0 | 0-PYS | 0 | 0-Pool |
0-Tree | 0-Pig | 0-Torch-3 | 0 |
0 | 0 | 0-Pool | 0 |
如上表所示,0-Torch-3代表该坐标地形id为0,有3个Torch;当只有地形id时代表该坐标上没有object,如0代表该坐标地形id为0,没有物品;没有数量时默认数量为1,如0-PYS代表该坐标地形id为0,有1个PYS。
用户可以根据需要按上述方式编辑preset表格,定义所需地图。
game_done.json是定义了游戏的结束条件,当agent满足game_done.json中的任意一条时,视为游戏结束。
默认配置和具体含义如下,
{
#结束位置,当agent到达点(-1,-1)或点(23,25),视为游戏结束
"position": [
[-1, -1],
[23, 25]
],
#结束属性,当agent的属性中Hunger==0或者Thirst==0,视为游戏结束
"attribute": {
"Hunger": 0,
"Thirst": 0
},
#结束物品,当agent的backpack中Meat==50或者Branch==1000,视为游戏结束
"backpack": {
"Meat": 50,
"Branch": 1000
},
#结束装备,当agent的equipment中具有Bow或者WoodArmor,视为游戏结束
"equipment": [
"Bow",
"WoodArmor"
]
}
position为一个由坐标[x(int),y(int)]组成的list,删除其中的某一个[x,y]可将点(x,y)从结束位置中移除;在position list中增加[x,y],可将点(x,y)视为结束位置。
attribute为一个由[属性名(string):值(int)]构成的dict,增加/删除/修改其中的[属性名(string):值(int)],可以变更由属性决定的结束条件,注意属性名要在2_agent.csv中给出定义。
attribute为一个由[物品名(string):值(int)]构成的dict,增加/删除/修改其中的[物品名(string):值(int)],可以变更由背包物品决定的结束条件,注意物品名要与4_item.csv中一致。
equipment为一个由装备名(string)组成的list,删除其中的某一个装备名E可将E不再视为结束装备;在equipment list中增加装备名E,可将装备E视为结束装备。
score.json文件定义了执行各个动作所能得到的reward。在环境中,reward是根据agent执行动作后返回的结果计算出来的,每一个动作获得的reward都对应一个dict;除此之外,agent的死亡判定、目标点价值、属性增益也会计算出reward,叠加到动作对应的reward中来构成最终的reward。
由于Idle指agent不进行任何操作,只会返回success(agent死亡时返回fail),因此我们如下配置,
"Idle": {
"default": 0.0
},
其中"default"代表默认值,若想给agent的不作为一定惩罚,可以将其设为一个合理的负值。
Attack为一个dict,内容为[动作结果(string):reward(float)]。
agent在进行Attack操作后,会得到fail/object_hit/object_kill三种结果,其中object应该与3_being.csv中所定义的一致,
"Attack": {
"fail": -1.0,
"default_hit": 0.0,
"default_kill": 0.0,
"Pig_hit": 0.0,
"Pig_kill": 0.0
},
上面为Attack dict的配置示例,除了默认的fail,default_hit,default_kill所对应的reward值之外,还定义了Pig_hit和Pig_kill的reward,这使得:
杀死Pig获得Pig_kill对应的reward
在Attack dict中根据需要进行修改/增加/删除,则可修改Attack动作所返回的reward。
Collect为一个dict,内容为[动作对象(string):reward(float)]。
agent在进行Collect操作后,会得到fail/object两种结果,其中object应该与3_being.csv和5_resource.csv中所定义的一致,
"Collect": {
"fail": -1.0,
"default": 0.0,
"Tree": 0.0
},
上面为Collect dict的配置示例,除了默认的fail,default所对应的reward值之外,还定义了Tree的reward,这使得:
从Tree上采集物品获得Tree对应的reward
在Collect dict中根据需要进行修改/增加/删除,则可修改Collect动作所返回的reward。
Discard为一个dict,内容为[动作对象(string):reward(float)]。
agent在进行Discard操作后,会得到fail/object两种结果,其中object应该与4_item.csv中所定义的一致,
"Discard": {
"fail": -1.0,
"default": 0.0,
"Meat": 0.0
},
上面为Discard dict的配置示例,除了默认的fail,default所对应的reward值之外,还定义了Meat的reward,这使得:
丢弃Meat获得Meat对应的reward
在Discard dict中根据需要进行修改/增加/删除,则可修改Discard动作所返回的reward。
Move为一个dict,只对应两个结果fail/default,配置如下,用户可以根据需要自行修改数值。
"Move": {
"fail": -1.0,
"default": 0.0
},
Synthesize为一个dict,内容为[动作对象(string):reward(float)]。
agent在进行Synthesize操作后,会得到fail/object两种结果,其中object应该与4_item.csv中所定义的一致,
"Synthesize": {
"fail": -1.0,
"default": 0.0,
"Torch": 0.0
},
上面为Synthesize dict的配置示例,除了默认的fail,default所对应的reward值之外,还定义了Torch的reward,这使得:
合成Torch获得Torch对应的reward
在Synthesize dict中根据需要进行修改/增加/删除,则可修改Synthesize动作所返回的reward。
Pickup为一个dict,内容为[动作对象(string):reward(float)]。
agent在进行Pickup操作后,会得到fail/object两种结果,其中object应该与4_item.csv中所定义的一致,
"Pickup": {
"fail": -1.0,
"default": 0.0,
"Meat": 0.0
},
上面为Pickup dict的配置示例,除了默认的fail,default所对应的reward值之外,还定义了Meat的reward,这使得:
拣取Meat获得Meat对应的reward
在Pickup dict中根据需要进行修改/增加/删除,则可修改Pickup动作所返回的reward。
Equip为一个dict,内容为[动作结果(string):reward(float)]。
agent在进行Equip操作后,会得到fail/object_equip/object_undress三种结果,其中object应该与4_item.csv中所定义的一致,
"Equip": {
"fail": -1.0,
"default_equip": 0.0,
"default_undress": 0.0,
"Torch_equip": 0.0,
"Torch_undress": 0.0
},
上面为Equip dict的配置示例,除了默认的fail,default_equip,default_undress所对应的reward值之外,还定义了Torch_equip和Torch_undress的reward,这使得:
卸下Torch获得Torch_undress对应的reward
在Equip dict中根据需要进行修改/增加/删除,则可修改Equip动作所返回的reward。
Consume为一个dict,内容为[动作对象(string):reward(float)]。
agent在进行Consume操作后,会得到fail/object两种结果,其中object应该与4_item.csv中所定义的一致,
"Consume": {
"fail": -1.0,
"default": 0.0,
"Water": 0.1,
"Meat": 0.1
},
上面为Consume dict的配置示例,除了默认的fail,default所对应的reward值之外,还定义了Meat,Water的reward,这使得:
消耗Water获得Water对应的reward
在Consume dict中根据需要进行修改/增加/删除,则可修改Consume动作所返回的reward。
对该reward的计算是独立的,每个step后都会计算并叠加到reward当中。
Attribute是一个dict,内容格式为[属性名(string):reward(int)],它根据agent自身attribute的变化来计算reward。其中属性名需要与2_agent.csv中所定义的一致。
属性增益所带来的reward计算公式如下, \(r=\Sigma_{i\epsilon I} Attribute['i']\times\Delta i+\Sigma_{j\epsilon J} Attribute['default']\times\Delta j\) 其中I是在Attribute dict的key中包含的属性名集合,J是没有在Attribute dict的key中出现的属性名集合。
示例配置如下,
"Attribute":{
"default": 0.0,
"ATK": 1.0,
"HP": 2.0,
"DEF": 0.5
},
在Attribute dict中根据需要进行修改/增加/删除,则可修改属性变化所造成的reward。
对该reward的计算是独立的,每个step后都会计算并叠加到reward当中。
agent在死亡时获得的reward,一般为负数,示例如下
"Dead": -10,
对该reward的计算是独立的,每个step后都会计算并叠加到reward当中。
agent在达到特定目标点时获得的reward,如,若想让agent在到达点(0,0)获得-1的reward,在到达点(9,9)获得1的reward可如下配置,
"ScorePoint": {
"0-0" : -1,
"9-9" : 1
}
用户想要修改ScorePoint时,只需在"ScorePoint"字典内增加或删除["x坐标(int)-y坐标(int)":reward(float)]即可。
{
"Idle": {
"default": 0.0
},
"Attack": {
"fail": -1.0,
"default_hit": 0.0,
"default_kill": 0.0,
"Pig_hit": 0.0,
"Pig_kill": 0.0
},
"Collect": {
"fail": -1.0,
"default": 0.0,
"Tree": 0.0
},
"Discard": {
"fail": -1.0,
"default": 0.0,
"Meat": 0.0
},
"Move": {
"fail": -1.0,
"default": 0.0
},
"Synthesize": {
"fail": -1.0,
"default": 0.0,
"Torch": 0.0
},
"Pickup": {
"fail": -1.0,
"default": 0.0,
"Meat": 0.0
},
"Equip": {
"fail": -1.0,
"default_equip": 0.0,
"default_undress": 0.0,
"Torch_equip": 0.0,
"Torch_undress": 0.0
},
"Consume": {
"fail": -1.0,
"default": 0.0,
"Water": 0.1,
"Meat": 0.1
},
"Attribute":{
"default": 0.0,
"ATK": 1.0,
"HP": 2.0,
"DEF": 0.5
},
"Dead": -10,
"ScorePoint": {
"0-0" : -1,
"9-9" : 1
}
}