This document provides information for building the world of Akagoria.
Warning
|
This is a work in progress, it may change in the future |
1. Introduction
All the pieces described in Section 2, “Map” and in Section 3, “Data” are serialized into akagoria.dat
. The scripts described in Section 4, “Scripts” are not serialized and are part of the distributed package.
2. Map
The map of Akagoria is built with Tiled. It has \(2048 \times 2048\) tiles of size \(32 \times 32\).
Tip
|
It is recommanded to desactivate the minimap as it can slow down Tiled with a big map. |
2.1. Floors
The map is composed of several floors. The floors are numbered with integers, even floors are outside floors, and odd floors are insdide floors. Floor 0 is the floor at the sea level.
Inside | Outside | |
---|---|---|
First Basement |
-2 |
-1 |
Sea level |
0 |
1 |
Each floor is composed of a group of layers. The group has an integer property named floor
and fixed to the floor number. Each layer has a string property named kind
. Some layers provide graphics while other provide invisible data that is necessary for the game.
Name | Type | Value of kind |
---|---|---|
Ground |
Tile layer |
|
Low Tiles |
Tile layer |
|
Low Sprites |
Object layer |
|
High Tiles |
Tile layer |
|
High Sprites |
Object layer |
|
Graphics layers are rendered in the order of Table 2, “Graphics layers on each floor”. The hero and the NPCs are rendered between "Low Sprites" and "High Tiles".
Name | Type | Value of kind |
---|---|---|
Areas |
Object layer |
|
Locations |
Object layer |
|
Zones |
Object layer |
|
Collisions |
Object layer |
|
2.2. Graphics layers
2.2.1. Ground tile layer
This layer is used for the ground, so it must cover the whole floor.
This layer must use a single tileset, generally the Biomes
tileset.
2.2.2. Other tile layers
These layers are dedicated to large items that can not be represented with a single sprite.
Layer | Items |
---|---|
Low Tiles |
roads, rivers, unreachable areas, … |
High Tiles |
roofs, … |
2.2.3. Sprite layers
These layers contain all the small items that are spread all around the world. If the item has an upper part that can cover the hero, then it must go in the "High Sprites" layer. Otherwise, it goes in the "Low Sprites" layer.
Each sprite in the tileset can have a collision shape. It is defined in Tiled. The collision shape is represented by an ellipse object or a rectangle object or a polyline object.
2.3. Data layers
2.3.1. Areas layer
The "Areas" layer contains the name and position of the areas of the world. A location is represented by a point object or an ellipse object with no size.
2.3.2. Locations layer
The "Locations" layer contains special points of interest that can be used in the script (see Section 4.2, “Adventure
script”). A location is represented by a point object or an ellipse object with no size.
2.3.3. Zones layer
The "Zones" layer contains zones that can trigger an event in the script (see Section 4.2, “Adventure
script”). Each zone has a string property named message
that contains the message to be sent. Optionnally, it may have a string property named requirements
that contains a comma-separated list of requirements. The event is triggered only if the hero has all the given requirements.
A zone is represented by a rectangle object or a polygon object.
Message | Description |
---|---|
|
Move the hero one floor up (floor number is increased by 2) |
|
Move the hero one floor down (floor number is decreased by 2) |
2.3.4. Collisions layer
The "Collisions" layer contains the collision shapes that prevent the hero to go in unreachable areas.
A collision shape is represented by the a polyline object or a polygon object.
3. Data
In this section, all the files are plain JSON files.
3.1. Atlases
"SmallItems": {
"path": "sprites/items-s.png",
"width": 16, "height": 16
}
3.2. Characters
"Alice": {
"size": { "width": 60, "height": 55 },
"weapon": "SmallSword"
}
3.3. Items
"GemRuby": {
"description": "Ruby",
"trait": { "type": "rare" },
"shape": { "type": "circle", "radius": 10 },
"sprite": { "atlas": "SmallItems", "index": 0, "scale": 0.25 }
}
3.4. Weapons
"SmallSword": {
"description": "small sword",
"type": "melee",
"ATK": 10,
"REQ": 30,
"VP": 3,
"range": 1,
"angle": 90,
"cooldown": 2000
}
3.5. Dialogs
"Name": {
"type": "Simple",
"content": [
{ "speaker": "Alice", "words": "Hello!" },
{ "speaker": "Bob", "words": "Hey you!\nHow are you?" }
]
}
3.6. Quests
3.7. Notifications
"Welcome": {
"message": "Welcome to Akagoria!",
"duration": 3.0
}
4. Scripts
Scripts are written in the Wren language. They are loaded at startup. They contain classes with static functions only. The script must not store any state as they can not be serialized when saving the game.
4.1. World
script
This script handles the interactions with the state of the game.
4.1.1. Hero functions
World.moveHero(location)
move the hero to the specified location. The location
parameter is a valid location name on the map (see Section 2.3.2, “Locations layer”).
World.moveHeroDown()
and World.moveHeroUp()
are used when the messages MoveDown
and MoveUp
respectively are triggered (see Table 5, “Special messages”).
4.1.2. Notifications functions
World.postNotification(notification)
send a notification on the screen. The notification
parameter is a valid notification name (see Section 3.7, “Notifications”).
4.1.3. Requirements functions
World.addRequirement(requirement)
adds a requirement to the hero.
World.removeRequirement(requirement)
removes a requirement to the hero.
4.1.4. Characters functions
World.addCharacter(character, location)
adds a character in the specified location. The character
parameter is a valid character name (see Section 3.2, “Characters”). The location
parameter is a valid location name on the map (see Section 2.3.2, “Locations layer”).
World.setCharacterMood(character, mood)
set the character’s mood. The character
parameter is a valid character name that has been added with addCharacter
. The mood
parameter can be one of Mood.Quiet
or Mood.Angry
.
4.1.5. Items functions
World.addItem(item, location)
adds an item in the specified location. The item
parameter is a valid item name (see Section 3.3, “Items”). The location
parameter is a valid location name on the map (see Section 2.3.2, “Locations layer”).
World.addItemToInventory(item)
adds an item to the hero’s inventory. The item
parameter is a valid item name (see Section 3.3, “Items”).
4.1.6. Dialogs functions
World.startDialog(dialog)
starts a dialog. The dialog
parameter is a valid dialog name (see Section 3.5, “Dialogs”).
World.attachDialogToCharacter(dialog, character)
set the next dialog of a character. The dialog
parameter is a valid dialog name (see Section 3.5, “Dialogs”). The character
parameter is a valid character name (see Section 3.2, “Characters”).
4.2. Adventure
script
This script contains the callbacks that are called by the engine.
Adventure.initialize()
is called just after script loading. It is responsible for initializing all the other callbacks.
Adventure.start()
is called at the beginning of the game. It is responsible for setting the initial state of the game.
Adventure.onMessage(message)
is called when the hero hits a zone. The message
parameter is the message that is defined in the zone (see Section 2.3.3, “Zones layer”).
Adventure.onDialog(dialog)
is called at the end of a dialog. The dialog
parameter is the name of the dialog that just ended (see Section 3.5, “Dialogs”).