mirror of
https://github.com/Rundll86/Dog-Lynx-And-HCN.git
synced 2026-05-27 22:41:56 +08:00
11a293378c
将字段显示和隐藏逻辑提取为独立方法 为相机添加位置平滑效果 在游戏重启时重置初始饲料选择状态
224 lines
8.1 KiB
GDScript
224 lines
8.1 KiB
GDScript
@tool
|
|
extends FullscreenPanelBase
|
|
class_name StarterPanel
|
|
|
|
@onready var diffEdit: HSlider = $%diffEdit
|
|
@onready var playerNameInput: LineEdit = $%playerNameInput
|
|
@onready var gamemodeOption: OptionButton = $%gamemodeOption
|
|
@onready var useTutorialBtn: Button = $%useTutorialBtn
|
|
|
|
@onready var upgradeFieldsBox: Control = $%upgradeFields
|
|
@onready var crystalShow: ItemShow = $%crystal
|
|
@onready var diamondShow: ItemShow = $%diamond
|
|
|
|
@onready var charactersBox: Control = $%characters
|
|
|
|
@onready var startSingleplayerBtn: Button = $%startSingleplayerBtn
|
|
@onready var startMultiplayerBtn: Button = $%startMultiplayerBtn
|
|
@onready var levelShow: Label = $%levelShow
|
|
@onready var hostInput: LineEdit = $%hostInput
|
|
@onready var portInput: LineEdit = $%portInput
|
|
@onready var launchBtn: Button = $%launchBtn
|
|
@onready var connectBtn: Button = $%connectBtn
|
|
@onready var maxPlayerInput: LineEdit = $%maxPlayerInput
|
|
@onready var connectionState: Label = $%connectionState
|
|
@onready var disconnectBtn: Button = $%disconnectBtn
|
|
@onready var serverConfig: VBoxContainer = $%serverConfig
|
|
@onready var players: VBoxContainer = $%players
|
|
@onready var playersList: VBoxContainer = $%list
|
|
|
|
var historyStack
|
|
|
|
static var GAMEMODE_MAP_WAVE = [Wave.WAVE_NORMAL, Wave.WAVE_BOSSRUSH, Wave.WAVE_MOWING]
|
|
static var START_CHARACTERS = ["MuyangDog", "Lynx", "HCN"]
|
|
static var buildingShader: bool = true
|
|
static var selectingFeed: bool = true
|
|
static var selectedCharacter: String = MathTool.randomChoiceFrom(START_CHARACTERS)
|
|
|
|
@rpc("any_peer")
|
|
func mutexPlayer(player: String):
|
|
if multiplayer.is_server():
|
|
if getPlayerNames().count(player) > 1:
|
|
var newName = player + str(randi_range(1000, 99999999999))
|
|
setPlayerName.rpc(player, newName)
|
|
setPlayerName(player, newName)
|
|
@rpc("any_peer")
|
|
func joinPlayer(player: String):
|
|
if multiplayer.is_server():
|
|
addPlayerName(player)
|
|
rebuildAllPlayers.rpc(getPlayerNames())
|
|
mutexPlayer(player)
|
|
@rpc("any_peer")
|
|
func leavePlayer(playerName: String):
|
|
if multiplayer.is_server():
|
|
removePlayerName(playerName)
|
|
rebuildAllPlayers.rpc(getPlayerNames())
|
|
@rpc("any_peer")
|
|
func setPlayerName(oldName: String, newName: String):
|
|
if playerNameInput.text == oldName:
|
|
playerNameInput.text = newName
|
|
historyStack[0].getData().append(newName)
|
|
for i in playersList.get_children():
|
|
if i.text == oldName:
|
|
i.text = newName
|
|
break
|
|
@rpc("any_peer")
|
|
func rebuildAllPlayers(playerNames: Array[String]):
|
|
for i in playersList.get_children():
|
|
i.queue_free()
|
|
for i in playerNames:
|
|
addPlayerName(i)
|
|
|
|
@rpc("any_peer")
|
|
func startMultiplayerGame():
|
|
MultiplayerState.isMultiplayer = true
|
|
MultiplayerState.playerName = playerNameInput.text
|
|
MultiplayerState.connection = multiplayer.multiplayer_peer
|
|
WorldManager.rootNode.multiplayer.multiplayer_peer = multiplayer.multiplayer_peer
|
|
for i in getPlayerNames():
|
|
EntityBase.generatePlayer(i, selectedCharacter)
|
|
UIState.closeCurrentPanel()
|
|
func startSingleplayerGame():
|
|
startSingleplayerBtn.disabled = true
|
|
MultiplayerState.isMultiplayer = false
|
|
MultiplayerState.playerName = playerNameInput.text
|
|
Wave.usingWaveData = GAMEMODE_MAP_WAVE[gamemodeOption.selected]
|
|
var extras = ArrayTool.mergeDictionary(ArrayTool.dictionaryFromEntries(
|
|
getCurrentSelectedCharacter().fields,
|
|
getCurrentSelectedCharacter().fieldValues
|
|
), OutGameStorage.upgradableFieldsValue)
|
|
UIState.player = EntityBase.generatePlayer(playerNameInput.text, selectedCharacter, extras)
|
|
WorldManager.rootNode.spawnWave(Vector2.ZERO)
|
|
if buildingShader:
|
|
UIState.setPanel("CompilingTip")
|
|
else:
|
|
UIState.setPanel("SelectInitialFeed")
|
|
|
|
func _ready():
|
|
historyStack = Composables.useHistoryStack(playerNameInput)
|
|
useTutorialBtn.toggled.connect(
|
|
func(on: bool):
|
|
useTutorialBtn.text = "观看" if on else "跳过"
|
|
)
|
|
multiplayer.connection_failed.connect(
|
|
func():
|
|
setState(MultiplayerState.ConnectionState.DISCONNECTED)
|
|
)
|
|
multiplayer.connected_to_server.connect(
|
|
func():
|
|
joinPlayer.rpc(playerNameInput.text)
|
|
setState(MultiplayerState.ConnectionState.CONNECTED_CLIENT)
|
|
)
|
|
startSingleplayerBtn.pressed.connect(
|
|
func():
|
|
startSingleplayerGame()
|
|
)
|
|
startMultiplayerBtn.pressed.connect(
|
|
func():
|
|
# startMultiplayerGame.rpc()
|
|
# startMultiplayerGame()
|
|
UIState.showTip("敬请期待!", TipBox.MessageType.ERROR)
|
|
)
|
|
maxPlayerInput.text_changed.connect(
|
|
func(text):
|
|
MultiplayerState.maxPlayer = int(text)
|
|
)
|
|
launchBtn.pressed.connect(
|
|
func():
|
|
multiplayer.multiplayer_peer = MultiplayerState.launchServer(int(portInput.text))
|
|
joinPlayer(playerNameInput.text)
|
|
setState(MultiplayerState.ConnectionState.CONNECTED_HOST)
|
|
)
|
|
connectBtn.pressed.connect(
|
|
func():
|
|
multiplayer.multiplayer_peer = MultiplayerState.connectClient(hostInput.text, int(portInput.text))
|
|
setState(MultiplayerState.ConnectionState.CONNECTING)
|
|
)
|
|
disconnectBtn.pressed.connect(
|
|
func():
|
|
leavePlayer.rpc(playerNameInput.text)
|
|
setState(MultiplayerState.ConnectionState.DISCONNECTED)
|
|
)
|
|
var getLast = historyStack[1]
|
|
playerNameInput.text_changed.connect(
|
|
func(newText):
|
|
setPlayerName.rpc(getLast.call(1), newText)
|
|
setPlayerName(getLast.call(1), newText)
|
|
mutexPlayer.rpc(newText)
|
|
)
|
|
func _physics_process(_delta):
|
|
levelShow.text = "%d ∈ [%d, %d]" % [diffEdit.value, diffEdit.min_value, diffEdit.max_value]
|
|
GameRule.difficulty = diffEdit.value
|
|
|
|
func setState(state: MultiplayerState.ConnectionState):
|
|
MultiplayerState.state = state
|
|
connectionState.text = "状态:%s" % MultiplayerState.stateTextMap[state]
|
|
connectionState.modulate = MultiplayerState.stateColorMap[state]
|
|
disconnectBtn.disabled = not MultiplayerState.isConnected()
|
|
# startMultiplayerBtn.disabled = not MultiplayerState.isConnected() || !multiplayer.is_server()
|
|
serverConfig.visible = MultiplayerState.state == MultiplayerState.ConnectionState.CONNECTED_HOST
|
|
players.visible = MultiplayerState.isConnected()
|
|
func addPlayerName(playerName: String):
|
|
playersList.add_child(QuickUI.graySmallText(playerName))
|
|
func removePlayerName(playerName: String):
|
|
for i in playersList.get_children():
|
|
if i.text == playerName:
|
|
i.queue_free()
|
|
func getPlayerNames() -> Array[String]:
|
|
var result: Array[String] = []
|
|
for i in playersList.get_children():
|
|
result.append(i.text)
|
|
return result
|
|
|
|
func getCurrentSelectedCharacter() -> CharacterCard:
|
|
return charactersBox.get_node(selectedCharacter as NodePath)
|
|
|
|
func beforeOpen(_args: Array = []):
|
|
diffEdit.min_value = GameRule.difficultyRange.x
|
|
diffEdit.max_value = GameRule.difficultyRange.y
|
|
diffEdit.value = GameRule.difficulty
|
|
setState(MultiplayerState.ConnectionState.DISCONNECTED)
|
|
rebuildInfo()
|
|
startSingleplayerBtn.disabled = false
|
|
Wave.current = 0
|
|
|
|
func rebuildInfo():
|
|
crystalShow.count = OutGameStorage.inventory[ItemStore.ItemType.CRYSTAL]
|
|
diamondShow.count = OutGameStorage.inventory[ItemStore.ItemType.DIAMOND]
|
|
for child in upgradeFieldsBox.get_children():
|
|
upgradeFieldsBox.remove_child(child)
|
|
for field in OutGameStorage.upgradableFieldsAdvance:
|
|
var fieldShow = ComponentManager.getUIComponent("FieldShow").instantiate() as FieldShow
|
|
var level = OutGameStorage.upgradableFieldsLevel[field]
|
|
for item in OutGameStorage.upgradableFieldsCost:
|
|
var count = OutGameStorage.upgradableFieldsCost[item]
|
|
fieldShow.cost(item, count[0] * (level + count[1]))
|
|
fieldShow.upgradable = true
|
|
fieldShow.upgradeValue = OutGameStorage.upgradableFieldsAdvance[field]
|
|
fieldShow.field = field
|
|
fieldShow.value = OutGameStorage.upgradableFieldsValue[field]
|
|
fieldShow.showAdvantage = true
|
|
fieldShow.upgrade.connect(
|
|
func(newValue: float):
|
|
OutGameStorage.upgradableFieldsValue[fieldShow.field] = newValue
|
|
OutGameStorage.upgradableFieldsLevel[fieldShow.field] += 1
|
|
rebuildInfo()
|
|
)
|
|
upgradeFieldsBox.add_child(fieldShow)
|
|
for child in charactersBox.get_children():
|
|
charactersBox.remove_child(child)
|
|
for character in START_CHARACTERS:
|
|
var card = ComponentManager.getCharacterCard(character).instantiate() as CharacterCard
|
|
card.select.connect(
|
|
func():
|
|
if card.name == selectedCharacter: return
|
|
getCurrentSelectedCharacter().animator.play("hide")
|
|
selectedCharacter = card.name
|
|
getCurrentSelectedCharacter().animator.play("show")
|
|
)
|
|
charactersBox.add_child(card)
|
|
if selectedCharacter == card.name:
|
|
card.animator.play("show")
|
|
else:
|
|
card.animator.play("hide")
|