using System; using System.Collections; using System.Collections.Generic; using System.Linq; using UnityEngine; using UnityEngine.SceneManagement; [RequireComponent(typeof(NPC))] class NpcShopManager : MonoBehaviour { [SerializeField] public List> DialogueTemplate; /* We user object CLONED TO PREVENT overwritting changes in main object inassets */ public Dialogue Dialogue; [SerializeField] public Shop shop; bool CanShopBeOpened = false; public virtual void Start() { // 1. Set npc state to trading gameObject.GetComponent().State = NPCStateEnum.Trading; // 2. Init dialogue model CreateInstanceBasedOnLanguage(); //this.RegisterShop(); // if its new game or we dont have any save from this map - use deffault shop settings / content // else overwrite value by saved one if (OnMapAppearanceMethod.GameStatus == GameStatus.NewGame || (OnMapAppearanceMethod.Gateway != OnMapAppearanceMethodEnum.NewGame || ShopUIManager.Instance.GetList().Count == 0) ) // 0. Register shop in scene shop manager this.RegisterShop(); //ShopUIManager.Instance.Add(shop); else shop = ShopUIManager.Instance.GetList().Where(shop => { return shop.Npc == gameObject.GetComponent().name && shop.Map == SceneManager.GetActiveScene().name; }).First(); } public void Update() { /* * Conditions: * - player must be in range of shopping * - user must press specific keyboard button * - dialogue panel must be closed * - shop panel must be closed */ if (CanShopBeOpened && Input.GetKeyDown(ShopUIManager.Instance.keyToOpen) && Dialogue.DialogueSteps.First().DialogueController?.CurrentPanel == null && !ShopUIManager.Instance.GetPanelStatus()) { // Open dialogue panel (Shop will be opened later) Dialogue.StartDialogue(); } } public void OnTriggerEnter2D(Collider2D collision) { // don't listen when component is disabled if (!gameObject.GetComponent().enabled) return; /* * Conditions: * - agent in collision must be player * - npc bust me in Trading mode * - shop must be currently closed */ if (collision.gameObject.tag == "Player" && gameObject.GetComponent().State == NPCStateEnum.Trading && !ShopUIManager.Instance.GetPanelStatus()) { CanShopBeOpened = true; } } public void OnTriggerExit2D(Collider2D collision) { // don't listen when component is disabled if (!gameObject.GetComponent().enabled) return; if (collision.gameObject.tag == "Player") { CanShopBeOpened = false; if (Dialogue.DialogueSteps.First().DialogueController?.CurrentPanel != null) Dialogue.BreakDialogueStep(); CloseShop(); } } public void CreateInstanceBasedOnLanguage() { Dialogue = Instantiate(DetectInstanceBasedOnLanguage()); Dialogue.SetSpeakerName(gameObject.GetComponent().name); Dialogue.SetActionAfterDialogueStep(0, Dialogue.ResetDialogue); Dialogue.SetActionAfterDialogueStep(0, OpenShop); } public void RegisterShop() { // 1. Set owner name shop.Npc = gameObject.name; // 2. Create new Shop instance in scene registry list ((SceneShopDataManager)SceneShopDataManager.Instance) .RegisterShop( new Shop( SceneManager.GetActiveScene().name, gameObject.name, shop.GetContent() ) ); } public void OpenShop() { if (EquipmentUIManager.Instance.GetPanelStatus()) EquipmentUIManager.Instance.ClosePanel(); // Set info about current shop in shop UI manager (and wait for event - pressing E) // Open shopa action - invoked as dialogue end action ShopUIManager.Instance.CurrentShopOwnerName = gameObject.GetComponent().name; ShopUIManager.Instance.OpenPanel(); } public void CloseShop() { ShopUIManager.Instance.CurrentShopOwnerName = ""; ShopUIManager.Instance.ClosePanel(); } public Dialogue DetectInstanceBasedOnLanguage() { /*if (!PlayerPrefs.HasKey("language")) throw new Exception("Language not setted !!!");*/ switch(PlayerPrefs.GetString("language")) { case "English": { return DialogueTemplate.Where(template => template.Key == SystemLanguageEnum.English).First().Value; } case "Polish": { return DialogueTemplate.Where(template => template.Key == SystemLanguageEnum.Polish).First().Value; } default: { return DialogueTemplate.Where(template => template.Key == SystemLanguageEnum.Polish).First().Value; } } } }