Exemplo n.º 1
0
        public void UpdateStatus(string extrainfo = "")
        {
            string x = extrainfo;

            x += "Currently Mining: ";
            Block block = World.GetBlock(CurPos);

            string[] tmpstrings;
            string   blockname;

            if (block != null)
            {
                tmpstrings = block.GetType().ToString().Split('.');
                blockname  = tmpstrings[tmpstrings.Length - 1];
                tmpstrings = blockname.SplitOnCapitals();
                blockname  = "";
                foreach (string s in tmpstrings)
                {
                    if (s != "Block")
                    {
                        blockname += s + " ";
                    }
                }
                x += blockname;
            }
            x += " at " + CurPos.ToString();
            x += " Progress: " + (hitsperformed * 100 / hitsneeded) + "%";



            status.SetStatusMessage(this.Enabled, Localizer.DoStr(x));
        }
Exemplo n.º 2
0
        public void Move()
        {
            var curBlock = Util.InWhichBlock(CurPos, GetAtFloor());

            if (curBlock == Block.SecondStair || curBlock == Block.FirstStair)
            {
                SingleStep(curBlock);
            }
            else
            {
                MultiStep(curBlock);
            }


            // calculate from other's position
            var desBlock  = Util.InWhichBlock(CurPos, GetAtFloor());
            var desVector = CurPos.NewSubtract(GetAtFloor().AddX, GetAtFloor().AddY);

            // if move to next position
            if ((curBlock == Block.FirstInterval || curBlock == Block.ThirdCorner) && desBlock == Block.SecondStair)
            {
                var atFloor   = GetAtFloor();
                var nextFloor = space.Floors[--AtFloor];
                CurPos.Subtract(atFloor.AddX, atFloor.AddY).Add(nextFloor.AddX, nextFloor.AddY);
                atFloor.AddToDel(this);
            }
            // if in exit block, get to target
            if (AtFloor == 0 && desBlock == Block.ExitBlock)
            {
                var atFloor = GetAtFloor();
                var vector  = CurPos.NewSubtract(atFloor.AddX, atFloor.AddY);
                if (vector.X > Util.kCornerWidth * 2 + Util.kIntervalLength + Util.kEnterWidth)
                {
                    GetTarget = true;
                    GetAtFloor().AddToDel(this);
                    // this ped should be del
                    Util.kPedSum--;
                }
            }

            if (Util.kReport && !Can)
            {
                var floor = GetAtFloor();
                ReportLine = AtFloor + "," + "(" + (CurPos.X - floor.AddX) + "," + (CurPos.Y - floor.AddY) + "):" +
                             curBlock.ToString() + " " + desBlock.ToString();
            }
        }
Exemplo n.º 3
0
        // single step length's move(in stairs)
        private void SingleStep(Block curBlock)
        {
            double resSff    = Double.MaxValue;
            Vector resTarget = null;
            // around find min, 20;
            var rotate = 2 * Math.PI / Util.kCircleSp;

            var dir = new Vector(1, 0).Rotate(rotate * Util.GetRandom());

            for (int i = 0; i < Util.kCircleSp; i++)
            {
                var target = CurPos.NewAdd(dir.NewMultiply(Util.kStepLen));


                // calculate target's
                double sff = Util.GetSff(this, target);

                var atFloor = space.Floors[AtFloor];
                // all sff from ped
                foreach (var ped in atFloor.Peds)
                {
                    if (ped.Equals(this))
                    {
                        continue;
                    }

                    if (curBlock == Block.ThirdCorner || curBlock == Block.FirstInterval)
                    {
                        // should not calculate second stair
                        var pedBlock = Util.InWhichBlock(ped.CurPos, ped.GetAtFloor());
                        if (pedBlock == Block.SecondStair)
                        {
                            continue;
                        }
                    }
                    sff += Util.CalculateFromPed(target, ped);
                }

                if (curBlock == Block.ThirdCorner || curBlock == Block.FirstInterval)
                {
                    if (AtFloor > 0)
                    {
                        var nextFloor = space.Floors[AtFloor - 1];
                        sff += Util.FromNextPeds(this, nextFloor);
                    }
                }

                // calculate all wall's
                // Green wall not(sign)
                foreach (var wall in atFloor.Walls)
                {
                    if (wall.Green)
                    {
                        continue;
                    }
                    if (wall.InWall(target, Util.kR / 2.0))
                    {
                        sff += Util.CalculateFromWall(target, wall);
                    }
                }



                // else set for dir
                if (sff < resSff)
                {
                    resSff    = sff;
                    resTarget = target;
                }
                dir.Rotate(rotate);
            }

            // bool can move or can't move
            if (resTarget != null)
            {
                if (Util.CanMove(this, resTarget, space))
                {
                    Can    = true;
                    CurPos = resTarget;
                }
                else
                {
                    Can = false;
                }
            }
            else
            {
                Can = false;
            }
            // if can't move
            if (!Can && GetAtFloor().Peds.Count < 5)
            {
                // write to reporter this block and last block
                // move, don't calculate for this
                if (resTarget != null && curBlock == Block.SecondStair)
                {
                    CurPos = resTarget;
                }
            }
        }
Exemplo n.º 4
0
        // multi step length's move
        private void MultiStep(Block curBlock)
        {
            // should be split to 3
            double resSff    = Double.MaxValue;
            Vector resTarget = null;
            var    rotate    = 2 * Math.PI / Util.kCircleSp;
            var    dir       = new Vector(1, 0).Rotate(rotate * Util.GetRandom());

            for (int i = 0; i < Util.kCircleSp; i++)
            {
                for (int j = 0; j < Util.kStepSp; j++)
                {
                    var    target = CurPos.NewAdd(dir.NewMultiply((j + 1) * Util.kStepLen / Util.kStepSp));
                    double sff    = Util.GetSff(this, target);

                    var atFloor = GetAtFloor();
                    // all sff from ped
                    foreach (var ped in atFloor.Peds)
                    {
                        if (ped.Equals(this))
                        {
                            continue;
                        }
                        // if in coner or interval, don't calculate from the last floor's peds
                        if (curBlock == Block.ThirdCorner || curBlock == Block.FirstInterval)
                        {
                            // should not calculate second stair
                            var pedBlock = Util.InWhichBlock(ped.CurPos, ped.GetAtFloor());
                            if (pedBlock == Block.SecondStair)
                            {
                                continue;
                            }
                        }
                        sff += Util.CalculateFromPed(target, ped);
                    }
                    // if in corner or interval, should calculate next floor's peds
                    if (curBlock == Block.ThirdCorner || curBlock == Block.FirstInterval)
                    {
                        if (AtFloor > 0)
                        {
                            var nextFloor = space.Floors[AtFloor - 1];
                            sff += Util.FromNextPeds(this, nextFloor);
                        }
                    }

                    // calculate all wall's
                    // Green wall not(sign)
                    foreach (var wall in atFloor.Walls)
                    {
                        if (wall.Green)
                        {
                            continue;
                        }
                        if (wall.InWall(target, Util.kR / 2.0))
                        {
                            sff += Util.CalculateFromWall(target, wall);
                        }
                    }

                    // update result target
                    if (sff < resSff)
                    {
                        resSff    = sff;
                        resTarget = target;
                    }
                }

                // dir rotate in i loop, not in j
                dir.Rotate(rotate);
            }

            // the same to move
            if (resTarget != null)
            {
                if (Util.CanMove(this, resTarget, space))
                {
                    CurPos = resTarget;
                    Can    = true;
                }
                else
                {
                    Can = false;
                }
            }
            else
            {
                Can = false;
            }

            if (!Can && GetAtFloor().Peds.Count < 5)
            {
                // write to reporter this block and last block
                // move, don't calculate for this
                if (resTarget != null && curBlock == Block.SecondStair)
                {
                    CurPos = resTarget;
                }
            }
        }