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.
- data/.gitignore +1 -0
- data/Rakefile +4 -27
- data/VERSION +1 -1
- data/bin/wxrcg +20 -0
- data/db/csv/characters.csv +4 -0
- data/db/csv/weapon_special_qualities_weapons.csv +8 -0
- data/db/csv/weapons.csv +21 -0
- data/db/development.sqlite +0 -0
- data/db/migrate/2009101820235900_create_weapon_special_qualities_weapons.rb +21 -0
- data/db/migrate/2009101820235901_create_characters.rb +27 -0
- data/db/migrate/2009101820235902_create_weapons.rb +21 -0
- data/db/migrate/2009101820235903_create_critical.rb +19 -0
- data/db/migrate/2009101820235904_create_encumbrance_type.rb +16 -0
- data/db/migrate/2009101820235905_create_categories.rb +18 -0
- data/db/migrate/2009101820235906_create_training_type.rb +15 -0
- data/db/migrate/2009101820235908_create_damage.rb +28 -0
- data/db/migrate/2009101820235909_create_damage_type.rb +21 -0
- data/db/migrate/2009101820235911_create_races.rb +26 -0
- data/db/migrate/2009101820235912_create_armours.rb +23 -0
- data/db/migrate/20091021094104_create_class_levels.rb +21 -0
- data/db/migrate/20091024124832_create_sizes.rb +21 -0
- data/db/migrate/20091025152901_add_characters_class_levels.rb +12 -0
- data/db/populate/90011024124832_populate_weapons.rb +37 -0
- data/db/populate/90091024173652_populate_characters.rb +31 -0
- data/db/populate/90091028112137_populate_class_levels.rb +46 -0
- data/lib/annotate_models.rb +139 -0
- data/lib/initdb.rb +45 -19
- data/lib/models/armour.rb +18 -0
- data/lib/models/category.rb +11 -0
- data/lib/models/character.rb +39 -3
- data/lib/models/class_level.rb +18 -0
- data/lib/models/class_level_special_quality.rb +2 -0
- data/lib/models/critical.rb +10 -0
- data/lib/models/damage.rb +10 -0
- data/lib/models/damage_type.rb +10 -0
- data/lib/models/encumbrance_type.rb +9 -0
- data/lib/models/race.rb +16 -0
- data/lib/models/size.rb +11 -0
- data/lib/models/training_type.rb +9 -0
- data/lib/models/weapon.rb +20 -1
- data/lib/models/weapon_special_quality.rb +9 -0
- data/lib/views/level_frame.rb +87 -0
- data/lib/views/weapon_screen_frame.rb +1 -1
- data/tasks/annotate_models_tasks.rake +6 -0
- data/tasks/databases.rake +48 -0
- data/tasks/documentation.rake +11 -0
- data/tasks/gemcutter.rake +18 -0
- data/tasks/unit_tests.rake +8 -0
- data/tests/class_level_test.rb +8 -0
- metadata +35 -15
- data/db/development.sqlite3 +0 -0
- data/db/sqlite scripts/create_armours.sql +0 -16
- data/db/sqlite scripts/create_categories.sql +0 -10
- data/db/sqlite scripts/create_characters.sql +0 -21
- data/db/sqlite scripts/create_races.sql +0 -9
- data/db/sqlite scripts/create_weapons.sql +0 -16
- data/db/sqlite scripts/critical.sql +0 -12
- data/db/sqlite scripts/damage.sql +0 -21
- data/db/sqlite scripts/damage_type.sql +0 -15
- data/db/sqlite scripts/encumbrance_type.sql +0 -10
- data/db/sqlite scripts/training_type.sql +0 -8
- data/db/sqlite scripts/weapon_special_qualities_weapons.sql +0 -17
- 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
|
data/lib/initdb.rb
CHANGED
@@ -3,25 +3,51 @@ require 'activerecord'
|
|
3
3
|
require 'yaml'
|
4
4
|
require 'fileutils'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
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
|
-
|
27
|
-
ActiveRecord::Base.logger = Logger.new(File.join(datpath,'log','development.log'))
|
53
|
+
Init.run
|
data/lib/models/armour.rb
CHANGED
@@ -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
|
data/lib/models/character.rb
CHANGED
@@ -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
|
data/lib/models/critical.rb
CHANGED
data/lib/models/damage.rb
CHANGED