clean some stuff, fix some bugs
[exterlulz-kokomonds.git] / src / Gem.m
blob625812e3f43429ef76037d3feb4d2ae6795b9308
1 /* ----====----====----====----====----====----====----====----====----====----
2  Gem.m (jeweltoy)
3  
4  JewelToy is a simple game played against the clock.
5  Copyright (C) 2001  Giles Williams
6  
7  This program is free software; you can redistribute it and/or
8  modify it under the terms of the GNU General Public License
9  as published by the Free Software Foundation; either version 2
10  of the License, or (at your option) any later version.
12  This program is distributed in the hope that it will be useful,
13  but WITHOUT ANY WARRANTY; without even the implied warranty of
14  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  GNU General Public License for more details.
17  You should have received a copy of the GNU General Public License
18  along with this program; if not, write to the Free Software
19  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
20  ----====----====----====----====----====----====----====----====----====---- */
22 /* kokomonds is a fork of JewelToy.
23  * repository: http://github.com/exterlulz/kokomonds
24  */
26 // TODO: clean
28 #import "Gem.h"
30 // Open GL
31 #import "OpenGLSprite.h"
34 @implementation Gem
36 - (id)  init
38   self = [super init];
39   [self setSoundsTink:[NSSound soundNamed:@"tink"] Sploink:[NSSound soundNamed:@"sploink"]];
40   // MW...
41   waitForFall= 0;
42   //
43   return self;
46 - (void) dealloc
48   [super dealloc];
51 + (Gem *) gemWithNumber:(int) d andImage:(NSImage *)img
53   Gem   *result = [[[Gem alloc] init] autorelease];
54   [result setGemType:d];
55   [result setImage:img];
56   [result setSoundsTink:[NSSound soundNamed:@"tink"] Sploink:[NSSound soundNamed:@"sploink"]];
57   return result;
60 + (Gem *) gemWithNumber:(int) d andSprite:(OpenGLSprite *)aSprite
62   Gem   *result = [[[Gem alloc] init] autorelease];
63   [result setGemType:d];
64   [result setSprite:aSprite];
65   [result setSoundsTink:[NSSound soundNamed:@"tink"] Sploink:[NSSound soundNamed:@"sploink"]];
66   return result;
69 - (int) animate
71   if (state == GEMSTATE_RESTING)
72   {
73     [self setPositionOnScreen:positionOnBoard.x*48:positionOnBoard.y*48];
74     animationCounter = 0;
75   }
76   if (state == GEMSTATE_FADING)
77   {
78     [self setPositionOnScreen:positionOnBoard.x*48:positionOnBoard.y*48];
79     if (animationCounter > 0)   animationCounter--;
80   }
81   // MW...
82   if (state== GEMSTATE_SHIVERING) {
83     positionOnScreen.x= positionOnBoard.x*48+(rand()%3)-1;
84     positionOnScreen.y= positionOnBoard.y*48;
85   }
86   //
87   if (state == GEMSTATE_FALLING)
88   {
89     if (animationCounter<waitForFall) {
90       positionOnScreen.x= positionOnBoard.x*48;
91       //positionOnScreen.y= positionOnBoard.y*48;
92       animationCounter++;
93     }
94     else if (positionOnScreen.y > (positionOnBoard.y*48))
95     {
96       positionOnScreen.y += vy;
97       positionOnScreen.x = positionOnBoard.x*48;
98       vy -= GRAVITY;
99       animationCounter++;
100     }
101     else
102     {
103                         [tink play];
104       positionOnScreen.y = positionOnBoard.y * 48;
105       state = GEMSTATE_RESTING;
106     }
107   }
108   if (state == GEMSTATE_SHAKING)
109   {
110     positionOnScreen.x = positionOnBoard.x*48+(rand()%5)-2;
111     positionOnScreen.y = positionOnBoard.y*48+(rand()%5)-2;
112     if (animationCounter > 1) animationCounter--;
113     else state = GEMSTATE_RESTING;
114   }
115   if (state == GEMSTATE_ERUPTING)
116   {
117     if (positionOnScreen.y > -48)
118     {
119       if (animationCounter < GEM_ERUPT_DELAY)
120       {
121         positionOnScreen.x = positionOnBoard.x*48+(rand()%5)-2;
122         positionOnScreen.y = positionOnBoard.y*48+(rand()%5)-2;
123       }
124       else
125       {
126         positionOnScreen.y += vy;
127         positionOnScreen.x += vx;
128         vy -= GRAVITY;
129       }
130       animationCounter++;
131     }
132     else
133     {
134       animationCounter = 0;
135     }
136   }
137   if (state == GEMSTATE_MOVING)
138   {
139     if (animationCounter > 0)
140     {
141       positionOnScreen.y += vy;
142       positionOnScreen.x += vx;
143       animationCounter--;
144     }
145     else        state = GEMSTATE_RESTING;
146   }
147   return animationCounter;
150 - (void) fade
152   [sploink play];
153   state = GEMSTATE_FADING;
154   animationCounter = FADE_STEPS;
156 - (void) fall
158   state = GEMSTATE_FALLING;
159   // MW...
160   waitForFall= rand()%6;
161   //
162   vx = 0;
163   vy = 0;
164   animationCounter = 1;
166 // MW...
167 - (void) shiver
169   state= GEMSTATE_SHIVERING;
170   animationCounter= 0;
173 - (void) shake
175   state = GEMSTATE_SHAKING;
176   animationCounter = 25;
178 - (void) erupt
180   [self setVelocity:(rand()%5)-2:(rand()%7)-2:1];
181   state = GEMSTATE_ERUPTING;
182   animationCounter = GEM_ERUPT_DELAY;
185 - (int) gemType
187   return gemType;
189 - (void) setGemType:(int) d
191   gemType = d;
194 - (NSImage *) image
196   return image;
198 - (void) setImage:(NSImage *) value
200   image = value;
202 - (void) drawImage
204   if (state == GEMSTATE_FADING)
205     [[self image] compositeToPoint:[self positionOnScreen] operation:NSCompositeSourceOver fraction:(animationCounter / FADE_STEPS)];
206   else
207     [[self image] compositeToPoint:[self positionOnScreen] operation:NSCompositeSourceOver];
210 - (OpenGLSprite *) sprite
212   return sprite;
214 - (void) setSprite:(OpenGLSprite *) value
216   sprite = value;
218 - (void) drawSprite
220   if (state == GEMSTATE_FADING)
221     [[self sprite] blitToX:positionOnScreen.x
222                          Y:positionOnScreen.y
223                          Z:GEM_SPRITE_Z
224                      Alpha:(animationCounter / FADE_STEPS)];
225   else
226     [[self sprite] blitToX:positionOnScreen.x
227                          Y:positionOnScreen.y
228                          Z:GEM_SPRITE_Z
229                      Alpha:1.0];
232 - (int) state
234   return state;
236 - (void) setState:(int) value
238   state = value;
241 - (int) animationCounter
243   return animationCounter;
245 - (void) setAnimationCounter:(int) value
247   animationCounter = value;
250 - (NSPoint) positionOnScreen
252   return positionOnScreen;
254 - (void) setPositionOnScreen:(int) valx :(int) valy
256   positionOnScreen.x = valx;
257   positionOnScreen.y = valy;
259 - (void) setVelocity:(int) valx :(int) valy :(int) steps
261   vx = valx;
262   vy = valy;
263   animationCounter = steps;
264   state = GEMSTATE_MOVING;
267 - (NSPoint) positionOnBoard
269   return positionOnBoard;
271 - (void) setPositionOnBoard:(int) valx :(int) valy
273   positionOnBoard.x = valx;
274   positionOnBoard.y = valy;
277 - (void) setSoundsTink:(NSSound *) tinkSound Sploink:(NSSound *) sploinkSound
279   tink = tinkSound;
280   sploink = sploinkSound;
283 @end