Configuring Entities - UQdeco2800/2022-studio-2 GitHub Wiki

Introduction

Entities can be configured using config files with pre-defined properties. This makes gameplay testing easier as the gameplay experience can be tweaked without having to edit code.

The core idea is that the FileLoader reads JSON config files which store entity properties such as attack: 10 or health: 100 and transforms them into config classes. The properties can then be read from these config classes and passed into the entity creation methods in Entity Factories.

Key Components

  • File Loader - :FileLoader.
  • Entity Factory - Factory for creating similar types of entities: e.g. PlayerFactory, NPCFactory.
  • Group Config Class - Defines the config classes for groups of entities: e.g. NPCConfigs.
  • Config Class - Defines a config class with default properties: e.g. PlayerConfig, BaseEntityConfig, GhostKingConfig, etc.
  • Config File - JSON file with values for properties that are defined in the corresponding config class or group config class, e.g. NPCs.json, player.json.

Usage

Example: Single entity

In this example, we're going to look at how to use properties stored in the player's config file.

Config File - "configs/player.json":

{
  "health": 100,
  "baseAttack": 10
  "gold": 50,
  "favouriteColour": "peach"
}

Config Class:

public class PlayerConfig {
  public int health = 1;
  public int baseAttack = 0;
  public int gold = 1;
  public String favouriteColour = "none";
}

Load config using the FileLoader:

private static final PlayerConfig stats = FileLoader.loadClass(PlayerConfig.class, "configs/player.json");

int health = stats.health;
int baseAttack = stats.baseAttack;
int gold = stats.gold;
String favouriteColour = stats.favouriteColour;

Example: Multiple entities

When we have multiple entities with similar properties, it is useful to be able to store all of their configs in a single JSON file. The following is an example of this for multiple NPC entities.

Config File - "configs/NPCs.json":

{
  "ghost": {
    "health": 40,
    "baseAttack": 10
  },
  "ghostKing": {
    "health": 100,
    "baseAttack": 25
    "spookyFactor": 7
  }
}

Group Config Class:

public class NPCConfigs {
  public GhostConfigghost = new GhostConfig();
  public GhostKingConfig ghostKing = new GhostKingConfig();
}

Config Classes:

public class GhostConfig {
  public int health = 1;
  public int baseAttack = 0;
}

public class GhostKingConfig extends GhostConfig {
  public int spookyFactor = 0;
}

Load configs using the FileLoader:

private static final NPCConfigs configs = FileLoader.loadClass(NPCConfigs.class, "configs/NPCs.json");

GhostConfig ghostConfig = configs.ghost;
GhostKingConfig ghostKingConfig = configs.ghostKing;

int ghostHealth = ghostConfig .health;
int ghostBaseAttack = ghostConfig .baseAttack;

int ghostKingHealth = ghostKingConfig .health;
int ghostKingBaseAttack = ghostKingConfig .baseAttack;
int ghostKingSpookyFactor = ghostKingConfig.spookyFactor;