Filter
Exclude
Time range
-
Near
Game devs: Tired of games locked to centralized servers that can shut down, ban players, or lose progress? EverArcade flips the script.Instead of rendering APIs, it gives you an execution API → RustRigs → WASM.Your game logic runs on a deterministic, sovereign open runtime. Worlds are fully replayable, verifiable, migratable, and restorable anywhere the protocol lives. Graphics? Still local GPU magic. No determinism tax on visuals, only state transitions are authoritative. Build once. Own forever. No more single points of failure.Who's ready to ship unbreakable games? #GameDev #IndieDev #Web3Gaming #Rust #WASM #GameEngine #BlockchainGaming #EverArcade
17
# ============================================================ # StageLoader:文字列からGameStateを作る # ============================================================ class StageLoader: """ マップ文字列を世界構造へ変換する。 p : Player o : Block . : Goal P : Goal上のPlayer O : Goal上のBlock # : Wall 空白 : Floor """ def load(self, map_str: str) -> GameState: raw_layers: list[dict[Position, Entity]] = [ {}, {}, {}, ] lines = map_str.strip("\n").splitlines() width = max(len(line) for line in lines) height = len(lines) for y, line in enumerate(lines): for x in range(width): c = line[x] if x < len(line) else " " pos = Position(x, y) raw_layers[LayerLevel.GROUND][pos] = Wall() if c == "#" else Floor() if c == ".": raw_layers[LayerLevel.GIMMICK][pos] = Goal() elif c == "p": raw_layers[LayerLevel.OCCUPANT][pos] = Player() elif c == "o": raw_layers[LayerLevel.OCCUPANT][pos] = Block() elif c == "P": raw_layers[LayerLevel.GIMMICK][pos] = Goal() raw_layers[LayerLevel.OCCUPANT][pos] = Player() elif c == "O": raw_layers[LayerLevel.GIMMICK][pos] = Goal() raw_layers[LayerLevel.OCCUPANT][pos] = Block() return GameState( layers=freeze_layers(raw_layers), width=width, height=height, ) # ============================================================ # Application # ============================================================ def main() -> None: with open("stageData.txt", "r", encoding="utf-8") as file: state = StageLoader().load(file.read()) directions = { "w": Position(0, -1), "z": Position(0, 1), "a": Position(-1, 0), "s": Position(1, 0), } engine = GameEngine(TransitionGenerator(default_rules())) renderer = Renderer() clear_rule = ClearRule() actor_index = 0 while not clear_rule.is_cleared(state): renderer.render(state) cmd = input("a:left s:right w:up z:down. command? ") if cmd in directions: state = engine.update( state, directions[cmd], actor_index=actor_index, ) renderer.render(state) print("Congratulations! you win.") if __name__ == "__main__": main()

1
2
94
from __future__ import annotations from dataclasses import dataclass from enum import IntEnum from types import MappingProxyType from typing import Callable, Iterable, Iterator, Mapping # ============================================================ # 位置:値オブジェクト # ============================================================ @dataclass(frozen=True) class Position: x: int y: int def __add__(self, other: "Position") -> "Position": return Position(self.x other.x, self.y other.y) # ============================================================ # Entity:世界に存在するもの # ============================================================ class Entity: """すべての存在の基底クラス""" def char(self) -> str: return " " def is_passable(self) -> bool: return True class Ground(Entity): """地形レイヤーに置かれるもの""" pass class Floor(Ground): pass class Wall(Ground): def char(self) -> str: return "#" def is_passable(self) -> bool: return False class Gimmick(Entity): """ゴールなど、地形の上に重なる仕掛け""" pass class Goal(Gimmick): def char(self) -> str: return "." class Occupant(Entity): """ マスを占有する存在。 PlayerもBlockも、WorldQueryから見ると 「そのマスを塞いでいるもの」として同じ概念。 """ def is_passable(self) -> bool: return False def can_act(self) -> bool: """自分の意思で行動できるか""" return False def can_be_pushed(self) -> bool: """他者に押されて動けるか""" return False class Player(Occupant): def char(self) -> str: return "p" def can_act(self) -> bool: return True class Block(Occupant): def char(self) -> str: return "o" def can_be_pushed(self) -> bool: return True # ============================================================ # Layer:世界を重ね合わせで表現する # ============================================================ class LayerLevel(IntEnum): GROUND = 0 GIMMICK = 1 OCCUPANT = 2 Layer = Mapping[Position, Entity] def freeze_layer(layer: dict[Position, Entity]) -> Layer: """ dictを読み取り専用にする。 GameStateはfrozen=Trueでも、 中のdictがmutableだと本当の不変ではない。 そこでMappingProxyTypeで外部変更を防ぐ。 """ return MappingProxyType(dict(layer)) def freeze_layers(layers: Iterable[dict[Position, Entity]]) -> tuple[Layer, ...]: return tuple(freeze_layer(layer) for layer in layers) # ============================================================ # GameState:世界の構造だけを持つ # ============================================================ @dataclass(frozen=True) class GameState: """ GameStateは「今の世界」を表すだけ。 ここに移動ロジック、描画、クリア判定を入れない。 単一責務を徹底する。 """ layers: tuple[Layer, ...] width: int height: int # ============================================================ # WorldQuery:世界を読む専用 # ============================================================ class WorldQuery: """ GameStateを観測するためのクラス。 状態は変更しない。 「この座標に何がある?」 「通れる?」 「行動できるOccupantはどこ?」 だけを答える。 """ def __init__(self, state: GameState): self.state = state def in_bounds(self, pos: Position) -> bool: return 0 <= pos.x < self.state.width and 0 <= pos.y < self.state.height def get_at(self, pos: Position) -> list[Entity]: if not self.in_bounds(pos): return [Wall()] return [layer[pos] for layer in self.state.layers if pos in layer] def occupant_at(self, pos: Position) -> Occupant | None: entity = self.state.layers[LayerLevel.OCCUPANT].get(pos) if isinstance(entity, Occupant): return entity return None def is_passable(self, pos: Position) -> bool: if not self.in_bounds(pos): return False return all(entity.is_passable() for entity in self.get_at(pos)) def actors(self) -> list[Position]: return [ pos for pos, entity in self.state.layers[LayerLevel.OCCUPANT].items() if isinstance(entity, Occupant) and entity.can_act() ] def goals(self) -> list[Position]: return [ pos for pos, entity in self.state.layers[LayerLevel.GIMMICK].items() if isinstance(entity, Goal) ] # ============================================================ # Transition:状態遷移関数 # ============================================================ Transition = Callable[[GameState], GameState] def move_occupants(*moves: tuple[Position, Position]) -> Transition: """ ここがSSS の核。 この関数は、すぐに状態を変更しない。 代わりに、 GameState -> GameState という関数を返す。 つまり「処理を実行する」のではなく、 「未来の状態変換」を値として返す。 """ def transition(state: GameState) -> GameState: new_layers = [dict(layer) for layer in state.layers] occupants = new_layers[LayerLevel.OCCUPANT] for src, dst in moves: occupants[dst] = occupants.pop(src) return GameState( layers=freeze_layers(new_layers), width=state.width, height=state.height, ) return transition # ============================================================ # Rule:遷移候補を遅延生成する # ============================================================ Rule = Callable[[WorldQuery, Position, Position], Iterator[Transition]] def walk_rule( query: WorldQuery, actor_pos: Position, direction: Position, ) -> Iterator[Transition]: """ 歩行ルール。 条件を満たすときだけ、 「歩く状態遷移関数」をyieldする。 """ target = actor_pos direction if query.occupant_at(target) is None and query.is_passable(target): yield move_occupants((actor_pos, target)) def push_rule( query: WorldQuery, actor_pos: Position, direction: Position, ) -> Iterator[Transition]: """ 箱押しルール。 PlayerがBlockを直接知るのではなく、 can_be_pushed() という契約だけを見る。 """ target = actor_pos direction target_occupant = query.occupant_at(target) if target_occupant is None: return if not target_occupant.can_be_pushed(): return pushed_target = target direction if query.is_passable(pushed_target): yield move_occupants( (target, pushed_target), (actor_pos, target), ) def default_rules() -> tuple[Rule, ...]: """ ルールの優先順位。 先にpush_ruleを見るので、 箱があれば押す。 箱がなければwalk_ruleで歩く。 """ return ( push_rule, walk_rule, ) # ============================================================ # TransitionGenerator:可能な遷移を生成する # ============================================================ class TransitionGenerator: """ Rule群からTransitionを遅延生成する。 ここではまだ状態を変えない。 あくまで「可能な状態遷移関数」を列挙するだけ。 """ def __init__(self, rules: Iterable[Rule]): self.rules = tuple(rules) def generate( self, state: GameState, actor_pos: Position, direction: Position, ) -> Iterator[Transition]: query = WorldQuery(state) actor = query.occupant_at(actor_pos) if actor is None: return if not actor.can_act(): return for rule in self.rules: yield from rule(query, actor_pos, direction) # ============================================================ # GameEngine:遷移を1つ選んで適用するだけ # ============================================================ class GameEngine: """ Engineは司令塔。 ただし賢くしすぎない。 やることは、 1. 行動者を選ぶ 2. Transitionを生成する 3. 最初のTransitionを適用する だけ。 """ def __init__(self, generator: TransitionGenerator): self.generator = generator def update( self, state: GameState, direction: Position, actor_index: int = 0, ) -> GameState: query = WorldQuery(state) actors = query.actors() if not (0 <= actor_index < len(actors)): return state actor_pos = actors[actor_index] transition = next( self.generator.generate(state, actor_pos, direction), None, ) if transition is None: return state return transition(state) # ============================================================ # ClearRule:クリア判定だけ # ============================================================ class ClearRule: def is_cleared(self, state: GameState) -> bool: query = WorldQuery(state) goals = query.goals() if not goals: return False return all(isinstance(query.occupant_at(goal), Block) for goal in goals) # ============================================================ # Renderer:描画だけ # ============================================================ class Renderer: def render(self, state: GameState) -> None: query = WorldQuery(state) for y in range(state.height): line = "" for x in range(state.width): pos = Position(x, y) entities = query.get_at(pos) top = entities[-1] char = top.char() has_goal = any(isinstance(entity, Goal) for entity in entities) if has_goal: if isinstance(top, Block): char = "O" elif isinstance(top, Player): char = "P" elif isinstance(top, Goal): char = "." line = char print(line) ↓↓↓

1
2
113
Building a chess engine in a language I've never used before 🧠 Today's progress: Board representation Type safety with custom types structs Go iota for clean enums Follow for more #buildinpublic updates on this game engine journey 🚀 #buildinpublic #gameengine
1
13
Umbra Engine Update:ECS-Integration branch and continued building the engine's ECS foundation with scalable architecture with Flecs integration, component management, queries, systems, scheduling, and scene integration. #GameEngine #ECS #DOO #GraphicsProgramming #Flecs
2
7
Replying to @3DxDEV7
К сожалению, начинаешь со временем погружаться в техническую часть все глубже и из творчества остается только дизайн, покрас. Все остальное чисто технические навыки))) Потом идут gameEngine и работа моделей с ними...хах. Ляпота
1
23
It's not Friday until someone ships an entire game engine before lunch. Lucky Engine: purpose-built for training robots... or making games out of them. Respect the audacity. The engine graveyard gets a worthy rival. 🛠️ #gamedev #gameengine
Well, here it is! We just shipped the very first version of Lucky Engine - a game engine purpose-built for robotics. Download now on Windows, Linux, and macOS - free for research & personal use: luckyrobots.com Go train some robots... or make some games. This is just the beginning, and we're planning to update frequently as we keep working hard. ❤️
51
🇵🇭 Happy Independence Day! 🇵🇭 We honor the courage, unity, and resilience of the Filipino people as we celebrate freedom and national pride. Game Engine joins the nation in commemorating this meaningful day. #IndependenceDay #ArawNgKalayaan #GameEngine #GameEverywhere
1
8
Continúo con el desarrollo de mi juego en Raylib: ahora tiene NPCs. #3dgames #clion #cplusplus #cpp #gamedev #gameengine #indiedev #indiegame #raylib #visualstudio #visualstudiocode
1
2
86
Defold 1.13.0 beta brings a couple of nice workflow improvements to the Scene View toolbar ⚙️ The grid, camera, and scene visibility popups have been cleaned up and unified, with better controls, live shortcut feedback, value fields for sliders, an improved grid color picker, localization, focus traversal, and various UX fixes. Try the beta and let us know what you think. #MadeWithDefold #gamedev #indiedev #gamedevtools #gameengine #betatesting
2
6
63
2,016
A sneak peek at what I am working on... #BuiltWithMonoGame #indiedev #solodev #gamedev #gameengine #Cell
1
4
41
Day 13: 100-Day Challenge of Vibe Coding a new-architecture Rust Game Engine - Mors² Today I landed the foundation of the Performance Module: PerformanceLatent, frame snapshots, Space.step metrics, Rule timing, backend submit reports, and process memory sampling. #vibecoding #gameengine #gamedev #indiedev #rust
29
Another teaser from the upcoming FPS template for Defold This time with: 📦 more assets from @KayLousberg's Prototype Pack 🔄 reloading animations 🎯 GUI for ammunition 💥 billboarded ParticleFX for shots and hits 👊 enemy knockback on impact 🎮 gamepad support We hope this will become a useful base for your own 3D experiments in Defold! #MadeWithDefold #gamedev #indiedev #FPS #3D #gameengine
3
10
79
2,419