~ml-launchpad/ubuntu/natty/gcompris/fix-for-777349

« back to all changes in this revision

Viewing changes to src/hexagon-activity/hexagon.py

  • Committer: Bazaar Package Importer
  • Author(s): Marc Gariepy, Marc Gariepy, Stephane Graber
  • Date: 2010-01-04 17:42:49 UTC
  • mfrom: (1.1.14 upstream)
  • Revision ID: james.westby@ubuntu.com-20100104174249-7bupatd9dtxyhvs4
Tags: 9.0-0ubuntu1
[Marc Gariepy]
* New upstream release (9.0).
* Remove cache.c from POTFILES to avoid FTBFS
* Remove unneeded rm in debian/rules (file no longer exists upstream)

[Stephane Graber]
* Bump Debian standards to 3.8.3
* Add patch system (dpatch)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#  gcompris - Hexagon
 
2
#
 
3
# Copyright (C) 2004, 2008  Christof Petig and Ingo Konrad
 
4
#
 
5
#   This program is free software; you can redistribute it and/or modify
 
6
#   it under the terms of the GNU General Public License as published by
 
7
#   the Free Software Foundation; either version 3 of the License, or
 
8
#   (at your option) any later version.
 
9
#
 
10
#   This program is distributed in the hope that it will be useful,
 
11
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
#   GNU General Public License for more details.
 
14
#
 
15
#   You should have received a copy of the GNU General Public License
 
16
#   along with this program; if not, see <http://www.gnu.org/licenses/>.
 
17
#
 
18
import goocanvas
 
19
import gcompris
 
20
import gcompris.utils
 
21
import gcompris.bonus
 
22
import gcompris.skin
 
23
import gcompris.sound
 
24
import gtk
 
25
import gtk.gdk
 
26
import random
 
27
import math
 
28
 
 
29
class Gcompris_hexagon:
 
30
  """The hexagon activity"""
 
31
 
 
32
  def __init__(self, gcomprisBoard):
 
33
    self.gcomprisBoard = gcomprisBoard
 
34
    self.rootitem = None
 
35
 
 
36
    # These are used to let us restart only after the bonus is displayed.
 
37
    # When the bonus is displayed, it call us first with pause(1) and then with pause(0)
 
38
    self.board_paused  = 0;
 
39
    self.gamewon       = False;
 
40
 
 
41
 
 
42
  def start(self):
 
43
    self.gcomprisBoard.level=1
 
44
    self.gcomprisBoard.maxlevel=9
 
45
    self.gcomprisBoard.sublevel=1
 
46
    self.gcomprisBoard.number_of_sublevel=1
 
47
    gcompris.bar_set(gcompris.BAR_LEVEL)
 
48
    gcompris.set_default_background(self.gcomprisBoard.canvas.get_root_item())
 
49
    gcompris.bar_set_level(self.gcomprisBoard)
 
50
    self.set_level(1)
 
51
    self.game_start()
 
52
 
 
53
 
 
54
  def end(self):
 
55
    self.cleanup()
 
56
 
 
57
  def ok(self):
 
58
    pass
 
59
 
 
60
  def key_press(self, keyval, commit_str, preedit_str):
 
61
    return False
 
62
 
 
63
  # Called by gcompris core
 
64
  def pause(self, pause):
 
65
 
 
66
    self.board_paused = pause
 
67
 
 
68
    # When the bonus is displayed, it call us first with pause(1) and then with pause(0)
 
69
    # the game is won
 
70
    if(pause == 0 and self.gamewon):
 
71
      self.gamewon = 0
 
72
      self.set_level(self.gcomprisBoard.level)
 
73
      self.game_start()
 
74
 
 
75
    return
 
76
 
 
77
  # Called by gcompris when the user click on the level icon
 
78
  def set_level(self, level):
 
79
    self.gcomprisBoard.level=level
 
80
    self.gcomprisBoard.sublevel=1
 
81
    # Set the level in the control bar
 
82
    gcompris.bar_set_level(self.gcomprisBoard);
 
83
 
 
84
    if(self.gcomprisBoard.level == 1):
 
85
      self.r = 30
 
86
      self.nbx = 15
 
87
      self.nby = 10
 
88
    elif(self.gcomprisBoard.level == 2):
 
89
      self.r = 28
 
90
      self.nbx = 16
 
91
      self.nby = 10
 
92
    elif(self.gcomprisBoard.level == 3):
 
93
      self.r = 27
 
94
      self.nbx = 16
 
95
      self.nby = 11
 
96
    elif(self.gcomprisBoard.level == 4):
 
97
      self.r = 25
 
98
      self.nbx = 18
 
99
      self.nby = 12
 
100
    elif(self.gcomprisBoard.level == 5):
 
101
      self.r = 23
 
102
      self.nbx = 19
 
103
      self.nby = 13
 
104
    elif(self.gcomprisBoard.level == 6):
 
105
      self.r = 22
 
106
      self.nbx = 20
 
107
      self.nby = 13
 
108
    elif(self.gcomprisBoard.level == 7):
 
109
      self.r = 21
 
110
      self.nbx = 21
 
111
      self.nby = 14
 
112
    elif(self.gcomprisBoard.level == 8):
 
113
      self.r = 19
 
114
      self.nbx = 23
 
115
      self.nby = 15
 
116
    elif(self.gcomprisBoard.level == 9):
 
117
      self.r = 17
 
118
      self.nbx = 26
 
119
      self.nby = 17
 
120
 
 
121
    self.game_start()
 
122
 
 
123
 
 
124
  # ----------------------------------------------------------------------
 
125
  # ----------------------------------------------------------------------
 
126
  # ----------------------------------------------------------------------
 
127
 
 
128
  def game_start(self):
 
129
    self.cleanup()
 
130
    self.rootitem = goocanvas.Group(parent =  self.gcomprisBoard.canvas.get_root_item())
 
131
    self.paint_skin()
 
132
    self.random_catx = random.randrange(self.nbx)
 
133
    self.random_caty = random.randrange(self.nby)
 
134
 
 
135
  def cleanup(self):
 
136
    self.gamewon       = False;
 
137
    # Remove the root item removes all the others inside it
 
138
    if self.rootitem != None:
 
139
     self.rootitem.remove()
 
140
     self.rootitem = None
 
141
 
 
142
  def paint_hex(self, x, y, color=0x0099FFCCL):
 
143
    ax = 30+self.sqrt3*self.r*x
 
144
    ay = 30+1.5*self.r*y
 
145
 
 
146
    if y&1 :
 
147
     ax+=self.sqrt3/2*self.r
 
148
    pts = []
 
149
    for i in range (len(self.cx)):
 
150
     pts.append ((ax+self.cx [i], ay+self.cy [i]))
 
151
 
 
152
    s = goocanvas.Polyline (parent =  self.rootitem,
 
153
                            points = goocanvas.Points(pts),
 
154
                            close_path = True,
 
155
                            stroke_color = "black",
 
156
                            fill_color_rgba = color,
 
157
                            line_width = 2.5)
 
158
    return s
 
159
 
 
160
  def paint_skin(self):
 
161
    self.cx = []
 
162
    self.cy = []
 
163
    self.sqrt3 = math.sqrt(3)
 
164
    for i in range (6):
 
165
     self.cx.append(int(self.r*math.cos(math.pi/6+i*math.pi/3)))
 
166
     self.cy.append(int(self.r*math.sin(math.pi/6+i*math.pi/3)))
 
167
    for x in range (self.nbx):
 
168
     for y in range (self.nby):
 
169
      s = self.paint_hex(x, y)
 
170
 
 
171
      s.connect ("button_press_event", self.on_click, x-int(y/2), y)
 
172
 
 
173
  def coloring(self,dist):
 
174
    r=b=g=0
 
175
    if dist <0.25:
 
176
     r = 0xFF
 
177
     g = long(4*0xFF*dist)
 
178
    elif dist <0.5:
 
179
     g = 0xFF
 
180
     r = 0xFF-long(4*(dist-0.25)*0xFF)
 
181
    elif dist <0.75:
 
182
     g = 0xFF-long(4*(dist-0.5)*0xFF)
 
183
     b = long(0xFF*4*(dist-0.5))
 
184
    elif dist <=1:
 
185
     b = 0xFF
 
186
     r = long(0xFF*4*(dist-0.75))
 
187
    else :
 
188
     pass
 
189
    color = r*0x1000000+g*0x10000+b*0x100+0xFF
 
190
    return color
 
191
 
 
192
  def on_click (self, widget, target, event=None, x=0, y=0):
 
193
    if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1 :
 
194
 
 
195
      catdistance = self.distance_cat(x,y)
 
196
      #print self.random_catx, self.random_caty,x,y,catdistance
 
197
 
 
198
      if catdistance<0.1:
 
199
        gcompris.sound.play_ogg("sounds/smudge.wav")
 
200
 
 
201
        self.paint_cat()
 
202
        self.increment_level()
 
203
        self.gamewon = True;
 
204
        gcompris.bonus.display(gcompris.bonus.WIN, gcompris.bonus.GNU)
 
205
      else:
 
206
        gcompris.sound.play_ogg("sounds/bleep.wav")
 
207
 
 
208
        color = self.coloring (catdistance/30.0)
 
209
        widget.props.fill_color_rgba = color;
 
210
 
 
211
 
 
212
  def paint_cat(self):
 
213
    position = 19 + self.sqrt3 * self.r * self.random_catx
 
214
    if self.random_caty % 2:
 
215
     position += self.sqrt3/2 * self.r
 
216
    pixbuf2 = gcompris.utils.load_pixmap \
 
217
    ("hexagon/strawberry.svg")
 
218
    h2 = 30
 
219
    w2 = pixbuf2.get_width() * h2/pixbuf2.get_height()
 
220
    img = goocanvas.Image (parent = self.rootitem,
 
221
                           pixbuf = pixbuf2.scale_simple(w2, h2,
 
222
                                                  gtk.gdk.INTERP_BILINEAR),
 
223
                           x = position - 5,
 
224
                           y = 14+1.5*self.random_caty*self.r)
 
225
 
 
226
  def distance_cat (self,x,y):
 
227
    dx = self.random_catx-x-int(self.random_caty/2)
 
228
    dy = self.random_caty-y
 
229
 
 
230
    if dx*dy >=0:
 
231
     return abs(dx)+abs(dy)
 
232
    if dx*dy<0:
 
233
     return max(abs(dx),abs(dy))
 
234
 
 
235
  # Code that increments the sublevel and level
 
236
  # And bail out if no more levels are available
 
237
  # return 1 if continue, 0 if bail out
 
238
  def increment_level(self):
 
239
    self.gcomprisBoard.sublevel += 1
 
240
 
 
241
    if(self.gcomprisBoard.sublevel>self.gcomprisBoard.number_of_sublevel):
 
242
      # Try the next level
 
243
      self.gcomprisBoard.sublevel=1
 
244
      self.gcomprisBoard.level += 1
 
245
      if(self.gcomprisBoard.level > self.gcomprisBoard.maxlevel):
 
246
        self.gcomprisBoard.level = self.gcomprisBoard.maxlevel
 
247
 
 
248
    return 1