Specification

The engine and the editor expects some files, and that they are organized in the following manner.

Here is how the file tree should be organized

game_project_name
├── audio
│   └── music
├── descriptors
│   ├── charaset
│   │   └── charaset1.json
│   ├── charas.json
│   ├── feedback.json
│   ├── hms.json
│   ├── init.json
│   ├── items.json
│   └── levels
│       ├── ahouse.map.json
│       └── house.pal.json
|        ...
├── icon.png
├── img
│   ├── bgimg1.png
│   ├── charaset.png
│   ├── faceset.png
│   ├── monsterset.png
│   ├── pictures
│   │   └── example.png
|   |    ...
│   ├── printer.png
│   ├── sys
│   │   ├── controllers.png
│   │   ├── keys0.png
│   │   ├── keysexplainer.png
│   │   └── pckeys.png
│   ├── tile.png
│   └── title.png
└── index.html
  • audio (folder) - contains audio files used by the game.

    • music (folder) - this folder contains the music. A music file can be either .mp3, .ogg or .wav. You can add music files with the same name and different extensions to maximize browser compatibility. When downloading, the engine will prefer ogg first (if the browser supports it), then mp3 and later wav.
  • descriptors (folder) - contains all json files, and folders containing json files.

    • charaset (folder) - this folder contains the different jsons that describes the animations you use with Charas.

    OBS: right now only a single file that has to be named charaset1.json is possible. Soon this won’t be a requirement.

    • charas.json - things that you can place in any the map, they can move and trigger actions, and usually represent the non playable characters you interact in the game.
    • feedback.json - deals with the engine feedback, right now only colision and the sound when outputing text. This should be moved inside the engine soon.
    • hms.json - Heroes, Monsters and Skills, this file describes all the heroes that you can add to the party, all the monsters you can fight against, and the skills that they can have.
    • init.json - where does the game starts, who is in the party, and some things that didn’t fit anywhere else.
    • items.json - has the description of the items, how do they work, what they are.
    • scriptedbattles.json - has the description of a scripted battle, what monsters are involved and how each script is triggered.
    • levels (folder) - this folder contains levels (.map.json files) and possible palettes (.pal.json files) to use when designing levels.
  • img (folder) - this folder contains all the image files in png format.

    • pictures (folder) - you can show a picture using action, this folder contains possible pictures in png format.
  • index.html - this is the engine. It should be placed at the root of the game project folder.

palette files - .pal.json

A palette specifies how an image is going to be sliced in tiles to be available for drawing maps. An image can be like below - note, the first 32x32 pixel tile should always be empty.

This file holds a palette of tiles, it’s used to “paint” maps, each tile in a map layer (1,2 and 4) will be translated to a cropped piece of 32 pixels in width and height from the image.

{
    "tilesAnimated":
    {
        "8":
             [[  0, 2],
              [  1, 2],
              [  2, 2],
              [  3, 2]] },
    "tiles":
    {   "1":  [  1, 0],
        "2":  [  2, 0],
        "3":  [  3, 0],
        "4":  [  0, 1],
        "5":  [  1, 1],
        "6":  [  2, 1],
        "7":  [  3, 1],
        "8":  [  1, 2]  },
    "tileImage": "img/tile.png"
}

the image above represents the palette

  • tileImage : the relative path to a png image that is used by the palette.
  • tiles : this contains a dictionary of numbers, and each number points to a 32x32 pixel piece of the image pointed by tileImage.
    • tiles: "1" : [X,Y], "2" : [X,Y], ...
  • tilesAnimated : this contains a dictionary of numbers, and each number points to a list that points a different 32x32 pixel piece of the image pointed by tileImage, describing an animated tile.

map files - .map.json

Below is an example file with each field that is expected to be available. Each numeric 2d matrix is of the same size, which is defined as map width and height. The matrix is described as a list (y dimension) of lists (x dimension). In a 4 x 3 fictious map, this matrix would be something like:

"layer:"
    [[ 0, 0, 0, 0],
     [ 0, 0, 0, 0],
     [ 0, 0, 0, 0]]

You can think of a map as having for layers, the first layer, named layer1 is drawn first, and second the layer2 is drawn next, the player and charas are drawn in the third layer where the colision takes place to, and on top the fourth layer, layer4, is drawn.

{ "Level":
    { "charas":  [],
      "colision":
            [[]],
      "events":
            [[]],
      "eventsActions":
          { "1":
              [["ACTIONNAME","PARAM1;PARAM2;..."],
               ["ACTIONNAME","PARAM1;PARAM2;..."]],
            "2":
              [["ACTIONNAME","PARAM1;PARAM2;..."]] },
      "eventsType":
          { "1":  [  1,  0],
            "2":  [  1,  0]},
      "layer1":
          [[]],
      "layer2":
          [[]],
      "layer4":
          [[]],
      "levelName": "very_simple_map",
      "tileImage": "img/tile.png",
      "tiles":
          { "1":  [ 11, 12],
            "2":  [  1,  1] },
      "tilesAnimated":
          { }
    }
}

Each .map.json file has the keywork Level at top-level.

  • charas : a list of the charas that should be placed in the map and their x and y position.
  • "charas": [["CHARANAME",X,Y],["CHARANAME",X,Y],...] .
  • Example: "charas": [["bear",12,7]]
  • colision : a 2d numeric matrix, where 0 represents floor and 1 represents walls.
  • events : a 2d numeric matrix, where 0 represents no event, and any other number represents an event.
  • eventsActions : a dictionary where each event is represented by a number and each number contains a list of actions and parameters.
  • "eventsActions": { "1":[["ACTIONNAME","PARAM1"], ["ACTIONNAME","PARAM1;PARAM2"]] }
  • eventsType : a dictionary where each event is represented by a number and each number contains an array representing when the event is triggered.
    • possible triggers are:
      • onclick : means the event is triggered when the player is adjacent to the tile, and presses the interaction button.
        • this is represented by the list [1,0]
      • ontouch : means the event is triggered when the player character is on the same tile.
        • this is represented by the list [0,1]
      • ideally a simple list that could contain the onclick and ontouch words would be clearer.
  • layer1 : a 2d numeric matrix, where 0 represents a clear tile, and any other number represents a tile that is going to be drawn.
  • layer2 : a 2d numeric matrix, where 0 represents a clear tile, and any other number represents a tile that is going to be drawn.
  • layer4 : a 2d numeric matrix, where 0 represents a clear tile, and any other number represents a tile that is going to be drawn on top of the first, second and third layer.
  • levelName : the name of the map.
  • Right now this needs to be the same as the map file name without the .map.json .
  • tileImage : the relative path to a png image that is used by the palette.
  • tiles : this contains a dictionary of numbers, and each number points to a 32x32 pixel piece of the image pointed by tileImage.
    • tiles: "1" : [X,Y], "2" : [X,Y], ...
  • tilesAnimated : this contains a dictionary of numbers, and each number points to a list that points a different 32x32 pixel piece of the image pointed by tileImage, describing an animated tile.

init.json

The init.json file is the first json file that the game engine should read. It contains information on what’s needed to successfully start the engine, being the most notable, the initial information about the player chara - the chara the person playing the game controls and uses to interact with the maps.

It’s important to notice that javascript can’t look for any files in a directory in a webserver from the client side, it must previously know the full name of the files. So some minimal information about the files to expect are available here too.

Below is an example of a init.json file. Note that the engine will look for this exact name and case matters, so the file must be named init.json, and placed inside the game_root_folder/descriptors/ folder.

{
    "CharasFileList": {
        "charas1": "charas1.json"
    },
    "CharasetFileList": {
        "charaset1": "charaset1.json"
    },
    "MusicList":{
        "villa" : {"ogg":"villa.ogg","mp3":"villa.mp3"},
        "battle_1": {"ogg":"battle_1.ogg","mp3":"battle_1.mp3"},
        "battle_win": {"ogg":"battle_win.ogg","mp3":"battle_win.mp3"},
        "opening": {"ogg": "opening.ogg","mp3": "opening.mp3"}
    },
    "HMSFile": "hms.json",
    "LevelsList": {
        "ahouse": "ahouse.map.json"
    },
    "PictureList":["test"]
    ,
    "Player": {
        "charaSet": "person",
        "facing": "down",
        "initPosX": 224,
        "initPosY": 224,
        "party": [
            "hero"
        ]
    },
    "World": {
        "initLevel": "ahouse"
        "initMusic": "opening",
        "battleMusic": "battle_1",
        "battleVictoryMusic": "battle_win",
        "initActions": [["playMusic","villa"]]
    },
    "itemsFile": "items.json"
}

*note:* all path in this file is relative to the root of the descriptors folder.

  • CharasFileList : points to a list of chara files, where each key is the name of the file minus it’s extension.
  • CharasetFileList : points to a list of charaset files, where each key is the name of the file minus it’s extension.
  • MusicList : contains the music names and the file for each extension available in audio/music folder.
  • HMSFile : points to where to look for the Heroes Monsters Skills file and it’s name. It’s advised to keep this value as hms.json to avoid confusion.
  • LevelsList : points to a list of map (.map.json) files, where each key is the name of the file minus it’s extension.
  • PictureList : points to a list of pictures, minus extension. These files should be png files, placed in the game_root_folder/img/pictures/ for the engine to find these files. This is the only path not relative to the descriptors folder in the init.json file.
  • itemsFile : “items.json”
  • Player : describes the initial states of the player chara when the engine is the first time in the map state.
    • charaSet : the name of the charaset used by the player chara.
    • facing : which direction the player chara will be facing, can be either up,down,left or right.
    • initPosX : at what x (horizontal) position in the map should the player chara start.
    • initPosY : at what y (vertical) position in the map should the player chara start.
    • party : a list containing the key names of the Heroes in the starting party - this only matters for battle.
  • World: describes the initial states of the environment.
    • initLevel : the key name of the level the player chara begins. This is the first map you see after the start screen.
    • initMusic : the name of the music in the opening screen.
    • battleMusic : the name of the default music to play in battle if no music is specified.
    • battleVictoryMusic : the name of the default music to play when the battle ends in victory if no music is specified.
    • initActions : in the opening screen, when start is clicked, these actions should be executed.

items.json

The file that describes items, all items here can be added to the player inventory by using the action addItem(‘ITEMKEYNAME’) or removed by using the action dropItem(‘ITEMKEYNAME’). When referencing an item, the actions will always use ITEMKEYNAME, which must be composed of only alphanumeric characters and no spaces.

{
"Items": {
    "ITEMKEYNAME1":{
                "name": null,
                "equipable": false,
                "statMod": null,
                "usable": false,
                "action": null,
                "effect": null,
                "reusable": false,
                "unique": false,
                "description": false,
                "category": null,
                "icon": null
             },
    "ITEMKEYNAME2":{
            ...
            }
            ...
    }
}

The file must have a top level statement Items, which will start a dictionary containing the items. Items are referenced by their key names. You can define how many different items as you like.

Each item then can have one of the following fields defined along. Above are the default values for all fields. All fields of an item is optional, so you can only include what is necessary to describe that item.

  • name : if this field is not provided, the engine will fill this field with the value of the ITEMKEYNAME instead. Whenever the name of the item is shown to the player in the game interface, it will be taken from here.

  • equipable : if this field is provided and has the value true, this item will have an option to equip it, and a property equiped=false. If you select equip,
    the value of equiped will be set to true. Also, if the item has a statMod, it will be applied. An item should not be equipable and usable at the same time.
  • statMod : provides how the item modify the stats of the Hero who equips it. If this field is provided, it must contain the dict below:

    • {"st": INT,  "dx": INT,  "iq": INT }
    • st : how this item modify the Hero st attribute.
    • dx : how this item modify the Hero dx attribute.
    • iq : how this item modify the Hero iq attribute.
    • You only need to specify the attributes that are modified. For example, {"st":1} is a valid value of statMod.
  • usable : if this field is provided and is true, the person playing will have see an option in the inventory to use this item. When the person selects this option, three things happen: applies the item effect if available, then it’s actions are placed in the engine buffer and at last, if the item doesn’t have the property reusable set to true, it’s dropped.

  • effect : an effect is a useful way of describing simple usable items. If it is specified, it must accompany the dictionary below:

    • {"atr":st/iq/dx/null,"basep":INT,"plus":INT,"effect":[EFFECTNAME,...]}
      • an effect generates a value of points from a dice roll n times and sum the value of plus. The n value is basep plus the item user’s attribute atr.
      • the number of poins is then passed to effect, that is a list containing a effect. These can be any of:
        • hpup : adds to the item user’s hp.
        • more effects are going to be specified as the project evolves.
    • example : {"plus":10,"effect":["hpup"]}
  • action : the effect is useful to generally describing battle relevant items, but sometimes you need a more complex item. This can usually be accomplished with action, that can contain a list of actions and parameters that are placed on the engine buffer when the item is used.

  • reusable : if this field is specified and is true, using the item doesn’t cause it to be dropped.

  • unique : you can’t have more than one of this item, also it can’t be purposely dropped by the player. Unique items are usually meaningful to the storyline of the game.

  • description : a string containing the description of the item, think on the description as the shortest as possible sentence that you could say about the item by looking at it.

  • category : the item category is a single word (alphanumeric without spaces) string. The recommended values are consumable, collectible, weapon and armor. You could specify other values for your particular game implementation, but you must support these. They are only useful for filtering the inventory or comparing.

  • icon : if specified, it is an integer specifying in the printer.png which 64x64 pixel image should be used to draw the item in the menu.

Charaset

A charaset is a description of the frames that compose the animations. When a chara is presented to the screen (example: NPCs you interact with), it will have a drawing in the screen, each chara is associated to a charaset describing it. At minimum, each chara has two animations: standing, and walking, each having at least a frame assigned per facing direction. A facing direction is always one the following: down, right, up, left.

{ "Charaset": {
    "tileImage": "charaset.png",
    "CHARASET_NAME": {
        "standing": {
            "down":
                [[  X,  Y], [  X,  Y], [  X,  Y]...],
            "right":
                [[  X,  Y]...],
            "up":
                [[  X,  Y]...],
            "left":
                [[  X,  Y]...] },
        "walking": {
            "down":
                [[  X,  Y]...],
            "right":
                [[  X,  Y]...],
            "up":
                [[  X,  Y]...],
            "left":
                [[  X,  Y]...] },
         ...
        },
    ....
    } }

A frame is described by a piece that is 64 pixels in height and 32 pixels in width of the tileImage indicated. This tileImage path is relative to the img folder.

The image will be divided in a grid, where each cell has 64 pixels in height and 32 pixels in width. The first cell at top left is where X and Y are both zeros. Each cell in horizontal line towards right increments 1 to X, and each cell in vertical line towards bottom increments 1 to Y. You can have as many frames as necessary.

You can define other animations with different names, as necessary.