Releases: Psychronic-Games/RPGReactor
Release list
RPG Reactor 0.97.0
Added
-
A building can be declared on the map, not just in the tileset. A tileset can say what a tile is and nothing more: an autotile id is a corner arrangement shared by forty-eight shapes, so three shops built from one wall kind are indistinguishable to it, and an autotile has no place in a drawing for a declared rectangle to point at. Which cells make up one building is a fact about a placement. So there is a new palette tab beside Regions where you paint object numbers onto the map, and cells sharing a number are one object — a building assembled out of bits of three others is one thing and says so. A Footing brush marks which of its rows are the ground it stands on rather than courses of its height.
This is what makes decoration hold still against the thing it is painted on. A flag hung on a shopfront is a picture tile, and picture tiles could never join a wall's facade, so the flag became its own object with its own footing two rows nearer the camera and slid sideways against the wall as you walked. Inside one painted object there is one anchor and one plane, so everything on the building moves with the building.
-
Walls classed Upright are solid too. Massing raised by the tileset's classes had already gained real sides; a wall stood up as a cut-out had not. It was one plane at the southern end of its run — correct from the front and nothing at all from the side, so walking round a shop thinned its front to a line and it vanished. 2D never draws a building's sides so there is no art for them, but the wall's own art is a better answer than a hole. Each is now a box a tile deep, with ends only where the run actually stops, and those ends take their picture from the same shape quadrants the front does rather than from the block's corner piece.
-
Flying the editor's 3D camera with WASD, Q and E for height and Shift to hurry, alongside a hover outline showing which cell the cursor is over, boxes drawn round events so they read as events, and dragging events in 3D as you can in 2D. Escape now lets go of whatever is held.
-
A page set to Custom movement can finally be given a route. The type could be set and there was no way to author what it did, so Custom meant "stand still". A Route… button beside the dropdown opens the same dialog the Set Movement Route command uses, minus the two questions a page has already answered.
-
Buildings in 3D are solid boxes rather than a single wall. A wall run drew one plane at the southern end of itself, so a building was inside-out from the north and a line from the east. Every wall tile on every map already records which of its sides face open air — that is what an autotile's shape is, sixteen of them for four neighbours — and the renderer was reading one bit of it and discarding the rest. It now builds each exposed side, one course of wall art per tile of height, with end caps where the run stops and none where it carries on. Nothing is authored and no project data changes: the information has been sitting in the map files the whole time.
-
A raised wall is capped with its roof. A wall autotile draws a wall face and has no top, so a building wore its own front as a hat. A4 pairs a roof with every wall by its own layout — rows alternate, eight kinds to a row — so that pairing is derived. A3 is walls throughout and has none to derive from, so the tileset editor gains a Roof tool: click a wall, then click the tile that covers it. The roof picks its corners from the mass it covers exactly as the same roof painted flat would, so a run of wall reads as one continuous surface rather than a row of separate huts.
-
Panel: a 3D shape for things with a front. A gate, a door, a signpost or a shopfront was drawn as a camera-facing cut-out, so it swung to follow the viewer — right for a bush, absurd for a gate you were walking through. A panel stands still, faces a direction, and has a little depth, so seen from the side it reads as a gate seen from the side instead of vanishing. Which way it faces is worked out rather than authored: a gap in an east-west wall faces south, a gap in a north-south wall faces east, a panel with something solid on one side turns its back to it, and anything else faces the way RPG Maker art is drawn. Set it per tile in the 3D Shape editor beside Flat, Upright, Scenery and Foliage.
-
A 3D map drew in 2D whenever it was the first one entered. three.js is fetched the moment a 3D map loads, and the spriteset decides which renderer it is building the instant it is created — but the scene started the fetch and built the spriteset in the same tick, so the decision was always made before the two megabytes had arrived, and nothing asked again once they had. The symptom looked impossible from the outside: the library sitting plainly in
js/libsand the map rendering flat anyway. The scene now waits for the fetch before building anything, and an ordinary 2D map is not delayed by a frame. -
The 3D view in the editor no longer snaps back while you work. Every rebuild — and one runs on every edit — re-framed the map, resetting both where the camera was looking and how far it had zoomed. Orbiting or painting threw the view away and put it back at the whole-map framing, which reads as the camera being broken rather than as a reset. The map is framed when it is a different map now; double-clicking empty space is still the way to put the whole map back in view, and is now the only thing that moves the camera on your behalf.
-
Editing a map in 3D no longer discards elevation painted since the last save. The rebuild re-read
Map###.r3d.jsonfrom disk each time, so heights that had not been saved yet were replaced by whatever the file still held. -
Lights are lights on a 3D map, not pictures of light. A lighting plugin draws circles and cones onto the screen, which over a 3D world lands flat across it instead of pooling on the ground and climbing walls. Reactor now reads the lights a plugin owns and puts them in the scene: a lantern becomes a sphere, a flashlight a cone down a corridor, and the ground and the buildings respond to both. MVNovaLighting and PSYCHRONIC_RaveLighting are covered, and both can be installed at once. Neither plugin is modified — its own flat lightmap is hidden while the real lights are drawn, and comes straight back when they are not.
It is opted into per map with
<3d lights>in the note, beside the<3d>that makes a map 3D at all, because a project already lit to its author's satisfaction should not have that quietly replaced. A map that has not asked keeps exactly what it had. The dimness of an unlit corner is authorable in the map's sidecar; the default is dim rather than black.Reading a plugin's internals is the only way to reach its lights, so that reading is quarantined in one small function per plugin, each free to fail: a plugin updated underneath Reactor costs its lights and prints one warning, rather than taking the map down.
Lights are drawn rather than simulated. One
THREE.PointLightper light is the obvious implementation and does not survive a real map: three.js sizes its light uniform arrays to the number of lights in the scene and compiles that count into every material's shader, so a city with a lantern on every corner overruns the fragment shader's uniform budget, the program fails to link, and the map draws nothing at all. Capping the count to fit is no answer either — twelve lights on a street of a hundred is not lighting.But a 2D lighting plugin never simulated anything. Its light is a shape: a radius, a colour, an alpha — a soft disc it stamps on the screen. So each light becomes a quad lying on the ground, sized to its own radius and tinted by its own colour, added to what is already there; a cone gets a cone. All the lights of one shape share a single geometry and material, so a hundred of them is one draw call and no shader uniforms whatsoever, and the buffers are allocated once and rewritten in place. The only real light in the scene is a single ambient one, which is the darkness the rest are read against.
The lights are a pass of their own, drawn after the ground and after the tiles that cover characters, and composited by addition. Sharing a pass with those tiles will not do — a tree has to cover what is behind it, and light covers nothing — and drawing lights beneath the characters put every sprite, and the whole of the rest of the scene, on top of them. How strongly a light reads is a single number, because the alphas a plugin chose were meant for a flat overlay multiplied into a dark screen rather than a pool added to a lit one.
-
Characters can walk behind things in 3D. The star flag is what lets the 2D tilemap draw a tree or a doorway over a character; in 3D the ground was one picture behind every sprite, so nothing could ever be in front of anyone and a character walked over the front of everything. Star-flagged geometry is now drawn in a second pass laid over the sprites, mirroring the tilemap's own lower and upper layers, so the same tiles occlude the same characters in both views. A map with nothing flagged pays nothing: the second pass only exists when there is something to put in it.
-
Sprites are sized by depth, so the people are in the same perspective as the map. They were scaled by the projected height of a world-vertical segment, which is the natural measure and the wrong one: a pitched camera foreshortens such a segment, and that foreshortening eases with distance at close to the rate perspective shrinks it. The two cancelled — every sprite came out the same size wherever it stood, and the whole 3D treatment of characters amounted to nothing visible. A billboard turns to face the camera and is never foreshortened, so its size is the plain perspective divide, which is what it now uses.
-
The star-flagged pass is drawn inside the tilemap, where the tilemap's own upper la...
RPG Reactor 0.96.0
RPG Reactor 0.96.0.
Full write-up: docs/devlogs/2026-07-25-rpg-reactor-0.96.0.md
0.95.1 was an internal development version and was never published; its changes ship in 0.96.0.
Still in progress
3D maps are new in this cycle and are honestly described as a first pass. What
follows is known to be unfinished — it is listed so nobody has to discover it
themselves. Everything here is opt-in: a map is only 3D if its note says <3d>,
and a project with no 3D maps is untouched by all of it.
- Terrain needs authoring to look its best. Which tiles stand up cannot be
derived from a tileset — a shopfront wall and a forest are both simply
impassable — so it is set per tile in the 3D Shape editor, and objects that
span several tiles are declared there too.derive-tileset-3d-classes.cjs
fills in a reasonable starting point from how your maps are already painted;
expect to correct it rather than accept it. - Forests read as dense cover rather than as individual trees, and a
mountain range reads as one texture rather than as peaks. Both are drawn from
the terrain's own lone variant, which is the right source; the arrangement is
not settled. - Interior walls show the wrong art on top. A wall autotile is a wall
face and has no top, so a raised wall is capped with its own side art. The
fix is to pair a wall with the roof drawn for it, which is not implemented. - Pits and craters stand up. Their art blocks movement exactly like a rock
does, and nothing in the tileset distinguishes a hole from an object. Set
those tiles to Flat in the 3D Shape editor, once per tileset. - No parallax or sky. A 3D map draws a flat backdrop;
parallaxNameis
ignored. Battles are 2D, unchanged. - Editing a large 3D map is slower than editing it in 2D. Every paint
stroke rebuilds the whole scene. Fine at 100x50, noticeable at 200x200. - The 3D Shape key and preview panels are English-only for now, pending a
translation pass.
Added
-
3D maps (HD-2D). A map can be drawn in 3D: the ground lies flat, walls and buildings stand up, and characters stay as 2D sprites moving on the grid. It is opt-in per map — a map is 3D only if its note contains
<3d>— and nothing else changes. Event commands, passability, regions and movement keep working on the same grid, andMap###.jsonstays standard RPG Maker data; elevation and camera live in aMap###.r3d.jsonbeside it. A project with no 3D maps behaves exactly as before and never downloads the 3D library. Battles are still 2D. -
Tileset 3D shapes. Which tiles stand up cannot be derived from map data — a shop wall and a cliff face are both simply impassable — so it is authored. The tileset editor has a new 3D Shape mode beside passability and terrain: click a tile to cycle it through Flat, Upright and Scenery. Upright treats a column of tiles as one picture and stands it at full height, which suits a building drawn as a single tall prop; Scenery raises the ground instead, which suits a forest or a mountain range, where the same tile repeats across an area. Autotiles are classified once and apply to all their shapes. Stored per tileset in
Tilesets.r3d.json; a project that never classifies a tile never gets the file, and an unclassified map renders flat rather than guessing. -
A 3D view in the map editor. A 3D checkbox beside the A1 toggle swaps the map canvas for a 3D view of the same map. Drag to orbit, Shift or right-drag to pan, scroll to zoom, and double-click empty space to put the whole map back in view. Events appear as their character graphic on a standing sprite with number and name above, or a coloured cube when they have no graphic. Click to select, double-click to edit, right-click for the same menu the 2D map gives you; selection stays in step with the events panel in both directions. A1 water animates, following the same A1 checkbox as the 2D canvas.
-
Painting works in 3D. With tiles selected in the palette, dragging paints them exactly as in 2D — same brush, same autotiles, same undo — and the tile under the cursor is reported in the map bar. Without a selection, dragging orbits instead; Ctrl always orbits. Painting shares one implementation with the 2D canvas, so the two views cannot drift apart.
-
Two more tileset sheets, F and G, giving 512 extra tiles on top of B–E's 1,024. They work exactly like B–E — same grid, same passability, ladder, counter and terrain tag settings, same layer stacking — and appear as tabs in the tile palette and slots in the tileset database. They use a range of tile numbers RPG Maker leaves empty, so importing an MZ or MV project can never conflict with them, and a project that doesn't use them saves exactly the same data as before. Maps that do use them still save in the standard format; only the two new sheets would be missing if the project were opened in RPG Maker itself.
-
Event editor: Conditional Branch, Show Choices, and Loop can be folded away with the arrow beside them, so a long event no longer has to be scrolled past in full. A folded block shows how many lines it is hiding, nested blocks remember their own state while an outer one is closed, and folding follows the block if you edit commands above it. Folds are remembered per event page and survive closing the editor or restarting, so a page comes back the way you left it. Everything starts expanded, and a page you have never folded stays that way.
-
Map properties: resizing a map now warns before it discards anything. Shrinking a map tells you exactly how many tiles will be removed and lists the events that will be deleted, and nothing is changed unless you confirm. Previously both were discarded silently, and events outside the new bounds were left behind invisibly.
-
Map properties: a new anchor picker chooses which corner or edge your existing content stays attached to, so a map can grow from the top or left instead of only the bottom-right. Tiles and events move together, Set Event Location commands on the map follow, and the player and vehicle start positions are updated when they are on that map. Reactor also finds Transfer Player and Set Vehicle Location commands elsewhere in the project that jump to fixed coordinates on the resized map, and offers to update them so they still arrive in the right place. Top-left remains the default and behaves exactly as before.
Removed
- An old tileset editor screen that could never actually open — it tried to build itself from a class that no longer exists, and nothing in the editor linked to it. About 1,300 lines went with it, including a passability overlay that read its markings from the wrong tiles on every sheet. The tileset editor you use in the Database is unaffected.
Changed
- Bumped the current development version to RPG Reactor 0.96.0.
- The tileset screen in the Database shows all eleven layer slots without scrolling, and an unassigned layer now offers a Choose Image button where its tiles would be, instead of empty space. Double-clicking a layer row still works as before.
- Picking a tileset image uses the same modal styling as the rest of the editor, with a proper header and footer, and its file list is searchable like the other image pickers. It opens on the layer's current sheet, offers (None) at the top to clear a layer, and Escape, the close button, the footer, and clicking outside all dismiss it.
- Every tileset layer row has a + button that opens the picker for that slot, so a sheet can be swapped without hunting for the double-click.
- Every marking in the tileset editor is readable over any artwork. They are drawn straight onto the tiles, so a pale marker on pale ground — or a red X on red brickwork — could disappear into it. The O, X, star, damage and terrain-tag markings now carry a dark outline; the four-direction arrows and blocked dots, the ladder, the bush and the counter bar carry a dark edge. Colours are unchanged, just less washed out.
- Assigning or changing a tileset image now updates the map and the tile palette straight away instead of needing the editor restarted. Only the sheets that actually changed are reloaded, and the map is only redrawn if something on it uses them — adding a new sheet costs nothing.
- Map editing previews are cheaper: the preview used to create a fresh drawing object for every tile under the cursor, every time the mouse moved, on top of a layer type PIXI no longer supports for this. Most noticeable when dragging a large stamp or a wide circle brush across a big map.
- Map Properties now says which map you are editing: the header reads Map Properties | 0211: Canite City instead of just "Map Properties", and it updates as you type in the Map Name field. Renaming still only takes effect when you press OK.
- The Tileset dropdown in Map Properties now shows each tileset's number beside its name, so you can tell which database entry you are picking. It matches the numbering the Change Tileset event command already used.
- Map Properties now sizes itself to its contents and rearranges to fit the window. Map Name and Display Name share a row, as do Tileset and Scroll Type, and the panels pack into two balanced columns, dropping to one on a narrow window. The dialog no longer reserves a fixed height with empty space below it, and the whole thing stays visible without scrolling even with the BGM, BGS, and Battleback sections expanded. The Note box can also be dragged taller.
Changed
- Standing things in 3D are cut-outs that turn to face you. They used to be fixed panels facing south, which is only correct from one direction: off that axis a structure read as a sheet of card folded up off the floor, and edge-on it vanished to a line. (A second panel crossing the first used to cover that, and it showed as a seam through the middle of the art.) A...
RPG Reactor 0.94.8 — Big Maps Without the Wait
An editor performance release, measured against the largest maps in the test corpus.
Highlights
- Large maps load in a quarter of the time: a 256×256 map (~131k placed tiles) went from ~10s to ~2.5s. Off-screen tiles now build in detached containers instead of forcing the ever-growing map to re-render every frame while loading.
- Full frame rate on water maps: animated water lives in small dedicated overlay layers so every static layer caches as a texture — editor frame time on the heaviest test map dropped from 24ms to 13ms with all water still animating.
- Region painting without freezes: bucket-filling a region across a large map no longer stalls the editor for ~5 seconds — region cells share one pre-rendered image per region ID and paints update only the touched cells.
- Region area previews: the rectangle tool shows the region color over the dragged selection, and the circle tool shows region-colored cells (it previously showed no preview at all).
- Stutter-free animation previews: the Animations database player, the animation picker, and the event editor's picker step at the exact MV 15fps cadence against the display clock instead of a drifting timer, with SE cues kept in sync.
- Small fixes: repainted shadows no longer stack invisible darkening duplicates, switching maps mid-load can't leak stale tiles into the new map, and the playtest save-failure message is localized in all 18 editor languages.
Full details: release overview · changelog · editor changelog
Pre-built download binaries are available at https://psychronic.itch.io/rpg-reactor.
RPG Reactor 0.94.7 — Map Editing You Can Trust
A fast-follow fix release driven by user reports against 0.94.5. (0.94.6 was an internal development version and was never published; its changes ship here.)
Highlights
- The paint bucket actually fills: flood fill matches autotiles by terrain kind instead of exact shape variant, covers the whole connected region instead of leaving rings of old tiles, and recomputes autotile borders after the fill. The eraser's fill mode matches the same way.
- Strict layer separation: with a manual layer (L1–L4) selected, every paint tool writes only to that layer — ground autotiles no longer ignore the picker and silently clear decorations on other layers. Auto mode keeps MZ-style smart stacking.
- Region tools that paint regions: the rectangle, circle, and paint bucket tools respect the Regions tab instead of painting tiles from the previously selected palette tab.
- Playtest autosave: the Playtest button saves the project (current map, database, map list) before launching, so tests always run what the editor shows.
- No more plugin blend blackouts: multiply/screen blending renders natively under PIXI v8 again — toggling plugin overlays such as Sang Hendrix's parallax collision editor no longer blacks out the screen or floods the console with backBuffer warnings.
- Boots through broken plugin wrappers: non-async
SceneManager.runwrappers (VisuMZ Core Engine among them) no longer crash or black-screen startup, and ES5-stylePIXI.Filter.call(...)construction works under PIXI v8. - Browser editor: database lists show their mini preview icons, and the character/face/SV-battler/icon pickers open in the browser edition.
Full details: release overview · changelog · editor changelog
Pre-built download binaries are available at https://psychronic.itch.io/rpg-reactor.
RPG Reactor 0.94.5
RPG Reactor 0.94.5 is the release where big games get fast. A day of profiling a large commercial MV project on the Reactor runtime took its heaviest maps from 30 FPS to over 180, made tactical battles smooth, and fixed Ultra Mode 7 from crash to full speed — and the engine now ships the profiler that found every one of those problems.
Performance
- Detach-based offscreen culling: maps with hundreds of events and plugin overlay windows run at full speed (measured 30 -> 180 FPS).
- Pooled tilemap repaints: 77ms scroll spikes eliminated, with stale edge tiles made structurally impossible.
- Ultra Mode 7 GPU buffer caching: 36.8ms -> 4ms median frame on a 256x256 Mode 7 map, with seams fixed for pixel-art games.
- LeTBS tactical AI: AoE evaluation memoized and pathfinding rebuilt (it ran full A* inside a sort comparator); 150ms enemy-turn hitches are gone, and leaked battle animation sprites no longer ghost over themselves.
Built-in diagnostics
- Press F10 in any Reactor game to record per-phase frame timings; a second press writes
save/reactor-profile.jsonattributing every slow frame. Console helpers$reactorAnimStats()and$reactorAnimWatch(id)diagnose live animation sprites across all hosts. Free until activated, ships in every runtime.
MV compatibility
- The compatibility layer is now two-tier: MV plugin API support for every game (mix MV plugins into MZ projects freely), MV game semantics only for MV-authored games.
- Fixed: interpreter route/animation/balloon wait contracts under MV plugin overrides, seamless looping animations, MV-verbatim window metrics and menu creators, instant battle victory, native-format-first save resolution, and MV-style tolerance of unhandled promise rejections.
Utils.RPGMAKER_NAMEnow reports"MZ"so multi-engine plugins (UltraMode7, Cyclone, and friends) take the correct code path; Reactor's identity lives inUtils.REACTOR_NAME.
Editor & quality of life
- "Install Reactor Runtime..." archives the original RPG Maker corescript to a zip instead of mixing engines in one folder.
- Deployment downloads FFmpeg and the NW.js codec from pinned direct URLs — no more GitHub API rate-limit failures.
- Games boot with a clean console; Forge Effekseer exports honor explicit frame counts.
Release overview: The Performance Release devlog. Full technical list: editor changelog.
RPG Reactor 0.94.3
RPG Reactor 0.94.3 adds provider-neutral Web editor deployment, persistent browser editing, in-page Playtest, resilient native-curl deployment downloads, live download progress, and cleaner AppImage controls.
Read the full release overview
Pre-built desktop downloads remain available from the project download page. GitHub provides the tagged source archives below.
RPG Reactor 0.94.1
Pre-built editor binaries for Windows, macOS, and Linux are available at https://psychronic.itch.io/rpg-reactor. This repository release covers the source.
RPG Maker MV compatibility push
A large commercial MV project's full 168-plugin stack (Yanfly, Victor Engine, MOG, SRD, LeTBS, and more) now boots, plays its intro cutscenes, saves and loads through its own custom menus, and runs LeTBS tactical battles all the way into rendered combat turns: grid positioning, movement ranges, turn order, and battle HUD, all under the PIXI 8 runtime. The MV compatibility layer gained MV's battleback chain, window-internal sprite aliases, MV's battle-field creation order, the MV cell-sheet animation engine for plugins that subclass Sprite_Animation, functional character balloons and sprite-hosted animations, message sub-window plugin chains, ToneFilter, MV Bitmap tone/hue manipulation, the MV gauge/color API on Window_Base, and ~25 more scan-driven gap-fills, each preserving MV's argument guards verbatim so plugin feature-detection keeps working.
Runtime resource watchdogs
Resource loads that silently die (firing neither onload nor onerror, which is common on slow or cloud-synced disks) previously hung the game forever on a black screen with zero console errors. The runtime now watchdogs every database JSON, image, and audio load from the engine's own frame tick, retries stalls in parallel until they arrive, revives audio buffers that plugin caches still gate on after MZ code destroyed them, and degrades genuinely missing audio/images to silence/blank with a loud console error instead of deadlocking scene startup.
Effekseer Animation Generator
- Interface category rebuilt in native 3D and grown to 21 instruments: Orbital Survey (build-your-own solar system with per-planet custom textures), Starship Analysis, Reactor Core, Circular Gauge, Bar Meter, a 3D Battery cell, Behavior Matrix, Flight Prediction, Composite Waveform, and more. Every panel rotates truthfully with the orientation gizmo and can display user-typed text.
- New battle content: a 10-recipe Physical attack pack (Slash, Bite, Punch, Impale, Claw Rake, Crush, Arrow Hit, Parry, Whip Crack, and Blood with Burst/Spray/Drip splatter patterns), new Energy spells (Energy Boost, Energy Column, Binding Circle, Hex Forcefield), Christian Cross variants (Latin, Orthodox, Greek, Celtic), and jagged Ice Shards models.
- Parametric texture engine, exact-trackball 3D orientation controls, and Effekseer preview loading fixes in the Database and Event animation pickers.
Editor
- MZ-style tile-layer dimming: selecting map layer 1-4 fades the other layers so the active layer is always obvious.
- All new Forge content localized across the editor's 17 languages.
- PIXI v8 plugin compatibility:
getBounds().containshit tests restored for plugins written against the v5-v7 Rectangle API.
Full details in CHANGELOG.md and editor/CHANGELOG.md.