public static string[] getElements(CardDefine define) { List <string> list = new List <string>(); if (define.hasTag(METAL)) { list.Add(METAL); } if (define.hasTag(WOOD)) { list.Add(WOOD); } if (define.hasTag(WATER)) { list.Add(WATER); } if (define.hasTag(FIRE)) { list.Add(FIRE); } if (define.hasTag(EARTH)) { list.Add(EARTH); } return(list.ToArray()); }
public override Card createCard(CardDefine define) { Card card = base.createCard(define); if (define is ServantCardDefine servant) { foreach (string keyword in servant.keywords) { if (string.IsNullOrEmpty(keyword)) { continue; } switch (keyword) { case Keyword.TAUNT: card.setTaunt(true); break; case Keyword.CHARGE: card.setCharge(true); break; default: throw new UnknowKeywordException("未知关键词" + keyword); } } } return(card); }
/// <summary> /// 创建并开始本地游戏 /// </summary> public void startLocalGame() { game = new THHGame(_option, getManager <CardManager>().GetCardDefines()) { answers = new GameObject(nameof(AnswerManager)).AddComponent <AnswerManager>(), triggers = new GameObject(nameof(TriggerManager)).AddComponent <TriggerManager>(), time = new GameObject(nameof(TimeManager)).AddComponent <TimeManager>(), logger = new UnityLogger() }; (game.answers as AnswerManager).game = game; //检查卡组合法性 int[] deck = _deck; checkDeckValid(deck); CardDefine playerMaster = game.getCardDefine(deck[0]); CardDefine[] playerDeck = deck.Skip(1).Select(id => game.getCardDefine(id)).ToArray(); THHPlayer localPlayer = game.createPlayer(1, "本地玩家", playerMaster as MasterCardDefine, playerDeck); THHPlayer aiPlayer = game.createPlayer(2, "AI", playerMaster as MasterCardDefine, deck.Skip(1).Select(id => game.getCardDefine(id))); displayGameUI(localPlayer); //AI玩家用AI new AI(game, aiPlayer); gameTask = game.run(); }
private bool isStandardCard(CardDefine c) { if (c.id == 0) { return(false); } //if (!(c is SpellCardDefine)) //{ // if (!(c is ServantCardDefine) && !(c is GeneratedCardDefine)) // return false; //} if (!(c is ServantCardDefine) && !(c is GeneratedCardDefine)) { return(false); } if (c is ServantCardDefine servant) { if (servant.isToken) { return(false); } } else if (c is GeneratedCardDefine generated) { if (generated.type != CardDefineType.SERVANT) { return(false); } if (generated.getProp <bool>(nameof(ServantCardDefine.isToken))) { return(false); } } return(true); }
public async Task <bool> createToken(THHGame game, CardDefine define, int position) { if (game == null) { throw new ArgumentNullException(nameof(game)); } if (define == null) { throw new ArgumentNullException(nameof(define)); } if (field.count >= field.maxCount) { return(false); } await game.triggers.doEvent(new CreateTokenEventArg() { player = this, define = define, position = position }, async arg => { THHPlayer player = arg.player; define = arg.define; position = arg.position; if (field.count >= field.maxCount) { return; } game.logger.log(player + "召唤" + define.GetType().Name + "位于" + position); arg.card = game.createCard(define); await tryPutIntoField(game, null, arg.card, position); }); return(true); }
public static CardDefine[] GetCardDefines(Assembly[] assemblies, Dictionary <Workbook, string> workbooks, out CardSkinData[] skins) { List <CardDefine> cardList = new List <CardDefine>(CardHelper.getCardDefines(assemblies)); List <CardSkinData> skinList = new List <CardSkinData>(); foreach (var pBook in workbooks) { Worksheet worksheet = pBook.Key.Worksheets[0]; int idIndex = findColIndex(worksheet, "ID"); foreach (var pRow in worksheet.Cells.Rows) { if (pRow.Key != 0) { int id = numberToInt(pRow.Value.GetCell(idIndex).Value); CardDefine card = cardList.FirstOrDefault(c => c.id == id); card = readCardDefine(card, pBook.Value, worksheet, pRow.Key, out var skin); if (card == null) { cardList.RemoveAll(c => c.id == id); Debug.Log("忽略卡片" + id); } else { cardList.Add(card); skinList.Add(skin); Debug.Log("读取Excel卡片" + card + ",皮肤:" + skin); } } } } skins = skinList.ToArray(); return(cardList.ToArray()); }
public override void merge(CardDefine newVersion) { if (newVersion.type != type) { UberDebug.LogWarning(newVersion + "的类型与" + this + "不同,可能是一次非法的数据合并!"); } cost = newVersion.getProp <int>(nameof(cost)); }
public void update(CardDefine card, CardSkinData skin, int count) { this.card = card; this.count = count; Image.sprite = skin.image; Text.text = skin.name; }
public void update(CardDefine card, CardSkinData skin) { if (skin != null) { Image.sprite = skin.image; } AttackTextPropNumber.asText.text = card.getAttack().ToString(); HpTextPropNumber.asText.text = card.getLife().ToString(); }
public static bool hasTag(this CardDefine define, string tag) { string[] tags = define.getProp <string[]>(nameof(ServantCardDefine.tags)); if (tags == null) { return(false); } return(tags.Contains(tag)); }
public static int getAttack(this CardDefine card) { int result = card.getProp <int>(nameof(ServantCardDefine.attack)); if (result < 0) { result = 0; } return(result); }
public void update(CardDefine card, CardSkinData skin) { CostText.text = card.getCost().ToString(); AttackText.text = card.getAttack().ToString(); LifeText.text = card.getLife().ToString(); Image.sprite = skin.image; NameText.text = skin.name; DescText.text = skin.desc; IsFaceupController = IsFaceup.True; }
public bool cardFilter(CardDefine cd, CardSkinData sd) { // 过滤费用 if (filterCost != 0) { if (filterCost < 8) { if (cd.getCost() != filterCost) { return(false); } } else { if (cd.getCost() < 8) { return(false); } } } // 过滤类型 if (!string.IsNullOrEmpty(filterType)) { if (!string.Equals(filterType, cd.type)) { return(false); } } // 过滤稀有度 if (filterRare != 0) { // todo: 稀有度判断 } // 过滤角色 if (filterCharacter != 0) { // todo: 角色判断 } // 过滤名字 if (!string.IsNullOrEmpty(filterKeyword)) { if (!sd.name.Contains(filterKeyword)) { return(false); } } return(true); }
static GenericMenu getMenu(SerializedProperty property) { int id = property.intValue; GenericMenu menu = new GenericMenu(); menu.AddItem(new GUIContent("None"), id == 0, () => { property.intValue = 0; property.serializedObject.ApplyModifiedProperties(); }); foreach (var group in getCardDefines().GroupBy(c => c.getCharacterID())) { CardDefine character = getCardDefines().FirstOrDefault(c => c.id == group.Key); foreach (var define in group.OrderBy(c => c.GetType().Name)) { string path = ""; if (character != null) { path = character.GetType().Name; } else { path = "Neutral"; } int typeId = define.getCategory(); if (typeId == CardCategory.SERVANT) { path += "/Servant"; } else if (typeId == CardCategory.SKILL) { path += "/Skill"; } else if (typeId == CardCategory.SPELL) { path += "/Spell"; } else if (typeId == CardCategory.ITEM) { path += "/Item"; } path += "/" + define.GetType().Name; menu.AddItem(new GUIContent(path), define.id == id, () => { property.intValue = define.id; property.serializedObject.ApplyModifiedProperties(); }); } } return(menu); }
public override void merge(CardDefine newVersion) { if (newVersion.type != type) { UberDebug.LogWarning(newVersion + "的类型与" + this + "不同,可能是一次非法的数据合并!"); } if (newVersion is GeneratedCardDefine generated) { if (generated.hasProp(nameof(cost))) { cost = generated.getProp <int>(nameof(cost)); } } }
public override void merge(CardDefine newVersion) { if (newVersion.type != type) { UberDebug.LogWarning(newVersion + "的类型与" + this + "不同,可能是一次非法的数据合并!"); } cost = newVersion.getProp <int>(nameof(cost)); attack = newVersion.getProp <int>(nameof(attack)); life = newVersion.getProp <int>(nameof(life)); spellDamage = newVersion.getProp <int>(nameof(spellDamage)); isToken = newVersion.getProp <bool>(nameof(isToken)); tags = newVersion.getProp <string[]>(nameof(tags)); keywords = newVersion.getProp <string[]>(nameof(keywords)); }
public override Card createCard(CardDefine define) { Card card = base.createCard(define); if (define is MasterCardDefine master) { card.setLife(master.life); } else if (define is ServantCardDefine servant) { card.setCost(servant.cost); card.setAttack(servant.attack); card.setLife(servant.life); card.setSpellDamage(servant.spellDamage); foreach (string keyword in servant.keywords) { if (string.IsNullOrEmpty(keyword)) { continue; } card.setProp(keyword, true); } card.setProp(nameof(ServantCardDefine.keywords), servant.keywords); card.setProp(nameof(ServantCardDefine.tags), servant.tags); } else if (define is SpellCardDefine spell) { card.setCost(spell.cost); foreach (var keyword in spell.keywords) { if (string.IsNullOrEmpty(keyword)) { continue; } card.setProp(keyword, true); } } else if (define is SkillCardDefine skill) { card.setCost(skill.cost); } else if (define is ItemCardDefine item) { card.setCost(item.cost); card.setAttack(item.attack); card.setLife(item.life); } return(card); }
void onDragItem(CardDefine card, Vector2 position) { DragCard.display(); DragCard.rectTransform.position = position; if (DeckViewScroll.GetComponent <RectTransform>().rect.Contains(DeckViewScroll.GetComponent <RectTransform>().InverseTransformPoint(position))) { DragCard.BuildDeckListItem.display(); DragCard.Card.hide(); } else { DragCard.Card.display(); DragCard.BuildDeckListItem.hide(); } DragCard.BuildDeckListItem.update(card, parent.game.cards.GetCardSkin(card.id), 1); DragCard.Card.update(card, parent.game.cards.GetCardSkin(card.id)); }
bool isExcelContainCard(Worksheet sheet, CardDefine card) { int idIndex = findColIndex(sheet, "ID"); int classIndex = findColIndex(sheet, "Class"); foreach (var pRow in sheet.Cells.Rows) { if (numberToInt(pRow.Value.GetCell(idIndex).Value) == card.id) { return(true); } else if (pRow.Value.GetCell(classIndex).StringValue == card.GetType().Name) { return(true); } } return(false); }
void saveCardToXml(CardDefine card, XmlDocument xml) { xml["Card"]["ID"].InnerText = card.id.ToString(); if (card is ServantCardDefine) { xml["Card"]["Type"].InnerText = "Servant"; } else if (card is MasterCardDefine) { xml["Card"]["Type"].InnerText = "Master"; } else if (card is SkillCardDefine) { xml["Card"]["Type"].InnerText = "Skill"; } xml["Card"]["Cost"].InnerText = card.getProp <int>("cost").ToString(); xml["Card"]["Attack"].InnerText = card.getProp <int>("attack").ToString(); xml["Card"]["Life"].InnerText = card.getProp <int>("life").ToString(); if (card.getProp <string[]>("tags") is string[] tags) { xml["Card"]["Tags"].InnerText = string.Join(",", tags); } else { xml["Card"]["Tags"].InnerText = null; } if (card.getProp <string[]>("keywords") is string[] keywords) { xml["Card"]["Keywords"].InnerText = string.Join(",", keywords); } else { xml["Card"]["Keywords"].InnerText = null; } if (_manager != null) { var skin = _manager.getSkin(card.id); xml["Card"]["Skin"]["Image"].InnerText = skin == null ? null : skin.image != null ? skin.image.name + ".png" : null; xml["Card"]["Skin"]["Name"].InnerText = skin == null?card.GetType().Name : skin.name; xml["Card"]["Skin"]["Desc"].InnerText = skin == null ? null : skin.desc; } }
public override Card createCard(CardDefine define) { Card card = base.createCard(define); if (define is ServantCardDefine servant) { foreach (string keyword in servant.keywords) { if (string.IsNullOrEmpty(keyword)) { continue; } switch (keyword) { case Keyword.TAUNT: card.setTaunt(true); break; case Keyword.CHARGE: card.setCharge(true); break; case Keyword.RUSH: card.setRush(true); break; case Keyword.SHIELD: card.setShield(true); break; case Keyword.STEALTH: card.setStealth(true); break; default: throw new UnknowKeywordException("未知关键词" + keyword); } } card.setProp(nameof(ServantCardDefine.tags), servant.tags); } return(card); }
public static async Task <KeyValuePair <CardDefine[], CardSkinData[]> > GetCardDefines(ResourceManager resource, Assembly[] assemblies, Dictionary <Workbook, string> workbooks, Sprite defaultSprite) { List <CardDefine> cardList = new List <CardDefine>(CardHelper.getCardDefines(assemblies)); List <CardSkinData> skinList = new List <CardSkinData>(); foreach (var pBook in workbooks) { Worksheet worksheet = pBook.Key.Worksheets[0]; int idIndex = findColIndex(worksheet, "ID"); foreach (var pRow in worksheet.Cells.Rows) { if (pRow.Key != 0) { int id = numberToInt(pRow.Value.GetCell(idIndex).Value); if (id < 1) { continue; } CardDefine card = cardList.FirstOrDefault(c => c.id == id); CardSkinData skin; var pair = await readCardDefine(resource, card, worksheet, pRow.Key, defaultSprite); card = pair.Key; skin = pair.Value; if (card == null) { cardList.RemoveAll(c => c.id == id); Debug.Log("忽略卡片" + id); } else { cardList.Add(card); skinList.Add(skin); Debug.Log("读取Excel卡片" + card + ",皮肤:" + skin); } } } } return(new KeyValuePair <CardDefine[], CardSkinData[]>(cardList.ToArray(), skinList.ToArray())); }
public override void merge(CardDefine newVersion) { if (newVersion.type != type) { UberDebug.LogWarning(newVersion + "的类型与" + this + "不同,可能是一次非法的数据合并!"); } if (newVersion is GeneratedCardDefine generated) { if (generated.hasProp(nameof(cost))) { cost = newVersion.getProp <int>(nameof(cost)); } if (generated.hasProp(nameof(attack))) { attack = newVersion.getProp <int>(nameof(attack)); } if (generated.hasProp(nameof(life))) { life = newVersion.getProp <int>(nameof(life)); } if (generated.hasProp(nameof(spellDamage))) { spellDamage = newVersion.getProp <int>(nameof(spellDamage)); } if (generated.hasProp(nameof(isToken))) { isToken = newVersion.getProp <bool>(nameof(isToken)); } if (generated.hasProp(nameof(tags))) { tags = newVersion.getProp <string[]>(nameof(tags)); } if (generated.hasProp(nameof(keywords))) { keywords = newVersion.getProp <string[]>(nameof(keywords)); } } }
public static async Task <KeyValuePair <CardDefine[], CardSkinData[]> > GetCardDefines(ResourceManager resource, Assembly[] assemblies, Dictionary <DataSet, string> tables, Sprite defaultSprite) { List <CardDefine> cardList = new List <CardDefine>(CardHelper.getCardDefines(assemblies)); List <CardSkinData> skinList = new List <CardSkinData>(); foreach (var pTable in tables) { DataTable worksheet = pTable.Key.Tables[0]; for (int i = 1; i < worksheet.Rows.Count; i++) { var row = worksheet.Rows[i]; int id = row.ReadCol <int>("ID"); if (id < 1) { continue; } CardDefine card = cardList.FirstOrDefault(c => c.id == id); CardSkinData skin; var pair = await readCardDefine(resource, card, row, defaultSprite); card = pair.Key; skin = pair.Value; if (card == null) { cardList.RemoveAll(c => c.id == id); Debug.Log("忽略卡片" + id); } else { cardList.Add(card); skinList.Add(skin); Debug.Log("读取Excel卡片" + card + ",皮肤:" + skin); } } } return(new KeyValuePair <CardDefine[], CardSkinData[]>(cardList.ToArray(), skinList.ToArray())); }
public override void merge(CardDefine newVersion) { if (newVersion.type != type) { UberDebug.LogWarning(newVersion + "的类型与" + this + "不同,可能是一次非法的数据合并!"); } if (newVersion is MasterCardDefine master) { life = master.life; skillID = master.skillID; } else if (newVersion is GeneratedCardDefine generated) { if (generated.hasProp(nameof(life))) { life = generated.getProp <int>(nameof(life)); } if (generated.hasProp(nameof(skillID))) { skillID = generated.getProp <int>(nameof(skillID)); } } }
static CardDefine readCardDefine(CardDefine card, string dir, Worksheet sheet, int row, out CardSkinData skin) { if (card == null) { card = new GeneratedCardDefine(); } int idIndex = findColIndex(sheet, "ID"); card.id = numberToInt(sheet.Cells[row, idIndex].Value); int typeIndex = findColIndex(sheet, "Type"); if (sheet.Cells[row, typeIndex].StringValue == "Servant") { card.type = CardDefineType.servant; } else if (sheet.Cells[row, typeIndex].StringValue == "Spell") { card.type = CardDefineType.spell; } else if (sheet.Cells[row, typeIndex].StringValue == "Master") { card.type = CardDefineType.master; } else if (sheet.Cells[row, typeIndex].StringValue == "Skill") { card.type = CardDefineType.skill; } int costIndex = findColIndex(sheet, "Cost"); card.setProp(nameof(ServantCardDefine.cost), numberToInt(sheet.Cells[row, costIndex].Value)); int attackIndex = findColIndex(sheet, "Attack"); card.setProp(nameof(ServantCardDefine.attack), numberToInt(sheet.Cells[row, attackIndex].Value)); int lifeIndex = findColIndex(sheet, "Life"); card.setProp(nameof(ServantCardDefine.life), numberToInt(sheet.Cells[row, lifeIndex].Value)); int tagsIndex = findColIndex(sheet, "Tags"); card.setProp(nameof(ServantCardDefine.tags), sheet.Cells[row, tagsIndex].StringValue.Split(',')); int keywordsIndex = findColIndex(sheet, "Keywords"); card.setProp(nameof(ServantCardDefine.keywords), sheet.Cells[row, keywordsIndex].StringValue.Split(',')); int isTokenIndex = findColIndex(sheet, "IsToken"); card.setProp(nameof(ServantCardDefine.isToken), sheet.Cells[row, isTokenIndex].Value); skin = new CardSkinData() { id = card.id }; int imageIndex = findColIndex(sheet, "Image"); string imagePath = sheet.Cells[row, imageIndex].StringValue; if (File.Exists(dir + "/" + imagePath)) { using (FileStream stream = new FileStream(dir + "/" + imagePath, FileMode.Open)) { Texture2D texture = new Texture2D(512, 512); byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, (int)stream.Length); texture.LoadImage(bytes); Sprite sprite = Sprite.Create(texture, new Rect(0, 0, 512, 512), new Vector2(.5f, .5f), 100); skin.image = sprite; } } else if (File.Exists(Application.streamingAssetsPath + "/" + imagePath)) { using (FileStream stream = new FileStream(Application.streamingAssetsPath + "/" + imagePath, FileMode.Open)) { Texture2D texture = new Texture2D(512, 512); byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, (int)stream.Length); texture.LoadImage(bytes); Sprite sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), new Vector2(.5f, .5f), 100); skin.image = sprite; } } else if (File.Exists(Application.streamingAssetsPath + "/" + "Textures/砰砰博士.png")) { using (FileStream stream = new FileStream(Application.streamingAssetsPath + "/" + "Textures/砰砰博士.png", FileMode.Open)) { Texture2D texture = new Texture2D(512, 512); byte[] bytes = new byte[stream.Length]; stream.Read(bytes, 0, (int)stream.Length); texture.LoadImage(bytes); Sprite sprite = Sprite.Create(texture, new Rect(0, 0, 512, 512), new Vector2(.5f, .5f), 100); skin.image = sprite; } } int nameIndex = findColIndex(sheet, "Name"); skin.name = sheet.Cells[row, nameIndex].StringValue; int descIndex = findColIndex(sheet, "Desc"); skin.desc = sheet.Cells[row, descIndex].StringValue; return(card); }
public static int getLife(this CardDefine card) { return(card.getProp <int>(nameof(ServantCardDefine.life))); }
public static int getCost(this CardDefine card) { return(card.getProp <int>(nameof(ServantCardDefine.cost))); }
void saveCardToExcel(CardDefine card, Worksheet sheet) { int idIndex = findColIndex(sheet, "ID"); int classIndex = findColIndex(sheet, "Class"); int cardRow = sheet.Cells.Rows.Count;//如果表里没有这张卡,那么就新增 foreach (var pRow in sheet.Cells.Rows) { if (numberToInt(pRow.Value.GetCell(idIndex).Value) == card.id) { cardRow = pRow.Key;//如果有相同ID的卡,复写 sheet.Cells[cardRow, classIndex] = new Cell(card.GetType().Name); } else if (pRow.Value.GetCell(classIndex).StringValue == card.GetType().Name) { cardRow = pRow.Key;//如果有相同类型的卡,复写 sheet.Cells[cardRow, idIndex] = new Cell(card.id); } } sheet.Cells[cardRow, idIndex] = new Cell(card.id); int typeIndex = findColIndex(sheet, "Type"); if (card is ServantCardDefine) { sheet.Cells[cardRow, typeIndex] = new Cell("Servant"); } else if (card is MasterCardDefine) { sheet.Cells[cardRow, typeIndex] = new Cell("Master"); } else if (card is SkillCardDefine) { sheet.Cells[cardRow, typeIndex] = new Cell("Skill"); } else if (card is SpellCardDefine) { sheet.Cells[cardRow, typeIndex] = new Cell("Spell"); } else if (card is ItemCardDefine) { sheet.Cells[cardRow, typeIndex] = new Cell("Item"); } int costIndex = findColIndex(sheet, "Cost"); sheet.Cells[cardRow, costIndex] = new Cell(card.getProp <int>("cost")); int attackIndex = findColIndex(sheet, "Attack"); sheet.Cells[cardRow, attackIndex] = new Cell(card.getProp <int>("attack")); int lifeIndex = findColIndex(sheet, "Life"); sheet.Cells[cardRow, lifeIndex] = new Cell(card.getProp <int>("life")); int tagsIndex = findColIndex(sheet, "Tags"); if (card.getProp <string[]>("tags") is string[] tags) { sheet.Cells[cardRow, tagsIndex] = new Cell(string.Join(",", tags)); } else { sheet.Cells[cardRow, tagsIndex] = new Cell(null); } int keywordsIndex = findColIndex(sheet, "Keywords"); if (card.getProp <string[]>("keywords") is string[] keywords) { sheet.Cells[cardRow, keywordsIndex] = new Cell(string.Join(",", keywords)); } else { sheet.Cells[cardRow, keywordsIndex] = new Cell(null); } if (_manager != null) { var skin = _manager.getSkin(card.id); int imageIndex = findColIndex(sheet, "Image"); if (skin == null) { sheet.Cells[cardRow, imageIndex] = new Cell(sheet.Cells[cardRow, imageIndex].StringValue); } else { if (skin.image != null && !string.IsNullOrEmpty(skin.image.name)) { string path = AssetDatabase.GetAssetPath(skin.image); if (path.Contains("Resources/")) { path = path.removeHead("Resources/").removeRear("."); sheet.Cells[cardRow, imageIndex] = new Cell("res:" + path); } else { sheet.Cells[cardRow, imageIndex] = new Cell(skin.image.name + ".png"); } } else { sheet.Cells[cardRow, imageIndex] = new Cell(sheet.Cells[cardRow, imageIndex].StringValue); } } int nameIndex = findColIndex(sheet, "Name"); sheet.Cells[cardRow, nameIndex] = new Cell(skin == null ? (!string.IsNullOrEmpty(sheet.Cells[cardRow, nameIndex].StringValue) ? sheet.Cells[cardRow, nameIndex].StringValue : card.GetType().Name) : skin.name); int descIndex = findColIndex(sheet, "Desc"); sheet.Cells[cardRow, descIndex] = new Cell(skin == null ? sheet.Cells[cardRow, descIndex].StringValue : skin.desc); } }
public static CardDefine[] getMixCards(THHGame game, CardDefine a, CardDefine b) { var elements = getElements(a).Concat(getElements(b)).Distinct().ToArray(); return(getMixCards(game).Where(c => elements.isSubset(getElements(c)) && c.id != a.id && c.id != b.id).ToArray()); }