initial commit
This commit is contained in:
148
Scripts/board.gd
Normal file
148
Scripts/board.gd
Normal file
@ -0,0 +1,148 @@
|
||||
class_name Board
|
||||
extends Node2D
|
||||
|
||||
signal turn_started
|
||||
signal round_started
|
||||
|
||||
const WORKER_DECK_SAVE_PATH = "user://worker_deck.json"
|
||||
const CLIENT_DECK_SAVE_PATH = "user://client_deck.json"
|
||||
|
||||
var round_num : int = 0
|
||||
var turn_num : int = 0
|
||||
var _players : Array[Player] = []
|
||||
var _readied_players
|
||||
var _worker_deck : Array[Worker] = []
|
||||
var _worker_discard_deck : Array[Worker] = []
|
||||
var _client_deck : Array[Client] = []
|
||||
var _client_discard_deck : Array[Client] = []
|
||||
var _worker_scene = preload("res://Scenes/worker_card.tscn")
|
||||
var _client_scene = preload("res://Scenes/client_card.tscn")
|
||||
|
||||
|
||||
func add_player(player : Player) -> void:
|
||||
if not _players.has(player):
|
||||
_players.append(player)
|
||||
turn_started.connect(player.start_turn)
|
||||
round_started.connect(player.start_round)
|
||||
|
||||
|
||||
func end_turn():
|
||||
var ready = true
|
||||
for x in _players:
|
||||
if x.turn_completed == false:
|
||||
ready = false
|
||||
if ready:
|
||||
turn_num += 1
|
||||
turn_started.emit()
|
||||
|
||||
#========== TODO ==============
|
||||
#All this shit should be refactored into awaits and signals so each player goes one at a time
|
||||
#The players camera should be set to the currently acting player when its not their own turn
|
||||
|
||||
func end_round():
|
||||
turn_num = 0
|
||||
pass
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_load_workers()
|
||||
_load_clients()
|
||||
|
||||
|
||||
func draw_worker(amount : int):
|
||||
return _draw_card(amount, _worker_deck, _worker_discard_deck)
|
||||
|
||||
|
||||
func search_and_draw_worker(card : Worker) -> Worker:
|
||||
var worker = _worker_deck[_worker_deck.find(card)]
|
||||
_worker_deck.remove_at(_worker_deck.find(card))
|
||||
return worker
|
||||
|
||||
|
||||
func draw_client(amount):
|
||||
return _draw_card(amount, _client_deck, _client_discard_deck)
|
||||
|
||||
|
||||
func search_and_draw_client(card : Client) -> Client:
|
||||
var client = _client_deck[_client_deck.find(card)]
|
||||
_client_deck.remove_at(_client_deck.find(card))
|
||||
return client
|
||||
|
||||
|
||||
func discard_worker(card : Worker) -> void:
|
||||
_worker_discard_deck.append(card)
|
||||
|
||||
|
||||
func discard_client(card : Client) -> void:
|
||||
_client_discard_deck.append(card)
|
||||
|
||||
|
||||
func _load_workers():
|
||||
if !FileAccess.file_exists(WORKER_DECK_SAVE_PATH):
|
||||
return
|
||||
var save_game = FileAccess.open(WORKER_DECK_SAVE_PATH, FileAccess.READ)
|
||||
var card_dict = JSON.parse_string(save_game.get_line())
|
||||
for key in card_dict:
|
||||
var value = card_dict[key]
|
||||
var card_instance = _worker_scene.instantiate()
|
||||
#JSON only returns floats so we have to get ints out of the dict
|
||||
var bonuses = []
|
||||
for x in value.slice(1, value.size()):
|
||||
bonuses.append(int(x))
|
||||
card_instance.setup(key, int(value[0]), bonuses)
|
||||
card_instance.position = Vector2(9999, 9999)
|
||||
#card_instance.scale = Vector2(1, 1)
|
||||
#card_instance.visible = false
|
||||
#card_instance.set_process(false)
|
||||
#card_instance.card_clicked.connect(select_card)
|
||||
_worker_deck.append(card_instance)
|
||||
add_child(card_instance)
|
||||
_worker_deck.shuffle()
|
||||
|
||||
|
||||
func _load_clients():
|
||||
if !FileAccess.file_exists(CLIENT_DECK_SAVE_PATH):
|
||||
return
|
||||
var save_game = FileAccess.open(CLIENT_DECK_SAVE_PATH, FileAccess.READ)
|
||||
var card_dict = JSON.parse_string(save_game.get_line())
|
||||
for key in card_dict:
|
||||
var value = card_dict[key]
|
||||
var card_instance = _client_scene.instantiate()
|
||||
#JSON only returns floats so we have to get ints out of the dict
|
||||
var bool_array = []
|
||||
var int_array = []
|
||||
for x in value.slice(1, 5):
|
||||
bool_array.append(bool(x))
|
||||
for x in value.slice(5, value.size()):
|
||||
int_array.append(int(x))
|
||||
card_instance.setup(key, int(value[0]), bool_array, int_array)
|
||||
card_instance.position = Vector2(9999, 9999)
|
||||
#card_instance.scale = Vector2(1, 1)
|
||||
_client_deck.append(card_instance)
|
||||
add_child(card_instance)
|
||||
_client_deck.shuffle()
|
||||
|
||||
|
||||
func _draw_card(amount : int, deck, discard):
|
||||
var array = []
|
||||
for x in amount:
|
||||
if deck.size() == 0:
|
||||
if discard.size() > 0:
|
||||
deck.append_array(discard)
|
||||
discard = []
|
||||
deck.shuffle()
|
||||
else:
|
||||
break
|
||||
array.append(deck.pop_back())
|
||||
return array
|
||||
|
||||
#Ideas okay?
|
||||
#Make the client cards have a little progress track thats like how much they like their service right,
|
||||
#put the poor/good/great blocks along that track, and instead of the services having that each service
|
||||
#contributes a different number of points along that other track, so the money you recieve for making
|
||||
#the match can be the same across all clients, but it shows how some clients value one more over the other
|
||||
#without actually requiring you to have any specific one as long as you have enough turns to get them along
|
||||
#the track, so a short session with all the perks can be a great service but a less special or less
|
||||
#stress inducing session needs to be longer so the same worker needs to remain occupied longer, and it gives
|
||||
#you more to do on your turn because you get to decide what all your little workers do rather than them only
|
||||
#being interacted with when you're placing down a client card
|
17
Scripts/bonus_icon.gd
Normal file
17
Scripts/bonus_icon.gd
Normal file
@ -0,0 +1,17 @@
|
||||
extends Node2D
|
||||
|
||||
var service = Data.services.CIRCLE
|
||||
|
||||
func get_icon(x):
|
||||
var y = 0
|
||||
if x > 9:
|
||||
y += (x - 9) * 32
|
||||
else:
|
||||
y += x * 32
|
||||
return y
|
||||
|
||||
func set_service(_service):
|
||||
service = _service
|
||||
$Label.text = str(Data.service_prices[service])
|
||||
$Label.visible = true
|
||||
$"Icon1".region_rect = Rect2(get_icon(service), 0, 32, 32)
|
27
Scripts/card.gd
Normal file
27
Scripts/card.gd
Normal file
@ -0,0 +1,27 @@
|
||||
class_name Card
|
||||
extends Node2D
|
||||
|
||||
var services = []
|
||||
|
||||
var origin = Vector3(position.x, position.y, rotation)
|
||||
var destination = null
|
||||
var sliding = false
|
||||
var slide_progress = 0.0
|
||||
var slide_time = 0.5
|
||||
|
||||
func slide_to_position(x, y, r, t):
|
||||
origin = Vector3(position.x, position.y, rotation)
|
||||
destination = Vector3(x, y, r)
|
||||
slide_time = t
|
||||
sliding = true
|
||||
|
||||
func slide(delta):
|
||||
if slide_progress < slide_time:
|
||||
slide_progress += delta
|
||||
var percent = clampf(slide_progress / slide_time, 0.0, 1.0)
|
||||
position.x = lerpf(origin.x, destination.x, percent)
|
||||
position.y = lerpf(origin.y, destination.y, percent)
|
||||
rotation = lerpf(origin.z, destination.z, percent)
|
||||
else:
|
||||
sliding = false
|
||||
slide_progress = 0.0
|
241
Scripts/card_crafter.gd
Normal file
241
Scripts/card_crafter.gd
Normal file
@ -0,0 +1,241 @@
|
||||
extends Node2D
|
||||
|
||||
var card_scene = preload("res://Scenes/card.tscn")
|
||||
var icon_order = [0, 1, 3, 5, 7, 8, 6, 4, 2]
|
||||
var symbol_buttons : Array[TextureButton] = []
|
||||
var symbol_count_labels : Array[LineEdit] = []
|
||||
|
||||
var card_array = []
|
||||
var selected_card = 0
|
||||
var card_count = 1
|
||||
|
||||
var WORKER_DECK_SAVE_PATH = "user://worker_deck.json"
|
||||
|
||||
#example card dict entries
|
||||
#"worker 1": [10, 0]
|
||||
#"worker 2": [10, 1, 3, 4, 8]
|
||||
|
||||
func _ready():
|
||||
#workaround for node array export bug present in Godot 4.0.3.Stable
|
||||
symbol_buttons.append($"crossbutton")
|
||||
symbol_buttons.append($"squarebutton")
|
||||
symbol_buttons.append($"trianglebutton")
|
||||
symbol_buttons.append($"crescentbutton")
|
||||
symbol_buttons.append($"puppybutton")
|
||||
symbol_buttons.append($"riverbutton")
|
||||
symbol_buttons.append($"starbutton")
|
||||
symbol_buttons.append($"chainbutton")
|
||||
symbol_buttons.append($"gustbutton")
|
||||
symbol_count_labels.append($"crosscount")
|
||||
symbol_count_labels.append($"squarecount")
|
||||
symbol_count_labels.append($"trianglecount")
|
||||
symbol_count_labels.append($"crescentcount")
|
||||
symbol_count_labels.append($"puppycount")
|
||||
symbol_count_labels.append($"rivercount")
|
||||
symbol_count_labels.append($"starcount")
|
||||
symbol_count_labels.append($"chaincount")
|
||||
symbol_count_labels.append($"gustcount")
|
||||
|
||||
load_deck()
|
||||
|
||||
func new_deck():
|
||||
for x in card_array:
|
||||
x.queue_free()
|
||||
card_array = []
|
||||
selected_card = 0
|
||||
card_count = 1
|
||||
$name_box.text = "worker " + str(card_count)
|
||||
count_traits()
|
||||
$card_count.text = str(selected_card) + "/" + str(card_array.size())
|
||||
|
||||
func save_deck():
|
||||
var card_dict = {}
|
||||
for card in card_array:
|
||||
var int_array = []
|
||||
int_array.append(card.capacity)
|
||||
int_array.append_array(card.services)
|
||||
card_dict[card.title] = int_array
|
||||
var save_game = FileAccess.open(WORKER_DECK_SAVE_PATH, FileAccess.WRITE)
|
||||
var json_string = JSON.stringify(card_dict)
|
||||
save_game.store_line(json_string)
|
||||
|
||||
func load_deck():
|
||||
if !FileAccess.file_exists(WORKER_DECK_SAVE_PATH):
|
||||
return
|
||||
new_deck()
|
||||
var save_game = FileAccess.open(WORKER_DECK_SAVE_PATH, FileAccess.READ)
|
||||
var card_dict = JSON.parse_string(save_game.get_line())
|
||||
for key in card_dict:
|
||||
var value = card_dict[key]
|
||||
var card_instance = card_scene.instantiate()
|
||||
#JSON only returns floats so we have to get ints out of the dict
|
||||
var bonuses = []
|
||||
for x in value.slice(1, value.size()):
|
||||
bonuses.append(int(x))
|
||||
card_instance.setup(key, int(value[0]), bonuses)
|
||||
card_instance.position = Vector2(-713, -17)
|
||||
card_instance.scale = Vector2(1.45, 1.45)
|
||||
card_array.append(card_instance)
|
||||
card_count += 1
|
||||
if card_array.size() > 1:
|
||||
card_array[selected_card].visible = false
|
||||
selected_card = card_array.size() - 1
|
||||
add_child(card_instance)
|
||||
$name_box.text = "worker " + str(card_count)
|
||||
count_traits()
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
func select_prev():
|
||||
if card_array.size() == 0:
|
||||
return
|
||||
card_array[selected_card].visible = false
|
||||
selected_card -= 1
|
||||
if selected_card < 0:
|
||||
selected_card = card_array.size() - 1
|
||||
card_array[selected_card].visible = true
|
||||
for x in 10:
|
||||
if x == 0:
|
||||
continue
|
||||
if !card_array[selected_card].services.has(x):
|
||||
symbol_buttons[x - 1].set_state(0)
|
||||
if card_array[selected_card].services.has(x):
|
||||
symbol_buttons[x - 1].set_state(1)
|
||||
if card_array[selected_card].services.has((x) + 9):
|
||||
symbol_buttons[x - 1].set_state(2)
|
||||
$name_box.text = card_array[selected_card].title
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
func select_next():
|
||||
if card_array.size() == 0:
|
||||
return
|
||||
card_array[selected_card].visible = false
|
||||
selected_card += 1
|
||||
if selected_card >= card_array.size():
|
||||
selected_card = 0
|
||||
card_array[selected_card].visible = true
|
||||
for x in 10:
|
||||
if x == 0:
|
||||
continue
|
||||
if !card_array[selected_card].services.has(x):
|
||||
symbol_buttons[x - 1].set_state(0)
|
||||
if card_array[selected_card].services.has(x):
|
||||
symbol_buttons[x - 1].set_state(1)
|
||||
if card_array[selected_card].services.has((x) + 9):
|
||||
symbol_buttons[x - 1].set_state(2)
|
||||
$name_box.text = card_array[selected_card].title
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
func count_traits():
|
||||
var capacity_counts = [0, 0, 0, 0]
|
||||
var slot_counts = [0, 0, 0, 0]
|
||||
var symbol_counts = [0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||
for card in card_array:
|
||||
match (card.capacity):
|
||||
8:
|
||||
capacity_counts[0] += 1
|
||||
10:
|
||||
capacity_counts[1] += 1
|
||||
12:
|
||||
capacity_counts[2] += 1
|
||||
14:
|
||||
capacity_counts[3] += 1
|
||||
match (card.services.size()):
|
||||
2:
|
||||
slot_counts[0] += 1
|
||||
3:
|
||||
slot_counts[1] += 1
|
||||
4:
|
||||
slot_counts[2] += 1
|
||||
5:
|
||||
slot_counts[3] += 1
|
||||
for x in 10:
|
||||
if x == 0:
|
||||
continue
|
||||
if x in card.services:
|
||||
symbol_counts[x-1] += 1
|
||||
for x in symbol_count_labels.size():
|
||||
symbol_count_labels[x].text = str(symbol_counts[x])
|
||||
$eightcount.text = str(capacity_counts[0])
|
||||
$tencount.text = str(capacity_counts[1])
|
||||
$twelvecount.text = str(capacity_counts[2])
|
||||
$fourteencount.text = str(capacity_counts[3])
|
||||
$onecount.text = str(slot_counts[0])
|
||||
$twocount.text = str(slot_counts[1])
|
||||
$threecount.text = str(slot_counts[2])
|
||||
$fourcount.text = str(slot_counts[3])
|
||||
|
||||
func determine_card():
|
||||
var array = []
|
||||
array.append(Data.services.CIRCLE)
|
||||
for i in 9:
|
||||
if symbol_buttons[i].state == 1:
|
||||
array.append(i + 1)
|
||||
if symbol_buttons[i].state == 2:
|
||||
array.append((i + 1) + 9)
|
||||
if array.size() <= 1 or array.size() > 5:
|
||||
return
|
||||
var card = []
|
||||
#BUTTONS CONTROLLING STRESS CAPACITY
|
||||
# if $eightbutton.state == 0 and $tenbutton.state == 0 and $twelvebutton.state == 0 and $fourteenbutton.state == 0:
|
||||
# return
|
||||
# if $eightbutton.state != 0:
|
||||
# card.append(8)
|
||||
# if $tenbutton.state != 0:
|
||||
# card.append(10)
|
||||
# if $twelvebutton.state != 0:
|
||||
# card.append(12)
|
||||
# if $fourteenbutton.state != 0:
|
||||
# card.append(14)
|
||||
if array.size() == 2:
|
||||
card.append(14)
|
||||
if array.size() == 3:
|
||||
card.append(12)
|
||||
if array.size() == 4:
|
||||
card.append(10)
|
||||
if array.size() == 5:
|
||||
card.append(8)
|
||||
for i in 5:
|
||||
if array.size() > i:
|
||||
card.append(array[i])
|
||||
return card
|
||||
|
||||
func delete_card():
|
||||
if card_array.size() == 0:
|
||||
return
|
||||
card_array[selected_card].queue_free()
|
||||
card_array.remove_at(selected_card)
|
||||
if selected_card > 0:
|
||||
selected_card -= 1
|
||||
if card_array.size() > 0:
|
||||
card_array[selected_card].visible = true
|
||||
count_traits()
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
func edit_card():
|
||||
var card = determine_card()
|
||||
if card == null:
|
||||
return
|
||||
card_array[selected_card].setup($name_box.text, card[0], card.slice(1, card.size()))
|
||||
count_traits()
|
||||
|
||||
func generate_card_from_buttons():
|
||||
var card = determine_card()
|
||||
if card == null:
|
||||
return
|
||||
var card_instance = card_scene.instantiate()
|
||||
card_instance.setup(str($name_box.text), card[0], card.slice(1, card.size()))
|
||||
card_instance.position = Vector2(-713, -17)
|
||||
card_instance.scale = Vector2(1.45, 1.45)
|
||||
card_array.append(card_instance)
|
||||
card_count += 1
|
||||
if card_array.size() > 1:
|
||||
card_array[selected_card].visible = false
|
||||
selected_card = card_array.size() - 1
|
||||
add_child(card_instance)
|
||||
$name_box.text = "worker " + str(card_count)
|
||||
count_traits()
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
|
||||
func _on_new_2_button_up():
|
||||
get_tree().change_scene_to_file("res://Scenes/main_menu.tscn")
|
114
Scripts/client.gd
Normal file
114
Scripts/client.gd
Normal file
@ -0,0 +1,114 @@
|
||||
class_name Client
|
||||
extends Card
|
||||
|
||||
enum difficulties {EASY, MEDIUM, HARD}
|
||||
|
||||
var icon_prefab = preload("res://Scenes/bonus_icon.tscn")
|
||||
var title = "New Task"
|
||||
var difficulty = difficulties.EASY
|
||||
var initial_stress = 0
|
||||
var turns_left = 4
|
||||
var time_slots = [true, true, false, true]
|
||||
var icon_list = []
|
||||
|
||||
func _process(delta):
|
||||
if sliding:
|
||||
slide(delta)
|
||||
|
||||
func setup(_title, _initial_stress, _time_slots, _services):
|
||||
if _title != "":
|
||||
title = _title
|
||||
initial_stress = _initial_stress
|
||||
time_slots = _time_slots
|
||||
if time_slots[0] == true:
|
||||
$"Control/1turn".visible = true
|
||||
if time_slots[1] == true:
|
||||
$"Control/2turn".visible = true
|
||||
if time_slots[2] == true:
|
||||
$"Control/3turn".visible = true
|
||||
if time_slots[3] == true:
|
||||
$"Control/4turn".visible = true
|
||||
services = []
|
||||
if _services != null and _services != []:
|
||||
services.append_array(_services)
|
||||
match services.size():
|
||||
2, 3:
|
||||
difficulty = difficulties.EASY
|
||||
4, 5:
|
||||
difficulty = difficulties.MEDIUM
|
||||
6, 7:
|
||||
difficulty = difficulties.HARD
|
||||
$Background/Slice1.visible = false
|
||||
$Background/Slice2.visible = false
|
||||
$Background/Slice3.visible = false
|
||||
$Background/Slice4.visible = false
|
||||
if time_slots[0] == true:
|
||||
$Background/Slice1.visible = true
|
||||
if time_slots[1] == true:
|
||||
$Background/Slice2.visible = true
|
||||
if time_slots[2] == true:
|
||||
$Background/Slice3.visible = true
|
||||
if time_slots[3] == true:
|
||||
$Background/Slice4.visible = true
|
||||
$Background/Title.text = str(title)
|
||||
$"Background/Initial Stress".text = str(initial_stress)
|
||||
for x in icon_list:
|
||||
x.queue_free()
|
||||
icon_list = []
|
||||
match difficulty:
|
||||
difficulties.EASY:
|
||||
$easy.visible = true
|
||||
var array_of_bullshit = []
|
||||
array_of_bullshit.append($easy/Standard)
|
||||
array_of_bullshit.append($easy/Great1)
|
||||
array_of_bullshit.append($easy/Great2)
|
||||
for x in array_of_bullshit:
|
||||
var instance = icon_prefab.instantiate()
|
||||
icon_list.append(instance)
|
||||
x.add_child(instance)
|
||||
difficulties.MEDIUM:
|
||||
$medium.visible = true
|
||||
var array_of_bullshit = []
|
||||
array_of_bullshit.append($medium/Standard)
|
||||
array_of_bullshit.append($medium/Good1)
|
||||
array_of_bullshit.append($medium/Good2)
|
||||
array_of_bullshit.append($medium/Great1)
|
||||
array_of_bullshit.append($medium/Great2)
|
||||
for x in array_of_bullshit:
|
||||
var instance = icon_prefab.instantiate()
|
||||
icon_list.append(instance)
|
||||
x.add_child(instance)
|
||||
difficulties.HARD:
|
||||
$hard.visible = true
|
||||
var array_of_bullshit = []
|
||||
array_of_bullshit.append($hard/Standard)
|
||||
array_of_bullshit.append($hard/Poor1)
|
||||
array_of_bullshit.append($hard/Poor2)
|
||||
array_of_bullshit.append($hard/Good1)
|
||||
array_of_bullshit.append($hard/Good2)
|
||||
array_of_bullshit.append($hard/Great1)
|
||||
array_of_bullshit.append($hard/Great2)
|
||||
for x in array_of_bullshit:
|
||||
var instance = icon_prefab.instantiate()
|
||||
icon_list.append(instance)
|
||||
x.add_child(instance)
|
||||
for x in icon_list.size():
|
||||
if x < services.size():
|
||||
icon_list[x].set_service(services[x])
|
||||
else:
|
||||
icon_list[x].visible = false
|
||||
|
||||
|
||||
func show_time_selector():
|
||||
$Control.visible = true
|
||||
|
||||
func update_counter():
|
||||
$"Background/Turns Left Counter".text = str(turns_left)
|
||||
|
||||
signal time_slots_selected
|
||||
|
||||
func _on_turn_pressed(num):
|
||||
turns_left = num
|
||||
update_counter()
|
||||
$Control.visible = false
|
||||
time_slots_selected.emit()
|
192
Scripts/client_card_crafter.gd
Normal file
192
Scripts/client_card_crafter.gd
Normal file
@ -0,0 +1,192 @@
|
||||
extends Node2D
|
||||
|
||||
var card_scene = preload("res://Scenes/client_card.tscn")
|
||||
var icon_order = [0, 1, 3, 5, 7, 8, 6, 4, 2]
|
||||
var symbol_buttons : Array[TextureButton] = []
|
||||
var symbol_count_labels : Array[LineEdit] = []
|
||||
|
||||
var card_array = []
|
||||
var selected_card = 0
|
||||
var card_count = 1
|
||||
|
||||
var CLIENT_DECK_SAVE_PATH = "user://client_deck.json"
|
||||
|
||||
func _ready():
|
||||
#workaround for node array export bug present in Godot 4.0.3.Stable
|
||||
symbol_buttons.append($"crossbutton")
|
||||
symbol_buttons.append($"squarebutton")
|
||||
symbol_buttons.append($"trianglebutton")
|
||||
symbol_buttons.append($"crescentbutton")
|
||||
symbol_buttons.append($"puppybutton")
|
||||
symbol_buttons.append($"riverbutton")
|
||||
symbol_buttons.append($"starbutton")
|
||||
symbol_buttons.append($"chainbutton")
|
||||
symbol_buttons.append($"gustbutton")
|
||||
symbol_count_labels.append($"crosscount")
|
||||
symbol_count_labels.append($"squarecount")
|
||||
symbol_count_labels.append($"trianglecount")
|
||||
symbol_count_labels.append($"crescentcount")
|
||||
symbol_count_labels.append($"puppycount")
|
||||
symbol_count_labels.append($"rivercount")
|
||||
symbol_count_labels.append($"starcount")
|
||||
symbol_count_labels.append($"chaincount")
|
||||
symbol_count_labels.append($"gustcount")
|
||||
|
||||
load_deck()
|
||||
|
||||
func new_deck():
|
||||
for x in card_array:
|
||||
x.queue_free()
|
||||
card_array = []
|
||||
selected_card = 0
|
||||
card_count = 1
|
||||
$Control/LineEdit.text = "client " + str(card_count)
|
||||
count_traits()
|
||||
$card_count.text = str(selected_card) + "/" + str(card_array.size())
|
||||
|
||||
func save_deck():
|
||||
var card_dict = {}
|
||||
for card in card_array:
|
||||
var array = []
|
||||
array.append(card.initial_stress)
|
||||
array.append_array(card.time_slots)
|
||||
array.append_array(card.services)
|
||||
card_dict[card.title] = array
|
||||
var save_game = FileAccess.open(CLIENT_DECK_SAVE_PATH, FileAccess.WRITE)
|
||||
var json_string = JSON.stringify(card_dict)
|
||||
save_game.store_line(json_string)
|
||||
|
||||
func load_deck():
|
||||
if !FileAccess.file_exists(CLIENT_DECK_SAVE_PATH):
|
||||
return
|
||||
new_deck()
|
||||
var save_game = FileAccess.open(CLIENT_DECK_SAVE_PATH, FileAccess.READ)
|
||||
var card_dict = JSON.parse_string(save_game.get_line())
|
||||
for key in card_dict:
|
||||
var value = card_dict[key]
|
||||
var card_instance = card_scene.instantiate()
|
||||
#JSON only returns floats so we have to get ints out of the dict
|
||||
var bool_array = []
|
||||
var int_array = []
|
||||
for x in value.slice(1, 5):
|
||||
bool_array.append(bool(x))
|
||||
for x in value.slice(5, value.size()):
|
||||
int_array.append(int(x))
|
||||
card_instance.setup(key, int(value[0]), bool_array, int_array)
|
||||
card_instance.position = Vector2(-927, -176)
|
||||
card_instance.scale = Vector2(1.288, 1.288)
|
||||
card_array.append(card_instance)
|
||||
card_count += 1
|
||||
if card_array.size() > 1:
|
||||
card_array[selected_card].visible = false
|
||||
selected_card = card_array.size() - 1
|
||||
add_child(card_instance)
|
||||
$Control/LineEdit.text = "task " + str(card_count)
|
||||
count_traits()
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
func select_prev():
|
||||
if card_array.size() == 0:
|
||||
return
|
||||
card_array[selected_card].visible = false
|
||||
selected_card -= 1
|
||||
if selected_card < 0:
|
||||
selected_card = card_array.size() - 1
|
||||
card_array[selected_card].visible = true
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
func select_next():
|
||||
if card_array.size() == 0:
|
||||
return
|
||||
card_array[selected_card].visible = false
|
||||
selected_card += 1
|
||||
if selected_card >= card_array.size():
|
||||
selected_card = 0
|
||||
card_array[selected_card].visible = true
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
func count_traits():
|
||||
var difficulty_counts = [0, 0, 0]
|
||||
var symbol_counts = [0, 0, 0, 0, 0, 0, 0, 0, 0]
|
||||
for card in card_array:
|
||||
match card.difficulty:
|
||||
0:
|
||||
difficulty_counts[0] += 1
|
||||
1:
|
||||
difficulty_counts[1] += 1
|
||||
2:
|
||||
difficulty_counts[2] += 1
|
||||
for x in 10:
|
||||
if x == 0:
|
||||
continue
|
||||
if x in card.services:
|
||||
symbol_counts[x - 1] += 1
|
||||
for x in symbol_count_labels.size():
|
||||
symbol_count_labels[x].text = str(symbol_counts[x])
|
||||
$easycount.text = str(difficulty_counts[0])
|
||||
$mediumcount.text = str(difficulty_counts[1])
|
||||
$hardcount.text = str(difficulty_counts[2])
|
||||
|
||||
func determine_card():
|
||||
var card = []
|
||||
card.append(int($Control/LineEdit2.text))
|
||||
card.append(bool($Control/TextureButton.button_pressed))
|
||||
card.append(bool($Control/TextureButton2.button_pressed))
|
||||
card.append(bool($Control/TextureButton3.button_pressed))
|
||||
card.append(bool($Control/TextureButton4.button_pressed))
|
||||
var services = [Data.services.CIRCLE]
|
||||
if $Control/ItemList.selected > 0:
|
||||
services.append($Control/ItemList.selected)
|
||||
if $Control/ItemList2.selected > 0:
|
||||
services.append($Control/ItemList2.selected)
|
||||
if $Control/ItemList3.selected > 0:
|
||||
services.append($Control/ItemList3.selected)
|
||||
if $Control/ItemList4.selected > 0:
|
||||
services.append($Control/ItemList4.selected)
|
||||
if $Control/ItemList5.selected > 0:
|
||||
services.append($Control/ItemList5.selected)
|
||||
if $Control/ItemList6.selected > 0:
|
||||
services.append($Control/ItemList6.selected)
|
||||
card.append_array(services)
|
||||
return card
|
||||
|
||||
func delete_card():
|
||||
if card_array.size() == 0:
|
||||
return
|
||||
card_array[selected_card].queue_free()
|
||||
card_array.remove_at(selected_card)
|
||||
if selected_card > 0:
|
||||
selected_card -= 1
|
||||
if card_array.size() > 0:
|
||||
card_array[selected_card].visible = true
|
||||
count_traits()
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
func edit_card():
|
||||
var card = determine_card()
|
||||
if card == null:
|
||||
return
|
||||
card_array[selected_card].setup($Control/LineEdit.text, card[0], card.slice(1, 5), card.slice(5, card.size()))
|
||||
count_traits()
|
||||
|
||||
func generate_card_from_buttons():
|
||||
var card = determine_card()
|
||||
if card == null:
|
||||
return
|
||||
var card_instance = card_scene.instantiate()
|
||||
card_instance.setup(str($Control/LineEdit.text), card[0], card.slice(1, 5), card.slice(5, card.size()))
|
||||
card_instance.position = Vector2(-926, -176)
|
||||
card_instance.scale = Vector2(1.288, 1.288)
|
||||
card_array.append(card_instance)
|
||||
card_count += 1
|
||||
if card_array.size() > 1:
|
||||
card_array[selected_card].visible = false
|
||||
selected_card = card_array.size() - 1
|
||||
add_child(card_instance)
|
||||
$Control/LineEdit.text = "task " + str(card_count)
|
||||
count_traits()
|
||||
$card_count.text = str(selected_card + 1) + "/" + str(card_array.size())
|
||||
|
||||
|
||||
func _on_new_2_button_up():
|
||||
get_tree().change_scene_to_file("res://Scenes/main_menu.tscn")
|
8
Scripts/data.gd
Normal file
8
Scripts/data.gd
Normal file
@ -0,0 +1,8 @@
|
||||
extends Node
|
||||
|
||||
enum services {
|
||||
CIRCLE, CROSS, SQUARE, TRIANGLE, CRESCENT, PUPPY, RIVER, STAR, CHAIN, GUST,
|
||||
SCROSS, SSQUARE, STRIANGLE, SCRESCENT, SPUPPY, SRIVER, SSTAR, SCHAIN, SGUST
|
||||
}
|
||||
|
||||
var service_prices = [10, 2, 2, 2, 2, 4, 4, 6, 6, 8]
|
31
Scripts/icon_button.gd
Normal file
31
Scripts/icon_button.gd
Normal file
@ -0,0 +1,31 @@
|
||||
extends TextureButton
|
||||
|
||||
var state = 0
|
||||
|
||||
func press(val):
|
||||
state += val
|
||||
if state > 2:
|
||||
state = 0
|
||||
if state < 0:
|
||||
state = 2
|
||||
set_state(state)
|
||||
|
||||
func set_state(x):
|
||||
state = x
|
||||
$Sprite2D.visible = false
|
||||
$Sprite2D2.visible = false
|
||||
$Sprite2D3.visible = false
|
||||
if state == 0:
|
||||
$Sprite2D.visible = true
|
||||
if state == 1:
|
||||
$Sprite2D2.visible = true
|
||||
if state == 2:
|
||||
$Sprite2D3.visible = true
|
||||
|
||||
func _on_gui_input(event):
|
||||
if event is InputEventMouseButton and event.pressed:
|
||||
match event.button_mask:
|
||||
MOUSE_BUTTON_MASK_LEFT:
|
||||
press(1)
|
||||
MOUSE_BUTTON_MASK_RIGHT:
|
||||
press(-1)
|
18
Scripts/main_menu.gd
Normal file
18
Scripts/main_menu.gd
Normal file
@ -0,0 +1,18 @@
|
||||
extends Control
|
||||
|
||||
func _on_button_pressed():
|
||||
get_tree().change_scene_to_file("res://Scenes/worker_editor.tscn")
|
||||
|
||||
func _on_button_2_pressed():
|
||||
get_tree().change_scene_to_file("res://Scenes/client_editor.tscn")
|
||||
|
||||
func _on_play_game_pressed():
|
||||
get_tree().change_scene_to_file("res://Scenes/gameplay.tscn")
|
||||
|
||||
func _on_check_button_toggled(button_pressed):
|
||||
if button_pressed:
|
||||
$"Worker Deck".visible = true
|
||||
$"Task Deck".visible = true
|
||||
if not button_pressed:
|
||||
$"Worker Deck".visible = false
|
||||
$"Task Deck".visible = false
|
520
Scripts/player.gd
Normal file
520
Scripts/player.gd
Normal file
@ -0,0 +1,520 @@
|
||||
class_name Player
|
||||
extends Node2D
|
||||
|
||||
signal draft_completed
|
||||
signal board_attached
|
||||
|
||||
enum FSMState {DRAFT, SETUP, MANAGEMENT, WORKER, H_WORKER, SHIFT, H_CLIENT}
|
||||
enum DraftType {HIRE_WORKER}
|
||||
|
||||
@export var roster_positions : Array[Node2D] = []
|
||||
@export var slot_buttons : Array[Node2D] = []
|
||||
@export var seconds_to_hide_hand := 2.0
|
||||
@export var seconds_to_show_hand := 2.0
|
||||
var money := 0
|
||||
var payout := 0
|
||||
var cost := 0
|
||||
var hire_costs := [40, 50, 60, 70, 80]
|
||||
var shift_deck : Array[Client] = []
|
||||
var workers : Array[Worker] = []
|
||||
var hand : Array[Worker] = []
|
||||
var active_workers : Array[Worker] = [null, null, null, null, null]
|
||||
var active_clients : Array[Client] = [null, null, null, null, null]
|
||||
var poor_discard : Array[Client] = []
|
||||
var good_discard : Array[Client] = []
|
||||
var great_discard : Array[Client] = []
|
||||
var last_fsm_state := FSMState.SETUP
|
||||
var current_fsm_state := FSMState.SETUP
|
||||
var draft := DraftType.HIRE_WORKER
|
||||
var hand_hiding := false
|
||||
var hand_hidden := false
|
||||
var hand_hiding_progress := 0.0
|
||||
var hand_showing := false
|
||||
var hand_showing_progress := 0.0
|
||||
var shown_for_draft : Array[Worker] = []
|
||||
var selected_for_draft : Array[Worker] = []
|
||||
var draft_limit := 0
|
||||
var current_client : Client
|
||||
var selected_worker : Worker
|
||||
var task_drawn := false
|
||||
var client_assignment : int = -1
|
||||
var board : Board = null
|
||||
var turn_completed = false
|
||||
var round_completed = false
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
#Bug in Godot 4.0.3.stable makes it nessesary to add these manually
|
||||
roster_positions.append($RosterSection/Position1)
|
||||
roster_positions.append($RosterSection/Position2)
|
||||
roster_positions.append($RosterSection/Position3)
|
||||
roster_positions.append($RosterSection/Position4)
|
||||
roster_positions.append($RosterSection/Position5)
|
||||
roster_positions.append($RosterSection/Position6)
|
||||
roster_positions.append($RosterSection/Position7)
|
||||
roster_positions.append($RosterSection/Position8)
|
||||
roster_positions.append($RosterSection/Position9)
|
||||
roster_positions.append($RosterSection/Position10)
|
||||
roster_positions.append($RosterSection/Position11)
|
||||
roster_positions.append($RosterSection/Position12)
|
||||
roster_positions.append($RosterSection/Position13)
|
||||
roster_positions.append($RosterSection/Position14)
|
||||
roster_positions.append($RosterSection/Position15)
|
||||
slot_buttons.append($WorkerPlaySlots/Slot1)
|
||||
slot_buttons.append($WorkerPlaySlots/Slot2)
|
||||
slot_buttons.append($WorkerPlaySlots/Slot3)
|
||||
slot_buttons.append($WorkerPlaySlots/Slot4)
|
||||
slot_buttons.append($WorkerPlaySlots/Slot5)
|
||||
for button in slot_buttons:
|
||||
button.button_pushed.connect(select_slot)
|
||||
$PoorDiscardPile/Label.text = "No / Poor service"
|
||||
$GoodDiscardPile/Label.text = "Good service"
|
||||
$GreatDiscardPile/Label.text = "Great service"
|
||||
$TaskDrawDeck/Label.text = "Click to draw task card"
|
||||
$Camera2D.make_current()
|
||||
await board_attached
|
||||
enter_setup_state()
|
||||
|
||||
|
||||
func _process(delta) -> void:
|
||||
if (hand_hiding):
|
||||
if hand_hiding_progress < seconds_to_hide_hand:
|
||||
hand_hiding_progress += delta
|
||||
var percent = clampf(hand_hiding_progress / seconds_to_hide_hand, 0.0, 1.0)
|
||||
for card in hand:
|
||||
card.hand_position.y = lerpf($Hand.position.y, $Hand.position.y + 300.0, percent)
|
||||
else:
|
||||
hand_hiding = false
|
||||
hand_hidden = true
|
||||
hand_hiding_progress = 0.0
|
||||
if (hand_showing):
|
||||
if hand_showing_progress < seconds_to_show_hand:
|
||||
hand_showing_progress += delta
|
||||
var percent = clampf(hand_showing_progress / seconds_to_show_hand, 0.0, 1.0)
|
||||
for card in hand:
|
||||
card.hand_position.y = lerpf($Hand.position.y + 300.0, $Hand.position.y, percent)
|
||||
else:
|
||||
hand_showing = false
|
||||
hand_showing_progress = 0.0
|
||||
|
||||
|
||||
func start_turn():
|
||||
pass
|
||||
|
||||
|
||||
func start_round():
|
||||
pass
|
||||
|
||||
|
||||
@rpc("call_local")
|
||||
func attach_board(board_path : NodePath):
|
||||
board = get_node(board_path) as Board
|
||||
board_attached.emit()
|
||||
|
||||
|
||||
func add_to_hand(card):
|
||||
hand.append(card)
|
||||
for x in hand.size():
|
||||
var hand_ratio = 0.5
|
||||
|
||||
if hand.size() > 1:
|
||||
hand_ratio = float(x) / float(hand.size() - 1)
|
||||
hand[x].position = $Hand.position
|
||||
hand[x].hand_ratio = hand_ratio
|
||||
hand[x].in_hand = true
|
||||
hand[x].hand_position = $Hand.position
|
||||
hand[x].visible = true
|
||||
hand[x].set_process(true)
|
||||
|
||||
|
||||
func lift_hand():
|
||||
for card in hand:
|
||||
card.hovered = true
|
||||
|
||||
|
||||
func drop_hand():
|
||||
for card in hand:
|
||||
card.hovered = false
|
||||
|
||||
|
||||
func _on_hire_button_pressed():
|
||||
if money >= hire_costs[workers.size()]:
|
||||
money -= hire_costs[workers.size()]
|
||||
$Camera2D/Money.text = "$" + str(money)
|
||||
draft_workers(3, 1, true)
|
||||
await draft_completed
|
||||
$Button.text = "Hire Worker: $" + str(hire_costs[workers.size()])
|
||||
|
||||
|
||||
func assign_task_to_worker():
|
||||
client_assignment = active_workers.find(selected_worker)
|
||||
if active_clients[client_assignment] != null:
|
||||
return
|
||||
current_client.slide_to_position(selected_worker.position.x - 100, selected_worker.position.y - 100, 0.0, 0.3)
|
||||
current_client.show_time_selector()
|
||||
await current_client.time_slots_selected
|
||||
payout = 0
|
||||
payout += current_client.turns_left * 2
|
||||
for service in current_client.services:
|
||||
if selected_worker.services.has(service):
|
||||
payout += Data.service_prices[service]
|
||||
$Camera2D/Payout.text = "$" + str(payout)
|
||||
$"Camera2D/EndTurn".visible = true
|
||||
|
||||
|
||||
func move_to_poor_discard(_button):
|
||||
current_client.slide_to_position($PoorDiscardPile.position.x, $PoorDiscardPile.position.y, 0.0, 0.2)
|
||||
client_assignment = -1
|
||||
$Camera2D/EndTurn.visible = true
|
||||
payout = 0
|
||||
$Camera2D/Payout.text = ""
|
||||
|
||||
|
||||
func select_card(card):
|
||||
if current_fsm_state == FSMState.DRAFT:
|
||||
if selected_for_draft.size() <= draft_limit:
|
||||
if selected_for_draft.has(card):
|
||||
selected_for_draft.remove_at(selected_for_draft.find(card))
|
||||
card.slide_to_position(card.position.x, card.position.y + 40, 0.0, 0.1)
|
||||
else:
|
||||
if selected_for_draft.size() < draft_limit:
|
||||
selected_for_draft.append(card)
|
||||
card.slide_to_position(card.position.x, card.position.y - 40, 0.0, 0.1)
|
||||
return
|
||||
selected_worker = card
|
||||
if current_client != null:
|
||||
assign_task_to_worker()
|
||||
|
||||
|
||||
func select_slot(slot):
|
||||
if selected_worker == null:
|
||||
return
|
||||
if active_workers.has(selected_worker):
|
||||
active_workers[active_workers.find(selected_worker)] = null
|
||||
if hand.has(selected_worker):
|
||||
hand.remove_at(hand.find(selected_worker))
|
||||
active_workers[slot_buttons.find(slot)] = selected_worker
|
||||
selected_worker.slide_to_position(slot.position.x, slot.position.y, 0.0, 0.3)
|
||||
selected_worker = null
|
||||
|
||||
#Shift Phase
|
||||
#1. Swap 1 time token on each worker over to the stress side
|
||||
#2. Pick up the next client card in the deck, and either assign it to
|
||||
# a worker or place it in the no service pile
|
||||
#3. If a worker both has no client, and at least one stress token, remove
|
||||
# a stress token
|
||||
|
||||
#Management Phase
|
||||
#Market Research
|
||||
#Look at the 10 clients, and place them back in the same order
|
||||
#Targeted Advertising
|
||||
#Search through the client discard deck, and add all clients
|
||||
#with one extra type to your shift deck
|
||||
#Roster Worker
|
||||
#Add 1 worker from your hand into the next open slot on your board
|
||||
|
||||
|
||||
func _on_area_2d_input_event(_viewport, event, _shape_idx):
|
||||
if event is InputEventMouseButton and event.pressed:
|
||||
enter_workers_view_state()
|
||||
|
||||
|
||||
func _on_area_2d_2_input_event(_viewport, event, _shape_idx):
|
||||
if event is InputEventMouseButton and event.pressed:
|
||||
enter_management_overview_state()
|
||||
|
||||
|
||||
func _on_task_draw_deck_button_pushed(_button):
|
||||
enter_holding_task_state()
|
||||
|
||||
|
||||
func evaluate_task_success(num):
|
||||
var successfulness = 0
|
||||
var worker = active_workers[num]
|
||||
var client = active_clients[num]
|
||||
match client.services.size():
|
||||
2, 3:
|
||||
successfulness = 2
|
||||
4:
|
||||
successfulness = 1
|
||||
if worker.services.has(client.services[3]):
|
||||
successfulness = 2
|
||||
5:
|
||||
successfulness = 1
|
||||
if worker.services.has(client.services[4]):
|
||||
successfulness = 2
|
||||
6:
|
||||
successfulness = 0
|
||||
if worker.services.has(client.services[3]) or worker.services.has(client.services[4]):
|
||||
successfulness = 1
|
||||
if worker.services.has(client.services[5]):
|
||||
successfulness = 2
|
||||
7:
|
||||
successfulness = 0
|
||||
if worker.services.has(client.services[3]) or worker.services.has(client.services[4]):
|
||||
successfulness = 1
|
||||
if worker.services.has(client.services[5]) or worker.services.has(client.services[6]):
|
||||
successfulness = 2
|
||||
var slide_destination : Vector2
|
||||
match successfulness:
|
||||
0:
|
||||
poor_discard.append(client)
|
||||
slide_destination = $PoorDiscardPile.position
|
||||
1:
|
||||
good_discard.append(client)
|
||||
slide_destination = $GoodDiscardPile.position
|
||||
2:
|
||||
great_discard.append(client)
|
||||
slide_destination = $GreatDiscardPile.position
|
||||
client.slide_to_position(slide_destination.x, slide_destination.y, 0.0, 0.2)
|
||||
client.z_index = 0
|
||||
active_clients[num] = null
|
||||
|
||||
|
||||
func worker_exceeded_capacity(num):
|
||||
active_workers[num].stress = 0
|
||||
active_workers[num].set_process(false)
|
||||
active_workers[num].visible = false
|
||||
workers.remove_at(workers.find(active_workers[num]))
|
||||
active_workers[num] = null
|
||||
|
||||
|
||||
func draft_workers(_draw, pick, cancelable):
|
||||
draft = DraftType.HIRE_WORKER
|
||||
draft_limit = pick
|
||||
shown_for_draft = []
|
||||
selected_for_draft = []
|
||||
var y = 0
|
||||
var x = (250.0 * _draw) / 2.0
|
||||
shown_for_draft.append_array(board.draw_worker(_draw))
|
||||
for i in shown_for_draft.size():
|
||||
var card = shown_for_draft[i]
|
||||
card.visible = true
|
||||
card.set_process(true)
|
||||
card.card_clicked.connect(select_card)
|
||||
var ratio = float(i) / float(_draw - 1)
|
||||
var xx = lerpf(-1 * x, x, ratio)
|
||||
card.slide_to_position(xx, y, 0.0, 0.3)
|
||||
enter_draft_state(cancelable)
|
||||
|
||||
|
||||
func pad_shift_deck():
|
||||
var padding = (2 + (2 * board.round_num)) - shift_deck.size()
|
||||
shift_deck.append_array(board.draw_client(padding))
|
||||
|
||||
|
||||
func process_discard_decks():
|
||||
poor_discard.shuffle()
|
||||
good_discard.shuffle()
|
||||
great_discard.shuffle()
|
||||
for x in range(poor_discard.size() - 1, -1, -1):
|
||||
if x == 0:
|
||||
shift_deck.append(poor_discard[x])
|
||||
else:
|
||||
board.discard_client(poor_discard[x])
|
||||
poor_discard[x].position = Vector2(9999, 9999)
|
||||
poor_discard[x].visible = false
|
||||
poor_discard.remove_at(x)
|
||||
for x in range(good_discard.size() - 1, -1, -1):
|
||||
if x <= int(good_discard.size() / 2.0):
|
||||
shift_deck.append(good_discard[x])
|
||||
else:
|
||||
board.discard_client(good_discard[x])
|
||||
good_discard[x].position = Vector2(9999, 9999)
|
||||
good_discard[x].visible = false
|
||||
good_discard.remove_at(x)
|
||||
for x in range(great_discard.size() - 1, -1, -1):
|
||||
if x < great_discard.size() - 1:
|
||||
shift_deck.append(great_discard[x])
|
||||
else:
|
||||
board.discard_client(great_discard[x])
|
||||
great_discard[x].position = Vector2(9999, 9999)
|
||||
great_discard[x].visible = false
|
||||
great_discard.remove_at(x)
|
||||
|
||||
|
||||
func confirm_draft():
|
||||
if selected_for_draft.size() != draft_limit:
|
||||
return
|
||||
$Camera2D/EndDraft.visible = false
|
||||
$Camera2D/CancelDraft.visible = false
|
||||
match(draft):
|
||||
DraftType.HIRE_WORKER:
|
||||
for card in selected_for_draft:
|
||||
add_to_hand(card)
|
||||
workers.append(card)
|
||||
shown_for_draft.remove_at(shown_for_draft.find(card))
|
||||
for card in shown_for_draft:
|
||||
card.position = Vector2(9999, 9999)
|
||||
board.discard_worker(card)
|
||||
match(last_fsm_state):
|
||||
FSMState.SETUP, FSMState.MANAGEMENT:
|
||||
enter_management_overview_state()
|
||||
draft_completed.emit()
|
||||
|
||||
|
||||
func cancel_draft():
|
||||
$Camera2D/EndDraft.visible = false
|
||||
$Camera2D/CancelDraft.visible = false
|
||||
match(draft):
|
||||
DraftType.HIRE_WORKER:
|
||||
for card in shown_for_draft:
|
||||
card.visible = false
|
||||
card.set_process(false)
|
||||
board.discard_worker(board.search_and_draw_worker(card))
|
||||
match(last_fsm_state):
|
||||
FSMState.SETUP, FSMState.MANAGEMENT:
|
||||
enter_management_overview_state()
|
||||
draft_completed.emit()
|
||||
|
||||
|
||||
func enter_draft_state(cancelable):
|
||||
last_fsm_state = current_fsm_state
|
||||
current_fsm_state = FSMState.DRAFT
|
||||
$Camera2D/PhaseLabel.text = "Choose " + str(draft_limit) + " cards"
|
||||
$Camera2D/EndManagement.visible = false
|
||||
$RosterButton/CollisionShape2D.disabled = true
|
||||
$ReturnButton.visible = false
|
||||
$ReturnButton/CollisionShape2D.disabled = true
|
||||
$Camera2D/EndDraft.visible = true
|
||||
if cancelable:
|
||||
$Camera2D/CancelDraft.visible = true
|
||||
|
||||
|
||||
func enter_setup_state():
|
||||
last_fsm_state = current_fsm_state
|
||||
current_fsm_state = FSMState.SETUP
|
||||
#money = 100
|
||||
$Camera2D/Money.text = "$" + str(money)
|
||||
draft_workers(4, 2, false)
|
||||
|
||||
|
||||
func enter_management_overview_state():
|
||||
last_fsm_state = current_fsm_state
|
||||
current_fsm_state = FSMState.MANAGEMENT
|
||||
for worker in active_workers:
|
||||
if worker != null:
|
||||
worker.decrease_stress(worker.stress)
|
||||
$Camera2D/RoundCounter.text = "Round: " + str(board.round_num)
|
||||
$Camera2D/PhaseLabel.text = "Management Phase"
|
||||
$Camera2D/EndManagement.visible = true
|
||||
$Camera2D/Cost.visible = true
|
||||
$Camera2D/EndShift.visible = false
|
||||
$Camera2D/EndTurn.visible = false
|
||||
$RosterButton/CollisionShape2D.disabled = false
|
||||
$WorkerPlaySlots/Slot1.visible = true
|
||||
$WorkerPlaySlots/Slot2.visible = true
|
||||
$WorkerPlaySlots/Slot3.visible = true
|
||||
$WorkerPlaySlots/Slot4.visible = true
|
||||
$WorkerPlaySlots/Slot5.visible = true
|
||||
$HireWorkerButton.visible = true
|
||||
$Camera2D/TurnCounter.visible = false
|
||||
hand_showing = true
|
||||
selected_worker = null
|
||||
$RosterButton/CollisionShape2D.disabled = false
|
||||
$ReturnButton.visible = false
|
||||
$ReturnButton/CollisionShape2D.disabled = true
|
||||
$Camera2D.position.y = 0
|
||||
for x in hand.size():
|
||||
hand[x].in_hand = true
|
||||
$TaskDrawDeck/Area2D/CollisionShape2D.disabled = true
|
||||
$PoorDiscardPile/Area2D/CollisionShape2D.disabled = true
|
||||
process_discard_decks()
|
||||
pad_shift_deck()
|
||||
$TaskDrawDeck/Count.text = str(shift_deck.size())
|
||||
|
||||
|
||||
func enter_workers_view_state():
|
||||
last_fsm_state = current_fsm_state
|
||||
current_fsm_state = FSMState.WORKER
|
||||
selected_worker = null
|
||||
$RosterButton/CollisionShape2D.disabled = true
|
||||
$ReturnButton.visible = true
|
||||
$ReturnButton/CollisionShape2D.disabled = false
|
||||
$Camera2D.position.y = 640
|
||||
for x in hand.size():
|
||||
hand[x].in_hand = false
|
||||
hand[x].slide_to_position(roster_positions[x].position.x, roster_positions[x].position.y, 0.0, 0.2)
|
||||
|
||||
|
||||
func enter_holding_worker_state():
|
||||
last_fsm_state = current_fsm_state
|
||||
current_fsm_state = FSMState.H_WORKER
|
||||
|
||||
|
||||
func enter_shift_overview_state():
|
||||
last_fsm_state = current_fsm_state
|
||||
current_fsm_state = FSMState.SHIFT
|
||||
$Camera2D/TurnCounter.visible = true
|
||||
$Camera2D/TurnCounter.text = "Turn: " + str(board.turn_num)
|
||||
$Camera2D/PhaseLabel.text = "Shift Phase"
|
||||
$Camera2D/EndManagement.visible = false
|
||||
$RosterButton/CollisionShape2D.disabled = true
|
||||
$WorkerPlaySlots/Slot1.visible = false
|
||||
$WorkerPlaySlots/Slot2.visible = false
|
||||
$WorkerPlaySlots/Slot3.visible = false
|
||||
$WorkerPlaySlots/Slot4.visible = false
|
||||
$WorkerPlaySlots/Slot5.visible = false
|
||||
$ReturnButton.visible = false
|
||||
$ReturnButton/CollisionShape2D.disabled = true
|
||||
$Camera2D.position.y = 0
|
||||
$Camera2D/Cost.visible = false
|
||||
$HireWorkerButton.visible = false
|
||||
for x in hand.size():
|
||||
hand[x].in_hand = true
|
||||
if hand_hidden == false:
|
||||
hand_hiding = true
|
||||
$TaskDrawDeck/Area2D/CollisionShape2D.disabled = false
|
||||
task_drawn = false
|
||||
money += payout
|
||||
payout = 0
|
||||
if client_assignment != null and current_client != null:
|
||||
active_clients[client_assignment] = current_client
|
||||
if active_workers[client_assignment].increase_stress(current_client.initial_stress):
|
||||
worker_exceeded_capacity(client_assignment)
|
||||
client_assignment = -1
|
||||
current_client = null
|
||||
elif client_assignment == -1 and current_client != null:
|
||||
poor_discard.append(current_client)
|
||||
current_client = null
|
||||
$Camera2D/Payout.text = ""
|
||||
$Camera2D/Money.text = "$" + str(money)
|
||||
$Camera2D/EndTurn.visible = false
|
||||
$PoorDiscardPile/Area2D/CollisionShape2D.disabled = true
|
||||
#Pretty sure these are done in the right order even though it looks the wrong way around
|
||||
for x in active_workers.size():
|
||||
if active_workers[x] != null and active_clients[x] == null:
|
||||
active_workers[x].decrease_stress(1)
|
||||
if active_workers[x] != null and active_clients[x] != null:
|
||||
if active_workers[x].increase_stress(1):
|
||||
worker_exceeded_capacity(x)
|
||||
active_clients[x].turns_left -= 1
|
||||
active_clients[x].update_counter()
|
||||
if active_clients[x].turns_left == 0:
|
||||
evaluate_task_success(x)
|
||||
var tasks_done = true
|
||||
for client in active_clients:
|
||||
if client != null:
|
||||
tasks_done = false
|
||||
if shift_deck.size() == 0:
|
||||
if tasks_done:
|
||||
round_completed = true
|
||||
#enter_management_overview_state()
|
||||
else:
|
||||
$Camera2D/EndTurn.visible = true
|
||||
$TaskDrawDeck/Area2D/CollisionShape2D.disabled = true
|
||||
|
||||
|
||||
func enter_holding_task_state():
|
||||
last_fsm_state = current_fsm_state
|
||||
current_fsm_state = FSMState.H_CLIENT
|
||||
current_client = shift_deck.pop_back()
|
||||
current_client.position = Vector2(494, -414)
|
||||
current_client.visible = true
|
||||
current_client.z_index = 1
|
||||
current_client.slide_to_position($PreviewTask.position.x, $PreviewTask.position.y, 0.0, 0.3)
|
||||
task_drawn = true
|
||||
$TaskDrawDeck/Area2D/CollisionShape2D.disabled = true
|
||||
$PoorDiscardPile/Area2D/CollisionShape2D.disabled = false
|
||||
$TaskDrawDeck/Count.text = str(shift_deck.size())
|
||||
|
7
Scripts/slot_button.gd
Normal file
7
Scripts/slot_button.gd
Normal file
@ -0,0 +1,7 @@
|
||||
extends Node2D
|
||||
|
||||
signal button_pushed(button)
|
||||
|
||||
func _on_area_2d_input_event(_viewport, event, _shape_idx):
|
||||
if event is InputEventMouseButton and event.pressed:
|
||||
emit_signal("button_pushed", self)
|
103
Scripts/worker.gd
Normal file
103
Scripts/worker.gd
Normal file
@ -0,0 +1,103 @@
|
||||
class_name Worker
|
||||
extends Card
|
||||
|
||||
var title = "New Card"
|
||||
var max_supers = 2
|
||||
var capacity = 8
|
||||
var stress = 0
|
||||
signal card_clicked(card)
|
||||
@export var spread_curve : Curve
|
||||
@export var height_curve : Curve
|
||||
@export var rotation_curve : Curve
|
||||
@export var hand_width : float
|
||||
@export var hand_height : float
|
||||
@export var hand_rotation : float
|
||||
var in_hand = false
|
||||
var hand_ratio
|
||||
var hand_position = Vector2(0, 0)
|
||||
var hovered = false
|
||||
|
||||
func _process(delta):
|
||||
if sliding:
|
||||
slide(delta)
|
||||
if in_hand:
|
||||
position.x = hand_position.x + spread_curve.sample(hand_ratio) * hand_width
|
||||
position.y = hand_position.y - height_curve.sample(hand_ratio) * hand_height
|
||||
rotation = rotation_curve.sample(hand_ratio) * hand_rotation
|
||||
if hovered:
|
||||
position.y = (hand_position.y - 50.0) - height_curve.sample(hand_ratio) * hand_height
|
||||
position.x = hand_position.x + spread_curve.sample(hand_ratio) * (hand_width + (hand_width * 0.2))
|
||||
rotation = rotation_curve.sample(hand_ratio) * (hand_rotation + (hand_rotation * 0.2))
|
||||
|
||||
func get_icon(x):
|
||||
var y = 32
|
||||
if x > 8:
|
||||
y += (x - 9) * 32
|
||||
else:
|
||||
y += x * 32
|
||||
return y
|
||||
|
||||
func setup(_title, _capacity, _services):
|
||||
if _title != "":
|
||||
title = _title
|
||||
capacity = _capacity
|
||||
services = _services
|
||||
$Sprite2D/Title.text = title
|
||||
$Sprite2D/Capacity.text = str(capacity)
|
||||
$Sprite2D/Bonus1/Icon1.visible = false
|
||||
$Sprite2D/Bonus2/Icon2.visible = false
|
||||
$Sprite2D/Bonus3/Icon3.visible = false
|
||||
$Sprite2D/Bonus4/Icon4.visible = false
|
||||
$Sprite2D/Bonus1/frame1.visible = false
|
||||
$Sprite2D/Bonus2/frame2.visible = false
|
||||
$Sprite2D/Bonus3/frame3.visible = false
|
||||
$Sprite2D/Bonus4/frame4.visible = false
|
||||
$Sprite2D/Bonus1/super1.visible = false
|
||||
$Sprite2D/Bonus2/super2.visible = false
|
||||
$Sprite2D/Bonus3/super3.visible = false
|
||||
$Sprite2D/Bonus4/super4.visible = false
|
||||
if services.size() > 1:
|
||||
$Sprite2D/Bonus1/Icon1.visible = true
|
||||
#TODO:Eliminate the -1 in the get_icon call
|
||||
$Sprite2D/Bonus1/Icon1.region_rect = Rect2(get_icon(services[1]-1), 0, 32, 32)
|
||||
if services[1] > 9:
|
||||
$Sprite2D/Bonus1/super1.visible = true
|
||||
else:
|
||||
$Sprite2D/Bonus1/frame1.visible = true
|
||||
if services.size() > 2:
|
||||
$Sprite2D/Bonus2/Icon2.visible = true
|
||||
$Sprite2D/Bonus2/Icon2.region_rect = Rect2(get_icon(services[2]-1), 0, 32, 32)
|
||||
if services[2] > 9:
|
||||
$Sprite2D/Bonus2/super2.visible = true
|
||||
else:
|
||||
$Sprite2D/Bonus2/frame2.visible = true
|
||||
if services.size() > 3:
|
||||
$Sprite2D/Bonus3/Icon3.visible = true
|
||||
$Sprite2D/Bonus3/Icon3.region_rect = Rect2(get_icon(services[3]-1), 0, 32, 32)
|
||||
if services[3] > 9:
|
||||
$Sprite2D/Bonus3/super3.visible = true
|
||||
else:
|
||||
$Sprite2D/Bonus3/frame3.visible = true
|
||||
if services.size() > 4:
|
||||
$Sprite2D/Bonus4/Icon4.visible = true
|
||||
$Sprite2D/Bonus4/Icon4.region_rect = Rect2(get_icon(services[4]-1), 0, 32, 32)
|
||||
if services[4] > 9:
|
||||
$Sprite2D/Bonus4/super4.visible = true
|
||||
else:
|
||||
$Sprite2D/Bonus4/frame4.visible = true
|
||||
|
||||
|
||||
func _on_area_2d_input_event(_viewport, event, _shape_idx):
|
||||
if event is InputEventMouseButton and event.pressed:
|
||||
emit_signal("card_clicked", self)
|
||||
|
||||
func increase_stress(amount) -> bool:
|
||||
stress += amount
|
||||
$Label.text = str(stress)
|
||||
return stress > capacity
|
||||
|
||||
func decrease_stress(amount):
|
||||
stress -= amount
|
||||
if stress < 0:
|
||||
stress = 0
|
||||
$Label.text = str(stress)
|
Reference in New Issue
Block a user