1
1
mirror of https://github.com/Rundll86/Dog-Lynx-And-HCN.git synced 2026-05-27 22:41:56 +08:00
Files
Dog-Lynx-And-HCN/scripts/Contents/Panels/Starter.gd
T
fallingshrimp e1c017bf3a feat: 添加局外养成系统和游戏结束面板改进
添加新的物品类型紫水晶和钻石
实现局外属性升级系统
改进游戏结束面板的返回和退出功能
添加新的UI组件用于显示属性和物品
更新游戏规则和存储系统以支持局外养成
2026-05-04 08:52:20 +08:00

190 lines
6.8 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 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 buildingShader: bool = true
static var selectingFeed: bool = true
static var GAMEMODE_MAP_WAVE = [Wave.WAVE_NORMAL, Wave.WAVE_BOSSRUSH, Wave.WAVE_MOWING]
@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)
UIState.closeCurrentPanel()
func startSingleplayerGame():
startSingleplayerBtn.disabled = true
MultiplayerState.isMultiplayer = false
MultiplayerState.playerName = playerNameInput.text
Wave.usingWaveData = GAMEMODE_MAP_WAVE[gamemodeOption.selected]
UIState.player = EntityBase.generatePlayer(playerNameInput.text)
WorldManager.rootNode.spawnWave(Vector2.ZERO)
UIState.setPanel("CompilingTip")
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 beforeOpen(_args: Array = []):
diffEdit.min_value = GameRule.difficultyRange.x
diffEdit.max_value = GameRule.difficultyRange.y
diffEdit.value = GameRule.difficulty
setState(MultiplayerState.ConnectionState.DISCONNECTED)
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
fieldShow.cost(ItemStore.ItemType.CRYSTAL, 50)
fieldShow.cost(ItemStore.ItemType.DIAMOND, 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
for index in len(fieldShow.costCounts):
fieldShow.costCounts[index] *= GameRule.outGameUpgradeMultipiler
)
upgradeFieldsBox.add_child(fieldShow)
startSingleplayerBtn.disabled = false