static void Prefix(TopLayer __instance, RolloverSimpleTooltip source)
 {
     if (source != null && source.name == "Remove Character" && source.title != "DES_TOOLTIP_REMOVE_CHARACTER")
     {
         source.title       = "DES_TOOLTIP_REMOVE_CHARACTER";
         source.description = "DES_TOOLTIP_REMOVE_CHRACTER_DES";
     }
 }
예제 #2
0
 /// <summary> Find a gridsquare by its xy coordinates, using only the top layer of the board. </summary>
 public Gridsquare this[int x, int y]
 {
     get
     {
         return(TopLayer.Find(g => g.Coords.X == x && g.Coords.Y == y));
     }
     set
     {
         var match = TopLayer.FindIndex(g => g.Coords.X == x && g.Coords.Y == y);
         TopLayer[match] = value;
     }
 }
예제 #3
0
 public void Render(RenderInfo renderInfo, Camera camera, int goLayer)
 {
     if (hasTop)
     {
         TopLayer.Render(renderInfo, camera, goLayer);
     }
     if (hasMiddle && MiddleLayers != null)
     {
         foreach (var layer in MiddleLayers)
         {
             layer.Render(renderInfo, camera, goLayer);
         }
     }
     if (hasBottom)
     {
         BottomLayer.Render(renderInfo, camera, goLayer);
     }
 }
              static void HookMiddleToTop_ThenBottomToMiddle_ThenCallBottom(BottomLayer bottom, MiddleLayer middle, TopLayer top)
             
        {
             middle.Event += top.TopLayerHandler;

             middle.HookUpEvent(bottom);
                     System.Console.Write("HookMiddleToTop_ThenBottomToMiddle_ThenCallBottom:");

                     bottom.callEvent();

                 
        }
              static void HookBottomToMiddle_ThenMiddleToTop_ThenCallBottom(BottomLayer bottom, MiddleLayer middle, TopLayer top)
             
        {
                     middle.HookUpEvent(bottom);

                 middle.Event += top.TopLayerHandler;

            try { bottom.callEvent(); }
                 catch(System.NullReferenceException)
            {
                System.Console.Write("HookBottomToMiddle_ThenMiddleToTop_ThenCallBottom: Event was null\n");
            }

                 
        }
예제 #6
0
        public void Recalculate(Vector3 center, Quaternion rot, Vector3 size)
        {
            Random.InitState(seed);
            middleLayerCounter = 0;

            lastCenter = center;
            lastRot    = rot;
            lastSize   = size;

            Vector3 pos = center;

            if (hasTop)
            {
                pos.y = center.y + size.y * 0.5f;
                TopLayerSetting.Reset();
                TopLayer.Recalculate(pos, rot, new Vector3(size.x, topHeight, size.z), TopLayerSetting);
            }
            if (hasMiddle)
            {
                float height = size.y - (hasTop ? topHeight : 0) - (hasBottom ? bottomHeight : 0);

                if (middleVerticalScale == ScaleType.Stretch)
                {
                    pos.y = center.y;
                    if (hasTop)
                    {
                        pos.y = center.y + size.y * 0.5f - topHeight - height / 2;
                    }
                    else if (hasBottom)
                    {
                        pos.y = center.y - size.y * 0.5f + bottomHeight + height / 2;
                    }

                    if (MiddleLayers == null)
                    {
                        MiddleLayers = new Layer[1];
                    }
                    MiddleLayers[0] = new Layer();
                    LayerSettings midSetting = Get(MiddeLayerSetting, ref middleLayerCounter, middleSettingsGetter);
                    if (midSetting != null)
                    {
                        height = Mathf.Max(height, 0.01f);
                        midSetting.Reset();
                        MiddleLayers[0].Recalculate(pos, rot, new Vector3(size.x, height, size.z), midSetting);
                    }
                }
                else
                {
                    pos.y  = center.y - size.y * 0.5f;
                    pos.y += hasBottom ? bottomHeight : 0;

                    List <LayerSettings> mids       = new List <LayerSettings>();
                    LayerSettings        midSetting = Get(MiddeLayerSetting, ref middleLayerCounter, middleSettingsGetter);
                    float heightLeft = height;
                    if (heightLeft > midSetting.CornerSize.y)
                    {
                        while (heightLeft > midSetting.CornerSize.y)
                        {
                            mids.Add(midSetting);
                            heightLeft -= midSetting.CornerSize.y;
                            midSetting  = Get(MiddeLayerSetting, ref middleLayerCounter, middleSettingsGetter);
                        }
                    }
                    else
                    {
                        mids.Add(midSetting);
                    }

                    if (MiddleLayers == null || MiddleLayers.Length != mids.Count)
                    {
                        MiddleLayers = new Layer[mids.Count];
                    }

                    float   remaining = heightLeft / mids.Count;
                    Vector3 midSize   = size;
                    for (int i = 0; i < mids.Count; ++i)
                    {
                        MiddleLayers[i] = new Layer();
                        mids[i].Reset();
                        midSize.y = (mids.Count == 1) ? height : mids[i].CornerSize.y + remaining;
                        pos.y    += midSize.y * 0.5f;
                        MiddleLayers[i].Recalculate(pos, rot, midSize, mids[i]);
                        pos.y += midSize.y * 0.5f;
                    }
                }
            }
            if (hasBottom)
            {
                pos.y = center.y - size.y * 0.5f;
                BottomLayerSetting.Reset();
                BottomLayer.Recalculate(pos, rot, new Vector3(size.x, bottomHeight, size.z), BottomLayerSetting);
            }
        }
예제 #7
0
        // Calculate based on top charge return running charge
        private ChargeDensity EvaluateGivenCharge(ChargeDensity topCharge, CancellationToken cancellationToken = default(CancellationToken))
        {
            // Set the top metal to have a charge at the bottom (location = thickness)
            TopLayer.Prepare();

            // Set the first point to all zeros
            TopLayer.EvalPoints[0] = new EvalPoint();

            // Add charge to the last point
            TopLayer.EvalPoints[1] = new EvalPoint
            {
                Location      = TopLayer.Thickness,
                ChargeDensity = topCharge
            };

            var runningCharge    = topCharge;
            var runningPotential = ElectricPotential.Zero;

            // Now integrate the charges to get the electric field in all the dielectrics
            foreach (var layer in Layers.Skip(1).Take(Layers.Count - 2)) // Only inner layers
            {
                if (cancellationToken.IsCancellationRequested)
                {
                    return(ChargeDensity.Zero);
                }

                if (layer is Dielectric)
                {
                    var dielectric = (Dielectric)layer;
                    dielectric.Prepare();

                    for (var i = 0; i < dielectric.EvalPoints.Count; i++)
                    {
                        if (cancellationToken.IsCancellationRequested)
                        {
                            return(ChargeDensity.Zero);
                        }

                        var point = dielectric.EvalPoints[i];

                        // Integrate the charge (sum really)
                        runningCharge += point.ChargeDensity;

                        // Calculate the Electric Field
                        point.ElectricField = runningCharge / dielectric.Permittivity;

                        // Calculate the potential
                        if (i == 0)
                        {
                            point.Potential = runningPotential;
                        }
                        else
                        {
                            var previousPoint = dielectric.EvalPoints[i - 1];
                            runningPotential -= previousPoint.ElectricField
                                                * (point.Location - previousPoint.Location);

                            point.Potential = runningPotential;
                        }
                    }
                }
                else if (layer is Metal)
                {
                    var metal = (Metal)layer;
                    metal.Prepare();

                    // For the first point put the neg of the charge we have accumulated so far
                    metal.EvalPoints[0].ChargeDensity = -runningCharge;
                    metal.EvalPoints[0].ElectricField = ElectricField.Zero;
                    metal.EvalPoints[0].Potential     = runningPotential;

                    // For the last point put the accumulated charge plus the free charge
                    runningCharge += metal.ExtraCharge; // Integrate the extra charge
                    metal.EvalPoints[1].ChargeDensity = runningCharge;
                    metal.EvalPoints[1].ElectricField = ElectricField.Zero;
                    metal.EvalPoints[1].Potential     = runningPotential;
                }
                else // layer is Semiconductor
                {
                    // do nothing
                }
            }

            if (cancellationToken.IsCancellationRequested)
            {
                return(ChargeDensity.Zero);
            }

            // Now add the stuff for the last point - here we assume that it is a metal
            if (IsBottomLayerMetal)
            {
                var metal = (Metal)BottomLayer;
                metal.Prepare();

                // For the first point put the neg of the charge we have accumulated so far
                metal.EvalPoints[0].ChargeDensity = -runningCharge;
                metal.EvalPoints[0].ElectricField = ElectricField.Zero;
                metal.EvalPoints[0].Potential     = runningPotential;

                // For the last point put no charge
                metal.EvalPoints[1].ChargeDensity = ChargeDensity.Zero;
                metal.EvalPoints[1].ElectricField = ElectricField.Zero;
                metal.EvalPoints[1].Potential     = runningPotential;
            }
            else if (IsBottomLayerSemiconductor)
            {
                var semiconductor = (Semiconductor)BottomLayer;

                // Calculate the surface potential and prepare
                semiconductor.ExtraCharge = -runningCharge;
                semiconductor.Prepare();

                // Evaulate the potential drop given the remaining charge
                semiconductor.EvalPoints[0].ChargeDensity = -runningCharge;
                semiconductor.EvalPoints[0].Potential     = runningPotential;

                if (cancellationToken.IsCancellationRequested)
                {
                    return(ChargeDensity.Zero);
                }

                // Last Point
                semiconductor.EvalPoints[1].Potential
                    = runningPotential - semiconductor.SurfacePotential;
            }

            return(runningCharge);
        }