問題
這個問題已經出現很久了,在緩存了卡組的情況下,牌庫的讀取總是只能讀到自帶的卡牌在牌庫中的情況,所有衍生卡、后洗入的卡都無法讀取,由於靈魂殘片必須要借助牌庫才能完美寫好,所以今天把它修復了。
定位問題
首先在 silverfish_HB.cs 中添加輸出代碼,檢查牌庫的更新情況。
Helpfunctions.Instance.ErrorLog("——————tmpDeck——————");
foreach (var item in tmpDeck)
{
Helpfunctions.Instance.ErrorLog(item.Key + "\t\t" + item.Value);
}
Helpfunctions.Instance.ErrorLog("——————extraDeck——————");
foreach (var item in extraDeck)
{
Helpfunctions.Instance.ErrorLog(item.Key + "\t\t" + item.Value);
}
Helpfunctions.Instance.ErrorLog("——————turnDeck——————");
foreach (var item in turnDeck)
{
Helpfunctions.Instance.ErrorLog(item.Key + "\t\t" + item.Value);
}
結果發現 extraDeck 總是空的。
定位到 extraDeck 的更新處,以下摘抄和牌庫相關的部分:
// HREngine.Bots.Silverfish.getDecks
Dictionary<string, int> tmpDeck = new Dictionary<string, int>(startDeck);
//...
turnDeck.Clear();
List<HSCard> allcards = TritonHs.GetAllCards();
int allcardscount = allcards.Count;
for (int i = 0; i < allcardscount; i++)
{
HSCard entity = allcards[i];
if (entity.Id == null || entity.Id == "") continue;
//...
string entityId = entity.Id;
Triton.Game.Mapping.TAG_ZONE entZone = entity.GetZone();
if (i < 60)
{
if (entityId != "")
{
if (entZone == Triton.Game.Mapping.TAG_ZONE.DECK) continue;
if (tmpDeck.ContainsKey(entityId)) tmpDeck[entityId]--;
}
}
else if (i >= 60 && entity.ControllerId == owncontroler)
{
if (extraDeck.ContainsKey(i))
{
if (entityId != "" && entityId != extraDeck[i].id) extraDeck[i].setId(entityId);
if ((entZone == Triton.Game.Mapping.TAG_ZONE.DECK) != extraDeck[i].isindeck) extraDeck[i].setisindeck(entZone == Triton.Game.Mapping.TAG_ZONE.DECK);
}
else if (entZone == Triton.Game.Mapping.TAG_ZONE.DECK)
{
extraDeck.Add(i, new extraCard(entityId, true));
}
}
}
可以注意到,對於把 allcards 寫入 tmpDeck 和 extraDeck 時,分成了 2 部分,分別是 i < 60 和 i >= 60。
其中,i < 60 更新的為牌庫中的自帶卡牌,是在原來自帶卡牌(tmpDeck)的基礎上尋找到已經不在牌庫中的牌然后一一剔除,通過剛才的輸出知道,這部分是正常的。
i >= 60 部分根據名字來看,就是牌庫中額外的部分,但是這部分卻不起作用了。所以我猜測是 allcards 無法讀取衍生牌。
於是准備通過爐石兄弟的開發模式來查看一下 allcards 的情況。
開發模式代碼如下:
using Triton.Game;
using Triton.Game.Mapping;
using log4net;
using Logger = Triton.Common.LogUtilities.Logger;
public class RuntimeCode
{
private static readonly ILog Log = Logger.GetLoggerInstanceForType();
public void Execute()
{
using (TritonHs.AcquireFrame())
{
var allcards = TritonHs.GetAllCards();
foreach (var item in allcards)
Log.DebugFormat(item.Card.GetEntity().ToString());
}
}
}
在開局打出一張精魂獄卒的情況下,讀取到的 allcards 情況如下:
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=4 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=5 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=6 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=7 zone=DECK zonePos=0 cardId= player=1]
[entityName=精魂獄卒 id=8 zone=PLAY zonePos=1 cardId=SCH_700 player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=9 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=10 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=11 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=12 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=13 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=14 zone=DECK zonePos=0 cardId= player=1]
[entityName=魔法幻象 id=15 zone=DECK zonePos=0 cardId= player=1]
[entityName=精魂獄卒 id=16 zone=HAND zonePos=2 cardId=SCH_700 player=1]
[entityName=伊莉斯·逐星 id=17 zone=HAND zonePos=3 cardId=LOE_079 player=1]
[entityName=鑄魂寶石匠 id=18 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=19 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=20 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=21 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=22 zone=DECK zonePos=0 cardId= player=1]
[entityName=可靠的燈泡 id=23 zone=HAND zonePos=1 cardId=BOT_079 player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=24 zone=DECK zonePos=0 cardId= player=1]
[entityName=遠古暗影 id=25 zone=HAND zonePos=5 cardId=LOE_110 player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=26 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=27 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=28 zone=DECK zonePos=0 cardId= player=1]
[entityName=冰川裂片 id=29 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=30 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=31 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=32 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=33 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=34 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=35 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=36 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=37 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=38 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=39 zone=HAND zonePos=3 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=40 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=41 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=42 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=43 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=44 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=45 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=46 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=47 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=48 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=49 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=50 zone=HAND zonePos=2 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=51 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=52 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=53 zone=HAND zonePos=4 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=54 zone=HAND zonePos=1 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=55 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=56 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=57 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=58 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=59 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=60 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=61 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=62 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=63 zone=DECK zonePos=0 cardId= player=2]
[entityName=惡魔形態伊利丹 id=64 zone=PLAY zonePos=0 cardId=HERO_10a player=1]
[entityName=惡魔之爪 id=65 zone=PLAY zonePos=0 cardId=HERO_10bp player=1]
[entityName=瑪法里奧·怒風 id=66 zone=PLAY zonePos=0 cardId=HERO_06 player=2]
[entityName=變形 id=67 zone=PLAY zonePos=0 cardId=HERO_06bp player=2]
[entityName=幸運幣 id=68 zone=HAND zonePos=4 cardId=GAME_005 player=1]
簡單分析一下,在 id=4 到 id=33 之間為 player=1,id=34 到 id=63 之間為 player=2。顯然,都是 30 張牌,必然是雙方開局自帶的卡牌了。從 id=64 到 id=68 之間,則是兩個英雄與兩個英雄技能,還有一張最后的幸運幣。
看到這里有兩個疑惑:
- id=4 之前的內容呢
- 牌庫中的靈魂殘片呢
顯然,這個 allcards 並不是真正的 “allcards”。追蹤下主程序內 allcards 的來源。
//Triton.Game.TritonHs
public static List<HSCard> GetAllCards() =>
((List<HSCard>)(perFrameCachedValue_1 ?? (perFrameCachedValue_1 = new PerFrameCachedValue<List<HSCard>>(Class246.abc__77_0 ?? (Class246.abc__77_0 = new Func<List<HSCard>>(Class246.abc.method_5))))));
//Triton.Game.TritonHs.Class246
internal List<HSCard> method_5()
{
List<HSCard> list = new List<HSCard>();
Triton.Game.Mapping.Entity entity = null;
int id = 4;
while (true)
{
entity = TritonHs.GameState.GetEntity(id);
id++;
if (entity != null)
{
list.Add(new HSCard(entity));
}
if (entity == null)
{
return list;
}
}
}
可以看到,它是從 4 開始的,然后一旦遇到 null 就停下。
於是我仿照這個寫一段輸出從 0 開始的,遇到 null 也不停下,一直到尋找到 id=99 的 entity 的開發模式代碼:
using Triton.Game;
using Triton.Game.Mapping;
using log4net;
using Logger = Triton.Common.LogUtilities.Logger;
public class RuntimeCode
{
private static readonly ILog Log = Logger.GetLoggerInstanceForType();
public void Execute()
{
using(TritonHs.AcquireFrame())
{
for (int i = 0; i < 100; i++)
if (GameState.Get().GetEntity(i)!=null)
Log.DebugFormat(GameState.Get().GetEntity(i).ToString());
}
}
}
這次,讀取到的結果如下:
GameEntity
沼澤
旅店老板
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=4 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=5 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=6 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=7 zone=DECK zonePos=0 cardId= player=1]
[entityName=精魂獄卒 id=8 zone=PLAY zonePos=1 cardId=SCH_700 player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=9 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=10 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=11 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=12 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=13 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=14 zone=DECK zonePos=0 cardId= player=1]
[entityName=魔法幻象 id=15 zone=DECK zonePos=0 cardId= player=1]
[entityName=精魂獄卒 id=16 zone=HAND zonePos=2 cardId=SCH_700 player=1]
[entityName=伊莉斯·逐星 id=17 zone=HAND zonePos=3 cardId=LOE_079 player=1]
[entityName=鑄魂寶石匠 id=18 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=19 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=20 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=21 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=22 zone=DECK zonePos=0 cardId= player=1]
[entityName=可靠的燈泡 id=23 zone=HAND zonePos=1 cardId=BOT_079 player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=24 zone=DECK zonePos=0 cardId= player=1]
[entityName=遠古暗影 id=25 zone=HAND zonePos=5 cardId=LOE_110 player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=26 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=27 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=28 zone=DECK zonePos=0 cardId= player=1]
[entityName=冰川裂片 id=29 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=30 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=31 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=32 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=33 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=34 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=35 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=36 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=37 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=38 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=39 zone=HAND zonePos=3 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=40 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=41 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=42 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=43 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=44 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=45 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=46 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=47 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=48 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=49 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=50 zone=HAND zonePos=2 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=51 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=52 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=53 zone=HAND zonePos=4 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=54 zone=HAND zonePos=1 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=55 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=56 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=57 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=58 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=59 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=60 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=61 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=62 zone=DECK zonePos=0 cardId= player=2]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=63 zone=DECK zonePos=0 cardId= player=2]
[entityName=惡魔形態伊利丹 id=64 zone=PLAY zonePos=0 cardId=HERO_10a player=1]
[entityName=惡魔之爪 id=65 zone=PLAY zonePos=0 cardId=HERO_10bp player=1]
[entityName=瑪法里奧·怒風 id=66 zone=PLAY zonePos=0 cardId=HERO_06 player=2]
[entityName=變形 id=67 zone=PLAY zonePos=0 cardId=HERO_06bp player=2]
[entityName=幸運幣 id=68 zone=HAND zonePos=4 cardId=GAME_005 player=1]
[entityName=靈魂殘片 id=78 zone=DECK zonePos=0 cardId= player=1]
[entityName=靈魂殘片 id=79 zone=DECK zonePos=0 cardId= player=1]
和之前輸出的 allcards 相比,前面多了 3 項,分別是 GameEntity 和兩個玩家的名字。實際上是游戲實體和玩家實體(通過后續測試,GameEntity 的 id 為 1,兩個玩家分別為 2 和 3)。具體見灰機wiki的描述:實體
重要的部分是后面,在最后終於輸出了兩個靈魂殘片。但是發現這里的 id 已經是 78 和 79 了,並不是緊接着幸運幣的 68,所以才會導致 allcards 讀取不到后續的衍生牌了。
解決思路
在調試的過程中,發現了一個方法: GameState.Get().GetFriendlySidePlayer().GetDeckZone().GetCards() 看起來是和牌庫相關的。這個方法會返回一個 List<Card> 類型。寫了一段開發模式代碼來看一下會返回什么結果。
using Triton.Game;
using Triton.Game.Mapping;
using log4net;
using Logger = Triton.Common.LogUtilities.Logger;
public class RuntimeCode
{
private static readonly ILog Log = Logger.GetLoggerInstanceForType();
public void Execute()
{
using (TritonHs.AcquireFrame())
{
var cards = GameState.Get().GetFriendlySidePlayer().GetDeckZone().GetCards();
foreach (var item in cards)
{
Log.DebugFormat(item.GetEntity().ToString());
}
}
}
}
由於剛剛那局掉了線,所以重新開了一局。輸出結果如下:
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=4 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=5 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=6 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=7 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=8 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=9 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=10 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=11 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=12 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=13 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=14 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=15 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=19 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=20 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=21 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=24 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=25 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=26 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=27 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=28 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=29 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=32 zone=DECK zonePos=0 cardId= player=1]
[entityName=UNKNOWN ENTITY [cardType=INVALID] id=33 zone=DECK zonePos=0 cardId= player=1]
[entityName=厄運鼴鼠 id=31 zone=DECK zonePos=0 cardId= player=1]
[entityName=冰川裂片 id=18 zone=DECK zonePos=0 cardId= player=1]
[entityName=靈魂殘片 id=80 zone=DECK zonePos=0 cardId= player=1]
[entityName=靈魂殘片 id=81 zone=DECK zonePos=0 cardId= player=1]
其中,厄運鼴鼠和冰川裂片是我在開局留牌時候換掉的卡牌。可以看到,這個方法看起來能讀取出整個牌庫,也能讀取到衍生牌,但是只能讀到自己看到過的,並不能讀取到自己帶的但是還沒抽到過的牌。
所以到了現在,所有的牌都能掌握了。缺的就是把他們放在一起構成一個完整的牌庫。所以思路就是在原來能正確讀取自帶卡牌在牌庫中情況的基礎上,添加上衍生牌的識別。但是,由於 GameState.Get().GetFriendlySidePlayer().GetDeckZone().GetCards() 能夠讀取到的並且能夠識別的不僅有衍生卡,還有見過的自帶的卡牌,所以為了只取到衍生卡,我想到了一開始調試 alcards 部分時的代碼,即雙方玩家的自帶卡牌所占的 id 都是在 64 之前,所以在這個方法中,就可以以 64 為分界線來挑選出衍生卡了。
具體解決
解決很簡單,只要在把 tmpDeck 導入 turnDeck 的代碼后添加這樣一段代碼,挑選出我方牌庫中 id 大於 64 的可識別的部分(即衍生卡)加入到 turnDeck 中,用於后續使用。
foreach (var item in GameState.Get().GetFriendlySidePlayer().GetDeckZone().GetCards())
{
var entity = item.GetEntity();
int entityId = entity.GetEntityId();
if (entityId < 64) continue;
var entityDef = entity.GetEntityDef();
if (entityDef.GetCardId() == null) continue;
string idEnum_str = entityDef.GetCardId();
CardDB.cardIDEnum idEnum = CardDB.Instance.cardIdstringToEnum(idEnum_str);
if (idEnum == CardDB.cardIDEnum.None) continue;
if (turnDeck.ContainsKey(idEnum)) turnDeck[idEnum]++;
else turnDeck.Add(idEnum, 1);
}
最后就是刪除 extraDeck、extraCard 等已經不起作用的相關內容。此處不再贅述。
附帶結果:
