Compare commits
72 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e078afbbe5 | ||
|
|
511331008e | ||
|
|
6fbbe0b23c | ||
|
|
b24a16edad | ||
|
|
3588826556 | ||
|
|
98d812c904 | ||
|
|
86bc493ead | ||
|
|
3cfae880ee | ||
|
|
b41f25646d | ||
|
|
94f9b4e15c | ||
|
|
6d3a57d31c | ||
|
|
ab420a0a44 | ||
|
|
a0d9dbd269 | ||
|
|
60de0ebb46 | ||
|
|
a370e0f33d | ||
|
|
5faa96d8a7 | ||
|
|
c8f6d51ba1 | ||
|
|
2397ec9aee | ||
|
|
21360acadf | ||
|
|
4aded9c17f | ||
|
|
8945530dbf | ||
|
|
73fa913292 | ||
|
|
47db5b0767 | ||
|
|
4aef1e390a | ||
|
|
284313eacc | ||
|
|
faf72d1f7a | ||
|
|
7c5d4b5ce8 | ||
|
|
ad42c6bb04 | ||
|
|
5ca88596ff | ||
|
|
53d85d958b | ||
|
|
ea51873fe3 | ||
|
|
90d743286f | ||
|
|
bc0c364dcc | ||
|
|
43496932ef | ||
|
|
d6bfa643a9 | ||
|
|
877517b923 | ||
|
|
ccbd68aee8 | ||
|
|
5077876106 | ||
|
|
9682494ce1 | ||
|
|
87bec565f1 | ||
|
|
a7069dce7e | ||
|
|
bc4e334ecd | ||
|
|
9358727075 | ||
|
|
3449ae3bf3 | ||
|
|
023eab03b2 | ||
|
|
5f4414df03 | ||
|
|
57a1d729dd | ||
|
|
67db2e32ef | ||
|
|
2bb7ca6ccd | ||
|
|
2610d98ae1 | ||
|
|
32d533ff61 | ||
|
|
ac68a20697 | ||
|
|
0b90141dcd | ||
|
|
5bc5711f09 | ||
|
|
00411f015c | ||
|
|
ab9799b273 | ||
|
|
d8dbc66b27 | ||
|
|
08ed8866d0 | ||
|
|
620d0ef9de | ||
|
|
312d38ac6d | ||
|
|
4aec0e4e9a | ||
|
|
4f1002ee2d | ||
|
|
f291891139 | ||
|
|
230cefb85d | ||
|
|
84df8142c6 | ||
|
|
38e45c4f60 | ||
|
|
221f4e59e1 | ||
|
|
8ccafd5c0c | ||
|
|
59fcf3e2f0 | ||
|
|
59cc61105a | ||
|
|
ea438a7f40 | ||
|
|
1cb2bac407 |
6
.gitignore
vendored
Normal file
6
.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
assets/
|
||||||
|
.vscode/
|
||||||
|
notes.txt
|
||||||
|
Test.png
|
||||||
|
test.png
|
||||||
|
coverage.txt
|
||||||
30
.gitlab-ci.yml
Normal file
30
.gitlab-ci.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# This file is a template, and might need editing before it works on your project.
|
||||||
|
image: golang:latest
|
||||||
|
|
||||||
|
include:
|
||||||
|
- template: Security/License-Scanning.gitlab-ci.yml
|
||||||
|
|
||||||
|
variables:
|
||||||
|
# Please edit to your GitLab project
|
||||||
|
REPO_NAME: gitlab.com/Raum0x2A/nmslib
|
||||||
|
|
||||||
|
# The problem is that to be able to use go get, one needs to put
|
||||||
|
# the repository in the $GOPATH. So for example if your gitlab domain
|
||||||
|
# is gitlab.com, and that your repository is namespace/project, and
|
||||||
|
# the default GOPATH being /go, then you'd need to have your
|
||||||
|
# repository in /go/src/gitlab.com/namespace/project
|
||||||
|
# Thus, making a symbolic link corrects this.
|
||||||
|
before_script:
|
||||||
|
- mkdir -p $GOPATH/src/$(dirname $REPO_NAME)
|
||||||
|
- ln -svf $CI_PROJECT_DIR $GOPATH/src/$REPO_NAME
|
||||||
|
- cd $GOPATH/src/$REPO_NAME
|
||||||
|
|
||||||
|
stages:
|
||||||
|
- test
|
||||||
|
|
||||||
|
format:
|
||||||
|
stage: test
|
||||||
|
script:
|
||||||
|
- go fmt $(go list ./...)
|
||||||
|
- go vet $(go list ./...)
|
||||||
|
- go test
|
||||||
BIN
NMH-BlueDream.png
Normal file
BIN
NMH-BlueDream.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 307 KiB |
233
README.md
Normal file
233
README.md
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
# NMSlib
|
||||||
|
|
||||||
|
[](COPYING)
|
||||||
|
[](https://godoc.org/gitlab.com/Raum0x2A/nmslib)
|
||||||
|
[](https://gitlab.com/Raum0x2A/nmslib)
|
||||||
|
[](https://gitlab.com/Raum0x2A/nmslib/-/tree/develop)
|
||||||
|
[](https://gitlab.com/Raum0x2A/nmslib/-/releases/v1.0.1)
|
||||||
|
[](https://goreportcard.com/report/gitlab.com/Raum0x2A/nmslib)
|
||||||
|
|
||||||
|
NMSlib is a GoLang package for dealing with converting Galactic coordinates to Portal codes and vice versa.
|
||||||
|
|
||||||
|
NMSlib also translates in game languages (Korvax, Gek Vy'Keen and Atlas) to english, and create portal banners.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
To install this module use `go get`
|
||||||
|
|
||||||
|
|
||||||
|
```golang
|
||||||
|
go get -u gitlab.com/Raum0x2A/nmslib
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
### Example:
|
||||||
|
|
||||||
|
```golang
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"gitlab.com/Raum0x2A/nmslib"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
portalcode := "21F2F8EDB94D"
|
||||||
|
galacticCoords, err := nmslib.P2gc(portalcode)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Printf("Input:\t%s\nOutput:\t%s\n", portalcode, galacticCoords)
|
||||||
|
|
||||||
|
g2p, err := nmslib.Gc2p("014C:0077:06DA:01F2", 2)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Printf("Input:\t014C:0077:06DA:01F2\nOutput:\t%s\n", g2p)
|
||||||
|
|
||||||
|
_ := nmslib.CreateBanner(portalcode, "./NMH-BlueDream.png", 0)
|
||||||
|
_ := nmslib.CreateBanner(nmslib.RndPortal(), "./Random.png", 0)
|
||||||
|
|
||||||
|
fmt.Println(nmslib.Translate{Lang: "korvax"}.ToEng("KIHTYOMOLES"))
|
||||||
|
korvax := nmslib.Translate{"english"}
|
||||||
|
fmt.Println(korvax.ToKorvax("Contraband"))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
## Creating a Glyph banner
|
||||||
|
|
||||||
|
This function takes 3 parameters and reurns an error
|
||||||
|
|
||||||
|
* portalcode: 12 char hex string of portal location
|
||||||
|
* savename: Save location and name
|
||||||
|
* layout:
|
||||||
|
* 00 or 0 is horizontal in light mode
|
||||||
|
* 01 or 1 is horizontal in dark mode
|
||||||
|
* 11 is vertical in dark mode
|
||||||
|
* 10 is vertical in light mode
|
||||||
|
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
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
|
||||||
|
err := nmslib.CreateBanner("21F2F8EDB94D", "NMH-BlueDream.png", 0)
|
||||||
|
if err !=nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
Vertical layout for a random address
|
||||||
|
|
||||||
|
```golang
|
||||||
|
err := nmslib.CreateBanner(nmslib.RndPortal(), "ranportal.png", 11)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
_Note: Image shown in readme.md's vertical example have been scaled down in gimp for easier viewing on gitlab._
|
||||||
|
|
||||||
|
_Original ranportal.png: 256x3072px_
|
||||||
|
|
||||||
|
|
||||||
|
### Converting Portal code to Galactic address
|
||||||
|
|
||||||
|
This function only takes 1 parameter and returns a string and error
|
||||||
|
|
||||||
|
* portalcode: 12 char hex string of portal glyphs
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```golang
|
||||||
|
ga, _ := nmslib.P2gc("21F2F8EDB94D")
|
||||||
|
fmt.Println(ga)
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
``014C:0077:06DA:01F2``
|
||||||
|
|
||||||
|
### Converting Galactic coordinates to Portal codes
|
||||||
|
|
||||||
|
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.Gc2p("014C:0077:06DA:01F2", 2)
|
||||||
|
fmt.Println(pc)
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
``21F2F8EDB94D``
|
||||||
|
|
||||||
|
## Translate Words
|
||||||
|
|
||||||
|
Supported languages
|
||||||
|
|
||||||
|
- Korvax
|
||||||
|
- Gek
|
||||||
|
- Vy'keen
|
||||||
|
- Atlas
|
||||||
|
|
||||||
|
### Translate Atlas to English
|
||||||
|
|
||||||
|
This function takes only 1 parameter and returns a string
|
||||||
|
|
||||||
|
* Word: Any known Atlas word (ex. Paka)
|
||||||
|
|
||||||
|
_note: Translating to english will **always** result in the lowercase equivilent word_
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```golang
|
||||||
|
fmt.Println(nmslib.Translate{Lang: "atlas"}.ToEng("Paka"))
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
``awake``
|
||||||
|
|
||||||
|
### Translate English to Korvax
|
||||||
|
|
||||||
|
This function takes only 1 parameter and returns a string
|
||||||
|
|
||||||
|
* engword: English word to attempt conversion
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```golang
|
||||||
|
korvax := nmslib.Translate{"english"}
|
||||||
|
fmt.Println(korvax.ToKorvax("Contraband"))
|
||||||
|
```
|
||||||
|
|
||||||
|
Output:
|
||||||
|
|
||||||
|
``Zelidovoso``
|
||||||
|
|
||||||
|
|
||||||
|
### Language commands
|
||||||
|
|
||||||
|
- ``Translate{Lang: ``string``}.ToEng(``string``)``
|
||||||
|
- ``Translate{Lang: ``string``}.ToKorvax(``string``)``
|
||||||
|
- ``Translate{Lang: ``string``}.ToGek(``string``)``
|
||||||
|
- ``Translate{Lang: ``string``}.ToVykeen(``string``)``
|
||||||
|
- ``Translate{Lang: ``string``}.ToAtlat(``string``)``
|
||||||
|
|
||||||
|
#### Possible Lang string options
|
||||||
|
|
||||||
|
- ``"english"``
|
||||||
|
- ``"korvax"``
|
||||||
|
- ``"gek"``
|
||||||
|
- ``"vykeen"``
|
||||||
|
- ``"atlas"``
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Random Portal address
|
||||||
|
|
||||||
|
Generate random portal codes
|
||||||
|
- Atlas Station
|
||||||
|
- Black Hole
|
||||||
|
- Random address
|
||||||
|
|
||||||
|
All random address created will default to the planet index 1 to help ensure there the address is valid
|
||||||
|
|
||||||
|
**Example:**
|
||||||
|
|
||||||
|
```golang
|
||||||
|
fmt.Println(nmslib.RndPortal())
|
||||||
|
fmt.Println(nmslib.RndPortal())
|
||||||
|
fmt.Println(nmslib.RndAtlas())
|
||||||
|
fmt.Println(nmslib.RndBH())
|
||||||
|
```
|
||||||
|
|
||||||
|
**Output examples:**
|
||||||
|
|
||||||
|
``10EFABDEA373``
|
||||||
|
|
||||||
|
``11EAB355FC8E``
|
||||||
|
|
||||||
|
``107AC0E190D1``
|
||||||
|
|
||||||
|
``10796D57AE15``
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
## A Proud member of NMH Hub
|
||||||
|
|
||||||
|
### [](https://nomanssky.fandom.com/wiki/No_Man%27s_High_Hub) [](https://discord.gg/mhRxf29hns)
|
||||||
73
convert.go
73
convert.go
@@ -1,3 +1,8 @@
|
|||||||
|
/*
|
||||||
|
Xainesworld Video: https://www.youtube.com/watch?v=xmZbkTahw4w
|
||||||
|
Fandom Wiki: https://nomanssky.fandom.com/wiki/Portal_address
|
||||||
|
*/
|
||||||
|
|
||||||
package nmslib
|
package nmslib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@@ -7,21 +12,11 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
|
||||||
The maths are all thanks to:
|
|
||||||
Xainesworld
|
|
||||||
- YT Channel - https://www.youtube.com/channel/UCzTB8EBVJWkzJi2sQjdBv9g
|
|
||||||
- Video: https://www.youtube.com/watch?v=xmZbkTahw4w
|
|
||||||
- Website: https://www.xainesworld.com/
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
P2gc - Portal code to galactic coordinates
|
P2gc - Portal code to galactic coordinates
|
||||||
Requires 1 var and returns 1 var string
|
Requires 1 var and returns 1 var string and an error
|
||||||
var p string
|
var p string: Portal Glyph hex string 12 chars in len (ex. 006afa556c30)
|
||||||
Portal Glyph hex string 12 chars in len (ex. 006afa556c30)
|
Returns var string: Galactic address (ex. 042F:0079:0D55:006A)
|
||||||
Return var string
|
|
||||||
Galactic address (ex. 042F:0079:0D55:006A)
|
|
||||||
*/
|
*/
|
||||||
func P2gc(p string) (gc string, err error) {
|
func P2gc(p string) (gc string, err error) {
|
||||||
if len(p) == 12 { // Test if length of provided string is 12 chars long
|
if len(p) == 12 { // Test if length of provided string is 12 chars long
|
||||||
@@ -30,19 +25,19 @@ func P2gc(p string) (gc string, err error) {
|
|||||||
var coord [4]int64
|
var coord [4]int64
|
||||||
coord[1], err = strconv.ParseInt(p[4:6], 16, 16) // Y coordinate
|
coord[1], err = strconv.ParseInt(p[4:6], 16, 16) // Y coordinate
|
||||||
if err != nil {
|
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
|
coord[2], err = strconv.ParseInt(p[6:9], 16, 16) // Z cooridnate
|
||||||
if err != nil {
|
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
|
coord[3], err = strconv.ParseInt(p[9:12], 16, 16) // X coordinate
|
||||||
if err != nil {
|
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)
|
coord[0], err = strconv.ParseInt(p[1:4], 16, 16) // SSI (Star System Identifier)
|
||||||
if err != nil {
|
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
|
// apply shifts to Handle the shape/boundaries of the galaxy
|
||||||
@@ -63,29 +58,30 @@ func P2gc(p string) (gc string, err error) {
|
|||||||
gc = fmt.Sprintf("%04X:%04X:%04X:%04X", coord[3], coord[1], coord[2], coord[0])
|
gc = fmt.Sprintf("%04X:%04X:%04X:%04X", coord[3], coord[1], coord[2], coord[0])
|
||||||
|
|
||||||
} else { // if len(p) != 12 return an error
|
} else { // if len(p) != 12 return an error
|
||||||
return "", errors.New("A 12char HEX string is required. example: 006afa556c30")
|
return "", errors.New("a 12char HEX string is required. example: 006afa556c30")
|
||||||
}
|
}
|
||||||
return // return formated string
|
return // return formated string
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Gc2p - Galactic coordinates to portal code
|
Gc2p - Galactic coordinates to portal code
|
||||||
Requires 1 string and returns a string and error
|
Requires 1 string and 1 int returns a string and error
|
||||||
var gc string
|
var gc string: Galactic address (ex. 042F:0079:0D55:006A)
|
||||||
Galactic address (ex. 042F:0079:0D55:006A)
|
var p int: Planet ID [1-6]
|
||||||
Return var string
|
Returns portalcode string: Portal Glyph hex string 12 chars in len (ex. 006afa556c30)
|
||||||
Portal Glyph hex string 12 chars in len (ex. 006afa556c30)
|
|
||||||
*/
|
*/
|
||||||
func Gc2p(gc string) (portalcode string, err error) {
|
func Gc2p(gc string, p int) (portalcode string, err error) {
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
/*TODO: add option for Planet choice (1-6)*/
|
|
||||||
// split and store string
|
// split and store string
|
||||||
// coords[0] == X; coords[1] == Y coords[2] == Z;
|
// coords[0] == X; coords[1] == Y coords[2] == Z;
|
||||||
// coords[3] == SSI coords[4] == P
|
// coords[3] == SSI coords[4] == P
|
||||||
coords := strings.Split(gc+":1", ":")
|
if len(gc) != 19 {
|
||||||
|
return "", errors.New("galatic code is the wrong length")
|
||||||
|
}
|
||||||
|
if p > 6 {
|
||||||
|
p = 1
|
||||||
|
}
|
||||||
|
nustring := fmt.Sprintf("%s:%d", gc, p)
|
||||||
|
coords := strings.Split(nustring, ":")
|
||||||
for n := 0; n < len(coords); n++ {
|
for n := 0; n < len(coords); n++ {
|
||||||
portalcode = portalcode + coords[n]
|
portalcode = portalcode + coords[n]
|
||||||
}
|
}
|
||||||
@@ -93,26 +89,30 @@ func Gc2p(gc string) (portalcode string, err error) {
|
|||||||
var hexCoords [5]int64
|
var hexCoords [5]int64
|
||||||
hexCoords[0], err = strconv.ParseInt(coords[4], 16, 16) // P
|
hexCoords[0], err = strconv.ParseInt(coords[4], 16, 16) // P
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return "", errors.New("error parsing intergers from string: [4]")
|
||||||
}
|
}
|
||||||
hexCoords[1], err = strconv.ParseInt(coords[3], 16, 16) // SSI
|
hexCoords[1], err = strconv.ParseInt(coords[3], 16, 16) // SSI
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return "", errors.New("error parsing intergers from string: [3]")
|
||||||
}
|
}
|
||||||
hexCoords[2], err = strconv.ParseInt(coords[1], 16, 16) // Y
|
hexCoords[2], err = strconv.ParseInt(coords[1], 16, 16) // Y
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return "", errors.New("error parsing intergers from string: [1]")
|
||||||
}
|
}
|
||||||
hexCoords[3], err = strconv.ParseInt(coords[2], 16, 16) // Z
|
hexCoords[3], err = strconv.ParseInt(coords[2], 16, 16) // Z
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return "", errors.New("error parsing intergers from string: [2]")
|
||||||
}
|
}
|
||||||
hexCoords[4], err = strconv.ParseInt(coords[0], 16, 16) // X
|
hexCoords[4], err = strconv.ParseInt(coords[0], 16, 16) // X
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return "", errors.New("error parsing intergers from string: [0]")
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply shifts to Handle the shape/boundaries of the galaxy
|
// 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[2] = hexCoords[2] + 0x81 // Y ->> shift
|
||||||
hexCoords[3] = hexCoords[3] + 0x801 // Z ->> shift
|
hexCoords[3] = hexCoords[3] + 0x801 // Z ->> shift
|
||||||
hexCoords[4] = hexCoords[4] + 0x801 // X ->> shift
|
hexCoords[4] = hexCoords[4] + 0x801 // X ->> shift
|
||||||
@@ -124,6 +124,7 @@ func Gc2p(gc string) (portalcode string, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Assemble padded values as a string
|
// Assemble padded values as a string
|
||||||
|
|
||||||
portalcode = fmt.Sprintf("%00X%03X", hexCoords[0], hexCoords[1])
|
portalcode = fmt.Sprintf("%00X%03X", hexCoords[0], hexCoords[1])
|
||||||
for n := 2; n < len(hexCoords); n++ {
|
for n := 2; n < len(hexCoords); n++ {
|
||||||
if n == 2 {
|
if n == 2 {
|
||||||
@@ -132,5 +133,5 @@ func Gc2p(gc string) (portalcode string, err error) {
|
|||||||
portalcode = portalcode + fmt.Sprintf("%03X", hexCoords[n])
|
portalcode = portalcode + fmt.Sprintf("%03X", hexCoords[n])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return portalcode, err // return formated string and error
|
return // return formated string and error
|
||||||
}
|
}
|
||||||
|
|||||||
157
glyphbanner.go
157
glyphbanner.go
@@ -1,91 +1,128 @@
|
|||||||
package nmslib
|
package nmslib
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"image/png"
|
"image"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
gim "github.com/ozankasikci/go-image-merge"
|
"github.com/fogleman/gg"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*CreateBanner - Output PNG of Portal Glyphs
|
/*CreateBanner - Output PNG of Portal Glyphs
|
||||||
Requires 3 vars and returns 0 var, Outputs a PNG file
|
Requires 3 vars and returns 1 err, Outputs a PNG file
|
||||||
var portalex string
|
var portalex string: Portal Glyph hex string
|
||||||
Portal Glyph hex string
|
var savename string: Output name of PNG file
|
||||||
var savename string
|
var opt int
|
||||||
Output name of PNG file
|
00 sets horizontal banner in light mode [ 00 || 0 ]
|
||||||
var vopt int
|
01 sets horizontal banner in dark mode [ 01 || 1 ]
|
||||||
1 enables vertical banner
|
10 sets vertical banner in light mode
|
||||||
0 enables horizontal banner
|
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, vopt int) {
|
func CreateBanner(portalhex string, savename string, opt int) (err error) {
|
||||||
var err error
|
out, err := GenRawBanner(portalhex, opt)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
gg.SavePNG(savename+".png", out)
|
||||||
|
//gg.SaveJPG(savename+".jpg", out, 50)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
/*GenRawBanner - Returns image.Image of genorated image
|
||||||
|
Requires 2 vars and returns image.Image (raw image data) and an error
|
||||||
|
var portalex string: Portal Glyph hex string
|
||||||
|
var opt int
|
||||||
|
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
|
||||||
|
11 sets vertical banner in dark mode
|
||||||
|
|
||||||
|
* note first of the 2 bits sets the layout, the second bit sets the glyph color
|
||||||
|
*/
|
||||||
|
func GenRawBanner(portalhex string, layout int) (portalbanner image.Image, err error) {
|
||||||
var GlyphHex [12]int64
|
var GlyphHex [12]int64
|
||||||
var glyphImg [12]string
|
var glyphImg [12]string
|
||||||
|
var mode string
|
||||||
|
var imgArray [12]image.Image
|
||||||
|
|
||||||
|
//Set light or dark mode glyphs
|
||||||
|
if layout == 00 || layout == 10 {
|
||||||
|
mode = "light"
|
||||||
|
} else if layout == 01 || layout == 11 {
|
||||||
|
mode = "dark"
|
||||||
|
} else {
|
||||||
|
// if layout is an invalid option (ie. not a 2 bit binary number default to classic mode/layout
|
||||||
|
layout = 0
|
||||||
|
mode = "light"
|
||||||
|
}
|
||||||
|
|
||||||
// verify len of portalhex
|
// verify len of portalhex
|
||||||
if len(portalhex) == 12 {
|
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++ {
|
for i := 0; i < len(portalhex); i++ {
|
||||||
GlyphHex[i], err = strconv.ParseInt(portalhex[i:int(i+1)], 16, 16)
|
GlyphHex[i], err = strconv.ParseInt(portalhex[i:int(i+1)], 16, 16)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return nil, errors.New("string provided is not hexadecimal ([0-9][A-F])")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 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++ {
|
for j := 0; j < len(glyphImg); j++ {
|
||||||
glyphImg[j] = fmt.Sprintf("tmp.nmslib/glyphs/GLYPH-%X.png", GlyphHex[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++ {
|
for k := 0; k < len(glyphImg); k++ {
|
||||||
data, err := Asset(glyphImg[k])
|
data, err := Asset(glyphImg[k])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return nil, errors.New("can not load images from assets: " + glyphImg[k])
|
||||||
}
|
}
|
||||||
_, err2 := os.Stat("tmp.nmslib/glyphs")
|
err = ioutil.WriteFile(NmsTemp+"/"+glyphImg[k], []byte(data), 0644)
|
||||||
if os.IsNotExist(err2) {
|
|
||||||
errDir := os.MkdirAll("tmp.nmslib/glyphs", 0755)
|
|
||||||
if errDir != nil {
|
|
||||||
panic(errDir)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = ioutil.WriteFile(glyphImg[k], []byte(data), 0644)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// load images for processing using github.com/ozankasikci/go-image-merge
|
|
||||||
grids := []*gim.Grid{
|
|
||||||
{ImageFilePath: glyphImg[0]}, {ImageFilePath: glyphImg[1]},
|
|
||||||
{ImageFilePath: glyphImg[2]}, {ImageFilePath: glyphImg[3]},
|
|
||||||
{ImageFilePath: glyphImg[4]}, {ImageFilePath: glyphImg[5]},
|
|
||||||
{ImageFilePath: glyphImg[6]}, {ImageFilePath: glyphImg[7]},
|
|
||||||
{ImageFilePath: glyphImg[8]}, {ImageFilePath: glyphImg[9]},
|
|
||||||
{ImageFilePath: glyphImg[10]}, {ImageFilePath: glyphImg[11]},
|
|
||||||
}
|
|
||||||
if vopt == 1 {
|
|
||||||
// Merge images horizontally
|
|
||||||
rgba, err := gim.New(grids, 1, 12).Merge()
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
return nil, errors.New("can not write file to temp directory")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Load/open images needed
|
||||||
|
for iter := 0; iter < 12; iter++ {
|
||||||
|
imgArray[iter], err = gg.LoadPNG(NmsTemp + "/" + glyphImg[iter])
|
||||||
|
if err != nil {
|
||||||
|
return nil, errors.New("can not read glyph " + glyphImg[iter])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//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()
|
||||||
|
|
||||||
|
//Set Layout
|
||||||
|
//classic horizontal layout
|
||||||
|
if layout == 01 || layout == 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)
|
||||||
|
}
|
||||||
|
return concat.Image(), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
//Vertical layout
|
||||||
|
if layout == 10 || layout == 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)
|
||||||
|
}
|
||||||
|
return concat.Image(), nil
|
||||||
}
|
}
|
||||||
// save the output to png
|
|
||||||
fmt.Printf("Saving %s to %s in vertical format\n", portalhex, savename)
|
|
||||||
file, err := os.Create(savename)
|
|
||||||
err = png.Encode(file, rgba)
|
|
||||||
} else {
|
} else {
|
||||||
// Merge images vertically
|
return nil, errors.New("portalcode must be exactly 12 chars")
|
||||||
rgba, err := gim.New(grids, 12, 1).Merge()
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
// save the output to png
|
|
||||||
fmt.Printf("Saving %s to %s\n", portalhex, savename)
|
|
||||||
file, err := os.Create(savename)
|
|
||||||
err = png.Encode(file, rgba)
|
|
||||||
}
|
|
||||||
// remove glyphs folder to keep it clean
|
|
||||||
errDir := os.RemoveAll("tmp.nmslib/glyphs")
|
|
||||||
if errDir != nil {
|
|
||||||
panic(errDir)
|
|
||||||
}
|
}
|
||||||
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
10
go.mod
10
go.mod
@@ -1,5 +1,9 @@
|
|||||||
module gitlab.com/bradley.richins/nmslib
|
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.1-0.20210131172831-af4cd580789b
|
||||||
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
|
||||||
|
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e // indirect
|
||||||
|
)
|
||||||
|
|||||||
9
go.sum
9
go.sum
@@ -1,2 +1,7 @@
|
|||||||
github.com/ozankasikci/go-image-merge v0.2.2 h1:K370BLLTIsamwjAeViiPntf7GiG3h9pXzDmxXCbN8/0=
|
github.com/fogleman/gg v1.3.1-0.20210131172831-af4cd580789b h1:gqOBIAmkc/ZxXzFrM4wTub7tD0xYaOsaOQ5wOA74lJQ=
|
||||||
github.com/ozankasikci/go-image-merge v0.2.2/go.mod h1:NQ2aN0b21buFx3p+5x4dZrKuPSLh2uBukK7F30BrYTo=
|
github.com/fogleman/gg v1.3.1-0.20210131172831-af4cd580789b/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
71
init.go
Normal 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
11
init_test.go
Normal 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)
|
||||||
|
}
|
||||||
216
lang.go
216
lang.go
@@ -2,126 +2,140 @@ package nmslib
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/csv"
|
"encoding/csv"
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
/*
|
/*Translate Game languages and english
|
||||||
Korvaxlang - set up structure of a word iteration
|
Translate.Lang sets source language for translations
|
||||||
|
options are:
|
||||||
|
korvax
|
||||||
|
gek
|
||||||
|
vykeen
|
||||||
|
atlas
|
||||||
|
english
|
||||||
*/
|
*/
|
||||||
type Korvaxlang struct {
|
type Translate struct {
|
||||||
English string
|
Lang string
|
||||||
KorvaxWord string
|
|
||||||
KWCaps string
|
|
||||||
KWALLCAPS string
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*Translate source language to english
|
||||||
Korvax2Eng - convert known korvax words into english
|
Translate any NMS language (ie. Korvax) to english
|
||||||
*/
|
*/
|
||||||
func Korvax2Eng(kvwrd string) string {
|
func (t Translate) ToEng(word string) (translation string) {
|
||||||
data, err := Asset("tmp.nmslib/korvax-lang.csv")
|
//return translate2english(word, langFile(t.Lang))
|
||||||
|
return Translator(word, t.Lang, "english")
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Translate source language to Korvax
|
||||||
|
Translate any NMS language or english (ie. Gek) to Korvax
|
||||||
|
*/
|
||||||
|
func (t Translate) ToKorvax(word string) (translation string) {
|
||||||
|
return Translator(word, t.Lang, "korvax")
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Translate source language to Vy'Keen
|
||||||
|
Translate any NMS language or english (ie. Atlas) to Vy'Keen
|
||||||
|
*/
|
||||||
|
func (t Translate) ToVykeen(word string) (translation string) {
|
||||||
|
return Translator(word, t.Lang, "vykeen")
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Translate source language to Gek
|
||||||
|
Translate any NMS language or english (ie. Vy'Keen) to Gek
|
||||||
|
*/
|
||||||
|
func (t Translate) ToGek(word string) (translation string) {
|
||||||
|
return Translator(word, t.Lang, "Gek")
|
||||||
|
}
|
||||||
|
|
||||||
|
/*Translate source language to Atlas
|
||||||
|
Translate any NMS language or english (ie. Korvax) to Atlas
|
||||||
|
*/
|
||||||
|
func (t Translate) ToAtlas(word string) (translation string) {
|
||||||
|
return Translator(word, t.Lang, "atlas")
|
||||||
|
}
|
||||||
|
|
||||||
|
// read language files
|
||||||
|
func langFile(lang string) [][]string {
|
||||||
|
filepath := NmsTemp + "/assets/lang/" + lang + "-lang.csv"
|
||||||
|
csvFile, err := os.Open(filepath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
_, err2 := os.Stat("tmp.nmslib/")
|
|
||||||
if os.IsNotExist(err2) {
|
|
||||||
errDir := os.MkdirAll("tmp.nmslib/", 0755)
|
|
||||||
if errDir != nil {
|
|
||||||
panic(errDir)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
err = ioutil.WriteFile("tmp.nmslib/korvax-lang.csv", []byte(data), 0644)
|
|
||||||
csvFile, err := os.Open("tmp.nmslib/korvax-lang.csv")
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
defer csvFile.Close()
|
defer csvFile.Close()
|
||||||
CsvLines, err := csv.NewReader(csvFile).ReadAll()
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
for _, line := range CsvLines {
|
|
||||||
klang := Korvaxlang{
|
|
||||||
English: line[0],
|
|
||||||
KorvaxWord: line[1],
|
|
||||||
KWCaps: line[2],
|
|
||||||
KWALLCAPS: line[3],
|
|
||||||
}
|
|
||||||
if kvwrd == klang.KorvaxWord {
|
|
||||||
errDir := os.RemoveAll("tmp.nmslib")
|
|
||||||
if errDir != nil {
|
|
||||||
panic(errDir)
|
|
||||||
}
|
|
||||||
return klang.English
|
|
||||||
} else if kvwrd == klang.KWCaps {
|
|
||||||
errDir := os.RemoveAll("tmp.nmslib")
|
|
||||||
if errDir != nil {
|
|
||||||
panic(errDir)
|
|
||||||
}
|
|
||||||
return strings.Title(strings.ToLower(klang.English))
|
|
||||||
} else if kvwrd == klang.KWALLCAPS {
|
|
||||||
errDir := os.RemoveAll("tmp.nmslib")
|
|
||||||
if errDir != nil {
|
|
||||||
panic(errDir)
|
|
||||||
}
|
|
||||||
return strings.ToUpper(klang.English)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// remove recource folder to keep it clean
|
|
||||||
errDir := os.RemoveAll("tmp.nmslib")
|
|
||||||
if errDir != nil {
|
|
||||||
panic(errDir)
|
|
||||||
}
|
|
||||||
return "*\\Kzzzzzzt\\*" // word not found default
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
lines, err := csv.NewReader(csvFile).ReadAll()
|
||||||
Eng2Korvax - Convert (some) english words to Korvax
|
|
||||||
*/
|
|
||||||
func Eng2Korvax(enwrd string) string {
|
|
||||||
data, err := Asset("tmp.nmslib/korvax-lang.csv")
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
_, err2 := os.Stat("tmp.nmslib/")
|
return lines
|
||||||
if os.IsNotExist(err2) {
|
}
|
||||||
errDir := os.MkdirAll("tmp.nmslib/", 0755)
|
|
||||||
if errDir != nil {
|
/*Translate any in game language to another including english (ie. Korvax to Gek)
|
||||||
panic(errDir)
|
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]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
err = ioutil.WriteFile("tmp.nmslib/korvax-lang.csv", []byte(data), 0644)
|
if target != "english" {
|
||||||
csvFile, err := os.Open("tmp.nmslib/korvax-lang.csv")
|
for _, line := range langFile(target) {
|
||||||
if err != nil {
|
if strings.EqualFold(line[0], sourcekey[0]) {
|
||||||
fmt.Println(err)
|
targetkey[0] = line[0]
|
||||||
}
|
targetkey[1] = line[1]
|
||||||
defer csvFile.Close()
|
targetkey[2] = line[2]
|
||||||
CsvLines, err := csv.NewReader(csvFile).ReadAll()
|
targetkey[3] = line[3]
|
||||||
if err != nil {
|
|
||||||
fmt.Println(err)
|
|
||||||
}
|
|
||||||
for _, line := range CsvLines {
|
|
||||||
klang := Korvaxlang{
|
|
||||||
English: line[0],
|
|
||||||
KorvaxWord: line[1],
|
|
||||||
KWCaps: line[2],
|
|
||||||
KWALLCAPS: line[3],
|
|
||||||
}
|
|
||||||
if enwrd == klang.English {
|
|
||||||
errDir := os.RemoveAll("tmp.nmslib")
|
|
||||||
if errDir != nil {
|
|
||||||
panic(errDir)
|
|
||||||
}
|
|
||||||
return klang.KorvaxWord
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// remove recource folder to keep it clean
|
if strings.EqualFold(word, sourcekey[0]) {
|
||||||
errDir := os.RemoveAll("tmp.nmslib")
|
if targetkey[0] != "" {
|
||||||
if errDir != nil {
|
rt = targetkey[0]
|
||||||
panic(errDir)
|
|
||||||
}
|
}
|
||||||
return "*\\Kzzzzzzt\\*" // word not found default
|
} 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
30
nmslib-convert_test.go
Normal 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
21
nmslib-glyphbanner_test.go
Normal file
21
nmslib-glyphbanner_test.go
Normal 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"
|
||||||
|
|
||||||
|
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
21
nmslib-rpcg_test.go
Normal 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
36
nmslib-translate_test.go
Normal 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: ")
|
||||||
|
}
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
package nmslib
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"testing"
|
|
||||||
)
|
|
||||||
|
|
||||||
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")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestGalactic2portal(t *testing.T) {
|
|
||||||
want, err := Gc2p("042F:0079:0D55:006A")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
if want != "106AFA556C30" {
|
|
||||||
t.Errorf("Testing Gc2p(\"042F:0079:0D55:006A\"): got %q, want: %q.\n", want, "106AFA556C30")
|
|
||||||
} else {
|
|
||||||
fmt.Printf("Testing Gc2p(\"042F:0079:0D55:006A\"): got: %q, want: %q.\n", want, "106AFA556C30")
|
|
||||||
}
|
|
||||||
|
|
||||||
want, err = Gc2p("044B:0081:0D68:0096")
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
if want != "109602569C4C" {
|
|
||||||
t.Errorf("Testing Gc2p(\"044B:0081:0D68:0096\"): got %q, want: %q.\n", want, "109602569C4C")
|
|
||||||
} else {
|
|
||||||
fmt.Printf("Testing Gc2p(\"044B:0081:0D68:0096\"): got: %q, want: %q.\n", want, "109602569C4C")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestCreateBanner(t *testing.T) {
|
|
||||||
fmt.Printf("Testing CreateBanner: ")
|
|
||||||
CreateBanner("006afa556c30", "/tmp/Test.png", 0)
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestKorvax2Eng(t *testing.T) {
|
|
||||||
want := Korvax2Eng("eapoluch")
|
|
||||||
if want != "emergency" {
|
|
||||||
t.Errorf("Testing Korvax2eng(\"eapoluch\"): got %q, want: %q.\n", want, "emergency")
|
|
||||||
} else {
|
|
||||||
fmt.Printf("Testing Korvax2eng(\"eapoluch\"): got %q, want: %q.\n", want, "emergency")
|
|
||||||
}
|
|
||||||
|
|
||||||
want = Korvax2Eng("notaword")
|
|
||||||
if want != "*\\Kzzzzzzt\\*" {
|
|
||||||
t.Errorf("Testing Korvax2eng(\"notaword\"): got %q, want: %q.\n", want, "*\\Kzzzzzzt\\*")
|
|
||||||
} else {
|
|
||||||
fmt.Printf("Testing Korvax2eng(\"notaword\"): got %q, want: %q.\n", want, "*\\Kzzzzzzt\\*")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestEng2Korvax(t *testing.T) {
|
|
||||||
want := Eng2Korvax("emergency")
|
|
||||||
if want != "eapoluch" {
|
|
||||||
t.Errorf("Testing Eng2Korvax(\"emergency\"): got %q, want: %q.\n", want, "eapoluch")
|
|
||||||
} else {
|
|
||||||
fmt.Printf("Testing Eng2Korvax(\"emergency\"): got %q, want: %q.\n", want, "eapoluch")
|
|
||||||
}
|
|
||||||
|
|
||||||
want = Eng2Korvax("notaword")
|
|
||||||
if want != "*\\Kzzzzzzt\\*" {
|
|
||||||
t.Errorf("Testing Eng2Korvax(\"notaword\"): got %q, want: %q.\n", want, "*\\Kzzzzzzt\\*")
|
|
||||||
} else {
|
|
||||||
fmt.Printf("Testing Eng2Korvax(\"notaword\"): got %q, want: %q.\n", want, "*\\Kzzzzzzt\\*")
|
|
||||||
}
|
|
||||||
fmt.Printf("Testing: ")
|
|
||||||
}
|
|
||||||
BIN
ranportal_scaled.png
Normal file
BIN
ranportal_scaled.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 40 KiB |
607
resources.go
607
resources.go
File diff suppressed because one or more lines are too long
92
rpcg.go
Normal file
92
rpcg.go
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
/*
|
||||||
|
[P][SSS][YY][ZZZ][XXX] – (P = Planet Index / S = Star System Index / Y = Height / Z = Width / X = Length)
|
||||||
|
|
||||||
|
`Solar System Index
|
||||||
|
A Solar System Index is assigned to each star system in a region. It always begins at SolarSystemIndex=001
|
||||||
|
and counts up by one for every star system. The number of star systems in a region is variable so the
|
||||||
|
maximum value of the Solar System Index is also variable, though the two correspond directly. To date there
|
||||||
|
is no discovered value that is higher than SolarSystemIndex=243 (Mamundi-Kate in the Baadossm Anomaly of
|
||||||
|
Euclid galaxy), meaning that 579 is the maximum number of star systems yet discovered in a region. Based
|
||||||
|
on the evidence that every region has a SolarSystemIndex=079 and SolarSystemIndex=07A (with the former
|
||||||
|
always having a Black Hole and the latter always having an Atlas Station), it is known that every region has
|
||||||
|
at least 122 star systems. SolarSystemIndex=000 always leads to the region's first system, just like
|
||||||
|
PlanetIndex=0 always leads to the first portal of a system due to the error proximity mechanic.`
|
||||||
|
Source https://nomanssky.fandom.com/wiki/Portal_address#Solar_System_Index
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
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
|
||||||
|
ymax := 0xFF
|
||||||
|
xzmax := 0xFFF
|
||||||
|
ssimax := 0x242 // set this low to lower chances of an invalid address
|
||||||
|
|
||||||
|
x := rand.Intn(xzmax-min+1) + min
|
||||||
|
z := rand.Intn(xzmax-min+1) + min
|
||||||
|
y := rand.Intn(ymax-min+1) + min
|
||||||
|
ssi := rand.Intn(ssimax-min+1) + min
|
||||||
|
|
||||||
|
final = fmt.Sprintf("%00X%03X%02X%03X%03X", 1, ssi, y, z, x)
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user