From bf2ab194e41ff77a13a3556aeb82f2b42cacee02 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Sun, 23 Aug 2026 23:10:01 +0200 Subject: [PATCH] feat(sim): tile grid and static entity base --- game/sim/entity.py | 58 +++++++++++++++++++++++++++ game/sim/tiles.py | 97 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 155 insertions(+) create mode 100644 game/sim/entity.py create mode 100644 game/sim/tiles.py diff --git a/game/sim/entity.py b/game/sim/entity.py new file mode 100644 index 0000000..238c75d --- /dev/null +++ b/game/sim/entity.py @@ -0,0 +1,58 @@ +import itertools + +from .geometry import Aabb + +_idCounter = itertools.count(1) + + +class Actor: + def __init__(self, x, y, w, h): + self.id = next(_idCounter) + self.x = float(x) + self.y = float(y) + self.w = float(w) + self.h = float(h) + self.vx = 0.0 + self.vy = 0.0 + self.facing = 1 + self.onGround = False + self.onCeiling = False + self.onWallLeft = False + self.onWallRight = False + self.groundPlatform = None + self.alive = True + self.removed = False + + @property + def aabb(self): + return Aabb(self.x, self.y, self.w, self.h) + + @property + def centerX(self): + return self.x + self.w * 0.5 + + @property + def centerY(self): + return self.y + self.h * 0.5 + + @property + def left(self): + return self.x + + @property + def right(self): + return self.x + self.w + + @property + def top(self): + return self.y + + @property + def bottom(self): + return self.y + self.h + + def hurtBox(self): + return self.aabb + + def kill(self): + self.alive = False diff --git a/game/sim/tiles.py b/game/sim/tiles.py new file mode 100644 index 0000000..f0886e1 --- /dev/null +++ b/game/sim/tiles.py @@ -0,0 +1,97 @@ +AIR = "air" + + +class TileDef: + __slots__ = ("name", "solid", "oneWay", "hazard", "ladder", "slope", "damage") + + def __init__(self, name, solid=False, oneWay=False, hazard=False, ladder=False, slope=None, damage=0): + self.name = name + self.solid = solid + self.oneWay = oneWay + self.hazard = hazard + self.ladder = ladder + self.slope = slope + self.damage = damage + + +tileRegistry = { + AIR: TileDef(AIR), + "ground": TileDef("ground", solid=True), + "brick": TileDef("brick", solid=True), + "stone": TileDef("stone", solid=True), + "dirt": TileDef("dirt", solid=True), + "platform": TileDef("platform", oneWay=True), + "woodOneWay": TileDef("woodOneWay", oneWay=True), + "spike": TileDef("spike", hazard=True, damage=2), + "lava": TileDef("lava", hazard=True, damage=3), + "ladder": TileDef("ladder", ladder=True), + "ladderTop": TileDef("ladderTop", ladder=True, oneWay=True), + "slopeRight": TileDef("slopeRight", slope="ascendRight"), + "slopeLeft": TileDef("slopeLeft", slope="ascendLeft"), + "pipeTL": TileDef("pipeTL", solid=True), + "pipeTR": TileDef("pipeTR", solid=True), + "pipeBL": TileDef("pipeBL", solid=True), + "pipeBR": TileDef("pipeBR", solid=True), +} + + +asciiToTile = { + "X": "ground", + "#": "brick", + "S": "stone", + "D": "dirt", + "=": "platform", + "-": "woodOneWay", + "^": "spike", + "~": "lava", + "H": "ladder", + "T": "ladderTop", + "/": "slopeRight", + "\\": "slopeLeft", + "L": "pipeTL", + "R": "pipeTR", + "l": "pipeBL", + "r": "pipeBR", +} + +tileToAscii = {value: key for key, value in asciiToTile.items()} + + +asciiEntities = { + "p": "playerSpawn", + "g": "goomba", + "c": "chaser", + "f": "flyer", + "s": "shooter", + "o": "coin", + "G": "gem", + "k": "key", + "v": "heart", + "@": "checkpoint", + "E": "exit", +} + + +def tileDef(name): + return tileRegistry.get(name, tileRegistry[AIR]) + + +def isSolidName(name): + return tileRegistry[name].solid if name in tileRegistry else False + + +def isOneWayName(name): + return tileRegistry[name].oneWay if name in tileRegistry else False + + +def isHazardName(name): + return tileRegistry[name].hazard if name in tileRegistry else False + + +def isLadderName(name): + return tileRegistry[name].ladder if name in tileRegistry else False + + +def slopeKind(name): + definition = tileRegistry.get(name) + return definition.slope if definition else None