extends Node3D @onready var characterScene = preload("res://scenes/character/character.tscn") @onready var turnTimer: Timer = $TurnTimer @onready var shootPhaseTimer: Timer = $ShootPhaseTimer @onready var camera = $cameraRottion/Camera3D @onready var charactersContainer = $CharactersContainer var state: GLOBALS.GAMESTATE = GLOBALS.GAMESTATE.SETUP var players: Array[Player] var selectablePlayers: Array[Player] = players.duplicate() var guns: Array[Gun] var roundCount: int = 0 var playerCount: int = 2 var lastCharacterRotation: int = 0 var rotationInterval: float = 360 / playerCount var currentPlayer: Player var currentPlayerIndex: int = 0 var completedAnimations = 0 func _process(delta: float) -> void: if not turnTimer.is_stopped(): camera.updatTurnTime(turnTimer.time_left, turnTimer.wait_time) else: camera.resetTimer() func _ready() -> void: setState(GLOBALS.GAMESTATE.SETUP) func playerDied(_player: Player) -> void: selectablePlayers.erase(_player) camera.setSelectablePlayers(selectablePlayers) print("Player " + _player.getGameName() + " is dead") ## Give every player a random Gun func givePlayersRandomGun(): randomize() var gunPool = guns.duplicate() for i in selectablePlayers.size(): var newGun = gunPool.pick_random() selectablePlayers[i].giveGun(newGun) gunPool.erase(newGun) ## Gives the gun back to it's owner func givePlayersGun(): for i in guns: i.mainOwner.giveGun(i) i.mainOwner.gun.resetMagazine() ## Sets the Game State func setState(_state: GLOBALS.GAMESTATE): state = _state next() camera.updateGameState(state) ## Calls the function thats fits the current game state func next(): camera.updateUi() match state: GLOBALS.GAMESTATE.SETUP: setupGame() GLOBALS.GAMESTATE.ROUNDSTART: nextRound() GLOBALS.GAMESTATE.PLAYER: nextPlayer() GLOBALS.GAMESTATE.POOL: gunIntoPool() GLOBALS.GAMESTATE.AIM: aimGuns() GLOBALS.GAMESTATE.SHOOT: shootPlayers() GLOBALS.GAMESTATE.END: endGame() func setupGame() -> void: playerCount = 2 print("-- SETUP --") rotationInterval = 360 / playerCount for i in range(0, playerCount): addNewPlayer("Enemy") #addNewPlayer("Player " + str(i+1)) players[0].gameName = "You" players[1].gameName = "Enemy" camera.itemSelected.connect(selectItem.bind()) camera.nextTurn.connect(next.bind()) players[1].bot = true players[1].setBotLogic(Bot.new(GLOBALS.BOTDIFFICULTY.EASY)) setState(GLOBALS.GAMESTATE.ROUNDSTART) func nextRound() -> void: print("-- ROUNDSTART --") for i in players: i.addItem(StandardBullet.new()) i.character.resetAim() i.character.loadGun() roundCount += 1 camera.setRound(roundCount) currentPlayerIndex = 0 setState(GLOBALS.GAMESTATE.PLAYER) func nextPlayer(): print("-- PLAYER --") if currentPlayerIndex + 1 > selectablePlayers.size(): turnTimer.stop() setState(GLOBALS.GAMESTATE.POOL) else: currentPlayer = selectablePlayers[currentPlayerIndex] currentPlayerIndex += 1 if currentPlayer.isBot(): for i in currentPlayer.botLogic.chooseItems(currentPlayer.getItems(), currentPlayer.gun.magazineSize): currentPlayer.useItem(i) turnTimer.start(2) else: turnTimer.start(10) camera.displayPlayerStats(currentPlayer) func gunIntoPool(): print("-- POOL --") for i in selectablePlayers: i.character.addGunToPool() i.character.setAim(i.selectedPlayer) givePlayersRandomGun() func aimGuns(): print("-- AIM --") for i in selectablePlayers: i.character.aimGun() setState(GLOBALS.GAMESTATE.SHOOT) func shootPlayers(): print("-- SHOOT --") currentPlayerIndex = 0 await get_tree().create_timer(1.0).timeout for i in selectablePlayers: i.shootAtSelectedPlayer() func endGame() -> void: print("-- END --") print(selectablePlayers[0].getGameName() + " hat gewonnen") ## Adds a new Player func addNewPlayer(_name: String): var newGun = Gun.new() guns.append(newGun) var newCharacter = addCharacter() newCharacter.addGunToPoolFinished.connect(addGunToPoolFinished.bind()) newCharacter.aimGunFinished.connect(aimGunFinished.bind()) newCharacter.aimGunFinished.connect(shootGunFinished.bind()) var newPlayer: Player = Player.new(_name, newGun, newCharacter) newPlayer.character.setGameName(newPlayer.getGameName()) players.append(newPlayer) selectablePlayers.append(newPlayer) camera.setSelectablePlayers(selectablePlayers) newPlayer.dead.connect(playerDied.bind()) ## Adds a new Character to represent the Player Visualy func addCharacter() -> Character: var newCharacter = characterScene.instantiate() charactersContainer.add_child(newCharacter) lastCharacterRotation += rotationInterval newCharacter.rotation_degrees.y += lastCharacterRotation return newCharacter ## Use Item. Called by Camera via Signal "itemSelected" func selectItem(_itemType: GLOBALS.ITEMTYPES): playerUseItemType(currentPlayer, _itemType) print(_itemType) ## Use item from player func playerUseItemType(_player: Player, _type: GLOBALS.ITEMTYPES) -> void: for i in currentPlayer.getItems(): if i.type == _type: currentPlayer.useItem(i) break camera.displayPlayerStats(currentPlayer) func addGunToPoolFinished() -> void: completedAnimations += 1 print(completedAnimations) if completedAnimations >= selectablePlayers.size(): setState(GLOBALS.GAMESTATE.AIM) completedAnimations = 0 func aimGunFinished() -> void: completedAnimations += 1 print(completedAnimations) if completedAnimations >= selectablePlayers.size(): setState(GLOBALS.GAMESTATE.SHOOT) completedAnimations = 0 func shootGunFinished() -> void: completedAnimations += 1 print(completedAnimations) if completedAnimations >= selectablePlayers.size(): shootPhaseTimer.start() #setState(GLOBALS.GAMESTATE.ROUNDSTART) completedAnimations = 0 func _on_turn_timer_timeout() -> void: currentPlayer.selectPlayer(camera.getPlayerSelection()) nextPlayer() func _on_shoot_phase_timer_timeout() -> void: givePlayersGun() if selectablePlayers.size() <= 1: setState(GLOBALS.GAMESTATE.END) else: setState(GLOBALS.GAMESTATE.ROUNDSTART)