konkr_game_3d/scripts/Money.gd
ProgramSnail a795665b54 fixes
2023-08-10 12:18:17 +03:00

174 lines
6.4 KiB
GDScript

extends Spatial
var house_info_scene = preload("res://scenes/house_info.tscn")
onready var map = get_node("/root/Level/Map")
onready var characters = get_node("/root/Level/Map/Characters")
onready var utils = get_node("/root/Level/Map/Utils")
onready var buildings = get_node("/root/Level/Map/Buildings")
export var CHARACTER_COST = 10
# first is rogue, last upgrade is impossible
export var CHARACTER_UPGRADE_COSTS = [0, 10, 20, 40, 80]
export var CHARACTER_SALARIES = [0, 2, 6, 18, 54]
export var TOWER_SALARY = 2
export var HOUSE_STARTING_MONEY = 10
export var TILE_MONEY = 1
var houses_money = {}
var houses_info = {}
func pay_tower_salaries(player : int):
for tower_position in buildings.get_used_cells():
if map.TOWER_CELLS.has(map.get_building_cell(tower_position)) and \
map.get_tile_cell(tower_position) == map.player_tiles[player]:
spend_connected_money(tower_position, map.player_tiles[player], TOWER_SALARY)
func pay_character_salaries(player : int):
var alive_characters = []
var new_rogues_positions = []
# find new rogue characters (not fully paid characters)
for character in characters.player_characters[player]:
var character_position = utils.world_to_grid_position(character.translation)
if spend_connected_money(character_position, map.player_tiles[player], CHARACTER_SALARIES[character.level]):
alive_characters.append(character)
else:
character.became_rogue()
characters.rogue_characters.append(character)
new_rogues_positions.append(character_position)
characters.player_characters[player] = alive_characters
# better solution ??
# find characters, connected to new rogues (not fully paid characters)
alive_characters = []
for character in characters.player_characters[player]:
var character_position = utils.world_to_grid_position(character.translation)
if map.is_tile_connected_to_tiles(character_position,
new_rogues_positions,
map.player_tiles[player]):
character.became_rogue()
characters.rogue_characters.append(character)
else:
alive_characters.append(character)
characters.player_characters[player] = alive_characters
func count_connected_money(starting_position : Vector3, tile_cell : int):
var connected_money = 0
var visited = {}
var to_visit = [starting_position]
visited[utils.position_to_string(starting_position)] = null
for current_position in to_visit:
if map.HOUSE_CELLS.has(map.get_building_cell(current_position)):
connected_money += houses_money[utils.position_to_string(current_position)]
for direction in map.directions:
if map.get_tile_cell(current_position + direction) == tile_cell and \
not visited.has(utils.position_to_string(current_position + direction)):
visited[utils.position_to_string(current_position + direction)] = null
to_visit.append(current_position + direction)
return connected_money
func spend_connected_money(starting_position : Vector3, tile_cell : int, money_to_spend : int):
if money_to_spend <= 0:
return true
var visited = {}
var to_visit = [starting_position]
visited[utils.position_to_string(starting_position)] = null
for current_position in to_visit:
if map.HOUSE_CELLS.has(map.get_building_cell(current_position)):
var money_in_house = houses_money[utils.position_to_string(current_position)]
houses_money[utils.position_to_string(current_position)] = max(0, money_in_house - money_to_spend)
update_house_info(current_position)
money_to_spend -= money_in_house
if money_to_spend <= 0:
return true
for direction in map.directions:
if map.get_tile_cell(current_position + direction) == tile_cell and \
not visited.has(utils.position_to_string(current_position + direction)):
visited[utils.position_to_string(current_position + direction)] = null
to_visit.append(current_position + direction)
return money_to_spend <= 0
func add_money_to_nearest_other_house(starting_position : Vector3, tile_cell : int, money_added : int):
if money_added <= 0:
return
var visited = {}
var to_visit = [starting_position]
visited[utils.position_to_string(starting_position)] = null
for current_position in to_visit:
for direction in map.directions:
var new_position = current_position + direction
if map.get_tile_cell(new_position) == tile_cell and \
not visited.has(utils.position_to_string(new_position)):
visited[utils.position_to_string(new_position)] = null
to_visit.append(new_position)
if map.HOUSE_CELLS.has(map.get_building_cell(new_position)):
houses_money[utils.position_to_string(new_position)] += money_added
update_house_info(new_position)
return
func update_house_info(position : Vector3):
var position_string = utils.position_to_string(position)
houses_info[position_string].money = houses_money[position_string]
func update_houses_money(player : int):
var rogue_positions = {}
for rogue in characters.rogue_characters:
rogue_positions[utils.position_to_string(utils.world_to_grid_position(rogue.translation))] = null
var visited = {}
var to_visit = []
for building_position in buildings.get_used_cells():
if map.HOUSE_CELLS.has(map.get_building_cell(building_position)) and \
map.get_tile_cell(building_position) == map.player_tiles[player]:
visited[utils.position_to_string(building_position)] = null
to_visit.append([building_position, building_position])
for current in to_visit:
if not rogue_positions.has(utils.position_to_string(current[0])):
houses_money[utils.position_to_string(current[1])] += TILE_MONEY
update_house_info(current[1])
for direction in map.directions:
if map.get_tile_cell(current[0] + direction) == map.player_tiles[player] and \
not visited.has(utils.position_to_string(current[0] + direction)):
visited[utils.position_to_string(current[0] + direction)] = null
to_visit.append([current[0] + direction, current[1]])
func destroy_house(position : Vector3):
var position_string = utils.position_to_string(position)
houses_money.erase(position_string)
houses_info[position_string].queue_free()
houses_info.erase(position_string)
func init_houses():
for building_position in buildings.get_used_cells():
if map.HOUSE_CELLS.has(map.get_building_cell(building_position)):
var building_position_string = utils.position_to_string(building_position)
houses_money[building_position_string] = HOUSE_STARTING_MONEY
houses_info[building_position_string] = utils.spawn_on_position(house_info_scene, building_position)
update_house_info(building_position)