aboutsummaryrefslogtreecommitdiff
path: root/core/src/main
diff options
context:
space:
mode:
authorElizabeth Hunt <me@liz.coffee>2026-01-24 19:05:27 -0800
committerElizabeth Hunt <me@liz.coffee>2026-01-24 19:12:05 -0800
commitde98c427504cde19c7d5ada5c0a238ca91147a4f (patch)
tree1a21d61ab08b6e0df160650562085215e9d5bb0d /core/src/main
parentfeeb94485206f35f25e33339ae411174f9406760 (diff)
downloadthe-abstraction-engine-v2-de98c427504cde19c7d5ada5c0a238ca91147a4f.tar.gz
the-abstraction-engine-v2-de98c427504cde19c7d5ada5c0a238ca91147a4f.zip
Make codex write some javadoc that I'm too lazy to do :P
Diffstat (limited to 'core/src/main')
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/AbstractionEngineGame.java9
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/actor/Button.java (renamed from core/src/main/java/coffee/liz/abstractionengine/app/actor/BlockyButton.java)13
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/actor/LifeGridActor.java14
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/actor/Logo.java14
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/actor/Penguin.java26
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/life/CellState.java11
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/life/LifeSystem.java16
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/GameScreen.java29
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java37
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/ScrollLogo.java29
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/screen/mainmenu/MainMenuAudio.java21
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java9
-rw-r--r--core/src/main/java/coffee/liz/abstractionengine/app/utils/TimerUtils.java7
13 files changed, 228 insertions, 7 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 b54776f..9d07220 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/AbstractionEngineGame.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/AbstractionEngineGame.java
@@ -21,6 +21,9 @@ public class AbstractionEngineGame extends Game {
public FitViewport viewport;
public ShapeRenderer shapeRenderer;
+ /**
+ * Game initialization hook.
+ */
public void create() {
viewport = new FitViewport(WORLD_SIZE.getX(), WORLD_SIZE.getY());
batch = new SpriteBatch();
@@ -32,10 +35,16 @@ public class AbstractionEngineGame extends Game {
viewport.update(Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), true);
}
+ /**
+ * Game render hook.
+ */
public void render() {
super.render();
}
+ /**
+ * Game cleanup hook.
+ */
public void dispose() {
batch.dispose();
font.dispose();
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/actor/BlockyButton.java b/core/src/main/java/coffee/liz/abstractionengine/app/actor/Button.java
index df2c749..a7416b9 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/actor/BlockyButton.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/actor/Button.java
@@ -16,7 +16,7 @@ import lombok.RequiredArgsConstructor;
import lombok.Setter;
@RequiredArgsConstructor
-public class BlockyButton extends Actor {
+public class Button extends Actor {
private static final float ALPHA = 0.85f;
private static final float BORDER_WIDTH = 1f;
@@ -36,6 +36,14 @@ public class BlockyButton extends Actor {
private final Color bgColor = new Color();
private final Color borderColor = new Color();
+ /**
+ * Actor draw hook.
+ *
+ * @param batch
+ * parent batch
+ * @param parentAlpha
+ * parent alpha multiplier
+ */
@Override
public void draw(final Batch batch, final float parentAlpha) {
batch.end();
@@ -80,6 +88,9 @@ public class BlockyButton extends Actor {
}
}
+ /**
+ * Enables input handling for the button.
+ */
public void addButtonListener() {
addListener(new InputListener() {
@Override
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/actor/LifeGridActor.java b/core/src/main/java/coffee/liz/abstractionengine/app/actor/LifeGridActor.java
index 6692413..43b83a5 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/actor/LifeGridActor.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/actor/LifeGridActor.java
@@ -37,6 +37,12 @@ public class LifeGridActor extends Actor {
@Setter
private Vec2<Float> parallaxOffset = Vec2f.ZERO;
+ /**
+ * Actor update hook.
+ *
+ * @param delta
+ * time since last frame
+ */
@Override
public void act(final float delta) {
super.act(delta);
@@ -48,6 +54,14 @@ public class LifeGridActor extends Actor {
world.update(new LifeInput(forcedAlive), Duration.ofMillis((int) (delta * 1000)));
}
+ /**
+ * Actor draw hook.
+ *
+ * @param batch
+ * parent batch
+ * @param parentAlpha
+ * parent alpha multiplier
+ */
@Override
public void draw(final Batch batch, final float parentAlpha) {
if (viewport == null) {
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/actor/Logo.java b/core/src/main/java/coffee/liz/abstractionengine/app/actor/Logo.java
index 41847b5..e8bf025 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/actor/Logo.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/actor/Logo.java
@@ -10,11 +10,22 @@ import com.badlogic.gdx.utils.Disposable;
public class Logo extends Actor implements Disposable {
private final Texture texture;
+ /**
+ * Creates a logo actor.
+ */
public Logo() {
this.texture = new Texture(Gdx.files.internal("sprites/logo.png"));
setSize(texture.getWidth(), texture.getHeight());
}
+ /**
+ * Actor draw hook.
+ *
+ * @param batch
+ * parent batch
+ * @param parentAlpha
+ * parent alpha multiplier
+ */
@Override
public void draw(final Batch batch, final float parentAlpha) {
final Color c = getColor();
@@ -22,6 +33,9 @@ public class Logo extends Actor implements Disposable {
batch.draw(texture, getX(), getY(), getWidth(), getHeight());
}
+ /**
+ * Releases actor resources.
+ */
@Override
public void dispose() {
texture.dispose();
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/actor/Penguin.java b/core/src/main/java/coffee/liz/abstractionengine/app/actor/Penguin.java
index 09b3d5b..4a557e7 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/actor/Penguin.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/actor/Penguin.java
@@ -25,6 +25,9 @@ public class Penguin extends Actor implements Disposable {
private Animation<TextureRegion> currentAnimation;
private float stateTime = 0f;
+ /**
+ * Creates a penguin actor.
+ */
public Penguin() {
this.texture = new Texture(Gdx.files.internal("sprites/penguins.png"));
final TextureRegion[][] tmp = TextureRegion.split(texture, texture.getWidth() / PENGUIN_FRAMES.getX(),
@@ -48,12 +51,26 @@ public class Penguin extends Actor implements Disposable {
this.currentAnimation = tobaganning;
}
+ /**
+ * Actor update hook.
+ *
+ * @param delta
+ * time since last frame
+ */
@Override
public void act(final float delta) {
super.act(delta);
stateTime += delta;
}
+ /**
+ * Actor draw hook.
+ *
+ * @param batch
+ * parent batch
+ * @param parentAlpha
+ * parent alpha multiplier
+ */
@Override
public void draw(final Batch batch, final float parentAlpha) {
final TextureRegion frame = currentAnimation.getKeyFrame(stateTime, true);
@@ -62,6 +79,12 @@ public class Penguin extends Actor implements Disposable {
batch.draw(frame, getX(), getY(), getWidth(), getHeight());
}
+ /**
+ * Sets the current animation state.
+ *
+ * @param state
+ * new state
+ */
public void setState(final State state) {
this.currentAnimation = switch (state) {
case EEPY -> eepy;
@@ -70,6 +93,9 @@ public class Penguin extends Actor implements Disposable {
};
}
+ /**
+ * Releases actor resources.
+ */
@Override
public void dispose() {
texture.dispose();
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/life/CellState.java b/core/src/main/java/coffee/liz/abstractionengine/app/life/CellState.java
index f25ad7c..025cde0 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/life/CellState.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/life/CellState.java
@@ -12,10 +12,21 @@ public class CellState implements Component {
private final float alivePercentage;
+ /**
+ * Creates a cell state with a normalized alive percentage.
+ *
+ * @param alivePercentage
+ * alive value in the range [0, 1]
+ */
public CellState(final float alivePercentage) {
this.alivePercentage = clamp(alivePercentage);
}
+ /**
+ * Returns true when the cell is considered alive.
+ *
+ * @return whether the cell is alive
+ */
public boolean isAlive() {
return alivePercentage >= (1.0f - EPS);
}
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/life/LifeSystem.java b/core/src/main/java/coffee/liz/abstractionengine/app/life/LifeSystem.java
index 82aa9c6..14c783f 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/life/LifeSystem.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/life/LifeSystem.java
@@ -20,10 +20,26 @@ public class LifeSystem extends BaseGridIndexSystem<LifeInput> {
private Duration sinceUpdate = Duration.ZERO;
+ /**
+ * Creates a life system.
+ *
+ * @param dimensions
+ * grid size
+ */
public LifeSystem(final Vec2<Integer> dimensions) {
super(dimensions);
}
+ /**
+ * Advances the simulation.
+ *
+ * @param world
+ * world to update
+ * @param state
+ * input state for this tick
+ * @param dt
+ * time step
+ */
@Override
public void update(final World<LifeInput> world, final LifeInput state, final Duration dt) {
super.update(world, state, dt);
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/screen/GameScreen.java b/core/src/main/java/coffee/liz/abstractionengine/app/screen/GameScreen.java
index adaad0e..c3fe2c8 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/screen/GameScreen.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/screen/GameScreen.java
@@ -8,36 +8,65 @@ import lombok.RequiredArgsConstructor;
public class GameScreen implements Screen {
private final AbstractionEngineGame game;
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void show() {
}
+ /**
+ * Screen render hook.
+ *
+ * @param delta
+ * time since last frame
+ */
@Override
public void render(float delta) {
}
+ /**
+ * Screen resize hook.
+ *
+ * @param width
+ * new width in pixels
+ * @param height
+ * new height in pixels
+ */
@Override
public void resize(int width, int height) {
}
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void pause() {
}
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void resume() {
}
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void hide() {
}
+ /**
+ * Screen cleanup hook.
+ */
@Override
public void dispose() {
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java b/core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java
index f1b6b02..06d0b03 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/screen/MainMenu.java
@@ -2,7 +2,7 @@ package coffee.liz.abstractionengine.app.screen;
import coffee.liz.abstractionengine.app.AbstractionEngineGame;
import coffee.liz.abstractionengine.app.Theme;
-import coffee.liz.abstractionengine.app.actor.BlockyButton;
+import coffee.liz.abstractionengine.app.actor.Button;
import coffee.liz.abstractionengine.app.actor.LifeGridActor;
import coffee.liz.abstractionengine.app.screen.mainmenu.MainMenuAudio;
import coffee.liz.abstractionengine.app.life.CellState;
@@ -44,6 +44,9 @@ public class MainMenu implements Screen {
private LifeGridActor lifeGridActor;
private MainMenuAudio audioSystem;
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void show() {
Mat2.init(GRID_DIMENSIONS, pos -> world.createEntity().add(new GridPosition(pos))
@@ -68,13 +71,13 @@ public class MainMenu implements Screen {
final float centerX = (worldWidth - BUTTON_WIDTH) / 2f;
final float startY = worldHeight / 2f + BUTTON_HEIGHT;
- final BlockyButton playButton = createButton("Play", centerX, startY);
+ final Button playButton = createButton("play", centerX, startY);
playButton.setOnClick(() -> game.setScreen(new GameScreen(game)));
stage.addActor(playButton);
}
- private BlockyButton createButton(final String text, final float x, final float y) {
- final BlockyButton button = new BlockyButton(game.shapeRenderer, game.font, text);
+ private Button createButton(final String text, final float x, final float y) {
+ final Button button = new Button(game.shapeRenderer, game.font, text);
button.setPosition(x, y);
button.setSize(BUTTON_WIDTH, BUTTON_HEIGHT);
button.addButtonListener();
@@ -94,6 +97,12 @@ public class MainMenu implements Screen {
return gliderPattern;
}
+ /**
+ * Screen render hook.
+ *
+ * @param delta
+ * time since last frame
+ */
@Override
public void render(final float delta) {
game.viewport.apply();
@@ -116,24 +125,44 @@ public class MainMenu implements Screen {
lifeGridActor.setParallaxOffset(parallax);
}
+ /**
+ * Screen resize hook.
+ *
+ * @param width
+ * new width in pixels
+ * @param height
+ * new height in pixels
+ */
@Override
public void resize(final int width, final int height) {
game.viewport.update(width, height, true);
}
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void pause() {
}
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void resume() {
}
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void hide() {
dispose();
}
+ /**
+ * Screen cleanup hook.
+ */
@Override
public void dispose() {
audioSystem.dispose();
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/screen/ScrollLogo.java b/core/src/main/java/coffee/liz/abstractionengine/app/screen/ScrollLogo.java
index 225457f..ab2aa5e 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/screen/ScrollLogo.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/screen/ScrollLogo.java
@@ -30,6 +30,9 @@ public class ScrollLogo implements Screen {
private Penguin penguin;
private Group animationGroup;
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void show() {
stage = new Stage(game.viewport, game.batch);
@@ -73,6 +76,12 @@ public class ScrollLogo implements Screen {
Actions.fadeOut(fadeDuration), Actions.run(this::requestTransition)));
}
+ /**
+ * Screen render hook.
+ *
+ * @param delta
+ * time since last frame
+ */
@Override
public void render(final float delta) {
game.viewport.apply();
@@ -81,24 +90,44 @@ public class ScrollLogo implements Screen {
stage.draw();
}
+ /**
+ * Screen resize hook.
+ *
+ * @param width
+ * new width in pixels
+ * @param height
+ * new height in pixels
+ */
@Override
public void resize(final int width, final int height) {
game.viewport.update(width, height, true);
}
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void pause() {
}
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void resume() {
}
+ /**
+ * Screen lifecycle hook.
+ */
@Override
public void hide() {
dispose();
}
+ /**
+ * Screen cleanup hook.
+ */
@Override
public void dispose() {
if (logo != null) {
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/screen/mainmenu/MainMenuAudio.java b/core/src/main/java/coffee/liz/abstractionengine/app/screen/mainmenu/MainMenuAudio.java
index 516fded..bb8beda 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/screen/mainmenu/MainMenuAudio.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/screen/mainmenu/MainMenuAudio.java
@@ -77,12 +77,21 @@ public class MainMenuAudio implements Runnable, Disposable {
@Getter
private Thread audioThread;
+ /**
+ * Creates a main menu audio controller.
+ *
+ * @param gridDimensions
+ * grid size used for scaling activity
+ */
public MainMenuAudio(final Vec2<Integer> gridDimensions) {
this.device = Gdx.audio.newAudioDevice(SAMPLE_RATE, true);
this.gridDimensions = gridDimensions;
this.maxActivity = gridDimensions.getX() * gridDimensions.getY() * MAX_ACTIVITY_FRACTION;
}
+ /**
+ * Starts the background audio thread.
+ */
public void start() {
audioThread = new Thread(this, "main-menu-audio");
audioThread.setDaemon(true);
@@ -90,8 +99,10 @@ public class MainMenuAudio implements Runnable, Disposable {
}
/**
- * Updates activity metrics derived from current grid entities. This drives
- * chord density and positional tones in the audio thread.
+ * Updates the audio inputs from current entities.
+ *
+ * @param entities
+ * grid entities to sample
*/
public void update(final Collection<Entity> entities) {
float totalActivity = 0.0f;
@@ -121,6 +132,9 @@ public class MainMenuAudio implements Runnable, Disposable {
}
}
+ /**
+ * Audio thread loop.
+ */
@Override
public void run() {
while (running) {
@@ -197,6 +211,9 @@ public class MainMenuAudio implements Runnable, Disposable {
+ (float) Math.sin(positionYPhase * TWO_PI) * positionVolume * POSITION_Y_GAIN;
}
+ /**
+ * Releases audio resources.
+ */
@Override
public void dispose() {
running = false;
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java b/core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java
index 32f2dc1..8304977 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/utils/FunctionUtils.java
@@ -4,6 +4,12 @@ public final class FunctionUtils {
private FunctionUtils() {
}
+ /**
+ * Runs the provided action and wraps failures.
+ *
+ * @param run
+ * action to execute
+ */
public static <E extends Throwable> void runUninterrupted(final ThrowableRunnable<E> run) {
try {
run.run();
@@ -14,6 +20,9 @@ public final class FunctionUtils {
@FunctionalInterface
public interface ThrowableRunnable<E extends Throwable> {
+ /**
+ * Performs the action.
+ */
void run() throws E;
}
}
diff --git a/core/src/main/java/coffee/liz/abstractionengine/app/utils/TimerUtils.java b/core/src/main/java/coffee/liz/abstractionengine/app/utils/TimerUtils.java
index d411ddc..dea7bd2 100644
--- a/core/src/main/java/coffee/liz/abstractionengine/app/utils/TimerUtils.java
+++ b/core/src/main/java/coffee/liz/abstractionengine/app/utils/TimerUtils.java
@@ -6,6 +6,13 @@ public final class TimerUtils {
private TimerUtils() {
}
+ /**
+ * Creates a {@link Timer.Task} from a runnable.
+ *
+ * @param r
+ * action to run
+ * @return timer task that runs the action
+ */
public static Timer.Task sideEffectTask(final Runnable r) {
return new Timer.Task() {
@Override