/
exmars.go
103 lines (85 loc) · 2.22 KB
/
exmars.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
package main
import (
"syscall"
"unsafe"
)
type marsSettings struct {
Coresize int `json:"coresize"`
Cycles int `json:"cycles"`
Maxprocess int `json:"maxprocess"`
Maxwarriorlen int `json:"maxwarriorlen"`
FixedPos int `json:"fixedpos"`
}
type result struct {
Win int
Lose int
Equal int
}
// WinPercent ...
func (r *result) WinPercent() int {
return int((float32(r.Win) / float32(r.Win+r.Lose+r.Equal)) * 100.0)
}
// LosePercent ...
func (r *result) LosePercent() int {
return int((float32(r.Lose) / float32(r.Win+r.Lose+r.Equal)) * 100.0)
}
// EqualPercent ...
func (r *result) EqualPercent() int {
return int((float32(r.Equal) / float32(r.Win+r.Lose+r.Equal)) * 100.0)
}
var roundsMetrics int
var fightMetrics int
var exmars *syscall.LazyDLL
var f2w *syscall.LazyProc
var f1w *syscall.LazyProc
func initMars() {
exmars = syscall.NewLazyDLL("./exmars.dll")
f2w = exmars.NewProc("Fight2Warriors")
f1w = exmars.NewProc("Fight1Warrior")
}
func fixWarrior(w []byte) string {
for i := 0; i < len(w); i++ {
if w[i] == 0 {
w[i] = 57
}
}
return string(w)
}
func fight(w1 string, w2 string, rounds int) result {
r := result{}
f2w.Call(
uintptr(unsafe.Pointer(syscall.StringBytePtr(w1))),
uintptr(unsafe.Pointer(syscall.StringBytePtr(w2))),
uintptr(currentConfig.Mars.Coresize),
uintptr(currentConfig.Mars.Cycles),
uintptr(currentConfig.Mars.Maxprocess),
uintptr(rounds),
uintptr(currentConfig.Mars.Maxwarriorlen),
uintptr(currentConfig.Mars.FixedPos),
uintptr(unsafe.Pointer(&r.Win)),
uintptr(unsafe.Pointer(&r.Lose)),
uintptr(unsafe.Pointer(&r.Equal)))
fightMetrics++
roundsMetrics += rounds
if r.Equal+r.Lose+r.Win != rounds {
return result{0, 0, 0}
}
return r
}
func eocTest(w string, rounds int) bool {
r := result{}
f1w.Call(
uintptr(unsafe.Pointer(syscall.StringBytePtr(w))),
uintptr(currentConfig.Mars.Coresize),
uintptr(currentConfig.Mars.Cycles),
uintptr(currentConfig.Mars.Maxprocess),
uintptr(rounds),
uintptr(currentConfig.Mars.Maxwarriorlen),
uintptr(currentConfig.Mars.FixedPos),
uintptr(unsafe.Pointer(&r.Win)),
uintptr(unsafe.Pointer(&r.Lose)),
uintptr(unsafe.Pointer(&r.Equal)))
fightMetrics++
roundsMetrics += rounds
return r.Win == rounds
}