entityjs 0.3.1 → 0.3.2
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/README.md +18 -14
- data/entityjs.gemspec +1 -0
- data/lib/entityjs/assets.rb +13 -163
- data/lib/entityjs/command.rb +5 -2
- data/lib/entityjs/commands/build.rb +63 -23
- data/lib/entityjs/commands/eunit.rb +44 -0
- data/lib/entityjs/commands/release.rb +1 -1
- data/lib/entityjs/commands/server.rb +19 -4
- data/lib/entityjs/compile.rb +152 -0
- data/lib/entityjs/config.rb +8 -0
- data/lib/entityjs/dirc.rb +70 -17
- data/lib/entityjs/page.rb +106 -0
- data/lib/entityjs/parsers/parse_coffee.rb +12 -0
- data/lib/entityjs/version.rb +1 -1
- data/lib/entityjs.rb +18 -4
- data/public/qunit/qunit.css +9 -3
- data/public/qunit/qunit.entity.js +113 -31
- data/public/qunit/qunit.js +296 -235
- data/public/qunit/qunit.mock.js +54 -2
- data/public/tests.html +0 -15
- data/spec/javascripts/src/cycle/tween_spec.js +59 -0
- data/spec/javascripts/src/display/screen_spec.js +0 -15
- data/spec/javascripts/src/display/text_spec.js +4 -0
- data/spec/javascripts/src/input/mouse_spec.js +18 -18
- data/spec/javascripts/src/input/preventdefault_spec.js +14 -0
- data/spec/javascripts/src/math/drag_spec.js +2 -2
- data/spec/javascripts/src/math/hit_spec.js +24 -0
- data/spec/javascripts/src/math/point_spec.js +3 -3
- data/spec/javascripts/src/math/tile_spec.js +1 -1
- data/spec/javascripts/src/media/sound_spec.js +1 -1
- data/spec/javascripts/src/pattern/automap_spec.js +3 -3
- data/spec/javascripts/src/pattern/flicker_spec.js +2 -1
- data/spec/javascripts/src/util/random_spec.js +17 -0
- data/spec/javascripts/src/util/scene_spec.js +15 -0
- data/spec/lib/entityjs/assets_spec.rb +2 -201
- data/spec/lib/entityjs/commands/build_spec.rb +18 -5
- data/spec/lib/entityjs/commands/eunit_spec.rb +18 -0
- data/spec/lib/entityjs/commands/release_spec.rb +2 -0
- data/spec/lib/entityjs/compile_spec.rb +204 -0
- data/spec/lib/entityjs/dirc_spec.rb +8 -4
- data/spec/lib/entityjs/page_spec.rb +59 -0
- data/spec/support/factories.rb +0 -2
- data/src/core/entity.js +4 -18
- data/src/core/query.js +1 -1
- data/src/core/re.js +6 -6
- data/src/core/system.js +17 -12
- data/src/cycle/tween.js +93 -31
- data/src/display/align.js +11 -6
- data/src/display/circle.js +5 -4
- data/src/display/imgtext.js +33 -22
- data/src/display/screen.js +0 -8
- data/src/display/text.js +37 -4
- data/src/input/keyboard.js +15 -5
- data/src/input/mouse.js +15 -25
- data/src/input/preventdefault.js +11 -0
- data/src/math/body.js +35 -16
- data/src/math/drag.js +2 -2
- data/src/math/force.js +2 -2
- data/src/math/hit.js +15 -6
- data/src/math/hitmap.js +6 -6
- data/src/math/point.js +1 -1
- data/src/math/tile.js +22 -17
- data/src/media/sound.js +1 -1
- data/src/pattern/automap.js +16 -27
- data/src/pattern/flicker.js +9 -5
- data/src/util/random.js +4 -0
- data/src/util/scene.js +2 -6
- data/templates/arrow_keys/scripts/{display → displays}/arrow.js +0 -0
- data/templates/arrow_keys/scripts/{input → inputs}/controls.js +0 -0
- data/templates/arrow_keys/tests/{display → displays}/arrow_test.js +1 -1
- data/templates/arrow_keys/tests/{input → inputs}/controls_test.js +0 -0
- data/templates/arrow_keys/tests/scenes/load_test.js +2 -0
- data/templates/{blank → circle}/config.yml +0 -0
- data/templates/{blank → circle}/readme.txt +0 -0
- data/templates/circle/scripts/init.js +7 -0
- data/templates/circle/scripts/scenes/home.js +62 -0
- data/templates/circle/scripts/scenes/load.js +11 -0
- data/templates/circle/tests/scenes/home_test.js +29 -0
- data/templates/circle/tests/scenes/load_test.js +15 -0
- data/templates/platform/config.yml +2 -1
- data/templates/platform/readme.txt +15 -16
- data/templates/platform/scripts/{display → displays}/bit.js +0 -0
- data/templates/platform/scripts/{display → displays}/hero.js +0 -0
- data/templates/platform/scripts/{display → displays}/tile.js +0 -0
- data/templates/platform/scripts/{display → displays}/tsprite.js +0 -0
- data/templates/platform/{assets → scripts}/levels/level1.tmx +0 -0
- data/templates/platform/scripts/{util → utils}/counter.js +0 -0
- data/templates/platform/scripts/{util → utils}/level.js +0 -0
- data/templates/platform/tests/{display → displays}/bit_test.js +1 -1
- data/templates/platform/tests/displays/hero_test.js +73 -0
- data/templates/platform/tests/{display → displays}/tile_test.js +1 -1
- data/templates/platform/tests/displays/tsprite_test.js +8 -0
- data/templates/platform/tests/items/coin_test.js +10 -10
- data/templates/platform/tests/items/item_test.js +9 -9
- data/templates/platform/tests/items/spring_test.js +3 -3
- data/templates/platform/tests/scenes/load_test.js +2 -1
- data/templates/platform/tests/{util → utils}/counter_test.js +2 -2
- data/templates/platform/tests/{util → utils}/level_test.js +3 -0
- data/templates/pong/config.yml +22 -0
- data/templates/pong/readme.txt +3 -0
- data/templates/pong/scripts/controls/ai.js +30 -0
- data/templates/pong/scripts/controls/arena.js +33 -0
- data/templates/pong/scripts/controls/hitmap.js +54 -0
- data/templates/pong/scripts/controls/player.js +24 -0
- data/templates/pong/scripts/controls/twoarena.js +14 -0
- data/templates/pong/scripts/displays/ball.js +29 -0
- data/templates/pong/scripts/displays/counter.js +22 -0
- data/templates/pong/scripts/displays/paddle.js +22 -0
- data/templates/pong/scripts/init.js +9 -0
- data/templates/pong/scripts/scenes/game.js +61 -0
- data/templates/pong/scripts/scenes/home.js +55 -0
- data/templates/pong/scripts/scenes/over.js +29 -0
- data/templates/pong/tests/controls/ai_test.js +34 -0
- data/templates/pong/tests/controls/arena_test.js +20 -0
- data/templates/pong/tests/controls/hitmap_test.js +89 -0
- data/templates/pong/tests/controls/player_test.js +25 -0
- data/templates/pong/tests/controls/twoarena_test.js +7 -0
- data/templates/pong/tests/displays/ball_test.js +10 -0
- data/templates/pong/tests/displays/counter_test.js +13 -0
- data/templates/pong/tests/displays/paddle_test.js +17 -0
- data/templates/pong/tests/scenes/game_test.js +16 -0
- data/templates/pong/tests/scenes/home_test.js +30 -0
- data/templates/pong/tests/scenes/over_test.js +16 -0
- data/templates/tiltmaze/config.yml +25 -0
- data/templates/tiltmaze/readme.txt +79 -0
- data/templates/tiltmaze/scripts/displays/ball.js +78 -0
- data/templates/tiltmaze/scripts/displays/target.js +13 -0
- data/templates/tiltmaze/scripts/displays/tile.js +2 -0
- data/templates/tiltmaze/scripts/init.js +7 -0
- data/templates/tiltmaze/scripts/levels/level1.json +14 -0
- data/templates/tiltmaze/scripts/levels/level2.json +14 -0
- data/templates/tiltmaze/scripts/levels/level3.json +14 -0
- data/templates/tiltmaze/scripts/levels/level4.json +15 -0
- data/templates/tiltmaze/scripts/levels/level5.json +18 -0
- data/templates/tiltmaze/scripts/scenes/game.js +56 -0
- data/templates/tiltmaze/scripts/scenes/home.js +24 -0
- data/templates/tiltmaze/scripts/structs/level.js +82 -0
- data/templates/tiltmaze/scripts/tiles/walltile.js +147 -0
- data/templates/tiltmaze/tests/displays/ball_test.js +67 -0
- data/templates/tiltmaze/tests/displays/target_test.js +8 -0
- data/templates/tiltmaze/tests/factories.js +38 -0
- data/templates/tiltmaze/tests/scenes/game_test.js +59 -0
- data/templates/tiltmaze/tests/scenes/home_test.js +7 -0
- data/templates/tiltmaze/tests/structs/level_test.js +44 -0
- data/templates/tiltmaze/tests/tiles/walltile_test.js +36 -0
- metadata +106 -33
- data/templates/platform/tests/display/hero_test.js +0 -73
- data/templates/platform/tests/display/tsprite_test.js +0 -8
data/README.md
CHANGED
|
@@ -3,13 +3,11 @@ An HTML5 javascript game engine utlizing the entity-component design. Write high
|
|
|
3
3
|
|
|
4
4
|
[EntityJS Website](http://entityjs.com) | [Demos](http://entityjs.com/demos) | [Tutorials](http://entityjs.com/tutorials) | [API](http://entityjs.com/api)
|
|
5
5
|
|
|
6
|
-
## Version 0.3
|
|
6
|
+
## Version 0.3.2
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
**Warning:** there are many name changes which will break older entity games!
|
|
8
|
+
* Coffeescript is now supported.
|
|
9
|
+
* Assets directory is now used for external loading only.
|
|
10
|
+
* Scripts directory now accepts, tmx, xml, json and coffee files.
|
|
13
11
|
|
|
14
12
|
## API
|
|
15
13
|
Currently the [API](http://entityjs.com/api) is out of date. It will slowly be updated everyday.
|
|
@@ -58,17 +56,17 @@ See all available templates:
|
|
|
58
56
|
|
|
59
57
|
`entityjs comp rock`
|
|
60
58
|
|
|
61
|
-
This will create a new component called *rock* at scripts/rock.js and will create a test file
|
|
59
|
+
This will create a new component called *rock* at scripts/rock.js and will create a test file.
|
|
62
60
|
|
|
63
61
|
`entityjs comp display/hero`
|
|
64
62
|
|
|
65
|
-
This will create a
|
|
63
|
+
This will create a hero component in the directory scripts/display.
|
|
66
64
|
|
|
67
65
|
### Creating a Test
|
|
68
66
|
|
|
69
67
|
`entityjs test name test1 test1`
|
|
70
68
|
|
|
71
|
-
Create a test in tests/name_test.js with two test methods.
|
|
69
|
+
Create a test in /tests/name_test.js with two test methods.
|
|
72
70
|
|
|
73
71
|
### Build Game
|
|
74
72
|
|
|
@@ -90,18 +88,18 @@ To run tests visit:
|
|
|
90
88
|
Assets are located here:
|
|
91
89
|
`localhost:2345/assets/*name`
|
|
92
90
|
|
|
91
|
+
View [all commands](/bendangelo/EntityJS/wiki/commands)
|
|
92
|
+
|
|
93
93
|
## Directory Structure
|
|
94
94
|
|
|
95
95
|
* Assets - Contains all external assets
|
|
96
96
|
* Images - Add any images here and retrieve them with `re.assets.images`
|
|
97
97
|
* Sounds - Add any sounds and retrieve them with `re.assets.sounds`
|
|
98
|
-
* [Custom] - Create any folders or files and they will be available in code.
|
|
99
|
-
* json, tmx, xml, sounds and images are accepted files.
|
|
100
98
|
|
|
101
99
|
* Builds - Contains all finished builds
|
|
102
100
|
|
|
103
|
-
* Scripts - Contains all
|
|
104
|
-
* Plugins - Contains
|
|
101
|
+
* Scripts - Contains all js, coffee sources. Xml, tmx and json files will be converted into js.
|
|
102
|
+
* Plugins - Contains minified scripts for plugin play.
|
|
105
103
|
|
|
106
104
|
* Tests - Contains test files to run in [QUnit](http://docs.jquery.com/QUnit)
|
|
107
105
|
|
|
@@ -193,7 +191,7 @@ Simply create a new directory in /assets named levels or anything you like to sa
|
|
|
193
191
|
re('level1.tmx')[0]; //assuming the file name is level1.tmx
|
|
194
192
|
re('level'); //find all levels that are in the /assets/levels directory
|
|
195
193
|
|
|
196
|
-
If you are still confused create a new platform game and view
|
|
194
|
+
If you are still confused create a new platform game and view levels are used.
|
|
197
195
|
|
|
198
196
|
## Quick Start Guide
|
|
199
197
|
First you should install [ruby](http://rubyinstaller.org/) and the [entityjs gem](http://rubygems.org/gems/entityjs).
|
|
@@ -205,3 +203,9 @@ Move into the `mygame` directory and play the game:
|
|
|
205
203
|
`entityjs server`
|
|
206
204
|
|
|
207
205
|
Open your browser and navigate to `localhost:2345`
|
|
206
|
+
|
|
207
|
+
## Contributing
|
|
208
|
+
|
|
209
|
+
Before sending a pull request it would be a good idea to run `rspec` and `rake jasmine` to make sure all tests pass in both ruby and javascript.
|
|
210
|
+
|
|
211
|
+
Running rspec will generate a /mygame/ folder with test files. It will be ignored by git so don't worry about it.
|
data/entityjs.gemspec
CHANGED
data/lib/entityjs/assets.rb
CHANGED
|
@@ -3,180 +3,29 @@ module Entityjs
|
|
|
3
3
|
|
|
4
4
|
class Assets
|
|
5
5
|
|
|
6
|
-
def self.
|
|
7
|
-
['
|
|
6
|
+
def self.valid_images
|
|
7
|
+
['gif', 'png', 'jpg', 'jpeg']
|
|
8
8
|
end
|
|
9
9
|
|
|
10
|
-
def self.
|
|
11
|
-
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def self.set_vars(contents, tests=false)
|
|
15
|
-
#read file for changes
|
|
16
|
-
Config.instance.reload
|
|
17
|
-
|
|
18
|
-
contents = contents.gsub("$WIDTH", Config.instance.width.to_s)
|
|
19
|
-
contents = contents.gsub("$HEIGHT", Config.instance.height.to_s)
|
|
20
|
-
contents = contents.gsub("$CANVAS_ID", Config.instance.canvas_id)
|
|
21
|
-
|
|
22
|
-
contents.gsub("$JS", Assets.to_html(tests))
|
|
23
|
-
end
|
|
24
|
-
|
|
25
|
-
#combine all sources into valid html scripts
|
|
26
|
-
def self.to_html(tests=false)
|
|
27
|
-
js = %Q(
|
|
28
|
-
<script type='text/javascript'>
|
|
29
|
-
window.addEventListener\('load', function(){
|
|
30
|
-
#{Assets.to_js}
|
|
31
|
-
re.version = '#{VERSION}';
|
|
32
|
-
|
|
33
|
-
}\);
|
|
34
|
-
</script>
|
|
35
|
-
)
|
|
36
|
-
ent = Dirc.find_entity_src_url(Config.instance.entity_ignore)
|
|
37
|
-
srcs = Dirc.find_scripts_url(Config.instance.scripts_ignore, Config.instance.scripts_order)
|
|
38
|
-
|
|
39
|
-
if tests
|
|
40
|
-
tests_src = Dirc.find_tests_url(Config.instance.tests_ignore)
|
|
41
|
-
else
|
|
42
|
-
tests_src = []
|
|
43
|
-
end
|
|
44
|
-
|
|
45
|
-
merg = ent | srcs | tests_src
|
|
46
|
-
|
|
47
|
-
merg.each do |s|
|
|
48
|
-
js += "\t<script src='#{s}' type='text/javascript'></script>\n"
|
|
49
|
-
end
|
|
50
|
-
js
|
|
51
|
-
end
|
|
52
|
-
|
|
53
|
-
#converts all assets / info into a js game header
|
|
54
|
-
def self.to_js(path = nil, images = nil, sounds = nil, canvas = nil, datas = nil)
|
|
55
|
-
path ||= 'assets/'
|
|
56
|
-
images ||= self.images_to_js
|
|
57
|
-
sounds ||= self.sounds_to_js
|
|
58
|
-
canvas ||= Config.instance.canvas_id
|
|
59
|
-
datas ||= self.datas_to_js
|
|
60
|
-
|
|
61
|
-
return %Q(
|
|
62
|
-
re.load.path = '#{path}';
|
|
63
|
-
re.assets = {
|
|
64
|
-
images:#{images},
|
|
65
|
-
sounds:#{sounds}
|
|
66
|
-
};
|
|
67
|
-
re.canvas = '##{canvas}';
|
|
68
|
-
#{datas}
|
|
69
|
-
)
|
|
70
|
-
end
|
|
71
|
-
|
|
72
|
-
def self.images_to_js(images = nil)
|
|
73
|
-
images ||= self.search('images')
|
|
74
|
-
|
|
75
|
-
s = images.collect{|i| "'#{i}'"}.join(', ')
|
|
76
|
-
|
|
77
|
-
"[#{s}]"
|
|
78
|
-
end
|
|
79
|
-
|
|
80
|
-
def self.sounds_to_js(sounds = nil)
|
|
81
|
-
sounds ||= self.search('sounds')
|
|
82
|
-
|
|
83
|
-
s = sounds.collect{|i| "'#{i}'"}.join(', ')
|
|
84
|
-
|
|
85
|
-
"[#{s}]"
|
|
86
|
-
end
|
|
87
|
-
|
|
88
|
-
def self.datas_to_js
|
|
89
|
-
s = self.search
|
|
90
|
-
|
|
91
|
-
out = ''
|
|
92
|
-
|
|
93
|
-
s.each do |i|
|
|
94
|
-
|
|
95
|
-
file = i
|
|
96
|
-
data = IO.read(Dirc.game_root+'/'+Config.assets_folder+'/'+i)
|
|
97
|
-
|
|
98
|
-
out += self.data_to_js(i, data)
|
|
99
|
-
|
|
100
|
-
end
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
out
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
def self.data_to_js(file, data)
|
|
107
|
-
contents = self.data_to_json(file, data)
|
|
108
|
-
|
|
109
|
-
basename = File.basename(file)
|
|
110
|
-
dirname = File.dirname(file)
|
|
111
|
-
|
|
112
|
-
comps = []
|
|
113
|
-
|
|
114
|
-
dirname.split('/').each do |i|
|
|
115
|
-
|
|
116
|
-
#make singular
|
|
117
|
-
if i[-1] == 's'
|
|
118
|
-
i = i[0..-2]
|
|
119
|
-
end
|
|
120
|
-
|
|
121
|
-
comps.push i
|
|
122
|
-
|
|
123
|
-
end
|
|
124
|
-
|
|
125
|
-
#remove dot because no base dir was given
|
|
126
|
-
comps.delete_if{|i| i=='.'}
|
|
127
|
-
|
|
128
|
-
%Q(
|
|
129
|
-
re.e('#{basename} #{comps.join(' ')}')
|
|
130
|
-
.attr(#{contents});
|
|
131
|
-
)
|
|
132
|
-
end
|
|
133
|
-
|
|
134
|
-
def self.data_to_json(file, data)
|
|
135
|
-
ext = file.downcase
|
|
136
|
-
|
|
137
|
-
case ext
|
|
138
|
-
when /json$/
|
|
139
|
-
return data
|
|
140
|
-
|
|
141
|
-
when /tmx$/
|
|
142
|
-
|
|
143
|
-
return ParseTMX.parse(data)
|
|
144
|
-
|
|
145
|
-
when /xml$/
|
|
146
|
-
return ParseXML.parse(data)
|
|
147
|
-
|
|
148
|
-
when /csv$/
|
|
149
|
-
raise 'CSV files are not supported at the moment'
|
|
150
|
-
|
|
151
|
-
when /yml$/
|
|
152
|
-
raise 'YML files are not supported at the moment'
|
|
153
|
-
|
|
154
|
-
else
|
|
155
|
-
return data
|
|
156
|
-
|
|
157
|
-
end
|
|
158
|
-
|
|
159
|
-
end
|
|
160
|
-
|
|
161
|
-
def self.file_to_json(file)
|
|
162
|
-
contents = IO.read(file)
|
|
163
|
-
|
|
164
|
-
return self.data_to_json(file, contents)
|
|
10
|
+
def self.valid_sounds
|
|
11
|
+
['mp3', 'ogg', 'aac', 'wav']
|
|
165
12
|
end
|
|
166
13
|
|
|
167
14
|
def self.search(type='*')
|
|
168
|
-
images_folder = Config.images_folder
|
|
169
|
-
sounds_folder = Config.sounds_folder
|
|
170
|
-
assets_folder = Config.assets_folder
|
|
171
15
|
|
|
172
16
|
case type
|
|
173
17
|
when 'images'
|
|
174
|
-
|
|
18
|
+
images_folder = Config.images_folder
|
|
19
|
+
valid_images = self.valid_images.join(',')
|
|
20
|
+
return self.find_files(images_folder+"/**/*.{#{valid_images}}")
|
|
175
21
|
|
|
176
22
|
when 'sounds'
|
|
177
|
-
|
|
23
|
+
sounds_folder = Config.sounds_folder
|
|
24
|
+
valid_sounds = self.valid_sounds.join(',')
|
|
25
|
+
return self.find_files(sounds_folder+"/**/*.{#{valid_sounds}}")
|
|
178
26
|
|
|
179
27
|
else
|
|
28
|
+
#TODO: fix up
|
|
180
29
|
return self.search_datas
|
|
181
30
|
|
|
182
31
|
end
|
|
@@ -184,7 +33,8 @@ module Entityjs
|
|
|
184
33
|
end
|
|
185
34
|
|
|
186
35
|
def self.search_datas
|
|
187
|
-
|
|
36
|
+
#TODO: find all other folders and generate a key in re.assets
|
|
37
|
+
return self.find_files("#{Config.assets_folder}/*/*").select{|i| i.match(/(images|sounds)\//i) == nil }
|
|
188
38
|
end
|
|
189
39
|
|
|
190
40
|
def self.find_files(search)
|
data/lib/entityjs/command.rb
CHANGED
|
@@ -25,6 +25,8 @@ module Entityjs
|
|
|
25
25
|
|
|
26
26
|
when 'release'
|
|
27
27
|
return Entityjs::Release.generate(args)
|
|
28
|
+
when 'eunit'
|
|
29
|
+
return Entityjs::Eunit.generate(args)
|
|
28
30
|
|
|
29
31
|
when /^(comp|c)$/
|
|
30
32
|
return Entityjs::Comp.generate(args)
|
|
@@ -35,11 +37,11 @@ module Entityjs
|
|
|
35
37
|
when /^(font|f)$/
|
|
36
38
|
return Entityjs::Font.generate(args)
|
|
37
39
|
|
|
38
|
-
when /^(version|v)$/
|
|
40
|
+
when /^(version|v|-v)$/
|
|
39
41
|
puts 'EntityJS V'+Entityjs::VERSION
|
|
40
42
|
return 0
|
|
41
43
|
|
|
42
|
-
when /^(help|h)$/
|
|
44
|
+
when /^(help|h|-h)$/
|
|
43
45
|
puts ""
|
|
44
46
|
puts '---- Commands ----'
|
|
45
47
|
puts 'entityjs new [name]'
|
|
@@ -49,6 +51,7 @@ module Entityjs
|
|
|
49
51
|
puts 'entityjs test [name]'
|
|
50
52
|
puts 'entityjs test [name] [tests]+'
|
|
51
53
|
puts 'entityjs font [name] (soon...)'
|
|
54
|
+
puts 'entityjs release'
|
|
52
55
|
puts 'entityjs build'
|
|
53
56
|
puts 'entityjs build [name]'
|
|
54
57
|
puts 'entityjs server'
|
|
@@ -34,30 +34,18 @@ module Entityjs
|
|
|
34
34
|
Dirc.create_dir('builds', true)
|
|
35
35
|
|
|
36
36
|
#create new directory
|
|
37
|
-
if
|
|
37
|
+
if File.directory?(name)
|
|
38
38
|
return 3
|
|
39
39
|
end
|
|
40
40
|
|
|
41
|
-
assets_root = Dirc.game_root+'/'
|
|
41
|
+
assets_root = Dirc.game_root+'/'+assets_folder
|
|
42
42
|
|
|
43
43
|
Dir.mkdir(name)
|
|
44
44
|
Dir.chdir(name)
|
|
45
|
-
|
|
46
|
-
#copy
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
if Dir.exists? assets_root+images_folder
|
|
51
|
-
puts "Copying images"
|
|
52
|
-
FileUtils.cp_r assets_root+images_folder, 'images'
|
|
53
|
-
end
|
|
54
|
-
|
|
55
|
-
if Dir.exists? assets_root+sounds_folder
|
|
56
|
-
puts "Copying sounds"
|
|
57
|
-
FileUtils.cp_r assets_root+sounds_folder, 'sounds'
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
end
|
|
45
|
+
|
|
46
|
+
#copy everything inside the assets folder
|
|
47
|
+
puts "Copying assets folder"
|
|
48
|
+
FileUtils.cp_r assets_root, assets_folder
|
|
61
49
|
|
|
62
50
|
#append all files into one big file
|
|
63
51
|
puts "Compiling code"
|
|
@@ -121,20 +109,36 @@ module Entityjs
|
|
|
121
109
|
return out
|
|
122
110
|
end
|
|
123
111
|
|
|
112
|
+
#finds all js inside public/qunit and compiles into one string
|
|
113
|
+
def self.compile_eunit()
|
|
114
|
+
out = ''
|
|
115
|
+
|
|
116
|
+
units = Dirc.find_eunit_src
|
|
117
|
+
|
|
118
|
+
units.each do |i|
|
|
119
|
+
out += "\n"
|
|
120
|
+
out += IO.read(i)
|
|
121
|
+
out += "\n"
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
return out
|
|
125
|
+
end
|
|
126
|
+
|
|
124
127
|
#compiles all game source and returns it
|
|
125
128
|
def self.compile_scripts(ignore = nil, order=nil)
|
|
126
|
-
|
|
129
|
+
#find with short urls for proper data processing
|
|
130
|
+
scripts = Dirc.find_scripts_short(ignore, order)
|
|
127
131
|
|
|
128
132
|
out = ''
|
|
129
133
|
|
|
130
134
|
scripts.each do |i|
|
|
131
135
|
out += "\n"
|
|
132
|
-
out +=
|
|
136
|
+
out += Compile.script_to_js(i)
|
|
133
137
|
out += "\n"
|
|
134
138
|
end
|
|
135
139
|
|
|
136
|
-
#add
|
|
137
|
-
out +=
|
|
140
|
+
#add js config
|
|
141
|
+
out += self.js_config
|
|
138
142
|
|
|
139
143
|
return out
|
|
140
144
|
end
|
|
@@ -145,13 +149,49 @@ module Entityjs
|
|
|
145
149
|
code = Uglifier.compile(code, :copyright=>false)
|
|
146
150
|
|
|
147
151
|
#add entity license statement
|
|
148
|
-
if license
|
|
152
|
+
if license.is_a? String
|
|
153
|
+
code = license + code
|
|
154
|
+
elsif license
|
|
149
155
|
code = Config.instance.license + code
|
|
150
156
|
end
|
|
151
157
|
|
|
152
158
|
return code
|
|
153
159
|
end
|
|
154
160
|
|
|
161
|
+
def self.js_config(path = nil, images = nil, sounds = nil, canvas = nil)
|
|
162
|
+
path ||= 'assets/'
|
|
163
|
+
images ||= self.images_to_js
|
|
164
|
+
sounds ||= self.sounds_to_js
|
|
165
|
+
canvas ||= Config.instance.canvas_id
|
|
166
|
+
|
|
167
|
+
return %Q(
|
|
168
|
+
re.load.path = \"#{path}\";
|
|
169
|
+
re.assets = {
|
|
170
|
+
images:#{images},
|
|
171
|
+
sounds:#{sounds}
|
|
172
|
+
};
|
|
173
|
+
re.canvas = \"##{canvas}\";
|
|
174
|
+
)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
#returns all images in a js array
|
|
178
|
+
def self.images_to_js(images = nil)
|
|
179
|
+
images ||= Assets.search('images')
|
|
180
|
+
|
|
181
|
+
s = images.collect{|i| "'#{i}'"}.join(', ')
|
|
182
|
+
|
|
183
|
+
"[#{s}]"
|
|
184
|
+
end
|
|
185
|
+
|
|
186
|
+
#returns all sounds in a js array
|
|
187
|
+
def self.sounds_to_js(sounds = nil)
|
|
188
|
+
sounds ||= Assets.search('sounds')
|
|
189
|
+
|
|
190
|
+
s = sounds.collect{|i| "'#{i}'"}.join(', ')
|
|
191
|
+
|
|
192
|
+
"[#{s}]"
|
|
193
|
+
end
|
|
194
|
+
|
|
155
195
|
end
|
|
156
196
|
|
|
157
197
|
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
module Entityjs
|
|
2
|
+
|
|
3
|
+
#outputs eunit compiled code
|
|
4
|
+
class Eunit
|
|
5
|
+
|
|
6
|
+
def self.generate(name=nil)
|
|
7
|
+
|
|
8
|
+
if name.is_a? Array
|
|
9
|
+
name = name.first
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
name ||= self.eunit_name
|
|
13
|
+
|
|
14
|
+
puts "Collecting test src files"
|
|
15
|
+
|
|
16
|
+
min = Entityjs::Build.compile_eunit
|
|
17
|
+
|
|
18
|
+
puts "Minifying"
|
|
19
|
+
|
|
20
|
+
license = "/* QUnit V1.5.0pre with EntityJS Entensions | http://docs.jquery.com/QUnit */\n"
|
|
21
|
+
|
|
22
|
+
min = Entityjs::Build.minify(min, license)
|
|
23
|
+
|
|
24
|
+
File.open(name, 'w') do |f|
|
|
25
|
+
|
|
26
|
+
f.write(min)
|
|
27
|
+
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
puts "Done!"
|
|
31
|
+
puts "File is at"
|
|
32
|
+
puts " ./#{name}"
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
return 0
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def self.eunit_name
|
|
39
|
+
return "eunit-#{Entityjs::VERSION}.min.js"
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
@@ -22,21 +22,36 @@ module Entityjs
|
|
|
22
22
|
|
|
23
23
|
get '/' do
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
Page.render_play()
|
|
26
26
|
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
get '/tests' do
|
|
30
30
|
|
|
31
|
-
|
|
31
|
+
Page.render_tests()
|
|
32
32
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
|
+
#entity source code
|
|
35
36
|
get '/entityjs/*' do
|
|
36
37
|
content_type 'text/javascript'
|
|
37
|
-
|
|
38
|
+
|
|
39
|
+
Page.render_entityjs_src(params[:splat].first)
|
|
38
40
|
end
|
|
39
41
|
|
|
42
|
+
get '/scripts/*' do
|
|
43
|
+
content_type 'text/javascript'
|
|
44
|
+
|
|
45
|
+
Page.render_script(params[:splat].first)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
get '/tests/*' do
|
|
49
|
+
content_type 'text/javascript'
|
|
50
|
+
|
|
51
|
+
Page.render_test(params[:splat].first)
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
#qunit testing stuff
|
|
40
55
|
get '/qunit/*' do
|
|
41
56
|
file = params[:splat].first
|
|
42
57
|
if file.match /\.js$/
|
|
@@ -45,7 +60,7 @@ module Entityjs
|
|
|
45
60
|
content_type 'text/css'
|
|
46
61
|
end
|
|
47
62
|
|
|
48
|
-
|
|
63
|
+
Page.render_eunit(file)
|
|
49
64
|
end
|
|
50
65
|
|
|
51
66
|
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
#The Compile class transforms text data into js
|
|
2
|
+
#This includes, xml, tmx, json, coffeescript, etc
|
|
3
|
+
module Entityjs
|
|
4
|
+
|
|
5
|
+
class Compile
|
|
6
|
+
|
|
7
|
+
def self.valid_datas
|
|
8
|
+
['xml', 'json', 'tmx', 'csv', 'yml']
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def self.valid_scripts
|
|
12
|
+
['js', 'coffee'] + self.valid_datas
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def self.datas_regex
|
|
16
|
+
return /^.*\.#{self.valid_datas.join('|')}$/i
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def self.valid_data?(file)
|
|
20
|
+
return file.match(datas_regex) != nil
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.path
|
|
24
|
+
if @path.nil?
|
|
25
|
+
@path = Dirc.game_root
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
@path
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def self.path=(v)
|
|
32
|
+
@path = v
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def self.test_to_js(path, data=nil)
|
|
36
|
+
if data.nil?
|
|
37
|
+
#load
|
|
38
|
+
data = self.read_contents(Config.tests_folder+'/'+path)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
return self.data_to_js(path, data)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def self.script_to_js(path, data=nil)
|
|
45
|
+
if data.nil?
|
|
46
|
+
#load
|
|
47
|
+
data = self.read_contents(Config.scripts_folder+'/'+path)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
return self.data_to_js(path, data)
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def self.data_to_js(path, data)
|
|
54
|
+
js = ''
|
|
55
|
+
|
|
56
|
+
if self.valid_data?(path)
|
|
57
|
+
comps = path.split('/')
|
|
58
|
+
js = self.data_to_entity(comps, data)
|
|
59
|
+
elsif path.match /\.coffee$/
|
|
60
|
+
js = self.coffee_to_js(data)
|
|
61
|
+
else
|
|
62
|
+
js = data
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
return js
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
#compiles data files into entities
|
|
69
|
+
def self.data_to_entity(comps, data)
|
|
70
|
+
if comps.is_a? String
|
|
71
|
+
comps = [comps]
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
#find extension for compiling, or else treat it as json
|
|
75
|
+
ext = comps.select{|i| !File.extname(i).empty? }.first
|
|
76
|
+
|
|
77
|
+
if ext.nil?
|
|
78
|
+
ext = '.json'
|
|
79
|
+
else
|
|
80
|
+
ext = File.extname(ext)
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
json = self.to_json(ext, data)
|
|
84
|
+
|
|
85
|
+
return self.to_entity(comps, json)
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
#converts given comps and json into an entityjs entity
|
|
89
|
+
# returns an entityjs component
|
|
90
|
+
def self.to_entity(comps, json)
|
|
91
|
+
|
|
92
|
+
#remove plurals
|
|
93
|
+
comps.collect! do |i|
|
|
94
|
+
|
|
95
|
+
#115 for ruby 1.8.7
|
|
96
|
+
if i[-1] == 's' || i[-1] == 115
|
|
97
|
+
i[0..-2]
|
|
98
|
+
else
|
|
99
|
+
i
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
#turn into one long strng
|
|
105
|
+
comps = comps.join(' ')
|
|
106
|
+
|
|
107
|
+
#output entity
|
|
108
|
+
return "re.e('#{comps}')\n.attr(#{json})"
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
#converts the given data to json
|
|
112
|
+
#the type defines the data type
|
|
113
|
+
#example:
|
|
114
|
+
# to_json('xml', "<map><bob>10</bob></map>")
|
|
115
|
+
# => "{"bob":{$:10}}"
|
|
116
|
+
def self.to_json(type, data)
|
|
117
|
+
|
|
118
|
+
type.downcase!
|
|
119
|
+
|
|
120
|
+
case type
|
|
121
|
+
when '.json'
|
|
122
|
+
return data
|
|
123
|
+
when '.tmx'
|
|
124
|
+
return self.tmx_to_json(data)
|
|
125
|
+
when '.xml'
|
|
126
|
+
return self.xml_to_json(data)
|
|
127
|
+
else
|
|
128
|
+
return data
|
|
129
|
+
end
|
|
130
|
+
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
def self.coffee_to_js(data)
|
|
134
|
+
return ParseCoffee.parse(data)
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
def self.tmx_to_json(data)
|
|
138
|
+
return ParseTMX.parse(data)
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
def self.xml_to_json(data)
|
|
142
|
+
return ParseXML.parse(data)
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
#used for stubbing
|
|
146
|
+
def self.read_contents(path)
|
|
147
|
+
IO.read(self.path+'/'+path)
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
end
|
|
151
|
+
|
|
152
|
+
end
|