# Slune # Copyright (C) 2003 Jean-Baptiste LAMY # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA from __future__ import generators import time, random, math import soya, soya.widget as widget import py2play.level as py2p_level, py2play.action as action, py2play.character as character import slune.character as slune_character import slune.controler def init_bowling_game(level): pass def start_bowling_game(level, add_opponent1 = 1): from py2play.idler import IDLER bowling = Bowling(level, level["ball"], 3 - level.difficulty) IDLER.no_blackbands_group.insert(0, BowlingLabel(bowling)) def end_bowling_game(level): pass def GoBack(character): for i in range(20): if character.z >= 10.5: break p = soya.Point(character.level, 10.0, 0.5, 12.0) p.convert_to(character) if p.x < -4.0: x = 0.7 elif p.x > 4.0: x = -0.7 else: x = 0.0 if p.z > 0: y = 2.0 else: y = 0.0 yield slune_character.Action(slune_character.ACTION_WAIT, x, y) class Bowling(soya.Volume): def __init__(self, parent, ball, nb_extra_ball): soya.Volume.__init__(self, parent) self.ball = ball self.ball_fired = 0 self.nb_extra_ball = nb_extra_ball self.nb_quilles = 0 self.nb_balls_used = 1 self.ball_pos = ball.position() self.waiting = 0 def add_ball(self): self.nb_extra_ball -= 1 self.nb_balls_used += 1 ball = slune_character.Ball(self.parent) ball.name = "ball" ball.move(self.ball_pos) ball.set_shape(self.ball.shape) ball.radius = self.ball.radius ball.radius_y = self.ball.radius_y ball.weight = self.ball.weight self.parent.pushables.append(ball) self.ball = ball self.ball_fired = 0 def begin_round(self): from py2play.idler import IDLER level = self.parent for character in level.characters: if character.z < -15.0: IDLER.level_completed(character, 0) level.remove(self) self.nb_quilles = len([e for e in level if getattr(e, "name", None) == "quille"]) if self.waiting: self.waiting -= 1 if not self.waiting: if level.characters[0].z < 10.0: level.characters[0].controler.append(GoBack(level.characters[0])) self.waiting = 10 else: self.add_ball() elif not self.ball_fired: if self.ball.worth_playing: self.ball_fired = 1 else: for e in level: if hasattr(e, "name") and ((e.name == "ball") or (e.name == "quille")): if e.worth_playing and e.parent: break else: # Current ball is finished if self.nb_quilles: if self.nb_extra_ball: self.waiting = 1 else: IDLER.level_completed(character, 0) level.remove(self) else: # All quille are out ! if self.nb_balls_used == 1: IDLER.level_completed(character, 1, _("__bowling_winner_strike__")) else: IDLER.level_completed(character, 1) level.remove(self) class BowlingLabel(widget.Label): def __init__(self, bowling): self.bowling = bowling self.format = str(_("__bowlingformat__")) print self.format self.old_nb_balls = -1 self.old_nb_quilles = -1 widget.Label.__init__(self) self.left = 10 self.width = 700 self.height = 100 def resize(self, parent_left, parent_top, parent_width, parent_height): self.top = parent_top + soya.root_widget.height - 43 def widget_begin_round(self): if (self.old_nb_balls != self.bowling.nb_extra_ball) or (self.old_nb_quilles != self.bowling.nb_quilles): self.text = self.format % (self.bowling.nb_extra_ball, self.bowling.nb_quilles) self.old_nb_balls = self.bowling.nb_extra_ball self.old_nb_quilles = self.bowling.nb_quilles