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.

285 lines
9.1 KiB

class_name Game
11 months ago
extends Node2D
var countries = [
{ color = Color8(0, 0, 0, 0), name = "Transparent"},
{ color = Color8(128, 0, 0), name = "Red"},
{ color = Color8(128,128, 0), name = "Yellow"},
{ color = Color8( 0,128, 0), name = "Green"},
{ color = Color8( 0,128,128), name = "Cyan"},
{ color = Color8( 0, 0,128), name = "Blue"},
{ color = Color8(128, 0,128), name = "Purple"},
{ color = Color8(128,128,128), name = "White"}
]
var players = []
var turn_id = -1
var turns = []
var turn
var player_count = 3
var button_selected = null
var mouse_click_mode = null
11 months ago
11 months ago
var stocks_ui = []
func _ready():
11 months ago
randomize()
_setup_players()
_setup_countries()
_setup_turns()
11 months ago
_setup_stock_ui()
$Grid.countries = countries
$Grid.setup()
turn = turns[turn_id]
_on_EndTurnButton_pressed()
func _setup_players():
var id = 0
for player_id in player_count:
var player = Player.new()
player.id = player_id
player.name = str(player_id)
players.append(player)
player.connect("win", self, "_on_player_win", [player])
func _on_player_win(player):
$CanvasLayer/Control/Winner.show()
$CanvasLayer/Control/Winner.text = "Player " + player.name + " wins!!!"
func _setup_countries():
11 months ago
var id = 0
var countries2 = []
for country in countries:
var country2 = Country.new()
country2.color = country.color
country2.id = id
country2.name = country.name
country2.grid = $Grid
countries2.append(country2)
id += 1
countries = countries2
11 months ago
func _setup_turns():
for player in players:
turns.append({
layer = "player",
id = player.id,
object = player
})
for country in countries:
if country.id == 0: continue
turns.append({
layer = "country",
id = country.id,
object = country
})
11 months ago
func _setup_stock_ui():
stocks_ui.append({})
for country in countries:
if country.id == 0: continue
var name_lbl = Label.new()
name_lbl.text = country.name
var stock_price_lbl = Label.new()
stock_price_lbl.text = str(country.stock_price)
var stock_lbl = Label.new()
stock_lbl.text = "??"
var buy_btn = Button.new()
buy_btn.text = "Buy"
var sell_btn = Button.new()
sell_btn.text = "Sell"
var proposal_lbl = Label.new()
proposal_lbl.text = "0$"
var acceptance_btn = Button.new()
acceptance_btn.text = "Accept"
acceptance_btn.toggle_mode = true
acceptance_btn.connect("toggled", self, "_on_acceptance_btn_toggled", [country])
11 months ago
stocks_ui.append({
stock_price_lbl = stock_price_lbl,
stock_lbl = stock_lbl,
proposal_lbl = proposal_lbl,
acceptance_btn = acceptance_btn,
11 months ago
})
buy_btn.connect("pressed", self, "_on_stock_buy_button_pressed", [country])
sell_btn.connect("pressed", self, "_on_stock_sell_button_pressed", [country])
$CanvasLayer/Control/VBoxContainer/Stocks.add_child(name_lbl)
$CanvasLayer/Control/VBoxContainer/Stocks.add_child(stock_price_lbl)
$CanvasLayer/Control/VBoxContainer/Stocks.add_child(stock_lbl)
$CanvasLayer/Control/VBoxContainer/Stocks.add_child(buy_btn)
$CanvasLayer/Control/VBoxContainer/Stocks.add_child(sell_btn)
$CanvasLayer/Control/VBoxContainer/Stocks.add_child(proposal_lbl)
$CanvasLayer/Control/VBoxContainer/Stocks.add_child(acceptance_btn)
11 months ago
func _refresh_stock_ui():
for country in countries:
if country.id == 0: continue
var ui = stocks_ui[country.id]
ui.stock_price_lbl.text = str(country.stock_price)
ui.stock_lbl.text = str(turn.object.stocks[country.id])
ui.proposal_lbl.text = str(country.proposal) + "$"
ui.acceptance_btn.pressed = country.player_acceptance[turn.object.id]
func set_proposal_display(cur_btn):
cur_btn.pressed = true
for button in $CanvasLayer/Control/VBoxContainer/CountryProposal.get_children():
if button is Button and button != cur_btn:
button.pressed = false
func _on_ProposalMinus1_pressed():
if turn.object.stock_price > 1:
set_proposal_display($CanvasLayer/Control/VBoxContainer/CountryProposal/ProposalMinus1)
turn.object.proposal = -1
else:
$CanvasLayer/Control/VBoxContainer/CountryProposal/ProposalMinus1.pressed = false
func _on_ProposalZero_pressed():
set_proposal_display($CanvasLayer/Control/VBoxContainer/CountryProposal/ProposalZero)
turn.object.proposal = 0
func _on_ProposalPlus1_pressed():
set_proposal_display($CanvasLayer/Control/VBoxContainer/CountryProposal/ProposalPlus1)
turn.object.proposal = 1
func _on_acceptance_btn_toggled(value, country):
country.player_acceptance[turn.object.id] = value
country.process_proposal()
_refresh_stock_ui()
11 months ago
func _on_stock_buy_button_pressed(country):
if turn.object.money >= country.stock_price and country.total_stocks < 7:
country.total_stocks += 1
11 months ago
country.player_stocks[turn.object.id] += 1
11 months ago
turn.object.stocks[country.id] += 1
turn.object.money -= country.stock_price
country.money += country.stock_price
_refresh_stock_ui()
func _on_stock_sell_button_pressed(country):
if country.money >= country.stock_price and turn.object.stocks[country.id] > 0:
country.total_stocks -= 1
11 months ago
country.player_stocks[turn.object.id] -= 1
11 months ago
turn.object.stocks[country.id] -= 1
turn.object.money += country.stock_price
country.money -= country.stock_price
_refresh_stock_ui()
11 months ago
func _on_PayDividends_pressed():
if turn.object.money >= 7:
11 months ago
turn.object.money -= 7
for i in len(turn.object.player_stocks):
var stocks = turn.object.player_stocks[i]
players[i].money += players[i].stocks[turn.object.id]
11 months ago
func _process(delta):
$CanvasLayer/Control/VBoxContainer/CountryMoneyLabel.text = str(turns[turn_id].object.money) + "$"
if turn.layer == "country":
$CanvasLayer/Control/VBoxContainer/StockPriceLabel.text = "STOCK PRICE: " + str(turn.object.stock_price) + "$"
$CanvasLayer/Control/VBoxContainer/StockPriceLabel.visible = turn.layer == "country"
$CanvasLayer/Control/VBoxContainer/BuyFactory.visible = turn.layer == "country"
$CanvasLayer/Control/VBoxContainer/BuyArmy.visible = turn.layer == "country"
$CanvasLayer/Control/VBoxContainer/BuyBoat.visible = turn.layer == "country"
11 months ago
$CanvasLayer/Control/VBoxContainer/Stocks.visible = turn.layer == "player"
11 months ago
$CanvasLayer/Control/VBoxContainer/PayDividends.visible = turn.layer == "country"
$CanvasLayer/Control/VBoxContainer/CountryProposal.visible = turn.layer == "country"
11 months ago
11 months ago
func _on_EndTurnButton_pressed():
10 months ago
if turn_id != -1:
if turn.layer == "country":
for army in turn.object.armies:
army.entity.current_turn_movable = true
for boat in turn.object.boats:
boat.entity.current_turn_movable = true
turn.object.compute_balance()
$Grid.selected_thing = null
11 months ago
turn_id += 1
if turn_id == len(turns): turn_id = 0
turn = turns[turn_id]
11 months ago
if turn.layer == "player":
_refresh_stock_ui()
11 months ago
else:
$CanvasLayer/Control/ControllerLabel.text = "Controller: " + (players[turn.object.get_controller_id()].name if turn.object.get_controller_id() >= 0 else "none")
var proposal_btns = [
$CanvasLayer/Control/VBoxContainer/CountryProposal/ProposalMinus1,
$CanvasLayer/Control/VBoxContainer/CountryProposal/ProposalZero,
$CanvasLayer/Control/VBoxContainer/CountryProposal/ProposalPlus1
]
set_proposal_display(proposal_btns[turn.object.proposal + 1])
11 months ago
$CanvasLayer/Control/ControllerLabel.visible = turn.layer == "country"
$CanvasLayer/Control/VBoxContainer/TurnLabel.text = turn.object.name + "'s turn."
if turn.layer == "country":
if turn.object.get_controller_id() == -1:
_on_EndTurnButton_pressed()
func _on_BuyFactory_pressed():
if button_selected: button_selected.pressed = false
button_selected = $CanvasLayer/Control/VBoxContainer/BuyFactory
mouse_click_mode = "buy_factory"
button_selected.pressed = true
func _on_BuyArmy_pressed():
if button_selected: button_selected.pressed = false
button_selected = $CanvasLayer/Control/VBoxContainer/BuyArmy
mouse_click_mode = "buy_army"
button_selected.pressed = true
func _on_BuyBoat_pressed():
if button_selected: button_selected.pressed = false
button_selected = $CanvasLayer/Control/VBoxContainer/BuyBoat
mouse_click_mode = "buy_boat"
button_selected.pressed = true
func _on_Grid_tile_pressed(v):
if turn.layer == "country":
var country = turn.object
var tile = $Grid.grid[v]
match mouse_click_mode:
"buy_factory":
if country.money >= 5 and tile.country == country and not tile.needs_boat and not tile.factory:
country.money -= 5
$Grid.set_factory(v, true)
"buy_army":
if country.money >= 3 and tile.country == country and tile.factory and len(tile.units) == 0:
country.money -= 3
country.add_unit({}, v)
"buy_boat":
if country.money >= 3 and $Grid.has_adjacent_factory(v, country) and tile.needs_boat and not $Grid.tile_have_boat_of_country(tile, country):
country.money -= 3
country.add_boat({}, v)
null:
if is_instance_valid($Grid.selected_thing) and $Grid.selected_thing is Boat and $Grid.selected_thing.get_tile_position() == v or len(tile.boats) == 0:
for army in tile.units:
if army.country == country:
$Grid.selected_thing = army.entity
break
else:
for boat in tile.boats:
if boat.country == country:
$Grid.selected_thing = boat.entity
break
11 months ago
func _input(event):
if event is InputEventMouseButton:
if event.pressed and event.button_index == BUTTON_RIGHT:
if button_selected:
button_selected.pressed = false
mouse_click_mode = null
11 months ago