2023-08-09 23:12:19 +03:00
|
|
|
extends Spatial
|
|
|
|
|
|
2023-08-10 12:18:17 +03:00
|
|
|
var building_destruction_scene = preload("res://scenes/destruction.tscn")
|
|
|
|
|
|
2023-08-09 23:12:19 +03:00
|
|
|
onready var map = get_node("/root/Level/Map")
|
|
|
|
|
onready var characters = get_node("/root/Level/Map/Characters")
|
|
|
|
|
onready var money = get_node("/root/Level/Map/Money")
|
|
|
|
|
onready var utils = get_node("/root/Level/Map/Utils")
|
|
|
|
|
|
2023-08-10 12:18:17 +03:00
|
|
|
func move_to_tile(position : Vector3):
|
|
|
|
|
var tile_cell = map.get_tile_cell(position)
|
|
|
|
|
var building_cell = map.get_building_cell(position)
|
|
|
|
|
var world_position = utils.grid_to_world_position(position)
|
|
|
|
|
|
|
|
|
|
# tile to move should be connected with current character tile
|
|
|
|
|
if not map.are_tiles_connected(utils.world_to_grid_position(characters.current_character_obj().translation),
|
|
|
|
|
position,
|
|
|
|
|
map.current_player_tile()):
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# can't go on tile, blocked with >= level, except characters with MAX_LEVEL
|
|
|
|
|
if map.tile_block_level(position, characters.current_player) >= characters.current_character_obj().level and \
|
|
|
|
|
characters.current_character_obj().level != characters.current_character_obj().MAX_LEVEL:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
if tile_cell == GridMap.INVALID_CELL_ITEM:
|
|
|
|
|
return
|
|
|
|
|
|
|
|
|
|
# move without action (to current player tile)
|
|
|
|
|
if tile_cell == map.current_player_tile() and \
|
|
|
|
|
building_cell == GridMap.INVALID_CELL_ITEM:
|
|
|
|
|
|
|
|
|
|
characters.current_character_obj().translation = world_position
|
|
|
|
|
|
|
|
|
|
if characters.destroy_other_player_characters(position, characters.current_player) > 0:
|
|
|
|
|
characters.set_next_character()
|
|
|
|
|
utils.spawn_on_position(building_destruction_scene, position)
|
|
|
|
|
|
|
|
|
|
# move with action (to tile of other player)
|
|
|
|
|
elif tile_cell != GridMap.INVALID_CELL_ITEM and \
|
|
|
|
|
tile_cell != map.current_player_tile() and \
|
|
|
|
|
map.has_neighbour_tile_cell(position, map.current_player_tile()):
|
|
|
|
|
|
|
|
|
|
map.set_tile_cell(position, map.current_player_tile())
|
|
|
|
|
|
|
|
|
|
characters.current_character_obj().translation = world_position
|
|
|
|
|
|
|
|
|
|
if building_cell != GridMap.INVALID_CELL_ITEM or \
|
|
|
|
|
characters.destroy_other_player_characters(position, characters.current_player) > 0:
|
|
|
|
|
utils.spawn_on_position(building_destruction_scene, position)
|
|
|
|
|
|
|
|
|
|
if building_cell != GridMap.INVALID_CELL_ITEM:
|
|
|
|
|
money.add_money_to_nearest_other_house(position,
|
|
|
|
|
map.current_player_tile(),
|
|
|
|
|
money.houses_money[utils.position_to_string(position)])
|
|
|
|
|
money.destroy_house(position)
|
|
|
|
|
|
|
|
|
|
map.set_building_cell(position, GridMap.INVALID_CELL_ITEM)
|
|
|
|
|
|
|
|
|
|
characters.turn_characters_into_rogues()
|
|
|
|
|
|
|
|
|
|
characters.set_next_character()
|
|
|
|
|
|
2023-08-09 23:12:19 +03:00
|
|
|
func make_turn(position : Vector3):
|
|
|
|
|
if map.is_connected_to_house(position, map.current_player_tile()):
|
|
|
|
|
var mouse_position_character_and_player_ids = characters.find_character_and_player_ids_on(position)
|
|
|
|
|
if map.get_tile_cell(position) == map.current_player_tile() and \
|
|
|
|
|
mouse_position_character_and_player_ids != null and \
|
|
|
|
|
mouse_position_character_and_player_ids[0] == characters.current_player and \
|
|
|
|
|
not characters.is_current_player_character_used(mouse_position_character_and_player_ids[1]):
|
|
|
|
|
characters.switch_character_to(mouse_position_character_and_player_ids[0],
|
|
|
|
|
mouse_position_character_and_player_ids[1])
|
|
|
|
|
elif characters.is_current_character_exist():
|
2023-08-10 12:18:17 +03:00
|
|
|
move_to_tile(position)
|
2023-08-09 23:12:19 +03:00
|
|
|
|
|
|
|
|
func upgrade_character_on_position(position : Vector3):
|
|
|
|
|
var character_on_position = characters.find_character_on(position)
|
|
|
|
|
if character_on_position != null and \
|
|
|
|
|
map.get_tile_cell(position) == map.current_player_tile() and \
|
|
|
|
|
money.count_connected_money(position, map.current_player_tile()) \
|
|
|
|
|
>= money.CHARACTER_UPGRADE_COSTS[character_on_position.level] and \
|
|
|
|
|
character_on_position.upgrade():
|
|
|
|
|
money.spend_connected_money(position, map.current_player_tile(), money.CHARACTER_COST)
|
|
|
|
|
|
2023-08-10 12:18:17 +03:00
|
|
|
func spawn_character(position : Vector3):
|
|
|
|
|
money.spend_connected_money(position, map.current_player_tile(), money.CHARACTER_COST)
|
|
|
|
|
|
|
|
|
|
characters.spawn_current_player_character(position)
|
|
|
|
|
|
|
|
|
|
characters.switch_character_to(characters.current_player, \
|
|
|
|
|
characters.current_player_characters_count() - 1)
|
2023-08-09 23:12:19 +03:00
|
|
|
|
2023-08-10 12:18:17 +03:00
|
|
|
if characters.destroy_other_player_characters(position, characters.current_player) > 0:
|
|
|
|
|
characters.set_next_character()
|
|
|
|
|
utils.spawn_on_position(building_destruction_scene, position)
|
|
|
|
|
|
|
|
|
|
func handle_spawn(position : Vector3):
|
|
|
|
|
if map.get_tile_cell(position) == map.current_player_tile():
|
|
|
|
|
var character_and_player_ids_on_position = characters.find_character_and_player_ids_on(position)
|
|
|
|
|
if character_and_player_ids_on_position == null: # try spawn character
|
|
|
|
|
if map.get_building_cell(position) == GridMap.INVALID_CELL_ITEM and \
|
|
|
|
|
map.is_connected_to_house(position, map.current_player_tile()) and \
|
|
|
|
|
money.count_connected_money(position, map.current_player_tile()) >= money.CHARACTER_COST:
|
|
|
|
|
spawn_character(position)
|
|
|
|
|
else: # try merge characters
|
|
|
|
|
if characters.is_current_character_exist() and \
|
|
|
|
|
character_and_player_ids_on_position[0] == characters.current_player:
|
|
|
|
|
characters.try_merge_current_character_with(character_and_player_ids_on_position[1])
|
|
|
|
|
else: # TODO: spawn and move character
|
|
|
|
|
pass
|
2023-08-09 23:12:19 +03:00
|
|
|
|
|
|
|
|
func _physics_process(_delta):
|
|
|
|
|
if Input.is_action_just_released("turn"):
|
|
|
|
|
make_turn(utils.world_to_grid_position(utils.mouse_position()))
|
|
|
|
|
|
|
|
|
|
if Input.is_action_just_released("upgrade"):
|
|
|
|
|
upgrade_character_on_position(utils.world_to_grid_position(utils.mouse_position()))
|
|
|
|
|
|
|
|
|
|
if Input.is_action_just_released("pass"):
|
|
|
|
|
characters.set_next_player()
|
|
|
|
|
|
|
|
|
|
if Input.is_action_just_released("spawn"):
|
2023-08-10 12:18:17 +03:00
|
|
|
handle_spawn(utils.world_to_grid_position(utils.mouse_position()))
|