NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #5145 most downloaded on pub.dev
(RPG maker) Create RPG-style or similar games more simply with Flame.
Last release 1 months ago
07 Sep 2026
Release timing varies
gaps range from 8 days to 4 months
Most releases are documented
notes for 51 of the last 60 stable releases
Nothing withdrawn
no release was ever pulled
7 years old
349 releases · first in 2020
One column per quarter.
Modern Flutter/Flame APIs ( Color.withValues instead of deprecated channels), RadioGroup usage, etc.
Full changelog for this release — the consolidated 4.0.0 notes plus every pre-release entry (beta.4 → beta.13):
Bonfire 4.0 is a major release focused on developer experience and correctness: a cleaner, API-first architecture for mixins, a simplified movement system and a fully modernized codebase (Flame ^1.38.0). Below is the consolidated overview; each pre-release (beta.4 → beta.13) has its detailed entry further down.
WithFeature + feature.{resource})Most mixins no longer add methods/fields directly to the component. Functionality is grouped under a named API object, keeping the component namespace clean when many mixins are combined:
WithJumper → jumper (jumper.jump())WithSensor → sensor (sensor.enabled, sensor.onContactListener...)WithRandomMovement → randomMovement (randomMovement.update(dt, ...), randomMovement.onStartMoveListener/onStopMoveListener, randomMovement.area)WithPathFinding → pathFinding (pathFinding.setup, pathFinding.moveToPosition, pathFinding.stop, pathFinding.isMoving)WithCollision → collision (collision.onBlockMovementListener, collision.bodyType, collision.enable/disable)WithAttack → attack (attack.melee, attack.range, attack.meleeByAngle, attack.rangeByAngle, attack.meleeByDirection, attack.rangeByDirection)WithVision → vision (vision.seePlayer, vision.seeEnemy, vision.seeAndMoveToPlayer, ...)WithLighting → lighting (lighting.setup, lighting.config, lighting.enabled, lighting.angle)WithShader → shaderWithUtil → util (util.showDamage, util.generateValues, util.addParticle, util.getAngleToTarget, util.loadParallaxComponent...)WithFollower, WithPushable, WithFlipRender, WithMovePerCell, WithAssetsLoader, WithLifeBar — same pattern (follower, pushable, flipRender, movePerCell, assetsLoader, lifeBar)The legacy extension files (ally, enemy, game_component, npc, player + rotation_*) were removed — their helpers now live in the API objects above.
Movement is the only mixin that keeps its original access style, but it was fully rewritten and simplified:
update() applies position += velocity * dt; direction, hDirection and vDirection are now plain fields reflecting the current velocity.stop(), idle(), moveByAngle(...) (was moveFromAngle), moveFromDirection(dir, {useDiagonal}), onMove() with no arguments, Movement.defaultSpeed.lastDirection/lastDirectionHorizontal/lastDirectionVertical, acceleration, velocityRadAngle, displacement, setVelocityAxis, all *Once movement helpers, stopMove({forceIdle}), speedDefault, onVelocityUpdate, onApplyDisplacement, correctPositionFromCollision.isMoving now uses an internal frame counter (no more minDisplacementToConsiderMove).WithCollision + collision.onBlockMovementListener((points, other) => bool) — return false to allow the movement. The old BlockMovementCollision mixin and onBlockMovement override were removed.SimplePlayer/SimpleEnemy now use WithDirectionAnimation with an 8-direction SimpleDirectionAnimation (idle + run for the 4 axes); the sprite animation follows direction automatically (directionAnimation.onPlayRun*/onPlayIdle*Animation()).InternalChecker/checkInterval were removed — use IntervalTick (now with tickFirstUpdate). Built-in attack intervals were removed; control execution yourself.BSelector (priority), BParallel, BOnce and the unified Behavior.process contract (true = finished, false = keep running), with UseBehavior.debugBehaviors and UseBehavior.currentBehaviorId for debugging.CustomQuadTreeBroadphase removed; quad-tree collision uses the standard QuadTreeBroadphase.Movement.diagonalFactor is sqrt(2)/2.0.0) so applied velocities aren't nullified.FlyingAttackGameObject no longer deals damage twice when animationDestroy spawns an explosion.dispose() (called on onRemove).Color.withValues instead of deprecated channels), RadioGroup usage, etc.example/ updated to the new APIs and included in analysis; awesome/ examples updated (turn_game added).docs/ (including Behaviors page) and a complete Migration Guide (MIGRATION_3_TO_4.md).WorldMapInfiniteByTiled treats a small Tiled map as a pattern and repeats it as an endless world (InfiniteWorldMapType.open/vertical/horizontal) — chunks stream in around the camera and unload when far away, Y-sort stays correct on negative coordinates, camera bounds respect the finite axis(es) and the collision area is widened. Supporting APIs: TileLayerComponent.addTiles/removeTiles/tiles (quad tree grows automatically) and TiledWorldBuilder.build(onlyObjects:) with cached map parsing.^1.38.2, http ^1.6.0 and tiledjsonreader ^1.4.2; CI pins Dart 3.11.0 and runs the unit test suite (flutter test).Migrating? Read MIGRATION_3_TO_4.md — it has the full before/after tables for every changed API.
Behavior.runAction to Behavior.process and fix the return contract documentation: true = behavior finished (advance to the next one), false = keep running.BSelector (priority), BParallel and BOnce behaviors to the behavior system.UseBehavior.debugBehaviors logs behavior transitions and UseBehavior.currentBehaviorId exposes the active behavior.example goblin to keep the behavior list stable (late final) so internal behavior state isn't reset.Color API usage in the shader setter (.red/.green/.blue/opacity → .r/.g/.b/.a).docs/ (including the new Behaviors page), update the MIGRATION_3_TO_4.md guide and the docs site to the new APIs.WithAttack and AttackApi, exposed through the attack object on every GameComponent. The old attack extension methods (simpleAttackMelee, simpleAttackRange, simpleAttackMeleeByDirection, simpleAttackMeleeByAngle, simpleAttackRangeByDirection, simpleAttackRangeByAngle) were removed from the Player, Enemy, Ally and GameComponent extensions.
attack.melee(damage: ..., size: ..., animation: ...)attack.range(animation: ..., damage: ..., ...)attack.meleeByAngle(...), attack.meleeByDirection(...), attack.rangeByAngle(...), attack.rangeByDirection(...)damage is now a named parameter and animationRight is now animation.WithUtil and UtilApi, exposed through the util object on every GameComponent. The following extension methods were removed from GameComponent/Npc/Enemy/Ally/Player:
util.showDamage(...), util.generateValues(...), util.addParticle(...)util.getAngleToTarget(...), util.getDirectionToTarget(...), util.getAngleToPlayer(), util.getInverseAngleToPlayer(), util.getDirectionToPlayer(), util.playerRectutil.isCloseTo(...), util.overlaps(...), util.top, util.bottom, util.left, util.rightutil.loadParallaxComponent(...), util.loadCameraParallaxComponent(...)util.globalToViewportPosition(...), util.viewportPositionToGlobal(...)seePlayer, seeAndMoveToPlayer, seeAndMoveToEnemy, seeAndMoveToAlly, seeEnemy, seeAndMoveToAttackRange) from the Npc/Enemy/Ally/Player extensions into the vision API object: vision.seePlayer(...), vision.seeAndMoveToPlayer(...), etc.ally, enemy, game_component, npc and player extension files (including the rotation_* variants). Their functionality now lives in the util, attack and vision API objects.FlyingAttackGameObject dealing damage twice when animationDestroy is set: the direct collision no longer applies damage when the destroy animation spawns an explosion DamageHitbox.example/ to the new APIs and stop excluding it from analysis (lint errors are now reported). Also fix deprecations: withOpacity → withValues, Radio.groupValue/onChanged → RadioGroup.awesome/ examples to the new APIs (util.loadParallaxComponent, attack.meleeByAngle, etc.).InternalChecker mixin and the checkInterval method.
IntervalTick class directly to control intervals instead of the checkInterval method (and the resetInterval, pauseInterval, playInterval helpers).simpleAttackMelee and simpleAttackRange no longer accept the interval parameter. You should control the execution interval yourself using an IntervalTick.IntervalTick now has the tickFirstUpdate parameter, which replaces the old firstCheckIsTrue behavior of checkInterval.ForcesApi and GlobalForcesSettings now default to no drag (0.0) instead of 0.01, preventing the quadratic drag from nullifying velocities when forces are applied.Movement.diagonalFactor precision: use the exact sqrt(2)/2 value so diagonal movement is properly normalized.turn_game example to awesome/.IntervalTick API (replaces checkInterval) and remove outdated interval/execute params from the Enemy/Ally attack extensions docs.WithLighting to API strategy. Added LightingApi exposed through lighting API object.
setupLighting(...) → lighting.setup(...)lightingConfig → lighting.configlightingEnabled → lighting.enabledlightingAngle → lighting.angleLightingComponent to use the new LightingApi.WithShader to API strategy. Added ShaderApi exposed through shader API object._comp) across all mixin APIs to avoid exposing internal state.dispose() cleanup for APIs with listeners and call it on component onRemove:
WithJumper → jumper.dispose()WithSensor → sensor.dispose()WithRandomMovement → randomMovement.dispose()WithPushable → pushable.dispose()AssetsLoaderApi and FlipRenderApi since they don't depend on the parent component.ShaderApi._canSee.FlipRenderApi.WithFeature + feature.{resource} pattern. This reduces namespace pollution on components and improves developer experience when combining multiple mixins.
Follower → WithFollower (follower.setup(...), follower.target, follower.offset).Pushable → WithPushable (pushable.setup(...), pushable.onPushListener(...)). onPush override removed in favor of a registered callback.RandomMovement → WithRandomMovement (randomMovement.update(dt, ...)). Callback parameters moved to randomMovement.onStartMoveListener(...) / randomMovement.onStopMoveListener(...). randomMovementArea is now randomMovement.area.PathFinding → WithPathFinding (pathFinding.setup(...), pathFinding.moveToPosition(...), pathFinding.stop(), pathFinding.isMoving).FlipRender → WithFlipRender (flipRender.flipVertically(), flipRender.flipHorizontally()).MovePerCell → WithMovePerCell (movePerCell.setup(...), movePerCell.cellSize).UseAssetsLoader → WithAssetsLoader (assetsLoader.add(AssetToLoad(...))). Public AssetsLoader and AssetToLoad classes remain available.UseLifeBar → WithLifeBar (lifeBar.setup(...)).CustomQuadTreeBroadphase. CustomQuadTreeCollisionDetection now uses QuadTreeBroadphase directly.PushableFromEnum.PLAYER_OR_ALLY condition logic.Fix deprecated Color API usage in the shader setter (.red/.green/.blue/opacity → .r/.g/.b/.a).
Behavior.runAction to Behavior.process and fix the return contract documentation: true = behavior finished (advance to the next one), false = keep running.BSelector (priority), BParallel and BOnce behaviors to the behavior system.UseBehavior.debugBehaviors logs behavior transitions and UseBehavior.currentBehaviorId exposes the active behavior.example goblin to keep the behavior list stable (late final) so internal behavior state isn't reset.Color API usage in the shader setter (.red/.green/.blue/opacity → .r/.g/.b/.a).docs/ (including the new Behaviors page), update the MIGRATION_3_TO_4.md guide and the docs site to the new APIs.Update example/ to the new APIs and stop excluding it from analysis (lint errors are now reported). Also fix deprecations: withOpacity → withValues, R…
WithAttack and AttackApi, exposed through the attack object on every GameComponent. The old attack extension methods (simpleAttackMelee, simpleAttackRange, simpleAttackMeleeByDirection, simpleAttackMeleeByAngle, simpleAttackRangeByDirection, simpleAttackRangeByAngle) were removed from the Player, Enemy, Ally and GameComponent extensions.
attack.melee(damage: ..., size: ..., animation: ...)attack.range(animation: ..., damage: ..., ...)attack.meleeByAngle(...), attack.meleeByDirection(...), attack.rangeByAngle(...), attack.rangeByDirection(...)damage is now a named parameter and animationRight is now animation.WithUtil and UtilApi, exposed through the util object on every GameComponent. The following extension methods were removed from GameComponent/Npc/Enemy/Ally/Player:
util.showDamage(...), util.generateValues(...), util.addParticle(...)util.getAngleToTarget(...), util.getDirectionToTarget(...), util.getAngleToPlayer(), util.getInverseAngleToPlayer(), util.getDirectionToPlayer(), util.playerRectutil.isCloseTo(...), util.overlaps(...), util.top, util.bottom, util.left, util.rightutil.loadParallaxComponent(...), util.loadCameraParallaxComponent(...)util.globalToViewportPosition(...), util.viewportPositionToGlobal(...)seePlayer, seeAndMoveToPlayer, seeAndMoveToEnemy, seeAndMoveToAlly, seeEnemy, seeAndMoveToAttackRange) from the Npc/Enemy/Ally/Player extensions into the vision API object: vision.seePlayer(...), vision.seeAndMoveToPlayer(...), etc.ally, enemy, game_component, npc and player extension files (including the rotation_* variants). Their functionality now lives in the util, attack and vision API objects.FlyingAttackGameObject dealing damage twice when animationDestroy is set: the direct collision no longer applies damage when the destroy animation spawns an explosion DamageHitbox.example/ to the new APIs and stop excluding it from analysis (lint errors are now reported). Also fix deprecations: withOpacity → withValues, Radio.groupValue/onChanged → RadioGroup.awesome/ examples to the new APIs (util.loadParallaxComponent, attack.meleeByAngle, etc.).chore: bump version to 4.0.0-beta.11 and update changelog
chore: bump version to 4.0.0-beta.11 and update changelog
InternalChecker mixin and the checkInterval method.
IntervalTick class directly to control intervals instead of the checkInterval method (and the resetInterval, pauseInterval, playInterval helpers).simpleAttackMelee and simpleAttackRange no longer accept the interval parameter. You should control the execution interval yourself using an IntervalTick.IntervalTick now has the tickFirstUpdate parameter, which replaces the old firstCheckIsTrue behavior of checkInterval.ForcesApi and GlobalForcesSettings now default to no drag (0.0) instead of 0.01, preventing the quadratic drag from nullifying velocities when forces are applied.Movement.diagonalFactor precision: use the exact sqrt(2)/2 value so diagonal movement is properly normalized.turn_game example to awesome/.IntervalTick API (replaces checkInterval) and remove outdated interval/execute params from the Enemy/Ally attack extensions docs.BREAKING: Migrate WithLighting to API strategy. Added LightingApi exposed through lighting API object.
WithLighting to API strategy. Added LightingApi exposed through lighting API object.
setupLighting(...) → lighting.setup(...)lightingConfig → lighting.configlightingEnabled → lighting.enabledlightingAngle → lighting.angleLightingComponent to use the new LightingApi.BREAKING: Migrate WithShader to API strategy. Added ShaderApi exposed through shader API object.
WithShader to API strategy. Added ShaderApi exposed through shader API object._comp) across all mixin APIs to avoid exposing internal state.dispose() cleanup for APIs with listeners and call it on component onRemove:
WithJumper → jumper.dispose()WithSensor → sensor.dispose()WithRandomMovement → randomMovement.dispose()WithPushable → pushable.dispose()AssetsLoaderApi and FlipRenderApi since they don't depend on the parent component.ShaderApi._canSee.FlipRenderApi.- update README.md
BREAKING: Major restructuring of mixin APIs. Mixins now expose functionality through a named API object following the WithFeature + feature.{resource}
WithFeature + feature.{resource} pattern. This reduces namespace pollution on components and improves developer experience when combining multiple mixins.
Follower → WithFollower (follower.setup(...), follower.target, follower.offset).Pushable → WithPushable (pushable.setup(...), pushable.onPushListener(...)). onPush override removed in favor of a registered callback.RandomMovement → WithRandomMovement (randomMovement.update(dt, ...)). Callback parameters moved to randomMovement.onStartMoveListener(...) / randomMovement.onStopMoveListener(...). randomMovementArea is now randomMovement.area.PathFinding → WithPathFinding (pathFinding.setup(...), pathFinding.moveToPosition(...), pathFinding.stop(), pathFinding.isMoving).FlipRender → WithFlipRender (flipRender.flipVertically(), flipRender.flipHorizontally()).MovePerCell → WithMovePerCell (movePerCell.setup(...), movePerCell.cellSize).UseAssetsLoader → WithAssetsLoader (assetsLoader.add(AssetToLoad(...))). Public AssetsLoader and AssetToLoad classes remain available.UseLifeBar → WithLifeBar (lifeBar.setup(...)).CustomQuadTreeBroadphase. CustomQuadTreeCollisionDetection now uses QuadTreeBroadphase directly.PushableFromEnum.PLAYER_OR_ALLY condition logic.- Fix issue 592 - Fix elastic collision
- Updates Flame to 1.37.0
Nothing published for this version
Nothing published for this version
Nothing published for this version
Adds useAreaBetweenPlayerAndTarget to fix issue 592 @RafaelBarbosatec
useAreaBetweenPlayerAndTarget to fix issue 592🔔 Token API new Release 📬 Updates flame to 1.37.0
Update pubspec.yaml @RafaelBarbosatec
GameDecoration and rendered at their native size, anchored to the bottom-left of the cell — matching how the Tiled editor previews them. Projects that relied on the previous behaviour (oversized tilesets being forced into the map tile size) will see these tiles render larger than before.type=layered Tiled layer property. When set, extracted decorations from that layer are attached as children of the WorldMap (instead of game-level siblings), so they interleave with regular tile layers following Tiled's natural layer order. Opt-in to avoid breaking maps that rely on the current Y-sort behaviour.priorityOverride to GameComponent to let components pin a fixed render priority instead of using the default Y-sort computation.Performance improvements @RafaelBarbosatec
Update flame to 1.32.0
Fix textSize in BarLifeComponent
BarLifeComponentFlyingAttackGameObject improvementsAdds params collisionConfig . Now collision system used is a default. take a look Flame Doc . To use QuadTree approatch pass BonfireCollisionConfig.qu
collisionConfig. Now collision system used is a default. take a look Flame Doc. To use QuadTree approatch pass BonfireCollisionConfig.quadTree() as a params.Performance improvements.
Fix ellipse and polygon collision objects in Tiled maps, the CollisionType was set to inactive , changed to active as the RectangleHitbox .
CollisionType was set to inactive, changed to active as the RectangleHitbox.BarLifeComponentFix size in setupLifeBar
setupLifeBar- rollback to deprecated colors
Collision performance improvements
rename extension method directionThatPlayerIs to getDirectionToPlayer, getAngleFromPlayer to getAngleToPlayer, getInverseAngleFromPlayer to getInverse
directionThatPlayerIs to getDirectionToPlayer, getAngleFromPlayer to getAngleToPlayer, getInverseAngleFromPlayer to getInverseAngleToPlayer.1.18.0 :-(.- Update Flame to 1.23.0.
1.23.0.InitialMapZoomFitEnum improvements
a_star_algorithm.- RandomMovement improvements
RandomMovement improvementsNothing published for this version
Resolve the alignment and visibility issues when using the MiniMap widget with non-1.0 zoom values. Thanks qulvmp6
randomMovementArea param in RandomMovement mixin.- Adds UseShader mixin.
UseShader mixin.Adds MapNavigator. Structure to facilitate map navigations.
MapNavigator. Structure to facilitate map navigations.MultiScenario example to use MapNavigator.Adds param withDiagonal in setupPathFinding (PathFinding mixin)
withDiagonal in setupPathFinding (PathFinding mixin)Update tiledjsonreader to support web platform
tiledjsonreader to support web platformDirectionAnimation improvementsClean up componentes when game will removed. onRemove.
onRemove.Downgrade to Flame v1.18.0 (Crash in package 'ordered_set')
- Update Flame to v1.19.0
BREAKING CHANGE: Bump Flutter SDK minimum version to 3.22.0
BREAKING CHANGE: Update bool receiveDamage to void onReceiveDamage. Now to perform receive of attack use handleAttack method.
bool receiveDamage to void onReceiveDamage. Now to perform receive of attack use handleAttack method.Bugfix/tile rotation collision. #535
tiledjsonreaderSimpleDirectionAnimation.Fix jump animation showing instead of run/idle animation on slanting floors
Fix Joystick bug when viewport is fixed resolution. #526
FlyingAttackGameObject to prevent calling onDestroy after component has been destroyed.Fix bug in SimpleDirectionAnimation where fast animation direction did not change when character direction changed. Thanks tkshnwesper
FollowerWidget.SimpleDirectionAnimation where fast animation direction did not change when character direction changed. Thanks tkshnwesperFix intermittent crash after simpleAttackRanged is called. #520. Thanks tkshnwesper
Movement mixin improvements.simpleAttackRanged is called. #520. Thanks tkshnwesperMiniMap improviments. Fix issue #517
BouncingObject to ElasticCollision.SimpleDirectionAnimation bug when render fastAnimation.BlockMovementCollision improvements.
BlockMovementCollision improvements.PinchGesture mixin to listen pinch gestures.UpdateCameraByPinchGesture mixin to update zoom and camera position in pinch events.JoystickDirectional improvements. Now you can use Alignment.
JoystickDirectional improvements. Now you can use Alignment.JoystickAction improvements. Now you can use Alignment.PlayerControllerListener? observer in Joystick. If pass this param, the joystick will controll this observer and not the Component passed in player param.PlayerControllerListener? observer in Keyboard. If pass this param, the keyboard will controll this observer and not the Component passed in player param.BarLifeDrawPosition. #515Breaking Changes:
BonfireWidget expect List<PlayerController>? playerControllers instead of joystick. With this improvements is possible pass multi ways to control de player or any component that contains the mixin PlayerControllerListener(use MovementByJoystick to move automatic by PlayerController interactions). With this improvements it's possible create a local multiplayer.keyboardConfig param from BonfireWidget. Now pass Keyboard instance in playerControllers.
Example using joystick and keyboard: return BonfireWidget(
map: ...,
playerControllers: [
Joystick(directional: JoystickDirectional()),
Keyboard(),
],
player: HumanPlayer(
position: Vector2(100, 100),
),
);
Renamed AutomaticRandomMovement to RandomMovement
AutomaticRandomMovement to RandomMovementRandomMovement improvements! Now works in PLatformEnemyNothing published for this version
- Fix bug in JumperAnimation
JumperAnimationKeyboardConfig improvements. Now directionalKeys expect list of KeyboardDirectionalKeys. Fix #507
KeyboardConfig improvements. Now directionalKeys expect list of KeyboardDirectionalKeys. Fix #507PlatformEnemy improvements.flipAnimation method in ui.Image.Fix bug in the PlatformPlayer movements.
PlatformPlayer movements.objectsBuilder in WorldMapBySpritefusion. You can select a layer to adds objects in the tile position.DamageHitbox in FlyingAttackGameObject.Adds param centerAnchor in SimpleDirectionAnimation and PlatformAnimations. It's useful to correct spritesheet not centered.
centerAnchor in SimpleDirectionAnimation and PlatformAnimations. It's useful to correct spritesheet not centered.SimplePlayer.Nothing published for this version
Adds DamageHitbox. Use it to do damage.
Adds DamageHitbox. Use it to do damage.
GameMap Improvements. Now you can access the layers
Breaking Changes:
WorldMap expect List<Layer> instead of List<TileModel>;MatrixMapGenerator.generate now expect List<MatrixLayer> layers instead og List<List<double>> matrix;TileModel renamed to Tile;TileModelSprite renamed to TileSprite.Adds support to load map built by SpriteFusion. Use WorldMapBySpritefusion.
Breaking Changes:
TiledReader to WorldMapReader.TiledReader.asset to WorldMapReader.fromAsset.TiledReader.network to WorldMapReader.fromNetwork.Breaking Changes:
AttackFromEnum to AttackOriginEnum.ReceivesAttackFromEnum to AcceptableAttackOriginEnum.die to onDie in Attackable.revive to onRevive in Attackable.Fix keyboard param. #500. Thanks jakobodman123
- Update Flame to 1.17.0
Flame to 1.17.0- standardizes onLoad method. - adds size in EmptyWorldMap. - adds mixin FlipRender.
onLoad method.size in EmptyWorldMap.FlipRender.Adds moveAlongThePath method in PathFinding mixin.
moveAlongThePath method in PathFinding mixin.Vision mixin.Your coding agent can read these notes before it upgrades. Set up the MCP server →