diff options
| author | Elizabeth Hunt <me@liz.coffee> | 2026-02-21 12:29:54 -0800 |
|---|---|---|
| committer | Elizabeth Hunt <me@liz.coffee> | 2026-02-21 12:29:54 -0800 |
| commit | 170f5c496054c9c5c2df9b8a1c5c8df7643ea004 (patch) | |
| tree | 1ed217130939a04234761d54ba2ec607866f51ad /core/src/main/java/coffee/liz/abstractionengine/app/screen | |
| parent | d6a294e14604aecd9046cbc19dc1837ca694fbb0 (diff) | |
| download | the-abstraction-engine-java-main.tar.gz the-abstraction-engine-java-main.zip | |
Diffstat (limited to 'core/src/main/java/coffee/liz/abstractionengine/app/screen')
3 files changed, 32 insertions, 9 deletions
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridInterpolationSystem.java b/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridInterpolationSystem.java index d0acfbc..1aa5177 100644 --- a/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridInterpolationSystem.java +++ b/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridInterpolationSystem.java @@ -17,6 +17,7 @@ import java.util.Collection; import java.util.Set; import com.badlogic.gdx.math.Interpolation; +import com.badlogic.gdx.scenes.scene2d.Action; import com.badlogic.gdx.scenes.scene2d.Actor; import com.badlogic.gdx.scenes.scene2d.actions.MoveToAction; import lombok.extern.log4j.Log4j2; @@ -36,7 +37,13 @@ public class GridInterpolationSystem implements System<FrameState> { world.resolve(Query.allOf(ExternalWorldEntityRef.class, ActorHolder.class)).forEach(entity -> { final Actor actor = entity.get(ActorHolder.class).getActor(); - final boolean isAlreadyInterpolating = !actor.getActions().isEmpty(); + boolean isAlreadyInterpolating = false; + for (final Action action : actor.getActions()) { + if (isMoveAction(action)) { + isAlreadyInterpolating = true; + break; + } + } if (isAlreadyInterpolating) { return; } @@ -68,4 +75,8 @@ public class GridInterpolationSystem implements System<FrameState> { default -> new Interpolation.Swing(1.15f); }; } + + private boolean isMoveAction(final Action action) { + return action instanceof MoveToAction; + } } diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridWorldBridgeSystem.java b/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridWorldBridgeSystem.java index 3d76853..ff977c1 100644 --- a/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridWorldBridgeSystem.java +++ b/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridWorldBridgeSystem.java @@ -14,18 +14,22 @@ import coffee.liz.abstractionengine.entity.EntityFactory; import coffee.liz.abstractionengine.entity.EntityType; import coffee.liz.abstractionengine.grid.component.GridInputState; import coffee.liz.abstractionengine.grid.component.GridPosition; +import coffee.liz.abstractionengine.grid.component.LambdaTerm; +import coffee.liz.abstractionengine.grid.component.Substitution; import coffee.liz.ecs.math.Vec2; import coffee.liz.ecs.math.Vec2i; import coffee.liz.ecs.model.Entity; import coffee.liz.ecs.model.System; import coffee.liz.ecs.model.World; import coffee.liz.ecs.model.Query; +import coffee.liz.lambda.ast.SourceCode; import lombok.Getter; import java.time.Duration; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; @@ -37,6 +41,7 @@ public class GridWorldBridgeSystem implements System<FrameState> { private final Map<Integer, Entity> outerIdToInnerEntity = new HashMap<>(); private final AbstractionEngineGridWorld outerWorld; private final Vec2<Integer> gridSize; + private final boolean vimMode; @Getter private final Vec2<Float> gridToWorld; @@ -45,6 +50,7 @@ public class GridWorldBridgeSystem implements System<FrameState> { public GridWorldBridgeSystem(final Vec2<Integer> gridSize, final Settings settings) { this.gridSize = gridSize; + this.vimMode = settings.isVimMode(); this.outerWorld = new AbstractionEngineGridWorld(gridSize, settings.getPreferredSyntax()); this.gridToWorld = AbstractionEngineGame.WORLD_SIZE @@ -56,8 +62,11 @@ public class GridWorldBridgeSystem implements System<FrameState> { public void initLevel() { EntityFactory.populateRect(gridSize, outerWorld, EntityFactory.Wall::addToWorld); EntityFactory.Player.addToWorld(outerWorld, Vec2i.builder().y(10).x(10).build()); - EntityFactory.Abstraction.addToWorld(outerWorld, Vec2i.builder().y(10).x(12).build()); - EntityFactory.Abstraction.addToWorld(outerWorld, Vec2i.builder().y(10).x(13).build()); + EntityFactory.Abstraction.addToWorld(outerWorld, Vec2i.builder().y(10).x(12).build()) + .add(new LambdaTerm(SourceCode.ofArrow("(f -> x -> f(x))(_)"))) + .add(new Substitution(Vec2i.NORTH, List.of(Vec2i.builder().x(11).y(11).build()))); + EntityFactory.Abstraction.addToWorld(outerWorld, Vec2i.builder().y(10).x(13).build()) + .add(new LambdaTerm(SourceCode.ofArrow("(y -> y)"))); outerWorld.update(GridInputState.builder().movement(Vec2i.ZERO).build()); } @@ -87,8 +96,9 @@ public class GridWorldBridgeSystem implements System<FrameState> { } final Entity outer = world.createEntity(); + final RenderSystem renderSystem = world.getSystem(RenderSystem.class); outer.add(new ActorHolder( - createActor(gridEntity.get(EntityType.class), world.getSystem(RenderSystem.class).getStage()))); + createActor(gridEntity, renderSystem.getStage(), renderSystem.getUiStage()))); outer.add(new ExternalWorldEntityRef(gridEntity)); outer.add(gridEntity.get(EntityType.class)); outerIdToInnerEntity.put(gridEntity.getId(), outer); @@ -108,14 +118,17 @@ public class GridWorldBridgeSystem implements System<FrameState> { FunctionUtils.wrapCheckedException(outerWorld::dispose); } - private Actor createActor(final EntityType type, final Stage stage) { + private Actor createActor(final Entity gridEntity, final Stage stage, final Stage uiStage) { + final EntityType type = gridEntity.get(EntityType.class); final Actor actor = switch (type) { case PLAYER -> new Penguin(); - case ABSTRACTION -> new Abstraction(); + case ABSTRACTION -> new Abstraction(gridEntity, getGridToWorld(), uiStage, vimMode); case WALL -> new Wall(); default -> throw new UnsupportedOperationException(); }; - actor.setBounds(0, 0, getGridToWorld().getX(), getGridToWorld().getX()); + final GridPosition position = gridEntity.get(GridPosition.class); + final Vec2<Float> worldSpawnPosition = getGridToWorld().scale(position.getPosition().floatValue()); + actor.setBounds(worldSpawnPosition.getX(), worldSpawnPosition.getY(), getGridToWorld().getX(), getGridToWorld().getX()); stage.addActor(actor); return actor; } diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/RenderSystem.java b/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/RenderSystem.java index 32b9ebd..a6768c7 100644 --- a/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/RenderSystem.java +++ b/core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/RenderSystem.java @@ -3,7 +3,6 @@ package coffee.liz.abstractionengine.app.screen.game.system; import coffee.liz.abstractionengine.app.Theme; import coffee.liz.abstractionengine.app.config.Settings; import coffee.liz.abstractionengine.app.screen.game.FrameState; -import coffee.liz.abstractionengine.app.ui.editor.LambdaEditor; import coffee.liz.ecs.math.Vec2; import coffee.liz.ecs.model.System; import coffee.liz.ecs.model.World; @@ -27,6 +26,7 @@ public class RenderSystem implements System<FrameState> { private final ShapeRenderer shapeRenderer; @Getter private final Stage stage; + @Getter private final Stage uiStage; private final InputMultiplexer inputMultiplexer; @@ -37,7 +37,6 @@ public class RenderSystem implements System<FrameState> { this.stage = new Stage(viewport); this.uiStage = new Stage(new ScreenViewport()); - uiStage.addActor(new LambdaEditor(settings.isVimMode())); // TODO: Move this to an input system this.inputMultiplexer = new InputMultiplexer(uiStage, stage); |
