A downloadable framework for Windows


This is a free-to-use framework for creating Ren'py games that make use of orthogonal maps created using the Tiled map editor. This download includes a prototype of the framework, as well as a small sample of maps, tilesets and sprite collections to serve as a demo. 


I've set up a Lemmasoft forums thread for discussion, which is where I will also be posting documentation


If you want to ask me questions, or get some insight into the plans for the pink engine, a discord server has been set up here.


I am currently in the process of creating tutorials. Currently available tutorials:


All animated sprites were created by Sevarihk, as are all the assets in the 48 x 48 tile test room.

Generic icon art is taken from game-icons.net

Other art assets were created by me.



  • Sprite collection objects can now be passed a variable name as their path, and will switch between collections as the variable changes value.
  • The pink engine now supports conditional layers. Unlike conditional objects,  which check their condition every frame, conditional layers only check their condition when entering a map. This allows you to have vast conditional areas in your maps without slowing down the engine.
  • The `get_follower` function has been added to the pink module itself, allowing you to call it even when no pink engine map is currently visible. 
  • Fixed a bug where, when triggering a touch event, the player character would not complete their final frame of movement. 
  • Fixed a bug where interacting with the edge of the map could cause a fatal error.
  • Fixed a bug where the game could crash if certain incompatible controllers were even so much as plugged into your computer.
  • You can now assign an activation event to a pink engine object during an event. This can be used to, among other things, make player followers interactible. 
  • Added a number of tests maps to demonstrate these features, as well as a number of other previously possible functionalities that had been poorly documented.
  • Swapped out all the invisible objects with icons in the test maps, to provide visual clarity to people checking out the maps for the first time (since Tiled doesn't outline object outlines by default). 


  • Support for controllers has been restored.


  • The big update to Ren'py 8.0 is here! This new version of the pink engine is entirely python 3 compatible, and should run a fair bit faster as a result of the version upgrade to boot.
  • HOWEVER: Due to an issue with a pygame_sdl2 library function, controllers are currently not supported for this version of the pink engine. I'm trying to find a solution, but in the meantime, I'm keeping the download link for the previous version of the Pink Engine up as well.
  • You can now spawn event-specific NPCs and give them movement instructions as part of an event script, without a need to create a conditional instance of the NPC in Tiled. That should prevent a lot of clutter when designing maps. 
  • The logic for the go_to_smart command was updated so that it worked with special movements, like walking up stairs or jumping over areas.
  • The movement logic for player followers was changed to use a variant of the go_to_smart script. This makes the logic for having followers return to the player after an event far more robust. 
  • Functions for hiding and revealing NPCs during an event were added. Functions for hiding and revealing all of a player's followers were also added. 
  • The 'uncouple_followers' function was added, which makes player followers quit following the player until the end of an event.
  • Test rooms were added to demonstrate the previous functions, plus another one for the use of ren'py transitions in pink engine events.


  • The game no longer crashes when it encounters maps that make use of Tiled shapes. Note that the engine will not actually do anything with the shapes. 
  • Solved a memory leak related to the VarTimes parallel process. 
  • Solved an issue where VarTimes timers would jump about two seconds when a game was loaded during a non-static event.
  • Added tilesets with generic colors and icons, for the sake of creating more visually clear interaction layers.


The big parallel process update.

  • This update applies the model from 0.13.0 to all parallel processes, allowing individual map objects to define parallel process functionality. All parallel process test rooms have been updated to use the new model. The old 'parallel_process' map property has been defuncted, as it had been made entirely pointless due to the more broadly useful 'code_on_enter' property having been added.
  • Object properties 'start_x_coord', 'end_x_coord', 'start_y_coord', and 'end_y_coord' have been added. These properties are the first x coordinate intersected by the object, the last x coordinate intersected by the object, the first y coordinate intersected by the object and the last y coordinate intersected by the object. Among other things, these properties allows you to define areas for parallel processes using an object in Tiled. All test rooms that make use of areas now use such objects for clarity.
  • Parallel processes can now be paused during dynamic and continous events (static events will automatically pause all parallel processes). The function 'pause_parallel_process' will pause all parallel processes that you pass along. The function 'pause_all_parallel_processes' will pause all parallel processes. The 'unpause_parallel_process' and 'unpause_all_parallel_processes' can be used to unpause parallel processes again. Parallel processes are automatically unpaused at the end of an event. The new 'pink_otm_parallel_pause' ren'py variable (found in orthogonal_tiled_map.rpy) can be used to define a list of parallel processes that automatically pause during events.
  • Parallel processes automatically pause when screens defined in the 'pink_freeze_game_screens' variable are up (so timers don't continue running while you're in the menu)
  • Parallel processes areas, conditions and timers can now be created with an index, allowing those areas/conditions/timers to be easily removed. This also applies to the ConditionalCodeTriggers and ConditionalEventTriggers parallel processes from last update, which now use these indexes to remove triggers. As a result, it has become possible to have multiple events and conditions with the same trigger, and having dynamically defined conditions. 


This rather large and much-delayed update is focused on expanding the game with functions that allow developers to trigger code or events once specific conditions are met. 

  • The 'code_on_add' and 'code_on_remove' properties were added to map objects, which allow you run a piece of code at the moment an object is added (including during initialization) or removed from the map respectively. 
  • The 'consistent' boolean property was added to map properties. If an object's 'consistent' property is set to False, its state will not persist after leaving the map even if a ref_name is assigned to the object.
  • The 'code_on_enter' and 'code_on_leave' properties were added to maps, allowing you to run a piece of code the moment the map is entered or left. 
  • The 'execute_code' control command was added, which executes a piece of code. 
  • The 'set_state(state_name, value)' and 'get_state(state_name)' functions were added to all pink engine objects. These functions can be used to save variables to an object after initialization.
  • A new parallel process was added by the name of 'ConditionalCodeTriggers'. This parallel process is used to run pieces of code once specified conditions are met. 
  • A new parallel process was added by the name of 'ConditionalEventTriggers'. This parallel process is used to trigger events once specified conditions are met. 
  • Both of the new parallel processes make use of a new model of architecture that allows individual map objects (using code_on_add) to add conditional events and code triggers to them, rather than having to specify them all in the map properties. This should provide a more user-friendly experience to developers. Old parallel processes will be transitioned to the new model during a future update. 
  • The function 'pink_otm_wait_for_npc_to_finish_move(target_npc)' was added to the standard events library. This function makes an event halt until the targeted NPC has completed all its control commands.
  • The function 'pink_otm_wait_for_player_to_finish_move()' was added to the standard events library. This function makes an event halt until the PC has completed all its control commands.
  • The function 'pink_otm_walk_up_to_character(moving_npc, target_character)' was added to the standard events library. This function makes the moving_npc walk up to the target_character's nearest passable side and turn to it. 
  • The function 'pink_otm_pursuit_script(target_npc, pursuit_speed)' was added to the standard events library. This function makes the target_npc pursue the player. Best used in combination with arbitrary code triggers to start a pursuit once specified conditions are met. If no pursuit speed is specified, a default speed (specifiable in standard_events.rpy) can be specified. 
  • The function 'pink_otm_cease_pursuit_script(target_npc, return_coord)' was added to the standard events library. This function makes the target_npc cease pursuing the player and return to the given return_coord. 
  • The functions 'pink_otm_pursuit_range(npc, engage_range, disengage_range, pursuit_speed, in_view)', 'pink_otm_pursuit_cone(npc, engage_range, disengage_range, pursuit_speed, in_view)' and 'pink_otm_pursuit_line(npc, engage_range, disengage_range, pursuit_speed, in_view)' were added to the standard events library. These functions can be used on NPCs in code_on_add to add ConditionalCodeTriggers to make these NPCs pursue the PC if they enter in a range, line-of-sight or cone-of-sight of the NPC respectively. If a disengage_range is given, a second ConditionalCodeTrigger is added that makes the pursuit stop once the PC gets sufficiently far away. If in_view is set to True (the default), the NPC will only pursue if they have a clear line-of-sight of the PC.
  • The function 'get_map_object(ref_id)' was added to OTM maps. This function is used to retrieve objects by their ref_id from the map. In 'code_on_add' code, this function can be used by an object to reference itself without needing to use a ref_name. 
  • Ten test rooms were added to demonstrate the new functions. These are rooms E-01 through E-10. 
  • The ren'py variable 'pink_otm_event_button' was added. This variable remembers the button that was used to initiate an event. This way, you can make different keys start different kinds of events when interacting with an object. Test room A24 was added to demonstrate this functionality.


  • Fixed a bug where the game could, under certain circumstances, crash when removing a mobile conditional sprite collection.


  • Added the ability for developers to situationally override move commands on specific tiles to fit specific movements. Useful to allow players to hop over obstacles, move up stairs or climb ladders. A new test room, B20, was added to demonstrate this functionality. Objects can have the 'ignores_special_movement' property added to them, so that they ignore such movement commands (useful for the camera, or flying creatures)
  • 'move' layers were split up between 'move_sub', 'move_dynamic' and 'move_super' layers, with  movement rules on the move layers taking precedence over the type of layer mentioned in the name. 
  • Objects had the following properties added, to make their location more easily specified in scripts: upper_left_coord, upper_coord, upper_right_coord, left_coord, right_coord, lower_left_coord, lower_coord, lower_right_coord.
  • The orthogonal_tiled_map is now defined in a separate file, so that it can be customized without having to worry about every single update overriding your changes.

  • Added the ability to add and remove followers to OTM gameplay even if no OTM map is currently open. A handy button was added to the pink engine console for adding a specific sprite collection as a follower, and for removing all followers.
  • Added the ability to change sprite collections on consistent OTM sprite collection objects when they're not currently visible. Previously, this would result in an error.
  • Followers now spawn with the player's current movement speed, rather than the default movement speed. 
  • Followers are now rendered on the same layer as the player, rather than 1 layer below. That setup had been envisioned so as to make sure players always rendered over followers, but it caused some minor visual glitches when players moved in a vertical direction.
  • The console has been unbroken once more, and will no longer crash if you try to open the general settings page.
  • The game will also no longer crash if you change the player's sprite collection in the console while they have followers.  For that matter, the zoom level won't reset if you change the sprite collection. 
  • When using the console to jump to a specific map, you can no longer target a point beyond the edges of the map.

  • Made the game a bit more reactive to keyboard presses, especially in situations where you press one movement key while already holding another. 
  • Fixed a bug where TMD maps were not displaying. 
  • Made the engine check the value of pink_otm_force_run on the end of events, causing the PC to start or stop running appropriately (previously, it only checked this value when the run key was pressed or released, or when transitioning between maps)


  • This version adds support for gamepad controllers. Under the default control scheme, the left stick moves the player character, the right stock rotates the player character, the 'A' and right trigger are for interaction, and holding the 'B' button causes the player character to run.
  • Resolved a bug where using an event_on_touch event to transition to a new map would result in the PC getting stuck in the same frame
  • Resolved a bug where the player could still walk around while the quit or quick load confirmation screen was up.
  • Resolved a bug where the config.rollback_enabled setting would be ignored, and rollback was always enabled.
Updated 24 days ago
StatusIn development
Rated 5.0 out of 5 stars
(5 total ratings)
Authorpink productions
Made withTiled, Ren'Py
Tagsframework, Ren'Py
Code licenseUnlicense
Average sessionA few seconds
InputsKeyboard, Mouse

Install instructions

Extract the zip file in a location of choice and run pink_engine.exe . Tiled-compatible maps and tilesets can be found under game/pink_engine/


pink_engine-0.15.2-pc.zip 84 MB
pink_engine-0.15.2-pc-empty.zip 303 kB
autotile translator v2.1.exe 10 MB
sprite collection editor v2.1.exe 11 MB

Development log

View all posts


Log in with itch.io to leave a comment.

This looks very promising. Before I go deeper into the matter I would like to know if I can use the RPG Map Editor 2 - by Deepnight Games

https://deepnight.itch.io as well or do I have to switch to "Tiled"? Thanks in advance.

Kind regards


Hey Dantom. The project is currently only designed to work with Tiled. No compatibility with other map editing tools has been built in. 

Thank you for your answer, I'll look into Tiled then.

(1 edit)

Hello :) I am really impressed with your work. I worked through the tutorial for hours today and even got a simple game running. When I tested it now I noticed that you can only select a menu with the mouse but not with a controller (e.g. "Dare to press the button?") which is a real pity and affects the game experience imho. Is there a way to change this? Or is it possibly a mistake on my part?

Edit: I tried to change the zorder in the choice screen (screens.rpy) but that was of no avail. It seems that the controller is disabled as soon as a Choice menu appears.

(1 edit) (+1)

Navigating the choices in a menu can be done using the D-pad. 
The problem with using the stick to navigate menu choices is that it was too prone to accidentally selecting an option in the quick menu at the bottom of the screen. By splitting the movement and selection functionalities between different pads, that issue was averted.
If you want to restore the functionality for your game, you can comment out the keymap overrides in key_map_override.rpy. 

Your key assignment makes complete sense! I commented out the changes and got your result described above. Unfortunately my gamepad (Dpad neither sticks) doesn't respond with your key mapping, I think it's my hardware, a $5 Controller for Windows so I tend to turn off the quickmenu. Thanks for your answer and also for the "index_of_gamepad_keys.txt" file. I need to look much deeper into this ;)

Kind regards


Can i use pink engine for android games?

In the current version (0.14.1), there's no support for touchscreen input for pink engine functionality.  It is a planned feature, but not yet implemented.

Looking forward to the sprite collection editor, and everything else is amazing so far!

(2 edits)


I love your engine so much! It's exactly what I need. I try to play around with it, but I only know the Renpy basic codes + just learned how to make Tiled maps so all I do so far is to change the character sprite ha ha. I hope you include a documentation soon! o((*^▽^*))o

I just got this tileset (by GuttyKreum) and made this map on Tiled, but I don't know how to implement it into Pink Engine yet.

Oh my gosh! This looks absolutely AMAZING. Thank you so much for your hard work 🙇‍♂️ I'll try it and let you know my thoughts!