galaxy 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. data/.document +5 -0
  2. data/.gitignore +21 -0
  3. data/.idea/.rakeTasks +7 -0
  4. data/.idea/encodings.xml +5 -0
  5. data/.idea/galaxy.iml +10 -0
  6. data/.idea/misc.xml +14 -0
  7. data/.idea/modules.xml +9 -0
  8. data/.idea/vcs.xml +8 -0
  9. data/.idea/workspace.xml +486 -0
  10. data/LICENSE +20 -0
  11. data/README.rdoc +36 -0
  12. data/Rakefile +62 -0
  13. data/VERSION +1 -0
  14. data/doc/plan.txt +5 -0
  15. data/doc/pseudo.txt +43 -0
  16. data/features/galaxy.feature +9 -0
  17. data/features/step_definitions/galaxy_steps.rb +0 -0
  18. data/features/support/env.rb +4 -0
  19. data/galaxy.gemspec +95 -0
  20. data/galaxy/.loadpath +5 -0
  21. data/galaxy/.project +17 -0
  22. data/galaxy/.settings/org.eclipse.mylyn.tasks.ui.prefs +4 -0
  23. data/galaxy/.settings/org.eclipse.wst.sse.core.prefs +5 -0
  24. data/galaxy/experiments.rb +26 -0
  25. data/lib/galaxy.rb +8 -0
  26. data/lib/galaxy/models/bombing.rb +64 -0
  27. data/lib/galaxy/models/fleet.rb +62 -0
  28. data/lib/galaxy/models/group.rb +178 -0
  29. data/lib/galaxy/models/models.rb +16 -0
  30. data/lib/galaxy/models/planet.rb +181 -0
  31. data/lib/galaxy/models/product.rb +84 -0
  32. data/lib/galaxy/models/race.rb +112 -0
  33. data/lib/galaxy/models/route.rb +60 -0
  34. data/lib/galaxy/order.rb +24 -0
  35. data/lib/galaxy/report.rb +176 -0
  36. data/lib/galaxy/section.rb +226 -0
  37. data/lib/galaxy/utils.rb +109 -0
  38. data/lib/galaxy/virtual_base.rb +165 -0
  39. data/spec/spec_helper.rb +9 -0
  40. data/test/test_helper.rb +4 -0
  41. data/test/unit/models_test.rb +1469 -0
  42. data/test/unit/report_test.rb +187 -0
  43. data/test/unit/utils_test.rb +421 -0
  44. data/test/unit/virtual_base_test.rb +224 -0
  45. metadata +123 -0
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 arvicco
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,36 @@
1
+ = win
2
+
3
+ by: Arvicco
4
+ url: http://github.com/arvicco/win
5
+
6
+ == DESCRIPTION
7
+
8
+ Report parser and scripting tool for Galaxy Plus.
9
+
10
+ == SUMMARY
11
+
12
+ Galaxy Plus is a play-by-email (PBEM) game that was very popular some time ago.
13
+ This code allows you to parse Galaxy Plus / Dragon Galaxy report files and builds
14
+ ActiveRecord models for its data artifacts. you can further use these artifacts to
15
+ build automation scripts and whatnot. I have used this tool to efficiently manage
16
+ even such monstrous game format as 'research', with literally thousands of planets
17
+ and tens of thousands ship groups to take care of each turn.
18
+
19
+ This gem does not include specific automation add-ons (mine were too specific and
20
+ tightly integrated into external scripting frameworks). However, you can easily build
21
+ such scripts on top of data models provided here.
22
+
23
+ Since I do not play Galaxy Plus any longer, no further development of this code is
24
+ expected from my side, so I release it into public domain for anyone to use and enjoy.
25
+
26
+ == INSTALLATION
27
+
28
+ $ gem install galaxy
29
+
30
+ == SYNOPSIS
31
+
32
+ Please see tests for proper examples of usage.
33
+
34
+ == Copyright
35
+
36
+ Copyright (c) 2004-2010 arvicco. See LICENSE for details.
@@ -0,0 +1,62 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+
4
+ begin
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ gem.name = "galaxy"
8
+ gem.summary = %Q{Report parser for Galaxy Plus PBEM}
9
+ gem.description = %Q{Report parser for Galaxy Plus PBEM}
10
+ gem.email = "arvitallian@gmail.com"
11
+ gem.homepage = "http://github.com/arvicco/galaxy"
12
+ gem.authors = ["arvicco"]
13
+ gem.add_development_dependency "rspec", ">= 1.2.9"
14
+ gem.add_development_dependency "cucumber", ">= 0"
15
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
+ end
17
+ Jeweler::GemcutterTasks.new
18
+ rescue LoadError
19
+ puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
20
+ end
21
+
22
+ require 'spec/rake/spectask'
23
+ Spec::Rake::SpecTask.new(:test) do |t|
24
+ t.ruby_opts = ['-r test/unit' ]
25
+ t.spec_files = FileList['test/unit/*_test.rb' ]
26
+ end
27
+
28
+ Spec::Rake::SpecTask.new(:spec) do |spec|
29
+ spec.libs << 'lib' << 'spec'
30
+ spec.spec_files = FileList['spec/**/*_spec.rb']
31
+ end
32
+
33
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
34
+ spec.libs << 'lib' << 'spec'
35
+ spec.pattern = 'spec/**/*_spec.rb'
36
+ spec.rcov = true
37
+ end
38
+
39
+ task :spec => :check_dependencies
40
+
41
+ begin
42
+ require 'cucumber/rake/task'
43
+ Cucumber::Rake::Task.new(:features)
44
+
45
+ task :features => :check_dependencies
46
+ rescue LoadError
47
+ task :features do
48
+ abort "Cucumber is not available. In order to run features, you must: sudo gem install cucumber"
49
+ end
50
+ end
51
+
52
+ task :default => :spec
53
+
54
+ require 'rake/rdoctask'
55
+ Rake::RDocTask.new do |rdoc|
56
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
57
+
58
+ rdoc.rdoc_dir = 'rdoc'
59
+ rdoc.title = "galaxy #{version}"
60
+ rdoc.rdoc_files.include('README*')
61
+ rdoc.rdoc_files.include('lib/**/*.rb')
62
+ end
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.2
@@ -0,0 +1,5 @@
1
+ 1. Groups conversion to AR:Base
2
+ 2. Moving record handling procs into init methods of Models
3
+ 3. Creating db connector-like interface for gamedata arrays
4
+
5
+
@@ -0,0 +1,43 @@
1
+ #readfile
2
+
3
+ #find begin/end of Races section
4
+ #scan races (simple, no recursion)
5
+
6
+ #find begin/end of Sciences section
7
+ #for each race in the section
8
+ #scan sciences
9
+
10
+ #find begin/end of Ship Types section
11
+ #for each race in the section
12
+ #scan ship types
13
+
14
+ #find begin/end of Battles section
15
+ #for each battle in the section
16
+ #find begin/end of battle ( .."Battle Protocol")
17
+ #for each race in the battle
18
+ #scan ship list
19
+
20
+ #find begin/end of Bombings section
21
+ #scan bombings (simple, no recursion)
22
+
23
+ #find begin/end of Incoming Groups section
24
+ #scan incomings (simple, no recursion)
25
+
26
+ #find begin/end of Planets section
27
+ #scan your planets
28
+ #scan your ships_in_production?
29
+ #scan routes?
30
+ #for each race in the section
31
+ #scan planets
32
+ #scan Uninhabited planets
33
+ #scan Unidentified planets
34
+
35
+ #find begin/end of Fleets section
36
+ #scan your fleets (simple, no recursion)
37
+
38
+ #find begin/end of Groups section
39
+ #scan your groups (with numbers)
40
+ #for each race in the section
41
+ #scan groups
42
+ #scan Unidentified groups
43
+
@@ -0,0 +1,9 @@
1
+ Feature: something something
2
+ In order to something something
3
+ A user something something
4
+ something something something
5
+
6
+ Scenario: something something
7
+ Given inspiration
8
+ When I create a sweet new gem
9
+ Then everyone should see how awesome I am
@@ -0,0 +1,4 @@
1
+ $LOAD_PATH.unshift(File.dirname(__FILE__) + '/../../lib')
2
+ require 'galaxy'
3
+
4
+ require 'spec/expectations'
@@ -0,0 +1,95 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in rakefile, and run the gemspec command
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = %q{galaxy}
8
+ s.version = "0.0.2"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["arvicco"]
12
+ s.date = %q{2010-03-11}
13
+ s.description = %q{Report parser for Galaxy Plus PBEM}
14
+ s.email = %q{arvitallian@gmail.com}
15
+ s.extra_rdoc_files = [
16
+ "LICENSE",
17
+ "README.rdoc"
18
+ ]
19
+ s.files = [
20
+ ".document",
21
+ ".gitignore",
22
+ ".idea/.rakeTasks",
23
+ ".idea/encodings.xml",
24
+ ".idea/galaxy.iml",
25
+ ".idea/misc.xml",
26
+ ".idea/modules.xml",
27
+ ".idea/vcs.xml",
28
+ ".idea/workspace.xml",
29
+ "LICENSE",
30
+ "README.rdoc",
31
+ "Rakefile",
32
+ "VERSION",
33
+ "doc/plan.txt",
34
+ "doc/pseudo.txt",
35
+ "features/galaxy.feature",
36
+ "features/step_definitions/galaxy_steps.rb",
37
+ "features/support/env.rb",
38
+ "galaxy.gemspec",
39
+ "galaxy/.loadpath",
40
+ "galaxy/.project",
41
+ "galaxy/.settings/org.eclipse.mylyn.tasks.ui.prefs",
42
+ "galaxy/.settings/org.eclipse.wst.sse.core.prefs",
43
+ "galaxy/experiments.rb",
44
+ "lib/galaxy.rb",
45
+ "lib/galaxy/models/bombing.rb",
46
+ "lib/galaxy/models/fleet.rb",
47
+ "lib/galaxy/models/group.rb",
48
+ "lib/galaxy/models/models.rb",
49
+ "lib/galaxy/models/planet.rb",
50
+ "lib/galaxy/models/product.rb",
51
+ "lib/galaxy/models/race.rb",
52
+ "lib/galaxy/models/route.rb",
53
+ "lib/galaxy/order.rb",
54
+ "lib/galaxy/report.rb",
55
+ "lib/galaxy/section.rb",
56
+ "lib/galaxy/utils.rb",
57
+ "lib/galaxy/virtual_base.rb",
58
+ "spec/spec_helper.rb",
59
+ "test/test_helper.rb",
60
+ "test/unit/models_test.rb",
61
+ "test/unit/report_test.rb",
62
+ "test/unit/utils_test.rb",
63
+ "test/unit/virtual_base_test.rb"
64
+ ]
65
+ s.homepage = %q{http://github.com/arvicco/galaxy}
66
+ s.rdoc_options = ["--charset=UTF-8"]
67
+ s.require_paths = ["lib"]
68
+ s.rubygems_version = %q{1.3.5}
69
+ s.summary = %q{Report parser for Galaxy Plus PBEM}
70
+ s.test_files = [
71
+ "spec/spec_helper.rb",
72
+ "test/test_helper.rb",
73
+ "test/unit/models_test.rb",
74
+ "test/unit/report_test.rb",
75
+ "test/unit/utils_test.rb",
76
+ "test/unit/virtual_base_test.rb"
77
+ ]
78
+
79
+ if s.respond_to? :specification_version then
80
+ current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
81
+ s.specification_version = 3
82
+
83
+ if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
84
+ s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
85
+ s.add_development_dependency(%q<cucumber>, [">= 0"])
86
+ else
87
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
88
+ s.add_dependency(%q<cucumber>, [">= 0"])
89
+ end
90
+ else
91
+ s.add_dependency(%q<rspec>, [">= 1.2.9"])
92
+ s.add_dependency(%q<cucumber>, [">= 0"])
93
+ end
94
+ end
95
+
@@ -0,0 +1,5 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <loadpath>
3
+ <pathentry path="" type="src"/>
4
+ <pathentry path="org.rubypeople.rdt.launching.RUBY_CONTAINER" type="con"/>
5
+ </loadpath>
@@ -0,0 +1,17 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <projectDescription>
3
+ <name>galaxy</name>
4
+ <comment></comment>
5
+ <projects>
6
+ </projects>
7
+ <buildSpec>
8
+ <buildCommand>
9
+ <name>org.rubypeople.rdt.core.rubybuilder</name>
10
+ <arguments>
11
+ </arguments>
12
+ </buildCommand>
13
+ </buildSpec>
14
+ <natures>
15
+ <nature>org.rubypeople.rdt.core.rubynature</nature>
16
+ </natures>
17
+ </projectDescription>
@@ -0,0 +1,4 @@
1
+ #Wed Feb 11 15:05:31 MSK 2009
2
+ eclipse.preferences.version=1
3
+ project.repository.kind=local
4
+ project.repository.url=local
@@ -0,0 +1,5 @@
1
+ #Wed Feb 11 15:01:46 MSK 2009
2
+ eclipse.preferences.version=1
3
+ task-tags/taskPriorities=1,2,1,2
4
+ task-tags/taskTags=TODO,FIXME,XXX,ERROR
5
+ task-tags/use-project-settings=true
@@ -0,0 +1,26 @@
1
+ #require 'models.rb'
2
+ require 'report.rb'
3
+ #Default_footer = 'default'
4
+ @name = 'Bombings'
5
+ @footer = 'Pre-value'
6
+ @footer = @footer || Regexen.const_get('rDefault_footer') rescue 'Fuck!' #if Regexen.const_defined?(:Default_footer) then Regexen.const_get(:Default_footer) end
7
+
8
+ p @footer
9
+
10
+ ##Open Report
11
+ #start = Time.now
12
+ #rep = Report.new "rep/ArVit081.rep"
13
+ #
14
+ #printf "Length: #{rep.text.length} #{Time.now} Elapsed: #{Time.now-start}\n"
15
+ #
16
+ ## Parse Report (possibly many times)
17
+ #start = Time.now
18
+ #1.times do rep.parse end
19
+ #
20
+ #printf "#{Time.now} Elapsed: #{Time.now-start}\n"
21
+ #
22
+ #puts rep.status
23
+ #
24
+ #p rep.races[5], rep.sciences[5], rep.designs[5], rep.battle_groups[5], rep.bombings[0], rep.incoming_groups[0],
25
+ #rep.your_planets[5], rep.planets[145], rep.unidentified_planets[5], rep.uninhabited_planets[5],
26
+ #rep.routes[0], rep.fleets[0], rep.groups[5], rep.your_groups[5], rep.unidentified_groups[5]
@@ -0,0 +1,8 @@
1
+ # Used to auto-require all the source files located in lib/...
2
+ def self.require_libs( filename, filemask )
3
+ file = ::File.expand_path(::File.join(::File.dirname(filename), filemask.gsub(/(?<!.rb)$/,'.rb')))
4
+ require file if File.exist?(file) && !File.directory?(file)
5
+ Dir.glob(file).sort.each {|rb| require rb}
6
+ end
7
+
8
+ %W[galaxy/virtual_base galaxy/models/models galaxy/*].each {|rb| require_libs(__FILE__, rb)}
@@ -0,0 +1,64 @@
1
+ #TAG bombing.rb tasks are on
2
+ require 'galaxy/models/models'
3
+
4
+ class Bombing < ActiveRecord::Base
5
+ virtual
6
+ tableless :columns => [
7
+ [ :pop, :float ],
8
+ [ :ind, :float ],
9
+ [ :cap, :float ],
10
+ [ :mat, :float ],
11
+ [ :col, :float ],
12
+ [ :attack, :float ],
13
+ [ :status, :string ]
14
+ ]
15
+
16
+ belongs_to :planet
17
+ belongs_to :product #special syntax(no _Research for sciences)!
18
+ belongs_to :race
19
+ belongs_to :victim, :class_name => "Race"
20
+
21
+ def initialize match, state
22
+ super :pop=>match[4].to_f, :ind=>match[5].to_f, :cap=>match[7].to_f, :mat=>match[8].to_f, :col=>match[9].to_f,
23
+ :attack=>match[10].to_f, :status=>match[11]
24
+
25
+ num = '#' + match[2]
26
+ unless planet = Planet.lookup(num)
27
+ args = match[3] == num ? [num] : [match[2], match[3]]
28
+ planet = Planet.new_or_update args, state.merge({:race=>nil,:product=>nil,:created_by=>self})
29
+ end
30
+ race = Race.lookup(match[0])
31
+ victim = Race.lookup(match[1])
32
+ prod_name = match[6]
33
+ product = Product.lookup(prod_name) || Product.lookup(prod_name+'_Research') || Product.lookup(victim.name + '.' + prod_name) || Product.lookup(victim.name + '.' + prod_name+'_Research')
34
+
35
+ # Add this Bombing to appropriate collections it belongs to
36
+ product.bombings << self
37
+ planet.bombings << self
38
+ race.bombings << self
39
+ victim.incoming_bombings << self
40
+ add if self.class.dataset # Add instantiated model to dataset if it is established
41
+ end
42
+
43
+ def key ; [race.name, victim.name, planet.num].join('.') end
44
+
45
+ def <=>(other)
46
+ case other
47
+ when nil then 1
48
+ when Bombing then key <=> other.key
49
+ when Planet then planet <=> other
50
+ when Product then product <=> other
51
+ when Race then victim == other ? 0 : race <=> other
52
+ when Integer then attack <=> other
53
+ when String then self <=> other.downcase.to_sym
54
+ when Symbol then
55
+ return 0 if planet == other
56
+ return 0 if product == other
57
+ return 0 if race == other
58
+ return 0 if victim == other
59
+ return 0 if status.downcase.include? other.to_s
60
+ key.downcase <=> other.to_s
61
+ else raise ArgumentError, 'Comparison with a wrong type'
62
+ end
63
+ end
64
+ end #Bombing
@@ -0,0 +1,62 @@
1
+ require 'galaxy/models/models'
2
+
3
+ class Fleet < ActiveRecord::Base
4
+ virtual
5
+ tableless :columns => [
6
+ [ :num, :integer ],
7
+ [ :name, :string ],
8
+ [ :num_groups, :integer ],
9
+ [ :range, :float ],
10
+ [ :speed, :float ],
11
+ [ :status, :string ] # May cause problems with AR?
12
+ ]
13
+ belongs_to :race
14
+ belongs_to :planet
15
+ belongs_to :from, :class_name => 'Planet'
16
+ has_many_linked :groups
17
+
18
+ def initialize match, state
19
+ super :num=>match[0].to_i, :name=>match[1], :num_groups=>match[2].to_i, :range=>match[5].to_f,
20
+ :speed=>match[6].to_f, :status=>match[7]
21
+
22
+ planet = Planet.new_or_update[match[3]], state.merge({:race=>nil,:product=>nil,:created_by=>self}) unless planet = Planet.lookup(match[3])
23
+ from = Planet.new_or_update [match[4]], state.merge({:race=>nil,:product=>nil,:created_by=>self}) unless from = Planet.lookup(match[4]) unless match[4] == '-'
24
+ race = Race.lookup(state[:owner])
25
+
26
+ planet.fleets << self
27
+ from.sent_fleets << self if from
28
+ race.fleets << self
29
+ add if self.class.dataset # Add instantiated model to dataset if it is defined
30
+ end
31
+
32
+ def eta ; from ? range/speed : 0 end
33
+
34
+ def destination ; planet end
35
+
36
+ def source ; from end
37
+ alias origin source
38
+
39
+ def key ; race.name + '.' + name end
40
+
41
+ def <=>(other)
42
+ case other
43
+ when nil then 1
44
+ when Fleet then key <=> other.key
45
+ when Race then race <=> other
46
+ when Planet then
47
+ return 0 if from and from == other
48
+ self.planet <=> other
49
+ when Group then groups.any? {|g| g == other} ? 0 : 1 # Fleet always bigger than Group
50
+ when Integer then num_groups <=> other
51
+ when String then self <=> other.downcase.to_sym
52
+ when Symbol then
53
+ return 0 if race and race == other
54
+ return 0 if planet and planet == other
55
+ return 0 if from and from == other
56
+ return 0 if status.downcase.include? other.to_s
57
+ return 0 if key.downcase.include? other.to_s
58
+ key.downcase <=> other.to_s
59
+ else raise ArgumentError, 'Comparison with a wrong type'
60
+ end
61
+ end
62
+ end #Fleet