diff options
| author | historia <[not public]> | 2026-07-03 20:53:00 -0400 |
|---|---|---|
| committer | historia <[not public]> | 2026-07-03 20:53:00 -0400 |
| commit | a5d4ead1795882d25da7eda53680d2a84590693d (patch) | |
| tree | 747a0516e03f22fdf511e55ee4c4809d4a1acd78 /cmd/thoi/main.go | |
| parent | 0dfd7bf19e800b67e03726c18cfa00e623d6b121 (diff) | |
| download | thehouseoficarus-a5d4ead1795882d25da7eda53680d2a84590693d.tar.gz | |
feat: admin map can add new and rename areas. works with empty directories now.
Diffstat (limited to 'cmd/thoi/main.go')
| -rw-r--r-- | cmd/thoi/main.go | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/cmd/thoi/main.go b/cmd/thoi/main.go new file mode 100644 index 0000000..23a2ca4 --- /dev/null +++ b/cmd/thoi/main.go @@ -0,0 +1,139 @@ +package main + +import ( + "flag" + "fmt" + "log" + "os" + "os/signal" + "syscall" + + "thehouseoficarus/internal/admin" + "thehouseoficarus/internal/behavior" + "thehouseoficarus/internal/config" + "thehouseoficarus/internal/game" + "thehouseoficarus/internal/net" +) + +func main() { + configPath := flag.String("config", "config.yaml", "path to config file") + flag.Parse() + + dataDir := os.Getenv("DATA_DIR") + if dataDir == "" { + dataDir = "data" + } + + cfg, err := config.Load(*configPath) + if err != nil { + if os.IsNotExist(err) { + log.Printf("config file %s not found, creating with defaults", *configPath) + if err := config.SaveDefault(*configPath); err != nil { + log.Fatalf("failed to create config: %v", err) + } + cfg = config.Default() + } else { + log.Fatalf("failed to load config: %v", err) + } + } + + if cfg.GameConstants.ShopDefaultRestock > 0 { + behavior.ShopDefaultRestock = cfg.GameConstants.ShopDefaultRestock + } + + g := game.New(dataDir, &cfg.DefaultColors, cfg.StartupValidation, cfg.StartingRoom) + g.Ticks.Start(cfg.TickLength) + defer g.Ticks.Stop() + + g.Ticks.Subscribe(1, func() bool { + g.MoveTick() + g.ProcessQueuedCommands() + g.EnterSeqTick() + g.TriggerSeqTick() + g.TransientMobTick() + g.World.Tick() + g.MobStore.Tick() + g.RegenTick() + g.DisconnectTick() + g.WanderTick() + g.SharedDepletionTick() + g.FireTick() + g.AdvanceActions() + g.TechTick() + g.ConsumeTick() + g.BroadcastRespawns() + g.VisualTick() + g.SneakTick() + g.FarmTick() + g.BuffTick() + g.SafespotTick() + g.HazardTick() + return true + }) + + server, err := net.NewServer(cfg) + if err != nil { + log.Fatalf("failed to start server: %v", err) + } + g.SetHub(server.Hub()) + + junkItems := []string{"solarjunk", "ecojunk", "hydrojunk", "biojunk", "chaosjunk", + "cosmicjunk", "naturejunk", "bloodjunk", "deathjunk", "lawjunk", "scrap"} + for _, j := range junkItems { + g.World.AddGroundItem(1, j, 500) + } + + if cfg.AdminHTTP.Enabled { + adminSrv, err := admin.NewServer(cfg, false, g.AccountStore, g.World, g.ItemStore, g.ObjectStore, g.MobStore, dataDir) + if err != nil { + log.Fatalf("failed to start admin HTTP server: %v", err) + } + go func() { + if err := adminSrv.ListenAndServe(); err != nil { + log.Printf("admin HTTP server error: %v", err) + } + }() + log.Printf("Admin HTTP listening on :%d", cfg.AdminHTTP.Port) + } + + if cfg.AdminHTTPS.Enabled { + adminSrv, err := admin.NewServer(cfg, true, g.AccountStore, g.World, g.ItemStore, g.ObjectStore, g.MobStore, dataDir) + if err != nil { + log.Fatalf("failed to start admin HTTPS server: %v", err) + } + go func() { + if err := adminSrv.ListenAndServe(); err != nil { + log.Printf("admin HTTPS server error: %v", err) + } + }() + log.Printf("Admin HTTPS listening on :%d", cfg.AdminHTTPS.Port) + } + + if cfg.Telnet.Enabled { + log.Printf("Telnet listening on :%d", cfg.Telnet.Port) + } + if cfg.TelnetTLS.Enabled { + log.Printf("Telnet+TLS listening on :%d", cfg.TelnetTLS.Port) + } + if cfg.HTTP.Enabled { + log.Printf("HTTP listening on :%d", cfg.HTTP.Port) + } + if cfg.HTTPS.Enabled { + log.Printf("HTTPS listening on :%d", cfg.HTTPS.Port) + } + fmt.Println() // blank line after log prefixes + + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) + + go func() { + <-sigCh + log.Println("Shutting down...") + g.Ticks.Stop() + os.Exit(0) + }() + + if err := server.ListenAndServe(g.HandleSession); err != nil { + log.Fatalf("server error: %v", err) + } +} |
