76 lines
2.9 KiB
Go
76 lines
2.9 KiB
Go
package main
|
||
|
||
import (
|
||
"bufio"
|
||
"os"
|
||
"path/filepath"
|
||
"strconv"
|
||
"strings"
|
||
)
|
||
|
||
// wayfarerEnvVar — имя переменной в .env, которой можно поменять
|
||
// сид генерации всей галактики Странника (пасхалка в духе
|
||
// оригинальной Elite, где числа генератора можно было поменять
|
||
// прямо в исходном коде игры — здесь то же самое, но без правки
|
||
// кода коллекции).
|
||
const wayfarerEnvVar = "WAYFARER_GALAXY_SEED"
|
||
|
||
// loadWayfarerGalaxySeed ищет файл .env сначала рядом с исполняемым
|
||
// файлом программы, затем (если там не нашёлся или не удалось
|
||
// определить путь к исполняемому файлу — так бывает, например, при
|
||
// запуске через "go run .") в текущей рабочей директории. Если ни
|
||
// там, ни там подходящей строки нет — сид остаётся нулевым
|
||
// (стандартная галактика, поведение не меняется).
|
||
func loadWayfarerGalaxySeed() {
|
||
for _, dir := range wayfarerEnvSearchDirs() {
|
||
if seed, ok := readWayfarerSeedFromEnvFile(filepath.Join(dir, ".env")); ok {
|
||
wayfarerGalaxySeed = seed
|
||
return
|
||
}
|
||
}
|
||
}
|
||
|
||
func wayfarerEnvSearchDirs() []string {
|
||
var dirs []string
|
||
if exe, err := os.Executable(); err == nil {
|
||
dirs = append(dirs, filepath.Dir(exe))
|
||
}
|
||
if cwd, err := os.Getwd(); err == nil {
|
||
dirs = append(dirs, cwd)
|
||
}
|
||
return dirs
|
||
}
|
||
|
||
// readWayfarerSeedFromEnvFile читает path и ищет в нём строку вида
|
||
// WAYFARER_GALAXY_SEED=<число> (пробелы вокруг "=" и в начале/конце
|
||
// значения игнорируются; строки-комментарии, начинающиеся с "#", и
|
||
// пустые строки пропускаются). Возвращает (0, false), если файла нет,
|
||
// его не удалось прочитать, либо в нём нет такой переменной или её
|
||
// значение не является целым числом.
|
||
func readWayfarerSeedFromEnvFile(path string) (uint64, bool) {
|
||
f, err := os.Open(path)
|
||
if err != nil {
|
||
return 0, false
|
||
}
|
||
defer f.Close()
|
||
|
||
scanner := bufio.NewScanner(f)
|
||
for scanner.Scan() {
|
||
line := strings.TrimSpace(scanner.Text())
|
||
if line == "" || strings.HasPrefix(line, "#") {
|
||
continue
|
||
}
|
||
key, value, found := strings.Cut(line, "=")
|
||
if !found || strings.TrimSpace(key) != wayfarerEnvVar {
|
||
continue
|
||
}
|
||
value = strings.TrimSpace(value)
|
||
value = strings.Trim(value, `"'`)
|
||
n, err := strconv.ParseInt(value, 10, 64)
|
||
if err != nil {
|
||
return 0, false
|
||
}
|
||
return uint64(n), true
|
||
}
|
||
return 0, false
|
||
}
|