@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, Wave.WAVE_TESTBOSS] static var START_CHARACTERS = ["MuyangDog", "Lynx", "HCN"] static var buildingShader: bool = true static var tutorialWatched: bool = false 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") if useTutorialBtn.button_pressed: tutorialWatched = true SaveEngine.save() func _ready(): historyStack = Composables.useHistoryStack(playerNameInput) useTutorialBtn.toggled.connect( func(on: bool): useTutorialBtn.text = "观看" if on else "跳过" ) useTutorialBtn.button_pressed = tutorialWatched 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) ) if WorldManager.isRelease(): gamemodeOption.remove_item(3) 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 SaveEngine.save() 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") SaveEngine.save() ) charactersBox.add_child(card) if selectedCharacter == card.name: card.animator.play("show") else: card.animator.play("hide")