Example #1
0
class ReadySequence(Sequence):
    def ready(self):
        self.scene.world = World(players=self.scene.num_players, timer=self.scene.timer)
        self.scene.navigations = []
        for player in self.scene.world.players:
            self.scene.navigations.append(Navigation(player))
        self.text.ainfo.index = 0
        self.scene.bgm.set_volume(0.7)
        self.start_sound = Sound("../resources/sound/start.wav")
        self.scene.timer.reset()
        self.scene.timer.update()
        self.ready_timer = Timer(settings.FPS*3)
        self.ready_timer.play()
    def update(self):
        self.ready_timer.tick()
        if self.ready_timer.now == settings.FPS*1:
            self.text.ainfo.index = 0
        elif self.ready_timer.now >= settings.FPS*2:
            self.text.ainfo.index = 1
            self.start_sound.play()
            self.scene.sequence_manager.change_scene('game')
            self.scene.sequence_manager.current_scene.text.x = settings.SCREENWIDTH/2-180
            self.scene.sequence_manager.current_scene.text.y = settings.SCREENHEIGHT/2-180
        
    def draw(self):
        rect = self.scene.world.draw()
        map(lambda n: n.draw(), self.scene.navigations)
        self.scene.timer.draw()
        self.text.draw()
        return rect
Example #2
0
 def disappear(self):
     if not self.name == 'bomb':
         disappear_sound = Sound(u'../resources/sound/disappear.wav')
         disappear_sound.play()
     for panel in self.panels: 
         panel.change_color()
         panel.unit = False
Example #3
0
 def ready(self):
     self.win = Animation(u"../resources/image/main/text/win.png", AnimationInfo(-1, 0, 1, 360, 225, 1))
     finish_sound = Sound("../resources/sound/finish.wav")
     finish_sound.play()
     self.win.animation_enable = False
     self.win.x = settings.SCREENWIDTH/2-180
     self.win.y = settings.SCREENHEIGHT/2-180
     self.text.ainfo.index = 3
     self.winner = self.scene.world.get_winner()
     self.result_timer = Timer(settings.FPS*2.5)
     self.result_timer.play()
Example #4
0
 def ready(self):
     self.scene.world = World(players=self.scene.num_players, timer=self.scene.timer)
     self.scene.navigations = []
     for player in self.scene.world.players:
         self.scene.navigations.append(Navigation(player))
     self.text.ainfo.index = 0
     self.scene.bgm.set_volume(0.7)
     self.start_sound = Sound("../resources/sound/start.wav")
     self.scene.timer.reset()
     self.scene.timer.update()
     self.ready_timer = Timer(settings.FPS*3)
     self.ready_timer.play()
Example #5
0
 def __init__(self, owner, world):
     u"""
         owner : この街を所持するプレイヤー
         world : Worldクラスインスタンス
     """
     self.owner = owner
     self.world = world
     self.levelup_sound = Sound("../resources/sound/levelup.wav")
     self.increase_sound = Sound("../resources/sound/increase.wav")
     self.population = 0
     self.level = 1
     self.buildings = []
     self.territories = []
     self.flow_timer = Timer(settings.FPS*settings.FLOW_POPULATION_YEAR)
     self.building_matrix = [[None for col in range(settings.STAGE_HEIGHT)] for row in range(settings.STAGE_WIDTH)] # 二次配列を生成してNoneで初期化
Example #6
0
 def __init__(self, owner, world):
     u"""
         owner : この街を所持するプレイヤー
         world : Worldクラスインスタンス
     """
     self.owner = owner
     self.world = world
     self.levelup_sound = Sound("../resources/sound/levelup.wav")
     self.increase_sound = Sound("../resources/sound/increase.wav")
     self.population = 0
     self.level = 1
     self.buildings = []
     self.territories = []
     self.flow_timer = Timer(settings.FPS * settings.FLOW_POPULATION_YEAR)
     self.building_matrix = [[None for col in range(settings.STAGE_HEIGHT)]
                             for row in range(settings.STAGE_WIDTH)
                             ]  # 二次配列を生成してNoneで初期化
Example #7
0
 def __init__(self, panels, stage):
     self.panels = panels
     self.stage = stage
     self.owner = panels[0].owner
     self.color = panels[0].color
     self.degree = LocalPoint(0, -1+self.owner*2)
     self.image = Animation(self.parameter['image'], AnimationInfo(self.owner,0,0,self.parameter['width'],self.parameter['height'],0))
     self.hp = self.parameter['hp']
     self.attack = self.parameter['attack']
     self.limit = self.parameter['limit']
     self.count = 0
     self.timer = Timer(self.parameter['frequency'])
     appear_sound = Sound(u'../resources/sound/appear.wav')
     appear_sound.play()
     self.image.x, self.image.y = (self.panels[0].point + LocalPoint(self.offset)).to_global().to_pos()
     self.delay = Timer()
     if self.parameter['effect']['enable'] and settings.EFFECTENABLE:
         ef = self.parameter['effect']
         Effect(ef['appear'], AnimationInfo(0,0,ef['frame'],ef['width'],ef['height'],1), x=self.image.x-ef['offset'][0], y=self.image.y-ef['offset'][1])
         self.delay.set(self.parameter['delay'])
     self.delay.play()
Example #8
0
 def ready(self, *args, **kwargs):
     super(MainMenuScene, self).ready()
     self.bgm = BGM(u'../resources/music/title.wav', -1)
     self.cursor_sound = Sound("../resources/sound/cursor.wav")
     self.decide_sound = Sound('../resources/sound/decide.wav')
     self.decide_timer = Timer(settings.FPS*2.5)
     self.num_joypads = JoyPad.get_num_joypads()
     self.joypads = [] 
     for i in xrange(0, self.num_joypads):
         self.joypads.append(JoyPad(i))
     self.background = Image(os.path.join(self.IMAGE_PATH, "background3.png"), alpha=False)
     self.logo = Image(os.path.join(self.IMAGE_PATH, "logo.png"))
     self.config = Image(os.path.join(self.IMAGE_PATH, "config.png"), alpha=False)
     self.exit = Image(os.path.join(self.IMAGE_PATH, "exit.png"), alpha=False)
     self.cursor = Image(os.path.join(self.IMAGE_PATH, "cursor.png"), alpha=True)
     self.cursor_threshold = [[0, 0], ] * self.num_joypads # ジョイスティックを倒したときに、axisがどれくらい倒れたかの総量
     self.cursor_move = [False] * self.num_joypads
     self.load_player_selection(self.num_joypads)
     self.logo.x = 280; self.logo.y = 20
     self.player2.x = 160; self.player2.y = 400
     self.player3.x = 380; self.player3.y = 400
     self.player4.x = 600; self.player4.y = 400
     self.config.x  = 380; self.config.y  = 460
     self.exit.x    = 600; self.exit.y    = 460
     # カーソル位置を初期化
     self.options = ((self.player2, self.player3, self.player4),
                     (None, self.config, self.exit))
     self.actions = ((lambda:self.start_game(2), # self.player2
                      lambda:self.start_game(3), # self.player3
                      lambda:self.start_game(4),)# self.player4
                    ,
                     (lambda:0, # None
                      lambda:Game.get_scene_manager().change_scene('keysetting'), #self.config
                      lambda:sys.exit()) # self.exit
                    )
     self.cursor_logical_x = 0;
     self.cursor_logical_y = 0;
     self.set_cursor_pos(0, 0)
     self.sprites.add(self.background)
     self.sprites.add(self.logo)
     self.sprites.add(self.player2)
     self.sprites.add(self.player3)
     self.sprites.add(self.player4)
     self.sprites.add(self.config)
     self.sprites.add(self.exit)
     self.sprites.add(self.cursor)
     
     self.last_press_key = [{}]
     for dummy in self.joypads:
         self.last_press_key.append({})
Example #9
0
class GameSequence(Sequence):
    def ready(self):
        self.text.ainfo.index = 1
        self.scene.bgm.set_volume(1)
        self.rotate_sound = Sound(u"../resources/sound/rotate.wav")
        self.attach_sound = Sound(u"../resources/sound/attach.wav")
        self.pause_sound = Sound(u"../resources/sound/pause.wav")
    def update(self):
        if self.text.y > -360:
            self.text.y -=30
        if self.scene.timer.is_over():
            self.scene.sequence_manager.change_scene('result')
        for player in self.scene.world.players:
            player.update()
            p = player.poll()
            u"""p=0のとき、何もしない、p=1のとき、右回転、p=2のとき設置、p=-1のとき左回転p=3のときポーズ"""
            if p == 3:
                self.pause_sound.play()
                self.scene.sequence_manager.change_scene('pause')
            elif p == 2:
                if self.scene.world.get_panel_on(player.point).can_attach_road():
                    self.scene.world.replace_panel(player.current_road)
                    self.attach_sound.play()
                    player.attach_road()
            elif p!=0:
                self.rotate_sound.play()
                player.current_road.rotate(p)
        self.scene.world.update()
        map(lambda n: n.update(), self.scene.navigations)
        self.scene.timer.update()
    def draw(self):
        rect = self.scene.world.draw()
        map(lambda n: n.draw(), self.scene.navigations)
        self.scene.timer.draw()
        if self.text.y > -360:
            self.text.draw()
        return rect
Example #10
0
 def ready(self):
     self.text.ainfo.index = 1
     self.scene.bgm.set_volume(1)
     self.rotate_sound = Sound(u"../resources/sound/rotate.wav")
     self.attach_sound = Sound(u"../resources/sound/attach.wav")
     self.pause_sound = Sound(u"../resources/sound/pause.wav")
Example #11
0
class City(object):
    u"""街クラス。人口や発展状況などを管理する"""    
    def __init__(self, owner, world):
        u"""
            owner : この街を所持するプレイヤー
            world : Worldクラスインスタンス
        """
        self.owner = owner
        self.world = world
        self.levelup_sound = Sound("../resources/sound/levelup.wav")
        self.increase_sound = Sound("../resources/sound/increase.wav")
        self.population = 0
        self.level = 1
        self.buildings = []
        self.territories = []
        self.flow_timer = Timer(settings.FPS*settings.FLOW_POPULATION_YEAR)
        self.building_matrix = [[None for col in range(settings.STAGE_HEIGHT)] for row in range(settings.STAGE_WIDTH)] # 二次配列を生成してNoneで初期化
        #self._constract_building(Laputa, 0, 0)
    def increase_population(self, p=None):
        u"""人口を増やす。その後、レベルアップの判定をする
            増える人口はレベルに依存する。 p*2^(lv-1)
        """
        self.flow_timer.reset()
        self.flow_timer.play()
        if not p:
            self.population += self._calc_population()
        else:
            self.population += p
        if self.level < 5 and settings.LEVELUP_BORDERLINES[self.level] < self.population:
            self.levelup_sound.play()
            self.level +=1
        else:
            self.increase_sound.play()
    def decrease_population(self, p):
        u"""
            p人人口を減らす
            実際に減った人数を返す
        """
        self.flow_timer.reset()
        self.flow_timer.play()
        if self.population < p:
            p = self.population
            self.population = 0
        else:
            self.population -= p
        return p
    def _pop_building(self):
        u"""ビルを建てる"""
        if self.population <= 0: return
        if random.randint(0, settings.BUILDING_POP_RATE) != 0: return
        buildings = LEVEL_BUILDINGS[self.level-1]
        if len(buildings) == 0: return
        if self.level <= 2:
            x = random.randint(0, 3)
            y = random.randint(0, 3)
        elif self.level <= 4:
            x, y = random.choice(((0, 0), (2, 0), (0, 2), (2, 2)))
        elif self.level == 5:
            x, y = (0, 0)
        if not self.building_matrix[x][y] or (self.building_matrix[x][y] and self.building_matrix[x][y].level != self.level):
                building = random.choice(buildings)
                self._constract_building(building, x, y)
    def _constract_building(self, cls, x, y):
        building = cls(self.root_point.x+x, self.root_point.y+y)
        for sx in xrange(x, x+building.size):
            for sy in xrange(y, y+building.size):
                self.building_matrix[sx][sy] = building
        self.buildings.append(building)
    
    def _calc_population(self):
        u"""レベルに応じた増減する人口を算出する"""
        p = random.randint(8000, 12000)
        return p*2**(self.level-1)
        
    def update(self):
        self.flow_timer.tick()
        if self.flow_timer.is_over() and self.population > 0:
            u"""人を流出させる"""
            bottom_territories = self._get_bottom_territories()
            for territory in bottom_territories:
                u"""最も手前にある領土の一覧を取ってきて、繋がっているかどうか調査する"""
                front = self.world.get_panel_from(territory, 2)
                if territory.is_connect_with(front):
                    self._flow_immigration(territory, front)
        self._pop_building()
        updated = []
        for x in xrange(0, 4):
            for y in xrange(0, 4):
                b = self.building_matrix[x][y]
                if b and not b in updated:
                    b.update()
                    updated.append(b)
    def draw(self):
        rendered = []
        for x in xrange(0, 4):
            for y in xrange(0, 4):
                b = self.building_matrix[x][y]
                if b and not b in rendered:
                    b.draw()
                    rendered.append(b)
    def _flow_immigration(self, territory, front):
        u"""移民を流出させる"""
        immigrant = self.world.i_manager.create_immigrant(territory.point.x, territory.point.y)
        p = self._calc_population()
        p = self.decrease_population(p)
        immigrant.population = p
        immigrant.direction = 2
        immigrant.ainfo.index = 2
        immigrant.current_ground = territory
        immigrant.x, immigrant.y = territory.surface_bottom_edge.to_pos()
        immigrant.goal_ground = front
        self.flow_timer.reset()
    def _get_bottom_territories(self):
        u"""領土最下層のTerritoryのみを取ってくる"""
        list = []
        for territory in self.territories:
            if territory.point.y == 3:
                list.append(territory)
        return list
    @property
    def root_point(self):
        u"""街の左上の座標を返す"""
        pc = self.world.player_count
        if pc == 1:
            return Vector(6, 0)
        elif pc == 2:
            return (Vector(2, 0), Vector(10, 0))[self.owner.number]
        elif pc == 3:
            return (Vector(1, 0), Vector(6, 0), Vector(11, 0))[self.owner.number]
        elif pc == 4:
            return Vector(self.owner.number*4, 0)
Example #12
0
class MainMenuScene(Scene):
    BACKGROUND = (255,255,255)
    CURSOR_BORDER = 10 # カーソルを表す画像が、選択肢を表す画像からどれだけずらして配置されるか
    IMAGE_PATH = r"../resources/image/menu"
    KEY_REPEAT_TIME = 0.2 # 何秒以内の間なら、キーが押され続けていても連打とみなさないか
    
    # 2Players, 3Players, 4Playersの画像を読み込む
    def load_player_selection(self, joypad_number):
        fail = ("" if joypad_number >= 2 else "x")
        self.player2 = Image(os.path.join(self.IMAGE_PATH, "player2%s.png" % fail), alpha=False)
        
        fail = ("" if joypad_number >= 3 else "x")
        self.player3 = Image(os.path.join(self.IMAGE_PATH, "player3%s.png" % fail), alpha=False)
        
        fail = ("" if joypad_number >= 4 else "x")
        self.player4 = Image(os.path.join(self.IMAGE_PATH, "player4%s.png" % fail), alpha=False)
    
    # カーソルをx方向にdir_x、y方向にdir_yだけ動かす
    def set_cursor_pos(self, dir_x, dir_y):
        target_option = False
        while not target_option:
            # y方向
            self.cursor_logical_y += dir_y
            if self.cursor_logical_y < 0:
                self.cursor_logical_y += len(self.options)
            if self.cursor_logical_y >= len(self.options):
                self.cursor_logical_y -= len(self.options)
            
            # x方向
            self.cursor_logical_x += dir_x
            if self.cursor_logical_x < 0:
                self.cursor_logical_x += len(self.options[self.cursor_logical_y])
            if self.cursor_logical_x >= len(self.options[self.cursor_logical_y]):
                self.cursor_logical_x -= len(self.options[self.cursor_logical_y])
            
            # 描画位置の計算
            target_option = self.options[self.cursor_logical_y][self.cursor_logical_x]
        self.cursor.x = target_option.x - self.CURSOR_BORDER
        self.cursor.y = target_option.y - self.CURSOR_BORDER
    # ゲームを始める
    def start_game(self, player_number):
        self.decide_timer.play()
        self.decide_sound.play()
        self.player_number = player_number
    def ready(self, *args, **kwargs):
        super(MainMenuScene, self).ready()
        self.bgm = BGM(u'../resources/music/title.wav', -1)
        self.cursor_sound = Sound("../resources/sound/cursor.wav")
        self.decide_sound = Sound('../resources/sound/decide.wav')
        self.decide_timer = Timer(settings.FPS*2.5)
        self.num_joypads = JoyPad.get_num_joypads()
        self.joypads = [] 
        for i in xrange(0, self.num_joypads):
            self.joypads.append(JoyPad(i))
        self.background = Image(os.path.join(self.IMAGE_PATH, "background3.png"), alpha=False)
        self.logo = Image(os.path.join(self.IMAGE_PATH, "logo.png"))
        self.config = Image(os.path.join(self.IMAGE_PATH, "config.png"), alpha=False)
        self.exit = Image(os.path.join(self.IMAGE_PATH, "exit.png"), alpha=False)
        self.cursor = Image(os.path.join(self.IMAGE_PATH, "cursor.png"), alpha=True)
        self.cursor_threshold = [[0, 0], ] * self.num_joypads # ジョイスティックを倒したときに、axisがどれくらい倒れたかの総量
        self.cursor_move = [False] * self.num_joypads
        self.load_player_selection(self.num_joypads)
        self.logo.x = 280; self.logo.y = 20
        self.player2.x = 160; self.player2.y = 400
        self.player3.x = 380; self.player3.y = 400
        self.player4.x = 600; self.player4.y = 400
        self.config.x  = 380; self.config.y  = 460
        self.exit.x    = 600; self.exit.y    = 460
        # カーソル位置を初期化
        self.options = ((self.player2, self.player3, self.player4),
                        (None, self.config, self.exit))
        self.actions = ((lambda:self.start_game(2), # self.player2
                         lambda:self.start_game(3), # self.player3
                         lambda:self.start_game(4),)# self.player4
                       ,
                        (lambda:0, # None
                         lambda:Game.get_scene_manager().change_scene('keysetting'), #self.config
                         lambda:sys.exit()) # self.exit
                       )
        self.cursor_logical_x = 0;
        self.cursor_logical_y = 0;
        self.set_cursor_pos(0, 0)
        self.sprites.add(self.background)
        self.sprites.add(self.logo)
        self.sprites.add(self.player2)
        self.sprites.add(self.player3)
        self.sprites.add(self.player4)
        self.sprites.add(self.config)
        self.sprites.add(self.exit)
        self.sprites.add(self.cursor)
        
        self.last_press_key = [{}]
        for dummy in self.joypads:
            self.last_press_key.append({})
    
    def update(self):
        self.decide_timer.tick()
        if self.decide_timer.is_over():
            Game.get_scene_manager().change_scene('game', players=self.player_number)
            self.bgm.fadeout(100)
        if self.decide_timer.is_active(): return
        self.bgm.play()
        for id, joypad in enumerate(self.joypads):
            xaxis = joypad.get_axis(0)
            yaxis = joypad.get_axis(1)
            length = sum(map(lambda x: x*x, list(self.cursor_threshold[id])))
            if abs(xaxis) > 0.5:
                self.cursor_threshold[id][0] += xaxis
                if not self.cursor_move[id] or abs(length) > 16:
                    self.cursor_sound.play()
                    self.set_cursor_pos(1 if xaxis > 0 else - 1, 0)
            if abs(yaxis) > 0.5:
                self.cursor_threshold[id][1] += yaxis
                if not self.cursor_move[id] or abs(length) > 16:
                    self.cursor_sound.play()
                    self.set_cursor_pos(0, 1 if yaxis > 0 else - 1)
            if abs(xaxis) > 0.5 or abs(yaxis) > 0.5:
                self.cursor_move[id] = True
            else:
                self.cursor_move[id] = False
            self.cursor_threshold[id] = [0, 0]
            if joypad.is_press(11):
                self.actions[self.cursor_logical_y][self.cursor_logical_x]()
Example #13
0
    def ready(self, *args, **kwargs):
        super(MainMenuScene, self).ready()
        self.bgm = BGM(u'../resources/music/title.wav', -1)
        self.cursor_sound = Sound("../resources/sound/cursor.wav")
        self.decide_sound = Sound('../resources/sound/decide.wav')
        self.decide_timer = Timer(settings.FPS * 2.5)
        self.num_joypads = JoyPad.get_num_joypads()
        self.joypads = []
        for i in xrange(0, self.num_joypads):
            self.joypads.append(JoyPad(i))
        self.background = Image(os.path.join(self.IMAGE_PATH,
                                             "background3.png"),
                                alpha=False)
        self.logo = Image(os.path.join(self.IMAGE_PATH, "logo.png"))
        self.config = Image(os.path.join(self.IMAGE_PATH, "config.png"),
                            alpha=False)
        self.exit = Image(os.path.join(self.IMAGE_PATH, "exit.png"),
                          alpha=False)
        self.cursor = Image(os.path.join(self.IMAGE_PATH, "cursor.png"),
                            alpha=True)
        self.cursor_threshold = [
            [0, 0],
        ] * self.num_joypads  # ジョイスティックを倒したときに、axisがどれくらい倒れたかの総量
        self.cursor_move = [False] * self.num_joypads
        self.load_player_selection(self.num_joypads)
        self.logo.x = 280
        self.logo.y = 20
        self.player2.x = 160
        self.player2.y = 400
        self.player3.x = 380
        self.player3.y = 400
        self.player4.x = 600
        self.player4.y = 400
        self.config.x = 380
        self.config.y = 460
        self.exit.x = 600
        self.exit.y = 460
        # カーソル位置を初期化
        self.options = ((self.player2, self.player3, self.player4),
                        (None, self.config, self.exit))
        self.actions = (
            (
                lambda: self.start_game(2),  # self.player2
                lambda: self.start_game(3),  # self.player3
                lambda: self.start_game(4),
            )  # self.player4
            ,
            (
                lambda: 0,  # None
                lambda: Game.get_scene_manager().change_scene('keysetting'
                                                              ),  #self.config
                lambda: sys.exit())  # self.exit
        )
        self.cursor_logical_x = 0
        self.cursor_logical_y = 0
        self.set_cursor_pos(0, 0)
        self.sprites.add(self.background)
        self.sprites.add(self.logo)
        self.sprites.add(self.player2)
        self.sprites.add(self.player3)
        self.sprites.add(self.player4)
        self.sprites.add(self.config)
        self.sprites.add(self.exit)
        self.sprites.add(self.cursor)

        self.last_press_key = [{}]
        for dummy in self.joypads:
            self.last_press_key.append({})
Example #14
0
class MainMenuScene(Scene):
    BACKGROUND = (255, 255, 255)
    CURSOR_BORDER = 10  # カーソルを表す画像が、選択肢を表す画像からどれだけずらして配置されるか
    IMAGE_PATH = r"../resources/image/menu"
    KEY_REPEAT_TIME = 0.2  # 何秒以内の間なら、キーが押され続けていても連打とみなさないか

    # 2Players, 3Players, 4Playersの画像を読み込む
    def load_player_selection(self, joypad_number):
        fail = ("" if joypad_number >= 2 else "x")
        self.player2 = Image(os.path.join(self.IMAGE_PATH,
                                          "player2%s.png" % fail),
                             alpha=False)

        fail = ("" if joypad_number >= 3 else "x")
        self.player3 = Image(os.path.join(self.IMAGE_PATH,
                                          "player3%s.png" % fail),
                             alpha=False)

        fail = ("" if joypad_number >= 4 else "x")
        self.player4 = Image(os.path.join(self.IMAGE_PATH,
                                          "player4%s.png" % fail),
                             alpha=False)

    # カーソルをx方向にdir_x、y方向にdir_yだけ動かす
    def set_cursor_pos(self, dir_x, dir_y):
        target_option = False
        while not target_option:
            # y方向
            self.cursor_logical_y += dir_y
            if self.cursor_logical_y < 0:
                self.cursor_logical_y += len(self.options)
            if self.cursor_logical_y >= len(self.options):
                self.cursor_logical_y -= len(self.options)

            # x方向
            self.cursor_logical_x += dir_x
            if self.cursor_logical_x < 0:
                self.cursor_logical_x += len(
                    self.options[self.cursor_logical_y])
            if self.cursor_logical_x >= len(
                    self.options[self.cursor_logical_y]):
                self.cursor_logical_x -= len(
                    self.options[self.cursor_logical_y])

            # 描画位置の計算
            target_option = self.options[self.cursor_logical_y][
                self.cursor_logical_x]
        self.cursor.x = target_option.x - self.CURSOR_BORDER
        self.cursor.y = target_option.y - self.CURSOR_BORDER

    # ゲームを始める
    def start_game(self, player_number):
        self.decide_timer.play()
        self.decide_sound.play()
        self.player_number = player_number

    def ready(self, *args, **kwargs):
        super(MainMenuScene, self).ready()
        self.bgm = BGM(u'../resources/music/title.wav', -1)
        self.cursor_sound = Sound("../resources/sound/cursor.wav")
        self.decide_sound = Sound('../resources/sound/decide.wav')
        self.decide_timer = Timer(settings.FPS * 2.5)
        self.num_joypads = JoyPad.get_num_joypads()
        self.joypads = []
        for i in xrange(0, self.num_joypads):
            self.joypads.append(JoyPad(i))
        self.background = Image(os.path.join(self.IMAGE_PATH,
                                             "background3.png"),
                                alpha=False)
        self.logo = Image(os.path.join(self.IMAGE_PATH, "logo.png"))
        self.config = Image(os.path.join(self.IMAGE_PATH, "config.png"),
                            alpha=False)
        self.exit = Image(os.path.join(self.IMAGE_PATH, "exit.png"),
                          alpha=False)
        self.cursor = Image(os.path.join(self.IMAGE_PATH, "cursor.png"),
                            alpha=True)
        self.cursor_threshold = [
            [0, 0],
        ] * self.num_joypads  # ジョイスティックを倒したときに、axisがどれくらい倒れたかの総量
        self.cursor_move = [False] * self.num_joypads
        self.load_player_selection(self.num_joypads)
        self.logo.x = 280
        self.logo.y = 20
        self.player2.x = 160
        self.player2.y = 400
        self.player3.x = 380
        self.player3.y = 400
        self.player4.x = 600
        self.player4.y = 400
        self.config.x = 380
        self.config.y = 460
        self.exit.x = 600
        self.exit.y = 460
        # カーソル位置を初期化
        self.options = ((self.player2, self.player3, self.player4),
                        (None, self.config, self.exit))
        self.actions = (
            (
                lambda: self.start_game(2),  # self.player2
                lambda: self.start_game(3),  # self.player3
                lambda: self.start_game(4),
            )  # self.player4
            ,
            (
                lambda: 0,  # None
                lambda: Game.get_scene_manager().change_scene('keysetting'
                                                              ),  #self.config
                lambda: sys.exit())  # self.exit
        )
        self.cursor_logical_x = 0
        self.cursor_logical_y = 0
        self.set_cursor_pos(0, 0)
        self.sprites.add(self.background)
        self.sprites.add(self.logo)
        self.sprites.add(self.player2)
        self.sprites.add(self.player3)
        self.sprites.add(self.player4)
        self.sprites.add(self.config)
        self.sprites.add(self.exit)
        self.sprites.add(self.cursor)

        self.last_press_key = [{}]
        for dummy in self.joypads:
            self.last_press_key.append({})

    def update(self):
        self.decide_timer.tick()
        if self.decide_timer.is_over():
            Game.get_scene_manager().change_scene('game',
                                                  players=self.player_number)
            self.bgm.fadeout(100)
        if self.decide_timer.is_active(): return
        self.bgm.play()
        for id, joypad in enumerate(self.joypads):
            xaxis = joypad.get_axis(0)
            yaxis = joypad.get_axis(1)
            length = sum(map(lambda x: x * x, list(self.cursor_threshold[id])))
            if abs(xaxis) > 0.5:
                self.cursor_threshold[id][0] += xaxis
                if not self.cursor_move[id] or abs(length) > 16:
                    self.cursor_sound.play()
                    self.set_cursor_pos(1 if xaxis > 0 else -1, 0)
            if abs(yaxis) > 0.5:
                self.cursor_threshold[id][1] += yaxis
                if not self.cursor_move[id] or abs(length) > 16:
                    self.cursor_sound.play()
                    self.set_cursor_pos(0, 1 if yaxis > 0 else -1)
            if abs(xaxis) > 0.5 or abs(yaxis) > 0.5:
                self.cursor_move[id] = True
            else:
                self.cursor_move[id] = False
            self.cursor_threshold[id] = [0, 0]
            if joypad.is_press(11):
                self.actions[self.cursor_logical_y][self.cursor_logical_x]()
Example #15
0
class City(object):
    u"""街クラス。人口や発展状況などを管理する"""
    def __init__(self, owner, world):
        u"""
            owner : この街を所持するプレイヤー
            world : Worldクラスインスタンス
        """
        self.owner = owner
        self.world = world
        self.levelup_sound = Sound("../resources/sound/levelup.wav")
        self.increase_sound = Sound("../resources/sound/increase.wav")
        self.population = 0
        self.level = 1
        self.buildings = []
        self.territories = []
        self.flow_timer = Timer(settings.FPS * settings.FLOW_POPULATION_YEAR)
        self.building_matrix = [[None for col in range(settings.STAGE_HEIGHT)]
                                for row in range(settings.STAGE_WIDTH)
                                ]  # 二次配列を生成してNoneで初期化
        #self._constract_building(Laputa, 0, 0)
    def increase_population(self, p=None):
        u"""人口を増やす。その後、レベルアップの判定をする
            増える人口はレベルに依存する。 p*2^(lv-1)
        """
        self.flow_timer.reset()
        self.flow_timer.play()
        if not p:
            self.population += self._calc_population()
        else:
            self.population += p
        if self.level < 5 and settings.LEVELUP_BORDERLINES[
                self.level] < self.population:
            self.levelup_sound.play()
            self.level += 1
        else:
            self.increase_sound.play()

    def decrease_population(self, p):
        u"""
            p人人口を減らす
            実際に減った人数を返す
        """
        self.flow_timer.reset()
        self.flow_timer.play()
        if self.population < p:
            p = self.population
            self.population = 0
        else:
            self.population -= p
        return p

    def _pop_building(self):
        u"""ビルを建てる"""
        if self.population <= 0: return
        if random.randint(0, settings.BUILDING_POP_RATE) != 0: return
        buildings = LEVEL_BUILDINGS[self.level - 1]
        if len(buildings) == 0: return
        if self.level <= 2:
            x = random.randint(0, 3)
            y = random.randint(0, 3)
        elif self.level <= 4:
            x, y = random.choice(((0, 0), (2, 0), (0, 2), (2, 2)))
        elif self.level == 5:
            x, y = (0, 0)
        if not self.building_matrix[x][y] or (
                self.building_matrix[x][y]
                and self.building_matrix[x][y].level != self.level):
            building = random.choice(buildings)
            self._constract_building(building, x, y)

    def _constract_building(self, cls, x, y):
        building = cls(self.root_point.x + x, self.root_point.y + y)
        for sx in xrange(x, x + building.size):
            for sy in xrange(y, y + building.size):
                self.building_matrix[sx][sy] = building
        self.buildings.append(building)

    def _calc_population(self):
        u"""レベルに応じた増減する人口を算出する"""
        p = random.randint(8000, 12000)
        return p * 2**(self.level - 1)

    def update(self):
        self.flow_timer.tick()
        if self.flow_timer.is_over() and self.population > 0:
            u"""人を流出させる"""
            bottom_territories = self._get_bottom_territories()
            for territory in bottom_territories:
                u"""最も手前にある領土の一覧を取ってきて、繋がっているかどうか調査する"""
                front = self.world.get_panel_from(territory, 2)
                if territory.is_connect_with(front):
                    self._flow_immigration(territory, front)
        self._pop_building()
        updated = []
        for x in xrange(0, 4):
            for y in xrange(0, 4):
                b = self.building_matrix[x][y]
                if b and not b in updated:
                    b.update()
                    updated.append(b)

    def draw(self):
        rendered = []
        for x in xrange(0, 4):
            for y in xrange(0, 4):
                b = self.building_matrix[x][y]
                if b and not b in rendered:
                    b.draw()
                    rendered.append(b)

    def _flow_immigration(self, territory, front):
        u"""移民を流出させる"""
        immigrant = self.world.i_manager.create_immigrant(
            territory.point.x, territory.point.y)
        p = self._calc_population()
        p = self.decrease_population(p)
        immigrant.population = p
        immigrant.direction = 2
        immigrant.ainfo.index = 2
        immigrant.current_ground = territory
        immigrant.x, immigrant.y = territory.surface_bottom_edge.to_pos()
        immigrant.goal_ground = front
        self.flow_timer.reset()

    def _get_bottom_territories(self):
        u"""領土最下層のTerritoryのみを取ってくる"""
        list = []
        for territory in self.territories:
            if territory.point.y == 3:
                list.append(territory)
        return list

    @property
    def root_point(self):
        u"""街の左上の座標を返す"""
        pc = self.world.player_count
        if pc == 1:
            return Vector(6, 0)
        elif pc == 2:
            return (Vector(2, 0), Vector(10, 0))[self.owner.number]
        elif pc == 3:
            return (Vector(1, 0), Vector(6, 0), Vector(11,
                                                       0))[self.owner.number]
        elif pc == 4:
            return Vector(self.owner.number * 4, 0)