Skip to content

Commit 702ba38

Browse files
committed
added reading of FactorioSave && added reading of saves in frontend
1 parent dea0ae3 commit 702ba38

File tree

3 files changed

+404
-0
lines changed

3 files changed

+404
-0
lines changed
Lines changed: 344 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,345 @@
11
package factorioSave
2+
3+
import (
4+
"log"
5+
"os"
6+
"encoding/binary"
7+
)
8+
9+
type version16 struct {
10+
versionShort16
11+
Revision uint16
12+
}
13+
type versionShort16 struct {
14+
Major uint16
15+
Minor uint16
16+
Build uint16
17+
}
18+
type versionShort8 struct {
19+
Major uint8
20+
Minor uint8
21+
Build uint8
22+
}
23+
type Header struct {
24+
FactorioVersion version16
25+
Campaign string
26+
Name string
27+
BaseMod string
28+
Difficulty uint8
29+
Finished bool
30+
PlayerWon bool
31+
NextLevel string
32+
CanContinue bool
33+
FinishedButContinuing bool
34+
SavingReplay bool
35+
AllowNonAdminDebugOptions bool
36+
LoadedFrom versionShort8
37+
LoadedFromBuild uint16
38+
AllowedCommads uint8
39+
NumMods uint8
40+
Mods []singleMod
41+
}
42+
type singleMod struct {
43+
Name string
44+
Version versionShort8
45+
CRC uint32
46+
}
47+
48+
49+
func ReadHeader(filePath string) (Header, error) {
50+
var data Header
51+
52+
fp, err := os.Open(filePath)
53+
if err != nil {
54+
log.Printf("error opening file: %s", err)
55+
return data, err
56+
}
57+
defer fp.Close()
58+
59+
data.FactorioVersion, err = readVersion16(fp)
60+
if err != nil {
61+
log.Printf("Cant read FactorioVersion: %s", err)
62+
return data, err
63+
}
64+
65+
if !data.FactorioVersion.CheckCompatibility(0, 16, 0) {
66+
log.Printf("NOT COMPATIBLE Save-File")
67+
return data, err
68+
}
69+
70+
data.Campaign, err = readUTF8String(fp)
71+
if err != nil {
72+
log.Printf("Cant read Campaign: %s", err)
73+
return data, err
74+
}
75+
76+
data.Name, err = readUTF8String(fp)
77+
if err != nil {
78+
log.Printf("Cant read Name: %s", err)
79+
return data, err
80+
}
81+
82+
data.BaseMod, err = readUTF8String(fp)
83+
if err != nil {
84+
log.Printf("Cant read BaseMod: %s", err)
85+
return data, err
86+
}
87+
88+
data.Difficulty, err = readUint8(fp)
89+
if err != nil {
90+
log.Printf("Cant read Difficulty: %s", err)
91+
return data, err
92+
}
93+
94+
data.Finished, err = readBool(fp)
95+
if err != nil {
96+
log.Printf("Couln't read Finished bool: %s", err)
97+
return data, err
98+
}
99+
100+
data.PlayerWon, err = readBool(fp)
101+
if err != nil {
102+
log.Printf("Couldn't read PlayerWon: %s", err)
103+
return data, err
104+
}
105+
106+
data.NextLevel, err = readUTF8String(fp)
107+
if err != nil {
108+
log.Printf("Couldn't read NextLevel: %s", err)
109+
return data, err
110+
}
111+
112+
data.CanContinue, err = readBool(fp)
113+
if err != nil {
114+
log.Printf("Couldn't read CanContinue: %s", err)
115+
return data, err
116+
}
117+
118+
data.FinishedButContinuing, err = readBool(fp)
119+
if err != nil {
120+
log.Printf("Couldn't read FinishedButContinuing: %s", err)
121+
return data, err
122+
}
123+
124+
data.SavingReplay, err = readBool(fp)
125+
if err != nil {
126+
log.Printf("Couldn't read SavingReplay: %s", err)
127+
return data, err
128+
}
129+
130+
data.AllowNonAdminDebugOptions, err = readBool(fp)
131+
if err != nil {
132+
log.Printf("Couldn't read allow_non_admin_debug_options: %s", err)
133+
return data, err
134+
}
135+
136+
data.LoadedFrom, err = readVersionShort8(fp)
137+
if err != nil {
138+
log.Printf("Couldn't read LoadedFrom: %s", err)
139+
return data, err
140+
}
141+
142+
data.LoadedFromBuild, err = readUint16(fp)
143+
if err != nil {
144+
log.Printf("Couldn't read LoadedFromBuild: %s", err)
145+
return data, err
146+
}
147+
148+
data.AllowedCommads, err = readUint8(fp)
149+
if err != nil {
150+
log.Printf("Couldn't read AllowedCommands: %s", err)
151+
return data, err
152+
}
153+
154+
data.NumMods, err = readUint8(fp)
155+
if err != nil {
156+
log.Printf("Couldn't read NumMods: %s", err)
157+
return data, err
158+
}
159+
160+
for i := uint8(0); i < data.NumMods; i++ {
161+
SingleMod, err := readSingleMod(fp)
162+
if err != nil {
163+
log.Printf("Couldn't read SingleMod: %s", err)
164+
return data, err
165+
}
166+
167+
data.Mods = append(data.Mods, SingleMod)
168+
}
169+
170+
log.Println(data)
171+
return data, nil
172+
}
173+
174+
func readUTF8String(file *os.File) (string, error) {
175+
var err error
176+
infoByte := make([]byte, 1)
177+
178+
_, err = file.Read(infoByte)
179+
if err != nil {
180+
log.Printf("Error reading infoByte: %s", err)
181+
return "", nil
182+
}
183+
stringLengthInBytes := int8(infoByte[0])
184+
185+
stringBytes := make([]byte, stringLengthInBytes)
186+
_, err = file.Read(stringBytes)
187+
if err != nil {
188+
log.Printf("error reading bytes: %s", err)
189+
return "", err
190+
}
191+
finalizedString := string(stringBytes[:])
192+
193+
return finalizedString, nil
194+
}
195+
196+
func readUint8(file *os.File) (uint8, error) {
197+
var err error
198+
var temp [1]byte
199+
_, err = file.Read(temp[:])
200+
if err != nil {
201+
log.Printf("error reading byte: %s", err)
202+
return 0, nil
203+
}
204+
205+
return uint8(temp[0]), nil
206+
}
207+
208+
func readUint16(file *os.File) (uint16, error) {
209+
var err error
210+
var temp [2]byte
211+
212+
_, err = file.Read(temp[:])
213+
if err != nil {
214+
log.Printf("error reading bytes: %s", err)
215+
return 0, err
216+
}
217+
218+
return binary.LittleEndian.Uint16(temp[:]), nil
219+
}
220+
221+
func readUint32(file *os.File) (uint32, error) {
222+
var err error
223+
var temp [4]byte
224+
225+
_, err = file.Read(temp[:])
226+
if err != nil {
227+
log.Printf("error reading bytes: %s", err)
228+
return 0, err
229+
}
230+
231+
return binary.LittleEndian.Uint32(temp[:]), nil
232+
}
233+
234+
func readBool(file *os.File) (bool, error) {
235+
byteAsInt, err := readUint8(file)
236+
if err != nil {
237+
log.Printf("error loading Uint8: %s", err)
238+
return false, err
239+
}
240+
241+
return byteAsInt != 0, nil
242+
}
243+
244+
func readVersion16(file *os.File) (version16, error) {
245+
var Version version16
246+
var VersionShort versionShort16
247+
var err error
248+
249+
VersionShort, err = readVersionShort16(file)
250+
if err != nil {
251+
log.Printf("error reading VersionShort")
252+
return Version, err
253+
}
254+
255+
Version.Major = VersionShort.Major
256+
Version.Minor = VersionShort.Minor
257+
Version.Build = VersionShort.Build
258+
259+
Version.Revision, err = readUint16(file)
260+
if err != nil {
261+
log.Printf("error reading revision: %s", err)
262+
return Version, err
263+
}
264+
265+
return Version, nil
266+
}
267+
268+
func readVersionShort16(file *os.File) (versionShort16, error) {
269+
var Version versionShort16
270+
var err error
271+
272+
Version.Major, err = readUint16(file)
273+
if err != nil {
274+
log.Printf("error reading major: %s", err)
275+
return Version, err
276+
}
277+
278+
Version.Minor, err = readUint16(file)
279+
if err != nil {
280+
log.Printf("error reading minor: %s", err)
281+
return Version, err
282+
}
283+
284+
Version.Build, err = readUint16(file)
285+
if err != nil {
286+
log.Printf("error reading build: %s", err)
287+
return Version, err
288+
}
289+
290+
return Version, err
291+
}
292+
293+
func readVersionShort8(file *os.File) (versionShort8, error) {
294+
var Version versionShort8
295+
var err error
296+
297+
Version.Major, err = readUint8(file)
298+
if err != nil {
299+
log.Printf("error reading major: %s", err)
300+
return Version, err
301+
}
302+
303+
Version.Minor, err = readUint8(file)
304+
if err != nil {
305+
log.Printf("error reading minor: %s", err)
306+
return Version, err
307+
}
308+
309+
Version.Build, err = readUint8(file)
310+
if err != nil {
311+
log.Printf("error reading build: %s", err)
312+
return Version, err
313+
}
314+
315+
return Version, nil
316+
}
317+
318+
func readSingleMod(file *os.File) (singleMod, error) {
319+
var Mod singleMod
320+
var err error
321+
322+
Mod.Name, err = readUTF8String(file)
323+
if err != nil {
324+
log.Printf("error loading modName: %s", err)
325+
return Mod, err
326+
}
327+
328+
Mod.Version, err = readVersionShort8(file)
329+
if err != nil {
330+
log.Printf("error loading modVersion: %s", err)
331+
return Mod, err
332+
}
333+
334+
Mod.CRC, err = readUint32(file)
335+
if err != nil {
336+
log.Printf("error loading CRC: %s", err)
337+
return Mod, err
338+
}
339+
340+
return Mod, err
341+
}
342+
343+
func (Version *versionShort16) CheckCompatibility(Major uint16, Minor uint16, Build uint16) (bool) {
344+
return Major >= Version.Major && Minor >= Version.Minor && Build >= Version.Build
345+
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
import React from 'react';
2+
3+
class ModOverview extends React.Component {
4+
constructor(props) {
5+
super(props);
6+
7+
this.loadMods = this.loadMods.bind(this);
8+
}
9+
10+
componentDidMount() {
11+
//Load Saves
12+
this.props.getSaves();
13+
}
14+
15+
loadMods() {
16+
console.log("baum");
17+
}
18+
19+
render() {
20+
console.log(this.props.saves);
21+
22+
let saves = [];
23+
this.props.saves.forEach((value, index) => {
24+
if(index != this.props.saves.length - 1) {
25+
saves.push(
26+
<option key={index} value={value.name}>
27+
{value.name}
28+
</option>
29+
)
30+
}
31+
});
32+
33+
return (
34+
<div className="box-body">
35+
<div className="input-group">
36+
<select className="custom-select form-control" id="inputGroupSelect04">
37+
{saves}
38+
</select>
39+
<div className="input-group-append">
40+
<button className="btn btn-outline-secondary" type="button" onClick={this.loadMods}>Load Mods</button>
41+
</div>
42+
</div>
43+
</div>
44+
)
45+
}
46+
}
47+
48+
export default ModOverview;

0 commit comments

Comments
 (0)