Diora Level Editing
1. Getting Started
The Construct is your hub for creating your own levels for Diora!
Enter the construct and interact with the blueprint table to get started.
| The editor can spoil the story and mechanics in Diora. Please consider finishing the story before using the editor. |
2. Editor Menu
Use these menus to manage your level and project.
2.1. Menus
Test Level
Used to test your level!
Press
to get back to the editor quickly.
Use and select render icon to render a project icon instead of making one from scratch.
|
Save / Quit
The save/quit menu contains multiple menus and commands, but is mainly used to save the level and exit back to the project menu.
Editor Settings
Used to change settings such as the movement and rotation snap.
- Movement Snap
-
needed for correct placement of certain blocks like fences.
- Rotation Snap
-
Can be used to make more organic placements.
- Block Overlap
-
Behavior can be changed to place blocks inside of each other, or replace blocks.
- Save On Test
-
Can be enabled if you are paranoid about my error checking abilities.
- Use Block As Cursor
-
Can be turned off to help with visibility near your cursor.
Block Library
Browse and load blocks to use in the level.
Filters can be applied using
to sort by all, interactable, rendering fx, connectable, and decorative.
Block Inspector
Hover the cursor over a block and inspect its values.
Numerical values can be edited using the
.
String values can be edited using the
button.
s value.
The movement snap setting is used for most numerical values except for r and tr values which use the rotation snap setting.
|
3. Console Commands
While levels can be made entirely on the Playdate, advanced tools are available using a computer! The Commands System is used to handle complex logic behind dialogue, triggers, and editor tools.
4. Custom Assets
Diora projects support many types of custom assets.
| Some custom assets require knowledge of Blender 3.6 and the Playdate SDK. |
4.2. Dialogue
Dialogue files are used to control interactions with NPCs.
Write the dialogue .txt and place it in the project’s dialogue folder.
To attach a dialogue file to an npc, set the convo value on the npc object to the name of the dialogue file using the block inspector.
Example
This is an example of a standard dialogue file
#character zuriya #evil true Hey, have you seen any 'Network Technicians'? Cause |w They || told me to apprehend any I find. So let me know if you see any, okay?
Dialogue Commands
Dialogue commands are used in dialogue files to run simple commands, usually used to change what character is speaking.
#character zuriya
Dialogue Effects
Add tags between word to apply effects to the text in dialogue.
Effect tags are formatted with a vertical bar and a character |c with the character changing for each type of effect.
A double vertical bar || is used to stop the effect.
Only one effect can be used at a time.
Always put spaces between words and the effect tags.
#character npc1 |w Heyyyyyyy || hows it going? I'm |s soooo scared. Hey, |m ugh not again.
4.3. Blocks
-
Render frames from Blender.
-
Use the Dither Tool to convert to a single image.
-
Build the image table to a
.pdtusing the Playdate SDK and place in theblocksfolder. -
Replace existing blocks by using the same name, or use
!msg loadblock NAME.
To create blocks with special abilities like stairs or spinning blocks, you must supply a blockdata file.
-
Find the block you want to duplicate the functionality of.
-
Create a
.jsonfile with the name of the block. -
Use the
blockdataconsole command and copy the block data into the json file.
-
Place the file in the project’s
blockdatafolder.
Block Design Tips
In the example block template, the palette block shows materials commonly used in Diora. Custom shaders can be used to make special effects!
Consider how a block’s full rotation is 180 frames, with one every 2 degrees. If a block is rotationally symmetrical every 180 or 90 degrees, you only need to supply 45 or 90 frames. (0-44 or 0-89 in blender). This is also true for custom backgrounds.
4.4. NPCs
-
Render frames from Blender.
-
Use the Dither Tool to convert to a single image.
-
Build the image table to a
.pdtusing the Playdate SDK and place in theblocksfolder. -
Replace existing blocks by using the same name, or use
!msg loadblock NAME. -
Make a blockdata file for the npc using this data, refer to the instructions for blockdata above.
{
[dontstand] = true,
[drawfunc] = npc,
[newfunc] = npc,
[npc] = true,
}
4.5. NPCs in Dialogue
To make a custom NPC speak in dialogue, you will need to make a character file and render an icon table.
-
In the NPC blend file, Switch to the icon camera and render.
-
Use the Dither Tool to render the last 16 frames, they should be arranged in a 4x4 square.
-
Build the image to a
.pdtnamed the NPC’s id and place it in thecharactericonsfolder. -
Make a
.txtnamed the NPC’s id. The file will contain the NPC’s display name, icon id, and bebe id.
Paul paul box
Built in bebe sounds are auto, box, breath, granular, heh, hu, lama, moai, phase, pop, and type.
-
Place the file in the project’s
charactersfolder. -
Dialogue should now be able to accept the npc id name in the
charactercommand.
4.6. Bebe
Custom voice bebe sound effects are possible.
-
Convert the bebe to ADPCM WAV using Audacity.
-
Build the bebe to
.pdausing Playdate SDK or an external converter. -
Place
.pdain the project’saudio/bebefolder.
4.7. Backgrounds
-
Render frames and use the Dither Tool.
-
Build to
.pdtand place in thebackgroundsfolder. -
Load with
!msg background NAME.
4.8. Music
-
Convert the track to ADPCM WAV using Audacity.
-
Build the track to
.pdausing Playdate SDK or an external converter. -
Place
.pdain the project’saudio/musicfolder. -
Define loops using a
.txtwith the same name as the track. (Display name, loop start)
Concrete Jungle 20.2
-
Place
.txtin the project’smusicdatafolder.
4.9. Project Icon
-
Create custom icons at (200x240).
-
Build to
.pdiusing Playdate SDK. -
Replace
project.pdiin the project’siconsfolder.A project icon can be rendered while in test mode instead of making one from scratch. Open the menu with
and select render icon.
4.10. Metadata
Metadata files can be placed in the project folder.
-
'desc.txt': Simple message about your project.
-
'lock.txt': Will remove the edit option in the UI. The file can contain anything.
| This does not actually prevent anyone from editing your project, but can be used to deter editing and make the project feel more complete. |
5. Commands
Commands are used by the Console and Dialogue system.
These commands are interchangeable! Use # for a dialogue command or !msg (and a space) for the console. This can be used to achieve very complex effects!
|
!msg music theme in the console vs #music theme in a dialogue file or cmd.
| Command | Args | Example | Description |
|---|---|---|---|
|
No command, dialogue. |
||
— |
|
Comment, self explanatory. |
|
background |
name |
|
Changes level background, required for custom backgrounds. |
bebe |
name |
|
Changes Bebe sound. (Use character first.) |
blockdata |
name |
|
Prints block data .json to console. |
branch |
dialogue |
|
Branches into the new dialogue file, will pick randomly if more are given. |
branchlore |
lore dialogue |
|
Branches if the lore is true. |
branchlorenot |
lore dialogue |
|
Branches if the lore is not true. |
call |
function |
|
Calls the global scope function with no arguments. Can be unstable! |
cam |
angle zpos time |
|
Starts a camera animation. Use |
changeself |
name |
|
Changes the dialogue owner into the block with the given name. Useful to make an npc put on a hat. |
character |
name |
|
Changes Bebe, name, and Icon with one command based on a character file. |
clear |
time |
|
Clears the screen for the specified time, useful for hiding cutscene transitions. |
convoat |
convo x y z |
|
Starts the convo with the owner that is at the position. |
crankindicator |
x y z |
|
Set the position to where the player spawns, will show indicator when there is no input for a bit. |
debug |
|
Toggles debug mode. |
|
deletewhere |
exp |
|
Deletes blocks that satisfy the expression. |
demo |
name |
|
Start a demo level. |
demos |
|
Print the demo list. |
|
destroy |
|
Destroys the block that owns the dialogue. |
|
destroyat |
x y z |
|
Destroys the block at xyz. |
endcmdlore |
lore |
|
Will stop executing the cmd if the dialogue is true. Useful to run a command on a first time entry. |
endcmdlorenot |
lore |
|
Will stop executing the cmd if the dialogue is not true. |
evil |
active |
|
Sets the dialogue display to be possessed. |
explode |
x y z r |
|
Explodes the position and radius like a bomb block. |
export |
|
Prints the level .json in the console. |
|
fade |
value |
|
Sets the current fade value, (0-1). |
fadetarget |
value |
|
Sets the fade transition target, (0-1), useful to hide a level transition during a cutscene. |
fistcrush |
x y z |
|
Will spawn a fist and crush the position given. |
gointo |
name |
|
Level transition, keeps player in the same spot. (like a door) |
icon |
name |
|
Changes dialogue Icon. (Use character first.) |
image |
path |
|
Displays the image in the dialogue window, use |
interactat |
x y z |
|
Interacts with block at the xyz. |
jumpself |
state |
|
Makes the dialogue owner jump up and down. Must be |
kill |
delay |
|
Diora is kil. (delay is optional and rarely used.) |
lb |
|
Loads the block. Required for custom blocks. |
|
loadblock |
name |
|
Loads the block by name. Required for custom blocks. |
lockinput |
bool |
|
Locks/Unlocks player input. |
moveplayer |
x y |
|
Moves the player during dialogue or cmd with the delta. |
moveself |
|
Moves the dialogue owner during dialogue with the delta. |
|
music |
name |
|
Changes level music. Required for custom music. |
musicclimb |
bottom top music1 music2 |
|
Starts the music climb effect. |
musicloop |
time |
|
Set music loop point, use |
offsetblocks |
x y z |
|
Offsets all blocks in the scene. |
offsetwhere |
exp x y z |
|
Offsets blocks satisfying the expression. |
placeprefab |
name |
|
Places the prefab at the editor cursor. Prefab placement can be messy, save first! |
placeprefabat |
name x y z r |
|
Places the prefab at the position. |
placeprefabatself |
name |
|
Places the prefab at the dialogue owner’s position. IDK why this is in the game. |
playerlookat |
x y |
|
Makes the player look twoards the position specified. |
message |
|
Prints the message. |
|
risefinish |
x1 y1 z1 x2 y2 z2 |
|
Used for the drone port level exit animation. |
rsnap |
angle |
|
Sets rotation snap value. |
runcmd |
string |
|
runs the string as a command, use |
selflookat |
|
Makes the dialogue owner look twoards the position specified. |
|
selflookatplayer |
|
Makes the dialogue owner look at the player. |
|
set |
type name value |
|
Sets the global variable. Can be unstable! |
setat |
type name value x y z |
|
Sets the variable of the block at the xyz. |
setlore |
name value |
|
Sets lore value for story progression. |
setplayer |
type name value |
|
Sets a value on the player object. |
setself |
type name value |
|
Sets the variable of the block that owns the dialogue. |
shake |
|
Shakes the screen. |
|
sle |
name |
|
Starts the level in the editor by name. |
sli |
name |
|
Starts the level immedietly by name. |
slowfadeout |
seconds |
|
Does a slow fadeout animation like in the credits. |
snap |
value |
|
Sets the movement snap value. |
sound |
name |
|
Plays the sound effect. |
startlevel |
name |
|
Starts the level by name. |
stopvideo |
|
Stops the video thread if it exists. |
|
text |
string |
|
Displays the text as an image like |
unlock |
name |
|
Unlocks the current level hovered over on the map, or by name. |
video |
name |
|
Plays a video. |
videohold |
|
Plays a video, will hold on the last frame. |
|
wait |
seconds |
|
Delays the command or dialogue. |
waitforvideo |
|
Waits the command until the video ends. |
|
win |
delay |
|
Diora is win! (delay is optional and rarely used.) |



