幸运的是,学期刚开始的我似乎是干劲十足(其实主要是因为无事可做),于是Rusty Town
的第二篇开发日志也很快写了出来,本次日志主要实现了Character
类,即角色部分,以及角色间人际关系的实现。完成这两个部分后,我们将得以获取并修改角色状态,以及维持一个不断变动的人际关系表来影响角色可能做出的决策。当然,只实现这两个部分是远远不够的,毕竟Character
也即智能体在这个项目中始终处于核心地位,而另外的部分也将会在之后的日志中逐渐完善。
话不多说,我们直接开始(。・ω・。)
很自然的是,角色需要用一个类来集成与其相关的属性和信息。一旦完成了角色类,再结合由我们之前实现的地点和时间组成的环境,以及之后我们将要实现的活动,就组成了接下来这个简单又重要的循环:
这之中负责改变角色与环境状态的其实还是活动,因此理论上说角色类只需要负责记录与角色相关的信息即可。
来看看Character
类的实现:
Rustpub struct CharacterStatus {
pub location: String,
pub gold: u32,
pub energy: u8,
pub health: u8,
pub hunger: u8,
pub mood: u8,
relations: HashMap<String, (Relationship, i8)>,
}
pub struct Character {
name: String,
gender: String,
age: u8,
identity: String,
residence: String,
status: CharacterStatus,
}
其实细心的同学在上一篇日志中应该也注意到了,我刻意地将属性和状态这两个词区分开来,在我的理解中,属性指的是那些不会变动或至少不会经常变动的信息,而状态指的是那些随着时间推进不断更新变化的信息。因此姓名、性别、年龄(我们的项目暂时不考虑年龄的变化)、身份、居住地这些被视为属性,而所在地、金币数、精力、健康、饥饿度、心情这些则是状态。状态可读可写,而属性只可读。
将属性和状态分离还有一个好处。与地点类似,角色的属性和状态也需要从文件中读取。但属性可以提前设定好,但每个角色的状态在每次开局都应该是一成不变的吗?显然不是如此,存储属性和状态的文件应该分离开,设定属性的文件只需要一份就够了,但设定起始状态的文件却可以有很多份。另外,本项目在之后也将不可避免地涉及到存档的问题,只需要将当时的状态保存为文件,之后再次运行时读取为起始状态即可。
刚刚我们一直没有解释relations
的由来,其实表示的就是该角色的人际关系表,类型是键为人名,值为关系、好感度二元组构成的哈希表。要注意到本项目的人际关系其实是双向的,不同于许多游戏的好感度实际上表示的是其他角色对主角的好感度(毕竟谁也不知道你到底更喜欢哪个角色),角色A的relations
记录的是A对其他角色B、C、D的好感度与关系,而B对A的好感度和关系则记录在B的relations
中。每个角色只知道自己对其他人的看法,而这也会影响角色做出的决策,而其他人怎么看待自己却不得而知,如此的设定显然更符合现实中的人际关系。(同时也能轻松复现暗恋一类的扭曲场景)
关于人际关系究竟该怎么实现我也纠结了很久(刚刚还推倒重来了一次)。一开始我想的是用一个单例来集成所有人之间的人际关系,后来想想这样意味着要用键为两个人名的哈希表,实在是有些丑陋。而且单例模式个人也不是太喜欢,恰好这里的人际关系是双向的,对统一调配的需求也较低,不如就放在各自的角色类中。如此一来人际关系也将作为一种状态,需要设定初始值,以及在存档时保存,而这也是符合直觉的。
接下来,我们就可以给锈镇中的居民写json设定文件啦。如上所述,设定文件需要由属性文件以及初始状态文件两部分组成。
json// resources/characters/Alice.json
{
"name": "Alice",
"gender": "female",
"age": 25,
"identity": "shopkeeper",
"residence": "houses 101"
}
json// resources/characters/initial_status/Alice.json
{
"location": "houses",
"gold": 200,
"energy": 100,
"health": 80,
"hunger": 40,
"mood": 50,
"relations": {
"Bob": ["Girlfriend", 80],
"Daisy": ["Friend", 50]
}
}
像这样我已经在锈镇中添加了一共7个角色,虽然目前看上去有些少,但好消息是后续可以即插即用地添加更多的角色。虽然这些设定文件只有寥寥几行,但相信在不久的将来会演绎出丰富多彩的故事的。