void checkAndExecuteExchange() { gManager.cameraMovementLocked = false; bool spotFound = false; GameObject newPoint = originalPoint; foreach (GameObject spot in gManager.exchangePoints) { if (isInteractableSpot(spot) && spot != originalPoint && Vector3.Distance(transform.position, spot.transform.position) < SNAP_DISTANCE) { newPoint = spot; spotFound = true; break; } } // Si le token n'est pas dirigé vers un emplacement différent, on le remet à son emplacement de départ if (!spotFound) { Debug.LogWarning("Not found"); transform.position = originalPoint.transform.position; } // Sinon, on le déplace vers son nouvel emplacement else { CharacterBehaviorIHM charaIHM = gManager.actionCharacter.GetComponent <CharacterBehaviorIHM>(); //if (!gManager.tokensInteractedWith.Contains(token)) gManager.tokensInteractedWith.Add(token); // Si un autre token se trouve déjà à cet endroit, échanger sa place avec celui-ci if (newPoint.GetComponent <ExchangePointUI>().isHoldingToken()) { Debug.Log("Echange"); TokenExchangeUI otherToken = newPoint.GetComponent <ExchangePointUI>().occupyingToken.GetComponent <TokenExchangeUI>(); otherToken.originalPoint = originalPoint; otherToken.transform.position = originalPoint.transform.position; originalPoint.GetComponent <ExchangePointUI>().occupyingToken = otherToken.gameObject; //if (!gManager.tokensInteractedWith.Contains(otherToken.token)) gManager.tokensInteractedWith.Add(otherToken.token); // Le token est déplacé vers l'emplacement de token transporté if (newPoint.GetComponent <ExchangePointUI>().isCarriedTokenSpot()) { charaIHM.deposerToken(); if (token.GetComponent <Token>().tokenHolder != null) { CharacterBehavior characterHoldingThisToken = token.GetComponent <Token>().tokenHolder; characterHoldingThisToken.GetComponent <CharacterBehaviorIHM>().deposerToken(); characterHoldingThisToken.GetComponent <CharacterBehaviorIHM>().ramasserToken(otherToken.token); } else { checkIfHoldingToken(token); otherToken.token.GetComponent <Token>().caseActuelle = currentCase.gameObject; } // Jouer le son de l'objet qui est ramassé GameManager.gManager.playSound(token.GetComponent <TokenIHM>().tokenGetSound); charaIHM.ramasserToken(token); } // Le token est déplacé vers l'emplacement de sol else if (originalPoint.GetComponent <ExchangePointUI>().isCarriedTokenSpot()) { // Jouer le son de l'objet qui est déposé GameManager.gManager.playSound(token.GetComponent <TokenIHM>().tokenDropSound); charaIHM.deposerToken(); if (otherToken.token.GetComponent <Token>().tokenHolder != null) { CharacterBehavior characterHoldingOtherToken = otherToken.token.GetComponent <Token>().tokenHolder; characterHoldingOtherToken.GetComponent <CharacterBehaviorIHM>().deposerToken(); characterHoldingOtherToken.GetComponent <CharacterBehaviorIHM>().ramasserToken(token); } else { checkIfHoldingToken(otherToken.token); token.GetComponent <Token>().caseActuelle = currentCase.gameObject; } charaIHM.ramasserToken(otherToken.token); } } // Sinon else { Debug.Log("Transfert"); // Déposer le token au sol et si un autre personnage est présent, lui associer if (originalPoint.GetComponent <ExchangePointUI>().isCarriedTokenSpot()) { // find if another character can hold the dropped item CharacterBehavior receiverCharacter = currentCase.getOtherMainCharacter(token.GetComponent <Token>().tokenHolder); // Jouer le son de l'objet qui est déposé GameManager.gManager.playSound(token.GetComponent <TokenIHM>().tokenDropSound); charaIHM.deposerToken(); //Debug.Log(receiverCharacter); if (receiverCharacter != null) { receiverCharacter.GetComponent <CharacterBehaviorIHM>().ramasserToken(token); } token.GetComponent <Token>().caseActuelle = currentCase.gameObject; } // Récupérer le token else if (newPoint.GetComponent <ExchangePointUI>().isCarriedTokenSpot()) { // Si le token était déjà tenu par un autre personnage, les dissocier if (token.GetComponent <Token>().tokenHolder != null) { token.GetComponent <Token>().tokenHolder.GetComponent <CharacterBehaviorIHM>().deposerToken(); } // Sinon, si le token à ramasser est un personnage qui porte un objet, déposer son objet else { checkIfHoldingToken(token); } // Jouer le son de l'objet qui est ramassé GameManager.gManager.playSound(token.GetComponent <TokenIHM>().tokenGetSound); charaIHM.ramasserToken(token); } else { Debug.LogError("TokenExchangeUI, checkAndExecuteExchange: Token non affilié"); } originalPoint.GetComponent <ExchangePointUI>().occupyingToken = null; } originalPoint = newPoint; transform.position = newPoint.transform.position; newPoint.GetComponent <ExchangePointUI>().occupyingToken = gameObject; // Recalculer le déplacement du personnage gManager.actionCharacter.GetComponent <CharacterBehaviorIHM>().recomputePossibleActionsIHM(false, false); } }
void instantiateExchangeableTokens(CaseBehavior overflownCase, GameObject token, GameObject point) { GameObject temp, tempIcon; Quaternion rotation = gManager.tempTokenExchangePrefab.transform.rotation; bool interactableToken = true; temp = (GameObject)Instantiate(gManager.tempTokenExchangePrefab, point.transform.position, rotation); temp.SetActive(true); temp.GetComponent <Image>().sprite = token.GetComponent <SpriteRenderer>().sprite; temp.transform.SetParent(gManager.exchangeUI.transform); temp.transform.localScale = new Vector3(1, 1, 1); TokenExchangeUI exchangeUI = temp.GetComponent <TokenExchangeUI>(); exchangeUI.enabled = true; exchangeUI.token = token; exchangeUI.originalPoint = point; exchangeUI.currentCase = overflownCase; tempIcon = (GameObject)Instantiate(gManager.tempTokenExchangePrefab, point.transform.position, rotation); tempIcon.SetActive(true); tempIcon.GetComponent <Button>().enabled = false; tempIcon.GetComponent <TokenExchangeUI>().enabled = false; tempIcon.transform.SetParent(temp.transform); tempIcon.transform.localScale = new Vector3(1, 1, 1); tempIcon.GetComponent <Image>().sprite = token.GetComponent <TokenIHM>().getTokenIcon().GetComponent <SpriteRenderer>().sprite; tempIcon.transform.Find("Token Highlight").gameObject.SetActive(false); if (overflownCase.type == CaseBehavior.typeCase.caseFosse && token.GetComponent <Item_Corde>() == null) { interactableToken = false; } else { CharacterBehavior chara = token.GetComponent <CharacterBehavior>(); if (chara != null) { if (chara.affiliationJoueur != associatedToken.affiliationJoueur || !chara.wounded) { interactableToken = false; } } } // Si le token est porté par un personnage if (token.GetComponent <Token>().tokenHolder != null) { Token t = token.GetComponent <Token>(); bool holdingWoundedAlly = false; if (associatedCharacter.tokenTranporte != null) { if (associatedCharacter.tokenTranporte.GetComponent <CharacterBehavior>() != null) { holdingWoundedAlly = associatedCharacter.tokenTranporte.GetComponent <CharacterBehavior>().wounded; } } // Si on survole un adversaire non blessé, on ne peut pas lui prendre son token // OU // Si le token est une corde au sol au dessus d'une fosse, on ne peut pas le récupérer (cela tuerait le personnage qui la tient) // OU // Si le personnage allié qui tient le token est blessé et que le personnage actif porte déjà un blessé, il ne peut qu'échanger les blessés if ((!gManager.isActivePlayer(t.tokenHolder.affiliationJoueur) && !t.tokenHolder.wounded) || (!point.name.Contains("Carried") && token.GetComponent <Item_Corde>() != null && overflownCase.type == CaseBehavior.typeCase.caseFosse) || (gManager.isActivePlayer(t.tokenHolder.affiliationJoueur) && holdingWoundedAlly && t.tokenHolder.wounded)) { interactableToken = false; } } if (!interactableToken) { temp.GetComponent <Button>().enabled = false; temp.GetComponent <TokenExchangeUI>().enabled = false; temp.transform.Find("Token Highlight").gameObject.SetActive(false); } point.GetComponent <ExchangePointUI>().occupyingToken = temp; gManager.exchangePoints.Add(point); }