public ArmorSet(Charm charm, ArmorPiece Helm, ArmorPiece Chest, ArmorPiece Gloves, ArmorPiece Waist, ArmorPiece Legs, List <Skill> reqs, Slots weaponSlots) { Skills = new Dictionary <int, Skill>(); GemSlots = new Slots(); Charm = charm; Pieces = new List <ArmorPiece>(); Pieces.Add(Helm); Pieces.Add(Chest); Pieces.Add(Gloves); Pieces.Add(Waist); Pieces.Add(Legs); Armor = new Armor().Add(Helm.armor).Add(Chest.armor).Add(Gloves.armor).Add(Waist.armor).Add(Legs.armor); // Fills the map of skills on the whole armor set int charmId1 = Charm.skill1.id; Skill charmSkill1 = Skills.ContainsKey(charmId1) ? Skills[charmId1] : new Skill(Charm.skill1.skillId, 0); charmSkill1.rank += charm.skill1.rank; Skills[charmId1] = charmSkill1; if (Charm.skill2 != null) { int charmId2 = Charm.skill2.id; Skill charmSkill2 = Skills.ContainsKey(charmId2) ? Skills[charmId2] : new Skill(Charm.skill2.skillId, 0); charmSkill2.rank += charm.skill2.rank; Skills[charmId2] = charmSkill2; } foreach (ArmorPiece piece in Pieces) { if (piece.skill1 != null) { int id = piece.skill1.id; Skill s = Skills.ContainsKey(id) ? Skills[id] : new Skill(piece.skill1.skillId, 0); s.rank += piece.skill1.rank; Skills[id] = s; } if (piece.skill2 != null) { int id = piece.skill2.id; Skill s = Skills.ContainsKey(id) ? Skills[id] : new Skill(piece.skill2.skillId, 0); s.rank += piece.skill2.rank; Skills[id] = s; } // Sum up all decoration slots GemSlots += piece.slots; } ComputeBonus(reqs, weaponSlots); }
// Stores all charms and pieces in a memory region the dll can read. // Allocates a region of memory where the dll can write down the results. private unsafe void buildDataForDll() { // Put the pieces in memory using a format suitable for c++ (using BasicPiece) BasicPiece[] _all = new BasicPiece[allPieces[0].Length + allPieces[1].Length + allPieces[2].Length + allPieces[3].Length + allPieces[4].Length]; var handle = GCHandle.Alloc(_all, GCHandleType.Pinned); // Won't be released since the dll needs it until the whole thing shuts down. pPieces = handle.AddrOfPinnedObject(); int n = 0; for (int i = 0; i < allPieces.Length; ++i) { for (int j = 0; j < allPieces[i].Length; ++j) { ArmorPiece piece = allPieces[i][j]; BasicPiece p; p.s1 = (piece.skill1 == null) ? 0 : piece.skill1.skillId.id; p.r1 = (piece.skill1 == null) ? 0 : piece.skill1.rank; p.s2 = (piece.skill2 == null) ? 0 : piece.skill2.skillId.id; p.r2 = (piece.skill2 == null) ? 0 : piece.skill2.rank; p.gem = piece.slots.AsInt(); _all[n++] = p; } } // Put the charms in memory using a format suitable for c++ (using BasicCharm) BasicCharm[] _allCharms = new BasicCharm[allCharms.Length]; var handleCharm = GCHandle.Alloc(_allCharms, GCHandleType.Pinned); pCharms = handleCharm.AddrOfPinnedObject(); for (int i = 0; i < allCharms.Length; ++i) { BasicCharm p; p.s1 = (byte)allCharms[i].skill1.skillId.id; p.r1 = (byte)allCharms[i].skill1.rank; p.s2 = (allCharms[i].skill2 == null) ? (byte)0 : (byte)allCharms[i].skill2.skillId.id; p.r2 = (allCharms[i].skill2 == null) ? (byte)0 : (byte)allCharms[i].skill2.rank; _allCharms[i] = p; } // Allocates an array for storing results Results = new byte[6 * MonsterGear.MAX_RESULTS]; var resHandle = GCHandle.Alloc(Results, GCHandleType.Pinned); pResults = resHandle.AddrOfPinnedObject(); // Prepare the parameters for calling TransferData MonsterloopData data = new MonsterloopData(); data.maxResults = MonsterGear.MAX_RESULTS; data.nCharms = allCharms.Length; data.nHelms = allPieces[0].Length; data.nChests = allPieces[1].Length; data.nGloves = allPieces[2].Length; data.nWaists = allPieces[3].Length; data.nLegs = allPieces[4].Length; data.charms = (BasicCharm *)pCharms; data.pieces = (BasicPiece *)pPieces; // Give everything to the dll TransferData(data, (byte *)pResults); }