diff --git a/levels/jungle_level1.json b/levels/jungle_level1.json index b9cbc74e..fcf87cf3 100644 --- a/levels/jungle_level1.json +++ b/levels/jungle_level1.json @@ -1,130 +1,107 @@ { - "name": "Level 1", + "name": "Jungle - Level 1", "background": { "spriteId": 101, - "scrollSpeed": -50.0, + "scrollSpeed": -60.0, "tileWidth": 2584.0, "tileHeight": 720.0 }, "enemies": { - "smallEnemy": { - "hp": 15, - "speed": -100, - "size": { "w": 65, "h": 66 }, - "killScore": 30, - "sprite": "enemy", - "spriteId": 2, + "mosquito": { + "hp": 20, + "speed": -150, + "size": { "w": 33, "h": 22 }, + "killScore": 20, + "sprite": "enemy3", + "spriteId": 4, "shoot": { "type": "straight", - "cooldown": 2.0, - "projectileSpeed": 130, - "damage": 50, - "muzzle": { "x": -20, "y": 50 }, + "cooldown": 1.5, + "projectileSpeed": 180, + "damage": 30, + "muzzle": { "x": -20, "y": 15 }, "projectileSpriteId": 9 + }, + "movement": { + "type": "zigzag", + "params": { + "amplitude": 80.0, + "frequency": 1.0 + } } }, - "mediumEnemy": { - "hp": 40, - "speed": -70, + "jungleSoldier": { + "hp": 50, + "speed": -80, "size": { "w": 65, "h": 49 }, - "killScore": 50, + "killScore": 60, "sprite": "enemy2", "spriteId": 3, "shoot": { "type": "diagonal", - "angles": [-15, 15], - "cooldown": 2.0, - "projectileSpeed": 100, - "damage": 50, + "angles": [-10, 10], + "cooldown": 1.8, + "projectileSpeed": 120, + "damage": 40, "muzzle": { "x": -20, "y": 35 }, "projectileSpriteId": 9 } }, - "mediumEnemyTriple": { - "hp": 40, - "speed": -70, - "size": { "w": 65, "h": 49 }, - "killScore": 65, - "sprite": "enemy2", - "spriteId": 3, - "shoot": { - "type": "diagonal", - "angles": [-25, 0, 25], - "cooldown": 2.2, - "projectileSpeed": 110, - "damage": 50, - "muzzle": { "x": -20, "y": 35 }, - "projectileSpriteId": 12 - } - }, - "groupEnemy": { + "infantrinsect": { "type": "group", "members": [ { - "enemyType": "mediumEnemy", - "offset": { "x": 0, "y": 0 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": -130 } + "enemyType": "mosquito", + "offset": { "x": 0, "y": -150 } }, { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": 130 } - } - ] - }, - "groupEnemy2": { - "type": "group", - "members": [ - { - "enemyType": "mediumEnemy", - "offset": { "x": -90, "y": 110 } + "enemyType": "mosquito", + "offset": { "x": 0, "y": -75 } }, { - "enemyType": "mediumEnemy", - "offset": { "x": -90, "y": -110 } + "enemyType": "mosquito", + "offset": { "x": 200, "y": -30 } }, { - "enemyType": "mediumEnemy", - "offset": { "x": 90, "y": 110 } + "enemyType": "mosquito", + "offset": { "x": 0, "y": 0 } }, { - "enemyType": "mediumEnemy", - "offset": { "x": 90, "y": -110 } + "enemyType": "mosquito", + "offset": { "x": 200, "y": 30 } }, { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": 0 } + "enemyType": "mosquito", + "offset": { "x": 0, "y": 75 } }, { - "enemyType": "smallEnemy", - "offset": { "x": 150, "y": 0 } + "enemyType": "mosquito", + "offset": { "x": 0, "y": 150 } } ] }, - "groupEnemy3": { + "jungleCommander": { "type": "group", "members": [ { - "enemyType": "mediumEnemy", + "enemyType": "jungleSoldier", "offset": { "x": 0, "y": 0 } }, { - "enemyType": "smallEnemy", - "offset": { "x": -160, "y": -120 } + "enemyType": "mosquito", + "offset": { "x": 0, "y": -50 } }, { - "enemyType": "smallEnemy", - "offset": { "x": -160, "y": 120 } + "enemyType": "jungleSoldier", + "offset": { "x": 0, "y": -100 } }, { - "enemyType": "smallEnemy", - "offset": { "x": 160, "y": -120 } + "enemyType": "mosquito", + "offset": { "x": 0, "y": 50 } }, { - "enemyType": "smallEnemy", - "offset": { "x": 160, "y": 120 } + "enemyType": "jungleSoldier", + "offset": { "x": 0, "y": 100 } } ] } @@ -133,91 +110,130 @@ "gravityWell": { "spriteId": 15, "size": { "w": 34, "h": 34 }, - "pullStrength": 250, - "damagePerSecond": 10, - "radius": 140, + "pullStrength": 200, + "damagePerSecond": 15, + "radius": 130, "innerRadius": 50 } }, - "duration": 95, + "duration": 90, "waves": [ { - "time": 1, - "enemies": { "smallEnemy": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 2, + "enemies": { "mosquito": 3 }, + "spawnPattern": "spread" }, { "time": 6, - "enemies": { "smallEnemy": 2 }, + "enemies": { "jungleSoldier": 2 }, + "spawnPattern": "spread" + }, + { + "time": 13, + "enemies": {}, + "obstacleType": "gravityWell", + "obstacleY": 400, + "obstacleX": 600 + }, + { + "time": 10, + "enemies": { "mosquito": 4 }, + "spawnPattern": "spread" + }, + { + "time": 14, + "enemies": { "jungleSoldier": 3 }, + "spawnPattern": "spread" + }, + { + "time": 26, + "enemies": { "mosquito": 2 }, + "spawnPattern": "spread" + }, + { + "time": 30, + "enemies": { "mosquito": 3 }, "spawnPattern": "spread" }, { - "time": 9, - "enemies": { "smallEnemy": 3 }, + "time": 34, + "enemies": { "mosquito": 2 }, "spawnPattern": "spread" }, { - "time": 15, + "time": 32, "enemies": {}, "obstacleType": "gravityWell", - "obstacleY": 360, - "obstacleX": 500 + "obstacleY": 234, + "obstacleX": 67 }, { - "time": 16, - "enemies": { "smallEnemy": 2 }, - "spawnPattern": "spread" + "time": 34, + "enemies": {}, + "obstacleType": "gravityWell", + "obstacleY": 567, + "obstacleX": 189 }, { - "time": 19, - "enemies": { "mediumEnemy": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 36, + "enemies": {}, + "obstacleType": "gravityWell", + "obstacleY": 345, + "obstacleX": 245 }, { - "time": 24, - "enemies": { "groupEnemy": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 38, + "enemies": {}, + "obstacleType": "gravityWell", + "obstacleY": 456, + "obstacleX": 112 + }, + { + "time": 40, + "enemies": {}, + "obstacleType": "gravityWell", + "obstacleY": 278, + "obstacleX": 298 }, { - "time": 29, + "time": 42, + "enemies": {}, "obstacleType": "gravityWell", - "obstacleY": 100, - "obstacleX": 250, - "enemies": { "groupEnemy2": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "obstacleY": 589, + "obstacleX": 156 }, { - "time": 37, - "enemies": { "groupEnemy3": 1 }, + "time": 44, + "enemies": {}, + "obstacleType": "gravityWell", + "obstacleY": 412, + "obstacleX": 73 + }, + { + "time": 40, + "enemies": { "infantrinsect": 1 }, "spawnPattern": "line", "spawnY": 360 }, { - "time": 50, - "enemies": { "mediumEnemyTriple": 3 }, - "spawnPattern": "spread" + "time": 45, + "powerUp": { "type": "power_up_attached" } }, { - "time": 65, - "enemies": { "groupEnemy3": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 55, + "enemies": { "jungleSoldier": 4 }, + "spawnPattern": "spread" }, { - "time": 80, - "enemies": { "groupEnemy3": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 68, + "enemies": { "mosquito": 6 }, + "spawnPattern": "spread" }, { - "time": 83, - "enemies": { "groupEnemy3": 1 }, + "time": 68, + "enemies": { "jungleCommander": 1 }, "spawnPattern": "line", "spawnY": 360 } ] -} +} \ No newline at end of file diff --git a/levels/jungle_level2.json b/levels/jungle_level2.json index 665248ab..d866fff6 100644 --- a/levels/jungle_level2.json +++ b/levels/jungle_level2.json @@ -1,267 +1,142 @@ { - "name": "Level 2", + "name": "Jungle - Level 2", "background": { "spriteId": 101, - "scrollSpeed": -50.0, + "scrollSpeed": -70.0, "tileWidth": 2584.0, "tileHeight": 720.0 }, "enemies": { - "smallEnemy": { - "hp": 15, - "speed": -100, - "size": { "w": 65, "h": 66 }, - "killScore": 30, - "sprite": "enemy", - "spriteId": 2, + "hunter": { + "hp": 20, + "speed": -150, + "size": { "w": 33, "h": 22 }, + "killScore": 40, + "sprite": "enemy3", + "spriteId": 4, "shoot": { "type": "straight", "cooldown": 2.0, - "projectileSpeed": 130, - "damage": 50, - "muzzle": { "x": -20, "y": 50 }, + "projectileSpeed": 180, + "damage": 40, + "muzzle": { "x": -20, "y": 15 }, "projectileSpriteId": 9 } }, - "mediumEnemy": { - "hp": 40, - "speed": -70, - "size": { "w": 65, "h": 49 }, + "pyrotechnician": { + "hp": 30, + "speed": -100, + "size": { "w": 65, "h": 66 }, "killScore": 50, - "sprite": "enemy2", - "spriteId": 3, + "sprite": "enemy", + "spriteId": 2, "shoot": { "type": "diagonal", "angles": [-15, 15], - "cooldown": 2.0, + "cooldown": 2.5, "projectileSpeed": 100, "damage": 50, - "muzzle": { "x": -20, "y": 35 }, + "muzzle": { "x": -20, "y": 15 }, "projectileSpriteId": 9 } }, - "mediumEnemyTriple": { - "hp": 40, - "speed": -70, + "heavyGunner": { + "hp": 80, + "speed": -60, "size": { "w": 65, "h": 49 }, - "killScore": 65, + "killScore": 100, "sprite": "enemy2", "spriteId": 3, "shoot": { "type": "diagonal", - "angles": [-25, 0, 25], - "cooldown": 2.2, + "angles": [-30, -10, 10, 30], + "cooldown": 2.5, "projectileSpeed": 110, "damage": 50, "muzzle": { "x": -20, "y": 35 }, "projectileSpriteId": 12 } }, - "fastEnemy": { - "hp": 10, - "speed": -165, - "size": { "w": 33, "h": 22 }, - "killScore": 10, - "sprite": "enemy3", - "spriteId": 4, - "shoot": { - "type": "straight", - "cooldown": 0.8, - "projectileSpeed": 160, - "damage": 50, - "muzzle": { "x": -20, "y": 15 }, - "projectileSpriteId": 9 - }, - "movement": { - "type": "zigzag", - "params": { - "amplitude": 50.0, - "frequency": 0.3 - } - } - }, - "groupEnemy": { - "type": "group", - "members": [ - { - "enemyType": "mediumEnemy", - "offset": { "x": 0, "y": 0 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": -130 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": 130 } - } - ] - }, - "groupEnemy2": { - "type": "group", - "members": [ - { - "enemyType": "mediumEnemy", - "offset": { "x": -90, "y": 110 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": -90, "y": -110 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": 90, "y": 110 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": 90, "y": -110 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": 0 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 150, "y": 0 } - } - ] - }, - "groupEnemy3": { + "ambushSquad": { "type": "group", "members": [ - { - "enemyType": "mediumEnemy", - "offset": { "x": 0, "y": 0 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": -160, "y": -120 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": -160, "y": 120 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 160, "y": -120 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 160, "y": 120 } - } - ] - }, - "groupEnemy4": { - "type": "group", - "members": [ - { - "enemyType": "fastEnemy", - "offset": { "x": -200, "y": -180 } - }, - { - "enemyType": "fastEnemy", - "offset": { "x": -100, "y": -20 } - }, - { - "enemyType": "fastEnemy", - "offset": { "x": 0, "y": 140 } - }, - { - "enemyType": "fastEnemy", - "offset": { "x": 150, "y": 140 } - }, - { - "enemyType": "fastEnemy", - "offset": { "x": 250, "y": -20 } - }, - { - "enemyType": "fastEnemy", - "offset": { "x": 350, "y": -180 } - } + { "enemyType": "heavyGunner", "offset": { "x": 0, "y": 0 } }, + { "enemyType": "hunter", "offset": { "x": -50, "y": -100 } }, + { "enemyType": "hunter", "offset": { "x": -50, "y": 100 } }, + { "enemyType": "pyrotechnician", "offset": { "x": -100, "y": 0 } }, + { "enemyType": "pyrotechnician", "offset": { "x": -150, "y": -150 } }, + { "enemyType": "pyrotechnician", "offset": { "x": -150, "y": 150 } } ] } }, "obstacles": { - "gravityWell": { + "vineTrap": { "spriteId": 15, "size": { "w": 34, "h": 34 }, - "pullStrength": 200, - "damagePerSecond": 10, - "radius": 130, + "pullStrength": 220, + "damagePerSecond": 20, + "radius": 150, "innerRadius": 50 } }, - "duration": 95, + "duration": 100, "waves": [ { - "time": 6, - "enemies": { "smallEnemy": 4 }, + "time": 4, + "enemies": { "hunter": 4 }, "spawnPattern": "spread" }, { - "time": 9, - "enemies": { "smallEnemy": 3 }, + "time": 4, + "enemies": { "pyrotechnician": 4 }, "spawnPattern": "spread" }, { - "time": 15, - "enemies": {}, - "obstacleType": "gravityWell", - "obstacleY": 360, - "obstacleX": 500 + "time": 10, + "enemies": { "heavyGunner": 2 }, + "spawnPattern": "spread" , + "spawnY": 300 }, { - "time": 16, - "enemies": { "smallEnemy": 2 }, + "time": 18, + "obstacleType": "vineTrap", + "obstacleY": 200, + "obstacleX": 600, + "enemies": { "hunter": 3 }, "spawnPattern": "spread" }, { - "time": 17, - "powerUp": { "type": "shield" } + "time": 25, + "enemies": { "ambushSquad": 1 }, + "spawnPattern": "spread", + "spawnY": 400 }, { - "time": 19, - "enemies": { "mediumEnemy": 3 }, - "spawnPattern": "line", - "spawnY": 360 - }, - { - "time": 24, - "enemies": { "groupEnemy": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 35, + "powerUp": { "type": "shield" } }, { - "time": 29, - "obstacleType": "gravityWell", - "obstacleY": 355, - "obstacleX": 250, - "enemies": { "groupEnemy2": 1 }, - "spawnPattern": "line", - "spawnY": 455 + "time": 40, + "powerUp": { "type": "power_up_attached" } }, { - "time": 37, - "enemies": { "groupEnemy3": 1 }, + "time": 45, + "obstacleType": "vineTrap", + "obstacleY": 500, + "obstacleX": 500, + "enemies": { "ambushSquad": 1 }, "spawnPattern": "line", - "spawnY": 360 - }, - { - "time": 50, - "enemies": { "fastEnemy": 3 }, - "spawnPattern": "spread" + "spawnY": 200 }, { "time": 65, - "enemies": { "groupEnemy4": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "enemies": { "heavyGunner": 3 }, + "spawnPattern": "spread" }, { "time": 80, - "enemies": { "groupEnemy3": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "enemies": { "ambushSquad": 1 }, + "spawnPattern": "spread" } ] -} +} \ No newline at end of file diff --git a/levels/jungle_level3.json b/levels/jungle_level3.json index 6b8d810c..5963951c 100644 --- a/levels/jungle_level3.json +++ b/levels/jungle_level3.json @@ -1,256 +1,152 @@ { - "name": "Level 3", + "name": "Jungle - Level 3", "background": { "spriteId": 101, - "scrollSpeed": -50.0, + "scrollSpeed": -80.0, "tileWidth": 2584.0, "tileHeight": 720.0 }, "enemies": { - "smallEnemy": { - "hp": 15, - "speed": -100, - "size": { "w": 65, "h": 66 }, - "killScore": 30, - "sprite": "enemy", - "spriteId": 2, + "mosquito": { + "hp": 20, + "speed": -150, + "size": { "w": 33, "h": 22 }, + "killScore": 20, + "sprite": "enemy3", + "spriteId": 4, "shoot": { "type": "straight", - "cooldown": 2.0, - "projectileSpeed": 130, - "damage": 50, - "muzzle": { "x": -20, "y": 50 }, + "cooldown": 1.5, + "projectileSpeed": 180, + "damage": 30, + "muzzle": { "x": -20, "y": 15 }, "projectileSpriteId": 9 + }, + "movement": { + "type": "zigzag", + "params": { + "amplitude": 80.0, + "frequency": 1.0 + } } }, - "mediumEnemy": { - "hp": 40, - "speed": -70, - "size": { "w": 65, "h": 49 }, - "killScore": 50, - "sprite": "enemy2", - "spriteId": 3, + "eliteMosquito": { + "hp": 30, + "speed": -180, + "size": { "w": 33, "h": 22 }, + "killScore": 30, + "sprite": "enemy3", + "spriteId": 4, "shoot": { "type": "diagonal", "angles": [-15, 15], "cooldown": 2.0, - "projectileSpeed": 100, - "damage": 50, - "muzzle": { "x": -20, "y": 35 }, + "projectileSpeed": 210, + "damage": 40, + "muzzle": { "x": -20, "y": 15 }, "projectileSpriteId": 9 } }, - "mediumEnemyTriple": { - "hp": 40, - "speed": -70, - "size": { "w": 65, "h": 49 }, - "killScore": 65, - "sprite": "enemy2", - "spriteId": 3, + "jungleSoldier": { + "hp": 60, + "speed": -100, + "size": { "w": 65, "h": 66 }, + "killScore": 80, + "sprite": "enemy", + "spriteId": 2, "shoot": { "type": "diagonal", - "angles": [-25, 0, 25], - "cooldown": 2.2, - "projectileSpeed": 110, + "angles": [-15, 15], + "cooldown": 1.5, + "projectileSpeed": 140, "damage": 50, - "muzzle": { "x": -20, "y": 35 }, - "projectileSpriteId": 12 + "muzzle": { "x": -20, "y": 50 }, + "projectileSpriteId": 9 } }, - "mediumEnemyWide": { - "hp": 45, - "speed": -70, - "size": { "w": 65, "h": 49 }, - "killScore": 80, - "sprite": "enemy2", - "spriteId": 3, + "eliteJungleSoldier": { + "hp": 80, + "speed": -100, + "size": { "w": 65, "h": 66 }, + "killScore": 100, + "sprite": "enemy", + "spriteId": 2, "shoot": { "type": "diagonal", - "angles": [-35, -15, 15, 35], - "cooldown": 2.6, - "projectileSpeed": 105, - "damage": 45, - "muzzle": { "x": -20, "y": 35 }, - "projectileSpriteId": 12 + "angles": [-15, 15, 0], + "cooldown": 1.0, + "projectileSpeed": 130, + "damage": 60, + "muzzle": { "x": -20, "y": 50 }, + "projectileSpriteId": 9 + }, + "movement": { + "type": "wave", + "params": { + "amplitude": 40.0, + "frequency": 0.2 + } } }, - "mediumEnemyFive": { - "hp": 50, - "speed": -70, + "heavyGunner": { + "hp": 100, + "speed": -75, "size": { "w": 65, "h": 49 }, - "killScore": 110, + "killScore": 150, "sprite": "enemy2", "spriteId": 3, "shoot": { "type": "diagonal", - "angles": [-40, -20, 0, 20, 40], - "cooldown": 3.0, - "projectileSpeed": 110, - "damage": 40, + "angles": [-30, -10, 10, 30], + "cooldown": 2.5, + "projectileSpeed": 100, + "damage": 70, "muzzle": { "x": -20, "y": 35 }, "projectileSpriteId": 12 } }, - "fastEnemy": { - "hp": 10, - "speed": -125, - "size": { "w": 33, "h": 22 }, - "killScore": 10, - "sprite": "enemy3", - "spriteId": 4, - "shoot": { - "type": "straight", - "cooldown": 0.8, - "projectileSpeed": 160, - "damage": 50, - "muzzle": { "x": -20, "y": 15 }, - "projectileSpriteId": 9 - }, - "movement": { - "type": "zigzag", - "params": { - "amplitude": 50.0, - "frequency": 0.5 - } - } - }, - "boss2": { - "hp": 3000, - "speed": -30, + "jungleBoss": { + "hp": 25500, + "speed": -40, "size": { "w": 130, "h": 50 }, - "killScore": 300, + "killScore": 1000, "sprite": "boss2", "spriteId": 31, "shoot": { - "type": "spread", - "bulletsNbr": 2, - "cooldown": 1.0, - "projectileSpeed": 150, - "damage": 15, + "type": "diagonal", + "angles": [-80, -40, -20, 0, 20, 40, 80], + "bulletsNbr": 3, + "cooldown": 1.2, + "projectileSpeed": 160, + "damage": 60, "muzzle": { "x": 65, "y": 25 }, "projectileSpriteId": 12 }, "phases": [ { - "hpThreshold": 2500, - "angles": [], + "hpThreshold": 20300, + "angles": [-90, -75, -40, -20, 0, 20, 40, 75, 90], "fireSpeedMultiplier": 1.0, "damageMultiplier": 1, "spriteId": 31 }, { - "hpThreshold": 1500, - "angles": [], - "fireSpeedMultiplier": 1.3, - "damageMultiplier": 3, - "spriteId": 31 - }, - { - "hpThreshold": 500, + "hpThreshold": 15000, "angles": [], "fireSpeedMultiplier": 1.5, - "damageMultiplier": 1, - "spriteId": 31 - } - ] - }, - "groupEnemy": { - "type": "group", - "members": [ - { - "enemyType": "mediumEnemy", - "offset": { "x": 0, "y": 0 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": -130 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": 130 } - } - ] - }, - "groupEnemy2": { - "type": "group", - "members": [ - { - "enemyType": "mediumEnemyTriple", - "offset": { "x": -90, "y": 110 } - }, - { - "enemyType": "mediumEnemyTriple", - "offset": { "x": -90, "y": -110 } - }, - { - "enemyType": "mediumEnemyTriple", - "offset": { "x": 90, "y": 110 } - }, - { - "enemyType": "mediumEnemyTriple", - "offset": { "x": 90, "y": -110 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": 0 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 150, "y": 0 } - } - ] - }, - "groupEnemy3": { - "type": "group", - "members": [ - { - "enemyType": "mediumEnemy", - "offset": { "x": 0, "y": 0 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": -160, "y": -120 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": -160, "y": 120 } - }, - { - "enemyType": "fastEnemy", - "offset": { "x": 160, "y": -120 } - }, - { - "enemyType": "fastEnemy", - "offset": { "x": 160, "y": 120 } - } - ] - }, - "groupEnemy4": { - "type": "group", - "members": [ - { - "enemyType": "mediumEnemy", - "offset": { "x": -200, "y": -180 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": -100, "y": -20 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": 0, "y": 140 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": 150, "y": 140 } + "damageMultiplier": 1.5, + "spriteId": 31, + "shootType": "homing", + "projectileSpriteId": 29 }, { - "enemyType": "mediumEnemy", - "offset": { "x": 250, "y": -20 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": 350, "y": -180 } + "hpThreshold": 10000, + "angles": [-180, -150, -120, -90, -60, -30, 0, 30, 60, 90, 120, 150, 180], + "fireSpeedMultiplier": 2.5, + "damageMultiplier": 2.0, + "spriteId": 31, + "shootType": "diagonal", + "projectileSpriteId": 12 } ] } @@ -265,101 +161,119 @@ "innerRadius": 50 } }, - "duration": 125, + "duration": 150, "waves": [ { - "time": 3, - "enemies": { "smallEnemy": 3 }, + "time": 5, + "enemies": { "mosquito": 5 }, "spawnPattern": "spread" }, { - "time": 6, - "enemies": { "fastEnemy": 4 }, + "time": 8, + "enemies": { "mosquito": 4 }, "spawnPattern": "spread" }, { - "time": 9, - "enemies": { "mediumEnemy": 3 }, + "time": 10, + "enemies": { "mosquito": 5 }, "spawnPattern": "spread" }, { "time": 15, - "enemies": {}, - "obstacleType": "gravityWell", - "obstacleY": 360, - "obstacleX": 500 + "powerUp": { "type": "power_up_attached" } }, { - "time": 15, - "enemies": {}, - "obstacleType": "gravityWell", - "obstacleY": 150, - "obstacleX": 700 + "time": 12, + "enemies": { "eliteMosquito": 4 }, + "spawnPattern": "spread" }, { "time": 16, - "enemies": { "fastEnemy": 4 }, + "enemies": { "eliteMosquito": 3 }, "spawnPattern": "spread" }, { - "time": 17, - "powerUp": { "type": "shield" } - }, + "time": 20, + "enemies": { "eliteMosquito": 4 }, + "spawnPattern": "spread", + "spawnY": 300 + }, { - "time": 19, - "enemies": { "mediumEnemyFive": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 25, + "obstacleType": "gravityWell", + "obstacleY": 200, + "obstacleX": 600, + "enemies": { "jungleSoldier": 3 }, + "spawnPattern": "spread" }, { - "time": 24, - "enemies": { "groupEnemy2": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 28, + "powerUp": { "type": "laser" } }, { "time": 29, + "enemies": { "jungleSoldier": 4 }, + "spawnPattern": "spread" + }, + { + "time": 35, "obstacleType": "gravityWell", - "obstacleY": 100, - "obstacleX": 250, - "enemies": { "groupEnemy3": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "obstacleY": 500, + "obstacleX": 600, + "enemies": { "eliteMosquito": 5 }, + "spawnPattern": "spread" }, { - "time": 37, - "enemies": { "groupEnemy2": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 41, + "enemies": { "jungleSoldier": 5 }, + "spawnPattern": "spread" + }, + { + "time": 45, + "enemies": { "heavyGunner": 2 }, + "spawnPattern": "spread" }, { "time": 50, - "enemies": { "mediumEnemyWide": 4 }, + "obstacleType": "gravityWell", + "obstacleY": 300, + "obstacleX": 500, + "enemies": { "jungleSoldier": 4 }, "spawnPattern": "spread" }, { "time": 55, - "enemies": { "groupEnemy2": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "enemies": { "heavyGunner": 3 }, + "spawnPattern": "spread" }, { - "time": 65, - "enemies": { "groupEnemy4": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 58, + "powerUp": { "type": "shield" } }, { - "time": 80, - "enemies": { "groupEnemy3": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 60, + "enemies": { "eliteJungleSoldier": 3 }, + "spawnPattern": "spread" + }, + { + "time": 70, + "enemies": { "jungleSoldier": 2 }, + "spawnPattern": "spread" + }, + { + "time": 72, + "enemies": { "eliteJungleSoldier": 3 }, + "spawnPattern": "spread" }, { "time": 90, - "enemies": { "boss2": 1 }, + "enemies": { "jungleBoss": 1 }, "spawnPattern": "line", "spawnY": 360 + }, + { + "time": 125, + "powerUp": { "type": "power_up_attached" } } ] -} +} \ No newline at end of file diff --git a/levels/ruins_level1.json b/levels/ruins_level1.json index b0acbe76..cb831355 100644 --- a/levels/ruins_level1.json +++ b/levels/ruins_level1.json @@ -6,6 +6,19 @@ "tileWidth": 1148.0, "tileHeight": 223.0 }, + "walls": [ + { + "spriteId": 103, + "scrollSpeed": -50.0, + "tileWidth": 2540.0, + "tileHeight": 207.0, + "depth": 1, + "collisionBoxes": [ + { "w": 2540.0, "h": 40.0, "x": 0.0, "y": 0.0 }, + { "w": 2540.0, "h": 50.0, "x": 0.0, "y": 700.0 } + ] + } + ], "enemies": { "smallEnemy": { "hp": 15, diff --git a/levels/ruins_level2.json b/levels/ruins_level2.json index ead068a5..7b0ee4c4 100644 --- a/levels/ruins_level2.json +++ b/levels/ruins_level2.json @@ -6,6 +6,19 @@ "tileWidth": 1148.0, "tileHeight": 223.0 }, + "walls": [ + { + "spriteId": 103, + "scrollSpeed": -50.0, + "tileWidth": 2540.0, + "tileHeight": 207.0, + "depth": 1, + "collisionBoxes": [ + { "w": 2540.0, "h": 40.0, "x": 0.0, "y": 0.0 }, + { "w": 2540.0, "h": 50.0, "x": 0.0, "y": 700.0 } + ] + } + ], "enemies": { "smallEnemy": { "hp": 15, diff --git a/levels/ruins_level3.json b/levels/ruins_level3.json index 2ac8851c..92dc1f28 100644 --- a/levels/ruins_level3.json +++ b/levels/ruins_level3.json @@ -20,386 +20,262 @@ } ], "enemies": { - "smallEnemy": { - "hp": 15, - "speed": -100, - "size": { "w": 65, "h": 66 }, - "killScore": 30, - "sprite": "enemy", - "spriteId": 2, - "shoot": { - "type": "straight", - "cooldown": 2.0, - "projectileSpeed": 130, - "damage": 50, - "muzzle": { "x": -20, "y": 50 }, - "projectileSpriteId": 9 - } - }, - "mediumEnemy": { + "voidCrawler": { "hp": 40, - "speed": -70, - "size": { "w": 65, "h": 49 }, - "killScore": 50, - "sprite": "enemy2", - "spriteId": 3, + "speed": -180, + "size": { "w": 33, "h": 22 }, + "killScore": 80, + "sprite": "enemy3", + "spriteId": 4, "shoot": { "type": "diagonal", - "angles": [-15, 15], - "cooldown": 2.0, - "projectileSpeed": 100, - "damage": 50, - "muzzle": { "x": -20, "y": 35 }, + "angles": [-20, 20], + "cooldown": 0.5, + "projectileSpeed": 180, + "damage": 40, + "muzzle": { "x": -20, "y": 15 }, "projectileSpriteId": 9 + }, + "movement": { + "type": "zigzag", + "params": { + "amplitude": 60.0, + "frequency": 2.0 + } } }, - "mediumEnemyTriple": { - "hp": 40, - "speed": -70, - "size": { "w": 65, "h": 49 }, - "killScore": 65, - "sprite": "enemy2", - "spriteId": 3, - "shoot": { - "type": "diagonal", - "angles": [-25, 0, 25], - "cooldown": 2.2, - "projectileSpeed": 110, - "damage": 50, - "muzzle": { "x": -20, "y": 35 }, - "projectileSpriteId": 12 - } - }, - "mediumEnemyWide": { - "hp": 45, - "speed": -70, - "size": { "w": 65, "h": 49 }, - "killScore": 80, - "sprite": "enemy2", - "spriteId": 3, + "ancientSentinel": { + "hp": 250, + "speed": -30, + "size": { "w": 65, "h": 66 }, + "killScore": 300, + "sprite": "enemy", + "spriteId": 2, "shoot": { - "type": "diagonal", - "angles": [-35, -15, 15, 35], - "cooldown": 2.6, - "projectileSpeed": 105, - "damage": 45, - "muzzle": { "x": -20, "y": 35 }, - "projectileSpriteId": 12 + "type": "homing", + "cooldown": 3.0, + "projectileSpeed": 120, + "damage": 40, + "muzzle": { "x": -20, "y": 50 }, + "projectileSpriteId": 29 } }, - "mediumEnemyFive": { - "hp": 50, - "speed": -70, + "chaosOrb": { + "hp": 100, + "speed": -80, "size": { "w": 65, "h": 49 }, - "killScore": 110, + "killScore": 150, "sprite": "enemy2", "spriteId": 3, "shoot": { "type": "diagonal", - "angles": [-40, -20, 0, 20, 40], - "cooldown": 3.0, - "projectileSpeed": 110, - "damage": 40, + "angles": [-135, -90, -45, 0, 45, 90, 135], + "cooldown": 2.0, + "projectileSpeed": 140, + "damage": 50, "muzzle": { "x": -20, "y": 35 }, "projectileSpriteId": 12 } }, - "fastEnemy": { - "hp": 10, - "speed": -125, - "size": { "w": 33, "h": 22 }, - "killScore": 10, - "sprite": "enemy3", - "spriteId": 4, - "shoot": { - "type": "straight", - "cooldown": 0.8, - "projectileSpeed": 160, - "damage": 50, - "muzzle": { "x": -20, "y": 15 }, - "projectileSpriteId": 9 - }, - "movement": { - "type": "zigzag", - "params": { - "amplitude": 50.0, - "frequency": 0.5 - } - } - }, - "boss3": { - "hp": 4998, + "finalBoss": { + "hp": 50000, "speed": -30, "size": { "w": 160, "h": 213 }, - "killScore": 300, + "killScore": 10000, "sprite": "boss3P1", "spriteId": 22, "shoot": { "type": "homing", "cooldown": 4.0, "projectileSpeed": 130, - "damage": 50, + "damage": 60, "muzzle": { "x": 60, "y": 70 }, "projectileSpriteId": 29 }, "phases": [ { - "hpThreshold": 4998, + "hpThreshold": 40000, "angles": [], "fireSpeedMultiplier": 1.0, "damageMultiplier": 1, "spriteId": 22 }, { - "hpThreshold": 4284, - "angles": [], - "fireSpeedMultiplier": 1.0, + "hpThreshold": 30000, + "angles": [-20, 20], + "fireSpeedMultiplier": 1.1, "damageMultiplier": 1, - "spriteId": 23 + "spriteId": 23, + "shootType": "diagonal", + "projectileSpriteId": 12 }, { - "hpThreshold": 3570, - "angles": [], + "hpThreshold": 25000, + "angles": [-30, 0, 30], "fireSpeedMultiplier": 1.2, - "damageMultiplier": 2, - "spriteId": 24 + "damageMultiplier": 1.2, + "spriteId": 24, + "shootType": "diagonal", + "projectileSpriteId": 12 }, { - "hpThreshold": 2856, - "angles": [], - "fireSpeedMultiplier": 1.5, - "damageMultiplier": 2, + "hpThreshold": 20000, + "angles": [-45, -15, 15, 45], + "fireSpeedMultiplier": 1.4, + "damageMultiplier": 1.5, "spriteId": 25 }, { - "hpThreshold": 2142, - "angles": [], - "fireSpeedMultiplier": 1.5, - "damageMultiplier": 3, + "hpThreshold": 15000, + "angles": [-60, -30, 0, 30, 60], + "fireSpeedMultiplier": 1.6, + "damageMultiplier": 2.0, "spriteId": 26 }, { - "hpThreshold": 1428, - "angles": [], + "hpThreshold": 10000, + "angles": [-90, -45, 0, 45, 90], "fireSpeedMultiplier": 2.0, - "damageMultiplier": 3, + "damageMultiplier": 2.5, "spriteId": 27 }, { - "hpThreshold": 714, - "angles": [], - "fireSpeedMultiplier": 2.0, - "damageMultiplier": 4, + "hpThreshold": 5000, + "angles": [-180, -90, 0, 90, 180], + "fireSpeedMultiplier": 3.0, + "damageMultiplier": 3.0, "spriteId": 28 } ] }, - "groupEnemy": { + "eliteSquad": { "type": "group", "members": [ { - "enemyType": "mediumEnemy", + "enemyType": "ancientSentinel", "offset": { "x": 0, "y": 0 } }, { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": -130 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": 130 } - } - ] - }, - "groupEnemy2": { - "type": "group", - "members": [ - { - "enemyType": "mediumEnemyTriple", - "offset": { "x": -90, "y": 110 } + "enemyType": "voidCrawler", + "offset": { "x": -50, "y": -100 } }, { - "enemyType": "mediumEnemyTriple", - "offset": { "x": -90, "y": -110 } + "enemyType": "voidCrawler", + "offset": { "x": -50, "y": 100 } }, { - "enemyType": "mediumEnemyTriple", - "offset": { "x": 90, "y": 110 } + "enemyType": "chaosOrb", + "offset": { "x": 100, "y": 0 } }, { - "enemyType": "mediumEnemyTriple", - "offset": { "x": 90, "y": -110 } + "enemyType": "voidCrawler", + "offset": { "x": -150, "y": -150 } }, { - "enemyType": "smallEnemy", - "offset": { "x": 0, "y": 0 } - }, - { - "enemyType": "smallEnemy", - "offset": { "x": 150, "y": 0 } + "enemyType": "voidCrawler", + "offset": { "x": -150, "y": 150 } } ] }, - "groupEnemy3": { + "bossTroop": { "type": "group", "members": [ { - "enemyType": "mediumEnemy", - "offset": { "x": 0, "y": 0 } + "enemyType": "ancientSentinel", + "offset": { "x": -200, "y": -150 } }, { - "enemyType": "smallEnemy", - "offset": { "x": -160, "y": -120 } + "enemyType": "ancientSentinel", + "offset": { "x": -200, "y": 150 } }, { - "enemyType": "smallEnemy", - "offset": { "x": -160, "y": 120 } - }, - { - "enemyType": "fastEnemy", - "offset": { "x": 160, "y": -120 } - }, - { - "enemyType": "fastEnemy", - "offset": { "x": 160, "y": 120 } - } - ] - }, - "groupEnemy4": { - "type": "group", - "members": [ - { - "enemyType": "mediumEnemy", - "offset": { "x": -200, "y": -180 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": -100, "y": -20 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": 0, "y": 140 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": 150, "y": 140 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": 250, "y": -20 } - }, - { - "enemyType": "mediumEnemy", - "offset": { "x": 350, "y": -180 } + "enemyType": "chaosOrb", + "offset": { "x": -100, "y": 0 } } ] } }, "obstacles": { - "gravityWell": { + "singularity": { "spriteId": 15, "size": { "w": 34, "h": 34 }, - "pullStrength": 200, - "damagePerSecond": 10, - "radius": 130, + "pullStrength": 400, + "damagePerSecond": 50, + "radius": 220, "innerRadius": 50 } }, - "duration": 125, + "duration": 150, "waves": [ { - "time": 3, - "enemies": { "smallEnemy": 3 }, - "spawnPattern": "spread" - }, - { - "time": 6, - "enemies": { "fastEnemy": 4 }, + "time": 5, + "enemies": { "voidCrawler": 5 }, "spawnPattern": "spread" }, { - "time": 9, - "enemies": { "mediumEnemy": 3 }, + "time": 12, + "enemies": { "chaosOrb": 3 }, "spawnPattern": "spread" }, { "time": 15, - "enemies": {}, - "obstacleType": "gravityWell", - "obstacleY": 360, - "obstacleX": 500 + "powerUp": { "type": "shield" } }, { - "time": 15, - "enemies": {}, - "obstacleType": "gravityWell", - "obstacleY": 150, - "obstacleX": 700 + "time": 25, + "enemies": { "eliteSquad": 1 }, + "spawnPattern": "line", + "spawnY": 360 }, { - "time": 16, - "enemies": { "fastEnemy": 4 }, + "time": 30, + "obstacleType": "singularity", + "obstacleY": 200, + "obstacleX": 600, + "enemies": { "voidCrawler": 4 }, "spawnPattern": "spread" }, { - "time": 17, + "time": 45, "powerUp": { "type": "laser" } }, { - "time": 19, - "enemies": { "mediumEnemyFive": 1 }, - "spawnPattern": "line", - "spawnY": 360 - }, - { - "time": 24, - "enemies": { "groupEnemy2": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 55, + "enemies": { "ancientSentinel": 2 }, + "spawnPattern": "spread" }, { - "time": 29, - "obstacleType": "gravityWell", - "obstacleY": 100, - "obstacleX": 250, - "enemies": { "groupEnemy3": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 70, + "enemies": { "eliteSquad": 1 }, + "spawnPattern": "spread" }, { - "time": 37, - "enemies": { "groupEnemy2": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 80, + "powerUp": { "type": "power_up_attached" } }, { - "time": 50, - "enemies": { "mediumEnemyWide": 4 }, + "time": 90, + "obstacleType": "singularity", + "obstacleY": 500, + "obstacleX": 500, + "enemies": { "chaosOrb": 5 }, "spawnPattern": "spread" }, { - "time": 55, - "enemies": { "groupEnemy2": 1 }, - "spawnPattern": "line", - "spawnY": 360 + "time": 100, + "powerUp": { "type": "shield" } }, { - "time": 65, - "enemies": { "groupEnemy4": 1 }, + "time": 105, + "enemies": { "bossTroop": 1 }, "spawnPattern": "line", "spawnY": 360 }, { - "time": 80, - "enemies": { "groupEnemy3": 1 }, - "spawnPattern": "line", - "spawnY": 360 - }, - { - "time": 90, - "enemies": { "boss3": 1 }, + "time": 110, + "enemies": { "finalBoss": 1 }, "spawnPattern": "line", - "spawnY": 120 + "spawnY": 300 } ] -} +} \ No newline at end of file diff --git a/server/src/ecs/components/BossPhase.hpp b/server/src/ecs/components/BossPhase.hpp index 0c92e817..538bc935 100644 --- a/server/src/ecs/components/BossPhase.hpp +++ b/server/src/ecs/components/BossPhase.hpp @@ -7,7 +7,9 @@ #pragma once +#include #include +#include "AIShoot.hpp" namespace Ecs { @@ -18,11 +20,13 @@ namespace Ecs * fire speed multipliers, damage multipliers, and sprite IDs. */ struct BossPhaseData { - int healthThreshold; ///> Health threshold to enter this phase - std::vector anglesToAdd; ///> Additional attack angles for this phase - float fireSpeedMultiplier; ///> Multiplier for fire speed in this phase - int damageMultiplier; ///> Multiplier for damage in this phase - unsigned int spriteId = 0; ///> Sprite ID for this phase + int healthThreshold; ///> Health threshold to enter this phase + std::vector anglesToAdd; ///> Additional attack angles for this phase + float fireSpeedMultiplier; ///> Multiplier for fire speed in this phase + int damageMultiplier; ///> Multiplier for damage in this phase + unsigned int spriteId = 0; ///> Sprite ID for this phase + std::optional shootType; ///> Optional new shoot type for this phase + std::optional projectileSpriteId; ///> Optional new projectile sprite for this phase }; /** @brief Component representing the phase of a boss entity diff --git a/server/src/ecs/systems/boss/BossSystem.cpp b/server/src/ecs/systems/boss/BossSystem.cpp index ca97529a..4e59ad88 100644 --- a/server/src/ecs/systems/boss/BossSystem.cpp +++ b/server/src/ecs/systems/boss/BossSystem.cpp @@ -13,9 +13,9 @@ namespace Game { auto ® = world.registry(); - reg.view( + reg.view( [&](const Ecs::Entity e, Ecs::BossPhase &bossPhase, const Ecs::Health &health, const Ecs::Position &pos, - Ecs::MovementPattern &pattern, Ecs::Drawable &drawable) { + Ecs::MovementPattern &pattern, Ecs::Drawable &drawable, Ecs::WeaponConfig &weapon) { if (pos.x < 800.f) pattern.baseVx = 0.f; @@ -33,9 +33,12 @@ namespace Game if (currentPhase.damageMultiplier > 0) attack.at(static_cast(e))->damage = static_cast( attack.at(static_cast(e))->damage * currentPhase.damageMultiplier); - if (currentPhase.spriteId > 0) { + if (currentPhase.spriteId > 0) drawable.spriteId = currentPhase.spriteId; - } + if (currentPhase.shootType.has_value()) + attack.at(static_cast(e))->type = currentPhase.shootType.value(); + if (currentPhase.projectileSpriteId.has_value()) + weapon.projectileSpriteId = currentPhase.projectileSpriteId.value(); } } }); diff --git a/server/src/ecs/systems/boss/BossSystem.hpp b/server/src/ecs/systems/boss/BossSystem.hpp index cc9c9965..a38423f9 100644 --- a/server/src/ecs/systems/boss/BossSystem.hpp +++ b/server/src/ecs/systems/boss/BossSystem.hpp @@ -16,6 +16,7 @@ #include "MovementPattern.hpp" #include "Position.hpp" #include "Velocity.hpp" +#include "WeaponConfig.hpp" namespace Game { diff --git a/server/src/game/levels/levelManager/LevelManager.cpp b/server/src/game/levels/levelManager/LevelManager.cpp index 79a2f561..012b9442 100644 --- a/server/src/game/levels/levelManager/LevelManager.cpp +++ b/server/src/game/levels/levelManager/LevelManager.cpp @@ -113,6 +113,19 @@ namespace phase.fireSpeedMultiplier = phaseNode.value("fireSpeedMultiplier", 1.0f); phase.damageMultiplier = phaseNode.value("damageMultiplier", 1); phase.spriteId = phaseNode.value("spriteId", 0u); + if (phaseNode.contains("projectileSpriteId")) + phase.projectileSpriteId = phaseNode.value("projectileSpriteId", 0u); + if (phaseNode.contains("shootType")) { + std::string typeStr = phaseNode.value("shootType", std::string("")); + if (typeStr == "straight") + phase.shootType = Ecs::AIShoot::Type::Straight; + else if (typeStr == "diagonal") + phase.shootType = Ecs::AIShoot::Type::Diagonal; + else if (typeStr == "spread") + phase.shootType = Ecs::AIShoot::Type::Spread; + else if (typeStr == "homing") + phase.shootType = Ecs::AIShoot::Type::Homing; + } if (phaseNode.contains("angles") && phaseNode.at("angles").is_array()) { for (const auto &angle : phaseNode.at("angles")) { phase.anglesToAdd.push_back(angle.get()); @@ -122,11 +135,10 @@ namespace } } - if (defNode.contains("movement")) { + if (defNode.contains("movement")) def.movement = parseMovementDefinition(defNode.at("movement")); - } else { + else def.movement = parseMovementDefinition("straight"); - } level.enemyTypes[name] = def; } return !level.enemyTypes.empty(); diff --git a/server/src/game/world/World.cpp b/server/src/game/world/World.cpp index 1726ca88..d5d691a5 100644 --- a/server/src/game/world/World.cpp +++ b/server/src/game/world/World.cpp @@ -25,14 +25,24 @@ namespace const auto &projA = reg.hasComponent(static_cast(event.a)); const auto &bossPartB = reg.getComponents().at(event.b); - if (dmgA && projA && (hpArr.at(event.b) || bossPartB)) + if (dmgA && projA && (hpArr.at(event.b) || bossPartB)) { w->events().emit(DamageEvent{event.a, event.b, dmgA->amount}); + const auto &drawableA = reg.getComponents().at(event.a); + const auto &bossPhaseB = reg.getComponents().at(event.b); + if (drawableA && drawableA->spriteId == 9 && bossPhaseB) + w->events().emit(DestroyEvent{event.a, false}); + } const auto &dmgB = reg.getComponents().at(event.b); const auto &projB = reg.hasComponent(static_cast(event.b)); const auto &bossPartA = reg.getComponents().at(event.a); - if (dmgB && projB && (hpArr.at(event.a) || bossPartA)) + if (dmgB && projB && (hpArr.at(event.a) || bossPartA)) { w->events().emit(DamageEvent{event.b, event.a, dmgB->amount}); + const auto &drawableB = reg.getComponents().at(event.b); + const auto &bossPhaseA = reg.getComponents().at(event.a); + if (drawableB && drawableB->spriteId == 9 && bossPhaseA) + w->events().emit(DestroyEvent{event.b, false}); + } const auto &pixelCollisionA = reg.getComponents().at(event.a); if (pixelCollisionA && projB) { diff --git a/server/src/game/world/World.hpp b/server/src/game/world/World.hpp index f0fa0496..35a34254 100644 --- a/server/src/game/world/World.hpp +++ b/server/src/game/world/World.hpp @@ -10,6 +10,7 @@ #include "AIBrain.hpp" #include "Background.hpp" #include "BossPart.hpp" +#include "BossPhase.hpp" #include "BubblePowerUp.hpp" #include "Collision.hpp" #include "Controllable.hpp"