diff options
Diffstat (limited to 'core/src/main/java')
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(); } |
