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"; } }
/// <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; } }
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"); } }
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); } }
// 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); }