commit
ad4efeb8c2
|
@ -0,0 +1,46 @@
|
|||
# gomud
|
||||
|
||||
multi-user dungeon engine written in go
|
||||
|
||||
## motivation
|
||||
|
||||
- learn go
|
||||
- make something super fun
|
||||
|
||||
## current status
|
||||
|
||||
- echo server
|
||||
|
||||
## game features
|
||||
|
||||
- text based rpg
|
||||
- it's super fun
|
||||
|
||||
## application features
|
||||
|
||||
- auth (TLS?): user, password, characters
|
||||
- connect via telnet or netcat
|
||||
- persistance (database)
|
||||
|
||||
## entities
|
||||
|
||||
- characters/heroes
|
||||
- level (experience)
|
||||
- stats
|
||||
- skills (not classes?)
|
||||
- ancestry (not races)
|
||||
- items
|
||||
- weapons (wieldable)
|
||||
- armour (wearable)
|
||||
- npcs
|
||||
- monsters
|
||||
- friendlies
|
||||
- environment
|
||||
- rooms
|
||||
- quests
|
||||
|
||||
## roadmap
|
||||
|
||||
- scriptable: should be able to create content in game
|
||||
- exploration to scale: wilderness map
|
||||
- websocket support
|
|
@ -0,0 +1,70 @@
|
|||
# learning
|
||||
|
||||
stuff we learned along the way
|
||||
|
||||
## 2021-12-28
|
||||
|
||||
Stuff i learned about go
|
||||
|
||||
|
||||
- `:=` short assignment, infers type: `x := 4`. vs "long" assignment: `var x int; x = 4`
|
||||
- expressive ifs: declare, assign, evaluate
|
||||
|
||||
```
|
||||
if x := isBar(); x > 10 {
|
||||
println("big number")
|
||||
} else {
|
||||
println("it's kind of small")
|
||||
}
|
||||
```
|
||||
|
||||
- `defer` wrapup (e.g. `conn.Close()`)
|
||||
- data structures are array (fixed), slice (variable), and channel
|
||||
- mulitiple returns. common convention:
|
||||
|
||||
```
|
||||
foo, err := bar()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
```
|
||||
- pointers 😬
|
||||
- use `make` to make arrays, slices, channels
|
||||
- `for` is the only loop.
|
||||
- structs and interfaces. here's a pair type:
|
||||
|
||||
```
|
||||
type pair struct {
|
||||
x, y int
|
||||
}
|
||||
```
|
||||
|
||||
and here's a toString interface:
|
||||
|
||||
```
|
||||
type Stringer interface {
|
||||
toString() string
|
||||
}
|
||||
```
|
||||
|
||||
and here's adding a method to a struct to implement the interface:
|
||||
|
||||
```
|
||||
func(p pair) toString() string {
|
||||
return fmt.Sprintf("(%d, %d)", p.x, p.y)
|
||||
}
|
||||
```
|
||||
|
||||
and here's using the compiler to check the interface:
|
||||
|
||||
```
|
||||
var p Stringer = pair{3, 4}
|
||||
```
|
||||
|
||||
resources
|
||||
|
||||
- https://learnxinyminutes.com/docs/go/
|
||||
- https://www.youtube.com/watch?v=Eb1Q98PmyLQ
|
||||
- https://www.youtube.com/watch?v=oyKrI8e1-9U&t
|
||||
- https://pkg.go.dev/net/http
|
||||
- https://github.com/josa42/coc-go
|
|
@ -0,0 +1,62 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net"
|
||||
)
|
||||
|
||||
func handleConnection(conn net.Conn) error {
|
||||
buff := make([]byte, 4096)
|
||||
defer conn.Close()
|
||||
|
||||
welcome := "=== Hola, Wikipedia! ==="
|
||||
conn.Write([]byte(welcome + "\n"))
|
||||
|
||||
for {
|
||||
if n, err := conn.Read(buff); err != nil {
|
||||
return err
|
||||
} else if n == 0 {
|
||||
log.Println("Zero bytes, connection closed")
|
||||
break
|
||||
} else {
|
||||
msg := buff[0 : n-2] // trim "\r\n"
|
||||
log.Print(fmt.Sprintf("msg: %s", msg))
|
||||
|
||||
resp := fmt.Sprintf("You said: \"%s\"\r\n", msg)
|
||||
if n, err := conn.Write([]byte(resp)); err != nil {
|
||||
return err
|
||||
} else if n == 0 {
|
||||
log.Println("zero bytes, closing connection")
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func startSever() error {
|
||||
if ln, err := net.Listen("tcp", ":8008"); err != nil {
|
||||
return err
|
||||
} else {
|
||||
for {
|
||||
if conn, err := ln.Accept(); err != nil {
|
||||
log.Printf("Error accepting connection", err)
|
||||
continue
|
||||
} else {
|
||||
log.Println("New connection accepted")
|
||||
go func() {
|
||||
if err := handleConnection(conn); err != nil {
|
||||
log.Println("Error handling connection", err)
|
||||
}
|
||||
}()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
if err := startSever(); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue