gemini 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (114) hide show
  1. data/bin/gemini +18 -0
  2. data/build_configuration.rb +24 -0
  3. data/lib/ibxm.jar +0 -0
  4. data/lib/jinput.jar +0 -0
  5. data/lib/jogg-0.0.7.jar +0 -0
  6. data/lib/jorbis-0.0.15.jar +0 -0
  7. data/lib/jruby-complete.jar +0 -0
  8. data/lib/lwjgl.jar +0 -0
  9. data/lib/lwjgl_util_applet.jar +0 -0
  10. data/lib/native_files/OpenAL32.dll +0 -0
  11. data/lib/native_files/jinput-dx8.dll +0 -0
  12. data/lib/native_files/jinput-raw.dll +0 -0
  13. data/lib/native_files/libjinput-linux.so +0 -0
  14. data/lib/native_files/libjinput-linux64.so +0 -0
  15. data/lib/native_files/libjinput-osx.jnilib +0 -0
  16. data/lib/native_files/liblwjgl.jnilib +0 -0
  17. data/lib/native_files/liblwjgl.so +0 -0
  18. data/lib/native_files/liblwjgl64.so +0 -0
  19. data/lib/native_files/libopenal.so +0 -0
  20. data/lib/native_files/lwjgl.dll +0 -0
  21. data/lib/native_files/openal.dylib +0 -0
  22. data/lib/natives-linux.jar +0 -0
  23. data/lib/natives-mac.jar +0 -0
  24. data/lib/natives-win32.jar +0 -0
  25. data/lib/phys2d.jar +0 -0
  26. data/lib/slick.jar +0 -0
  27. data/package/jar/gemini.jar +0 -0
  28. data/src/base_state.rb +112 -0
  29. data/src/behavior.rb +230 -0
  30. data/src/behavior_event.rb +23 -0
  31. data/src/behaviors.txt +5 -0
  32. data/src/behaviors/animated_sprite.rb +51 -0
  33. data/src/behaviors/audible.rb +11 -0
  34. data/src/behaviors/axis_stateful.rb +33 -0
  35. data/src/behaviors/big_sprite.rb +56 -0
  36. data/src/behaviors/bounding_box_collidable.rb +25 -0
  37. data/src/behaviors/camera_anchored_drawable.rb +20 -0
  38. data/src/behaviors/cardinal_movable.rb +114 -0
  39. data/src/behaviors/clickable.rb +18 -0
  40. data/src/behaviors/countable.rb +31 -0
  41. data/src/behaviors/debug_physical.rb +31 -0
  42. data/src/behaviors/debug_tangible.rb +30 -0
  43. data/src/behaviors/drawable.rb +6 -0
  44. data/src/behaviors/drawable_shape.rb +43 -0
  45. data/src/behaviors/fading_image_trail_emittable.rb +28 -0
  46. data/src/behaviors/game_object_emittable.rb +12 -0
  47. data/src/behaviors/gravity_source.rb +21 -0
  48. data/src/behaviors/inertial.rb +11 -0
  49. data/src/behaviors/movable2d.rb +9 -0
  50. data/src/behaviors/multi_animated_sprite.rb +22 -0
  51. data/src/behaviors/physical.rb +348 -0
  52. data/src/behaviors/physical_cardinal_movable.rb +110 -0
  53. data/src/behaviors/physical_sprite.rb +29 -0
  54. data/src/behaviors/platformer_controllable.rb +144 -0
  55. data/src/behaviors/pointer.rb +28 -0
  56. data/src/behaviors/pressable.rb +13 -0
  57. data/src/behaviors/receives_events.rb +21 -0
  58. data/src/behaviors/regional.rb +71 -0
  59. data/src/behaviors/rotates_to_point.rb +18 -0
  60. data/src/behaviors/spatial.rb +41 -0
  61. data/src/behaviors/spline_stretchable_sprite.rb +45 -0
  62. data/src/behaviors/sprite.rb +99 -0
  63. data/src/behaviors/stateful.rb +31 -0
  64. data/src/behaviors/taggable.rb +27 -0
  65. data/src/behaviors/tangible.rb +51 -0
  66. data/src/behaviors/timeable.rb +79 -0
  67. data/src/behaviors/top_down_vehicle.rb +41 -0
  68. data/src/behaviors/triangle_trail_emittable.rb +41 -0
  69. data/src/behaviors/updates.rb +10 -0
  70. data/src/behaviors/updates_at_consistant_rate.rb +27 -0
  71. data/src/behaviors/vectored_movement.rb +47 -0
  72. data/src/behaviors/world_collidable.rb +8 -0
  73. data/src/color.rb +70 -0
  74. data/src/game_object.rb +174 -0
  75. data/src/game_objects/background.rb +9 -0
  76. data/src/game_objects/fading_image.rb +23 -0
  77. data/src/game_objects/icon_strip_counter_display.rb +58 -0
  78. data/src/game_objects/static_sprite.rb +18 -0
  79. data/src/game_objects/tangible_object.rb +4 -0
  80. data/src/game_objects/text.rb +59 -0
  81. data/src/game_objects/triangle_trail.rb +85 -0
  82. data/src/gemini.rb +110 -0
  83. data/src/gemini_version.rb +3 -0
  84. data/src/inflector.rb +68 -0
  85. data/src/input_helpers/joystick_dead_zone_filter.rb +9 -0
  86. data/src/listenable_mixin.rb +15 -0
  87. data/src/managers/basic_game_object_manager.rb +81 -0
  88. data/src/managers/basic_physics_manager.rb +97 -0
  89. data/src/managers/basic_render_manager.rb +48 -0
  90. data/src/managers/basic_tangible_manager.rb +33 -0
  91. data/src/managers/basic_update_manager.rb +27 -0
  92. data/src/managers/diagnostic/diagnostic_input_manager.rb +0 -0
  93. data/src/managers/input_manager.rb +229 -0
  94. data/src/managers/input_support/input_mapping.rb +126 -0
  95. data/src/managers/input_support/input_message.rb +5 -0
  96. data/src/managers/input_support/slick_input_listener.rb +19 -0
  97. data/src/managers/input_support/slick_input_message.rb +11 -0
  98. data/src/managers/input_support/slick_input_translator.rb +15 -0
  99. data/src/managers/message_queue.rb +54 -0
  100. data/src/managers/scrolling_render_manager.rb +44 -0
  101. data/src/managers/sound_manager.rb +60 -0
  102. data/src/managers/tag_manager.rb +43 -0
  103. data/src/math.rb +13 -0
  104. data/src/music.rb +14 -0
  105. data/src/org/rubyforge/rawr/Main.java +67 -0
  106. data/src/platform.rb +28 -0
  107. data/src/proc_enhancement.rb +5 -0
  108. data/src/project_generator.rb +122 -0
  109. data/src/skeleton.txt +10 -0
  110. data/src/spline.rb +13 -0
  111. data/src/states/input_diagnostic_state.rb +53 -0
  112. data/src/vector.rb +99 -0
  113. data/test/test_state.rb +3 -0
  114. metadata +181 -0
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env jruby
2
+ $LOAD_PATH << File.expand_path(File.join(File.dirname(__FILE__), '..', 'src'))
3
+ require 'project_generator'
4
+
5
+ rawr_install_args = ''
6
+ project_dir = nil
7
+ until ARGV.empty?
8
+ arg = ARGV.shift
9
+ case arg
10
+ when /-RI(.+)/
11
+ rawr_install_args << $1 + ' '
12
+ else
13
+ project_dir = arg
14
+ end
15
+ end
16
+ raise "No project dir provided" if project_dir.nil?
17
+ generator = Gemini::ProjectGenerator.new(:project_dir => project_dir, :rawr_install => rawr_install_args)
18
+ generator.generate_project
@@ -0,0 +1,24 @@
1
+ configuration do |c|
2
+ c.project_name = 'gemini'
3
+ c.output_dir = 'package'
4
+ # c.main_ruby_file = 'main'
5
+ # c.main_java_file = 'org.rubyforge.rawr.Main'
6
+
7
+ # Compile all Ruby and Java files recursively
8
+ # Copy all other files taking into account exclusion filter
9
+ c.source_dirs = ['src']
10
+ c.source_exclude_filter = []
11
+
12
+ c.jruby_jar = 'lib/jruby-complete.jar'
13
+ c.compile_ruby_files = false
14
+ #c.java_lib_files = []
15
+ c.java_lib_dirs = ['lib']
16
+ #c.files_to_copy = Dir.glob('lib/native_files/*')
17
+
18
+ c.target_jvm_version = 1.5
19
+ #c.jars[:data] = { :directory => 'data/images', :location_in_jar => 'images', :exclude => /bak/}
20
+ #c.jvm_arguments = ""
21
+
22
+ # Bundler options
23
+ # c.do_not_generate_plist = false
24
+ end
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
@@ -0,0 +1,112 @@
1
+ module Gemini
2
+ class BaseState
3
+ @@active_state = nil
4
+ def self.active_state
5
+ @@active_state
6
+ end
7
+
8
+ def self.active_state=(state)
9
+ @@active_state = state
10
+ end
11
+
12
+ def initialize(container, game)
13
+ @container = container
14
+ @game = game
15
+
16
+ game_object_manager = BasicGameObjectManager.new(self)
17
+ update_manager = BasicUpdateManager.new(self)
18
+ render_manager = BasicRenderManager.new(self)
19
+ input_manager = InputManager.new(self, container)
20
+ message_manager = MessageQueue.new(self)
21
+
22
+ @managers = {:game_object => game_object_manager,
23
+ :update => update_manager,
24
+ :render => render_manager,
25
+ :input => input_manager,
26
+ :message_queue => message_manager
27
+ }
28
+
29
+ @paused = false
30
+ end
31
+
32
+ def screen_width
33
+ @game.screen_width
34
+ end
35
+
36
+ def screen_height
37
+ @game.screen_height
38
+ end
39
+
40
+ def create_on_layer(type, layer_name, *params)
41
+ game_object_type = begin
42
+ type.constantize
43
+ rescue NameError
44
+ begin
45
+ require type.underscore
46
+ begin
47
+ type.constantize
48
+ rescue NameError
49
+ "Gemini::#{type}".constantize
50
+ end
51
+ rescue LoadError
52
+ "Gemini::#{type}".constantize
53
+ end
54
+ end
55
+ game_object = game_object_type.new(self, *params)
56
+ add_game_object_to_layer game_object, layer_name
57
+ game_object
58
+ end
59
+
60
+ def create(type, *params)
61
+ create_on_layer(type, :default, *params)
62
+ end
63
+
64
+ def create_game_object(type, *params)
65
+ warn "create_game_object is deprecated, use create instead"
66
+ create(type, *params)
67
+ end
68
+
69
+ def manager(type)
70
+ @managers[type]
71
+ end
72
+
73
+ def add_game_object(game_object)
74
+ @managers[:game_object].add_game_object game_object
75
+ end
76
+
77
+ def add_game_object_to_layer(game_object, layer_name)
78
+ @managers[:game_object].add_game_object_to_layer game_object, layer_name
79
+ end
80
+
81
+ def remove(game_object)
82
+ @managers[:game_object].remove_game_object(game_object)
83
+ end
84
+
85
+ def remove_game_object(game_object)
86
+ warn "remove_game_object is deprecated, use remove instead"
87
+ remove(game_object)
88
+ end
89
+
90
+ def switch_state(state_name, *args)
91
+ state = @game.load_state state_name, args
92
+ @game.queue_state state
93
+ #self.class.active_state = state
94
+ #state.load
95
+ state
96
+ end
97
+
98
+ def load_keymap(keymap)
99
+ @managers[:input].load_keymap keymap
100
+ end
101
+
102
+ def load(*args); end
103
+
104
+ def quit_game
105
+ java.lang.System.exit 0
106
+ end
107
+ private
108
+ def set_manager(type, manager)
109
+ @managers[type] = manager
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,230 @@
1
+ require 'listenable_mixin'
2
+
3
+ module Gemini
4
+ class MethodExistsError < Exception; end
5
+ class InvalidWrapWithCallbacksError < Exception; end
6
+
7
+ class ValueChangedEvent
8
+ attr_accessor :previous_value, :desired_value
9
+
10
+ def initialize(previous_value, desired_value)
11
+ @previous_value, @desired_value = previous_value, desired_value
12
+ end
13
+ end
14
+
15
+ class Behavior
16
+ include ListenableMixin
17
+ attr_reader :reference_count, :target
18
+
19
+ def self.method_added(method)
20
+ if callback_methods_to_wrap.member? method
21
+ begin
22
+ return if callback_methods_wrapped.member? method #instance_method(:"wrapped_#{method}") #&& wrapped_methods.member?(method)
23
+ rescue NameError; end #Intentionally swallow, this section is to prevent infinite recursion
24
+ callback_methods_wrapped << method
25
+ alias_method :"wrapped_#{method}", method
26
+ arity = instance_method(:"wrapped_#{method}").arity
27
+ if arity.abs > 0
28
+ args = (1..arity.abs).inject([]){|args, i| args << "arg#{i}" }
29
+ args[-1].insert(0,"*") if arity < 0
30
+ end
31
+ if match = /^(.*)=$/.match(method.to_s)
32
+ method_name = match[1]
33
+ code = <<-ENDL
34
+ def #{method}(#{args})
35
+ raise Gemini::InvalidWrapWithCallbacksError.new("Cannot wrap #{method} with callbacks without \\"#{method_name}\\"") unless respond_to?(:#{method_name})
36
+ event = ValueChangedEvent.new(@target.#{method_name}, #{args})
37
+ callback_abort = CallbackStatus.new
38
+ @target.notify :before_#{method_name}_changes, event
39
+ if callback_abort.continue?
40
+ self.wrapped_#{method}(#{args})
41
+ @target.notify :after_#{method_name}_changes, event
42
+ end
43
+ end
44
+ ENDL
45
+ wrapped_methods << "before_#{method_name}_changes"
46
+ wrapped_methods << "after_#{method_name}_changes"
47
+ else
48
+ code = <<-ENDL
49
+ def #{method}(#{(args.join(",") + ",") if args} &block)
50
+ callback_abort = CallbackStatus.new
51
+ @target.notify :before_#{method}, callback_abort
52
+ if callback_abort.continue?
53
+ self.wrapped_#{method}(#{(args.join(",") + ",") if args} &block)
54
+ @target.notify :after_#{method}
55
+ end
56
+ end
57
+ ENDL
58
+ wrapped_methods << "before_#{method}"
59
+ wrapped_methods << "after_#{method}"
60
+ end
61
+ self.class_eval(code, __FILE__, __LINE__)
62
+ else
63
+ super
64
+ end
65
+ end
66
+
67
+ protected
68
+
69
+ def self.depends_on(behavior)
70
+ require "behaviors/#{behavior.underscore}"
71
+ add_dependency(behavior)
72
+ end
73
+
74
+ def self.depends_on_kind_of(behavior)
75
+ add_kind_of_dependency(behavior)
76
+ end
77
+
78
+ def self.wrap_with_callbacks(*args)
79
+ @@callback_methods_to_wrap[self].concat args
80
+ end
81
+
82
+ @@callback_methods_to_wrap = Hash.new {|h,k| h[k] = []}
83
+ def self.callback_methods_to_wrap
84
+ @@callback_methods_to_wrap[self]
85
+ end
86
+
87
+ @@callback_methods_wrapped = Hash.new {|h,k| h[k] = []}
88
+ def self.callback_methods_wrapped
89
+ @@callback_methods_wrapped[self]
90
+ end
91
+
92
+ @@wrapped_methods = Hash.new {|h,k| h[k] = []}
93
+ def self.wrapped_methods
94
+ @@wrapped_methods[self]
95
+ end
96
+
97
+ private
98
+
99
+ def self.new(*args)
100
+ super
101
+ end
102
+
103
+ def self.declared_method_list
104
+ public_instance_methods - Behavior.public_instance_methods
105
+ end
106
+
107
+ @@behavior_dependencies = Hash.new{|h,k| h[k] = []}
108
+ def self.dependencies
109
+ @@behavior_dependencies[self]
110
+ end
111
+
112
+ def self.add_dependency(behavior)
113
+ @@behavior_dependencies[self] << behavior
114
+ end
115
+
116
+ @@kind_of_behavior_dependencies = Hash.new{|h,k| h[k] = []}
117
+ def self.kind_of_dependencies
118
+ @@kind_of_behavior_dependencies[self]
119
+ end
120
+
121
+ def self.add_kind_of_dependency(behavior)
122
+ @@kind_of_behavior_dependencies[self] << behavior
123
+ end
124
+
125
+ def initialize(target)
126
+ @target = target
127
+ @dependant_behaviors = []
128
+ @reference_count = 0
129
+
130
+ self.class.dependencies.each do |dependant_behavior|
131
+ begin
132
+ dependant_behavior_class = Object.const_get(dependant_behavior)
133
+ rescue NameError
134
+ raise "Cannot load dependant behavior '#{dependant_behavior}' in behavior '#{self.class}'"
135
+ end
136
+ unless @target.kind_of? dependant_behavior_class
137
+ @target.add_behavior dependant_behavior_class.to_s
138
+ @dependant_behaviors << dependant_behavior
139
+ end
140
+ end
141
+
142
+ #TODO: Move this to GameObject
143
+ behavior_list = @target.send(:instance_variable_get, :@__behaviors)
144
+ return unless behavior_list[self.class.name.to_sym].nil?
145
+ behavior_list[self.class.name.to_sym] = self
146
+
147
+ # self.class.kind_of_dependencies.each do |dependant_behavior|
148
+ # dependency = dependant_behavior.constantize
149
+ # next if behavior_list.find {|behavior| behavior.last.kind_of?(dependency)}
150
+ #
151
+ # raise "Dependant behavior '#{dependant_behavior}' was not found on class #{self.class}"
152
+ # end
153
+
154
+ self.class.declared_method_list.each do |method|
155
+ #TODO: Tell us which behavior is being overridden
156
+ #TODO: Allow for overriding
157
+ raise MethodExistsError.new("Error while adding the behavior #{self.class}. The method #{method} already exists on game object #{@target}.") if @target.respond_to? method
158
+ if method.to_s =~ /=/
159
+ code = <<-ENDL
160
+ def #{method}(arg)
161
+ @__behaviors[:#{self.class}].#{method}(arg)
162
+ end
163
+ ENDL
164
+ else
165
+ code = <<-ENDL
166
+ def #{method}(*args, &blk)
167
+ @__behaviors[:#{self.class}].#{method}(*args, &blk)
168
+ end
169
+ ENDL
170
+ end
171
+ @target.send(:instance_eval, code, __FILE__, __LINE__)
172
+ end
173
+
174
+ self.class.wrapped_methods.each do |method|
175
+ @target.enable_listeners_for method
176
+ end
177
+
178
+ load
179
+ end
180
+
181
+ def delete
182
+ return if @deleted
183
+ unload
184
+ __remove_listeners
185
+ self.class.declared_method_list.each do |method_name|
186
+ target_class = class <<@target; self; end
187
+ target_class.send(:remove_method, method_name)
188
+ end
189
+ #TODO: Make sure we don't delete dependent behaviors that still have depending behaviors
190
+ @dependant_behaviors.each do |dependant|
191
+ @target.remove_behavior dependant
192
+ end
193
+ @deleted = true
194
+ end
195
+
196
+ public
197
+
198
+ def set_event_aliases(mappings, block)
199
+ if mappings.kind_of? Hash
200
+ mappings.each do |event, event_alias|
201
+ @target.handle_event(event_alias) do |message|
202
+ send(event, message)
203
+ end
204
+ end
205
+ else mappings.kind_of? Symbol
206
+ @target.handle_event(mappings) do |message|
207
+ message = message.dup
208
+ send(block.call(message), message)
209
+ end
210
+ end
211
+ end
212
+
213
+ def add_reference_count
214
+ @reference_count += 1
215
+ end
216
+
217
+ def remove_reference_count
218
+ @reference_count -= 1
219
+ end
220
+
221
+ def load; end
222
+ def unload; end
223
+ end
224
+
225
+ class CallbackStatus
226
+ def continue?
227
+ true
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,23 @@
1
+ #TODO: This appears to be un-used. Use it or drop it.
2
+
3
+ module Gemini
4
+ class BehaviorEvent
5
+ def initialize(*args)
6
+ @memoizations = Hash.new { |h,k| h[k] = {} }
7
+ load(*args)
8
+ end
9
+
10
+ def load(*args); end
11
+
12
+ def self.method_added(name)
13
+ match = /^memoize_(.+)$/.match name.to_s
14
+ return unless match
15
+ public_name = match[1]
16
+ eval <<-ENDL
17
+ def #{public_name}(*args)
18
+ @memoizations[:#{public_name}][args] ||= #{name}
19
+ end
20
+ ENDL
21
+ end
22
+ end
23
+ end