So, we left off last week at a point where an idle Oreon would perform an eating
task if hungry or go to sleep at night, given that no there were no pending
tasks in the Holding. This week I implemented the Oreon Training System which would make an idling Oreon take up training tasks based on one of its
“weak” attributes.
Oreon Training System
The training system assigns tasks based on different attributes of the Oreon, which upon finishing would improve the concerned attribute of the Oreon. This will later
be used to obtain different levels of working efficiency from different Oreons based on their attributes, for eg: an Oreon with a higher strength would complete a building task
faster than a ‘weaker’ Oreon.
Adding the training bit to the Oreon required a new BT node needs_training
to be implemented. This node checks for various attributes and assigns task, given that the required
building has been built otherwise, sends a notification to the player requesting them to build it.
The current advancedTaskAcquiring
behavior tree for the Oreon(shown below) defines a priority for the tasks to be taken up. As explained in the previous post, the selector
prioritises hunger
over training.
{
"selector" : [
"needs_food",
"needs_training",
"needs_sleep",
"...",
"..."
]
}
Digressing from the timeline
Since the training task addition to the Oreon behavior proved to be plain sailing and I completed them early on in the week, I decided to implement some features to improve the gameplay experience.
Delayed Notifications
The notifications were being sent to the player when a required for training
or the Diner for eating
for tasks was not found in the village. Since the Oreon looking for these buildings triggered these notifications the player would recieve
one every tick when the behavior tree was run and the concerned node was hit. In order to stop the Oreons from “nagging” the player for missing buildings in the village I implemented a DelayedNotification system, which would check for
the difference between the game time when last notification was sent and the current game time, if this difference is greater than the maxDelay
variable defined, the notification will be sent. This would not only prevent the clutter in a player’s chat box
but also inform the player of a required building in a timely manner.
WorldlyTooltip Integration
The WorldlyTooltip module enables an UI overlay which informs the player about the entity in they are currently pointing at. More information from the various components attached to the entity can also
be added to this tooltip. In order to get the tooltip to work for the Oreons in the village, besides the discernible requirements like declaring a dependency on the WorldlyTooltip, I implemented a TooltipSystem in
MOO. Whenever a player points at an Oreon the GetTooltipItem
event sent is received by this system and various lines related to the Oreon from its OreonAttributesComponent
is added to the tooltip. So far it was fairly easy to get a tooltip specialized
for the Oreon to show up, but things got a bit tricky since the name of the Oreon and an icon for it were not dispayed correctly. So, I looked at the WildAnimals module for some inspiration since it uses the tooltip for the Deer. Similar to the WildAnimalComponent
I attached a OreonTooltipComponent
to every Oreon and voila behold the tooltip for an Oreon.
The Oreon tooltip component defines the two required fields for addition in the tooltip an icon for the Oreon and its name, I used the two events sent by the WorldlyTooltip GetTooltipIcon
and GetTooltipName
to set the two fields to be displayed.
public class OreonTooltipComponent implements Component {
public TextureRegionAsset<?> icon;
public String name;
}