コード例 #1
0
 public void addInfluence(int userId, int value, UserSpaceObject influenceCreator)
 {
     if (this.Influence.Any(e => e.Key == userId))
     {
         this.Influence[userId] += value;
     }
     else
     {
         this.Influence.Add(userId, value);
         this.InfluencedBy.Add(influenceCreator);
     }
 }
コード例 #2
0
 public void FetchUser()
 {
     if (this.spaceObjectType == 0)
     {
         if (!SpacegameServer.Core.Core.Instance.ships.ContainsKey(this.spaceObjectId))
         {
             return;
         }
         this.Sender = SpacegameServer.Core.Core.Instance.ships[this.spaceObjectId];
         this.userId = this.Sender.GetUserId();
     }
     else
     {
         if (!SpacegameServer.Core.Core.Instance.colonies.ContainsKey(this.spaceObjectId))
         {
             return;
         }
         this.Sender = SpacegameServer.Core.Core.Instance.colonies[this.spaceObjectId];
         this.userId = this.Sender.GetUserId();
     }
 }
コード例 #3
0
        public static void applyInfluence(Field field, int influence, int userId, UserSpaceObject influenceCreator)
        {
            //number of rings aroung the field. 1 - 10?
            int rings = 1;

            rings = InfluenceManager.InfluenceToRingNo(influence);

            //find all neighbouring fields of the field
            //use the regions to accomplish this
            List <Field> neigbouringFields = new List <Field>();

            double factor = 1.0;

            for (int ring = rings; ring > 0; ring--)
            {
                //remove the influence that was needed to archieve this ring
                //var InfluenceOfThisRing = this.Influence - this.RingToMinInfluence(ring);
                var InfluenceOfThisRing = influence - InfluenceManager.RingToMinInfluence(ring);

                neigbouringFields.Clear();
                GeometryIndex.getNeighbourFields(field, ring, neigbouringFields, rings);

                //factor = 1.0d / Math.Pow(ring,2);
                //factor = 1.0d / (ring / 2.0d + ((ring - 1) * 4.0d));
                factor = 1.0 / ((ring * ring * ring) / 3.0);
                foreach (Field neighbour in neigbouringFields)
                {
                    neighbour.addInfluence(userId, (int)(InfluenceOfThisRing * factor), influenceCreator);
                }
                factor = factor * 1.3;
            }

            //the field where the colony is on
            factor = 100;
            field.addInfluence(userId, (int)(influence * factor), influenceCreator);
        }
コード例 #4
0
        private static bool TransferChecks(int userId, UserSpaceObject sender, UserSpaceObject receiver, Transfer transfer, Ship senderShip, Ship targetShip, Colony senderColony, Colony targetColony)
        {
            //check that sender is ownder by user
            if (sender.GetUserId() != userId) return false;

            var SenderUser = Core.Instance.users[sender.GetUserId()];
            var ReceiverUser = Core.Instance.users[receiver.GetUserId()];

            //check that one does not move cargo from a neutral (0) space station (hullId 201)
            if (sender is Ship)
            {
                var SendShip = (Ship)sender;
                if (SendShip.hullid == 201 && SendShip.userid == 0) return false;
            }
            if (receiver is Ship)
            {
                var RecShip = (Ship)receiver;
                if (RecShip.hullid == 201 && RecShip.userid == 0) return false;
            }


            //test if goods are sent or received:
            if (transfer.Goods.Count == 0) return false;

            var send = false;
            var receive = false;

            receive = (transfer.Goods.Any(e => e.Qty < 0));
            send = (transfer.Goods.Any(e => e.Qty > 0));

            if (!send && !receive) return false;


            //if trade is between users, and goods are received, check that they are at war           
            if (receive && sender.GetUserId() != receiver.GetUserId() && receiver.GetUserId() != 0)
            {
                Relation CurrentRelation = Core.Instance.userRelations.getRelation(SenderUser, ReceiverUser);
                if (SenderUser.allianceId == ReceiverUser.allianceId) CurrentRelation = Relation.AllianceMember;


                //check that both are enemies (or player 0  is involved)
                if (receive && CurrentRelation != Relation.War && CurrentRelation != Relation.AllianceMember)
                {
                    return false;
                }
            }

            //test that both are on the same field  (if it is not scrap or recycle=
            if (transfer.Target > 0)
            {
                Field SenderField = null;
                Tuple<byte, byte> SenderSystemXY = null;

                if (senderShip != null)
                {
                    SenderField = senderShip.field;
                    SenderSystemXY = senderShip.getSystemCoords();
                }

                if (senderColony != null)
                {
                    SenderField = senderColony.field;
                    SenderSystemXY = senderColony.systemXY();
                }

                Field TargetField = null;
                Tuple<byte, byte> TargetSystemXY = null;

                if (targetShip != null)
                {
                    TargetField = targetShip.field;
                    TargetSystemXY = targetShip.getSystemCoords();
                }

                if (targetColony != null)
                {
                    TargetField = targetColony.field;
                    TargetSystemXY = targetColony.systemXY();
                }

                if (SenderField != TargetField) return false;
                if (SenderSystemXY != null && TargetSystemXY == null) return false;
                if (SenderSystemXY == null && TargetSystemXY != null) return false;
                if (SenderSystemXY != null && (SenderSystemXY.Item1 != TargetSystemXY.Item1 || SenderSystemXY.Item2 != TargetSystemXY.Item2)) return false;
            }

            //tests that all goods are in store on both sides of the transfer
            List<SpaceObjectStock> SenderStock = null;
            List<SpaceObjectStock> TargetStock = null;
            if (senderShip != null) SenderStock = senderShip.goods.ToList<SpaceObjectStock>();
            if (targetShip != null) TargetStock = targetShip.goods.ToList<SpaceObjectStock>();
            if (senderColony != null) SenderStock = senderColony.goods.ToList<SpaceObjectStock>();
            if (targetColony != null) TargetStock = targetColony.goods.ToList<SpaceObjectStock>();

            int TransferCapacity = 0;
            foreach (var transferLine in transfer.Goods){
                var Good = Core.Instance.Goods[transferLine.Id];

                TransferCapacity += Good.Weight() * transferLine.Qty;

                if (transferLine.Qty > 0)
                {
                    //check that sender has it on store
                    if (!SenderStock.Any(e => e.goodsId == transferLine.Id && e.amount >= transferLine.Qty)) return false;
                }
                else
                {
                    //check that target has it on store
                    if (!TargetStock.Any(e => e.goodsId == transferLine.Id && e.amount >= -transferLine.Qty)) return false;
                }

            }

            //test that scrap or recycle does not demand something in return. transfer can be sent to user 0  -> that will always be a scrap or recycle command
            if (receiver.GetUserId() == 0 && ( receiver.Id == 0 || receiver.Id == -1) )
            {
                if (receive) return false;
            }
 
            //sender + receiver : sufficient cargoSpace
            if (TransferCapacity < 0)
            {
                int RemainigFreeSpace = sender.CalcStorage() - sender.AmountOnStock();
                //check SenderStock:
                if (RemainigFreeSpace < -TransferCapacity) return false;
            }
            else
            {
                if (receiver.GetUserId() != 0)
                {
                    int RemainigFreeSpace = receiver.CalcStorage() - receiver.AmountOnStock();
                    //check ReceiverStock:
                    if (RemainigFreeSpace < TransferCapacity) return false;
                }
            }



            return true;
        }