diff --git a/balance/README.md b/balance/README.md new file mode 100644 index 0000000..7ece450 --- /dev/null +++ b/balance/README.md @@ -0,0 +1,33 @@ +# balance + +Constants and settings for the Doodle app. + +## Environment Variables + +Some runtime settings can be configured in the environment. Here they are +with their default values. + +Most colors work with alpha channels; just provide an 8 hex character code, +like `#FF00FF99` for 153 ($99) on the alpha channel. + +* Application Windw Size (ints): + * `DOODLE_W=1024` + * `DOODLE_H=768` +* Shell settings: + * `D_SHELL_BG=#001428C8`: shell background color. + * `D_SHELL_FG=#0099FF`: shell text color. + * `D_SHELL_PC=#FFFFFF`: shell prompt color. + * `D_SHELL_LN=8`: shell history line count (how tall the shell is in lines) + * `D_SHELL_FS=16`: font size for both the shell and on-screen flashed + messages. +* Debug Colors and Hitboxes (default invisible=off): + * `DEBUG_CHUNK_COLOR=#FFFFFF`: background color when caching a + chunk to bitmap. Helps visualize where the chunks and caching + are happening. + * `DEBUG_CANVAS_BORDER`: draw a border color around every uix.Canvas + widget. This effectively draws the bounds of every Doodad drawn on top + of a level or inside a button and the bounds of the level space itself. +* Tuning constants (may not be available in production builds): + * `D_SCROLL_SPEED=8`: Canvas scroll speed when using the keyboard arrows + in the Editor Mode, in pixels per tick. + * `D_DOODAD_SIZE=100`: Default size when creating a new Doodad. diff --git a/balance/debug.go b/balance/debug.go index 0b8f86e..12548e9 100644 --- a/balance/debug.go +++ b/balance/debug.go @@ -1,7 +1,9 @@ package balance import ( + "fmt" "os" + "strconv" "git.kirsle.net/apps/doodle/render" ) @@ -17,10 +19,63 @@ var ( // on disk. Default is white. Setting this to translucent yellow is a great // way to visualize the chunks loaded from cache on your screen. DebugChunkBitmapBackground = render.White // XXX: export $DEBUG_CHUNK_COLOR + + // Put a border around all Canvas widgets. + DebugCanvasBorder = render.Red ) func init() { - if color := os.Getenv("DEBUG_CHUNK_COLOR"); color != "" { - DebugChunkBitmapBackground = render.MustHexColor(color) + // Load values from environment variables. + var config = map[string]interface{}{ + // Window size. + "DOODLE_W": &Width, + "DOODLE_H": &Height, + + // Tune some parameters. XXX: maybe dangerous at some point. + "D_SCROLL_SPEED": &CanvasScrollSpeed, + "D_DOODAD_SIZE": &DoodadSize, + + // Shell settings. + "D_SHELL_BG": &ShellBackgroundColor, + "D_SHELL_FG": &ShellForegroundColor, + "D_SHELL_PC": &ShellPromptColor, + "D_SHELL_LN": &ShellHistoryLineCount, + "D_SHELL_FS": &ShellFontSize, + + // Visualizers + "DEBUG_CHUNK_COLOR": &DebugChunkBitmapBackground, + "DEBUG_CANVAS_BORDER": &DebugCanvasBorder, + } + for name, value := range config { + switch v := value.(type) { + case *int: + *v = IntEnv(name, *(v)) + case *int32: + *v = int32(IntEnv(name, int(*(v)))) + case *render.Color: + *v = ColorEnv(name, *(v)) + } } } + +// ColorEnv gets a color value from environment variable or returns a default. +// This will panic if the color is not valid, so only do this on startup time. +func ColorEnv(name string, v render.Color) render.Color { + if color := os.Getenv(name); color != "" { + fmt.Printf("set %s to %s\n", name, color) + return render.MustHexColor(color) + } + return v +} + +// IntEnv gets an int value from environment variable or returns a default. +func IntEnv(name string, v int) int { + if env := os.Getenv(name); env != "" { + a, err := strconv.Atoi(env) + if err != nil { + panic(err) + } + return a + } + return v +}