game.Mushroom = (spec) => { spec.state = spec.state ?? 4; const {mushX, mushY} = spec; const objectSpec = {...spec}; objectSpec.x = mushX * objectSpec.width; objectSpec.y = mushY * objectSpec.height; const object = {...spec, ...game.Object(objectSpec)}; object.onBulletCollision = (bullet) => { if (bullet.alive) { object.state--; game.score += 5; game.sounds.mushroom_hit.load(); game.sounds.mushroom_hit.play(); } bullet.alive = false; }; object.draw = (elapsedTime) => { if (object.state) { object.sprite = object.poisoned ? game.sprites.poisonMushrooms[object.state-1] : game.sprites.regularMushrooms[object.state-1]; object.sprite.draw(elapsedTime, object); } } return object; }; game.Mushroom.toMushCoords = (coords) => { return {mushX: Math.ceil(coords.x / game.mushroomDims.width), mushY: Math.ceil(coords.y / game.mushroomDims.height)}; } game.Mushroom.toGameCoords = (mushCoords) => { return {x: mushCoords.mushX * game.mushroomDims.width, y: mushCoords.mushY * game.mushroomDims.height}; } game.Mushroom.generateMushrooms = (mushroomSpec) => { const mushPositions = new Set(); for (let i = 0; i < Math.max(Math.random(), 0.05) * game.height / mushroomSpec.height * game.width / mushroomSpec.width * game.level * 0.5; i++) { mushPositions.add(JSON.stringify([Math.floor(Math.random() * game.width / mushroomSpec.width), Math.max(1, Math.floor(Math.random() * (game.height / mushroomSpec.height - 3)))])); } return Array.from(mushPositions).map((pos) => { const [mushX, mushY] = JSON.parse(pos); return game.Mushroom({...mushroomSpec, mushX, mushY}); }); }