flutter3d_game_shooter 0.8.0
flutter3d_game_shooter: ^0.8.0 copied to clipboard
The parts of a first-person shooter that are not parts of an engine: monsters, weapons, an inventory, and the step order that ties them together.
0.8.0 #
Moves with the stack to 0.8.0, whose flutter3d_hardware changes
PassEncoder.bindTexture to return bool and makes every backend forget its
bindings at bindPipeline. Nothing in this package changed.
Its flutter3d_* dependencies ask for ^0.8.0.
0.7.1 #
Released with the rest of the stack at 0.7.1. Nothing in this package changed. The release it resolves against builds from pub.dev again and no longer crashes Metal on the first unlit draw.
Its flutter3d_* dependencies ask for ^0.7.1, and it asks for vector_math ^2.4.3.
0.7.0 #
- Breaking. The readouts are in
bridge.dart.HealthBar,AmmoReadout,KeyPipsandReadoutStyleare widgets, and the simulation's barrel names no Flutter now; importpackage:flutter3d_game_shooter/bridge.dartfor them.WeaponViewwas there already.doc/boundary-0.7.0.mdhas the same move for the platformer and racing. - Breaking.
flutter3d_gameis no longer a dependency. The simulation importsflutter3d_simby name rather than throughflutter3d_game, which stopped re-exporting it. A game that reachedflutter3d_gameor a simulation type through this package's pubspec alone names them in its own. sample.dartgainsStaged,stage()andagentStartingInventory(). Promoted fromflutter3d_sim_mcp's ownstaging.dart— a fourth copy ofapps/flutter3d_demo_dungeon's composition, kept there only becausetool/structure.dart's "no package depends on an application" rule meant that package could not reach the original. It already depended on this one for the genre itself, so the composition moves to where it can be named once instead of copied. Deliberately smaller than the app's ownstage()— no mechanisms, no breaches, no automap — for the reason that copy's own doc comment already gave.package:flutter3d_game_shooter/staging.dart: the shipped game's assembly, and the game as aHeadlessGame. The fullstage(level, world, input:, registry:, inventory:)moved here fromapps/flutter3d_demo_dungeon/lib/src/staging.dart, with the automap and the breaches the copy above leaves out, andstartingInventory()is what a player starts a level holding.ShooterHeadlessGameimplementsflutter3d_sim'sHeadlessGameover the sample roster: itsnameisshooter, its one button isfire, andstartanswers aHeadlessRuna tool can step and read.ShooterHeadlessGame(extra:)takes entity kinds this package cannot know, which is how a level with awidget_surfaceentity in it loads headless. This library andsample.dartboth declare aStagedand astage, so a file that imports the two hides one pair.- A spawned monster carries the name its level gave it.
Bestiary.spawn(name:)passes an entity'snameto theActor, which is whatActorSystem.byNameandremapEntitySaveinflutter3d_sim0.7.0 read. - The monsters, the weapons, the inventory and the step order are otherwise
0.6.0's. The floors on
flutter3d,flutter3d_physicsandflutter3d_simare^0.7.0.
0.6.0 #
- Floors, and no code. The monsters, the weapons, the inventory and the step
order are byte for byte 0.5.1's. The four lines that changed are the floors on
flutter3d,flutter3d_game,flutter3d_physicsandflutter3d_sim, all^0.6.0— the versions this genre was built and tested against in the one resolve the workspace performs.
0.5.1 #
- The player's aim, the shotgun's spread, a wave's ring of spawn points and the
melee cone call
Portablerather thandart:math, so a run replays identically in a browser and on the VM. Seeflutter3d_sim0.5.1 for what that is and why. No API change; a saved run from 0.5.0 replays a hair differently in its last bits.
0.5.0 #
Breaking. Three closed types open, four per-step fields go, and the genre ships its readouts.
AmmoType,MonsterStateandWeaponBehaviourare open. A game written on this template can say its weapon fires cells, that its monster is fleeing, and that its shot is a beam that charges. Both enums losevalues: a list of everything that exists cannot be kept once anybody can add to it, and it was the wrong question —Arsenal.carryinganswers what a HUD wanted, and both restores read the names the file holds, which is what lets a game's own ammunition survive a round trip.firedThisStep,usedThisStep,damageTakenThisStep,foundThisStepandhitsare gone. What a game gets isGameSimulation.events, which carries two of anything and says what order it was in: a shotgun's eight pellets are eightShotLandedrather than a list read beside a flag.ChaseBrainsays what it does with a state it does not know: nothing. It leaves the monster where the game's own code put it, because a brain that guessed would fight the game for control of its monster.- Readouts, not a HUD.
HealthBar,AmmoReadoutandKeyPipstake the genre's own types, because pulling the numbers out is where every game got the same three details wrong — the fists printing0, armour drawn as a second bar, a key ring showing a key that had been used. Difficultyis read in two places: what the player deals, which multiplies with berserk rather than losing to it, and what the player takes, in the one method every source arrives at.- A second trigger.
WeaponDef.alternateis a wholeWeaponDef, so an alternate fire is described exactly as a weapon is. One cooldown, shared, because it is one weapon in one pair of hands;canFireAlternateis a second getter rather thancanFiregaining a parameter, because turning a published getter into a method is a change every caller has to make. - Magazines and reloading. Null by default, so a weapon without one is untouched by any of it. Per weapon rather than per arsenal — the first version shared one count, so a rifle would have been full because the pistol was. A weapon starts full, a reload never conjures rounds nobody carries, and the weapon stays selectable while it runs.
PatrolBrainandSpawner. A crypt whose monsters all stand still until seen reads as a museum; a room that can fill after the player is in it was entirely unavailable.ChaseBrainisbaseso a game can build on it the wayPatrolBraindoes.
0.4.1 #
- The sensor. A power-up that shows what walks behind the walls, as
silhouettes, for as long as it lasts:
PowerUpGift('sensor')in the sample gifts andInventory.hasSensorbeside the other two, which is the one power-up the renderer reads rather than the simulation. A gift rather than a setting so that seeing through a wall is a thing a level hands out and takes back. - The sample vocabulary speaks
reflection_probe.sampleRegistryincludesReflectionProbeKind, so a level of this game may place a probe per room and a key or a barrel in it reflects the torch-lit walls around it rather than a sky a crypt does not have.
0.4.0 #
- The weapon holder sits at its rest position from construction rather than
from the first simulation step, so the frame every start shows no longer
draws the weapon at the origin, inside the camera. The light it is drawn
under is the renderer's fix — the studio's own lights are uploaded now —
and
weapon_view_light_test.dartholds both.
0.3.0 #
ShooterPhasesnames the points inside the step a game can hang its own rules off, and the simulation announces every one of them unconditionally — a phase that exists only on levels with doors is a phase nobody can rely on.
0.2.0 #
- The parts of a first-person shooter that are not parts of an engine: monsters with brains, weapons with recoil and spread, hitscan and projectiles, keys, doors and a way down.
- Extracted from the game layer, which is what made the engine's boundaries real rather than asserted.