Skip to content

Configuring Entities

polyrain edited this page Aug 1, 2021 · 1 revision

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;

Table of Contents

Home

Introduction

Main Menu

Main Game Screen

Gameplay

Player Movement

Character Animations

Enemy Monster Design and Animations

Game basic functionalities

User Testing

GitHub Wiki Tutorial

Game Engine

Getting Started

Documentation

Entities and Components

Service Locator

Loading Resources

Logging

Unit Testing

Debug Terminal

Input Handling

UI

Animations

Audio

AI

Physics

Game Screens and Areas

Terrain

Concurrency & Threading

Settings

Troubleshooting

MacOS Setup Guide

Clone this wiki locally