aboutsummaryrefslogtreecommitdiff
path: root/core/src/main/java/coffee/liz/abstractionengine/app/screen
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2026-02-21 12:29:54 -0800
committerElizabeth Hunt <me@liz.coffee>2026-02-21 12:29:54 -0800
commit170f5c496054c9c5c2df9b8a1c5c8df7643ea004 (patch)
tree1ed217130939a04234761d54ba2ec607866f51ad /core/src/main/java/coffee/liz/abstractionengine/app/screen
parentd6a294e14604aecd9046cbc19dc1837ca694fbb0 (diff)
downloadthe-abstraction-engine-java-main.tar.gz
the-abstraction-engine-java-main.zip
Diffstat (limited to 'core/src/main/java/coffee/liz/abstractionengine/app/screen')
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridInterpolationSystem.java13
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridWorldBridgeSystem.java25
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/RenderSystem.java3
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);