- Java 21+ with preview features support
- Maven 3.x
- Terminal emulator (supports ANSI colors)
git clone <repository-url>
cd console-jack
mvn compile
mvn exec:java # Verify everything works# Start development session
mvn compile
mvn exec:java
# Make code changes...
# Quick verification
mvn compile && mvn exec:java# Style validation (Google Java Style)
mvn checkstyle:check
# Fix style issues and re-check
mvn checkstyle:check# Full clean build
mvn clean compile
# Create distributable
mvn clean package
# Test the packaged version
java -jar target/console-jack-1.0-SNAPSHOT-jar-with-dependencies.jarmvn compile # Compile source code only
mvn clean compile # Clean and compile
mvn test-compile # Compile test sources (when tests exist)mvn exec:java # Run with exec plugin (development)
mvn exec:java -Dexec.args="--debug" # Pass argumentsmvn package # Create JAR with dependencies
mvn clean package # Clean build
java -jar target/console-jack-1.0-SNAPSHOT-jar-with-dependencies.jar# Windows executable
mvn clean package -Pwindows
# Output: build-win/
# macOS package
mvn clean package -Pmac
# Output: build-mac/
# Linux executable
mvn clean package -Plinux
# Output: build-linux/mvn checkstyle:check # Style validation
mvn checkstyle:checkstyle # Generate style report- Standard: Google Java Style Guide
- Enforcement: Checkstyle with
google_checks.xml - IDE Setup: Import Google style settings
// Classes: PascalCase
public class GameplayState { }
// Methods: camelCase
public void startNewGame() { }
// Fields: camelCase
private boolean gameRunning;
// Constants: UPPER_SNAKE_CASE
private static final int TARGET_UPS = 8;
// Packages: lowercase.separated
net.luxsolari.engine.systems/**
* Brief description of the class purpose.
*
* <p>Longer description with implementation details,
* design decisions, or usage examples.
*/
public class ExampleClass {
/**
* Brief method description.
*
* @param parameter description of parameter
* @return description of return value
* @throws ExceptionType when this exception occurs
*/
public String exampleMethod(String parameter) {
// implementation
}
}- Create enum singleton:
public enum NewSubsystem implements Subsystem {
INSTANCE;
@Override
public void init() throws ResourceInitializationException {
// initialization
}
@Override
public void start() { /* start logic */ }
@Override
public void stop() { /* stop logic */ }
@Override
public void cleanUp() throws ResourceCleanupException {
// cleanup
}
}- Register in MasterSubsystem
- Create corresponding Manager if needed
- Implement LoopableState:
public class NewGameState implements LoopableState {
@Override
public void onEnter() {
// State initialization
}
@Override
public void update() {
// Per-frame logic
}
@Override
public void onExit() {
// State cleanup
}
}- Add state transitions in existing states
- Register with StateMachineManager
- Create data record:
public record NewComponent(
String data,
int value
) implements Component {}- Create or modify systems to process the component
- Add to entities in EntityPool when needed
- Extend base classes:
public class NewWidget extends UIWidget implements Focusable {
@Override
public void render(Screen screen) {
// Rendering logic
}
@Override
public boolean handleInput(KeyStroke keyStroke) {
// Input handling
return false; // true if consumed
}
}# Run and verify core functionality
mvn exec:java
# Test areas:
# - Main menu navigation
# - Game state transitions
# - Input responsiveness
# - Audio playback (if enabled)
# - Clean exit# Monitor during gameplay:
# - UPS consistency (should be ~8)
# - Memory usage
# - Thread behavior
# - Audio synchronization# Test all platforms
mvn clean package -Pwindows
mvn clean package -Pmac
mvn clean package -Plinux
# Verify each package runs correctly- Create
MenuActionfor the action - Add
MenuItemto the menu - Implement action logic
- Test navigation
- Place WAV file in
src/main/resources/audio/sfx/ - Load in
AudioManager - Trigger via
AudioSubsystem.INSTANCE
- Create
CardArtcomponent - Update
CardSpriterendering - Modify
DisplayListSystemif needed
// Add temporary logging
private static final Logger LOGGER =
Logger.getLogger(YourClass.class.getName());
LOGGER.info("Debug message: " + value);- Use JVisualVM or JProfiler
- Focus on game loop timing
- Monitor ECS system performance
- Check for memory leaks
Build Failures:
# Clear Maven cache
mvn clean
rm -rf ~/.m2/repository/net/luxsolari
# Rebuild
mvn compileRuntime Issues:
- Check Java version (must be 21+)
- Verify terminal supports ANSI colors
- Ensure audio dependencies are available
Performance Issues:
- Profile with JVisualVM
- Check for excessive object creation
- Verify thread synchronization
- All code passes Checkstyle
- Application runs without errors
- All platforms build successfully
- Performance meets targets (8 UPS)
- Audio works correctly
- Documentation is current
# Version update (if needed)
# Update version in pom.xml
# Build all platforms
mvn clean package -Pwindows
mvn clean package -Pmac
mvn clean package -Plinux
# Create release packages
# Package build-win/, build-mac/, build-linux/- Lanterna Documentation: GitHub
- AudioCue Documentation: GitHub
- Google Java Style: Style Guide
- Effective Java: Best practices reference
- Check this guide first
- Review
ARCHITECTURE.mdfor design questions - Check
IMPROVEMENT_PLAN.mdfor planned changes - Review code comments and JavaDoc
- Test with
mvn exec:javato verify behavior