essytas 0.0.1

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 (174) hide show
  1. data/LICENSE +19 -0
  2. data/README +3 -0
  3. data/Rakefile +44 -0
  4. data/bin/essytas +2 -0
  5. data/lib/animation.rb +74 -0
  6. data/lib/config.rb +63 -0
  7. data/lib/core.rb +242 -0
  8. data/lib/cursor.rb +43 -0
  9. data/lib/def/animations/explosion1.anim +103 -0
  10. data/lib/def/characters.def +132 -0
  11. data/lib/def/de/dialogues/test.dlg +4 -0
  12. data/lib/def/de/enemies.trans +6 -0
  13. data/lib/def/de/items.trans +84 -0
  14. data/lib/def/de/skills.trans +48 -0
  15. data/lib/def/de/spells.trans +31 -0
  16. data/lib/def/en/dialogues/test.dlg +4 -0
  17. data/lib/def/en/enemies.trans +6 -0
  18. data/lib/def/en/items.trans +78 -0
  19. data/lib/def/en/skills.trans +48 -0
  20. data/lib/def/en/spells.trans +31 -0
  21. data/lib/def/enemies.def +8 -0
  22. data/lib/def/enemies/wolf.bhv +11 -0
  23. data/lib/def/init.def +5 -0
  24. data/lib/def/items.def +153 -0
  25. data/lib/def/loot.def +2 -0
  26. data/lib/def/particles.def +66 -0
  27. data/lib/def/recipies.def +18 -0
  28. data/lib/def/skills.def +40 -0
  29. data/lib/def/spells.def +42 -0
  30. data/lib/def/spells.rb +16 -0
  31. data/lib/def/weapons.def +9 -0
  32. data/lib/ext/astar/AMap.rb +146 -0
  33. data/lib/ext/astar/node.rb +72 -0
  34. data/lib/ext/astar/priority_queue.rb +44 -0
  35. data/lib/ext/shader.rb +116 -0
  36. data/lib/game/alchemy/recipe.rb +26 -0
  37. data/lib/game/character.rb +102 -0
  38. data/lib/game/combat/bar.rb +119 -0
  39. data/lib/game/combat/battle.rb +345 -0
  40. data/lib/game/combat/control.rb +18 -0
  41. data/lib/game/combat/gui.rb +190 -0
  42. data/lib/game/combat/gui/select_item.rb +11 -0
  43. data/lib/game/combat/gui/select_spell.rb +38 -0
  44. data/lib/game/constitution.rb +48 -0
  45. data/lib/game/equipment.rb +34 -0
  46. data/lib/game/inventory.rb +37 -0
  47. data/lib/game/item.rb +54 -0
  48. data/lib/game/magic.rb +33 -0
  49. data/lib/game/map/events.rb +29 -0
  50. data/lib/game/map/fog.rb +41 -0
  51. data/lib/game/map/map.rb +247 -0
  52. data/lib/game/map/map_animation.rb +26 -0
  53. data/lib/game/map/map_loader.rb +177 -0
  54. data/lib/game/map/map_object.rb +208 -0
  55. data/lib/game/map/map_particle.rb +27 -0
  56. data/lib/game/map/player.rb +78 -0
  57. data/lib/game/map/tile.rb +35 -0
  58. data/lib/game/mind.rb +24 -0
  59. data/lib/game/npc/behaviour.rb +45 -0
  60. data/lib/game/npc/bubble.rb +28 -0
  61. data/lib/game/npc/goal.rb +93 -0
  62. data/lib/game/npc/npc.rb +95 -0
  63. data/lib/game/npc/task.rb +73 -0
  64. data/lib/game/osd/magic.rb +24 -0
  65. data/lib/game/party.rb +42 -0
  66. data/lib/game/skills.rb +64 -0
  67. data/lib/game/spell.rb +35 -0
  68. data/lib/game_window.rb +95 -0
  69. data/lib/glsl/contrast.frag +12 -0
  70. data/lib/glsl/fade.frag +11 -0
  71. data/lib/glsl/mezzotint.frag +20 -0
  72. data/lib/glsl/noise.frag +20 -0
  73. data/lib/glsl/pixelate.frag +42 -0
  74. data/lib/glsl/radialblur.frag +28 -0
  75. data/lib/glsl/sepia.frag +15 -0
  76. data/lib/glsl/shockwave.frag +24 -0
  77. data/lib/glsl/tv_screen.frag +17 -0
  78. data/lib/graphics/animations/credits.txt +1 -0
  79. data/lib/graphics/animations/explosion2.png +0 -0
  80. data/lib/graphics/backgrounds/white_ties_grass.png +0 -0
  81. data/lib/graphics/chars/ejera.png +0 -0
  82. data/lib/graphics/chars/salyjea.png +0 -0
  83. data/lib/graphics/chars/tharat.png +0 -0
  84. data/lib/graphics/combat/tharat.png +0 -0
  85. data/lib/graphics/cursors/normal.png +0 -0
  86. data/lib/graphics/fog/clouds1.png +0 -0
  87. data/lib/graphics/gui/bar_center.png +0 -0
  88. data/lib/graphics/gui/bar_left.png +0 -0
  89. data/lib/graphics/gui/bar_right.png +0 -0
  90. data/lib/graphics/gui/button_background.png +0 -0
  91. data/lib/graphics/gui/button_close.png +0 -0
  92. data/lib/graphics/gui/button_close_hi.png +0 -0
  93. data/lib/graphics/gui/button_highlight.png +0 -0
  94. data/lib/graphics/gui/charequip_background.png +0 -0
  95. data/lib/graphics/gui/charselect_background.png +0 -0
  96. data/lib/graphics/gui/container_background.png +0 -0
  97. data/lib/graphics/gui/drop_item.png +0 -0
  98. data/lib/graphics/gui/equip_Etarae.png +0 -0
  99. data/lib/graphics/gui/equip_Mensch.png +0 -0
  100. data/lib/graphics/gui/equipslot_background.png +0 -0
  101. data/lib/graphics/gui/iteminfo_background.png +0 -0
  102. data/lib/graphics/gui/msg_background.png +0 -0
  103. data/lib/graphics/gui/scrollbar_background.png +0 -0
  104. data/lib/graphics/gui/scroller.png +0 -0
  105. data/lib/graphics/gui/tile_32.png +0 -0
  106. data/lib/graphics/gui/tile_32_highlight.png +0 -0
  107. data/lib/graphics/icons/items/arrow.png +0 -0
  108. data/lib/graphics/icons/items/bandage.png +0 -0
  109. data/lib/graphics/icons/items/boots_leather.png +0 -0
  110. data/lib/graphics/icons/items/bow.png +0 -0
  111. data/lib/graphics/icons/items/credits.txt +8 -0
  112. data/lib/graphics/icons/items/harness_leather.png +0 -0
  113. data/lib/graphics/icons/items/knife.png +0 -0
  114. data/lib/graphics/icons/items/shirt_linen.png +0 -0
  115. data/lib/graphics/items/none.png +0 -0
  116. data/lib/graphics/menu/ingame_background.png +0 -0
  117. data/lib/graphics/menu/ingame_background.xcf +0 -0
  118. data/lib/graphics/menu/start_background.png +0 -0
  119. data/lib/graphics/missing.png +0 -0
  120. data/lib/graphics/osd/magic_bg.png +0 -0
  121. data/lib/graphics/particles/leaf.png +0 -0
  122. data/lib/graphics/particles/smoke.png +0 -0
  123. data/lib/graphics/pixel.png +0 -0
  124. data/lib/graphics/tiles/test.png +0 -0
  125. data/lib/gui/base.rb +278 -0
  126. data/lib/gui/button.rb +93 -0
  127. data/lib/gui/char_equip.rb +118 -0
  128. data/lib/gui/char_selector.rb +54 -0
  129. data/lib/gui/context_menu.rb +115 -0
  130. data/lib/gui/draggable.rb +18 -0
  131. data/lib/gui/grid.rb +118 -0
  132. data/lib/gui/image.rb +17 -0
  133. data/lib/gui/inventory.rb +42 -0
  134. data/lib/gui/item_info.rb +33 -0
  135. data/lib/gui/slider.rb +10 -0
  136. data/lib/gui/textfield.rb +57 -0
  137. data/lib/layer.rb +64 -0
  138. data/lib/load.rb +31 -0
  139. data/lib/main.rb +18 -0
  140. data/lib/maps/def/test.bhv +26 -0
  141. data/lib/maps/def/test.rb +14 -0
  142. data/lib/maps/test.tmx +133 -0
  143. data/lib/maps/test2.tmx +94 -0
  144. data/lib/maps/test3.tmx +29 -0
  145. data/lib/maps/test3_lower.tmx +25 -0
  146. data/lib/maps/test3_upper.tmx +25 -0
  147. data/lib/maps/test_left.tmx +25 -0
  148. data/lib/maps/test_upper.tmx +25 -0
  149. data/lib/music/Butterfly Tea - A New Hope 2K11.mp3 +0 -0
  150. data/lib/music/Greendjohn - Rebirth.mp3 +0 -0
  151. data/lib/music/credits.txt +8 -0
  152. data/lib/parse.rb +605 -0
  153. data/lib/parse_tmx.rb +114 -0
  154. data/lib/particles.rb +127 -0
  155. data/lib/sample.rb +29 -0
  156. data/lib/save.rb +44 -0
  157. data/lib/song.rb +41 -0
  158. data/lib/sounds/click1.wav +0 -0
  159. data/lib/sounds/credits.txt +2 -0
  160. data/lib/sounds/error1.wav +0 -0
  161. data/lib/sprite.rb +35 -0
  162. data/lib/states/menus.rb +17 -0
  163. data/lib/states/menus/alchemy.rb +53 -0
  164. data/lib/states/menus/equip.rb +79 -0
  165. data/lib/states/menus/ingame.rb +34 -0
  166. data/lib/states/menus/magic.rb +31 -0
  167. data/lib/states/menus/options.rb +54 -0
  168. data/lib/states/menus/start.rb +38 -0
  169. data/lib/states/states.rb +154 -0
  170. data/lib/tileset.rb +42 -0
  171. data/lib/tools/world.rb +103 -0
  172. data/lib/tools/worldmap_editor.rb +221 -0
  173. data/lib/translate.rb +368 -0
  174. metadata +255 -0
@@ -0,0 +1,12 @@
1
+ uniform sampler2D tex;
2
+ uniform float contrast;
3
+
4
+ void main(void)
5
+ {
6
+ vec4 color = texture2D(tex, gl_TexCoord[0].xy);
7
+
8
+ color = (color-0.5)*contrast + 0.5;
9
+
10
+ gl_FragColor.rgb = color.rgb;
11
+ gl_FragColor.a = 1.0;
12
+ }
@@ -0,0 +1,11 @@
1
+ uniform sampler2D texUnit0;
2
+
3
+ uniform float fade;
4
+
5
+ void main(void) {
6
+ vec4 color;
7
+
8
+ color = texture2D(texUnit0, gl_TexCoord[0].xy);
9
+
10
+ gl_FragColor = color * fade;
11
+ }
@@ -0,0 +1,20 @@
1
+ uniform sampler2D texUnit0;
2
+
3
+ uniform int t;
4
+
5
+ float rand(vec2 co) {
6
+ return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);
7
+ }
8
+
9
+ void main(void) {
10
+ vec4 color;
11
+
12
+ color = texture2D(texUnit0, gl_TexCoord[0].xy);
13
+
14
+ vec3 mezzo = vec3(0.0);
15
+ if(rand(gl_TexCoord[0].xy + float(t)/640.0) <= color.r) { mezzo.r = 1.0; }
16
+ if(rand(gl_TexCoord[0].xy + float(t)/640.0) <= color.g) { mezzo.g = 1.0; }
17
+ if(rand(gl_TexCoord[0].xy + float(t)/640.0) <= color.b) { mezzo.b = 1.0; }
18
+
19
+ gl_FragColor.rgb = mezzo;
20
+ }
@@ -0,0 +1,20 @@
1
+ uniform sampler2D texUnit0;
2
+
3
+ uniform float intensity;
4
+ uniform int t;
5
+
6
+ float rand(vec2 co) {
7
+ return fract(sin(dot(co.xy, vec2(12.9898, 78.233))) * 43758.5453);
8
+ }
9
+
10
+ void main(void) {
11
+ vec4 color;
12
+
13
+ color = texture2D(texUnit0, gl_TexCoord[0].xy);
14
+
15
+ vec4 influence = min(color, 1.0-color);
16
+
17
+ float noise = 1.0 - 2.0*rand(gl_TexCoord[0].xy + float(t)/640.0);
18
+
19
+ gl_FragColor = color + intensity*influence*noise;
20
+ }
@@ -0,0 +1,42 @@
1
+ #define KERNEL_SIZE 9
2
+
3
+ uniform int pixelSize;
4
+ uniform sampler2D tex;
5
+ uniform int width;
6
+ uniform int height;
7
+
8
+ vec2 texCoords[KERNEL_SIZE];
9
+
10
+ void main(void)
11
+ {
12
+ vec4 avgColor;
13
+ vec2 texCoordsStep = 1.0/(vec2(float(width),float(height))/float(pixelSize));
14
+ vec2 pixelBin = floor(gl_TexCoord[0].st/texCoordsStep);
15
+ vec2 inPixelStep = texCoordsStep/3.0;
16
+ vec2 inPixelHalfStep = inPixelStep/2.0;
17
+
18
+
19
+ texCoords[0] = vec2(inPixelHalfStep.x, inPixelStep.y*2.0 + inPixelHalfStep.y) + pixelBin * texCoordsStep;
20
+ texCoords[1] = vec2(inPixelStep.x + inPixelHalfStep.x, inPixelStep.y*2.0 + inPixelHalfStep.y) + pixelBin * texCoordsStep;
21
+ texCoords[2] = vec2(inPixelStep.x*2.0 + inPixelHalfStep.x, inPixelStep.y*2.0 + inPixelHalfStep.y) + pixelBin * texCoordsStep;
22
+ texCoords[3] = vec2(inPixelHalfStep.x, inPixelStep.y + inPixelHalfStep.y) + pixelBin * texCoordsStep;
23
+ texCoords[4] = vec2(inPixelStep.x + inPixelHalfStep.x, inPixelStep.y + inPixelHalfStep.y) + pixelBin * texCoordsStep;
24
+ texCoords[5] = vec2(inPixelStep.x*2.0 + inPixelHalfStep.x, inPixelStep.y + inPixelHalfStep.y) + pixelBin * texCoordsStep;
25
+ texCoords[6] = vec2(inPixelHalfStep.x, inPixelHalfStep.y) + pixelBin * texCoordsStep;
26
+ texCoords[7] = vec2(inPixelStep.x + inPixelHalfStep.x, inPixelHalfStep.y) + pixelBin * texCoordsStep;
27
+ texCoords[8] = vec2(inPixelStep.x*2.0 + inPixelHalfStep.x, inPixelHalfStep.y) + pixelBin * texCoordsStep;
28
+
29
+ avgColor = texture2D(tex, texCoords[0]) +
30
+ texture2D(tex, texCoords[1]) +
31
+ texture2D(tex, texCoords[2]) +
32
+ texture2D(tex, texCoords[3]) +
33
+ texture2D(tex, texCoords[4]) +
34
+ texture2D(tex, texCoords[5]) +
35
+ texture2D(tex, texCoords[6]) +
36
+ texture2D(tex, texCoords[7]) +
37
+ texture2D(tex, texCoords[8]);
38
+
39
+ avgColor /= float(KERNEL_SIZE);
40
+
41
+ gl_FragColor = avgColor;
42
+ }
@@ -0,0 +1,28 @@
1
+ uniform sampler2D Texture;
2
+
3
+ uniform float BlurFactor;
4
+ uniform float BrightFactor;
5
+
6
+ uniform float origin_x;
7
+ uniform float origin_y;
8
+
9
+ uniform int passes;
10
+
11
+ void main(void)
12
+ {
13
+ vec2 Origin = vec2(origin_x, 1.0 - origin_y);
14
+
15
+ vec2 TexCoord = vec2(gl_TexCoord[0].xy);
16
+
17
+ vec4 SumColor = vec4(0.0, 0.0, 0.0, 0.0);
18
+ TexCoord += vec2(1.0 / 1024.0, 1.0 / 768.0) * 0.5 - Origin;
19
+
20
+ for (int i = 0; i < passes; i++)
21
+ {
22
+ float scale = 1.0 - BlurFactor * (float(i) / float(passes - 1));
23
+ SumColor += texture2D(Texture, TexCoord * scale + Origin);
24
+ }
25
+
26
+ gl_FragColor = SumColor / float(passes) * BrightFactor;
27
+ //gl_FragColor = texture2D(Texture, gl_TexCoord[0].xy + vec2(0.1));
28
+ }
@@ -0,0 +1,15 @@
1
+ uniform sampler2D tex;
2
+
3
+ void main(void)
4
+ {
5
+ vec4 Sepia1 = vec4( 0.2, 0.05, 0.0, 1.0 );
6
+ vec4 Sepia2 = vec4( 1.0, 0.9, 0.5, 1.0 );
7
+
8
+ vec4 Color = texture2D(tex, vec2(gl_TexCoord[0]));
9
+
10
+ float SepiaMix = dot(vec3(0.3, 0.59, 0.11), vec3(Color));
11
+ Color = mix(Color, vec4(SepiaMix), vec4(0.5));
12
+ vec4 Sepia = mix(Sepia1, Sepia2, SepiaMix);
13
+
14
+ gl_FragColor = mix(Color, Sepia, 1.0);
15
+ }
@@ -0,0 +1,24 @@
1
+ uniform sampler2D tex;
2
+
3
+ uniform float x, y, min, max, ratio, refraction;
4
+
5
+ void main(void)
6
+ {
7
+ vec2 source_coords = gl_TexCoord[0].xy;
8
+ vec3 color = texture2D(tex, source_coords).rgb;
9
+
10
+ vec2 rel = source_coords - vec2(x,1.0-y);
11
+ rel.x *= ratio;
12
+
13
+ float dist = sqrt(rel.x*rel.x + rel.y*rel.y);
14
+ float inner = (dist - min)/(max - min);
15
+
16
+ if(dist >= min && dist <= max)
17
+ {
18
+ float depth = 0.5 + 0.5*cos((inner + 0.5) * 2.0 * 3.14159);
19
+ source_coords -= depth * rel/dist * refraction;
20
+ color = texture2D(tex, source_coords).rgb;
21
+ }
22
+
23
+ gl_FragColor.rgb = color;
24
+ }
@@ -0,0 +1,17 @@
1
+ uniform sampler2D texUnit0;
2
+
3
+ uniform float column_width;
4
+
5
+ void main(void)
6
+ {
7
+ vec3 color = texture2D(texUnit0, gl_TexCoord[0].xy).rgb;
8
+
9
+ float column_index = gl_TexCoord[0].x / column_width;
10
+ int ci = int(column_index);
11
+ while(ci >= 3) { ci -= 3; } // % doesn't seem to work
12
+
13
+ gl_FragColor.rgb = color * 0.125;
14
+ if(ci==0) { gl_FragColor.r = color.r; }
15
+ if(ci==1) { gl_FragColor.g = color.g; }
16
+ if(ci==2) { gl_FragColor.b = color.b; }
17
+ }
@@ -0,0 +1 @@
1
+ explosion2.png - http://opengameart.org/user/68 (http://opengameart.org/content/fire-spell-explosion)
@@ -0,0 +1,8 @@
1
+ == ails.deviantart.com
2
+ bow.png
3
+ bandage.png
4
+ knife.png (edited)
5
+ boots_leather.png
6
+ arrow.png
7
+ leather_harness.png
8
+ shirt_linen.png
Binary file
Binary file
@@ -0,0 +1,278 @@
1
+
2
+ # gui logic
3
+
4
+ module Core::GUI
5
+
6
+ class Window # make hash?
7
+ attr_reader :state, :x, :y, :w, :h, :close
8
+ # height includes titlebar
9
+ attr_accessor :xoff, :yoff, :zoff # completely unused, just used for windows in windows
10
+ attr_accessor :parent
11
+ def initialize(x, y, w, h, titlestr, close=true, bg=nil, move=false, z=-1)
12
+ @state = Core.window.state
13
+ @xoff = @yoff = @zoff = 0
14
+ if bg
15
+ @bg = Core.sprite(bg)
16
+ else
17
+ @bg = nil
18
+ end
19
+ @x, @y, @w, @h, @z = x, y, w, h, z
20
+ if @z < 0
21
+ @z = Core::GUI_Z
22
+ end
23
+ @elements = {}
24
+ @bar = [
25
+ Core.sprite("gui/bar_left", true),
26
+ Core.sprite("gui/bar_center", true),
27
+ Core.sprite("gui/bar_right", true)
28
+ ]
29
+ @titlefont = Core.font("arial", 24)
30
+ @title = titlestr
31
+ @tfw = @titlefont.text_width(@title)
32
+ @remove = false
33
+ if close
34
+ @close = ImageButton.new(@w-24, @y, "gui/button_close", lambda { @remove = true })
35
+ else
36
+ @close = nil
37
+ end
38
+ @move = move
39
+ @changed = false
40
+ @dragging = false
41
+ @parent = nil
42
+ @save_pos = false
43
+ end
44
+ def empty
45
+ @elements = {}
46
+ end
47
+ def include?(sym)
48
+ return get(sym) != nil
49
+ end
50
+ def [](sym)
51
+ return get(sym)
52
+ end
53
+ def get(sym)
54
+ return @elements[sym]
55
+ end
56
+ def close!
57
+ @remove = true
58
+ end
59
+ def remove?
60
+ return @remove
61
+ end
62
+ # Set the title
63
+ def title=(str)
64
+ @title = str
65
+ @tfw = @titlefont.text_width(@title)
66
+ end
67
+ # Add an element
68
+ def add(name, el)
69
+ @elements.store(name, el)
70
+ end
71
+
72
+ # Enable position saving
73
+ def save_pos(xsym, ysym)
74
+ @xsym, @ysym = xsym, ysym
75
+ @save_pos = true
76
+ end
77
+
78
+ def update
79
+ @elements.each_value { |el|
80
+ el.update
81
+ if el.remove?
82
+ @elements.delete(@elements.key(el))
83
+ end
84
+ }
85
+ if @close
86
+ @close.x, @close.y, @close.zoff = @x+@w-24, @y, @zoff
87
+ @close.update
88
+ end
89
+ if @move
90
+ m = [Core.window.mouse_x, Core.window.mouse_y]
91
+ if Core.inside?(m.x, m.y, @x, @y, @x+@w-24, @y+24) or @dragging
92
+ if Core.window.button_down?(Gosu::MsLeft)
93
+ if !@dragging
94
+ @dragging = true
95
+ @dragx = m.x - @x
96
+ @dragy = m.y - @y
97
+ else
98
+ @x = m.x - @dragx
99
+ @y = m.y - @dragy
100
+ end
101
+ else
102
+ @dragging = false
103
+ end
104
+ end
105
+ end
106
+ if @dragging
107
+ if @x > 1024 - @w
108
+ @x = 1024 - @w
109
+ elsif @x < 0
110
+ @x = 0
111
+ end
112
+ if @y > 744
113
+ @y = 744
114
+ elsif @y < 0
115
+ @y = 0
116
+ end
117
+ end
118
+ if @save_pos
119
+ Core.config[@xsym] = @x
120
+ Core.config[@ysym] = @y
121
+ end
122
+ end
123
+
124
+ def draw
125
+ @bg.draw(@x, @y+24, @z, @w/@bg.width.to_f, @h/@bg.height.to_f) if @bg
126
+ @elements.each_value { |el|
127
+ el.xoff = @x
128
+ el.yoff = @y + 24 # titlebar
129
+ el.draw
130
+ }
131
+ @bar[0].draw(@x, @y, @z)
132
+ @bar[1].draw(@x+16, @y, @z, (@w-32)/@bar[1].width)
133
+ @bar[2].draw(@x+@w-16, @y, @z)
134
+ @titlefont.draw(@title, @x+(@w/2)-(@tfw/2), @y+1, @z+1, 1, 1, Gosu::Color::BLACK)
135
+ @close.draw if @close
136
+ end
137
+ end
138
+
139
+ class Element
140
+ attr_accessor :x, :y, :xoff, :yoff, :zoff, :w, :h
141
+ # x and y are relative to the windows topleft corner plus title bar
142
+ def initialize(x, y, w, h)
143
+ @remove = false
144
+ @xoff = @yoff = @zoff = 0
145
+ @x, @y, @w, @h = x, y, w, h
146
+ end
147
+ def update
148
+ end
149
+ def draw
150
+ end
151
+ def remove?
152
+ return @remove
153
+ end
154
+ end
155
+
156
+ # scrollable
157
+ class Container < Element
158
+ attr_reader :ch
159
+ # ch = content element height
160
+ def initialize(x, y, w, h, ch)
161
+ super(x, y, w, h)
162
+ @bg = Core.sprite("gui/container_background")
163
+ @scrollbar = Scrollbar.new(x+w-24, y, 24, h)
164
+ @ch = ch
165
+ @items = []
166
+ @item = nil
167
+ @changed = false
168
+ end
169
+
170
+ def add(element)
171
+ element.x = @x
172
+ element.y = @y + @yoff + ((@items.size+1)*@ch)
173
+ @items.push(element)
174
+ end
175
+
176
+ def hovered
177
+ i = 0
178
+ @items.each { |it|
179
+ if it.hovered?
180
+ return i
181
+ end
182
+ i += 1
183
+ }
184
+ return -1
185
+ end
186
+
187
+ def update
188
+ # TODO scrollbar probably doesnt work
189
+ @scrollbar.update
190
+ @scrollbar.xoff, @scrollbar.yoff, @scrollbar.zoff = @xoff, @yoff, @zoff
191
+ offset = @scrollbar.offset * -@ch
192
+ @items.each { |item|
193
+ item.xoff, item.zoff = @xoff, @zoff
194
+ item.yoff = @yoff# + (offset/@ch) - @ch
195
+ if item.y + item.yoff + item.h < @scrollbar.y + @scrollbar.yoff
196
+ next
197
+ end
198
+ item.update
199
+ }
200
+ end
201
+
202
+ def draw
203
+ @scrollbar.draw
204
+ @bg.draw(@x+@xoff, @y+@yoff, Core::GUI_Z, (@w-24)/@bg.width.to_f, @h/@bg.height.to_f)
205
+ @items.each { |item|
206
+ if item.y + item.yoff + item.h < @scrollbar.y + @scrollbar.yoff
207
+ next
208
+ end
209
+ item.draw
210
+ }
211
+ end
212
+
213
+ def selected
214
+ return @item
215
+ end
216
+
217
+ def changed?
218
+ if @changed
219
+ @changed = false
220
+ return true
221
+ else
222
+ return false
223
+ end
224
+ end
225
+
226
+ private
227
+
228
+ def clicked(item)
229
+ @changed = true
230
+ @item = item
231
+ end
232
+
233
+ end
234
+
235
+ class Scrollbar < Element
236
+ include Gosu
237
+ attr_accessor :sh
238
+ attr_reader :h
239
+ def initialize(x, y, w, h)
240
+ super
241
+ @bg = Core.sprite("gui/scrollbar_background")
242
+ @scroller = Core.sprite("gui/scroller")
243
+ @held = false
244
+ @sy = @y
245
+ @sh = 48
246
+ end
247
+ def offset
248
+ return ((@sy-@y)/((@y)-(@y+@h-@sh)+1))*-100
249
+ end
250
+ def update
251
+ x = Core.window.mouse_x
252
+ y = Core.window.mouse_y
253
+ if Core.inside?(x, y, @x, @sy, @x+@w, @sy+@sh) and Core.window.button_down?(MsLeft) and !@held
254
+ @held = true
255
+ @offset = @sy-y
256
+ end
257
+ if @held
258
+ @sy = y + @offset
259
+ if @sy < @y
260
+ @sy = @y
261
+ elsif @sy+@sh > @y+@h
262
+ @sy = @y+@h-@sh-1
263
+ end
264
+ if !Core.window.button_down?(MsLeft)
265
+ @held = false
266
+ end
267
+ end
268
+ end
269
+ def draw
270
+ @bg.draw(@x+@xoff, @y+@yoff, Core::GUI_Z + 14, @w/@bg.width, @h/@bg.height.to_f)
271
+ @scroller.draw(@x+@xoff, @sy+@yoff, Core::GUI_Z + 15, 1, @sh/@scroller.height.to_f)
272
+ end
273
+ end
274
+
275
+ end
276
+
277
+ require_relative "button.rb"
278
+ require_relative "context_menu.rb"