Beispiel #1
0
    protected virtual void Update()
    {
        List <SurfaceDeposit> surface_deposits = SurfaceDeposits.OrderBy(surface_deposit => surface_deposit.Extent).Reverse().ToList();

        while (surface_deposits.Count > 0)
        {
            SurfaceDeposit surface_deposit = surface_deposits.TakeAt(0);

            foreach (SurfaceDeposit other_surface_deposit in new List <SurfaceDeposit>(SurfaceDeposits))
            {
                if (other_surface_deposit == surface_deposit)
                {
                    continue;
                }

                float distance = surface_deposit.transform.position
                                 .Distance(other_surface_deposit.transform.position);

                if (distance <= surface_deposit.Extent)
                {
                    surface_deposit.AddTo(other_surface_deposit.Composition.Normalized() * other_surface_deposit.Volume);

                    surface_deposits.Remove(other_surface_deposit);
                    other_surface_deposit.transform.SetParent(null);
                    GameObject.Destroy(other_surface_deposit.gameObject);
                }
            }
        }
    }
    new public static SurfaceDeposit Create()
    {
        SurfaceDeposit surface_deposit = GameObject.Instantiate(Scene.Main.Prefabs.SurfaceDeposit);

        surface_deposit.Volume    = 0;
        surface_deposit.MaxVolume = 0;

        return(surface_deposit);
    }
Beispiel #3
0
    public void Litter(Vector3 position, Pile pile)
    {
        if (pile.Volume == 0)
        {
            return;
        }

        SurfaceDeposit nearest_deposit = SurfaceDeposits.ToList()
                                         .Find(deposit => deposit.transform.position.Distance(position) <= deposit.Extent);

        if (nearest_deposit == null)
        {
            nearest_deposit = SurfaceDeposit.Create();
            nearest_deposit.transform.SetParent(Surface.transform);
            nearest_deposit.transform.position = position;
        }


        nearest_deposit.AddTo(pile);
    }
Beispiel #4
0
    void Update()
    {
        input_line.enabled        = false;
        input_circle.Line.enabled = false;

        output_line.enabled        = false;
        output_circle.Line.enabled = false;

        waste_line.enabled        = false;
        waste_circle.Line.enabled = false;

        if (!Unit.IsSelected)
        {
            return;
        }

        Vector3       normal_displacment     = new Vector3(0, Height, 0);
        OperationTile operation_tile_touched = InputUtility.GetElementTouched <OperationTile>();


        //Load site visualization
        HasLoadSite has_load_site = null;

        if (OperationTileNode.Selected != null &&
            OperationTileNode.Selected.OperationTile.Operation is HasLoadSite)
        {
            has_load_site = OperationTileNode.Selected.OperationTile.Operation as HasLoadSite;
        }

        else if (operation_tile_touched != null &&
                 operation_tile_touched.Operation is HasLoadSite &&
                 operation_tile_touched.Operation is Task &&
                 (operation_tile_touched.Operation as Task).Target != null)
        {
            has_load_site = operation_tile_touched.Operation as HasLoadSite;
        }

        else if (Unit.HasComponent <HasLoadSite>())
        {
            has_load_site = Unit.GetComponent <HasLoadSite>();
        }

        if (has_load_site != null && has_load_site.HasLoadSite)
        {
            Vector3 start_position = has_load_site.LoadSite + normal_displacment;
            Vector3 end_position   = Unit.Physical.Position + normal_displacment;
            Vector3 displacement   = end_position - start_position;

            if (has_load_site.LoadSite.Distance(Unit.Physical.Position) >= has_load_site.LoadSiteRadius)
            {
                input_line.enabled = true;

                if (displacement.magnitude > (has_load_site.LoadSiteRadius + Unit.Physical.Size * Mathf.Sqrt(2)))
                {
                    input_line.SetPosition(0, start_position + displacement.normalized *
                                           has_load_site.LoadSiteRadius);
                    input_line.SetPosition(1, end_position - displacement.normalized * Unit.Physical.Size * Mathf.Sqrt(2));
                }
                else
                {
                    input_line.SetPosition(0, start_position + displacement.normalized * has_load_site.LoadSiteRadius);
                    input_line.SetPosition(1, input_line.GetPosition(0) + displacement.normalized * 0.1f);
                }
            }

            input_circle.Line.enabled       = true;
            input_circle.transform.position = start_position;
            input_circle.Radius             = has_load_site.LoadSiteRadius;
        }


        //Unload site visualization
        HasUnloadSite has_unload_site = null;

        if (OperationTileNode.Selected != null &&
            OperationTileNode.Selected.OperationTile.Operation is HasUnloadSite)
        {
            has_unload_site = OperationTileNode.Selected.OperationTile.Operation as HasUnloadSite;
        }

        else if (operation_tile_touched != null &&
                 operation_tile_touched.Operation is HasUnloadSite &&
                 operation_tile_touched.Operation is Task &&
                 (operation_tile_touched.Operation as Task).Target != null)
        {
            has_unload_site = operation_tile_touched.Operation as HasUnloadSite;
        }

        else if (Unit.HasComponent <HasUnloadSite>())
        {
            has_unload_site = Unit.GetComponent <HasUnloadSite>();
        }

        if (has_unload_site != null && has_unload_site.HasUnloadSite)
        {
            SurfaceDeposit deposit = Scene.Main.World.Asteroid.Surface
                                     .GetNearestOverlappingDeposit(has_unload_site.UnloadSite) as SurfaceDeposit;

            Vector3 start_position = Unit.Physical.Position + normal_displacment;
            Vector3 end_position   = has_unload_site.UnloadSite + normal_displacment;
            Vector3 displacement   = end_position - start_position;

            output_line.enabled = true;
            output_line.SetPosition(0, start_position + displacement.normalized * Mathf.Sqrt(2) * Unit.Physical.Size);
            output_line.SetPosition(1, end_position);

            if (deposit != null)
            {
                if (deposit.transform.position.Distance(Unit.Physical.Position) >= deposit.Extent)
                {
                    end_position = deposit.transform.position + normal_displacment;
                    output_line.SetPosition(1, end_position - displacement.normalized * (deposit.Extent + 1));

                    if ((output_line.GetPosition(1) - output_line.GetPosition(0)).Dot(displacement.normalized) < 2)
                    {
                        output_line.SetPosition(0, output_line.GetPosition(1) - displacement.normalized * 2);
                    }
                }
                else
                {
                    output_line.enabled = false;
                }

                output_circle.Line.enabled       = true;
                output_circle.transform.position = deposit.transform.position + normal_displacment;
                output_circle.Radius             = deposit.Extent;
            }
        }


        SelectWasteSiteOperation select_waste_site_operation = null;
        Waster waster = null;

        if (OperationTileNode.Selected != null &&
            OperationTileNode.Selected.OperationTile.Operation is SelectWasteSiteOperation)
        {
            select_waste_site_operation = OperationTileNode.Selected.OperationTile
                                          .Operation as SelectWasteSiteOperation;
        }

        else if (operation_tile_touched != null &&
                 operation_tile_touched.Operation is SelectWasteSiteOperation &&
                 (operation_tile_touched.Operation as SelectWasteSiteOperation).Input.IsConnected(Unit))
        {
            select_waste_site_operation = (operation_tile_touched.Operation as SelectWasteSiteOperation);
        }

        else if (Unit.HasComponent <Waster>())
        {
            waster = Unit.GetComponent <Waster>();

            if (waster.WasteNot)
            {
                waster = null;
            }
        }

        if (waster != null || select_waste_site_operation != null)
        {
            Vector3 waste_site;
            if (waster != null)
            {
                waste_site = waster.WasteSite;
            }
            else if (select_waste_site_operation.Input.IsConnected(Unit))
            {
                waste_site = select_waste_site_operation.Input.Read <Vector3>(Unit);
            }
            else
            {
                waste_site = Scene.Main.World.Asteroid.GetWorldPositionPointedAt();
            }

            SurfaceDeposit deposit = Scene.Main.World.Asteroid.Surface
                                     .GetNearestOverlappingDeposit(waste_site) as SurfaceDeposit;

            Vector3 start_position = Unit.Physical.Position + normal_displacment;
            Vector3 end_position   = waste_site + normal_displacment;
            Vector3 displacement   = end_position - start_position;

            waste_line.enabled = true;
            waste_line.SetPosition(0, start_position + displacement.normalized * Mathf.Sqrt(2) * Unit.Physical.Size);
            waste_line.SetPosition(1, end_position);

            if (deposit != null)
            {
                if (deposit.transform.position.Distance(Unit.Physical.Position) >= deposit.Extent)
                {
                    end_position = deposit.transform.position + normal_displacment;
                    waste_line.SetPosition(1, end_position - displacement.normalized * (deposit.Extent + 1));

                    if ((waste_line.GetPosition(1) - waste_line.GetPosition(0)).Dot(displacement.normalized) < 2)
                    {
                        waste_line.SetPosition(0, waste_line.GetPosition(1) - displacement.normalized * 2);
                    }
                }
                else
                {
                    waste_line.enabled = false;
                }

                waste_circle.Line.enabled       = true;
                waste_circle.transform.position = deposit.transform.position + normal_displacment;
                waste_circle.Radius             = deposit.Extent;
            }
        }
    }