aboutsummaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/AbstractionEngineGame.java4
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/actor/Abstraction.java26
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/actor/Player.java22
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/GridWorldBridgeSystem.java1
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/game/system/RenderSystem.java24
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/EditorTextArea.java14
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/context/KeyContext.java48
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/handler/NormalModeHandler.java27
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/state/PendingOperator.java2
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/status/StatusFormatter.java3
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/component/LambdaTerm.java17
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/entity/EntityType.java3
12 files changed, 138 insertions, 53 deletions
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/AbstractionEngineGame.java b/core/src/main/java/coffee/liz/abstractionengine/app/AbstractionEngineGame.java
index d0ba1f3..002646e 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/AbstractionEngineGame.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/AbstractionEngineGame.java
@@ -11,6 +11,7 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.glutils.ShapeRenderer;
import com.badlogic.gdx.utils.viewport.FitViewport;
+import com.kotcrab.vis.ui.VisUI;
public class AbstractionEngineGame extends Game {
public static final Vec2<Float> WORLD_SIZE = Vec2f.builder().x(800f).y(800f).build();
@@ -25,6 +26,8 @@ public class AbstractionEngineGame extends Game {
* Game initialization hook.
*/
public void create() {
+ VisUI.load();
+
viewport = new FitViewport(WORLD_SIZE.getX(), WORLD_SIZE.getY());
batch = new SpriteBatch();
shapeRenderer = new ShapeRenderer();
@@ -50,5 +53,6 @@ public class AbstractionEngineGame extends Game {
batch.dispose();
font.dispose();
shapeRenderer.dispose();
+ VisUI.dispose();
}
}
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/actor/Abstraction.java b/core/src/main/java/coffee/liz/abstractionengine/app/actor/Abstraction.java
index 5c964a2..3ea4701 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/actor/Abstraction.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/actor/Abstraction.java
@@ -2,6 +2,7 @@ package coffee.liz.abstractionengine.app.actor;
import coffee.liz.ecs.math.Vec2;
import coffee.liz.ecs.math.Vec2i;
+import coffee.liz.ecs.model.Entity;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.Texture;
@@ -9,21 +10,28 @@ import com.badlogic.gdx.graphics.g2d.Animation;
import com.badlogic.gdx.graphics.g2d.Batch;
import com.badlogic.gdx.graphics.g2d.TextureRegion;
import com.badlogic.gdx.scenes.scene2d.Actor;
+import com.badlogic.gdx.scenes.scene2d.InputEvent;
+import com.badlogic.gdx.scenes.scene2d.InputListener;
+import com.badlogic.gdx.utils.Null;
import lombok.Getter;
+import lombok.extern.log4j.Log4j2;
+@Log4j2
public class Abstraction extends Actor {
private static final Vec2<Integer> ABSTRACTION_FRAMES = Vec2i.builder().x(1).y(4).build();
- private final Texture texture;
@Getter
private final Animation<TextureRegion> animation;
+ private final Entity abstractionEntity;
+
+ private boolean isActive;
private float stateTime = 0f;
/**
* Creates a penguin actor.
*/
public Abstraction() {
- this.texture = new Texture(Gdx.files.internal("sprites/abstraction.png"));
+ final Texture texture = new Texture(Gdx.files.internal("sprites/abstraction.png"));
final TextureRegion[][] tmp = TextureRegion.split(texture, texture.getWidth() / ABSTRACTION_FRAMES.getX(),
texture.getHeight() / ABSTRACTION_FRAMES.getY());
final TextureRegion[] anim = {
@@ -33,6 +41,20 @@ public class Abstraction extends Actor {
tmp[3][0]
};
this.animation = new Animation<>(0.25f, anim);
+
+ addListener(new InputListener() {
+ @Override
+ public void enter (final InputEvent event, final float x, final float y, final int pointer, @Null final Actor fromActor) {
+ log.info("Entered mouse {}", event);
+ }
+
+
+ @Override
+ public boolean touchDown (final InputEvent event, final float x, final float y, final int pointer, final int button) {
+ log.info("TouchDown!!!");
+ return false;
+ }
+ });
}
/**
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/actor/Player.java b/core/src/main/java/coffee/liz/abstractionengine/app/actor/Player.java
deleted file mode 100644
index fb63b0d..0000000
--- a/core/src/main/java/coffee/liz/abstractionengine/app/actor/Player.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package coffee.liz.abstractionengine.app.actor;
-
-import com.badlogic.gdx.graphics.g2d.Batch;
-import com.badlogic.gdx.scenes.scene2d.Actor;
-import com.badlogic.gdx.scenes.scene2d.InputListener;
-import com.badlogic.gdx.scenes.scene2d.Stage;
-
-import lombok.AllArgsConstructor;
-
-@AllArgsConstructor
-public class Player extends Actor {
- private Stage stage;
-
- public Player() {
- addListener(new InputListener());
- }
-
- @Override
- public void draw(final Batch batch, final float parentAlpha) {
- // batch.
- }
-}
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 52a21a6..dac5a32 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
@@ -4,7 +4,6 @@ import coffee.liz.abstractionengine.AbstractionEngineGridWorld;
import coffee.liz.abstractionengine.app.AbstractionEngineGame;
import coffee.liz.abstractionengine.app.actor.Abstraction;
import coffee.liz.abstractionengine.app.actor.Penguin;
-import coffee.liz.abstractionengine.app.actor.Player;
import coffee.liz.abstractionengine.app.actor.Wall;
import coffee.liz.abstractionengine.app.screen.game.FrameState;
import coffee.liz.abstractionengine.app.screen.game.component.ActorHolder;
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 0bb4f54..401ed89 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
@@ -5,7 +5,6 @@ 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.math.Vec2f;
import coffee.liz.ecs.model.System;
import coffee.liz.ecs.model.World;
import lombok.Getter;
@@ -17,7 +16,6 @@ import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.utils.ScreenUtils;
import com.badlogic.gdx.utils.viewport.FitViewport;
import com.badlogic.gdx.utils.viewport.ScreenViewport;
-import com.kotcrab.vis.ui.VisUI;
import java.time.Duration;
import java.util.Collection;
@@ -38,9 +36,6 @@ public class RenderSystem implements System<FrameState> {
this.shapeRenderer = new ShapeRenderer();
this.stage = new Stage(viewport);
- // stage.addActor(boardActor);
-
- VisUI.load();
this.uiStage = new Stage(new ScreenViewport());
uiStage.addActor(new LambdaEditor(settings.isVimMode()));
@@ -65,19 +60,6 @@ public class RenderSystem implements System<FrameState> {
public void update(final World<FrameState> world, final FrameState state, final Duration dt) {
ScreenUtils.clear(Theme.BG);
- final Vec2<Float> cellSize = computeCellSize();
- // final List<GridBoardActor.RenderableEntity> renderables = world
- // .query(Set.of(InterpolatedPosition.class,
- // EntityType.class)).stream().map(entity -> {
- // final InterpolatedPosition pos = entity.get(InterpolatedPosition.class);
- // final EntityType type = entity.get(EntityType.class);
- // final Vec2<Float> drawPos = pos.getCurrent().scale(cellSize);
- // return new GridBoardActor.RenderableEntity(type, drawPos, cellSize);
- // }).toList();
-
- // boardActor.setCellSize(cellSize);
- // boardActor.setEntities(renderables);
-
final float deltaSeconds = dt.toMillis() / 1000f;
stage.act(deltaSeconds);
stage.draw();
@@ -92,11 +74,5 @@ public class RenderSystem implements System<FrameState> {
uiStage.dispose();
stage.dispose();
shapeRenderer.dispose();
- VisUI.dispose();
- }
-
- private Vec2<Float> computeCellSize() {
- return Vec2f.builder().x(viewport.getWorldWidth() / gridSize.getX())
- .y(viewport.getWorldHeight() / gridSize.getY()).build();
}
}
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/EditorTextArea.java b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/EditorTextArea.java
index 144141f..5d621b2 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/EditorTextArea.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/EditorTextArea.java
@@ -231,11 +231,23 @@ public class EditorTextArea extends EditorHighlightTextAreaBridge {
}
final float lineHeight = getStyle().font.getLineHeight();
- final float cursorX = getCursorX();
+ final Drawable background = getStyle().background;
+ final float leftInset = background != null ? background.getLeftWidth() : 0f;
+ final float cursorX = leftInset + computeAbsoluteCursorX();
final float cursorY = getHeight() - getCursorY() + lineHeight;
scrollPane.scrollTo(cursorX, cursorY, Math.max(1f, charWidth), lineHeight, false, false);
}
+ private float computeAbsoluteCursorX() {
+ final String text = getText();
+ final int cursor = Math.max(0, Math.min(getCursorPosition(), text.length()));
+ int lineStart = cursor;
+ while (lineStart > 0 && text.charAt(lineStart - 1) != '\n') {
+ lineStart--;
+ }
+ return (cursor - lineStart) * charWidth;
+ }
+
private Set<EditorModifier> currentModifiers() {
if (Gdx.input == null) {
return EMPTY_MODIFIERS;
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/context/KeyContext.java b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/context/KeyContext.java
index 63ebff9..abae5fb 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/context/KeyContext.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/context/KeyContext.java
@@ -576,6 +576,54 @@ public class KeyContext {
return HandleResult.handled(NormalState.DEFAULT);
}
+ public HandleResult applyInnerWordOperator(final PendingOperator operator) {
+ final String text = editorBuffer.getText();
+ if (text.isEmpty()) {
+ return HandleResult.handled(NormalState.DEFAULT);
+ }
+
+ int cursor = Math.max(0, Math.min(editorBuffer.getCursorPosition(), text.length() - 1));
+ if (text.charAt(cursor) == '\n' && cursor > 0) {
+ cursor--;
+ }
+
+ if (!navigation.isWordCharacter(text.charAt(cursor))) {
+ clampCursorInNormalMode();
+ return HandleResult.handled(NormalState.DEFAULT);
+ }
+
+ int start = cursor;
+ while (start > 0 && navigation.isWordCharacter(text.charAt(start - 1))) {
+ start--;
+ }
+
+ int end = cursor + 1;
+ while (end < text.length() && navigation.isWordCharacter(text.charAt(end))) {
+ end++;
+ }
+
+ register.setText(text.substring(start, end));
+ register.setType(RegisterType.CHARACTER);
+
+ if (operator == PendingOperator.YANK_INNER) {
+ editorBuffer.setCursorPosition(start);
+ clampCursorInNormalMode();
+ return HandleResult.handled(NormalState.DEFAULT);
+ }
+
+ editorBuffer.setText(text.substring(0, start) + text.substring(end));
+ editorBuffer.setCursorPosition(Math.min(start, editorBuffer.getText().length()));
+ recordUndoState();
+ invalidateSearchIterator();
+
+ if (operator == PendingOperator.CHANGE_INNER) {
+ return HandleResult.handled(new InsertState(editorBuffer.getText(), editorBuffer.getCursorPosition()));
+ }
+
+ clampCursorInNormalMode();
+ return HandleResult.handled(NormalState.DEFAULT);
+ }
+
public boolean findNext(final String query, final SearchDirection direction) {
if (query == null || query.isEmpty()) {
return false;
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/handler/NormalModeHandler.java b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/handler/NormalModeHandler.java
index e064b0e..bd9b1d0 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/handler/NormalModeHandler.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/handler/NormalModeHandler.java
@@ -82,6 +82,19 @@ public class NormalModeHandler implements ModeHandler<NormalState> {
return HandleResult.handled(new InsertState(context.text(), context.cursor()));
}
+ if (character == 'i' && (operator == PendingOperator.DELETE || operator == PendingOperator.YANK
+ || operator == PendingOperator.CHANGE)) {
+ return HandleResult.handled(new NormalState(state.count(), mapInnerOperator(operator),
+ state.preferredColumn()));
+ }
+
+ if (isInnerWordOperator(operator)) {
+ if (character == 'w') {
+ return context.applyInnerWordOperator(operator);
+ }
+ return HandleResult.handled(NormalState.DEFAULT);
+ }
+
final int start = context.cursor();
final int updatedPreferred = applyMotion(character, repeats, state.preferredColumn(), context, true);
int end = context.cursor();
@@ -135,6 +148,20 @@ public class NormalModeHandler implements ModeHandler<NormalState> {
return HandleResult.handled(new NormalState(0, PendingOperator.NONE, updatedPreferred));
}
+ private PendingOperator mapInnerOperator(final PendingOperator operator) {
+ return switch (operator) {
+ case DELETE -> PendingOperator.DELETE_INNER;
+ case YANK -> PendingOperator.YANK_INNER;
+ case CHANGE -> PendingOperator.CHANGE_INNER;
+ default -> PendingOperator.NONE;
+ };
+ }
+
+ private boolean isInnerWordOperator(final PendingOperator operator) {
+ return operator == PendingOperator.DELETE_INNER || operator == PendingOperator.YANK_INNER
+ || operator == PendingOperator.CHANGE_INNER;
+ }
+
private int applyMotion(final char motion, final int repeats, final int preferredColumn, final KeyContext context,
final boolean clampInNormalMode) {
final MotionAction action = motionActions.get(motion);
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/state/PendingOperator.java b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/state/PendingOperator.java
index 60f22f0..e010695 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/state/PendingOperator.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/state/PendingOperator.java
@@ -1,5 +1,5 @@
package coffee.liz.abstractionengine.app.ui.editor.vim.state;
public enum PendingOperator {
- NONE, DELETE, YANK, CHANGE, G_PREFIX
+ NONE, DELETE, YANK, CHANGE, G_PREFIX, DELETE_INNER, YANK_INNER, CHANGE_INNER
}
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/status/StatusFormatter.java b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/status/StatusFormatter.java
index ab5321f..5ff2654 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/status/StatusFormatter.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/ui/editor/vim/status/StatusFormatter.java
@@ -37,12 +37,15 @@ public class StatusFormatter {
builder.append(" [");
switch (pendingOperator) {
case DELETE :
+ case DELETE_INNER :
builder.append('d');
break;
case YANK :
+ case YANK_INNER :
builder.append('y');
break;
case CHANGE :
+ case CHANGE_INNER :
builder.append('c');
break;
case G_PREFIX :
diff --git a/core/src/main/java/coffee/liz/abstractionengine/component/LambdaTerm.java b/core/src/main/java/coffee/liz/abstractionengine/component/LambdaTerm.java
new file mode 100644
index 0000000..b0d1358
--- /dev/null
+++ b/core/src/main/java/coffee/liz/abstractionengine/component/LambdaTerm.java
@@ -0,0 +1,17 @@
+package coffee.liz.abstractionengine.component;
+
+import coffee.liz.ecs.math.Vec2;
+import coffee.liz.ecs.model.Component;
+import coffee.liz.lambda.ast.Expression;
+import lombok.Data;
+import lombok.RequiredArgsConstructor;
+
+import java.util.Map;
+
+@RequiredArgsConstructor
+@Data
+public class LambdaTerm implements Component {
+ private final Map<String, Vec2<Integer>> termDependencies;
+
+ private final Expression term;
+}
diff --git a/core/src/main/java/coffee/liz/abstractionengine/entity/EntityType.java b/core/src/main/java/coffee/liz/abstractionengine/entity/EntityType.java
index 93fa160..7f88381 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/entity/EntityType.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/entity/EntityType.java
@@ -42,8 +42,7 @@ public enum EntityType implements Component {
if (that.equals(LAVA)) {
return CollisionBehavior.builder().collisionBehaviorType(CollisionBehaviorType.SWALLOW).priority(1).build();
}
- if (that.equals(BRIDGE)) { // BRIDGE takes precedence over LAVA, so stuff can walk on a bridge over
- // LAVA
+ if (that.equals(BRIDGE)) { // BRIDGE takes precedence over LAVA, so stuff can walk on a bridge over LAVA
return CollisionBehavior.builder().collisionBehaviorType(CollisionBehaviorType.SWALLOW).priority(0).build();
}