diff --git a/src/entities/ObstaclePlatformDisappearing.ts b/src/entities/obstacles/ObstaclePlatformDisappearing.ts similarity index 96% rename from src/entities/ObstaclePlatformDisappearing.ts rename to src/entities/obstacles/ObstaclePlatformDisappearing.ts index 0a892aa..2e32522 100644 --- a/src/entities/ObstaclePlatformDisappearing.ts +++ b/src/entities/obstacles/ObstaclePlatformDisappearing.ts @@ -1,5 +1,5 @@ import Phaser from "phaser"; -import { Platform } from "./Platform"; +import { Platform } from "../Platform"; export class ObstaclePlatformDisappearing extends Phaser.GameObjects.TileSprite { static readonly TRIGGER_DISTANCE = 110; diff --git a/src/entities/ObstacleSpikeNormal.ts b/src/entities/obstacles/ObstacleSpikeNormal.ts similarity index 100% rename from src/entities/ObstacleSpikeNormal.ts rename to src/entities/obstacles/ObstacleSpikeNormal.ts diff --git a/src/entities/ObstacleSpikeTricky.ts b/src/entities/obstacles/ObstacleSpikeTricky.ts similarity index 100% rename from src/entities/ObstacleSpikeTricky.ts rename to src/entities/obstacles/ObstacleSpikeTricky.ts diff --git a/src/entities/obstacles/index.ts b/src/entities/obstacles/index.ts new file mode 100644 index 0000000..c186b93 --- /dev/null +++ b/src/entities/obstacles/index.ts @@ -0,0 +1,3 @@ +export { ObstaclePlatformDisappearing } from "./ObstaclePlatformDisappearing"; +export { ObstacleSpikeNormal } from "./ObstacleSpikeNormal"; +export { ObstacleSpikeTricky } from "./ObstacleSpikeTricky"; diff --git a/src/levels/01_level.ts b/src/levels/01_level.ts new file mode 100644 index 0000000..85a288c --- /dev/null +++ b/src/levels/01_level.ts @@ -0,0 +1,19 @@ +import { defineLevel } from "../lib/levelTypes"; + +export const level01 = defineLevel("Ugorj a tüskén át", [ + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + ".E........^........P", + "####################", + "####################", +]); diff --git a/src/levels/02_level.ts b/src/levels/02_level.ts new file mode 100644 index 0000000..4cc664a --- /dev/null +++ b/src/levels/02_level.ts @@ -0,0 +1,19 @@ +import { defineLevel } from "../lib/levelTypes"; + +export const level02 = defineLevel("Csapda híd", [ + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + ".E.................P", + "#######~~~##########", + "#######~~~##########", +]); diff --git a/src/levels/03_level.ts b/src/levels/03_level.ts new file mode 100644 index 0000000..a60c50d --- /dev/null +++ b/src/levels/03_level.ts @@ -0,0 +1,19 @@ +import { defineLevel } from "../lib/levelTypes"; + +export const level03 = defineLevel("Csaló tüske és lépcső", [ + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + "....................", + ".E..................", + "#####...............", + "....#####...........", + "........#####.......", + "............#####...", + "...............####.", + ".........T........P#", + "####################", +]); diff --git a/src/levels/index.ts b/src/levels/index.ts new file mode 100644 index 0000000..648f638 --- /dev/null +++ b/src/levels/index.ts @@ -0,0 +1,6 @@ +import type { LevelDef } from "../lib/levelTypes"; +import { level01 } from "./01_level"; +import { level02 } from "./02_level"; +import { level03 } from "./03_level"; + +export const LEVELS: readonly LevelDef[] = [level01, level02, level03]; diff --git a/src/levels/levels.ts b/src/levels/levels.ts deleted file mode 100644 index 739799e..0000000 --- a/src/levels/levels.ts +++ /dev/null @@ -1,100 +0,0 @@ -export const TILE_SIZE = 40; -export const LEVEL_COLS = 20; -export const LEVEL_ROWS = 15; - -export enum TileType { - Empty = 0, - Platform = 1, - Player = 2, - Exit = 3, - DisappearingPlatform = 4, - Spike = 5, - TrickySpike = 6, -} - -export type LevelMatrix = TileType[][]; - -export interface LevelDef { - name: string; - matrix: LevelMatrix; -} - -const CHAR_TO_TILE: Record = { - ".": TileType.Empty, - "#": TileType.Platform, - "P": TileType.Player, - "E": TileType.Exit, - "~": TileType.DisappearingPlatform, - "^": TileType.Spike, - "T": TileType.TrickySpike, -}; - -function parseLevel(rows: string[]): LevelMatrix { - return rows.map((row, rowIdx) => - [...row].map((c, colIdx) => { - const tile = CHAR_TO_TILE[c]; - if (tile === undefined) { - throw new Error(`Invalid tile char '${c}' at row ${rowIdx}, col ${colIdx}`); - } - return tile; - }), - ); -} - -function defineLevel(name: string, rows: string[]): LevelDef { - return { name, matrix: parseLevel(rows) }; -} - -export const LEVELS: readonly LevelDef[] = [ - defineLevel("Ugorj a tüskén át", [ - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - ".E........^........P", - "####################", - "####################", - ]), - defineLevel("Csapda híd", [ - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - ".E.................P", - "#######~~~##########", - "#######~~~##########", - ]), - defineLevel("Csaló tüske és lépcső", [ - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - "....................", - ".E..................", - "#####...............", - "....#####...........", - "........#####.......", - "............#####...", - "...............####.", - ".........T........P#", - "####################", - ]), -]; diff --git a/src/levels/LevelLoader.ts b/src/lib/LevelLoader.ts similarity index 93% rename from src/levels/LevelLoader.ts rename to src/lib/LevelLoader.ts index 71d67d4..add9f29 100644 --- a/src/levels/LevelLoader.ts +++ b/src/lib/LevelLoader.ts @@ -2,10 +2,12 @@ import Phaser from "phaser"; import { Player } from "../entities/Player"; import { Exit } from "../entities/Exit"; import { Platform } from "../entities/Platform"; -import { ObstaclePlatformDisappearing } from "../entities/ObstaclePlatformDisappearing"; -import { ObstacleSpikeNormal } from "../entities/ObstacleSpikeNormal"; -import { ObstacleSpikeTricky } from "../entities/ObstacleSpikeTricky"; -import { LevelMatrix, TILE_SIZE, TileType } from "./levels"; +import { + ObstaclePlatformDisappearing, + ObstacleSpikeNormal, + ObstacleSpikeTricky, +} from "../entities/obstacles"; +import { LevelMatrix, TILE_SIZE, TileType } from "./levelTypes"; export interface LoadedLevel { player: Player; diff --git a/src/lib/levelTypes.ts b/src/lib/levelTypes.ts new file mode 100644 index 0000000..ee4c707 --- /dev/null +++ b/src/lib/levelTypes.ts @@ -0,0 +1,46 @@ +export const TILE_SIZE = 40; +export const LEVEL_COLS = 20; +export const LEVEL_ROWS = 15; + +export enum TileType { + Empty = 0, + Platform = 1, + Player = 2, + Exit = 3, + DisappearingPlatform = 4, + Spike = 5, + TrickySpike = 6, +} + +export type LevelMatrix = TileType[][]; + +export interface LevelDef { + name: string; + matrix: LevelMatrix; +} + +const CHAR_TO_TILE: Record = { + ".": TileType.Empty, + "#": TileType.Platform, + "P": TileType.Player, + "E": TileType.Exit, + "~": TileType.DisappearingPlatform, + "^": TileType.Spike, + "T": TileType.TrickySpike, +}; + +function parseLevel(rows: string[]): LevelMatrix { + return rows.map((row, rowIdx) => + [...row].map((c, colIdx) => { + const tile = CHAR_TO_TILE[c]; + if (tile === undefined) { + throw new Error(`Invalid tile char '${c}' at row ${rowIdx}, col ${colIdx}`); + } + return tile; + }), + ); +} + +export function defineLevel(name: string, rows: string[]): LevelDef { + return { name, matrix: parseLevel(rows) }; +} diff --git a/src/scenes/GameScene.ts b/src/scenes/GameScene.ts index 25e93c6..605794f 100644 --- a/src/scenes/GameScene.ts +++ b/src/scenes/GameScene.ts @@ -2,11 +2,13 @@ import Phaser from "phaser"; import { Player } from "../entities/Player"; import { Exit } from "../entities/Exit"; import { Platform } from "../entities/Platform"; -import { ObstaclePlatformDisappearing } from "../entities/ObstaclePlatformDisappearing"; -import { ObstacleSpikeNormal } from "../entities/ObstacleSpikeNormal"; -import { ObstacleSpikeTricky } from "../entities/ObstacleSpikeTricky"; -import { LEVELS } from "../levels/levels"; -import { LevelLoader } from "../levels/LevelLoader"; +import { + ObstaclePlatformDisappearing, + ObstacleSpikeNormal, + ObstacleSpikeTricky, +} from "../entities/obstacles"; +import { LEVELS } from "../levels"; +import { LevelLoader } from "../lib/LevelLoader"; interface SceneData { levelIndex?: number;