Compare commits

..

No commits in common. "7d83732e44d652be719926fb8849b3d33c531a05" and "e8f8129b35dc53579311c3d36d9c1ce584d9cb27" have entirely different histories.

2 changed files with 84 additions and 159 deletions

View File

@ -5,7 +5,6 @@ import (
"os" "os"
"testing" "testing"
"github.com/CPunch/gopenfusion/internal/protocol"
"github.com/bitcomplete/sqltestutil" "github.com/bitcomplete/sqltestutil"
) )
@ -15,7 +14,7 @@ var (
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
ctx := context.Background() ctx := context.Background()
psql, err := sqltestutil.StartPostgresContainer(ctx, "15") psql, err := sqltestutil.StartPostgresContainer(ctx, "latest")
if err != nil { if err != nil {
panic(err) panic(err)
} }
@ -48,77 +47,4 @@ func TestDBAccount(t *testing.T) {
if acc.Login != "test" { if acc.Login != "test" {
t.Error("account username is not test") t.Error("account username is not test")
} }
if _, err = testDB.TryLogin("test", "wrongpassword"); err != ErrLoginInvalidPassword {
t.Error("expected ErrLoginInvalidPassword")
}
}
/*
test data has been collected by running the following commands in a postgresql shell started with:
docker exec -it gofusion-postgresql-1 psql -U gopenfusion -W gopenfusion
gopenfusion=# SELECT * FROM Players;
playerid | accountid | firstname | lastname | namecheck | slot | created | lastlogin | level | nano1 | nano2 | nano3 | appearanceflag | tutorialflag | payzoneflag | xcoordinate | ycoordinate | zcoordinate | angle | hp | fusionmatter | taros | batteryw | batteryn | mentor | currentmissionid | warplocationflag | skywaylocationflag | firstuseflag | quests
----------+-----------+-----------+----------+-----------+------+---------+-----------+-------+-------+-------+-------+----------------+--------------+-------------+-------------+-------------+-------------+-------+------+--------------+-------+----------+----------+--------+------------------+------------------+------------------------------------+------------------------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 | 1 | Neil | Mcscout | 1 | 1 | 76476 | 76476 | 1 | 0 | 0 | 0 | 1 | 1 | 0 | 632032 | 187177 | -5500 | 0 | 1000 | 0 | 0 | 0 | 0 | 5 | 0 | 0 | \x00000000000000000000000000000000 | \x00000000000000000000000000000000 | \x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
gopenfusion=# SELECT * FROM Appearances;
playerid | body | eyecolor | facestyle | gender | haircolor | hairstyle | height | skincolor
----------+------+----------+-----------+--------+-----------+-----------+--------+-----------
1 | 2 | 3 | 5 | 1 | 11 | 3 | 0 | 9
gopenfusion=# SELECT * FROM Inventory;
playerid | slot | id | type | opt | timelimit
----------+------+-----+------+-----+-----------
1 | 1 | 328 | 1 | 1 | 0
1 | 2 | 359 | 2 | 1 | 0
1 | 3 | 194 | 3 | 1 | 0
*/
func TestDBPlayer(t *testing.T) {
if _, err := testDB.NewAccount("testplayer", "test"); err != nil {
t.Error(err)
}
// now try to retrieve account data
acc, err := testDB.TryLogin("testplayer", "test")
if err != nil {
t.Error(err)
}
plrID, err := testDB.NewPlayer(acc.AccountID, "Neil", "Mcscout", 1)
if err != nil {
t.Error(err)
}
if err = testDB.FinishPlayer(&protocol.SP_CL2LS_REQ_CHAR_CREATE{
PCStyle: protocol.SPCStyle{
IPC_UID: int64(plrID),
INameCheck: 1,
SzFirstName: "Neil",
SzLastName: "Mcscout",
IGender: 1,
IFaceStyle: 5,
IHairColor: 11,
ISkinColor: 9,
IEyeColor: 3,
IHeight: 0,
IBody: 2,
IHairStyle: 3,
},
SOn_Item: protocol.SOnItem{
IEquipUBID: 328,
IEquipLBID: 359,
IEquipFootID: 194,
},
}, acc.AccountID); err != nil {
t.Error(err)
}
if err = testDB.FinishTutorial(plrID, acc.AccountID); err != nil {
t.Error(err)
}
} }

View File

@ -32,10 +32,10 @@ WARN_INVALID = False
class StructTranspiler: class StructTranspiler:
class StructField: class StructField:
def __init__(self, name: str, csType: str, marshal: str) -> None: def __init__(self, name: str, type: str, marshal: str) -> None:
self.marshal = marshal self.marshal = marshal
self.type = csType self.type = type
self.ctype = csType # for transpilation to c self.ctype = type # for transpilation to c
self.tags = "" self.tags = ""
self.size = 0 self.size = 0
self.padding = 0 self.padding = 0
@ -43,51 +43,50 @@ class StructTranspiler:
self.cname = self.name self.cname = self.name
self.needsPatching = False self.needsPatching = False
match csType: if type == "byte":
case "byte":
self.type = "uint8" self.type = "uint8"
self.ctype = "char" self.ctype = "char"
self.size = 1 self.size = 1
case "sbyte": elif type == "sbyte":
self.type = "int8" self.type = "int8"
self.ctype = "char" self.ctype = "char"
self.size = 1 self.size = 1
case "short": elif type == "short":
self.type = "int16" self.type = "int16"
self.ctype = "short" self.ctype = "short"
self.size = 2 self.size = 2
case "int": elif type == "int":
self.type = "int32" self.type = "int32"
self.ctype = "int" self.ctype = "int"
self.size = 4 self.size = 4
case "uint": elif type == "uint":
self.type = "uint32" self.type = "uint32"
self.ctype = "int" self.ctype = "int"
self.size = 4 self.size = 4
case "float": elif type == "float":
self.type = "float32" self.type = "float32"
self.ctype = "float" self.ctype = "float"
self.size = 4 self.size = 4
case "long": elif type == "long":
self.type = "int64" self.type = "int64"
self.ctype = "long" self.ctype = "long"
self.size = 8 self.size = 8
case "ulong": elif type == "ulong":
self.type = "uint64" self.type = "uint64"
self.ctype = "long" self.ctype = "long"
self.size = 8 self.size = 8
case "byte[]": elif type == "byte[]":
self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")]) self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")])
self.type = "[%d]byte" % self.size self.type = "[%d]byte" % self.size
self.ctype = "char" self.ctype = "char"
self.cname += "[%d]" % self.size self.cname += "[%d]" % self.size
case "short[]": elif type == "short[]":
self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")]) self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")])
self.type = "[%d]int16" % self.size self.type = "[%d]int16" % self.size
self.ctype = "short" self.ctype = "short"
self.cname += "[%d]" % self.size self.cname += "[%d]" % self.size
self.size *= 2 self.size *= 2
case "string": elif type == "string":
# all strings in fusionfall are utf16, in a uint16 array # all strings in fusionfall are utf16, in a uint16 array
self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")]) self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")])
self.type = "string" self.type = "string"
@ -95,35 +94,35 @@ class StructTranspiler:
self.ctype = "short" self.ctype = "short"
self.cname += "[%d]" % self.size self.cname += "[%d]" % self.size
self.size *= 2 self.size *= 2
case "int[]": elif type == "int[]":
self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")]) self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")])
self.type = "[%d]int32" % self.size self.type = "[%d]int32" % self.size
self.ctype = "int" self.ctype = "int"
self.cname += "[%d]" % self.size self.cname += "[%d]" % self.size
self.size *= 4 self.size *= 4
case "float[]": elif type == "float[]":
self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")]) self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")])
self.type = "[%d]float32" % self.size self.type = "[%d]float32" % self.size
self.ctype = "float" self.ctype = "float"
self.cname += "[%d]" % self.size self.cname += "[%d]" % self.size
self.size *= 4 self.size *= 4
case "long[]": elif type == "long[]":
self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")]) self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")])
self.type = "[%d]int64" % self.size self.type = "[%d]int64" % self.size
self.ctype = "long" self.ctype = "long"
self.cname += "[%d]" % self.size self.cname += "[%d]" % self.size
self.size *= 8 self.size *= 8
case _: else:
# assume it's a structure that will be defined later # assume it's a structure that will be defined later
if csType.find("[]") != -1: # it's an array! if type.find("[]") != -1: # it's an array!
csType = csType.replace("[]", "") type = type.replace("[]", "")
self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")]) self.size = int(marshal[(marshal.find("SizeConst = ") + len("SizeConst = ")):marshal.find(")]")])
self.cname = self.name + "[%d]" % self.size self.cname = self.name + "[%d]" % self.size
else: else:
self.cname = self.name self.cname = self.name
self.size = 1 self.size = 1
self.type = sanitizeName(csType) self.type = sanitizeName(type)
self.ctype = sanitizeName(csType) self.ctype = sanitizeName(type)
self.needsPatching = True self.needsPatching = True
def addTag(self, tag: str) -> None: def addTag(self, tag: str) -> None: