Tests examples for the miniworldmaker engine
https://www.miniworldmaker.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
237 lines
7.3 KiB
237 lines
7.3 KiB
from miniworldmaker import * |
|
import random |
|
|
|
board = HexBoard(9, 9) |
|
board.toolbar = board.add_container(Toolbar(), "right", size=280) |
|
board.console = board.add_container(Console(), "bottom", size=100) |
|
board.tile_size = 60 |
|
center = None |
|
active_player = 0 |
|
corners_marker = [] |
|
tiles_marker = [] |
|
dices_marker = [] |
|
background_tokens = [] |
|
markers = [[255, 0, 0, 180], [0, 255, 0, 180]] |
|
player_colors = [[255, 0, 0, 200], [0, 255, 0, 200]] |
|
board.console.newline(f"P{active_player + 1} Turn") |
|
villages = [[], []] |
|
round_number = 1 |
|
round_label = board.toolbar.add_widget(ToolbarLabel("Round 1 of 5"), "round") |
|
board.toolbar.add_widget(ToolbarLabel("Player 1")) |
|
resources = [dict(), dict()] |
|
resources[0]["grass"] = 0 |
|
resources[0]["sand"] = 0 |
|
resources[0]["stone"] = 0 |
|
|
|
resources[1]["grass"] = 0 |
|
resources[1]["sand"] = 0 |
|
resources[1]["stone"] = 0 |
|
|
|
buttons = [dict(), dict()] |
|
buttons[0]["grass"] = board.toolbar.add_widget( |
|
ToolbarButton("0", "images/grass.png"), "grass0") |
|
buttons[0]["sand"] = board.toolbar.add_widget( |
|
ToolbarButton("0", "images/sand.png"), "sand0") |
|
buttons[0]["stone"] = board.toolbar.add_widget( |
|
ToolbarButton("0", "images/stone.png"), "stone0") |
|
buttons[0]["total"] = board.toolbar.add_widget( |
|
ToolbarLabel("Total: 1*0 + 2*0 + 3*0 = 0"), "total0") |
|
board.toolbar.add_widget(ToolbarLabel("Player 2")) |
|
buttons[1]["grass"] = board.toolbar.add_widget( |
|
ToolbarButton("0", "images/grass.png"), "grass1") |
|
buttons[1]["sand"] = board.toolbar.add_widget( |
|
ToolbarButton("0", "images/sand.png"), "sand1") |
|
buttons[1]["stone"] = board.toolbar.add_widget( |
|
ToolbarButton("0", "images/stone.png"), "stone1") |
|
buttons[1]["total"] = board.toolbar.add_widget( |
|
ToolbarLabel("Total: 1*0 + 2*0 + 3*0 = 0"), "total1") |
|
|
|
|
|
def create_token(tile, token_type): |
|
token = tile.create_token() |
|
if token_type == "grass": |
|
token.add_costume("images/grass.png") |
|
token.token_type = "grass" |
|
elif token_type == "sand": |
|
token.add_costume("images/sand.png") |
|
token.token_type = "sand" |
|
elif token_type == "stone": |
|
token.add_costume("images/stone.png") |
|
token.token_type = "stone" |
|
return token |
|
|
|
|
|
@board.register |
|
def on_setup(self): |
|
global center |
|
center = self.get_tile((4, 4)) |
|
for x in range(self.columns): |
|
for y in range(self.rows): |
|
if center.position.distance((x, y)) < 3: |
|
bg_tile = self.get_tile((x, y)) |
|
if bg_tile != center: |
|
r = random.randint(1, 3) |
|
if r == 1: |
|
bg_type = "grass" |
|
elif r == 2: |
|
bg_type = "sand" |
|
elif r == 3: |
|
bg_type = "stone" |
|
number = random.randint(2, 12) |
|
add_background_tile(bg_tile, bg_type, number) |
|
|
|
|
|
def add_background_tile(bg_tile, bg_type, number): |
|
global background_tokens |
|
bg_token = create_token(bg_tile, bg_type) |
|
bg_tile.bg = True |
|
bg_tile.bg_type = bg_type |
|
bg_tile.number = number |
|
number_label = Number((0, 0), number) |
|
number_label.size = (0.5, 0.5) |
|
bg_tile.add_token(number_label) |
|
background_tokens.append(bg_token) |
|
|
|
|
|
@board.register |
|
def on_mouse_motion(self, mouse_pos): |
|
global corners_marker |
|
global tiles_marker |
|
global markers |
|
global center |
|
|
|
for token in corners_marker: |
|
token.remove() |
|
for token in tiles_marker: |
|
token.remove() |
|
|
|
corner = HexCorner.from_pixel(mouse_pos) |
|
tiles_marker = [] |
|
corners_marker = [] |
|
if can_place_token(active_player, corner): |
|
for tile in corner.get_neighbour_tiles(): |
|
if hasattr(tile, "bg") and tile.bg: |
|
tile_marker = tile.create_token() |
|
tile_marker.border = 1 |
|
tile_marker.fill_color = (255, 255, 100, 180) |
|
tile_marker.marker = True |
|
tiles_marker.append(tile_marker) |
|
if corner.position.distance(center.position) < 3: |
|
corner_marker = corner.create_token() |
|
corner_marker.border = 1 |
|
corner_marker.size = (0.4, 0.4) |
|
corner_marker.fill_color = markers[active_player] |
|
corner_marker.is_filled = True |
|
corner_marker.marker = True |
|
corners_marker.append(corner_marker) |
|
|
|
|
|
@board.register |
|
def on_mouse_left(self, mouse_pos): |
|
global colors |
|
global center |
|
global active_player |
|
corner = HexCorner.from_pixel(mouse_pos) |
|
if can_place_token(active_player, corner): |
|
place_token(active_player, corner) |
|
|
|
|
|
def can_place_token(player, corner): |
|
global active_player |
|
global villages |
|
global round_number |
|
if round_number > 5: |
|
return False |
|
for village in villages[0] + villages[1]: |
|
if corner.position == village.position: |
|
return False |
|
for village in villages[1 - active_player]: |
|
if corner.position.distance(village.position) < 1: |
|
return False |
|
if corner.position.distance(center.position) < 3: |
|
return True |
|
else: |
|
return False |
|
|
|
|
|
def place_token(player, corner): |
|
global player_colors |
|
global active_player |
|
token = corner.create_token() |
|
token.border = 1 |
|
token.size = (0.2, 0.2) |
|
token.fill_color = player_colors[player] |
|
token.is_filled = True |
|
token.marker = False |
|
token.player = player |
|
villages[player].append(token) |
|
next_turn() |
|
|
|
|
|
def next_turn(): |
|
global active_player |
|
if active_player == 0: |
|
active_player = 1 |
|
else: |
|
active_player = 0 |
|
next_round() |
|
|
|
|
|
def next_round(): |
|
global round_number |
|
global round_label |
|
round_number += 1 |
|
round_label.text = f"Round {round_number} of 5" |
|
if round_number > 5: |
|
round_label.text = f"Game ended" |
|
roll_dice() |
|
|
|
|
|
def roll_dice(): |
|
global active_player |
|
global round_number |
|
global resources |
|
global buttons |
|
|
|
d1 = random.randint(1, 6) |
|
d2 = random.randint(1, 6) |
|
dice = d1 + d2 |
|
board.console.newline( |
|
f"Rolled dice: {d1} and {d2} = {dice} ...starting round {round_number}" |
|
) |
|
add_resources_to_players(dice) |
|
|
|
|
|
def add_resources_to_players(dice): |
|
global dices_marker |
|
global background_tokens |
|
new_resources = [0, 0] |
|
for token in dices_marker: |
|
token.remove() |
|
for token in background_tokens: |
|
tile = board.get_tile(token.position) |
|
if tile.number == dice: |
|
for corner in tile.corners: |
|
tokens = corner.get_tokens() |
|
for token in tokens: |
|
if hasattr(token, "player"): |
|
new_resources[token.player] += 1 |
|
dice_marker = tile.create_token() |
|
dice_marker.color = (0, 0, 0, 50) |
|
dices_marker.append(dice_marker) |
|
resources[0][tile.bg_type] += new_resources[0] |
|
resources[1][tile.bg_type] += new_resources[1] |
|
buttons[0][tile.bg_type].text = resources[0][tile.bg_type] |
|
buttons[1][tile.bg_type].text = resources[1][tile.bg_type] |
|
|
|
total_0 = resources[0][ |
|
"grass"] + resources[0]["sand"] * 2 + resources[0]["stone"] * 3 |
|
total_1 = resources[1][ |
|
"grass"] + resources[1]["sand"] * 2 + resources[1]["stone"] * 3 |
|
buttons[0][ |
|
"total"].text = f"Total: {resources[0]['grass']}*1 + {resources[0]['sand']}*2 + {resources[0]['stone']}*3 = {total_0}" |
|
buttons[1][ |
|
"total"].text = f"Total: {resources[1]['grass']}*1 + {resources[1]['sand']}*2 + {resources[1]['stone']}*3 = {total_1}" |
|
|
|
|
|
board.run()
|
|
|