diff --git a/ColorlessWorld-2024-4-2/Assets/GameDate/PlayerState.asset b/ColorlessWorld-2024-4-2/Assets/GameDate/PlayerState.asset index 228e88c4..e9f2d989 100644 --- a/ColorlessWorld-2024-4-2/Assets/GameDate/PlayerState.asset +++ b/ColorlessWorld-2024-4-2/Assets/GameDate/PlayerState.asset @@ -23,4 +23,5 @@ MonoBehaviour: currentHP: 68 cardRewardNumToChoose: 0 cardRewardNumToGget: 0 + castRange: 2 money: 0 diff --git a/ColorlessWorld-2024-4-2/Assets/GameDate/cardDeckList.asset b/ColorlessWorld-2024-4-2/Assets/GameDate/cardDeckList.asset index e3391e16..c3ab45f0 100644 --- a/ColorlessWorld-2024-4-2/Assets/GameDate/cardDeckList.asset +++ b/ColorlessWorld-2024-4-2/Assets/GameDate/cardDeckList.asset @@ -14,9 +14,9 @@ MonoBehaviour: m_EditorClassIdentifier: cardDeckList: - 1001 - - 1001 - - 1001 - - 1001 - - 1001 - - 1001 - - 1001 + - 2002 + - 2001 + - 2001 + - 2002 + - 2002 + - 2002 diff --git a/ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity b/ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity index 93eb83bf..4a65351a 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity +++ b/ColorlessWorld-2024-4-2/Assets/Scenes/SampleScene.unity @@ -14886,6 +14886,9 @@ MonoBehaviour: whiteNodeCount: 0 blackNodeCount: 0 metalNodeCount: 0 + playerNodeCount: 0 + neutralNodeCount: 0 + enemyNodeCount: 0 --- !u!1 &690000101 GameObject: m_ObjectHideFlags: 0 @@ -26896,6 +26899,7 @@ MonoBehaviour: - Y: [] - Y: [] - Y: [] + - Y: [] character: 0 playerOn: {fileID: 0} player: {fileID: 1809205617} diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Buff/Buff_TempCastRange.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Buff/Buff_TempCastRange.cs new file mode 100644 index 00000000..76f1ed18 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Buff/Buff_TempCastRange.cs @@ -0,0 +1,28 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.UI; + +public class Buff_TempCastRange : Buff +{ + + public override void Settle() + { + value = 0; + } + + public override void UIShow(GameObject buff, string key) + { + base.UIShow(buff, key); + } + + + + public override Buff NewBuff(int value) + { + Buff buff = new Buff_TempCastRange(); + buff.value = value; + buff.icon = BuffDataManager.Instance.LoadImage(iconPath + "Sslx_Ui_Buff_chanraou_v01"); + return buff; + } +} diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Buff/Buff_TempCastRange.cs.meta b/ColorlessWorld-2024-4-2/Assets/Scripts/Buff/Buff_TempCastRange.cs.meta new file mode 100644 index 00000000..3bddffa2 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Buff/Buff_TempCastRange.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: a4f050aa05c46b844a6f46a2cfb6c41a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs index 0167da1c..24807643 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardDrag.cs @@ -259,8 +259,27 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag //检查卡牌的费用是否可以释放 private void costCheck() { - Debug.Log("当前费用:" + TurnMaster.Instance.currentCost); - Debug.Log("总费用:" + Usermanager.Instance.totalCost); + switch (cardEntity.cardOriginalData.costType) + { + case Name.CostType.energy: + energyCostCheck(); + break; + case Name.CostType.step: + stepCostCheck(); + break; + case Name.CostType.health: + healthCostCheck(); + break; + case Name.CostType.node: + break; + + + } + + } + + private void energyCostCheck() + { int trueCost = cardEntity.cardOriginalData.Cost; if (MapUnityManager.Instance.isPlayerOn(Name.NodeColor.Black)) { @@ -268,11 +287,40 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag } if (GameManager.Instance.playerState.currentCost - trueCost < 0) { - Debug.Log("费用不足"); - TipManager.Instance.SendTip("费用不足"); + Debug.Log("能量费用不足"); + TipManager.Instance.SendTip("能量费用不足"); cardEntity.canUse = false; } + } + private void stepCostCheck() + { + int trueCost = cardEntity.cardOriginalData.Cost; + if (MapUnityManager.Instance.isPlayerOn(Name.NodeColor.Black)) + { + trueCost++; + } + if (GameManager.Instance.playerState.currentStepRange - trueCost < 0) + { + Debug.Log("步数费用不足"); + TipManager.Instance.SendTip("步数费用不足"); + cardEntity.canUse = false; + } + } + + private void healthCostCheck() + { + int trueCost = cardEntity.cardOriginalData.Cost; + if (MapUnityManager.Instance.isPlayerOn(Name.NodeColor.Black)) + { + trueCost++; + } + if (GameManager.Instance.playerState.currentHP - trueCost < 0) + { + Debug.Log("健康费用不足"); + TipManager.Instance.SendTip("健康费用不足"); + cardEntity.canUse = false; + } } private void stepCostCheck(bool canAdv) @@ -445,11 +493,15 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag currentNode = raycastHit.collider.transform.GetComponent(); //重新调用范围预览 //GameManager.Instance.player.StepPreviewInfluencedNode(cardEntity.cardOriginalData.CastingRange); - int castRange = cardEntity.cardOriginalData.CastingRange; + int castRange = GameManager.Instance.playerState.castRange; if (MapUnityManager.Instance.isPlayerOn(Name.NodeColor.Green)) { castRange++; } + if (Usermanager.playerAbnormalCondition.ContainsKey(AbnormalCondition.tempCastRange)) + { + castRange+= Usermanager.playerAbnormalCondition[AbnormalCondition.tempCastRange].value; + } setCastingRangePreview(castRange); //预览影响范围 if (currentNode.influenced) @@ -480,7 +532,7 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag mapUnity.influenced = false; } MapUnityManager.Instance.castPool.Clear(); - MapUnityManager.Instance.getCastPool(cardEntity.cardOriginalData.EffectRange, castRange); + MapUnityManager.Instance.getCastPool(castRange); } @@ -508,7 +560,9 @@ public class CardDrag : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDrag cardEntity.influencePreviewPool.Add(currentNode); } }*/ - getNodeTools.setEffectRangePreview(cardEntity.cardOriginalData.EffectRange, 30.0f, currentNode, cardEntity); + //getNodeTools.setEffectRangePreview(cardEntity.cardOriginalData.EffectRange, 30.0f, currentNode, cardEntity); + MapUnity mapUnity=GameManager.Instance.playerOn; + getNodeTools.setEffectRangePreviewTest(cardEntity.cardOriginalData, 90.0f, mapUnity, cardEntity); //更新效果作用范围内怪物虚血 EnemyManager.Instance.ShowExpHp_Observer(cardEntity.influencePreviewPool); //更新涂色预览材质 diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs index d018fe73..2968dc08 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardEntity.cs @@ -104,7 +104,7 @@ public class CardEntity : MonoBehaviour { checkAndUpdateCondition(); createCardCost(); - createCastRange(); + //createCastRange(); } IEnumerator SyncVuleText() { @@ -127,6 +127,20 @@ public class CardEntity : MonoBehaviour public void createCard(string cardId, int cardIndex,bool needTrueFun) { Debug.Log("创建ID" + cardId + "needTrueFun是" + needTrueFun); + if (CardOriginalDataList.Instance.existCardOriginalDataList.TryGetValue(cardId,out cardOriginalData)) + { + createDyeingCard(cardId, cardIndex, needTrueFun); + }else if (CardOriginalDataList.Instance.existEffectCardOriginalDataList.TryGetValue(cardId, out cardOriginalData)) + { + createEffectCard(cardId, cardIndex, needTrueFun); + }else if (CardOriginalDataList.Instance.existItemCardOriginalDataList.TryGetValue(cardId, out cardOriginalData)) + { + createItemCard(cardId, cardIndex, needTrueFun); + } + } + + public void createDyeingCard(string cardId, int cardIndex, bool needTrueFun) + { this.cardId = cardId; //Debug.Log(cardId + "-" + CardOriginalDataList.Instance.cardOriginalDataList[cardId]); cardOriginalData = CardOriginalDataList.Instance.existCardOriginalDataList[cardId]; @@ -140,6 +154,36 @@ public class CardEntity : MonoBehaviour this.cardIndex = cardIndex; } + public void createEffectCard(string cardId, int cardIndex, bool needTrueFun) + { + this.cardId = cardId; + //Debug.Log(cardId + "-" + CardOriginalDataList.Instance.cardOriginalDataList[cardId]); + cardOriginalData = CardOriginalDataList.Instance.existEffectCardOriginalDataList[cardId]; + settleForStart(SettlementManager.settleTurn); + createEffectCardUI(needTrueFun); + //createCardDescription(); + //createCardName(); + //createCardCost(); + //createCardImage(); + //createCardImageTest(); + this.cardIndex = cardIndex; + } + + public void createItemCard(string cardId, int cardIndex, bool needTrueFun) + { + this.cardId = cardId; + //Debug.Log(cardId + "-" + CardOriginalDataList.Instance.cardOriginalDataList[cardId]); + cardOriginalData = CardOriginalDataList.Instance.existItemCardOriginalDataList[cardId]; + settleForStart(SettlementManager.settleTurn); + //createEffectCardUI(needTrueFun); + //createCardDescription(); + //createCardName(); + //createCardCost(); + //createCardImage(); + //createCardImageTest(); + this.cardIndex = cardIndex; + } + //卡牌效果的结算 public IEnumerator settle(int settleTurn,MapUnity targetNode) { @@ -247,8 +291,6 @@ public class CardEntity : MonoBehaviour MapUnity currentNode = GameManager.Instance.ToolX[3].Y[3]; Debug.Log("card创建"); CardManager.setCardImageTest(cardOriginalData, 90.0f, currentNode,this); - - } //获取卡牌名字 public void createCardName() @@ -283,7 +325,7 @@ public class CardEntity : MonoBehaviour { //确定条件个数 - switch (cardOriginalData.conditionAndFunctionVal.Count) + switch (cardOriginalData.originFunctionVal.Count) { case 0: conditionList[0].SetActive(false); @@ -310,6 +352,12 @@ public class CardEntity : MonoBehaviour summarizeNodeColor(); + } + + public void createEffectCardUI(bool needTrueFun) + { + + } /*private void createFun(int count) @@ -426,11 +474,6 @@ public class CardEntity : MonoBehaviour int firstPartCount = CardManager.Instance.evaluateExpression(firstPart); int secondPartCount = CardManager.Instance.evaluateExpression(secondPart); int thresholdShift = 0; - //蓝色地块优势 - if (MapUnityManager.Instance.getAdvNode().Equals(Name.Color.Blue)) - { - thresholdShift += 2; - } if (LegacyManager.Instance.relicClassNameList.Contains(Name.Legacy.LegacyNode_Starfish) && firstPart.Equals(Name.Color.Blue)) { @@ -660,6 +703,10 @@ public class CardEntity : MonoBehaviour private void checkAndUpdateCondition() { +/* if (cardOriginalData.CardType != Name.CardType.dyeing) + { + return; + }*/ cardOriginalData.testTrueFunctionVal.Clear(); for (int i = 0; i < cardOriginalData.conditionAndFunctionVal.Count; i++) { @@ -668,8 +715,8 @@ public class CardEntity : MonoBehaviour KeyValuePair> kvp = cardOriginalData.conditionAndFunctionVal.ElementAt(i); string[] keys= kvp.Key.Split("_"); //Debug.Log("cardId是" + cardOriginalData.CardId + "key是" + keys); - string[] functions = kvp.Value.Item1.Split("_"); - string[] vals = kvp.Value.Item2.Split("_"); + //string[] functions = kvp.Value.Item1.Split("_"); + //string[] vals = kvp.Value.Item2.Split("_"); for (int j = 0; j < keys.Length; j++) { @@ -694,15 +741,21 @@ public class CardEntity : MonoBehaviour Image condition = conditionList[i].GetComponent(); if (isAllMatch) { - string value = kvp.Value.Item2; - if (int.TryParse(value, out int newValue)) + string[] fun = kvp.Value.Item1.Split("_"); + string[] vals = kvp.Value.Item2.Split("_"); + for (int j = 0; j < fun.Length; j++) { - MathTool.AddOrUpdateDictionary(cardOriginalData.testTrueFunctionVal, kvp.Value.Item1, value); - } - else - { - MathTool.AddOrUpdateDictionary(cardOriginalData.testTrueFunctionVal, kvp.Value.Item1, getNodeTools.getNodesCount(value).ToString()); + if (int.TryParse(vals[j], out int newValue)) + { + MathTool.AddOrUpdateDictionary(cardOriginalData.testTrueFunctionVal, fun[j], vals[j]); + } + else + { + MathTool.AddOrUpdateDictionary(cardOriginalData.testTrueFunctionVal, fun[j], getNodeTools.getNodesCount(vals[j]).ToString()); + } } + string value = kvp.Value.Item2; + condition.sprite = successCondition; cardFunToLose.Remove( kvp.Key); diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalData.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalData.cs index e8a8c381..b78fde10 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalData.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalData.cs @@ -9,6 +9,8 @@ public class CardOriginalData : System.Object private int cost; + public string costType; + private string chineseName; private int rarity; @@ -25,7 +27,7 @@ public class CardOriginalData : System.Object public Dictionary testTrueFunctionVal; - private int carType; + private string cardType; private string description; @@ -100,10 +102,10 @@ public class CardOriginalData : System.Object set { trueFunctionVal = value; } } - public int CarType + public string CardType { - get { return carType; } - set { carType = value; } + get { return cardType; } + set { cardType = value; } } public string Description diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalDataList.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalDataList.cs index 84159b5d..238d4326 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalDataList.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/CardOriginalDataList.cs @@ -10,8 +10,16 @@ public class CardOriginalDataList : Singleton { public Dictionary cardOriginalDataList; + public Dictionary effectCardOriginalDataList; + + public Dictionary itemCardOriginalDataList; + public Dictionary existCardOriginalDataList = new Dictionary(); + public Dictionary existEffectCardOriginalDataList = new Dictionary(); + + public Dictionary existItemCardOriginalDataList = new Dictionary(); + public Dictionary commCardOriginalDataList=new Dictionary(); public Dictionary rareCardOriginalDataList = new Dictionary(); @@ -20,9 +28,13 @@ public class CardOriginalDataList : Singleton private void OnEnable() { - cardOriginalDataList = ReadExcel("card_data_4.csv"); - //categorizeCardsByRarity(); + cardOriginalDataList = ReadExcelForDyeingCard("card_data_4.csv"); + effectCardOriginalDataList = ReadExcelForEffectCard("card_data_effect_4.csv"); + itemCardOriginalDataList = ReadExcelForItemCard("card_data_item_4.csv"); + //categorizeCardsByRarity(); existCardOriginalDataList = cardOriginalDataList; + existEffectCardOriginalDataList= effectCardOriginalDataList; + existItemCardOriginalDataList= itemCardOriginalDataList; } @@ -109,7 +121,61 @@ public class CardOriginalDataList : Singleton } - Dictionary ReadExcel(string fileName) + Dictionary ReadExcelForDyeingCard(string fileName) + { + string filePath = Path.Combine(Application.streamingAssetsPath, fileName); + Dictionary cardOriginalDataList = new Dictionary(); + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (StreamReader reader = new StreamReader(fs)) + { + bool isFirstLine = true; + while (!reader.EndOfStream) + { + string line = reader.ReadLine(); + if (isFirstLine) + { + isFirstLine = false; + continue; // 跳过标题行 + } + + // 用逗号分隔每行数据 + string[] values = line.Split(','); + CardOriginalData cardOriginalData = new CardOriginalData(); + loadDatafromCsvForDyeingCard(values, cardOriginalData); + cardOriginalDataList.Add(cardOriginalData.CardId, cardOriginalData); + } + } + return cardOriginalDataList; + } + + Dictionary ReadExcelForEffectCard(string fileName) + { + string filePath = Path.Combine(Application.streamingAssetsPath, fileName); + Dictionary cardOriginalDataList = new Dictionary(); + using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (StreamReader reader = new StreamReader(fs)) + { + bool isFirstLine = true; + while (!reader.EndOfStream) + { + string line = reader.ReadLine(); + if (isFirstLine) + { + isFirstLine = false; + continue; // 跳过标题行 + } + + // 用逗号分隔每行数据 + string[] values = line.Split(','); + CardOriginalData cardOriginalData = new CardOriginalData(); + loadDatafromCsvForEffectCard(values, cardOriginalData); + cardOriginalDataList.Add(cardOriginalData.CardId, cardOriginalData); + } + } + return cardOriginalDataList; + } + + Dictionary ReadExcelForItemCard(string fileName) { string filePath = Path.Combine(Application.streamingAssetsPath, fileName); Dictionary cardOriginalDataList = new Dictionary(); @@ -129,31 +195,33 @@ public class CardOriginalDataList : Singleton // 用逗号分隔每行数据 string[] values = line.Split(','); CardOriginalData cardOriginalData = new CardOriginalData(); - loadDatafromCsv(values, cardOriginalData); + loadDatafromCsvForItemCard(values, cardOriginalData); cardOriginalDataList.Add(cardOriginalData.CardId, cardOriginalData); } } return cardOriginalDataList; } - private CardOriginalData loadDatafromCsv(string[] values, CardOriginalData cardOriginalData) + private CardOriginalData loadDatafromCsvForDyeingCard(string[] values, CardOriginalData cardOriginalData) { cardOriginalData.cardImageMark = new HashSet(); //CardOriginalData cardOriginalData = CardOriginalData.Instance; cardOriginalData.CardId = values[0]; //cardOriginalData.ChineseName = values[1]; - cardOriginalData.Cost = int.Parse(values[1]); + cardOriginalData.costType = values[1]; + cardOriginalData.Cost = int.Parse(values[2]); //cardOriginalData.Rarity = int.Parse(values[3]); - cardOriginalData.CastingRange = int.Parse(values[2]); - cardOriginalData.EffectRange = values[3]; + cardOriginalData.CastingRange = int.Parse(values[3]); + cardOriginalData.EffectRange = values[4]; //cardOriginalData.IsDisposable = int.Parse(values[6]) == 1; - cardOriginalData.nodesMark = values[7].Split(";"); - cardOriginalData.nodesColor = values[8].Split(";"); + cardOriginalData.nodesMark = values[8].Split(";"); + cardOriginalData.nodesColor = values[9].Split(";"); cardOriginalData.conditionAndFunctionVal = new Dictionary>(); cardOriginalData.TrueFunctionVal = new Dictionary(); cardOriginalData.testTrueFunctionVal = new Dictionary(); cardOriginalData.originFunctionVal = new HashSet(); - cardOriginalData.ImgPath = values[9]; + cardOriginalData.CardType = Name.CardType.dyeing; + cardOriginalData.ImgPath = values[10]; for (int i = 0; i < cardOriginalData.nodesMark.Length; i++) { // 拆分坐标 @@ -173,11 +241,94 @@ public class CardOriginalDataList : Singleton return cardOriginalData; } + private CardOriginalData loadDatafromCsvForEffectCard(string[] values, CardOriginalData cardOriginalData) + { + cardOriginalData.cardImageMark = new HashSet(); + //CardOriginalData cardOriginalData = CardOriginalData.Instance; + cardOriginalData.CardId = values[0]; + //cardOriginalData.ChineseName = values[1]; + cardOriginalData.costType = values[1]; + cardOriginalData.Cost = int.Parse(values[2]); + //cardOriginalData.Rarity = int.Parse(values[3]); + cardOriginalData.CastingRange = int.Parse(values[8]); + //cardOriginalData.EffectRange = values[3]; + //cardOriginalData.IsDisposable = int.Parse(values[6]) == 1; + cardOriginalData.nodesMark = values[6].Split(";"); + //cardOriginalData.nodesColor = values[8].Split(";"); + cardOriginalData.conditionAndFunctionVal = new Dictionary>(); + cardOriginalData.TrueFunctionVal = new Dictionary(); + cardOriginalData.testTrueFunctionVal = new Dictionary(); + cardOriginalData.originFunctionVal = new HashSet(); + cardOriginalData.CardType = Name.CardType.effect; + cardOriginalData.ImgPath = values[7]; + cardOriginalData.CastingRange = int.Parse(values[8]); + cardOriginalData.TrueFunctionVal = new Dictionary(); + cardOriginalData.originFunctionVal = new HashSet(); + //cardOriginalData.testTrueFunctionVal = new Dictionary(); + string[] condition = values[3].Split(";"); + string[] function = values[4].Split(";"); + string[] functionVal = values[5].Split(";"); + /*string[] advantagefunction = values[9].Split(";"); + string[] advantagefunctionVal = values[10].Split(";");*/ + //cardOriginalData.FunctionVal = new Dictionary(); + //cardOriginalData.AdvantageFunctionVal = new Dictionary(); + for (int i = 0; i < function.Length; i++) + { + cardOriginalData.conditionAndFunctionVal.Add(condition[i], new Tuple(function[i], functionVal[i])); + } + //getDictionaryFromString(values, cardOriginalData); + /* for (int i = 0; i < function.Length; i++) + { + cardOriginalData.originFunctionVal.Add(function[i]); + cardOriginalData.TrueFunctionVal.Add(function[i], functionVal[i]); + cardOriginalData.testTrueFunctionVal.Add(function[i], functionVal[i]); + }*/ + return cardOriginalData; + } + + private CardOriginalData loadDatafromCsvForItemCard(string[] values, CardOriginalData cardOriginalData) + { + cardOriginalData.cardImageMark = new HashSet(); + //CardOriginalData cardOriginalData = CardOriginalData.Instance; + cardOriginalData.CardId = values[0]; + //cardOriginalData.ChineseName = values[1]; + cardOriginalData.costType = values[1]; + cardOriginalData.Cost = int.Parse(values[2]); + //cardOriginalData.Rarity = int.Parse(values[3]); + //cardOriginalData.CastingRange = int.Parse(values[2]); + //cardOriginalData.EffectRange = values[3]; + //cardOriginalData.IsDisposable = int.Parse(values[6]) == 1; + cardOriginalData.nodesMark = values[5].Split(";"); + //cardOriginalData.nodesColor = values[8].Split(";"); + /*cardOriginalData.conditionAndFunctionVal = new Dictionary>(); + cardOriginalData.TrueFunctionVal = new Dictionary(); + cardOriginalData.testTrueFunctionVal = new Dictionary(); + cardOriginalData.originFunctionVal = new HashSet();*/ + cardOriginalData.CardType = Name.CardType.effect; + cardOriginalData.ImgPath = values[6]; + cardOriginalData.CastingRange = int.Parse(values[7]); + string[] function = values[3].Split(";"); + string[] functionVal = values[4].Split(";"); + cardOriginalData.TrueFunctionVal = new Dictionary(); + cardOriginalData.originFunctionVal = new HashSet(); + cardOriginalData.testTrueFunctionVal = new Dictionary(); + cardOriginalData.IsDisposable=true; + + //getDictionaryFromString(values, cardOriginalData); + for (int i = 0; i < function.Length; i++) + { + cardOriginalData.originFunctionVal.Add(function[i]); + cardOriginalData.TrueFunctionVal.Add(function[i], functionVal[i]); + cardOriginalData.testTrueFunctionVal.Add(function[i], functionVal[i]); + } + return cardOriginalData; + } + private void getDictionaryFromString(string[] values, CardOriginalData cardOriginalData) { - string[] condition = values[4].Split(";"); - string[] function = values[5].Split(";"); - string[] functionVal = values[6].Split(";"); + string[] condition = values[5].Split(";"); + string[] function = values[6].Split(";"); + string[] functionVal = values[7].Split(";"); /*string[] advantagefunction = values[9].Split(";"); string[] advantagefunctionVal = values[10].Split(";");*/ //cardOriginalData.FunctionVal = new Dictionary(); diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/LookCard/LookCardManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/LookCard/LookCardManager.cs index 7d4a6411..3a02e445 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/LookCard/LookCardManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/LookCard/LookCardManager.cs @@ -95,12 +95,12 @@ public class LookCardManager : MonoBehaviour if (defaultSort == true) { - cardEntities = cardEntities.OrderBy(classInfo => classInfo.cardOriginalData.CarType).ToList(); + cardEntities = cardEntities.OrderBy(classInfo => classInfo.cardOriginalData.CardType).ToList(); } else { - cardEntities = cardEntities.OrderByDescending(classInfo => classInfo.cardOriginalData.CarType).ToList(); + cardEntities = cardEntities.OrderByDescending(classInfo => classInfo.cardOriginalData.CardType).ToList(); } // cardEntities.Sort((a, b) => { return int.Parse ( a.cost) > int.Parse(b.cost) ? 1 : -1; }); diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/TurnMaster.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/TurnMaster.cs index 4769ff04..fcede658 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Card/TurnMaster.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Card/TurnMaster.cs @@ -275,10 +275,15 @@ public class TurnMaster : Singleton IEnumerator ShuffleWithLosingCards() { int tureDrawCardsNum=commDrawCardsNum; -/* if (GameManager.Instance.playerOn.whoColour == MapUnity.WhoColour.playerColour&& LegacyManager.Instance.relicClassNameList.Contains(Name.Legacy.LegacyNode_MechanicalBoots)) + /* if (GameManager.Instance.playerOn.whoColour == MapUnity.WhoColour.playerColour&& LegacyManager.Instance.relicClassNameList.Contains(Name.Legacy.LegacyNode_MechanicalBoots)) + { + tureDrawCardsNum++; + }*/ + //蓝色地块优势 + if (MapUnityManager.Instance.getAdvNode().Equals(Name.Color.Blue)) { tureDrawCardsNum++; - }*/ + } if (LegacyManager.Instance.relicClassNameList.Contains(Name.Legacy.LegacyNode_MagicGloves)) { tureDrawCardsNum++; diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Enemy/Item/Whirlpool.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Enemy/Item/Whirlpool.cs index 5943905d..d885eabc 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Enemy/Item/Whirlpool.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Enemy/Item/Whirlpool.cs @@ -27,6 +27,8 @@ public class Whirlpool : MonoBehaviour holdeText .text =holdColorCount .ToString(); GameManager.Instance.playerUsedCard += WhirlpoolHold; } + + public void WhirlpoolHold() { for (int i = 0; i < holdPool.Count ; i++) diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs index 8206f493..f7845f1e 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/GameManager.cs @@ -186,20 +186,20 @@ public class GameManager : Singleton } public void GenerateEnmptyMapListForTool() { + int currentColumn = MapManager.Instance.column - 1; if (complete == false) { - for (int i = 0; i < MapManager.Instance.lineForTool; i++) + for (int i = 0; i < MapManager.Instance.line; i++) { - int currentColum = 0; - if (i % 2 == 0) + if (i <= (MapManager.Instance.line - 1) / 2) { - currentColum = MapManager.Instance.columnForTool; + currentColumn += 1; } else { - currentColum = MapManager.Instance.columnForTool - 1; + currentColumn -= 1; } - for (int j = 0; j < currentColum; j++) + for (int j = 0; j < currentColumn; j++) { ToolX[i].Y.Add(null); } diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/MapManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/MapManager.cs index d2a54fa7..0c156825 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/MapManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/MapManager.cs @@ -204,7 +204,6 @@ public class MapManager : Singleton yield return new WaitForSeconds(2); yield return StartCoroutine(EnemyGenerate()); yield return StartCoroutine(CompleteGenerate()); - CardManager.createCardImageMap(); } //场地坐标系转换(新转放行) IEnumerator TransformMapUnity() @@ -249,16 +248,64 @@ public class MapManager : Singleton } yield return null; } - IEnumerator GenerateProcessTest() + + IEnumerator TransformMapUnityForTool() + { + int x = 0, y = 0; + int count = 1; + int currentOffset = 0; + int middeline = GameManager.Instance.ToolX.Count / 2; + List lineOffsetList = new List(); + int lineOffsetListMark = 1; + for (int i = 0; i < GameManager.Instance.ToolX.Count; i++) + { + if (count >= 2) + { + count = 0; + if (i <= middeline) + { + currentOffset += 1; + + } + } + if (i < middeline) + { + lineOffsetList.Add(currentOffset); + } + else if (i > middeline) + { + currentOffset = lineOffsetList[lineOffsetList.Count - lineOffsetListMark]; + lineOffsetListMark += 1; + } + + + for (int j = 0; j < GameManager.Instance.ToolX[i].Y.Count; j++) + { + + GameManager.Instance.ToolX[i].Y[j].ResetLocation(j - currentOffset, y); + + } + x = 0; + y = i + 1; + count += 1; + } + yield return null; + } + IEnumerator GenerateProcessTest() { yield return StartCoroutine(MapGenerateTest()); // yield return StartCoroutine(MapGenerateDefault()); + + yield return StartCoroutine(TransformMapUnityForTool()); yield return StartCoroutine(SetUpMapUnityForTool()); + yield return StartCoroutine(SetUpMapUnityForCubeForTool()); + //yield return StartCoroutine(UPMoveMapUnity()); //yield return new WaitForSeconds(2); //yield return StartCoroutine(EnemyGenerate()); //yield return StartCoroutine(CompleteGenerate()); createCameraAboveObject(GameManager.Instance.ToolX[3].Y[3].gameObject, 10.0f, 0); + CardManager.createCardImageMap(); } public void createCameraAboveObject(GameObject targetObject, float heightAbove, float lookDownAngle) @@ -338,6 +385,19 @@ public class MapManager : Singleton yield return null; } + IEnumerator SetUpMapUnityForCubeForTool() + { + // yield return StartCoroutine(MapGenerate()); + for (int i = 0; i < GameManager.Instance.ToolX.Count; i++) + { + for (int j = 0; j < GameManager.Instance.ToolX[i].Y.Count; j++) + { + GameManager.Instance.ToolX[i].Y[j].CalCube(); + } + } + yield return null; + } + IEnumerator SetUpMapUnityForTool() { // yield return StartCoroutine(MapGenerate()); @@ -464,7 +524,10 @@ public class MapManager : Singleton IEnumerator MapGenerateTest() { - for (int i = 0; i < lineForTool; i++) + int middleLine = (line - 1) / 2; + int currentColumn = column; + + for (int i = 0; i < line; i++) { if (i != 0) { @@ -472,22 +535,26 @@ public class MapManager : Singleton } generatePointTest.transform.position = new Vector3(20, 20, generatePointTest.transform.position.z); - int currentColumn = columnForTool; - if (i != 0 && i % 2 != 0) - { - currentColumn = columnForTool - 1; - } - for (int j = 0; j < currentColumn; j++) + if (i <= middleLine) { - if (i % 2 != 0 && j == 0) + if (i != 0) { - generatePointTest.transform.position += lineOffSet / 2f; + currentColumn += 1; + generatePointTest.transform.position -= (lineOffSet / 2f) * i; } - + } + else + { + currentColumn -= 1; + generatePointTest.transform.position -= (lineOffSet / 2f) * (line - i - 1); + } + Debug.Log("列数:" + currentColumn + "中间值:" + middleLine); + for (int j = 0; j < currentColumn; j++) + { var a = Instantiate(mapUnity, generatePointTest.transform.position - new Vector3(0, 2, 0), mapUnity.transform.rotation); + a.transform.SetParent(mapUnityFather); MapUnity currentMapUnityScript = a.GetComponent(); - currentMapUnityScript.locationX = i; currentMapUnityScript.locationY = j; currentMapUnityScript.RegisterUnitForTool(); diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/MapUnity.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/MapUnity.cs index c73c1e76..ab2fe902 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/MapUnity.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/MapUnity.cs @@ -190,12 +190,21 @@ public class MapUnity : MonoBehaviour public void switchColor(int newColor) { - if (whoColour!=6) + if (whoColour!=6&& whoColour != 10) { whoColour = newColor; RefreshWhoColor(); } } + + public void switchColorWithoutFX(int newColor) + { + if (whoColour != 6 && whoColour != 10) + { + whoColour = newColor; + ChengePlan(); + } + } public void switchPreColor(int newColor) { switch (newColor ) diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/AbnormalCondition.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/AbnormalCondition.cs index f4a1cef7..87befd6f 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/AbnormalCondition.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/AbnormalCondition.cs @@ -67,9 +67,12 @@ public class AbnormalCondition : Singleton //潮湿 public const string wet = "48"; + //临时攻击范围 + public const string tempCastRange = "50"; + public static readonly List canNegativeNumberList = new List { angerUpperDamage, shieldUpperValue, addDrawCard }; - public static readonly List playBuffList = new List {firm, addDrawCard, upSpeed , immunity, fireShield, doubleSettle, nextTurnExtraOneCost }; + public static readonly List playBuffList = new List {firm, addDrawCard, upSpeed , immunity, fireShield, doubleSettle, nextTurnExtraOneCost ,tempCastRange}; public static readonly List playUndeterminedBuffList = new List { angerUpperDamage, shieldUpperValue }; } diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/CardFunction.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/CardFunction.cs index be803435..e59cf0a2 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/CardFunction.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/CardFunction.cs @@ -96,6 +96,10 @@ public static class CardFunction public const string recoverHp = "47"; //潮湿 public const string wet = "48"; + //将目标地块的颜色扩散至周围 + public const string spreadColorToAround = "49"; + //临时攻击范围 + public const string tempCastRange = "50"; //放置物品 public const string placeTrees = "51"; diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Data_SO/PlayerState_SO.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Data_SO/PlayerState_SO.cs index 22bc5cc8..d72edfe3 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Data_SO/PlayerState_SO.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Data_SO/PlayerState_SO.cs @@ -29,6 +29,8 @@ public class PlayerState_SO : ScriptableObject public int cardRewardNumToGget;//实际可以选择卡牌奖励的数量 + public int castRange; + [Header("资源系统")] public int money; diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs index eb00bccd..6a0c2ed3 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs @@ -82,9 +82,9 @@ public static class Name public static class CardType { - public const int Attack = 1; - public const int Skill = 2; - public const int Ability = 3; + public const string dyeing = "dyeing"; + public const string effect = "effect"; + public const string item = "item"; } public static class NodeColor @@ -100,7 +100,7 @@ public static class Name public static int stringColorToint(string color) { - int intcolor = 1; + int intcolor = 10; switch (color) { case Color.Red: @@ -127,6 +127,22 @@ public static class Name public const string White = "white"; public const string Black = "black"; public const string Metal = "metal"; + + } + + public static class Faction + { + public const string Player = "player"; + public const string Enemy = "enemy"; + public const string Neutral = "neutral"; + } + + public static class CostType + { + public const string energy = "1"; + public const string step = "2"; + public const string health = "3"; + public const string node = "4"; } public static class CardFunctionString diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/getNodeTools.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/getNodeTools.cs index f9458b14..0115bce6 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/getNodeTools.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/getNodeTools.cs @@ -146,11 +146,40 @@ public class getNodeTools return mapUnity; } + + public static MapUnity LocationToGetNodeForTool(int locationX, int locationY) + { + int x = 0; + Debug.Log("索引坐标:" + locationX + locationY); + MapUnity mapUnity = null; + //计算node在列表的第几位 + try + { + for (int i = 0; i < GameManager.Instance.ToolX[locationY].Y.Count; i++) + { + + if (GameManager.Instance.ToolX[locationY].Y[i].locationX == locationX) + { + x = i; + mapUnity = GameManager.Instance.ToolX[locationY].Y[x]; + break; + } + } + + } + catch (Exception e) + { + mapUnity = null; + } + + return mapUnity; + } public static MapUnity getToolNodeWithCube(int q, int s, int r) { //计算立方坐标 (int x, int y) = MathTool.CubeToAxial(q, s, r); - MapUnity result = GameManager.Instance.ToolX[x].Y[y]; + Debug.Log("CubeToAxial的x是" + x + "CubeToAxial的y是" + y); + MapUnity result = LocationToGetNodeForTool(x, y); return result; } public static HashSet getAllNodes() diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/BuffDataManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/BuffDataManager.cs index 7efe94e3..4a67d5c7 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/BuffDataManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/BuffDataManager.cs @@ -38,6 +38,7 @@ public class BuffDataManager : Singleton abnormalCondition.Add("35", new Buff_DoubleSettle()); abnormalCondition.Add("36", new Buff_NextTurnExtraOneCost()); abnormalCondition.Add("48", new Buff_Wet()); + abnormalCondition.Add("50", new Buff_TempCastRange()); abnormalCondition.Add("106", new Buff_flashPoint()); diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/CardManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/CardManager.cs index 5686497f..b064ad3a 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/CardManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/CardManager.cs @@ -1,12 +1,15 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using Newtonsoft.Json; +using Unity.VisualScripting; using UnityEngine; using UnityEngine.Rendering; +using static TMPro.SpriteAssetUtilities.TexturePacker_JsonArray; using static UnityEngine.Rendering.DebugUI; public class CardManager : Singleton @@ -198,13 +201,16 @@ public class CardManager : Singleton { if (CardManager.Instance.cardImageMap.TryGetValue(cardOriginalData.cardImageMark, out Sprite sprite)) { + Debug.Log("setCardImage进入if"); cardEntity.cardImage.sprite = sprite; } else { + Debug.Log("setCardImage进入else"); createCardImage(cardOriginalData, euler, currentNode); setCardImageTest(cardOriginalData, euler, currentNode, cardEntity); } + //cardEntity.cardImage.sprite = createCardImage(cardOriginalData, euler, currentNode); } public static void createCardImageMap() { @@ -217,13 +223,14 @@ public class CardManager : Singleton } - public static void createCardImage(CardOriginalData cardOriginalData, float euler, MapUnity currentNode) + public static Sprite createCardImage(CardOriginalData cardOriginalData, float euler, MapUnity currentNode) { for (int i = 0; i < GameManager.Instance.ToolX.Count; i++) { for (int j = 0; j < GameManager.Instance.ToolX[i].Y.Count; j++) { - GameManager.Instance.ToolX[i].Y[j].whoColour=Name.NodeColor.White; + GameManager.Instance.ToolX[i].Y[j].switchColorWithoutFX(Name.NodeColor.White); + GameManager.Instance.ToolX[i].Y[j].gameObject.SetActive(false); } } List<(int, int, int)> cubeList = new List<(int, int, int)>(); @@ -243,23 +250,42 @@ public class CardManager : Singleton } List<(int, int, int)> rotatedCubeList = new List<(int, int, int)>(); rotatedCubeList = MathTool.RotateCoordinates(cubeList, intEuler); + for (int i = 0; i < rotatedCubeList.Count; i++) + { + Debug.Log("rotatedCube的Q是" + rotatedCubeList[i].Item1 + "rotatedCube的S是" + rotatedCubeList[i].Item2 + "rotatedCube的R是" + rotatedCubeList[i].Item3); + } List<(int, int, int)> trueCubeList = new List<(int, int, int)>(); + Debug.Log("currentNode的Q是" + currentNode.cubeQ + "currentNode的S是" + currentNode.cubeS + "currentNode的R是" + currentNode.cubeR); trueCubeList = MathTool.TranslateHexesToNewOrigin(rotatedCubeList, (currentNode.cubeQ, currentNode.cubeS, currentNode.cubeR)); for (int i = 0; i < trueCubeList.Count; i++) { MapUnity endNode = new MapUnity(); + Debug.Log("endNode的Q是" + trueCubeList[i].Item1 + "endNode的S是" + trueCubeList[i].Item2 + "endNode的R是" + trueCubeList[i].Item3); endNode = getNodeTools.getToolNodeWithCube(trueCubeList[i].Item1, trueCubeList[i].Item2, trueCubeList[i].Item3); if (endNode != null) { Debug.Log("染色成功" + cardOriginalData.nodesColor[i]); - endNode.switchColor(Name.stringColorToint(cardOriginalData.nodesColor[i])); + endNode.switchColorWithoutFX(Name.stringColorToint(cardOriginalData.nodesColor[i])); + endNode.gameObject.SetActive(true); //endNode.influenced = true; } } + // 分别提取横纵坐标 + var xCoords = cardOriginalData.nodesMark.Select(coord => int.Parse(coord.Split('_')[0])).ToArray(); + var yCoords = cardOriginalData.nodesMark.Select(coord => int.Parse(coord.Split('_')[1])).ToArray(); + + // 计算横纵坐标的最大差值 + int maxXDiff = xCoords.Max() - xCoords.Min(); + int maxYDiff = yCoords.Max() - yCoords.Min(); + + // 比较最大差值 + int maxDiff = Math.Max(maxXDiff, maxYDiff); + RenderTexture renderTexture = new RenderTexture(512, 512, 24); Camera renderCamera = MapManager.Instance.cameraObject.GetComponent(); renderCamera.targetTexture = renderTexture; Texture2D texture = new Texture2D(renderTexture.width, renderTexture.height, TextureFormat.ARGB32, false); + cameraAdjust(maxDiff, renderCamera, currentNode); RenderTexture.active = renderCamera.targetTexture; renderCamera.Render(); texture.ReadPixels(new Rect(0, 0, renderTexture.width, renderTexture.height), 0, 0); @@ -269,6 +295,20 @@ public class CardManager : Singleton material.mainTexture = renderTexture; Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(0.5f, 0.5f)); CardManager.Instance.cardImageMap.Add(cardOriginalData.cardImageMark, sprite); + return sprite; + + } + public static void cameraAdjust(int distance, Camera camera,MapUnity target) + { + // 设置最大差值对应的摄像机距离范围 + float minDistance = 1.5f; + float maxDistance = 12f; + Debug.Log("distance是" + distance); + float newDistance = Mathf.Lerp(minDistance, maxDistance, distance / 20f); // 假设最大差值不超过100 + Debug.Log("newDistance是" + newDistance); + Vector3 direction = (camera.transform.position - target.transform.position).normalized; + camera.transform.position = target.transform.position + direction * newDistance; + camera.orthographicSize = newDistance; } } diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/DestructionManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/DestructionManager.cs index 2d997fb7..f4b8a730 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/DestructionManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/DestructionManager.cs @@ -125,7 +125,21 @@ public class DestructionManager : Singleton { trueCost++; } - GameManager.Instance.playerState.currentCost -= trueCost; + switch (cardOriginalData.costType) + { + case Name.CostType.energy: + GameManager.Instance.playerState.currentCost -= trueCost; + break; + case Name.CostType.step: + GameManager.Instance.playerState.currentStepRange -= trueCost; + break; + case Name.CostType.health: + GameManager.Instance.playerState.currentHP -= trueCost; + break; + case Name.CostType.node: + break; + } + //} yield return StartCoroutine(settleStage2(cardOriginalData, influencePreviewPool, cardIndex, leftCost, targetNode)); diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/MapUnityManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/MapUnityManager.cs index 0c86c4cc..2cee6d61 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/MapUnityManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/MapUnityManager.cs @@ -17,24 +17,57 @@ public class MapUnityManager : Singleton public int metalNodeCount; + public int playerNodeCount; + + public int neutralNodeCount; + + public int enemyNodeCount; + + public string getAdvNode() { + string advColor = ""; Dictionary kvps = new Dictionary { - { Name.Color.Red, redNodeCount }, - { Name.Color.Blue, blueNodeCount }, - { Name.Color.Green, greenNodeCount }, - { Name.Color.Black, blackNodeCount }, - { Name.Color.White, whiteNodeCount }, - { Name.Color.Metal, metalNodeCount }, + { Name.Faction.Player, playerNodeCount }, + { Name.Faction.Neutral, neutralNodeCount }, + { Name.Faction.Enemy, enemyNodeCount }, }; - string advColor= GetKeyWithMaxValue(kvps); - //Debug.Log(advColor); + string advFaction = GetKeyWithMaxValue(kvps); + switch (advFaction) + { + case Name.Faction.Player: + Dictionary< string,int> playerNode = new Dictionary + { + { Name.Color.Red, redNodeCount }, + { Name.Color.Blue, blueNodeCount }, + { Name.Color.Green, greenNodeCount }, + }; + advColor = GetKeyWithMaxValue(playerNode); + break; + case Name.Faction.Neutral: + advColor = Name.Faction.Neutral; + break; + case Name.Faction.Enemy: + Dictionary enemyNode = new Dictionary + { + { Name.Color.Black, blackNodeCount }, + }; + advColor = GetKeyWithMaxValue(enemyNode); + break; + default: + advColor=Name.none; + break; + + } + //Debug.Log("advColor是"+ advColor); return advColor; } - public static string GetKeyWithMaxValue(Dictionary dictionary) + public string GetKeyWithMaxValue(Dictionary dictionary) { + + if (dictionary == null || dictionary.Count == 0) { throw new ArgumentException("字典不能为空或为 null"); @@ -98,6 +131,10 @@ public class MapUnityManager : Singleton } } redNodeCount = red; blueNodeCount = blue; greenNodeCount = green; whiteNodeCount = white; blackNodeCount = black;metalNodeCount =metal; + playerNodeCount = redNodeCount + blueNodeCount + greenNodeCount; + neutralNodeCount = whiteNodeCount + metalNodeCount; + enemyNodeCount = blackNodeCount; + } } @@ -134,10 +171,10 @@ public class MapUnityManager : Singleton return reachableNodes; } - public void getCastPool(string effectRange,int castRange) + public void getCastPool(int castRange) { MapUnity playerOn = GameManager.Instance.playerOn; - if (EffectRange.speRange.Contains(effectRange)) +/* if (EffectRange.speRange.Contains(effectRange)) { for (int i = 0; i < 6; i++) { @@ -152,6 +189,11 @@ public class MapUnityManager : Singleton { castPool.Remove(playerOn); } + }*/ + + for (int i = 0; i < 6; i++) + { + getNodeTools.getLongNodes(playerOn, i, castRange, castPool); } //castPool=MathTool.RemoveDuplicates(castPool); //Debug.Log("去除前数量是" + castPool.Count); diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/SettlementManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/SettlementManager.cs index ad311b5b..8ab6aa45 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/manager/SettlementManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/manager/SettlementManager.cs @@ -85,7 +85,10 @@ public class SettlementManager : Singleton public List PreviewColorMapUnity(CardOriginalData cardOriginalData, MapUnity targetNode) { List mapColorCount = new List() { 0, 0, 0, 0, 0, 0, 0 };//1red,2white,3blue,4green,5black,6matel - + if (cardOriginalData.CardType != Name.CardType.dyeing) + { + return mapColorCount; + } Vector3 face = targetNode.transform.position - GameManager.Instance.playerOn.transform.position; float euler = Vector3.SignedAngle(-GameManager.Instance.playerOn.transform.forward, face, GameManager.Instance.playerOn.transform.up) + 180; List<(int, int, int)> cubeList = new List<(int, int, int)>(); @@ -134,6 +137,10 @@ public class SettlementManager : Singleton //预览涂色颜色 public void PreviewSwitchColor(CardOriginalData cardOriginalData, MapUnity targetNode) { + if (cardOriginalData.CardType != Name.CardType.dyeing) + { + return; + } Vector3 face = targetNode.transform.position - GameManager.Instance.playerOn.transform.position; float euler = Vector3.SignedAngle(-GameManager.Instance.playerOn.transform.forward, face, GameManager.Instance.playerOn.transform.up) + 180; List<(int, int, int)> cubeList = new List<(int, int, int)>(); @@ -341,7 +348,7 @@ public class SettlementManager : Singleton foreach (var cardId in TurnMaster.Instance.cardDeck.cardList) { CardOriginalData cardOriginalData = new CardOriginalData(); - if (CardOriginalDataList.Instance.cardOriginalDataList.TryGetValue(cardId,out cardOriginalData)&&cardOriginalData.CarType==CardType.attack) + if (CardOriginalDataList.Instance.cardOriginalDataList.TryGetValue(cardId,out cardOriginalData)&&cardOriginalData.CardType==Name.CardType.effect) { attackCardOriginalDataList.Add(cardId); } @@ -633,6 +640,9 @@ public class SettlementManager : Singleton case CardFunction.recoverHp: Usermanager.Instance.recoverHp(int.Parse(kvp.Value)); break; + case CardFunction.spreadColorToAround: + spreadColorToAround(int.Parse(kvp.Value),targetNode); + break; case CardFunction.ember: case CardFunction.enhanceShield: case CardFunction.firm: @@ -644,6 +654,7 @@ public class SettlementManager : Singleton case CardFunction.doubleSettle: case CardFunction.nextTurnExtraOneCost: case CardFunction.immunity: + case CardFunction.tempCastRange: Usermanager.Instance.SufferPlayerAbnormalCondition(kvp.Key, int.Parse(kvp.Value)); break; case CardFunction.discard: @@ -679,15 +690,30 @@ public class SettlementManager : Singleton } } - dyeingWork(cardOriginalData,targetNode); - + if (cardOriginalData.CardType == Name.CardType.dyeing) + { + dyeingWork(cardOriginalData, targetNode); + } Usermanager.Instance.RefreshPlayerBuffIcon(); GameManager.Instance.SyncColourCountUI(); EnemyManager.Instance.enemyRefreshEnemyBuffIcon(0); + //广播释放完一张卡牌的接口 GameManager.Instance.BroadCastPlayerUsedCard(); } + public void spreadColorToAround(int roundNum,MapUnity target) + { + int targetColor=target.whoColour; + HashSet influencePreviewPoolSet = new HashSet { target }; + getNodeTools.getCircleNode(influencePreviewPoolSet, roundNum); + List targetNodes = new List(influencePreviewPoolSet); + targetNodes.Remove(target); + foreach(MapUnity mapUnity in targetNodes) + { + mapUnity.switchColor(targetColor); + } + } //预期伤害 public void expectSettle(CardOriginalData cardOriginalData) { diff --git a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4 - 鍓湰.csv b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4 - 鍓湰.csv new file mode 100644 index 00000000..2c534d39 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4 - 鍓湰.csv @@ -0,0 +1,4 @@ +锘縄D,璐圭敤绫诲瀷,璐圭敤,鏂芥硶鑼冨洿,浣滅敤鑼冨洿,鏉′欢,鍔熻兘,鏁板,鍦板潡鏍囪,鍦板潡棰滆壊,鍥剧墖璺緞,鍚嶇О +1001,1,1,2,3_1,none,1,5,0_0;1_0;2_0,white;white;white,CardIcon/1010,灏勫嚮 +1002,1,1,2,3_1,none,2,4,0_0;-1_1;-1_-1,white;white;white,CardIcon/1010,灞忛殰 +1003,1,1,2,3_1,none,,,0_0;1_0;2_0;3_0;4_0,white;white;white;white;white,CardIcon/1010,鍠峰皠 diff --git a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4 - 鍓湰.csv.meta b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4 - 鍓湰.csv.meta new file mode 100644 index 00000000..d74d6715 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4 - 鍓湰.csv.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 0c939aa3ecbdd9c44b6b59502ed35b35 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv index 49c17d37..2c534d39 100644 --- a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv +++ b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_4.csv @@ -1,2 +1,4 @@ -锘縄D,璐圭敤,鏂芥硶鑼冨洿,浣滅敤鑼冨洿,鏉′欢,鍔熻兘,鏁板,鍦板潡鏍囪,鍦板潡棰滆壊,鍥剧墖璺緞 -1001,1,2,3_1,red>8;blue<20,1;2,5;4,0_0;1_0;2_0,red;red;red,CardIcon/1010 +锘縄D,璐圭敤绫诲瀷,璐圭敤,鏂芥硶鑼冨洿,浣滅敤鑼冨洿,鏉′欢,鍔熻兘,鏁板,鍦板潡鏍囪,鍦板潡棰滆壊,鍥剧墖璺緞,鍚嶇О +1001,1,1,2,3_1,none,1,5,0_0;1_0;2_0,white;white;white,CardIcon/1010,灏勫嚮 +1002,1,1,2,3_1,none,2,4,0_0;-1_1;-1_-1,white;white;white,CardIcon/1010,灞忛殰 +1003,1,1,2,3_1,none,,,0_0;1_0;2_0;3_0;4_0,white;white;white;white;white,CardIcon/1010,鍠峰皠 diff --git a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_effect_4.csv b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_effect_4.csv new file mode 100644 index 00000000..1e46fb9e --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_effect_4.csv @@ -0,0 +1,3 @@ +锘縄D,娑堣楃被鍨,娑堣楁暟鍊,鏉′欢,鍔熻兘,鏁板,鍦板潡鏍囪,鍥剧墖璺緞,鏂芥硶鑼冨洿 +2001,1,1,none,49,1,0_0,CardIcon/1010,2 +2002,1,1,none,40_50,-2_4,none,CardIcon/1010,0 diff --git a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_effect_4.csv.meta b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_effect_4.csv.meta new file mode 100644 index 00000000..a04e6f16 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_effect_4.csv.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: afe9e09a35c84c24c9d5540907918160 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_item_4.csv b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_item_4.csv new file mode 100644 index 00000000..08745ccb --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_item_4.csv @@ -0,0 +1,2 @@ +锘縄D,娑堣楃被鍨,娑堣楁暟鍊,鍔熻兘,鏁板,鍦板潡鏍囪,鍥剧墖璺緞,鏂芥硶鑼冨洿 +3001,1,1,1;2,5;4,0_0,CardIcon/1010,2 diff --git a/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_item_4.csv.meta b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_item_4.csv.meta new file mode 100644 index 00000000..0672a030 --- /dev/null +++ b/ColorlessWorld-2024-4-2/Assets/StreamingAssets/card_data_item_4.csv.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 7db5e4e868325f943bdfa7b54f130cf7 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ColorlessWorld-2024-4-2/Assets/~UnityDirMonSyncFile~f90d9bb2ab8ce4942acf5cee5050c7a4~ b/ColorlessWorld-2024-4-2/Assets/~UnityDirMonSyncFile~f90d9bb2ab8ce4942acf5cee5050c7a4~ new file mode 100644 index 00000000..e69de29b diff --git a/ColorlessWorld-2024-4-2/obj/Debug/Assembly-CSharp-Editor.csproj.AssemblyReference.cache b/ColorlessWorld-2024-4-2/obj/Debug/Assembly-CSharp-Editor.csproj.AssemblyReference.cache index 02a00143828c940e1c2682df2e2329e14a7c655b..b1bce3986131a545a45160c959ad9db6f3efd0b4 100644 GIT binary patch literal 138296 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

O2D?6sD6fgXUfO%(hicw^ly( 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 literal 139195 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 N8T(Eq{9AdD{6Ec*T+09e