Skip to content

Commit cfaf4c1

Browse files
author
Assem Blaj
committed
fixes major bugs, adds testing for input queue, does a bit of refactoring
1 parent c141078 commit cfaf4c1

12 files changed

+326
-147
lines changed

example/game.go

+37-11
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
)
1717

1818
//var session *ggthx.SyncTestBackend
19-
var session *ggthx.Peer2PeerBackend
19+
var session ggthx.Peer2PeerBackend
2020
var player1 Player
2121
var player2 Player
2222
var game *Game
@@ -42,7 +42,10 @@ type Player struct {
4242

4343
func (g *Game) Update() error {
4444
now = int(time.Now().UnixMilli())
45-
ggthx.Idle(session, int(math.Max(0, float64(next-now-1))))
45+
//ggthx.Idle(session, int(math.Max(0, float64(next-now-1))))
46+
fmt.Println("Idling ")
47+
session.DoPoll(int(math.Max(0, float64(next-now-1))))
48+
fmt.Println("Idling Complete")
4649
if now >= next {
4750
g.RunFrame()
4851
next = now + 1000/60
@@ -54,22 +57,35 @@ func (g *Game) RunFrame() {
5457
input := g.ReadInputs()
5558
buffer := encodeInputs(input)
5659

57-
result := ggthx.AddLocalInput(session, ggthx.PlayerHandle(currentPlayer), buffer, len(buffer))
60+
fmt.Println("Attempting to add local inputs")
61+
//result := ggthx.AddLocalInput(session, ggthx.PlayerHandle(currentPlayer), buffer, len(buffer))
62+
result := session.AddLocalInput(ggthx.PlayerHandle(currentPlayer), buffer, len(buffer))
63+
fmt.Println("Attempt to add local inputs complete")
5864
if result == nil {
65+
fmt.Println("Attempt to add local inputs was successful")
5966
var values [][]byte
6067
disconnectFlags := 0
6168

62-
values, result = ggthx.SynchronizeInput(session, &disconnectFlags)
69+
fmt.Println("Attempting to synchronize inputs")
70+
//values, result = ggthx.SynchronizeInput(session, &disconnectFlags)
71+
values, result = session.SyncInput(&disconnectFlags)
6372
if result == nil {
73+
fmt.Println("Attempt synchronize inputs was sucessful")
74+
6475
inputs := decodeInputs(values)
6576
g.AdvanceFrame(inputs, disconnectFlags)
77+
} else {
78+
fmt.Println("Attempt synchronize inputs was unsucessful")
6679
}
80+
} else {
81+
fmt.Println("Attempt to add local inputs unsuccessful")
6782
}
6883
}
6984

7085
func (g *Game) AdvanceFrame(inputs []Input, disconnectFlags int) {
7186
g.UpdateByInputs(inputs)
72-
err := ggthx.AdvanceFrame(session)
87+
//err := ggthx.AdvanceFrame(session)
88+
err := session.IncrementFrame()
7389
if err != nil {
7490
panic(err)
7591
}
@@ -191,11 +207,13 @@ func freeBuffer(buffer []byte) {
191207
}
192208

193209
func advanceFrame(flags int) bool {
210+
fmt.Println("Advancing frame. ")
194211
var discconectFlags int
195212

196213
// Make sure we fetch the inputs from GGPO and use these to update
197214
// the game state instead of reading from the keyboard.
198-
inputs, result := ggthx.SynchronizeInput(session, &discconectFlags)
215+
//inputs, result := ggthx.SynchronizeInput(session, &discconectFlags)
216+
inputs, result := session.SyncInput(&discconectFlags)
199217
if result != nil {
200218
log.Fatal("Error from GGTHXSynchronizeInput")
201219
}
@@ -242,19 +260,27 @@ func GameInit(localPort int, numPlayers int, players []ggthx.Player, numSpectato
242260
callbacks.OnEvent = onEvent
243261
callbacks.SaveGameState = saveGameState
244262

245-
session = ggthx.StartSession(&callbacks, "Test", numPlayers, inputSize, localPort)
263+
//session = ggthx.StartSession(&callbacks, "Test", numPlayers, inputSize, localPort)
264+
session = ggthx.NewPeer2PeerBackend(&callbacks, "Test", localPort, numPlayers, inputSize)
265+
session.SetDisconnectTimeout(3000)
266+
session.SetDisconnectNotifyStart(1000)
246267

247-
ggthx.SetDisconnectTimeout(session, 3000)
248-
ggthx.SetDisconnectNotifyStart(session, 1000)
268+
//ggthx.SetDisconnectTimeout(session, 3000)
269+
//ggthx.SetDisconnectNotifyStart(session, 1000)
249270

250271
for i := 0; i < numPlayers+numSpectators; i++ {
251272
var handle ggthx.PlayerHandle
252-
result = ggthx.AddPlayer(session, &players[i], &handle)
273+
//result = ggthx.AddPlayer(session, &players[i], &handle)
274+
result = session.AddPlayer(&players[i], &handle)
275+
if players[i].PlayerType == ggthx.PlayerTypeLocal {
276+
currentPlayer = int(handle)
277+
}
253278
if result != nil {
254279
log.Fatalf("There's an issue from AddPlayer")
255280
}
256281
if players[i].PlayerType == ggthx.PlayerTypeLocal {
257-
ggthx.SetFrameDelay(session, handle, FRAME_DELAY)
282+
//ggthx.SetFrameDelay(session, handle, FRAME_DELAY)
283+
session.SetFrameDelay(handle, FRAME_DELAY)
258284

259285
}
260286
}

go.mod

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,14 @@ module github.com/assemblaj/ggthx
22

33
go 1.18
44

5-
require golang.org/x/exp v0.0.0-20220609121020-a51bd0440498
5+
require (
6+
github.com/hajimehoshi/ebiten/v2 v2.3.4
7+
golang.org/x/exp v0.0.0-20220609121020-a51bd0440498
8+
)
69

710
require (
811
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20220320163800-277f93cfa958 // indirect
912
github.com/gofrs/flock v0.8.1 // indirect
10-
github.com/hajimehoshi/ebiten/v2 v2.3.4 // indirect
1113
github.com/jezek/xgb v1.0.0 // indirect
1214
golang.org/x/exp/shiny v0.0.0-20220613132600-b0d781184e0d // indirect
1315
golang.org/x/image v0.0.0-20220321031419-a8550c1d254a // indirect

go.sum

+3
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ github.com/jezek/xgb v1.0.0 h1:s2rRzAV8KQRlpsYA7Uyxoidv1nodMF0m6dIG6FhhVLQ=
1515
github.com/jezek/xgb v1.0.0/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk=
1616
github.com/jfreymuth/oggvorbis v1.0.3/go.mod h1:1U4pqWmghcoVsCJJ4fRBKv9peUJMBHixthRlBeD6uII=
1717
github.com/jfreymuth/vorbis v1.0.2/go.mod h1:DoftRo4AznKnShRl1GxiTFCseHr4zR9BN3TWXyuzrqQ=
18+
github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI=
1819
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
1920
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
21+
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
2022
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
2123
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
2224
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
@@ -77,4 +79,5 @@ golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E
7779
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7880
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
7981
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
82+
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
8083
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=

src/input_queue.go

+9-6
Original file line numberDiff line numberDiff line change
@@ -54,17 +54,17 @@ func NewInputQueue(id int, inputSize int) InputQueue {
5454

5555
}
5656

57-
func (i InputQueue) LastConfirmedFrame() int {
57+
func (i *InputQueue) LastConfirmedFrame() int {
5858
log.Printf("returning last confirmed frame %d.\n", i.lastUserAddedFrame)
5959
return i.lastAddedFrame
6060
}
6161

62-
func (i InputQueue) FirstIncorrectFrame() int {
62+
func (i *InputQueue) FirstIncorrectFrame() int {
6363
return i.firstIncorrectFrame
6464
}
6565

6666
func (i *InputQueue) DiscardConfirmedFrames(frame int) error {
67-
if frame <= 0 {
67+
if frame < 0 {
6868
return errors.New("ggthx: InputQueue discardConfirmedFrames: frames <= 0")
6969
}
7070

@@ -108,7 +108,7 @@ func (i *InputQueue) ResetPrediction(frame int) error {
108108
return nil
109109
}
110110

111-
func (i InputQueue) GetConfirmedInput(requestedFrame int, input *GameInput) (bool, error) {
111+
func (i *InputQueue) GetConfirmedInput(requestedFrame int, input *GameInput) (bool, error) {
112112
if !(i.firstIncorrectFrame == NullFrame || requestedFrame < i.firstIncorrectFrame) {
113113
return false, errors.New("ggthx: InputQueue GetConfirmedInput : i.firstIncorrectFrame != NullFrame && requestedFrame >")
114114
}
@@ -176,7 +176,7 @@ func (i *InputQueue) AddInput(input *GameInput) error {
176176
log.Printf("adding input frame number %d to queue.\n", input.Frame)
177177

178178
if !(i.lastUserAddedFrame == NullFrame || input.Frame == i.lastUserAddedFrame+1) {
179-
return errors.New("ggthx : AddInput : !(i.lastUserAddedFrame == NullFrame || input.Frame == i.lastUserAddedFrame+1)")
179+
return errors.New("ggthx : InputQueue AddInput : !(i.lastUserAddedFrame == NullFrame || input.Frame == i.lastUserAddedFrame+1)")
180180
}
181181
i.lastUserAddedFrame = input.Frame
182182

@@ -213,7 +213,6 @@ func (i *InputQueue) AddDelayedInputToQueue(input *GameInput, frameNumber int) e
213213
i.firstFrame = false
214214

215215
i.lastAddedFrame = frameNumber
216-
217216
if i.prediction.Frame != NullFrame {
218217
if frameNumber != i.prediction.Frame {
219218
return errors.New("ggthx: InputQueue AddDelayedInputToQueue : frameNumber != i.prediction.Frame")
@@ -286,3 +285,7 @@ func previousFrame(offset int) int {
286285
func (i *InputQueue) SetFrameDelay(delay int) {
287286
i.frameDelay = delay
288287
}
288+
289+
func (i *InputQueue) Length() int {
290+
return i.length
291+
}

src/input_queue_test.go

+89
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package ggthx_test
2+
3+
import (
4+
"testing"
5+
6+
ggthx "github.com/assemblaj/ggthx/src"
7+
)
8+
9+
/*
10+
Charecterization Tests
11+
*/
12+
func TestFirstLastConfirmedFrame(t *testing.T) {
13+
queue := ggthx.NewInputQueue(0, 50)
14+
want := ggthx.NullFrame
15+
got := queue.LastConfirmedFrame()
16+
if want != got {
17+
t.Errorf("expected '%#v' but got '%#v'", want, got)
18+
}
19+
}
20+
21+
func TestFirstFirstIncorrectFrame(t *testing.T) {
22+
queue := ggthx.NewInputQueue(0, 50)
23+
want := ggthx.NullFrame
24+
got := queue.FirstIncorrectFrame()
25+
if want != got {
26+
t.Errorf("expected '%#v' but got '%#v'", want, got)
27+
}
28+
}
29+
30+
// AddInput
31+
func TestAddFirstInput(t *testing.T) {
32+
queue := ggthx.NewInputQueue(0, 50)
33+
input, _ := ggthx.NewGameInput(0, nil, 50)
34+
queue.AddInput(&input)
35+
want := 0
36+
got := queue.LastConfirmedFrame()
37+
if want != got {
38+
t.Errorf("expected '%#v' but got '%#v'", want, got)
39+
}
40+
}
41+
42+
func TestAddFirstInputLength(t *testing.T) {
43+
queue := ggthx.NewInputQueue(0, 50)
44+
input, _ := ggthx.NewGameInput(0, nil, 50)
45+
queue.AddInput(&input)
46+
want := 1
47+
got := queue.Length()
48+
if want != got {
49+
t.Errorf("expected '%#v' but got '%#v'", want, got)
50+
}
51+
52+
}
53+
54+
func TestAddTenInputsDifferentFrame(t *testing.T) {
55+
queue := ggthx.NewInputQueue(0, 50)
56+
for i := 0; i < 10; i++ {
57+
input, _ := ggthx.NewGameInput(i, nil, 50)
58+
queue.AddInput(&input)
59+
}
60+
want := 10
61+
got := queue.Length()
62+
if want != got {
63+
t.Errorf("expected '%#v' but got '%#v'", want, got)
64+
}
65+
66+
}
67+
68+
func TestAddTenInputsSameFrame(t *testing.T) {
69+
queue := ggthx.NewInputQueue(0, 50)
70+
for i := 0; i < 10; i++ {
71+
input, _ := ggthx.NewGameInput(0, nil, 50)
72+
queue.AddInput(&input)
73+
}
74+
want := 1
75+
got := queue.Length()
76+
if want != got {
77+
t.Errorf("expected '%#v' but got '%#v'", want, got)
78+
}
79+
}
80+
81+
// GetInput
82+
func TestGetInputEmptyQueue(t *testing.T) {
83+
queue := ggthx.NewInputQueue(0, 50)
84+
var input ggthx.GameInput
85+
_, err := queue.GetInput(0, &input)
86+
if err != nil {
87+
t.Errorf("expected nil, got an error %s", err)
88+
}
89+
}

0 commit comments

Comments
 (0)