Beispiel #1
0
        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);
        }
Beispiel #2
0
        // 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);
        }