From 1c5b8524b57d6d276eeb0f52a9b37c55c09a0122 Mon Sep 17 00:00:00 2001 From: yjm484 <171359351@qq.com> Date: Wed, 3 Sep 2025 17:46:05 +0800 Subject: [PATCH] =?UTF-8?q?0903=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../.vscode/extensions.json | 5 + ColorlessWorld-2024-4-2/.vscode/launch.json | 10 + ColorlessWorld-2024-4-2/.vscode/settings.json | 60 +++ .../Assets/Scripts/Tool/Name.cs | 351 +++++++-------- .../Assets/Scripts/Weapon/WeaponManager.cs | 402 +++++++++++++++--- ...harp-Editor.csproj.AssemblyReference.cache | Bin 139714 -> 134732 bytes 6 files changed, 595 insertions(+), 233 deletions(-) create mode 100644 ColorlessWorld-2024-4-2/.vscode/extensions.json create mode 100644 ColorlessWorld-2024-4-2/.vscode/launch.json create mode 100644 ColorlessWorld-2024-4-2/.vscode/settings.json diff --git a/ColorlessWorld-2024-4-2/.vscode/extensions.json b/ColorlessWorld-2024-4-2/.vscode/extensions.json new file mode 100644 index 00000000..ddb6ff85 --- /dev/null +++ b/ColorlessWorld-2024-4-2/.vscode/extensions.json @@ -0,0 +1,5 @@ +{ + "recommendations": [ + "visualstudiotoolsforunity.vstuc" + ] +} diff --git a/ColorlessWorld-2024-4-2/.vscode/launch.json b/ColorlessWorld-2024-4-2/.vscode/launch.json new file mode 100644 index 00000000..da60e25a --- /dev/null +++ b/ColorlessWorld-2024-4-2/.vscode/launch.json @@ -0,0 +1,10 @@ +{ + "version": "0.2.0", + "configurations": [ + { + "name": "Attach to Unity", + "type": "vstuc", + "request": "attach" + } + ] +} \ No newline at end of file diff --git a/ColorlessWorld-2024-4-2/.vscode/settings.json b/ColorlessWorld-2024-4-2/.vscode/settings.json new file mode 100644 index 00000000..a14b978e --- /dev/null +++ b/ColorlessWorld-2024-4-2/.vscode/settings.json @@ -0,0 +1,60 @@ +{ + "files.exclude": { + "**/.DS_Store": true, + "**/.git": true, + "**/.vs": true, + "**/.gitmodules": true, + "**/.vsconfig": true, + "**/*.booproj": true, + "**/*.pidb": true, + "**/*.suo": true, + "**/*.user": true, + "**/*.userprefs": true, + "**/*.unityproj": true, + "**/*.dll": true, + "**/*.exe": true, + "**/*.pdf": true, + "**/*.mid": true, + "**/*.midi": true, + "**/*.wav": true, + "**/*.gif": true, + "**/*.ico": true, + "**/*.jpg": true, + "**/*.jpeg": true, + "**/*.png": true, + "**/*.psd": true, + "**/*.tga": true, + "**/*.tif": true, + "**/*.tiff": true, + "**/*.3ds": true, + "**/*.3DS": true, + "**/*.fbx": true, + "**/*.FBX": true, + "**/*.lxo": true, + "**/*.LXO": true, + "**/*.ma": true, + "**/*.MA": true, + "**/*.obj": true, + "**/*.OBJ": true, + "**/*.asset": true, + "**/*.cubemap": true, + "**/*.flare": true, + "**/*.mat": true, + "**/*.meta": true, + "**/*.prefab": true, + "**/*.unity": true, + "build/": true, + "Build/": true, + "Library/": true, + "library/": true, + "obj/": true, + "Obj/": true, + "Logs/": true, + "logs/": true, + "ProjectSettings/": true, + "UserSettings/": true, + "temp/": true, + "Temp/": true + }, + "dotnet.defaultSolution": "ColorlessWorld-2024-4-2.sln" +} \ No newline at end of file diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs index f63c9d08..de4baca4 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Tool/Name.cs @@ -154,7 +154,7 @@ public static class Name if ((cardEntity.tempIsDisposable||cardOriginalData .IsDisposable)&&cardOriginalData.CardType!=Name.CardType.ability) { - sb.Append(","); + sb.Append(",消耗"); } /*foreach (KeyValuePair> kvp in cardOriginalData.conditionAndFunctionVal) { @@ -233,298 +233,298 @@ public static class Name case CardFunction.cardDamage: if(Usermanager.Instance!=null ) { - sb.Append("" + Usermanager.Instance.DamageCalculation(int.Parse(kvp.Value)) + "˺"); + sb.Append("造成" + Usermanager.Instance.DamageCalculation(int.Parse(kvp.Value)) + "点伤害"); } else { - sb.Append("" + int.Parse(kvp.Value) + "˺"); + sb.Append("造成" + int.Parse(kvp.Value) + "点伤害"); } break; case CardFunction.cardShield: - sb.Append("" + kvp.Value + "㻤"); + sb.Append("获得" + kvp.Value + "点护盾"); break; case CardFunction.posion: - sb.Append("ʩ" + kvp.Value + "ж"); + sb.Append("施加" + kvp.Value + "层中毒"); break; case CardFunction.fireSeed: - sb.Append("ʩ" + kvp.Value + ""); + sb.Append("施加" + kvp.Value + "层火种"); break; case CardFunction.vulnerable: - sb.Append("ʩ" + kvp.Value + ""); + sb.Append("施加" + kvp.Value + "层易伤"); break; case CardFunction.weak: - sb.Append("ʩ" + kvp.Value + ""); + sb.Append("施加" + kvp.Value + "层虚弱"); break; case CardFunction.coma: - sb.Append("ʩ" + kvp.Value + ""); + sb.Append("施加" + kvp.Value + "层昏迷"); break; case CardFunction.disarm: - sb.Append("ʩ" + kvp.Value + "е"); + sb.Append("施加" + kvp.Value + "层缴械"); break; case CardFunction.sleep: - sb.Append("ʩ" + kvp.Value + "˯"); + sb.Append("施加" + kvp.Value + "层睡眠"); break; case CardFunction.bleed: - sb.Append("ʩ" + kvp.Value + "Ѫ"); + sb.Append("施加" + kvp.Value + "层流血"); break; case CardFunction.thorn: - sb.Append("" + kvp.Value + "㾣"); + sb.Append("获得" + kvp.Value + "层荆棘"); break; case CardFunction.ember: - sb.Append("" + kvp.Value + ""); + sb.Append("获得" + kvp.Value + "层狂热"); break; case CardFunction.upSpeed: - sb.Append("" + kvp.Value + ""); + sb.Append("获得" + kvp.Value + "层加速"); break; case CardFunction.calm: - sb.Append("" + kvp.Value + "侲"); + sb.Append("获得" + kvp.Value + "层冷静"); break; case CardFunction.tempCastRange: - sb.Append("ͷž" + kvp.Value + ""); + sb.Append("卡牌释放距离增加" + kvp.Value + ""); break; case CardFunction.downSpeed: - sb.Append("" + kvp.Value + ""); + sb.Append("获得" + kvp.Value + "层减速"); break; case CardFunction.agile: - sb.Append("" + kvp.Value + ""); + sb.Append("获得" + kvp.Value + "层敏捷"); break; case CardFunction.immunity: - sb.Append("" + kvp.Value + "ħ"); + sb.Append("获得" + kvp.Value + "层魔抗"); break; case CardFunction.recoverHp: - sb.Append("ָ" + kvp.Value + "Ѫ"); + sb.Append("恢复" + kvp.Value + "点血量"); break; case CardFunction.extraDrawCardsNum: - sb.Append("»غ϶" + kvp.Value + ""); + sb.Append("下回合多抽" + kvp.Value + "张牌"); break; case CardFunction.teleport: - sb.Append("˲ƵĿ"); + sb.Append("瞬移到目标格子"); break; case CardFunction.clearAllAbnormalConditons: - sb.Append("쳣״̬"); + sb.Append("清除所有异常状态"); break; case CardFunction.firm: - sb.Append("ܲʧ"); + sb.Append("护盾不会消失"); break; case CardFunction.costRestore: - sb.Append("" + kvp.Value + ""); + sb.Append("获得" + kvp.Value + "点能量"); break; case CardFunction.drawCard: - sb.Append("" + kvp.Value + ""); + sb.Append("抽" + kvp.Value + "张牌"); break; case CardFunction.discard: - sb.Append("" + kvp.Value + ""); + sb.Append("弃" + kvp.Value + "张牌"); break; case CardFunction.nodeDiffDamage: - sb.Append("ɳز˺"); + sb.Append("造成场地差伤害"); break; case CardFunction.dyeing: - sb.Append("Ⱦɫ"); + sb.Append("染色"); break; case CardFunction.consumePlayerNodesForHealth: - sb.Append("ķΧڵѷӣָѪ"); + sb.Append("消耗范围内的友方格子,恢复消耗数量的血量"); break; case CardFunction.costStep: - sb.Append("" + kvp.Value + "ƶ"); + sb.Append("消耗" + kvp.Value + "点移动力"); break; case CardFunction.nextTurnExtraOneCost: - sb.Append("»غ϶ظһ"); + sb.Append("下回合额外回复一点能量"); break; case CardFunction.fireShield: - sb.Append("" + kvp.Value + ""); + sb.Append("获得" + kvp.Value + "层火盾"); break; case CardFunction.banStep: - sb.Append("ʩ" + kvp.Value + ""); + sb.Append("施加" + kvp.Value + "层缠绕"); break; case CardFunction.step: if (int.Parse(kvp.Value) > 0) { - sb.Append("" + kvp.Value + "ƶ"); + sb.Append("获得" + kvp.Value + "点移动力"); } else { - sb.Append("ʧȥ" + -int.Parse(kvp.Value) + "ƶ"); + sb.Append("失去" + -int.Parse(kvp.Value) + "点移动力"); } break; case CardFunction.dyeingAround: - sb.Append("ĿΧȾɫ"); + sb.Append("对目标周围染色"); break; case CardFunction.nextCardCostHp: - sb.Append("ʹһĸΪѪ"); + sb.Append("使下一张牌消耗改为血量"); break; case CardFunction.nextCardCostMinusOne: - sb.Append("ʹһ-1"); + sb.Append("使下一张牌消耗-1"); break; case CardFunction.cantUserEffectCaed: - sb.Append("غ޷ͷЧ"); + sb.Append("本回合无法释放效果牌"); break; case CardFunction.dyeingCardCostMinusOne: - sb.Append("ͿɫƷ-1"); + sb.Append("手牌涂色牌费用-1"); break; case CardFunction.nextDyeingCardRangeAddTwo: - sb.Append("Ϳɫʩ+2"); + sb.Append("下张涂色牌施法距离+2"); break; case CardFunction.nextEffectCardDoubleSettle: - sb.Append("һЧƽ"); + sb.Append("下一张效果牌结算两次"); break; case CardFunction.deathMark: - sb.Append("ʩ" + kvp.Value + "ӡ"); + sb.Append("施加" + kvp.Value + "层死亡印记"); break; case CardFunction.teleportAround: - sb.Append("ҳΧ1"); + sb.Append("玩家出现在周围随机1格"); break; case CardFunction.infCastRange: - sb.Append("ʩ"); + sb.Append("无限施法距离"); break; case CardFunction.drawEffectCard: - sb.Append("" + kvp.Value + "Ч"); + sb.Append("抽" + kvp.Value + "张效果牌"); break; case CardFunction.doublebleedDamage: - sb.Append("ʹѪ˷"); + sb.Append("使血伤翻倍"); break; case CardFunction.drawAndCopyCard: - sb.Append("һ,Ƶĸ"); + sb.Append("抽一张牌,获得这张牌的复制"); break; case CardFunction.nextDyeingCardCostZero: - sb.Append("ͿɫΪ0"); + sb.Append("下张涂色牌消耗为0"); break; case CardFunction.bleed4TurnCost: - sb.Append("غڴ4Ѫ1"); + sb.Append("回合内触发4次流血,获得1点能量"); break; case CardFunction.bleed3TurnCost: - sb.Append("غڴ3Ѫ1"); + sb.Append("回合内触发3次流血,获得1点能量"); break; case CardFunction.bleedHeal: - sb.Append("Ŀ굥λ´Ѫ˺"); + sb.Append("目标单位的下次流血伤害会治疗玩家"); break; case CardFunction.turnRedNodesToBleed: - sb.Append("2Χɫÿ11Χеʩ1Ѫ"); + sb.Append("消耗玩家2范围颜色,每消耗1红对1范围内所有敌人施加1流血"); break; case CardFunction.turnRedNodesToBleedInTwoCirCle: - sb.Append("2Χɫÿ12Χеʩ1Ѫ"); + sb.Append("消耗玩家2范围颜色,每消耗1红对2范围内所有敌人施加1流血"); break; case CardFunction.halfHpShield: - sb.Append("ֵһĻ"); + sb.Append("获得生命值上限一半的护盾"); break; case CardFunction.cantShield: - sb.Append("" + kvp.Value + "غ޷û"); + sb.Append("下" + kvp.Value + "回合无法获得护盾"); break; case CardFunction.settleAllBleed: - sb.Append("㵥λȫѪ"); + sb.Append("结算单位全部流血层数"); break; case CardFunction.settleHalfBleed: - sb.Append("㵥λһѪ"); + sb.Append("结算单位一半流血层数"); break; case CardFunction.doubleBleed: - sb.Append("ʹĿѪ"); + sb.Append("使目标流血层数翻倍"); break; case CardFunction.tripleBleed: - sb.Append("ʹĿѪ3"); + sb.Append("使目标流血层数翻3倍"); break; case CardFunction.lostHp: - sb.Append("ʧȥ" + kvp.Value + ""); + sb.Append("失去" + kvp.Value + "点生命"); break; case CardFunction.ifBleedThenShield: - sb.Append("ĿѪ" + kvp.Value + "㻤"); + sb.Append("若目标身上有流血,获得" + kvp.Value + "点护盾"); break; case CardFunction.turnHalfYellowNodesToShield: - sb.Append("ûƶӦĻ,һɫ"); + sb.Append("获得黄对应数量的护盾,留下一半黄色"); break; case CardFunction.turnYellowNodesToShield: - sb.Append("лɫöӦĻ"); + sb.Append("消耗所有黄色,获得对应数量的护盾"); break; case CardFunction.turn3RedNodesToEmber: - sb.Append("Χ2Χؿ飬ÿ31"); + sb.Append("消耗玩家周围2范围地块,每消耗3红获得1层狂热"); break; case CardFunction.turn2RedNodesToEmber: - sb.Append("Χ2Χؿ飬ÿ21"); + sb.Append("消耗玩家周围2范围地块,每消耗2红获得1层狂热"); break; case CardFunction.bleedDamage: - sb.Append("" + kvp.Value + "Ѫ"); + sb.Append("增加" + kvp.Value + "层血伤"); break; case CardFunction.drawDyeingCard: - sb.Append("" + kvp.Value + "Ϳɫ"); + sb.Append("抽" + kvp.Value + "张涂色牌"); break; case CardFunction.bleedForRedNode: - sb.Append("Ժɫؿ" + kvp.Value + "Ѫ"); + sb.Append("对红色地块造成" + kvp.Value + "层流血"); break; case CardFunction.shieldToDamage: - sb.Append("Ŀɻֵ˺"); + sb.Append("对目标造成护盾值的伤害"); break; case CardFunction.damageForRedNode: - //sb.Append("Ժɫؿ" + Usermanager.Instance.DamageCalculation(int.Parse(kvp.Value)) + "˺"); + //sb.Append("对红色地块造成" + Usermanager.Instance.DamageCalculation(int.Parse(kvp.Value)) + "点伤害"); if (Usermanager.Instance != null) { - sb.Append("Ժɫؿ" + Usermanager.Instance.DamageCalculation(int.Parse(kvp.Value)) + "˺"); + sb.Append("对红色地块造成" + Usermanager.Instance.DamageCalculation(int.Parse(kvp.Value)) + "点伤害"); } else { - sb.Append("Ժɫؿ" + kvp.Value + "˺"); + sb.Append("对红色地块造成" + kvp.Value + "点伤害"); } break; case CardFunction.damageForBlueNode: if (Usermanager.Instance != null) { - sb.Append("ɫؿ" + Usermanager.Instance.DamageCalculation(int.Parse(kvp.Value)) + "˺"); + sb.Append("对蓝色地块造成" + Usermanager.Instance.DamageCalculation(int.Parse(kvp.Value)) + "点伤害"); } else { - sb.Append("ɫؿ" + kvp.Value + "˺"); + sb.Append("对蓝色地块造成" + kvp.Value + "点伤害"); } break; case CardFunction.damagexyForBlueNode: string[] valuesA = kvp.Value.Split("&"); if (Usermanager.Instance != null) { - sb.Append("ɫؿ" + Usermanager.Instance.DamageCalculation(int.Parse(valuesA[0])) + "˺" + valuesA[1] + ""); + sb.Append("对蓝色地块造成" + Usermanager.Instance.DamageCalculation(int.Parse(valuesA[0])) + "点伤害" + valuesA[1] + "次"); } else { - sb.Append("ɫؿ" + int.Parse(valuesA[0]) + "˺" + valuesA[1] + ""); + sb.Append("对蓝色地块造成" + int.Parse(valuesA[0]) + "点伤害" + valuesA[1] + "次"); } break; case CardFunction.nextRoundCostMinusOne: - sb.Append("»غظ-1"); + sb.Append("下回合能量回复-1"); break; case CardFunction.damagexy: string[] values = kvp.Value.Split("&"); if (Usermanager.Instance != null) { - sb.Append("" + Usermanager.Instance.DamageCalculation(int.Parse(values[0])) + "˺" + values[1] + ""); + sb.Append("造成" + Usermanager.Instance.DamageCalculation(int.Parse(values[0])) + "点伤害" + values[1] + "次"); } else - { sb.Append("" + int.Parse(values[0]) + "˺" + values[1] + ""); } + { sb.Append("造成" + int.Parse(values[0]) + "点伤害" + values[1] + "次"); } break; case CardFunction.repel: - sb.Append("" + kvp.Value + ""); + sb.Append("击退" + kvp.Value + "格"); break; case CardFunction.repelRound: - sb.Append("˷Χ1ĵλ" + kvp.Value + ""); + sb.Append("击退范围1的单位" + kvp.Value + "格"); break; case CardFunction.reduceCost: - sb.Append("-" + kvp.Value + ""); + sb.Append("费用-" + kvp.Value + ""); break; case CardFunction.spreadColorToAround: - sb.Append("ĿؿɫɢΧ"); + sb.Append("将目标地块的颜色扩散至周围"); break; case CardFunction.repelToEnd: - sb.Append("ĿرԵ"); + sb.Append("将目标击退至场地边缘"); break; case CardFunction.damageMulNodeKind: - sb.Append("ÿһɫĵؿ飬" + kvp.Value + "˺"); + sb.Append("场上每有一种颜色的地块,造成" + kvp.Value + "点伤害"); break; case CardFunction.bleedIfNot: - sb.Append("ĿûѪʩ" + kvp.Value + "Ѫ"); + sb.Append("如果目标没有流血,施加" + kvp.Value + "层流血"); break; case CardFunction.switchStepToCost: - sb.Append("غϽʣƶתΪ"); + sb.Append("本回合将剩余移动力转化为能量"); break; case CardFunction.teleportAndDamageAround: - sb.Append("͵ĿӣΧ" + kvp.Value + "˺"); + sb.Append("传送到目标格子,对周围造成" + kvp.Value + "点伤害"); break; case CardFunction.damageIfMoved: - sb.Append("غƶ" + kvp.Value + "˺"); + sb.Append("如果本回合移动过,造成" + kvp.Value + "点伤害"); break; case CardFunction.damageAndRestoreCostIfKill: break; @@ -537,47 +537,47 @@ public static class Name Match match = System.Text.RegularExpressions.Regex.Match(condition, Name.Regex.cardConditionPattern); if (match.Success) { - string firstPart = match.Groups[1].Value; // һ(red) - string op = match.Groups[2].Value; // - string secondPart = match.Groups[3].Value; // ڶ + string firstPart = match.Groups[1].Value; // 第一部分(red) + string op = match.Groups[2].Value; // 运算符部分 + string secondPart = match.Groups[3].Value; // 第二部分 - Debug.Log("ָ"+firstPart); - Debug .Log ("ָ" + secondPart); - Debug.Log("ָ" + op); + Debug.Log("分割"+firstPart); + Debug .Log ("分割" + secondPart); + Debug.Log("分割" + op); } else { switch (condition) { case Name.WeaponNodeCondition.position: - sb.Append("λ" + (int.Parse(conditionValue) + 1)); + sb.Append("在位置" + (int.Parse(conditionValue) + 1)); break; case Name.WeaponNodeCondition.positionUnused: - sb.Append("λ" + (int.Parse(conditionValue) + 1) + "ıʯûм"); + sb.Append("位置" + (int.Parse(conditionValue) + 1) + "的宝石没有激活"); break; case Name.WeaponNodeCondition.positionUsed: - sb.Append("λ" + (int.Parse(conditionValue) + 1) + "ıʯ"); + sb.Append("位置" + (int.Parse(conditionValue) + 1) + "的宝石激活了"); break; case Name.WeaponNodeCondition.diffSettle: - sb.Append("ϴγɹʱλòͬ"); + sb.Append("与上次成功激活时位置不同"); break; case Name.WeaponNodeCondition.usedCard: - sb.Append("" + int.Parse(conditionValue) + "ıʯ"); + sb.Append("至少有" + int.Parse(conditionValue) + "个激活的宝石"); break; case Name.WeaponNodeCondition.threeColorDiffMoreThan: - sb.Append("Ƶؿֵ" + (int.Parse(conditionValue))); + sb.Append("蓝红黄地块差值大于" + (int.Parse(conditionValue))); break; case Name.WeaponNodeCondition.threeColorCountMoreThan: - sb.Append("Ƶؿ" + (int.Parse(conditionValue))); + sb.Append("蓝红黄地块数量大于" + (int.Parse(conditionValue))); break; case Name.WeaponNodeCondition.threeColorCountEqual: - sb.Append("Ƶؿ" + (int.Parse(conditionValue))); + sb.Append("蓝红黄地块数量等于" + (int.Parse(conditionValue))); break; case Name.WeaponNodeCondition.everyNumNodeConvert: - sb.Append("ÿת"+ (int.Parse(conditionValue)) + "ؿ"); + sb.Append("每转化"+ (int.Parse(conditionValue)) + "个地块"); break; case Name.WeaponNodeCondition.bombbomb: - sb.Append("ÿըը"); + sb.Append("每当有炸弹爆炸"); break; case Name.WeaponNodeCondition.node: break; @@ -595,70 +595,70 @@ public static class Name switch (result) { case Name.WeaponNodeFunction.addScore: - sb.Append("+" + int.Parse(resultValue)); + sb.Append("攻击力+" + int.Parse(resultValue)); break; case Name.WeaponNodeFunction.mulScore: - sb.Append("*" + (1+float.Parse(resultValue))); + sb.Append("攻击力*" + (1+float.Parse(resultValue))); break; case Name.WeaponNodeFunction.repetWeaponNode: - sb.Append("ظλ" + (int.Parse(resultValue) + 1) +"ʯЧ"); + sb.Append("重复位置" + (int.Parse(resultValue) + 1) +"宝石的效果"); break; case Name.WeaponNodeFunction.doubleWeaponNode: - sb.Append("λ" + (int.Parse(resultValue) + 1) + "ʯЧ"); + sb.Append("位置" + (int.Parse(resultValue) + 1) + "宝石的效果翻倍"); break; case Name.WeaponNodeFunction.redNodeCount: - sb.Append("ɫؿ+" + int.Parse(resultValue)); + sb.Append("红色地块的数量+" + int.Parse(resultValue)); break; case Name.WeaponNodeFunction.blueNodeCount: - sb.Append("ɫؿ+" + int.Parse(resultValue)); + sb.Append("蓝色地块的数量+" + int.Parse(resultValue)); break; case Name.WeaponNodeFunction.yellowNodeCount: - sb.Append("ɫؿ+" + int.Parse(resultValue)); + sb.Append("黄色地块的数量+" + int.Parse(resultValue)); break; case Name.WeaponNodeFunction.mostNodeCount: - sb.Append("ҵؿ+" + int.Parse(resultValue)); + sb.Append("数量最多的玩家地块数量+" + int.Parse(resultValue)); break; case Name.WeaponNodeFunction.leastNodeCount: - sb.Append("ٵҵؿ+" + int.Parse(resultValue)); + sb.Append("数量最少的玩家地块数量+" + int.Parse(resultValue)); break; case Name.WeaponNodeFunction.allNodeCount: - sb.Append("ҵĵؿ+" + int.Parse(resultValue)); + sb.Append("所有玩家的地块的数量+" + int.Parse(resultValue)); break; case Name.WeaponNodeFunction.drawCard: - sb.Append("»غ϶" + int.Parse(resultValue)+""); + sb.Append("下回合多抽" + int.Parse(resultValue)+"张牌"); break; case Name.WeaponNodeFunction.everyRedNodeAddScore: - sb.Append("ÿһɫؿ" + int.Parse(resultValue) + "㹥"); + sb.Append("每有一个红色地块增加" + int.Parse(resultValue) + "点攻击力"); break; case Name.WeaponNodeFunction.everyYellowNodeAddScore: - sb.Append("ÿһɫؿ" + int.Parse(resultValue) + "㹥"); + sb.Append("每有一个黄色地块增加" + int.Parse(resultValue) + "点攻击力"); break; case Name.WeaponNodeFunction.everyBlueNodeAddScore: - sb.Append("ÿһɫؿ" + int.Parse(resultValue) + "㹥"); + sb.Append("每有一个蓝色地块增加" + int.Parse(resultValue) + "点攻击力"); break; case Name.WeaponNodeFunction.everyBlackNodeAddScore: - sb.Append("ÿһɫؿ" + int.Parse(resultValue) + "㹥"); + sb.Append("每有一个黑色地块增加" + int.Parse(resultValue) + "点攻击力"); break; case Name.WeaponNodeFunction.everyHolyNodeAddScore: - sb.Append("ÿһʥؿ" + int.Parse(resultValue) + "㹥"); + sb.Append("每有一个圣光地块增加" + int.Parse(resultValue) + "点攻击力"); break; case Name.WeaponNodeFunction.everyBombAddScore: - sb.Append("ÿһը" + int.Parse(resultValue) + "㹥"); + sb.Append("每有一个炸弹增加" + int.Parse(resultValue) + "点攻击力"); break; case Name.WeaponNodeFunction.everyBelieverAddScore: - sb.Append("ÿһͽ" + int.Parse(resultValue) + "㹥"); + sb.Append("每有一个信徒增加" + int.Parse(resultValue) + "点攻击力"); break; case Name.WeaponNodeFunction.threeColorRedistribution: - sb.Append("غϽƵؿȱ·"); + sb.Append("回合结束蓝红黄地块等比例重新分配"); break; case Name.NodeItem.Volcano: - sb.Append("غϽڳ" + int.Parse(resultValue) + "ɽ"); + sb.Append("回合结束在场上增加" + int.Parse(resultValue) + "个火山"); break; case Name.WeaponNodeFunction.bomb: - sb.Append("ڳһը"); + sb.Append("在场上生成一个炸弹"); break; case Name.NodeItem.AcidRain: - sb.Append("غϽڳ" + int.Parse(resultValue) + ""); + sb.Append("回合结束在场上增加" + int.Parse(resultValue) + "个酸雨"); break; } return sb.ToString(); @@ -988,53 +988,53 @@ public static class Name public const string pattern1xxx = @"^1\d{3}$"; //2*** public const string pattern2xxx = @"^2\d{3}$"; - //(red>5) + //卡牌条件(red>5) public const string cardConditionPattern = @"(\w+)([><=+])(\d+)"; - //λn + //在位置n public const string position = @"^position\d+$"; - //ijſδ + //某张卡牌未激活 public const string cardUnused = @"^.*CardUnused$"; - //ijɫ>n + //某两个颜色>n public const string twoColorCondition = @"^[a-zA-Z]+_[a-zA-Z]+(<=|>=|!=|==|[<>=])-?\d+(?:\.\d+)?$"; - //ϴνʱλòͬ + //与上次结算时位置不同 public const string diffSettle = "diffSettle"; - //ɫ>n + //有两个颜色>n public const string anyTwoColorCondition = @"^anyTwoColor\s*([<>=])\s*(-?\d+(?:\.\d+)?)$"; - //>n + //激活的牌>n public const string usedCard = @"^usedCard\s*([<>=])\s*(-?\d+(?:\.\d+)?)$"; - //ĵؿ״ + //具体的地块形状 public const string node = "node"; } public static class WeaponNodeCondition { - //(red>5) + //卡牌条件(red>5) public const string cardConditionPattern = @"(\w+)([><=+])(\d+)"; - //λn + //在位置n public const string position = "position"; - //ijűʯδ + //某张宝石未激活 public const string positionUnused = "positionUnused"; - //ijűʯ + //某张宝石激活 public const string positionUsed = "positionUsed"; - //ijɫ>n + //某两个颜色>n public const string twoColorCondition = @"^[a-zA-Z]+_[a-zA-Z]+(<=|>=|!=|==|[<>=])-?\d+(?:\.\d+)?$"; - //ϴνʱλòͬ + //与上次结算时位置不同 public const string diffSettle = "diffSettle"; - //ɫ>n + //有两个颜色>n public const string anyTwoColorCondition = "anyTwoColor"; - //>n + //激活的牌>n public const string usedCard = "usedCard"; - //ĵؿ״ + //具体的地块形状 public const string node = "node"; - //Ƶؿֵ + //蓝红黄地块差值大于 public const string threeColorDiffMoreThan = "threeColorDiffMoreThan"; - //Ƶؿ + //蓝红黄地块数量大于 public const string threeColorCountMoreThan = "threeColorCountMoreThan"; - //Ƶؿ + //蓝红黄地块数量等于 public const string threeColorCountEqual = "threeColorCountEqual"; - //ÿתnumĵؿ + //每转化num的地块 public const string everyNumNodeConvert = "everyNumNodeConvert"; - //ըը + //炸弹爆炸 public const string bombbomb = "bombbomb"; public static readonly HashSet PlayerConditionSet= new HashSet { cardConditionPattern,position, positionUnused, positionUsed, diffSettle @@ -1115,49 +1115,49 @@ public static class Name } public static class WeaponNodeFunction { - //ӷ + //加分 public const string addScore = "addScore"; - //غüӷ + //本回合永久加分 public const string addScoreThisTurn = "addScoreThisTurn"; - //˻ + //乘积 public const string mulScore = "mulScore"; - //ظijʯЧ + //重复某个宝石的效果 public const string repetWeaponNode = "repetWeaponNode"; - //ijʯЧ + //某个宝石的效果翻倍 public const string doubleWeaponNode = "doubleWeaponNode"; - //ɫ+n + //红色+n public const string redNodeCount = "redNodeCount"; - //ɫ+n + //红色+n public const string blueNodeCount = "blueNodeCount"; - //ɫ+n + //黄色+n public const string yellowNodeCount = "yellowNodeCount"; - //ɫ+n + //最多色+n public const string mostNodeCount = "mostNodeCount"; - //ɫ+n + //最少色+n public const string leastNodeCount = "leastNodeCount"; - //ɫ+n + //所有色+n public const string allNodeCount = "allNodeCount"; - //һغ϶nͿɫ + //下一回合多抽n张涂色牌 public const string drawCard = "drawCard"; - //ijʯ + //某个宝石无视条件 public const string isIgnoreCondition = "isIgnoreCondition"; - //ÿкɫ+n + //每有红色+n public const string everyRedNodeAddScore = "everyRedNodeAddScore"; - //ÿлɫ+n + //每有黄色+n public const string everyYellowNodeAddScore = "everyYellowNodeAddScore"; - //ÿɫ+n + //每有蓝色+n public const string everyBlueNodeAddScore = "everyBlueNodeAddScore"; - //ÿкɫ+n + //每有黑色+n public const string everyBlackNodeAddScore = "everyBlackNodeAddScore"; - //ÿʥ+n + //每有圣光+n public const string everyHolyNodeAddScore = "everyHolyNodeAddScore"; - //ÿը+n + //每有炸弹+n public const string everyBombAddScore = "everyBombAddScore"; - //ÿͽ+n + //每有信徒+n public const string everyBelieverAddScore = "everyBelieverAddScore"; - //̻Ƶؿ· + //蓝绿黄地块数量重新分配 public const string threeColorRedistribution = "threeColorRedistribution"; - //ը + //生成炸弹 public const string bomb = "bomb"; public static readonly HashSet PlayerResultSet = new HashSet { addScore,mulScore, repetWeaponNode, redNodeCount, blueNodeCount @@ -1183,11 +1183,12 @@ public static class Name public const string Elementary = "Elementary"; public const string Intermediate = "Intermediate"; public const string Advanced = "Advanced"; + public static readonly HashSet WeaponNodeLevelSet = new HashSet { Basic,Elementary,Intermediate,Advanced}; } public static class DomainFunction { - //ӷ + //加分 public const string score = "score"; } public static class CardFunctionString diff --git a/ColorlessWorld-2024-4-2/Assets/Scripts/Weapon/WeaponManager.cs b/ColorlessWorld-2024-4-2/Assets/Scripts/Weapon/WeaponManager.cs index 08a06f3b..a0e83dc1 100644 --- a/ColorlessWorld-2024-4-2/Assets/Scripts/Weapon/WeaponManager.cs +++ b/ColorlessWorld-2024-4-2/Assets/Scripts/Weapon/WeaponManager.cs @@ -7,20 +7,20 @@ using UnityEngine; public class WeaponManager : Singleton { - [Header("Ƿ")] + [Header("�����Ƿ������������")] public bool isWeaponSettle; - [Header ("")] - //ڵ + [Header("�����������")] + //��������ڵ� /*public List playerWeaponNodeList = new List(); - //ڵ + //���������ڵ� public List enemyWeaponNodeList = new List();*/ public Weapon playerUsingWeapon; public EnemyWeapon enemyUsingWeapon; - public bool isMapChange=true; + public bool isMapChange = true; public bool isWeaponNodeChange = true; @@ -32,13 +32,13 @@ public class WeaponManager : Singleton private void Start() { DontDestroyOnLoad(this.gameObject); - + } private void Update() { - if (isWeaponSettle == true ) + if (isWeaponSettle == true) { System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch(); stopwatch.Start(); @@ -48,24 +48,24 @@ public class WeaponManager : Singleton stopwatch.Stop(); enemyUsingWeapon.SettleEnemyWeapon(enemyWeaponNodeList); isMapChange = false; - isWeaponNodeChange =false; + isWeaponNodeChange = false; } - - if (stopwatch.ElapsedMilliseconds>100) + + if (stopwatch.ElapsedMilliseconds > 100) { - Debug.LogWarning($"ܾ棡ʱ {stopwatch.ElapsedMilliseconds}ms"); + Debug.LogWarning($"���ܾ��棡��ʱ {stopwatch.ElapsedMilliseconds}ms"); } - if(stopwatch.ElapsedMilliseconds>10) + if (stopwatch.ElapsedMilliseconds > 10) { - Debug.LogWarning($"ܾ棡ʱ {stopwatch.ElapsedMilliseconds}ms"); + Debug.LogWarning($"���ܾ��棡��ʱ {stopwatch.ElapsedMilliseconds}ms"); } - + } - - + + //SettleWeaponNode(); //SettleEnemyWeaponNode(); } @@ -114,30 +114,30 @@ public class WeaponManager : Singleton FadeMode(); } } - public void ShowMode()//չʾصĹ + public void ShowMode()//չʾ���صĹ��� { - isWeaponSettle= true; + isWeaponSettle = true; - enemyWeaponNodeList.gameObject.SetActive (true); + enemyWeaponNodeList.gameObject.SetActive(true); playerUsingWeapon = new Weapon(); enemyUsingWeapon = new EnemyWeapon(); } - public void FadeMode()//սع + public void FadeMode()//��ս���������ع��� { isWeaponSettle = false; - enemyWeaponNodeList .gameObject .SetActive(false); + enemyWeaponNodeList.gameObject.SetActive(false); foreach (Transform transform in playerWeaponNodeList) { - if(transform .childCount >0) + if (transform.childCount > 0) { WeaponNode weaponNode = transform.GetChild(0).GetComponent(); if (weaponNode.enableVFX != null) weaponNode.enableVFX.SetActive(false); } - + } foreach (Transform transform in enemyWeaponNodeList) { @@ -147,7 +147,7 @@ public class WeaponManager : Singleton if (weaponNode.enableVFX != null) weaponNode.enableVFX.SetActive(false); } - + } } @@ -155,15 +155,15 @@ public class WeaponManager : Singleton { GameObject gem = Instantiate(Resources.Load(Name.WeaponNode.PrefabPath + Name.WeaponNode.PrefabName)); string condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerConditionSet, 1).ElementAt(0); - string conditionValue=""; - string[] nodesMark=new string[4]; + string conditionValue = ""; + string[] nodesMark = new string[4]; string[] nodesColor = new string[4]; string result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerResultSet, 1).ElementAt(0); - string resultValue=""; + string resultValue = ""; switch (condition) { case Name.WeaponNodeCondition.position: - conditionValue= MathTool.GetRandomElements(new HashSet {"0","1","2","3","4" }, 1).ElementAt(0); + conditionValue = MathTool.GetRandomElements(new HashSet { "0", "1", "2", "3", "4" }, 1).ElementAt(0); break; case Name.WeaponNodeCondition.positionUnused: conditionValue = MathTool.GetRandomElements(new HashSet { "0", "1", "2", "3", "4" }, 1).ElementAt(0); @@ -172,13 +172,13 @@ public class WeaponManager : Singleton conditionValue = MathTool.GetRandomElements(new HashSet { "0", "1", "2", "3", "4" }, 1).ElementAt(0); break; case Name.WeaponNodeCondition.diffSettle: - conditionValue=Name.none; + conditionValue = Name.none; break; case Name.WeaponNodeCondition.usedCard: - conditionValue = MathTool.GetRandomElements(new HashSet { "1", "2", "3", "4", "5" }, 1).ElementAt(0); + conditionValue = MathTool.GetRandomElements(new HashSet { "1", "2", "3", "4", "5" }, 1).ElementAt(0); break; case Name.WeaponNodeCondition.threeColorDiffMoreThan: - conditionValue = MathTool.GetRandomElements(new HashSet { "3", "4", "5" }, 1).ElementAt(0); + conditionValue = MathTool.GetRandomElements(new HashSet { "3", "4", "5" }, 1).ElementAt(0); break; case Name.WeaponNodeCondition.everyNumNodeConvert: conditionValue = MathTool.GetRandomElements(new HashSet { "7", "8", "9" }, 1).ElementAt(0); @@ -190,7 +190,7 @@ public class WeaponManager : Singleton conditionValue = Name.none; HashSet nodesA = MathTool.GetRandomElements(new HashSet { "1_0", "-1_0", "0_1", "0_-1", "-1_1", "-1_-1" }, 3); nodesA.Add("0_0"); - nodesMark=nodesA.ToArray(); + nodesMark = nodesA.ToArray(); nodesColor = new string[4] { MathTool.GetRandomElements(new HashSet { Name.Color.Red, Name.Color.Blue, Name.Color.Yellow }, 1).ElementAt(0) ,MathTool.GetRandomElements(new HashSet { Name.Color.Red, Name.Color.Blue, Name.Color.Yellow }, 1).ElementAt(0) ,MathTool.GetRandomElements(new HashSet { Name.Color.Red, Name.Color.Blue, Name.Color.Yellow }, 1).ElementAt(0) @@ -202,16 +202,16 @@ public class WeaponManager : Singleton sb.Append(MathTool.GetRandomElements(new HashSet { Name.Color.Red, Name.Color.Blue, Name.Color.Yellow }, 1).ElementAt(0)) .Append(MathTool.GetRandomElements(new HashSet { "<", ">" }, 1).ElementAt(0)) .Append(MathTool.GetRandomElements(new HashSet { "5", "6", "7", "8", "9" }, 1).ElementAt(0)); - condition =sb.ToString(); + condition = sb.ToString(); break; } switch (result) { case Name.WeaponNodeFunction.addScore: - resultValue = MathTool.GetRandomElements(MathTool.GenerateIntegerSet(7, 12), 1).ElementAt(0); + resultValue = MathTool.GetRandomElements(MathTool.GenerateIntegerSet(7, 12), 1).ElementAt(0); break; case Name.WeaponNodeFunction.mulScore: - resultValue = MathTool.GetRandomElements(new HashSet { "1", "2"}, 1).ElementAt(0); + resultValue = MathTool.GetRandomElements(new HashSet { "1", "2" }, 1).ElementAt(0); break; case Name.WeaponNodeFunction.repetWeaponNode: resultValue = MathTool.GetRandomElements(new HashSet { "0", "1", "2", "3", "4" }, 1).ElementAt(0); @@ -250,7 +250,7 @@ public class WeaponManager : Singleton resultValue = MathTool.GetRandomElements(MathTool.GenerateIntegerSet(1, 2), 1).ElementAt(0); break; } - WeaponNode weaponNode=gem.GetComponent(); + WeaponNode weaponNode = gem.GetComponent(); weaponNode.result = result; weaponNode.resultValue = resultValue; weaponNode.condition = condition; @@ -267,7 +267,7 @@ public class WeaponManager : Singleton switch (level) { case Name.WeaponNodeLevel.Basic: - condition= MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerBasicConditionSet, 1).ElementAt(0); + condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerBasicConditionSet, 1).ElementAt(0); break; case Name.WeaponNodeLevel.Elementary: condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerElementaryConditionSet, 1).ElementAt(0); @@ -279,9 +279,9 @@ public class WeaponManager : Singleton condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerAdvancedConditionSet, 1).ElementAt(0); break; } - + string conditionValue = ""; - List nodesMark =new List(); + List nodesMark = new List(); List nodesColor = new List(); string result = ""; switch (level) @@ -299,7 +299,7 @@ public class WeaponManager : Singleton result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); break; } - + string resultValue = ""; conditionValue = getConditionValueWithLevel(level, condition, ref nodesMark, ref nodesMark); resultValue = getResultValueWithLevel(level, result, condition, conditionValue); @@ -313,8 +313,294 @@ public class WeaponManager : Singleton return gem; } + public GameObject getRandomWeaponNodeForPlayerWithLevelDiff(int levelDiff) + { + GameObject gem = Instantiate(Resources.Load(Name.WeaponNode.PrefabPath + Name.WeaponNode.PrefabName)); + string condition = ""; + HashSet resultSet = new HashSet(); + HashSet conditiontSet = new HashSet(); + string conditionLevel = ""; + string resultLevel = ""; + switch (levelDiff) + { + case -2: + case -1: + case 0: + conditionLevel = MathTool.GetRandomElements(Name.WeaponNodeLevel.WeaponNodeLevelSet, 1).ElementAt(0); + break; + case 1: + conditionLevel = MathTool.GetRandomElements(new HashSet { Name.WeaponNodeLevel.Elementary, Name.WeaponNodeLevel.Basic, Name.WeaponNodeLevel.Intermediate }, 1).ElementAt(0); + break; + case 2: + conditionLevel = MathTool.GetRandomElements(new HashSet { Name.WeaponNodeLevel.Elementary, Name.WeaponNodeLevel.Basic }, 1).ElementAt(0); + break; + case 3: + conditionLevel = Name.WeaponNodeLevel.Basic; + break; + + + } + switch (conditionLevel) + { + case Name.WeaponNodeLevel.Basic: + condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerBasicConditionSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Elementary: + condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerElementaryConditionSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Intermediate: + condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerIntermediateConditionSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Advanced: + condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerAdvancedConditionSet, 1).ElementAt(0); + break; + + } + switch (conditionLevel) + { + case Name.WeaponNodeLevel.Basic: + switch (levelDiff) + { + case 0: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case 1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case 2: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case 3: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; + } + + break; + case Name.WeaponNodeLevel.Elementary: + switch (levelDiff) + { + case -1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case 0: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case 1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case 2: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; + } + break; + case Name.WeaponNodeLevel.Intermediate: + switch (levelDiff) + { + case -2: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case -1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case 0: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case 1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; + } + break; + case Name.WeaponNodeLevel.Advanced: + switch (levelDiff) + { + case -3: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case -2: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case -1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case 0: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; + } + break; + + } + + + + string conditionValue = ""; + List nodesMark = new List(); + List nodesColor = new List(); + string result = ""; + switch (resultLevel) + { + case Name.WeaponNodeLevel.Basic: + result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Elementary: + result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Intermediate: + result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Advanced: + result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; - public string getConditionValueWithLevel(string level,string condition,ref List nodesMark, ref List nodesColor) + } + + string resultValue = ""; + conditionValue = getConditionValueWithLevel(conditionLevel, condition, ref nodesMark, ref nodesMark); + resultValue = getResultValueWithLevel(resultLevel, result, condition, conditionValue); + WeaponNode weaponNode = gem.GetComponent(); + weaponNode.result = result; + weaponNode.resultValue = resultValue; + weaponNode.condition = condition; + weaponNode.conditionValue = conditionValue; + weaponNode.nodesMark = nodesMark.ToArray(); + weaponNode.nodesColor = nodesColor.ToArray(); + return gem; + } + + public GameObject getRandomWeaponNodeForPlayerWithLevelDiffAndConditionlevel(int levelDiff,string conditionLevel) + { + GameObject gem = Instantiate(Resources.Load(Name.WeaponNode.PrefabPath + Name.WeaponNode.PrefabName)); + string condition = ""; + HashSet resultSet = new HashSet(); + HashSet conditiontSet = new HashSet(); + string resultLevel = ""; + switch (conditionLevel) + { + case Name.WeaponNodeLevel.Basic: + condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerBasicConditionSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Elementary: + condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerElementaryConditionSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Intermediate: + condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerIntermediateConditionSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Advanced: + condition = MathTool.GetRandomElements(Name.WeaponNodeCondition.PlayerAdvancedConditionSet, 1).ElementAt(0); + break; + + } + switch (conditionLevel) + { + case Name.WeaponNodeLevel.Basic: + switch (levelDiff) + { + case 0: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case 1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case 2: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case 3: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; + } + + break; + case Name.WeaponNodeLevel.Elementary: + switch (levelDiff) + { + case -1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case 0: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case 1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case 2: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; + } + break; + case Name.WeaponNodeLevel.Intermediate: + switch (levelDiff) + { + case -2: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case -1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case 0: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case 1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; + } + break; + case Name.WeaponNodeLevel.Advanced: + switch (levelDiff) + { + case -3: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case -2: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case -1: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case 0: + resultLevel = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; + } + break; + + } + + + + string conditionValue = ""; + List nodesMark = new List(); + List nodesColor = new List(); + string result = ""; + switch (resultLevel) + { + case Name.WeaponNodeLevel.Basic: + result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerBasicResultSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Elementary: + result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerElementaryResultSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Intermediate: + result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerIntermediateResultSet, 1).ElementAt(0); + break; + case Name.WeaponNodeLevel.Advanced: + result = MathTool.GetRandomElements(Name.WeaponNodeFunction.PlayerAdvancedResultSet, 1).ElementAt(0); + break; + + } + + string resultValue = ""; + conditionValue = getConditionValueWithLevel(conditionLevel, condition, ref nodesMark, ref nodesMark); + resultValue = getResultValueWithLevel(resultLevel, result, condition, conditionValue); + WeaponNode weaponNode = gem.GetComponent(); + weaponNode.result = result; + weaponNode.resultValue = resultValue; + weaponNode.condition = condition; + weaponNode.conditionValue = conditionValue; + weaponNode.nodesMark = nodesMark.ToArray(); + weaponNode.nodesColor = nodesColor.ToArray(); + return gem; + } + + + public string getConditionValueWithLevel(string level, string condition, ref List nodesMark, ref List nodesColor) { string conditionValue = ""; switch (condition) @@ -335,16 +621,16 @@ public class WeaponManager : Singleton switch (level) { case Name.WeaponNodeLevel.Basic: - conditionValue = MathTool.GetRandomElements(new HashSet { "1", "2", }, 1).ElementAt(0); + conditionValue = MathTool.GetRandomElements(new HashSet { "1", "2", }, 1).ElementAt(0); break; case Name.WeaponNodeLevel.Elementary: - conditionValue = MathTool.GetRandomElements(new HashSet { "2", "3", }, 1).ElementAt(0); + conditionValue = MathTool.GetRandomElements(new HashSet { "2", "3", }, 1).ElementAt(0); break; case Name.WeaponNodeLevel.Intermediate: - conditionValue = MathTool.GetRandomElements(new HashSet { "3", "4", "5" }, 1).ElementAt(0); + conditionValue = MathTool.GetRandomElements(new HashSet { "3", "4", "5" }, 1).ElementAt(0); break; case Name.WeaponNodeLevel.Advanced: - conditionValue = MathTool.GetRandomElements(new HashSet { "4", "5" }, 1).ElementAt(0); + conditionValue = MathTool.GetRandomElements(new HashSet { "4", "5" }, 1).ElementAt(0); break; } break; @@ -356,7 +642,7 @@ public class WeaponManager : Singleton switch (level) { case Name.WeaponNodeLevel.Basic: - conditionValue = MathTool.GetRandomElements(MathTool.GetTargetRange(3,5), 1).ElementAt(0); + conditionValue = MathTool.GetRandomElements(MathTool.GetTargetRange(3, 5), 1).ElementAt(0); break; case Name.WeaponNodeLevel.Elementary: conditionValue = MathTool.GetRandomElements(MathTool.GetTargetRange(4, 6), 1).ElementAt(0); @@ -378,7 +664,7 @@ public class WeaponManager : Singleton switch (level) { case Name.WeaponNodeLevel.Basic: - nodesA= MathTool.GetRandomElements(new HashSet { "1_0", "-1_0", "0_1", "0_-1", "-1_1", "-1_-1" }, 2); + nodesA = MathTool.GetRandomElements(new HashSet { "1_0", "-1_0", "0_1", "0_-1", "-1_1", "-1_-1" }, 2); break; case Name.WeaponNodeLevel.Elementary: nodesA = MathTool.GetRandomElements(new HashSet { "1_0", "-1_0", "0_1", "0_-1", "-1_1", "-1_-1" }, 3); @@ -425,7 +711,7 @@ public class WeaponManager : Singleton return conditionValue; } - public string getResultValueWithLevel(string level, string result,string condition,string conditionValue) + public string getResultValueWithLevel(string level, string result, string condition, string conditionValue) { string resultValue = ""; switch (result) @@ -550,8 +836,8 @@ public class WeaponManager : Singleton } break; case Name.WeaponNodeFunction.isIgnoreCondition: - HashSet targets= MathTool.GenerateIntegerSet(0, 4); - if(condition.Equals(Name.WeaponNodeCondition.positionUnused)|| condition.Equals(Name.WeaponNodeCondition.positionUsed)) + HashSet targets = MathTool.GenerateIntegerSet(0, 4); + if (condition.Equals(Name.WeaponNodeCondition.positionUnused) || condition.Equals(Name.WeaponNodeCondition.positionUsed)) { targets.Remove(conditionValue); } @@ -562,9 +848,9 @@ public class WeaponManager : Singleton } - public void loadEnemyWeaponNode(int position,GameObject weaponNode) + public void loadEnemyWeaponNode(int position, GameObject weaponNode) { - + Transform weaponSlot = enemyWeaponNodeList.GetChild(position); if (weaponSlot != null) { @@ -574,29 +860,29 @@ public class WeaponManager : Singleton weaponNode.transform.localEulerAngles = Vector3.zero; weaponNode.transform.localScale = Vector3.one; } - + } public void ClearAllChildren(Transform parent) { - // ʱб洢壨ѭ޸ļϣ + // ������ʱ�б��洢�����壨������ѭ�����޸ļ��ϣ� List children = new List(); - // ռ + // �ռ����������� foreach (Transform child in parent) { children.Add(child.gameObject); } - // ɾ + // ɾ������������ foreach (GameObject child in children) { - // ݻѡٷʽ + // ���ݻ���ѡ�����ٷ�ʽ if (Application.isPlaying) { Destroy(child); } - else // ༭ģʽ + else // �༭��ģʽ�� { DestroyImmediate(child); } 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 a255d9c4823534af07046be2afdc775dd311f40a..202ed431451be3bd152d54c20a9582c9142f35ec 100644 GIT binary patch literal 134732 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