217 lines
5.9 KiB
GDScript
217 lines
5.9 KiB
GDScript
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)
|