예제 #1
0
class View_characters(__Object_base):
    images = tuple(
        view_utils.scaled_surface(
            pg.image.load(
                os.path.join(view_const.IMAGE_PATH, f'move_{_index}.png')),
            0.6) for _index in map(str, range(1, 8)))
    image_oil = view_utils.scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, 'oil_black.png')),
        0.4)

    @classmethod
    def init_convert(cls):
        cls.images = tuple(_image.convert_alpha() for _image in cls.images)
        cls.image_oil = pg.Surface.convert_alpha(cls.image_oil)

    def __init__(self, model):
        self.model = model
        self.picture_switch = (0, 1, 2, 1, 2, 1, 2, 1, 2, 3, 4, 5, 4, 5, 4, 5,
                               4, 5, 6)
        self.position_switch = (130, 240, 350, 460, 570, 680, 790, 900, 1010,
                                1010, 900, 790, 680, 570, 460, 350, 240, 130,
                                120)
        self.index = 0
        self.counter = 0

    def draw(self, screen):
        image = self.images[self.picture_switch[self.index]]
        screen.blit(image, [self.position_switch[self.index], 520])
        if self.index < 10:
            screen.blit(self.image_oil, (1220, 700))
        if self.counter == 20:
            self.index += 1
            self.index %= 19
        self.counter %= 20
        self.counter += 1
예제 #2
0
class View_players(__Object_base):
    images_color = tuple(
        view_utils.scaled_surface(
            pg.image.load(
                os.path.join(view_const.IMAGE_PATH,
                             f'player_color{_rainbow}.png')), 0.2)
        for _rainbow in range(0, 19))
    image_freeze = view_utils.scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, 'freeze.png')), 0.5)
    image_koreanfish = view_utils.scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, 'koreanfish.png')),
        0.2)
    image_captainkaoshiung = view_utils.scaled_surface(
        pg.image.load(
            os.path.join(view_const.IMAGE_PATH, 'koreanfish_leader.png')), 0.2)

    @classmethod
    def init_convert(cls):
        cls.images = tuple(_image.convert_alpha() for _image in cls.images)
        cls.image_freeze = cls.image_freeze.convert_alpha()
        cls.images_color = tuple(_image.convert_alpha()
                                 for _image in cls.images_color)

    def __init__(self, model):
        self.model = model
        self.color_switch = [0, 0, 0, 0]
        self.images = tuple(
            view_utils.scaled_surface(
                view_utils.replace_color(
                    os.path.join(view_const.IMAGE_PATH, 'player_outfit.png'),
                    view_const.COLOR_WHITE, player.color), 0.2).convert_alpha(
                    ) if player.name != 'master' else self.image_koreanfish
            for player in self.model.player_list)
        self.theworld_player = None

    def set_theworld_player(self, player_index):
        self.theworld_player = player_index

    def draw(self, screen, theworld=False):
        players = self.model.player_list
        for _i in range(len(players)):
            if theworld and _i != self.theworld_player: continue

            angle = ((8 - players[_i].direction_no) % 8 - 3) * 45
            image = pg.transform.rotate(self.images[_i], angle)
            if not players[_i].is_invincible:
                image = pg.transform.rotate(self.images[_i], angle)
            else:
                if players[_i].name == 'master':
                    image = pg.transform.rotate(self.image_captainkaoshiung,
                                                angle)
                else:
                    image = pg.transform.rotate(
                        self.images_color[self.color_switch[_i] % 19], angle)
                    self.color_switch[_i] += 1
            screen.blit(image, image.get_rect(center=players[_i].position))
            if players[_i].freeze:
                screen.blit(self.image_freeze,
                            players[_i].position + [-17, -50])
예제 #3
0
class Animation_freeze(Animation_raster):
    frames = {
        'ice': tuple(view_utils.scaled_surface(
                pg.transform.rotate(pg.image.load(os.path.join(view_const.IMAGE_PATH, 'ice.png')), _i*1),
                0.66/30*_i if _i <= 30 else 0.66
            )
            for _i in range(1, model_const.radius_not_move_duration)
        ),
        'ice_text': tuple(view_utils.scaled_surface(
                pg.transform.rotate(pg.image.load(os.path.join(view_const.IMAGE_PATH, 'ice_text.png')), -_i*1),
                0.66/30*_i if _i <= 30 else 0.66
            )
            for _i in range(1, model_const.radius_not_move_duration)
        ),
        'ice_inside': tuple(view_utils.scaled_surface(
                pg.transform.rotate(pg.image.load(os.path.join(view_const.IMAGE_PATH, 'ice_inside.png')), _i*3),
                0.2376/30*_i if _i <= 30 else 0.2376
            )
            for _i in range(1, model_const.radius_not_move_duration)
        ),
    }

    @classmethod
    def init_convert(cls):
        for _key in cls.frames:
            cls.frames[_key] = tuple( _frame.convert_alpha() for _frame in cls.frames[_key] )

    def __init__(self, **pos):
        super().__init__(1, model_const.radius_not_move_duration, **pos)

    def update(self):
        self._timer += 1

        if self._timer == self.expire_time:
            self.expired = True
        elif self._timer % self.delay_of_frames == 0:
            self.frame_index_to_draw = (self.frame_index_to_draw + 1) % len(self.frames['ice'])

    def draw(self, screen, update=True):
        for angle in np.linspace(0, 2*np.pi*5/6, num=6):
            dest = pg.math.Vector2(self.pos[next(iter(self.pos))]) + pg.math.Vector2(95*cos(angle + self._timer/180*np.pi), 95*sin(angle + self._timer/180*np.pi))
            screen.blit(
                self.frames['ice_inside'][self.frame_index_to_draw],
                self.frames['ice_inside'][self.frame_index_to_draw].get_rect(center=dest)
            )
        screen.blit(
            self.frames['ice_text'][self.frame_index_to_draw],
            self.frames['ice_text'][self.frame_index_to_draw].get_rect(**self.pos),
        )
        screen.blit(
            self.frames['ice'][self.frame_index_to_draw],
            self.frames['ice'][self.frame_index_to_draw].get_rect(**self.pos),
        )

        if update: self.update()
예제 #4
0
class View_items(__Object_base):
    images = {
        'IGoHome':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'backbag.png')),
            0.2),
        'MagnetAttract':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'magnet.png')),
            0.2),
        'Invincible':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'star.png')),
            0.2),
        'TheWorld':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'clock.png')),
            0.23),
        'OtherGoHome':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH,
                                       'hurricane.png')), 0.2),
        'RadiusNotMove':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'staff.png')),
            0.24),
        'RadiationOil':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'bomb.png')),
            0.15),
        'ShuffleBases':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'shuffle.png')),
            0.2),
        'FaDaCai':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'shuffle.png')),
            0.2)
    }

    @classmethod
    def init_convert(cls):
        cls.images = {
            _name: cls.images[_name].convert_alpha()
            for _name in cls.images
        }

    def draw(self, screen):
        for market in self.model.priced_market_list:
            if market.item:
                screen.blit(
                    self.images[market.item.name],
                    self.images[market.item.name].get_rect(center=(401, 398)))
예제 #5
0
class View_background(__Object_base):
    background = view_utils.scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, 'background.png')),
        1)
    priced_market = view_utils.scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, 'market.png')), 0.3)

    @classmethod
    def init_convert(cls):
        cls.background = cls.background.convert()
        cls.priced_market = cls.priced_market.convert()

    def draw(self, screen):
        screen.fill(view_const.COLOR_WHITE)
        screen.blit(self.background, (0, 0))
        screen.blit(self.priced_market, (322, 328))
예제 #6
0
class Animation_shuffleBases(Animation_raster):
    image = view_utils.scaled_surface(pg.image.load( os.path.join(view_const.IMAGE_PATH, 'base.png') ), 0.3)
    
    def __init__(self, model):
        self.model = model
        self.expire_time = 90
        self.expired = False
        self.delay_of_frames = 10
        self._timer = 0

    @classmethod
    def init_convert(cls):
        cls.image = cls.image.convert_alpha()

    def update(self):
        self._timer += 1
        if self._timer == self.expire_time:
            self.expired = True

    def draw(self, screen, update=True):
        if self._timer % self.delay_of_frames:
            all_color = [player.color for player in self.model.player_list]
            random.shuffle(all_color)
            for _base in self.model.base_list:
                pg.draw.circle(
                    screen, 
                    all_color[_base.owner_index], 
                    (round(int(_base.center[0]), -2), round(int(_base.center[1]), -2)), 
                    160
                )
                screen.blit(self.image, self.image.get_rect(center=_base.center))
        if update: self.update()
예제 #7
0
class Animation_shuffleBases_horizontal(Animation_raster):
    frames = tuple(
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'thunder_horizontal.png')),
            1/45 * _i
        )
        for _i in range(1, 45)
    )

    def __init__(self, **pos):
        super().__init__(1, 90, **pos)
예제 #8
0
class Animation_othergohome(Animation_raster):
    frames = tuple(
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'othergohome.png')),
            1/20 * _i
        )
        for _i in range(1, 20)
    )

    def __init__(self, **pos):
        super().__init__(1, 2*len(self.frames), **pos)
예제 #9
0
 def __init__(self, model):
     self.model = model
     self.color_switch = [0, 0, 0, 0]
     self.images = tuple(
         view_utils.scaled_surface(
             view_utils.replace_color(
                 os.path.join(view_const.IMAGE_PATH, 'player_outfit.png'),
                 view_const.COLOR_WHITE, player.color), 0.2).convert_alpha(
                 ) if player.name != 'master' else self.image_koreanfish
         for player in self.model.player_list)
     self.theworld_player = None
예제 #10
0
class Animation_equalize(Animation_raster):
    frames = tuple(
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'equalize_background.png')),
            1 / 20 * _i
        )
        for _i in range(1, 21)
    )

    def __init__(self, **pos):
        super().__init__(2, 2*len(self.frames), **pos)
예제 #11
0
 def __init__(self, model):
     self.model = model
     self.images = tuple(
         view_utils.scaled_surface(
             view_utils.replace_color(
                 os.path.join(view_const.IMAGE_PATH, 'pet_robot_outfit.png'
                              ), view_const.COLOR_WHITE, player.color), 0.08
         ).convert_alpha() if player.name != 'master' else view_utils.
         scaled_surface(
             pg.image.
             load(os.path.join(view_const.IMAGE_PATH, 'pet_dog.png')
                  ), 0.12).convert_alpha()
         for player in self.model.player_list)
예제 #12
0
class View_bases(__Object_base):
    image = view_utils.scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, 'base.png')), 0.3)
    image_bathtub = view_utils.scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, 'bathtub.png')), 0.4)

    @classmethod
    def init_convert(cls):
        cls.image = cls.image.convert_alpha()

    def draw(self, screen):
        for idx, _base in enumerate(self.model.base_list):
            pg.draw.circle(screen,
                           self.model.player_list[_base.owner_index].color,
                           (round(int(_base.center[0]),
                                  -2), round(int(_base.center[1]), -2)), 160)
            if self.model.player_list[idx].name == 'master':
                screen.blit(self.image_bathtub,
                            self.image_bathtub.get_rect(center=_base.center))
            else:
                screen.blit(self.image,
                            self.image.get_rect(center=_base.center))
예제 #13
0
class View_menu(__Object_base):
    menu = view_utils.scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, 'menu.png')), 1)
    base = view_utils.scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, 'base.png')), 0.5)

    @classmethod
    def init_convert(cls):
        cls.menu = cls.menu.convert()
        cls.base = cls.base.convert_alpha()

    def draw(self, screen):
        screen.blit(self.menu, (0, 0))
        screen.blit(self.base, (10, 645))

        titlefont = pg.font.Font(view_const.digitalt_font, 250)
        titlesmallfont = pg.font.Font(view_const.notosans_font, 40)

        words_1 = titlefont.render('OIL', True, view_const.COLOR_BLACK)
        words_2 = titlefont.render('TYCOON', True, view_const.COLOR_BLACK)
        words_3 = titlesmallfont.render('presented by 2019 NTU CSIE CAMP',
                                        True, view_const.COLOR_BLACK)

        (size_x_1, size_y_1) = words_1.get_size()
        (size_x_2, size_y_2) = words_2.get_size()
        (size_x_3, size_y_3) = words_3.get_size()
        pos_x_1 = (view_const.screen_size[0] - size_x_1) / 2
        pos_y_1 = (view_const.screen_size[1] - size_y_1 - 450 - size_y_3) / 2
        pos_x_2 = (view_const.screen_size[0] - size_x_2) / 2
        pos_y_2 = (view_const.screen_size[1] - size_y_2 - size_y_3) / 2
        pos_x_3 = (view_const.screen_size[0] - size_x_3) / 2
        pos_y_3 = (400 + size_y_3)

        screen.blit(words_1, (pos_x_1, pos_y_1))
        screen.blit(words_2, (pos_x_2, pos_y_2))
        screen.blit(words_3, (pos_x_3, pos_y_3))
예제 #14
0
class Animation_radiationOil(Animation_raster):
    '''
    stage 1: boom & screen vibration
    stage 2: smoke
    '''

    frames = tuple([
        *(view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'boom.png')),
            1/40 * (_i**2) / view_const.RADIATIONOIL_STAGE1_DURATION
        ) for _i in range(1, view_const.RADIATIONOIL_STAGE1_DURATION+1)),
        *(pg.transform.scale(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'boom_smoke.png')),
            (375, 375)
        ) for _ in range(1, view_const.RADIATIONOIL_STAGE2_DURATION+1)),
    ])

    @classmethod
    def init_convert(cls):
        _tmp_frames = []
        for _i in range(view_const.RADIATIONOIL_STAGE1_DURATION):
            _tmp_frames.append( cls.frames[_i].convert_alpha() )
        for _x, _i in zip(range(view_const.RADIATIONOIL_STAGE2_DURATION), range(view_const.RADIATIONOIL_STAGE1_DURATION, view_const.RADIATIONOIL_STAGE1_DURATION + view_const.RADIATIONOIL_STAGE2_DURATION)):
            _tmp_frames.append( cls.frames[_i].convert() )
            _tmp_frames[-1].set_colorkey((164, 147, 147))
            _tmp_frames[-1].set_alpha( - _x**4 / view_const.RADIATIONOIL_STAGE2_DURATION**3 +view_const.RADIATIONOIL_STAGE2_DURATION )

        cls.frames = tuple(_tmp_frames)

    def __init__(self, **pos):
        super().__init__(1, len(self.frames), **pos)
        pos[next(iter(pos))] = pg.math.Vector2(pos[next(iter(pos))]) + view_const.RADIATIONOIL_CENTER_OFFSET
        self.pos = pos
        self.vibration = tuple([
            *((0, 0) for _ in range(10)),
            *((random.randint(-9, 9), random.randint(-9, 9)) for _ in range(view_const.RADIATIONOIL_STAGE1_DURATION-10)),
            *((0, 0) for _ in range(view_const.RADIATIONOIL_STAGE2_DURATION))
        ])

    def draw(self, screen, update=True):
        screen.blit(
            self.frames[self.frame_index_to_draw],
            self.frames[self.frame_index_to_draw].get_rect(**self.pos),
        )
        screen.blit(screen.copy(), self.vibration[self.frame_index_to_draw])

        if update: self.update()
예제 #15
0
class Animation_magnetattract(Animation_raster):
    frames = tuple(
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'mag.png')),
            1 / 20 * _i
        )
        for _i in range(1, 11)
    )

    def __init__(self, player_index, model):
        super().__init__(2, model_const.magnet_attract_duration, center=model.player_list[player_index].position)
        self.player_index = player_index
        self.model = model
    
    def update(self):
        super().update()
        self.pos[ next(iter(self.pos)) ] = self.model.player_list[self.player_index].position + (10, 0)
예제 #16
0
class View_oils(__Object_base):
    images = tuple(
        view_utils.scaled_surface(
            pg.image.load(
                os.path.join(view_const.IMAGE_PATH, f'oil_{_color}.png')),
            0.16) for _color in ('purple', 'pink', 'gray', 'black'))

    def draw(self, screen):
        for _oil in self.model.oil_list:
            max_price = model_const.price_max
            if _oil.price < max_price / 3: image = self.images[0]
            elif max_price / 3 <= _oil.price < max_price / 2:
                image = self.images[1]
            elif max_price / 2 <= _oil.price < max_price / 3 * 2:
                image = self.images[2]
            elif max_price / 3 * 2 <= _oil.price:
                image = self.images[3]
            screen.blit(image, image.get_rect(center=_oil.position))
예제 #17
0
def load_and_scale(filename, scalar):
    return scaled_surface(
        pg.image.load(os.path.join(view_const.IMAGE_PATH, filename)), scalar)
예제 #18
0
class View_scoreboard(__Object_base):
    images = {
        'IGoHome':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'backbag.png')),
            0.3),
        'MagnetAttract':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'magnet.png')),
            0.3),
        'Invincible':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'star.png')),
            0.3),
        'TheWorld':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'clock.png')),
            0.35),
        'OtherGoHome':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH,
                                       'hurricane.png')), 0.3),
        'RadiusNotMove':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'staff.png')),
            0.32),
        'RadiationOil':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'bomb.png')),
            0.2),
        'ShuffleBases':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'shuffle.png')),
            0.3),
        'FaDaCai':
        view_utils.scaled_surface(
            pg.image.load(os.path.join(view_const.IMAGE_PATH, 'shuffle.png')),
            0.3)
    }

    @classmethod
    def init_convert(cls):
        cls.images = {
            _name: cls.images[_name].convert_alpha()
            for _name in cls.images
        }
        cls.namefont = pg.font.Font(view_const.notosans_font, 55)
        cls.numfont = pg.font.Font(view_const.notosans_font, 25)

    def draw(self, screen):
        pg.draw.rect(screen, view_const.COLOR_WHITE, (800, 0, 480, 800))
        pg.draw.rect(screen, view_const.COLOR_KHAKI, (800, 0, 480, 160))
        pg.draw.rect(screen, view_const.COLOR_BLACK, (800, 0, 480, 160), 5)
        for score in self.model.scoreboard.score_list:
            pg.draw.rect(screen, score.player.color,
                         (score.position, (480, 160)))
            pg.draw.rect(screen, view_const.COLOR_BLACK,
                         (score.position, (480, 160)), 5)
        for score in self.model.scoreboard.score_list:
            name = self.namefont.render(f'{score.player.name}', True,
                                        view_const.COLOR_BLACK)
            base_value = self.numfont.render(
                f'Base : {int(score.base.value_sum)}', True,
                view_const.COLOR_BLACK)
            player_value = self.numfont.render(
                f'Carried Value : {int(score.player.value)}', True,
                view_const.COLOR_BLACK)
            if score.player.item:
                item_image = self.images[score.player.item.name]
                screen.blit(item_image, score.position + (340, 5))
            screen.blit(name, score.position + (10, -5))
            screen.blit(base_value, score.position + (10, 75))
            screen.blit(player_value, score.position + (10, 115))
        for new_score in self.model.scoreboard.p_varition_list:
            if new_score.varition >= 0:
                carry_value = self.numfont.render(
                    f'+{int(new_score.varition)}', True, view_const.COLOR_GOLD)
            else:
                carry_value = self.numfont.render(f'{int(new_score.varition)}',
                                                  True, view_const.COLOR_GOLD)
            screen.blit(carry_value, new_score.get_position() + [300, 160])

        for new_base_score in self.model.scoreboard.b_varition_list:
            if new_base_score.varition >= 0:
                base_value = self.numfont.render(
                    f'+{int(new_base_score.varition)}', True,
                    view_const.COLOR_GOLD)
            else:
                base_value = self.numfont.render(
                    f'{int(new_base_score.varition)}', True,
                    view_const.COLOR_GOLD)
            screen.blit(base_value, new_base_score.get_position() + [300, 120])