diff --git a/tests/wiring.test.mjs b/tests/wiring.test.mjs index 0d3b3f8..bc027e6 100644 --- a/tests/wiring.test.mjs +++ b/tests/wiring.test.mjs @@ -187,7 +187,7 @@ test('player and pirate broadsides use the cannonball image asset', async () => assert.match(source, /import cannonballUrl from '.\/assets\/cannonball\.png\?url'/); assert.match(source, /this\.load\.image\('cannonball', cannonballUrl\)/); - assert.match(source, /this\.fireBroadside\(this\.player, side, this\.playerShots, 'cannonball'/); + assert.match(source, /this\.fireBroadside\([\s\S]*?this\.player,[\s\S]*?this\.playerShots,[\s\S]*?'cannonball',[\s\S]*?this\.playerStats\?\.cannonDamage/); assert.match(source, /this\.fireBroadside\(pirate, side, this\.pirateShots, 'cannonball'/); assert.match(source, /shot\.setDepth\(8\)\.setDisplaySize\(14, 14\)/); assert.doesNotMatch(source, /generateTexture\('player-shot'/); @@ -202,7 +202,7 @@ test('pirate cannonballs damage other pirates but ignore their source ship', asy assert.match(source, /const pirateShot = playerShot \? null : resolveTaggedProjectile\(first, second, 'pirate'\)/); assert.match(source, /if \(projectileOwner === 'pirate' && sourceShip === pirate\) return/); assert.match(source, /friendlyFire: projectileOwner === 'pirate'/); - assert.match(source, /if \(projectileOwner === 'player'\) this\.defeated \+= 1/); + assert.match(source, /if \(projectileOwner === 'player'\) \{[\s\S]*?this\.defeated \+= 1;[\s\S]*?this\.spawnSalvageWreck\(/); }); test('player uses the four-frame north-facing sheet as a forward propulsion animation', async () => { @@ -216,7 +216,8 @@ test('player uses the four-frame north-facing sheet as a forward propulsion anim assert.match(source, /key: 'player-forward'/); assert.match(source, /generateFrameNumbers\('player-airship', \{ start: 0, end: 3 \}\)/); assert.match(source, /const forwardThrust = clamp\(this\.playerSpeed \/ PLAYER_MAX_SPEED, 0, 1\)/); - assert.match(source, /this\.player\.anims\.timeScale = 0\.65 \+ forwardThrust \* 1\.35/); + assert.match(source, /const effectiveForwardThrust = clamp\(this\.playerSpeed \/ stats\.maxSpeed, 0, 1\)/); + assert.match(source, /this\.player\.anims\.timeScale = 0\.65 \+ effectiveForwardThrust \* 1\.35/); assert.match(source, /this\.player\.setFrame\(0\)/); assert.doesNotMatch(source, /key: 'player-idle'/); }); @@ -229,7 +230,8 @@ test('player propulsion smoke emits at world engine positions with per-particle assert.match(source, /frequency: -1/); assert.match(source, /this\.updatePlayerSmoke\(deltaMs\)/); assert.match(source, /const forwardThrust = clamp\(this\.playerSpeed \/ PLAYER_MAX_SPEED, 0, 1\)/); - assert.match(source, /if \(this\.gameState !== 'playing' \|\| forwardThrust <= 0\.04\)/); + assert.match(source, /const effectiveForwardThrust = clamp\([\s\S]*?this\.playerStats\?\.maxSpeed \|\| PLAYER_MAX_SPEED[\s\S]*?\)/); + assert.match(source, /if \(this\.gameState !== 'playing' \|\| effectiveForwardThrust <= 0\.04\)/); assert.match(source, /const sternX = this\.player\.x - forwardX \* PLAYER_SMOKE_REAR_OFFSET/); assert.match(source, /const sternY = this\.player\.y - forwardY \* PLAYER_SMOKE_REAR_OFFSET/); assert.match(source, /PLAYER_SMOKE_ENGINE_OFFSET \* engineSide/); @@ -250,8 +252,9 @@ test('environment physics adds wind, soft island collision, turbulence, and proj assert.match(source, /this\.createEnvironmentPhysics\(\)/); assert.match(source, /this\.physics\.add\.staticImage/); assert.match(source, /obstacle\.body\.setCircle\(island\.radius\)/); - assert.match(source, /this\.physics\.add\.collider\(this\.player, obstacle, \(\) => \{[\s\S]*?this\.playerSpeed \*= 0\.7;/); - assert.match(source, /this\.physics\.add\.collider\(this\.pirates, obstacle\)/); + assert.match(source, /const islands = this\.world\?\.islands \|\| ENVIRONMENT_ISLANDS/); + assert.match(source, /this\.physics\.add\.overlap\(this\.player, obstacle, \(\) => \{[\s\S]*?this\.playerSpeed \*= 0\.985;/); + assert.doesNotMatch(source, /this\.physics\.add\.collider\(this\.pirates, obstacle\)/); assert.match(source, /this\.physics\.add\.overlap\(\s*this\.playerShots,[\s\S]*?this\.hitEnvironmentProjectile/); assert.match(source, /this\.environmentWind = environmentWindAt\(\{/); assert.match(source, /const pirateWind = environmentWindAt\(\{/); @@ -260,6 +263,23 @@ test('environment physics adds wind, soft island collision, turbulence, and proj assert.match(source, /windSpeed: this\.environmentWind\?\.strength/); }); +test('procedural world and ship progression are wired into live gameplay', async () => { + const source = await read('src/game-v4.js'); + + assert.match(source, /generateWorld\(\{/); + assert.match(source, /this\.player\.setPosition\(this\.world\.spawn\.x, this\.world\.spawn\.y\)/); + assert.match(source, /pirateSpawnPointsForWave\(/); + assert.match(source, /for \(const route of this\.world\.tradeRoutes\)/); + assert.match(source, /for \(const territory of this\.world\.pirateTerritories\)/); + assert.match(source, /this\.salvageWrecks = this\.physics\.add\.group\(\)/); + assert.match(source, /collectSalvageWreck\(/); + assert.match(source, /bestAffordableMarketUpgrade\(/); + assert.match(source, /buyAndInstallModule\(/); + assert.match(source, /installModule\(this\.progression, moduleId\)/); + assert.match(source, /this\.playerBroadsideReloadMs = this\.playerStats\.reloadMs/); + assert.match(source, /stats\.windExposure/); +}); + test('rolling clouds include large dense banks that phase in and out with the wind', async () => { const source = await read('src/game-v4.js');