wxrcg 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. data/.gitignore +1 -0
  2. data/Rakefile +4 -27
  3. data/VERSION +1 -1
  4. data/bin/wxrcg +20 -0
  5. data/db/csv/characters.csv +4 -0
  6. data/db/csv/weapon_special_qualities_weapons.csv +8 -0
  7. data/db/csv/weapons.csv +21 -0
  8. data/db/development.sqlite +0 -0
  9. data/db/migrate/2009101820235900_create_weapon_special_qualities_weapons.rb +21 -0
  10. data/db/migrate/2009101820235901_create_characters.rb +27 -0
  11. data/db/migrate/2009101820235902_create_weapons.rb +21 -0
  12. data/db/migrate/2009101820235903_create_critical.rb +19 -0
  13. data/db/migrate/2009101820235904_create_encumbrance_type.rb +16 -0
  14. data/db/migrate/2009101820235905_create_categories.rb +18 -0
  15. data/db/migrate/2009101820235906_create_training_type.rb +15 -0
  16. data/db/migrate/2009101820235908_create_damage.rb +28 -0
  17. data/db/migrate/2009101820235909_create_damage_type.rb +21 -0
  18. data/db/migrate/2009101820235911_create_races.rb +26 -0
  19. data/db/migrate/2009101820235912_create_armours.rb +23 -0
  20. data/db/migrate/20091021094104_create_class_levels.rb +21 -0
  21. data/db/migrate/20091024124832_create_sizes.rb +21 -0
  22. data/db/migrate/20091025152901_add_characters_class_levels.rb +12 -0
  23. data/db/populate/90011024124832_populate_weapons.rb +37 -0
  24. data/db/populate/90091024173652_populate_characters.rb +31 -0
  25. data/db/populate/90091028112137_populate_class_levels.rb +46 -0
  26. data/lib/annotate_models.rb +139 -0
  27. data/lib/initdb.rb +45 -19
  28. data/lib/models/armour.rb +18 -0
  29. data/lib/models/category.rb +11 -0
  30. data/lib/models/character.rb +39 -3
  31. data/lib/models/class_level.rb +18 -0
  32. data/lib/models/class_level_special_quality.rb +2 -0
  33. data/lib/models/critical.rb +10 -0
  34. data/lib/models/damage.rb +10 -0
  35. data/lib/models/damage_type.rb +10 -0
  36. data/lib/models/encumbrance_type.rb +9 -0
  37. data/lib/models/race.rb +16 -0
  38. data/lib/models/size.rb +11 -0
  39. data/lib/models/training_type.rb +9 -0
  40. data/lib/models/weapon.rb +20 -1
  41. data/lib/models/weapon_special_quality.rb +9 -0
  42. data/lib/views/level_frame.rb +87 -0
  43. data/lib/views/weapon_screen_frame.rb +1 -1
  44. data/tasks/annotate_models_tasks.rake +6 -0
  45. data/tasks/databases.rake +48 -0
  46. data/tasks/documentation.rake +11 -0
  47. data/tasks/gemcutter.rake +18 -0
  48. data/tasks/unit_tests.rake +8 -0
  49. data/tests/class_level_test.rb +8 -0
  50. metadata +35 -15
  51. data/db/development.sqlite3 +0 -0
  52. data/db/sqlite scripts/create_armours.sql +0 -16
  53. data/db/sqlite scripts/create_categories.sql +0 -10
  54. data/db/sqlite scripts/create_characters.sql +0 -21
  55. data/db/sqlite scripts/create_races.sql +0 -9
  56. data/db/sqlite scripts/create_weapons.sql +0 -16
  57. data/db/sqlite scripts/critical.sql +0 -12
  58. data/db/sqlite scripts/damage.sql +0 -21
  59. data/db/sqlite scripts/damage_type.sql +0 -15
  60. data/db/sqlite scripts/encumbrance_type.sql +0 -10
  61. data/db/sqlite scripts/training_type.sql +0 -8
  62. data/db/sqlite scripts/weapon_special_qualities_weapons.sql +0 -17
  63. data/lib/character.old.rb +0 -72
@@ -0,0 +1,31 @@
1
+ class PopulateCharacters < ActiveRecord::Migration
2
+ def self.up
3
+ self.down
4
+ source = File.join(WXRCG_ROOT,"db","csv","characters.csv")
5
+ puts "Populating Characters"
6
+ CSV.foreach(source, headers: true) do |row|
7
+ values = {
8
+ :name=>row[1],
9
+ :race_id=>row[2],
10
+ :armour_id=>row[3],
11
+ :weapon_id=>row[4],
12
+ :size_id=>row[5],
13
+ :str=>row[6],
14
+ :dex=>row[7],
15
+ :con=>row[8],
16
+ :int=>row[9],
17
+ :wis=>row[10],
18
+ :cha=>row[11],
19
+ :floating_race_mod=>row[12],
20
+ :hp=>row[13],
21
+ :bab=>row[14]
22
+ }
23
+ Character.create(values)
24
+
25
+ end
26
+ end
27
+
28
+ def self.down
29
+ Character.destroy_all
30
+ end
31
+ end
@@ -0,0 +1,46 @@
1
+ class PopulateClassLevels < ActiveRecord::Migration
2
+ def self.up
3
+ self.down
4
+ classes = [
5
+ {:class_name=>"Barbarian",:bab_fact=>0,:fort_fact=>"Good",:ref_fact=>"Poor",:will_fact=>"Poor"},
6
+ {:class_name=>"Bard",:bab_fact=>0.75,:fort_fact=>"Poor",:ref_fact=>"Good",:will_fact=>"Good"},
7
+ {:class_name=>"Cleric",:bab_fact=>0.75,:fort_fact=>"Good",:ref_fact=>"Poor",:will_fact=>"Good"},
8
+ {:class_name=>"Druid",:bab_fact=>0.75,:fort_fact=>"Good",:ref_fact=>"Poor",:will_fact=>"Good"},
9
+ {:class_name=>"Fighter",:bab_fact=>0,:fort_fact=>"Good",:ref_fact=>"Poor",:will_fact=>"Poor"},
10
+ {:class_name=>"Monk",:bab_fact=>0.75,:fort_fact=>"Good",:ref_fact=>"Good",:will_fact=>"Good"},
11
+ {:class_name=>"Paladin",:bab_fact=>0,:fort_fact=>"Good",:ref_fact=>"Poor",:will_fact=>"Good"},
12
+ {:class_name=>"Ranger",:bab_fact=>0,:fort_fact=>"Good",:ref_fact=>"Good",:will_fact=>"Poor"},
13
+ {:class_name=>"Rogue",:bab_fact=>0.75,:fort_fact=>"Poor",:ref_fact=>"Good",:will_fact=>"Poor"},
14
+ {:class_name=>"Sorcerer",:bab_fact=>0.5,:fort_fact=>"Poor",:ref_fact=>"Poor",:will_fact=>"Good"},
15
+ {:class_name=>"Wizard",:bab_fact=>0.5,:fort_fact=>"Poor",:ref_fact=>"Poor",:will_fact=>"Good"}
16
+ ]
17
+
18
+ classes.each do |c|
19
+ 1.upto(20) do |i|
20
+ puts c.to_s
21
+ ClassLevel.create(
22
+ :level=>i,
23
+ :class_name=> c[:class_name],
24
+ :bab=> self.progression(i,c[:bab_fact]),
25
+ :fort=> self.save(i,c[:fort_fact]),
26
+ :ref=> self.save(i,c[:ref_fact]),
27
+ :will=> self.save(i,c[:will_fact])
28
+ )
29
+ end
30
+ end
31
+ end
32
+
33
+ def self.down
34
+ end
35
+
36
+ def self.progression(level,factor)
37
+ factor==0 ? x = level : x = (level*factor).floor.to_i
38
+ end
39
+
40
+ def self.save(level,quality)
41
+ case quality
42
+ when "Good" then x = 2 + (level/2).floor
43
+ when "Poor" then x = (level/3).floor
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,139 @@
1
+ require File.join(File.dirname(__FILE__), 'initdb')
2
+
3
+ MODEL_DIR = File.join(WXRCG_ROOT,"lib","models")
4
+ FIXTURE_DIR = File.join(WXRCG_ROOT, "test/fixtures")
5
+ RSPEC_DIR = File.join(WXRCG_ROOT, "spec/models")
6
+ RSPEC_FIXTURES = File.join(WXRCG_ROOT, "spec/fixtures")
7
+
8
+ module AnnotateModels
9
+
10
+ PREFIX = "== Schema Information"
11
+
12
+ # Simple quoting for the default column value
13
+ def self.quote(value)
14
+ case value
15
+ when NilClass then "NULL"
16
+ when TrueClass then "TRUE"
17
+ when FalseClass then "FALSE"
18
+ when Float, Fixnum, Bignum then value.to_s
19
+ # BigDecimals need to be output in a non-normalized form and quoted.
20
+ when BigDecimal then value.to_s('F')
21
+ else
22
+ value.inspect
23
+ end
24
+ end
25
+
26
+ # Use the column information in an ActiveRecord class
27
+ # to create a comment block containing a line for
28
+ # each column. The line contains the column name,
29
+ # the type (and length), and any optional attributes
30
+ def self.get_schema_info(klass, header)
31
+ info = "# #{header}\n#\n"
32
+ info << "# Table name: #{klass.table_name}\n#\n"
33
+
34
+ max_size = klass.column_names.collect{|name| name.size}.max + 1
35
+ klass.columns.each do |col|
36
+ attrs = []
37
+ attrs << "default(#{quote(col.default)})" if col.default
38
+ attrs << "not null" unless col.null
39
+ attrs << "primary key" if col.name == klass.primary_key
40
+
41
+ col_type = col.type.to_s
42
+ if col_type == "decimal"
43
+ col_type << "(#{col.precision}, #{col.scale})"
44
+ else
45
+ col_type << "(#{col.limit})" if col.limit
46
+ end
47
+ info << sprintf("# %-#{max_size}.#{max_size}s:%-15.15s %s", col.name, col_type, attrs.join(", ")).rstrip
48
+ info << "\n"
49
+ end
50
+
51
+ info << "#\n\n"
52
+ end
53
+
54
+ # Add a schema block to a file. If the file already contains
55
+ # a schema info block (a comment starting
56
+ # with "Schema as of ..."), remove it first.
57
+
58
+ def self.annotate_one_file(file_name, info_block)
59
+ if File.exist?(file_name)
60
+ content = File.read(file_name)
61
+
62
+ # Remove old schema info
63
+ content.sub!(/^# #{PREFIX}.*?\n(#.*\n)*\n/, '')
64
+
65
+ # Write it back
66
+ File.open(file_name, "w") { |f| f.puts info_block + content }
67
+ end
68
+ end
69
+
70
+ # Given the name of an ActiveRecord class, create a schema
71
+ # info block (basically a comment containing information
72
+ # on the columns and their types) and put it at the front
73
+ # of the model and fixture source files.
74
+
75
+ def self.annotate(klass, header)
76
+ info = get_schema_info(klass, header)
77
+
78
+ model_file_name = File.join(MODEL_DIR, klass.name.underscore + ".rb")
79
+ annotate_one_file(model_file_name, info)
80
+
81
+ if File.join(WXRCG_ROOT, "spec")
82
+ rspec_file_name = File.join(RSPEC_DIR, klass.name.underscore + "_spec.rb")
83
+ annotate_one_file(rspec_file_name, info)
84
+
85
+ rspec_fixture = File.join(RSPEC_FIXTURES, klass.table_name + ".yml")
86
+ annotate_one_file(rspec_fixture, info)
87
+ end
88
+
89
+ Dir.glob(File.join(FIXTURE_DIR, "**", klass.table_name + ".yml")) do | fixture_file_name |
90
+ annotate_one_file(fixture_file_name, info)
91
+ end
92
+ end
93
+
94
+ # Return a list of the model files to annotate. If we have
95
+ # command line arguments, they're assumed to be either
96
+ # the underscore or CamelCase versions of model names.
97
+ # Otherwise we take all the model files in the
98
+ # app/models directory.
99
+ def self.get_model_names
100
+ models = ARGV.dup
101
+ models.shift
102
+
103
+ if models.empty?
104
+ Dir.chdir(MODEL_DIR) do
105
+ models = Dir["**/*.rb"]
106
+ end
107
+ end
108
+ models
109
+ end
110
+
111
+ # We're passed a name of things that might be
112
+ # ActiveRecord models. If we can find the class, and
113
+ # if its a subclass of ActiveRecord::Base,
114
+ # then pas it to the associated block
115
+
116
+ def self.do_annotations
117
+ header = PREFIX.dup
118
+ version = ActiveRecord::Migrator.current_version rescue 0
119
+ if version > 0
120
+ header << "\n# Schema version: #{version}"
121
+ end
122
+
123
+ self.get_model_names.each do |m|
124
+ class_name = m.sub(/\.rb$/,'').camelize
125
+ begin
126
+ klass = class_name.split('::').inject(Object){ |klass,part| klass.const_get(part) }
127
+ if klass < ActiveRecord::Base && !klass.abstract_class?
128
+ puts "Annotating #{class_name}"
129
+ self.annotate(klass, header)
130
+ else
131
+ puts "Skipping #{class_name}"
132
+ end
133
+ rescue Exception => e
134
+ puts "Unable to annotate #{class_name}: #{e.message}"
135
+ end
136
+
137
+ end
138
+ end
139
+ end
@@ -3,25 +3,51 @@ require 'activerecord'
3
3
  require 'yaml'
4
4
  require 'fileutils'
5
5
 
6
- dir = File.dirname(__FILE__)
7
- dbconfig = YAML::load(File.open(File.join(dir,'..','config','database.yml')))
8
- if ENV["APDATA"] then
9
- datpath = File.join(ENV["APDATA"], '.wxrcg')
10
- else
11
- if ENV["HOME"] then
12
- datpath = File.join(ENV["HOME"], '.wxrcg')
13
- else
14
- puts "No place to put the database, arrggh!"
6
+ ENV["WXRCG_ENV"] = "DEVELOPMENT" unless ENV["WXRCG_ENV"]
7
+ WXRCG_ROOT = File.join(File.dirname(__FILE__),"..") unless defined?(WXRCG_ROOT)
8
+
9
+ # Set up the databases, depending on the OS and Development level
10
+ class Init
11
+ def self.config
12
+ dbconfig = YAML::load(File.open(File.join(WXRCG_ROOT,'config','database.yml')))
13
+ create_datpath unless Dir.exists?(datpath)
14
+ dbpath = File.join(datpath, 'db', dbconfig[env]["database"])
15
+ dbconfig[env]["database"] = dbpath
16
+ return dbconfig
17
+ end
18
+
19
+ def self.run
20
+ dbconfig = self.config
21
+ ActiveRecord::Base.establish_connection(dbconfig[env])
22
+ ActiveRecord::Base.logger = Logger.new(File.join(datpath,'log','development.log')) unless env == :production
23
+ end
24
+
25
+ def self.datpath
26
+ if ENV["APDATA"] then
27
+ dp = File.join(ENV["APDATA"], '.wxrcg')
28
+ else
29
+ if ENV["HOME"] then
30
+ dp = File.join(ENV["HOME"], '.wxrcg')
31
+ else
32
+ puts "No place to put the database, arrggh!"
33
+ end
34
+ end
35
+ end
36
+
37
+ def self.env
38
+ case ENV["WXRCG_ENV"]
39
+ when "DEVELOPMENT" then "development"
40
+ when "PRODUCTION" then "production"
41
+ when "TESTING" then "testing"
42
+ end
43
+ end
44
+
45
+ def self.create_datpath
46
+ $dir.mkdir(datpath)
47
+ $dir.mkdir(File.join(datpath, "db"))
48
+ $dir.mkdir(File.join(datpath, "log"))
49
+ File.copy_stream(File.join(WXRCG_ROOT,'db',dbconfig["development"]["database"]),File.join(datpath, "db",dbconfig["development"]["database"]))
15
50
  end
16
51
  end
17
- if !Dir.exists?(datpath) then
18
- Dir.mkdir(datpath)
19
- Dir.mkdir(File.join(datpath, "db"))
20
- Dir.mkdir(File.join(datpath, "log"))
21
- File.copy_stream(File.join(dir,'..','db',dbconfig["development"]["database"]),File.join(datpath, "db",dbconfig["development"]["database"]))
22
- end
23
- dbpath = File.join(datpath, 'db', dbconfig["development"]["database"])
24
- dbconfig["development"]["database"] = dbpath
25
52
 
26
- ActiveRecord::Base.establish_connection(dbconfig["development"])
27
- ActiveRecord::Base.logger = Logger.new(File.join(datpath,'log','development.log'))
53
+ Init.run
@@ -1,3 +1,21 @@
1
+ # == Schema Information
2
+ # Schema version: 2009101820235913
3
+ #
4
+ # Table name: armours
5
+ #
6
+ # id :integer not null, primary key
7
+ # name :string(255)
8
+ # category_id :integer
9
+ # cost :integer
10
+ # bonus :integer
11
+ # max_dex :integer
12
+ # check_pen :integer
13
+ # spell_fail :integer
14
+ # speed_30 :integer
15
+ # speed_20 :integer
16
+ # weight :integer
17
+ #
18
+
1
19
  class Armour < ActiveRecord::Base
2
20
  belongs_to :character
3
21
  end
@@ -0,0 +1,11 @@
1
+ # == Schema Information
2
+ # Schema version: 2009101820235913
3
+ #
4
+ # Table name: categories
5
+ #
6
+ # id :integer not null, primary key
7
+ # name :string(255)
8
+ #
9
+
10
+ class Category <ActiveRecord::Base
11
+ end
@@ -1,3 +1,25 @@
1
+ # == Schema Information
2
+ # Schema version: 2009101820235913
3
+ #
4
+ # Table name: characters
5
+ #
6
+ # id :integer not null, primary key
7
+ # name :string(255) not null
8
+ # race_id :integer
9
+ # armour_id :integer
10
+ # weapon_id :integer
11
+ # size_id :integer
12
+ # str :integer
13
+ # dex :integer
14
+ # con :integer
15
+ # int :integer
16
+ # wis :integer
17
+ # cha :integer
18
+ # floating_race_mod :string(255)
19
+ # hp :integer
20
+ # bab :integer
21
+ #
22
+
1
23
  root = File.dirname(__FILE__)
2
24
  require File.join(root, "race.rb")
3
25
  require File.join(root, "armour.rb")
@@ -7,6 +29,7 @@ class Character < ActiveRecord::Base
7
29
  belongs_to :race
8
30
  belongs_to :armour
9
31
  belongs_to :weapon
32
+ has_and_belongs_to_many :class_levels
10
33
 
11
34
  def after_initialize
12
35
  self.str ||= 10
@@ -19,7 +42,7 @@ class Character < ActiveRecord::Base
19
42
 
20
43
  def stat(stat)
21
44
  if self.race != nil then
22
- s = eval(stat) + eval("@race.#{stat}_mod")
45
+ s = eval(stat).to_i + eval("@race.#{stat}_mod")
23
46
  else
24
47
  s = eval(stat)
25
48
  end
@@ -95,7 +118,7 @@ class Character < ActiveRecord::Base
95
118
  end
96
119
 
97
120
  def ac
98
- ac = 10 + mod(:dex) + armour.bonus
121
+ ac = 10 + mod(:dex) + armour.bonus unless armour.bonus == nil
99
122
  end
100
123
 
101
124
  def touch
@@ -103,7 +126,7 @@ class Character < ActiveRecord::Base
103
126
  end
104
127
 
105
128
  def ff
106
- ff = 10 + armour.bonus
129
+ ff = 10 + armour.bonus unless armour.bonus == nil
107
130
  end
108
131
 
109
132
  def init
@@ -117,4 +140,17 @@ class Character < ActiveRecord::Base
117
140
  am = bab + mod(:str)
118
141
  end
119
142
  end
143
+
144
+ def levels
145
+ l = ""
146
+ class_levels.find(:all, :group=>"class_name").each do |cl|
147
+ l << cl.class_name << " "
148
+ l << class_levels.count(:conditions=>["class_name = ?",cl.class_name]).to_s << "/ "
149
+ end
150
+ l != "" ? l.chomp!("/ ") : l = ""
151
+ end
152
+
153
+ def levels_in(level)
154
+ n = class_levels.count(:conditions=>["class_name = ?", level])
155
+ end
120
156
  end
@@ -0,0 +1,18 @@
1
+ # == Schema Information
2
+ # Schema version: 2009101820235913
3
+ #
4
+ # Table name: class_levels
5
+ #
6
+ # id :integer not null, primary key
7
+ # character_id :integer
8
+ # bab :integer
9
+ # fort :integer
10
+ # ref :integer
11
+ # will :integer
12
+ # created_at :datetime
13
+ # updated_at :datetime
14
+ #
15
+
16
+ class ClassLevel < ActiveRecord::Base
17
+ has_and_belongs_to_many :characters
18
+ end
@@ -0,0 +1,2 @@
1
+ class ClassLevelSpecialQuality < ActiveRecord::Base
2
+ end
@@ -1,3 +1,13 @@
1
+ # == Schema Information
2
+ # Schema version: 2009101820235913
3
+ #
4
+ # Table name: criticals
5
+ #
6
+ # id :integer not null, primary key
7
+ # range :string(255)
8
+ # multiplier :integer
9
+ #
10
+
1
11
  class Critical < ActiveRecord::Base
2
12
  has_many :weapons
3
13
 
@@ -1,3 +1,13 @@
1
+ # == Schema Information
2
+ # Schema version: 2009101820235913
3
+ #
4
+ # Table name: damages
5
+ #
6
+ # id :integer not null, primary key
7
+ # no :integer
8
+ # sides :integer
9
+ #
10
+
1
11
  class Damage < ActiveRecord::Base
2
12
  has_many :weapons
3
13