11 Commits

Author SHA1 Message Date
Raum0x2A
94f9b4e15c Greatly improved translator feature
The translator feature has been completely rewritten, and can now
convert any game language to any other.
2021-05-20 19:22:17 -06:00
Raum0x2A
6d3a57d31c Revert "WIP - rebuilding translator"
This reverts commit ab420a0a44.
2021-05-20 19:05:29 -06:00
Raum0x2A
ab420a0a44 WIP - rebuilding translator 2021-05-20 14:33:33 -06:00
Raum0x2A
a0d9dbd269 Merge branch 'translator' into 'develop'
Updates and Features

See merge request Raum0x2A/nmslib!3
2021-05-19 21:23:39 +00:00
Raum0x2A
60de0ebb46 Updates and Features 2021-05-19 21:23:39 +00:00
Raum0x2A
a370e0f33d only run master/develop 2021-05-18 08:55:14 -06:00
Raum0x2A
5faa96d8a7 ignore*feat 2021-05-18 08:53:00 -06:00
Raum0x2A
c8f6d51ba1 Merge branch 'portalbanner-resize' into 'develop'
Moved from gim to gg for image creation

See merge request Raum0x2A/nmslib!2
2021-05-18 04:57:05 +00:00
Raum0x2A
2397ec9aee Moved from gim to gg for image creation 2021-05-18 04:57:05 +00:00
Raum0x2A
21360acadf Updated 2021-05-11 18:11:51 -06:00
Raum0x2A
4aded9c17f Updated README.md
Corrected usage of nmslib.Translate{}
2021-05-11 23:56:00 +00:00
19 changed files with 495 additions and 393 deletions

6
.gitignore vendored
View File

@@ -1 +1,5 @@
assets/
assets/
.vscode/
notes.txt
Test.png
test.png

View File

@@ -6,4 +6,6 @@ test:
image: golang:1.16.3
script:
- go test
only:
- master
- develop

BIN
NMH-BlueDream.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 307 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 228 KiB

View File

@@ -8,6 +8,8 @@ NMSlib is a GoLang package for dealing with converting Galactic coordinates to P
NMSlib also translates in game languages (Korvax, Gek Vy'Keen and Atlas) to english, and create portal banners.
[GoDoc](https://pkg.go.dev/gitlab.com/Raum0x2A/nmslib#section-documentation)
## Installation
To install this module use `go get`
@@ -32,20 +34,21 @@ import (
func main() {
portalcode := "21F2F8EDB94D"
tstvar, err := nmslib.P2gc(portalcode)
galacticCoords, err := nmslib.P2gc(portalcode)
if err != nil {
panic(err)
}
fmt.Printf("Input:\t%s\nExpecting:\t014C:0077:06DA:01F2\nHave:\t%s\n", portalcode, tstvar)
fmt.Printf("Input:\t%s\nOutput:\t%s\n", portalcode, galacticCoords)
nmslib.CreateBanner(portalcode, "NewLennon.png", 0)
nmslib.CreateBanner(RndPortal(), "Random.png", 0)
nmslib.CreateBanner(portalcode, "./NMH-BlueDream.png", 0)
nmslib.CreateBanner(RndPortal(), "./Random.png", 0)
fmt.Println(nmslib.Translate{"KIHTYOMOLES"}.Kor2Eng())
korvax := nmslib.Translate{"Contraband"}
fmt.Println(nmslib.korvax.Eng2Kor())
fmt.Println(nmslib.Translate{Word: "KIHTYOMOLES"}.Kor2Eng())
korvax := nmslib.Translate{Word: "Contraband"}
fmt.Println(korvax.Eng2Kor())
}
```
### Creating a Glyph banner with CreateBanner()
@@ -63,13 +66,13 @@ This function takes 3 parameters:
**Example:**
Horizontal Layout for Galactic Hub [HUB10-6A Icarus Sun](https://nomanssky.gamepedia.com/HUB10-6A_Icarus_Sun) Eniwa 68/L3
Horizontal Layout for the NMH Capital planet [Blue Dream (aka Omins XI)](https://nomanssky.fandom.com/wiki/Omins_XI) in the [Notric-Lis XIII](https://nomanssky.fandom.com/wiki/Notric-Lis_XIII) system in the [Lahanhar Conflux](https://nomanssky.fandom.com/wiki/Lahanhar_Conflux) region
```golang
nmslib.CreateBanner("006AFA556C30", "NewLennon.png", 0)
nmslib.CreateBanner("21F2F8EDB94D", "NMH-BlueDream.png", 0)
```
![](NewLennon.png)
![](NMH-BlueDream.png)
Vertical layout for a random address
@@ -94,7 +97,7 @@ This function only takes 1 parameter and returns a string and error
**Example:**
```golang
ga, _ := nmslib.P3gc("21F2F8EDB94D")
ga, _ := nmslib.P2gc("21F2F8EDB94D")
fmt.Println(ga)
```
@@ -104,14 +107,15 @@ Output:
### Converting Galactic coordinates to Portal codes with Gc2p()
This function only takes 1 parameter and returns a string and error
This function only takes 2 parameters and returns a string and error
* galacticaddress: 16 char 4 block hex address
* Planet ID [1-6]
**Example:**
```golang
pc, _ := nmslib.P3gc("014C:0077:06DA:01F2")
pc, _ := nmslib.Gc2p("014C:0077:06DA:01F2", 2)
fmt.Println(pc)
```
@@ -137,7 +141,7 @@ This function takes only 1 parameter and returns a string
**Example:**
```golang
fmt.Println(nmslib.Translate{"Paka"}.Atl2Eng())
fmt.Println(nmslib.Translate{Word: "Paka"}.Atl2Eng())
```
Output:
@@ -153,7 +157,7 @@ This function takes only 1 parameter and returns a string
**Example:**
```golang
korvax := nmslib.Translate{"Contraband"}
korvax := nmslib.Translate{Word: "Contraband"}
fmt.Println(korvax.Eng2Kor())
```
@@ -165,20 +169,20 @@ Output:
### Language commands
Gek:
- ``Translate{string}.Gek2Eng()``
- ``Translate{string}.Eng2Gek()``
- ``Translate{Word: string}.Gek2Eng()``
- ``Translate{Word: string}.Eng2Gek()``
Korvax:
- ``Translate{string}.Kor2Eng()``
- ``Translate{string}.Eng2Kor()``
- ``Translate{Word: string}.Kor2Eng()``
- ``Translate{Word: string}.Eng2Kor()``
Vy'keen:
- ``Translate{string}.Vyk2Eng()``
- ``Translate{string}.Eng2Vyk()``
- ``Translate{Word: string}.Vyk2Eng()``
- ``Translate{Word: string}.Eng2Vyk()``
Atlas:
- ``Translate{string}.Atl2Eng()``
- ``Translate{string}.Eng2Atl()``
- ``Translate{Word: string}.Atl2Eng()``
- ``Translate{Word: string}.Eng2Atl()``
## Random Portal address

View File

@@ -55,7 +55,7 @@ import (
func bindataRead(data []byte, name string) ([]byte, error) {
gz, err := gzip.NewReader(bytes.NewBuffer(data))
if err != nil {
return nil, fmt.Errorf("Read %q: %v", name, err)
return nil, fmt.Errorf("read %q: %v", name, err)
}
var buf bytes.Buffer
@@ -63,7 +63,7 @@ func bindataRead(data []byte, name string) ([]byte, error) {
clErr := gz.Close()
if err != nil {
return nil, fmt.Errorf("Read %q: %v", name, err)
return nil, fmt.Errorf("read %q: %v", name, err)
}
if clErr != nil {
return nil, err

View File

@@ -1,3 +1,8 @@
/*
Xainesworld Video: https://www.youtube.com/watch?v=xmZbkTahw4w
Fandom Wiki: https://nomanssky.fandom.com/wiki/Portal_address
*/
package nmslib
import (
@@ -7,18 +12,11 @@ import (
"strings"
)
/*
Xainesworld Video: https://www.youtube.com/watch?v=xmZbkTahw4w
Fandom Wiki: https://nomanssky.fandom.com/wiki/Portal_address
*/
/*
P2gc - Portal code to galactic coordinates
Requires 1 var and returns 1 var string
var p string
Portal Glyph hex string 12 chars in len (ex. 006afa556c30)
Return var string
Galactic address (ex. 042F:0079:0D55:006A)
Requires 1 var and returns 1 var string and an error
var p string: Portal Glyph hex string 12 chars in len (ex. 006afa556c30)
Returns var string: Galactic address (ex. 042F:0079:0D55:006A)
*/
func P2gc(p string) (gc string, err error) {
if len(p) == 12 { // Test if length of provided string is 12 chars long
@@ -27,19 +25,19 @@ func P2gc(p string) (gc string, err error) {
var coord [4]int64
coord[1], err = strconv.ParseInt(p[4:6], 16, 16) // Y coordinate
if err != nil {
panic(err)
return "", errors.New("error parsing intergers from string: [4:6]")
}
coord[2], err = strconv.ParseInt(p[6:9], 16, 16) // Z cooridnate
if err != nil {
panic(err)
return "", errors.New("error parsing intergers from string: [6:9]")
}
coord[3], err = strconv.ParseInt(p[9:12], 16, 16) // X coordinate
if err != nil {
panic(err)
return "", errors.New("error parsing intergers from string: [9:12]")
}
coord[0], err = strconv.ParseInt(p[1:4], 16, 16) // SSI (Star System Identifier)
if err != nil {
panic(err)
return "", errors.New("error parsing intergers from string: [1:4]")
}
// apply shifts to Handle the shape/boundaries of the galaxy
@@ -68,17 +66,17 @@ func P2gc(p string) (gc string, err error) {
/*
Gc2p - Galactic coordinates to portal code
Requires 1 string and 1 int returns a string and error
var gc string
Galactic address (ex. 042F:0079:0D55:006A)
var p int
Planet ID [1-6]
Return var string
Portal Glyph hex string 12 chars in len (ex. 006afa556c30)
var gc string: Galactic address (ex. 042F:0079:0D55:006A)
var p int: Planet ID [1-6]
Returns portalcode string: Portal Glyph hex string 12 chars in len (ex. 006afa556c30)
*/
func Gc2p(gc string, p int) (portalcode string, err error) {
// split and store string
// coords[0] == X; coords[1] == Y coords[2] == Z;
// coords[3] == SSI coords[4] == P
if len(gc) != 19 {
return "", errors.New("galatic code is the wrong length")
}
if p > 6 {
p = 1
}
@@ -91,26 +89,30 @@ func Gc2p(gc string, p int) (portalcode string, err error) {
var hexCoords [5]int64
hexCoords[0], err = strconv.ParseInt(coords[4], 16, 16) // P
if err != nil {
panic(err)
return "", errors.New("error parsing intergers from string: [4]")
}
hexCoords[1], err = strconv.ParseInt(coords[3], 16, 16) // SSI
if err != nil {
panic(err)
return "", errors.New("error parsing intergers from string: [3]")
}
hexCoords[2], err = strconv.ParseInt(coords[1], 16, 16) // Y
if err != nil {
panic(err)
return "", errors.New("error parsing intergers from string: [1]")
}
hexCoords[3], err = strconv.ParseInt(coords[2], 16, 16) // Z
if err != nil {
panic(err)
return "", errors.New("error parsing intergers from string: [2]")
}
hexCoords[4], err = strconv.ParseInt(coords[0], 16, 16) // X
if err != nil {
panic(err)
return "", errors.New("error parsing intergers from string: [0]")
}
// Apply shifts to Handle the shape/boundaries of the galaxy
/*Note:
[P][SSS][YY][ZZZ][XXX] len == 12
* SSS == SSI
*/
hexCoords[2] = hexCoords[2] + 0x81 // Y ->> shift
hexCoords[3] = hexCoords[3] + 0x801 // Z ->> shift
hexCoords[4] = hexCoords[4] + 0x801 // X ->> shift
@@ -122,6 +124,7 @@ func Gc2p(gc string, p int) (portalcode string, err error) {
}
// Assemble padded values as a string
portalcode = fmt.Sprintf("%00X%03X", hexCoords[0], hexCoords[1])
for n := 2; n < len(hexCoords); n++ {
if n == 2 {
@@ -130,5 +133,5 @@ func Gc2p(gc string, p int) (portalcode string, err error) {
portalcode = portalcode + fmt.Sprintf("%03X", hexCoords[n])
}
}
return portalcode, err // return formated string and error
return // return formated string and error
}

View File

@@ -1,110 +1,105 @@
package nmslib
import (
"errors"
"fmt"
"image/png"
"image"
"io/ioutil"
"os"
"strconv"
gim "github.com/ozankasikci/go-image-merge"
"github.com/fogleman/gg"
)
/*CreateBanner - Output PNG of Portal Glyphs
Requires 3 vars and returns 0 var, Outputs a PNG file
var portalex string
Portal Glyph hex string
var savename string
Output name of PNG file
Requires 3 vars and returns 1 err, Outputs a PNG file
var portalex string: Portal Glyph hex string
var savename string: Output name of PNG file
var opt int
00 sets horizontal banner in light mode
00 sets horizontal banner in light mode [ 00 || 0 ]
01 sets horizontal banner in dark mode [ 01 || 1 ]
10 sets vertical banner in light mode
01 sets horizontal banner in dark mode
11 sets vertical banner in dark mode
* note first of the 2 bits sets the layout, the second bit sets the glyph color
*/
func CreateBanner(portalhex string, savename string, opt int) {
var err error
func CreateBanner(portalhex string, savename string, opt int) (err error) {
var GlyphHex [12]int64
var glyphImg [12]string
var mode string
var vert int
var horz int
var imgArray [12]image.Image
// Setup temp dir
tempdir, err := ioutil.TempDir("", "nmslib-")
if err != nil {
panic(err)
//Set light or dark mode glyphs
if opt == 00 || opt == 10 {
mode = "light"
} else if opt == 01 || opt == 11 {
mode = "dark"
} else {
// if opt is an invalid option (ie. not a 2 bit binary number default to classic mode/layout
opt = 0
mode = "light"
}
//defer os.RemoveAll(tempdir)
// verify len of portalhex
if len(portalhex) == 12 {
// get hex value from each digit in given string to an array of int64
// get hex value from each digit in given string and add it to an array of int64
for i := 0; i < len(portalhex); i++ {
GlyphHex[i], err = strconv.ParseInt(portalhex[i:int(i+1)], 16, 16)
if err != nil {
panic(err)
return errors.New("string provided is not hexadecimal ([0-9][A-F])")
}
}
// set options
if opt == 00 { // set vertical rendering in light mode
vert, horz = 12, 1
mode = "light"
} else if opt == 01 { // set vertival in dark mode
vert, horz = 12, 1
mode = "dark"
} else if opt == 11 { // set horizontal rendering in dark mode
vert, horz = 1, 12
mode = "dark"
} else { // set horizontal rendering in light mode (classic/default)
vert, horz = 1, 12
mode = "light"
}
// assign image location of its glyph hex value to an array of strings
// assign image location of its glyph-hex value to an array of strings
for j := 0; j < len(glyphImg); j++ {
glyphImg[j] = fmt.Sprintf("assets/glyphs/%s/PORTALSYMBOL.%X.png", mode, GlyphHex[j])
}
// pull images need from glyph.go and saved them to ./glyphs/
// pull images need from assets.go and saved them to the temp directory
for k := 0; k < len(glyphImg); k++ {
data, err := Asset(glyphImg[k])
if err != nil {
panic(err)
return errors.New("can not load images from assets: " + glyphImg[k])
}
_, err2 := os.Stat(tempdir + "/assets/glyphs/" + mode + "/")
if os.IsNotExist(err2) {
errDir := os.MkdirAll(tempdir+"/assets/glyphs/"+mode, 0755)
if errDir != nil {
panic(errDir)
}
err = ioutil.WriteFile(NmsTemp+"/"+glyphImg[k], []byte(data), 0644)
if err != nil {
return errors.New("can not write file to temp directory")
}
// fmt.Println(tempdir + "/" + glyphImg[k]) // for debugging only
err = ioutil.WriteFile(tempdir+"/"+glyphImg[k], []byte(data), 0644)
}
// load images for processing using github.com/ozankasikci/go-image-merge
grids := []*gim.Grid{
{ImageFilePath: tempdir + "/" + glyphImg[0]}, {ImageFilePath: tempdir + "/" + glyphImg[1]},
{ImageFilePath: tempdir + "/" + glyphImg[2]}, {ImageFilePath: tempdir + "/" + glyphImg[3]},
{ImageFilePath: tempdir + "/" + glyphImg[4]}, {ImageFilePath: tempdir + "/" + glyphImg[5]},
{ImageFilePath: tempdir + "/" + glyphImg[6]}, {ImageFilePath: tempdir + "/" + glyphImg[7]},
{ImageFilePath: tempdir + "/" + glyphImg[8]}, {ImageFilePath: tempdir + "/" + glyphImg[9]},
{ImageFilePath: tempdir + "/" + glyphImg[10]}, {ImageFilePath: tempdir + "/" + glyphImg[11]},
//Load/open images needed
for iter := 0; iter < 12; iter++ {
imgArray[iter], err = gg.LoadPNG(NmsTemp + "/" + glyphImg[iter])
if err != nil {
return errors.New("can not read glyph " + glyphImg[iter])
}
}
// create new image from grids
rgba, err := gim.New(grids, vert, horz).Merge()
if err != nil {
panic(err)
}
//begin concatenating images
// get image size of first glyph, all glyphs have the same X && Y dimension so we only need to measure one.
imgDim := imgArray[0].Bounds().Size()
// save the output to png
file, err := os.Create(savename)
err = png.Encode(file, rgba)
if err != nil {
fmt.Println(err)
//classic horizontal layout
if opt == 01 || opt == 00 {
imgWidth := imgDim.X * 12
imgHeight := imgDim.Y
concat := gg.NewContext(imgWidth, imgHeight)
for a := 0; a < 12; a++ {
concat.DrawImage(imgArray[a], imgDim.X*a, 0)
}
concat.SavePNG(savename)
}
//Vertical layout
if opt == 10 || opt == 11 {
imgWidth := imgDim.X
imgHeight := imgDim.Y * 12
concat := gg.NewContext(imgWidth, imgHeight)
for a := 0; a < 12; a++ {
concat.DrawImage(imgArray[a], 0, imgDim.Y*a)
}
concat.SavePNG(savename)
}
} else {
return errors.New("portalcode must be exactly 12 chars")
}
return
}

8
go.mod
View File

@@ -1,5 +1,9 @@
module gitlab.com/Raum0x2A/nmslib
go 1.15
go 1.16
require github.com/ozankasikci/go-image-merge v0.2.2
require (
github.com/fogleman/gg v1.3.0
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e // indirect
)

9
go.sum
View File

@@ -1,2 +1,7 @@
github.com/ozankasikci/go-image-merge v0.2.2 h1:K370BLLTIsamwjAeViiPntf7GiG3h9pXzDmxXCbN8/0=
github.com/ozankasikci/go-image-merge v0.2.2/go.mod h1:NQ2aN0b21buFx3p+5x4dZrKuPSLh2uBukK7F30BrYTo=
github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8=
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e h1:PzJMNfFQx+QO9hrC1GwZ4BoPGeNGhfeQEgcQFArEjPk=
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

71
init.go Normal file
View File

@@ -0,0 +1,71 @@
package nmslib
import (
"errors"
"io/ioutil"
"os"
)
/*NmsTemp - Global string variable
Location of instance temporary directory
Dir Structure:
- NmsTemp
-
*/
var NmsTemp string
/*Initialize temporary directory
create a temp dir and save location to `NmsTemp` string
*/
func init() {
// create temp dir
temploc, err := ioutil.TempDir("", "nmslib-")
if err != nil {
panic(err)
}
NmsTemp = temploc
//Create directory structure
err = os.Mkdir(NmsTemp+"/assets", 0755)
if err != nil {
panic(errors.New("failed to create temporary folder"))
}
err = os.Mkdir(NmsTemp+"/assets/lang", 0755)
if err != nil {
panic(errors.New("failed to create temporary folder"))
}
err = os.Mkdir(NmsTemp+"/assets/glyphs", 0755)
if err != nil {
panic(errors.New("failed to create temporary folder"))
}
err = os.Mkdir(NmsTemp+"/assets/glyphs/dark", 0755)
if err != nil {
panic(errors.New("failed to create temporary folder"))
}
err = os.Mkdir(NmsTemp+"/assets/glyphs/light", 0755)
if err != nil {
panic(errors.New("failed to create temporary folder"))
}
//Write language files to temp directory
fileloc := [4]string{"atlas-lang.csv", "gek-lang.csv", "korvax-lang.csv", "vykeen-lang.csv"}
for x := 0; x < 4; x++ {
data, err := Asset("assets/lang/" + fileloc[x])
if err != nil {
panic(errors.New("can not load: " + fileloc[x]))
}
err = ioutil.WriteFile(NmsTemp+"/assets/lang/"+fileloc[x], []byte(data), 0644)
if err != nil {
panic(errors.New("can not write " + fileloc[x] + " to temp dir"))
}
}
}
/*CleanUp removes temporary directory an it's contents
this is intended to be called in a defer statement in func main
takes no input
*/
func CleanUp() {
os.RemoveAll(NmsTemp)
}

11
init_test.go Normal file
View File

@@ -0,0 +1,11 @@
package nmslib
import (
"fmt"
"testing"
)
func TestInit(t *testing.T) {
fmt.Printf("\nTesting init:\n")
fmt.Printf("Temporary directory: %s\n\n", NmsTemp)
}

278
lang.go
View File

@@ -2,206 +2,140 @@ package nmslib
import (
"encoding/csv"
"fmt"
"io/ioutil"
"os"
"strings"
)
/*
Translate words
/*Translate Game languages and english
Translate.Lang sets source language for translations
options are:
korvax
gek
vykeen
atlas
english
*/
type Translate struct {
Word string
Lang string
}
// trans - set up structure of a word iteration
type trans0 struct {
english string // english word
word string // no caps word
capword string // Capitalized word
acpword string // ALL CAPITALIZED WORD
}
/*
Kor2Eng translate korvax word to english word
/*Translate source language to english
Translate any NMS language (ie. Korvax) to english
*/
func (t Translate) Kor2Eng() (returnstring string) {
csvlines := openCSV("korvax-lang.csv")
for range csvlines {
returnstring = (toEng(t, csvlines))
}
return
func (t Translate) ToEng(word string) (translation string) {
//return translate2english(word, langFile(t.Lang))
return Translator(word, t.Lang, "english")
}
/*
Eng2Kor translate english word to korvax word
/*Translate source language to Korvax
Translate any NMS language or english (ie. Gek) to Korvax
*/
func (t Translate) Eng2Kor() (returnstring string) {
csvlines := openCSV("korvax-lang.csv")
for range csvlines {
returnstring = (toNMS(t, csvlines))
}
return
func (t Translate) ToKorvax(word string) (translation string) {
return Translator(word, t.Lang, "korvax")
}
/*
Gek2Eng translate Gek word to english word
/*Translate source language to Vy'Keen
Translate any NMS language or english (ie. Atlas) to Vy'Keen
*/
func (t Translate) Gek2Eng() (returnstring string) {
csvlines := openCSV("gek-lang.csv")
for range csvlines {
returnstring = (toEng(t, csvlines))
}
return
func (t Translate) ToVykeen(word string) (translation string) {
return Translator(word, t.Lang, "vykeen")
}
/*
Eng2Gek translate english word to Gek word
/*Translate source language to Gek
Translate any NMS language or english (ie. Vy'Keen) to Gek
*/
func (t Translate) Eng2Gek() (returnstring string) {
csvlines := openCSV("gek-lang.csv")
for range csvlines {
returnstring = (toNMS(t, csvlines))
}
return
func (t Translate) ToGek(word string) (translation string) {
return Translator(word, t.Lang, "Gek")
}
/*
Vyk2Eng translate vykeen word to english word
/*Translate source language to Atlas
Translate any NMS language or english (ie. Korvax) to Atlas
*/
func (t Translate) Vyk2Eng() (returnstring string) {
csvlines := openCSV("vykeen-lang.csv")
for range csvlines {
returnstring = (toEng(t, csvlines))
}
return
func (t Translate) ToAtlas(word string) (translation string) {
return Translator(word, t.Lang, "atlas")
}
/*
Eng2Vyk translate english word to vykeen word
*/
func (t Translate) Eng2Vyk() (returnstring string) {
csvlines := openCSV("vykeen-lang.csv")
for range csvlines {
returnstring = (toNMS(t, csvlines))
}
return
}
/*
Atl2Eng translate Atlas word to english word
*/
func (t Translate) Atl2Eng() (returnstring string) {
csvlines := openCSV("atlas-lang.csv")
for range csvlines {
returnstring = (toEng(t, csvlines))
}
return
}
/*
Eng2Atl translate english word to Atlas word
*/
func (t Translate) Eng2Atl() (returnstring string) {
csvlines := openCSV("atlas-lang.csv")
for range csvlines {
returnstring = (toNMS(t, csvlines))
}
return
}
func toEng(t Translate, csvlines [][]string) string {
returnstring := "*\\Kzzzzzzt\\*" // word not found default
for _, line := range csvlines {
lang := trans0{
english: strings.ToLower(line[0]),
word: strings.ToLower(line[1]),
capword: strings.ToLower(line[2]),
acpword: strings.ToLower(line[3]),
}
// check translate struct for value
if strings.ToLower(t.Word) == lang.word {
returnstring = lang.english
} else if strings.ToLower(t.Word) == lang.capword {
returnstring = strings.Title(strings.ToLower(lang.english))
} else if strings.ToLower(t.Word) == lang.acpword {
returnstring = strings.ToUpper(lang.english)
}
}
return returnstring
}
func toNMS(t Translate, csvlines [][]string) string {
returnstring := "*\\Kzzzzzzt\\*" // word not found default
for _, line := range csvlines {
lang := trans0{
english: line[0],
word: line[1],
capword: line[2],
acpword: line[3],
}
if t.Word == lang.english {
if lang.word != "" {
returnstring = lang.word
}
}
if t.Word == strings.Title(strings.ToLower(lang.english)) {
if lang.capword != "" {
returnstring = strings.Title(strings.ToLower(lang.capword))
}
}
if t.Word == strings.ToUpper(lang.english) {
if lang.acpword != "" {
returnstring = strings.ToUpper(lang.acpword)
}
}
}
return returnstring
}
/*
func openCSV(lagcsv string) [][]string {
csvFile, err := os.Open("./assets/lang/" + lagcsv)
if err != nil {
fmt.Println(err)
}
defer csvFile.Close() // close language file when finished
// read csv file from memory
csvlines, err := csv.NewReader(csvFile).ReadAll()
if err != nil {
fmt.Println(err)
}
return csvlines
*/
func openCSV(lagcsv string) [][]string {
// create temp dir
tempdir, err := ioutil.TempDir("", "nmslib-")
// read language files
func langFile(lang string) [][]string {
filepath := NmsTemp + "/assets/lang/" + lang + "-lang.csv"
csvFile, err := os.Open(filepath)
if err != nil {
panic(err)
}
defer os.RemoveAll(tempdir) // Clean up temp files
defer csvFile.Close()
// extract language file from resources.go
data, err := Asset("assets/lang/" + lagcsv)
lines, err := csv.NewReader(csvFile).ReadAll()
if err != nil {
panic(err)
}
// wirte extracted data to temp dir
err = ioutil.WriteFile(tempdir+"/"+lagcsv, []byte(data), 0644)
csvFile, err := os.Open(tempdir + "/" + lagcsv)
if err != nil {
fmt.Println(err)
}
defer csvFile.Close() // close language file when finished
// read csv file from memory
csvlines, err := csv.NewReader(csvFile).ReadAll()
if err != nil {
fmt.Println(err)
}
return csvlines
return lines
}
/*Translate any in game language to another including english (ie. Korvax to Gek)
Translating from english to a game language will alway default to all lower case for now
*/
func Translator(word string, source string, target string) string {
var sourcekey [4]string
var targetkey [4]string
var dmy string
var rt string
rt = "*\\Kzzzzzzt\\*"
if source == "english" {
dmy = target
} else {
dmy = source
}
for _, line := range langFile(dmy) {
for _, trans := range line {
if trans == word {
sourcekey[0] = line[0]
sourcekey[1] = line[1]
sourcekey[2] = line[2]
sourcekey[3] = line[3]
}
}
if target != "english" {
for _, line := range langFile(target) {
if strings.EqualFold(line[0], sourcekey[0]) {
targetkey[0] = line[0]
targetkey[1] = line[1]
targetkey[2] = line[2]
targetkey[3] = line[3]
}
}
if strings.EqualFold(word, sourcekey[0]) {
if targetkey[0] != "" {
rt = targetkey[0]
}
} else if strings.EqualFold(word, sourcekey[1]) {
if targetkey[1] != "" {
rt = targetkey[1]
}
} else if strings.EqualFold(word, sourcekey[2]) {
if targetkey[2] != "" {
rt = targetkey[2]
}
} else if strings.EqualFold(word, sourcekey[3]) {
if targetkey[3] != "" {
rt = targetkey[3]
}
}
if source == "english" {
rt = targetkey[1]
}
} else {
if strings.EqualFold(word, sourcekey[0]) {
rt = sourcekey[0]
} else if strings.EqualFold(word, sourcekey[1]) {
rt = strings.ToLower(sourcekey[0])
} else if strings.EqualFold(word, sourcekey[2]) {
rt = strings.Title(sourcekey[0])
} else if strings.EqualFold(word, sourcekey[3]) {
rt = strings.ToUpper(sourcekey[0])
}
}
}
return rt
}

30
nmslib-convert_test.go Normal file
View File

@@ -0,0 +1,30 @@
package nmslib
import (
"fmt"
"testing"
)
func TestPortal2Galactic(t *testing.T) {
want, err := P2gc("21F2F8EDB94D")
if err != nil {
fmt.Println(err)
}
if want != "014C:0077:06DA:01F2" {
t.Errorf("Testing P2gc(\"21F2F8EDB94D\"): got %q, want: 014C:0077:06DA:01F2.\n", want)
} else {
fmt.Printf("Testing P2gc(\"21F2F8EDB94D\"): got: %q, want: 014C:0077:06DA:01F2.\n", want)
}
}
func TestGalactic2portal(t *testing.T) {
want, err := Gc2p("014C:0077:06DA:01F2", 2)
if err != nil {
fmt.Println(err)
}
if want != "21F2F8EDB94D" {
t.Errorf("Testing Gc2p(\"014C:0077:06DA:01F2\"): got %q, want: 21F2F8EDB94D.\n", want)
} else {
fmt.Printf("Testing Gc2p(\"014C:0077:06DA:01F2\"): got: %q, want: 21F2F8EDB94D.\n", want)
}
}

View File

@@ -0,0 +1,21 @@
package nmslib
import (
"fmt"
"testing"
)
func TestCreateBanner(t *testing.T) {
fmt.Printf("\nTesting CreateBanner: ")
rp := "21F2F8EDB94D"
//rp := RndPortal()
fileout := "./test.png"
err := CreateBanner(rp, fileout, 0)
if err != nil {
fmt.Println(err)
}
fmt.Printf("Portal address `%s` rendered as `%s`\n", rp, fileout)
}

21
nmslib-rpcg_test.go Normal file
View File

@@ -0,0 +1,21 @@
package nmslib
import (
"fmt"
"testing"
)
func TestRndPortal(t *testing.T) {
fmt.Printf("\nRandom Portal Code: ")
fmt.Println(RndPortal())
}
func TestRndAtlas(t *testing.T) {
fmt.Printf("semi-Random Atlas Code: ")
fmt.Println(RndAtlas())
}
func TestRndBH(t *testing.T) {
fmt.Printf("semi-Random black hole Code: ")
fmt.Println(RndBH())
}

36
nmslib-translate_test.go Normal file
View File

@@ -0,0 +1,36 @@
package nmslib
import (
"fmt"
"testing"
)
func TestTranslate(t *testing.T) {
kor2eng := Translate{Lang: "korvax"}
if kor2eng.ToEng("Alinichel") != "Emergency" {
t.Errorf("\nTesting Translate{Lang: \"korvax\"}.ToEng(\"Alinichel\"): got %q, want: %q.\n", kor2eng.ToEng("Alinichel"), "Emergency")
} else {
fmt.Printf("\nTesting Translate{Lang: \"korvax\"}.ToEng(\"Alinichel\"): got %q, want: %q.\n", kor2eng.ToEng("Alinichel"), "Emergency")
}
vyk2eng := Translate{"vykeen"}
if vyk2eng.ToEng("Aqo") != "Foes" {
t.Errorf("Testing Translate{Lang: \"vykeen\"}.ToEng(\"Aqo\"): got %q, want: %q.\n", vyk2eng.ToEng("Aqo"), "Foes")
} else {
fmt.Printf("Testing Translate{Lang: \"vykeen\"}.ToEng(\"Aqo\"): got %q, want: %q.\n", vyk2eng.ToEng("Aqo"), "Foes")
}
engWord := Translate{"english"}
if engWord.ToKorvax("learn") != "achi" {
t.Errorf("Testing Translate{Lang: \"english\"}.ToKor(\"learn\"): got %q, want: %q.\n", engWord.ToKorvax("learn"), "achi")
} else {
fmt.Printf("Testing Translate{Lang: \"english\"}.ToKor(\"learn\"): got %q, want: %q.\n", engWord.ToKorvax("learn"), "achi")
}
fmt.Println("Blind Test: " + Translate{"gek"}.ToAtlas("baturk")) // word does not exist in Atlas lang
fmt.Println("Blind Test: " + Translate{"gek"}.ToAtlas("Tor")) // word exists
fmt.Println("Running CleanUp()")
CleanUp()
fmt.Printf("\nTesting complete.\nStatus: ")
}

View File

@@ -1,90 +0,0 @@
package nmslib
import (
"fmt"
"testing"
)
func TestRndPortal(t *testing.T) {
fmt.Printf("\nRandom Portal Code: ")
fmt.Println(RndPortal())
}
func TestCreateBanner(t *testing.T) {
fmt.Printf("\nTesting CreateBanner: ")
CreateBanner(RndPortal(), "/tmp/Test.png", 11)
fmt.Printf("Random Portal address rendered as `/tmp/Test.png`\n\n")
}
func TestPortal2Galactic(t *testing.T) {
want, err := P2gc("006afa556c30")
if err != nil {
panic(err)
}
if want != "042F:0079:0D55:006A" {
t.Errorf("Testing P2gc(\"006afa556c30\"): got %q, want: %q.\n", want, "042F:0079:0D55:006A")
} else {
fmt.Printf("Testing P2gc(\"006afa556c30\"): got: %q, want: %q.\n", want, "042F:0079:0D55:006A")
}
want, err = P2gc("41EDF9554C2F")
if err != nil {
panic(err)
}
if want != "042E:0078:0D53:01ED" {
t.Errorf("Testing P2gc(\"41EDF9554C2F\"): got %q, want: %q.\n", want, "042E:0078:0D53:01ED")
} else {
fmt.Printf("Testing P2gc(\"41EDF9554C2F\"): got: %q, want: %q.\n", want, "042E:0078:0D53:01ED")
}
}
func TestGalactic2portal(t *testing.T) {
want, err := Gc2p("042F:0079:0D55:006A", 1)
if err != nil {
panic(err)
}
if want != "106AFA556C30" {
t.Errorf("\nTesting Gc2p(\"042F:0079:0D55:006A\"): got %q, want: %q.\n", want, "106AFA556C30")
} else {
fmt.Printf("\nTesting Gc2p(\"042F:0079:0D55:006A\"): got: %q, want: %q.\n", want, "106AFA556C30")
}
want, err = Gc2p("042E:0078:0D53:01ED", 4)
if err != nil {
panic(err)
}
if want != "41EDF9554C2F" {
t.Errorf("Testing Gc2p(\"042E:0078:0D53:01ED\"): got %q, want: %q.\n", want, "41EDF9554C2F")
} else {
fmt.Printf("Testing Gc2p(\"042E:0078:0D53:01ED\"): got: %q, want: %q.\n", want, "41EDF9554C2F")
}
}
func TestTranslate(t *testing.T) {
want := Translate{"Paka"}
if want.Atl2Eng() != "Awake" {
t.Errorf("\nTesting Translate{\"Paka\"}.Atl2Eng(): got %q, want: %q.\n", want.Atl2Eng(), "Awake")
} else {
fmt.Printf("\nTesting Translate{\"Paka\"}.Atl2Eng(): got %q, want: %q.\n", want.Atl2Eng(), "Awake")
}
want = Translate{"hofsos"}
if want.Gek2Eng() != "answer" {
t.Errorf("Testing Translate{\"hofsos\"}.Gek2Eng(): got %q, want: %q.\n", want.Gek2Eng(), "answer")
} else {
fmt.Printf("Testing Translate{\"hofsos\"}.Gek2Eng(): got %q, want: %q.\n", want.Gek2Eng(), "answer")
}
want = Translate{"Aqo"}
if want.Vyk2Eng() != "Foes" {
t.Errorf("Testing Translate{\"Aqo\"}.Vyk2Eng(): got %q, want: %q.\n", want.Vyk2Eng(), "Foes")
} else {
fmt.Printf("Testing Translate{\"Aqo\"}.Vyk2Eng(): got %q, want: %q.\n", want.Vyk2Eng(), "Foes")
}
want = Translate{"Alinichel"}
if want.Kor2Eng() != "Emergency" {
t.Errorf("Testing Translate{\"Alinichel\"}.Kor2Eng(): got %q, want: %q.\n", want.Kor2Eng(), "Emergency")
} else {
fmt.Printf("Testing Translate{\"Alinichel\"}.Kor2Eng(): got %q, want: %q.\n", want.Kor2Eng(), "Emergency")
}
fmt.Printf("\nTesting complete.\nStatus: ")
}

67
rpcg.go
View File

@@ -1,11 +1,3 @@
package nmslib
import (
"fmt"
"math/rand"
"time"
)
/*
[P][SSS][YY][ZZZ][XXX] (P = Planet Index / S = Star System Index / Y = Height / Z = Width / X = Length)
@@ -23,6 +15,19 @@ import (
*/
package nmslib
import (
"fmt"
"math/rand"
"time"
)
/*
RndPortal - Random Portalcode generator
Requires no input required and returns a string
*/
func RndPortal() (final string) {
rand.Seed(time.Now().UnixNano())
min := 0x1
@@ -39,3 +44,49 @@ func RndPortal() (final string) {
return
}
/*RndAtlas genorates a semi-random atlas code
Requires no input and returns a string
This is not a true random atlas genorator. Insted this will create a Planet id of 1, Solar System Index of 0x07A and random Y, Z, X
SSI 0x07A always has an Atlas Interface.
REF: https://nomanssky.fandom.com/wiki/Portal_address#Solar_System_Index https://nomanssky.fandom.com/wiki/Star_system#Classification
*/
func RndAtlas() (final string) {
rand.Seed(time.Now().UnixNano())
min := 0x1
ymax := 0xFF
xzmax := 0xFFF
x := rand.Intn(xzmax-min+1) + min
z := rand.Intn(xzmax-min+1) + min
y := rand.Intn(ymax-min+1) + min
final = fmt.Sprintf("%00X%03X%02X%03X%03X", 1, 0x07A, y, z, x)
return
}
/*RndBH genorates a semi-random atlas code
Requires no input required and returns a string
This is not a true random atlas genorator. Insted this will create a Planet id of 1, Solar System Index of 0x079 and random Y, Z, X
SSI 0x079 always has a black hole.
REF: https://nomanssky.fandom.com/wiki/Portal_address#Solar_System_Index https://nomanssky.fandom.com/wiki/Star_system#Classification
*/
func RndBH() (final string) {
rand.Seed(time.Now().UnixNano())
min := 0x1
ymax := 0xFF
xzmax := 0xFFF
x := rand.Intn(xzmax-min+1) + min
z := rand.Intn(xzmax-min+1) + min
y := rand.Intn(ymax-min+1) + min
final = fmt.Sprintf("%00X%03X%02X%03X%03X", 1, 0x079, y, z, x)
return
}