Odyc.js

🌍 Templates and the Map

templates define all the objects in your game — obstacles, items, characters, etc.
Each template is associated with a unique character (e.g. "X", "$", "e", "#").
You can then assign a set of properties to each template and place them in the map.


⚙️ Template properties

Each template accepts the following properties:

PropertyDefault valueDescription
solidfalseDetermines whether the player can pass through the object.
visibletrueWhether the sprite is visible or not.
spriteNoneDefines the visual appearance of the object (see sprites).
soundNoneSound played when interacting with the object (see sounds).
dialogNoneDialog displayed when the player interacts with the object (see dialogs).
endNoneEnds the game with a custom message (see title & end screen).
onCollideNoneCalled when the player collides with the object (see events).
onEnterNoneCalled when the player enters the tile containing the object (see events).
onLeaveNoneCalled when the player leaves the tile containing the object (see events).
createGame({
	templates: {
		r: {
			sprite: 6,
			sound: ['HIT', 999],
			visible: false,
			end: 'Game Over'
		},
		g: {
			sprite: 7,
			dialog: "I'm grass.",
			solid: false
		}
	}
})

🗺️ The Map

The map defines how objects are arranged in the world using an ASCII grid. Each character in the grid corresponds to a template.

💡 Creating a map is a lot like drawing a sprite!

  • Each character defined in templates is interpreted.
  • Spaces, tabs, and empty lines are ignored.
  • Any undefined character is treated as an empty cell.
createGame({
	templates: {
		x: { sprite: 0 },
		g: { sprite: 7 },
		r: { sprite: 4 }
	},
	map: `
    xxxxxxxxxxxxxxxx
    x..............x
    x...........g..x
    x..............x
    x..............x
    x....r.........x
    x..............x
    xxxxxxxxxxxxxxxx
  `
})

☄️ Dynamic Templates

A template doesn’t have to be a fixed object — you can also define it as a function that returns an object. This is useful when you want to create elements that are slightly different each time they appear.

For example, to create a wall where each instance has a different color:

createGame({
	templates: {
		x: () => ({
			sprite: Math.floor(Math.random() * 9)
		})
	}
	//...
})

The function is called every time an x element is placed on the map. This lets you introduce variability or conditional logic into your game world.