aboutsummaryrefslogtreecommitdiff
path: root/cmd/mud/main.go
blob: 55804d34ea6ba53f5d95041b7b552c56ff73d5af (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package main

import (
	"flag"
	"fmt"
	"log"
	"os"
	"os/signal"
	"syscall"

	"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)
		}
	}

	g := game.New(dataDir, &cfg.Colors)
	g.Ticks.Start(cfg.Game.TickLength)
	defer g.Ticks.Stop()

	g.Ticks.Subscribe(1, func() bool {
		g.MoveTick()
		g.ProcessQueuedCommands()
		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()
		return true
	})

	server, err := net.NewServer(cfg)
	if err != nil {
		log.Fatalf("failed to start server: %v", err)
	}
	g.SetHub(server.Hub())

	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)
	}
}