god_of_thunder_save 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 74bde38607234354dc3556e6dba0713cde6060e56afc2d2df8e1eccbdabd86ce
4
+ data.tar.gz: 4f67dc2960aa4cb95d8d4ba42dd7b56f012bb44d447291a2f71eb33833d550f4
5
+ SHA512:
6
+ metadata.gz: 496d5f044edcc720b8d8495c01e1c18b549aa4eebe8a5d59ee327086352b834c16aabb2cffe90ba0ed7b02bb7d6daf9b3290f56d845170dc1a36ffd9d5272c2b
7
+ data.tar.gz: 35b930b2f840f901c10939c9a46fdd7f3820eef6b6688526330afed785bd3cda5f6fa46851f91facfdf5c3202a6f5adca6f1159a15d2dea44b216088f209e436
@@ -0,0 +1,33 @@
1
+ class GodOfThunderSave
2
+ class BitmaskValue
3
+ attr_reader :pos, :bitmask
4
+
5
+ def initialize(pos:, bitmask:)
6
+ @pos = pos
7
+ @bitmask = bitmask
8
+ end
9
+
10
+ def read(file)
11
+ file.seek(pos)
12
+ byte = file.readbyte
13
+
14
+ byte & bitmask > 0
15
+ end
16
+
17
+ def write(file, data)
18
+ file.seek(pos)
19
+ byte = file.readbyte
20
+
21
+ byte &= inverted_bitmask
22
+ byte += bitmask if data
23
+ byte = [byte].pack("C")
24
+
25
+ file.seek(pos)
26
+ file.write(byte)
27
+ end
28
+
29
+ def inverted_bitmask
30
+ @inverted_bitmask ||= bitmask ^ 0xff
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,36 @@
1
+ class GodOfThunderSave
2
+ class IntegerValue
3
+ INTEGER_DIRECTIVES = {
4
+ 1 => "C",
5
+ 2 => "v",
6
+ 4 => "V"
7
+ }.freeze
8
+
9
+ attr_reader :pos, :bytes
10
+
11
+ def initialize(pos:, bytes:)
12
+ @pos = pos
13
+ @bytes = bytes
14
+ end
15
+
16
+ def read(file)
17
+ file.seek(pos)
18
+
19
+ bytes_read = file.read(bytes)
20
+ bytes_read.unpack(integer_directive).first
21
+ end
22
+
23
+ def write(file, data)
24
+ bytes_write = [data].pack(integer_directive)
25
+
26
+ file.seek(pos)
27
+ file.write(bytes_write)
28
+ end
29
+
30
+ private
31
+
32
+ def integer_directive
33
+ @integer_directive ||= INTEGER_DIRECTIVES.fetch(bytes)
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,30 @@
1
+ class GodOfThunderSave
2
+ class StringValue
3
+ attr_reader :pos, :length
4
+
5
+ def initialize(pos:, length:)
6
+ @pos = pos
7
+ @length = length
8
+ end
9
+
10
+ def read(file)
11
+ file.seek(pos)
12
+ string = file.read(length)
13
+
14
+ string.strip
15
+ end
16
+
17
+ def write(file, string)
18
+ formatted_string = pad_and_truncate(string)
19
+
20
+ file.seek(pos)
21
+ file.write(formatted_string)
22
+ end
23
+
24
+ private
25
+
26
+ def pad_and_truncate(string)
27
+ string[0..length - 1].ljust(length, "\0")
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,57 @@
1
+ require "god_of_thunder_save/bitmask_value"
2
+ require "god_of_thunder_save/integer_value"
3
+ require "god_of_thunder_save/string_value"
4
+
5
+ class GodOfThunderSave
6
+ ENTRIES = {
7
+ name: StringValue.new(pos: 0, length: 22),
8
+ health: IntegerValue.new(pos: 0x63, bytes: 1),
9
+ magic: IntegerValue.new(pos: 0x64, bytes: 1),
10
+ jewels: IntegerValue.new(pos: 0x65, bytes: 2),
11
+ keys: IntegerValue.new(pos: 0x67, bytes: 1),
12
+ score: IntegerValue.new(pos: 0x70, bytes: 4),
13
+ enchanted_apple: BitmaskValue.new(pos: 0x69, bitmask: 0x01),
14
+ lightning_power: BitmaskValue.new(pos: 0x69, bitmask: 0x02),
15
+ winged_boots: BitmaskValue.new(pos: 0x69, bitmask: 0x04),
16
+ wind_power: BitmaskValue.new(pos: 0x69, bitmask: 0x08),
17
+ amulet_of_protection: BitmaskValue.new(pos: 0x69, bitmask: 0x10),
18
+ thunder_power: BitmaskValue.new(pos: 0x69, bitmask: 0x20)
19
+ }.freeze
20
+
21
+ attr_reader :path
22
+ ENTRIES.keys.each { |entry| attr_accessor entry }
23
+
24
+ def initialize(path)
25
+ @path = path
26
+
27
+ read!
28
+ end
29
+
30
+ def attributes
31
+ ENTRIES.keys.each_with_object({}) do |entry_name, hash|
32
+ hash[entry_name] = instance_variable_get(:"@#{entry_name}")
33
+ end
34
+ end
35
+
36
+ def write!
37
+ File.open(path, File::RDWR) do |file|
38
+ ENTRIES.each do |entry_name, entry|
39
+ memory_value = instance_variable_get(:"@#{entry_name}")
40
+ entry.write(file, memory_value)
41
+ end
42
+ end
43
+
44
+ self
45
+ end
46
+
47
+ def read!
48
+ File.open(path) do |file|
49
+ ENTRIES.each do |entry_name, entry|
50
+ file_value = entry.read(file)
51
+ instance_variable_set(:"@#{entry_name}", file_value)
52
+ end
53
+ end
54
+
55
+ self
56
+ end
57
+ end
metadata ADDED
@@ -0,0 +1,46 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: god_of_thunder_save
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Maxwell Pray
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-08-13 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Read and write to God of Thunder saved games as models
14
+ email: synthead@gmail.com
15
+ executables: []
16
+ extensions: []
17
+ extra_rdoc_files: []
18
+ files:
19
+ - lib/god_of_thunder_save.rb
20
+ - lib/god_of_thunder_save/bitmask_value.rb
21
+ - lib/god_of_thunder_save/integer_value.rb
22
+ - lib/god_of_thunder_save/string_value.rb
23
+ homepage: https://github.com/synthead/god_of_thunder_save
24
+ licenses:
25
+ - MIT
26
+ metadata: {}
27
+ post_install_message:
28
+ rdoc_options: []
29
+ require_paths:
30
+ - lib
31
+ required_ruby_version: !ruby/object:Gem::Requirement
32
+ requirements:
33
+ - - ">="
34
+ - !ruby/object:Gem::Version
35
+ version: '0'
36
+ required_rubygems_version: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ requirements: []
42
+ rubygems_version: 3.3.7
43
+ signing_key:
44
+ specification_version: 4
45
+ summary: God of Thunder saved game editor
46
+ test_files: []