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.

Other art assets were created by me.



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.


  • Implemented a new type of control command: go_to_smart. This is a go_to command that makes use of pathfinding. It makes use of an A* algorithm with a preference for straight lines, and has a customizable maximum look distance (the new control command property `max_path_length`). Test Room A-22 was implemented to demonstrate this new functionality.
  • New functionalities were implemented for having objects move onto the player's square and trigger a touch event. The new control command property `ignore_elements` allows you to make objects ignore the movement rules of listed objects in their movement calculations. In addition, the new boolean object property `check_touch_every_frame` allows you to have objects test for touch events every frame, rather than only on completion of a movement command. New Test Room A-23 demonstrates all these functionalities.
  • A major bug fix. Using the leave_otm function to switch to regular ren'py functionality, and trying to go to a new map (rather than return to the old map) used to result in a fatal error. This has now been fixed. 
  • A medium bug fix. The control command property `prev_coords` is now set to False by default, so characters will actually walk to the player rather than one square behind them. 
  • A small bug fix. When changing player sprite collection while having followers, the followers will no longer get all jittery. 


  • The 'pink_otm_transition' standard event has been wildly expanded to cover sound effects and ren'py transitions. All the lab doors in the test maps have been updated with noises and transitions, and Test room B-19 has been created to demonstrate various transition options. For a full list of transition options, read the documentation on the pink_otm_transition standard event.
  • A new control command 'play_sound' was added, to play sounds as part of an object's sequence of control commands. Test Room B-11 has been updated to demonstrate this new functionality.
  • Smooth zooming no longer interrupts gameplay, allowing for slower smooth zoom effects. Test Room B-06 has been updated to reflect this change.

Autotile Translator v2.1

  • Adjusted the Autotile translator for Tiled's new 'Terrain Sets' feature. Rather than creating wang sets, using the autotile translator now results in the creation of terrain sets with two distinct terrains ('open' and 'edge'). This means you no longer have to constantly switch between editing corners and editing sides when working with translated autotiles. 

Sprite Collection Editor v2.1

  • Translating an image now automatically results in the 'move_to', 'base_offset_x_start', 'base_offset_y_start', 'base_offset_x_end' and 'base_offset_y_end' properties being set for every animation. 
  • The program now raises an error when trying to export a sprite collection without first setting a sprite collection name. 
  • Fixed an error that could occur after saving a sprite collection.
  • Fixed an error that would under some circumstances prevent new properties from being added after translating an image.


  • Added Followers to the pink engine framework. Followers are characters that follow the PC around, representing party members and such. A new test room was added to demonstrate this functionality. 
  • 'go_to' commands now accepts a new argument: prev_coord. If set to True, this makes a character move to the space previously occupied by another character.
  • 'go_to' commands now use code evaluation when looking up a reference name, so you can now target members of lists and such.
  • Sprite collection objects can now be given move_to and move_from properties. These properties will then override these same properties from their animations
StatusIn development
Rated 5.0 out of 5 stars
Authorpink productions
Made withTiled, Ren'Py
Tagsframework, Ren'Py
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.13.0-pc.zip 103 MB
pink_engine-0.13.0-pc-empty.zip 213 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.

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!