public void SetElement(HexElement element) { this.element = element; foreach (Transform child in transform) { child.gameObject.SetActive(false); } switch (element) { case (HexElement.Black): elementMarkerBlack.gameObject.SetActive(true); break; case (HexElement.White): elementMarkerWhite.gameObject.SetActive(true); break; case (HexElement.Red): elementMarkerRed.gameObject.SetActive(true); break; case (HexElement.Green): elementMarkerGreen.gameObject.SetActive(true); break; case (HexElement.Blue): elementMarkerBlue.gameObject.SetActive(true); break; default: break; } }
public void Visit(Anchor anchor, byte data) { anchor.OriginalFormat.Visit(this, data); if (NewCell != null) { NewCell = new HexElement(NewCell.Value, new Anchor(NewCell.Format, anchor.Name, anchor.Format, anchor.Sources)); } }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { UnitBehaviorContext unitContext = context as UnitBehaviorContext; if (unitContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } BaseEnvironment envi = unitContext.Unit.Environment; if (envi == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } bool foundPosition = false; HexElement position = new HexElement(); StaticUnit warpMagnetUnit = BaseEnvironment.GetActiveWarpMagnet(envi) as StaticUnit; if (warpMagnetUnit == null) { Builder unit = unitContext.Unit as Builder; position.Q = unit.Q; position.R = unit.R; foundPosition = true; } else { float distance = warpMagnetUnit.TotalSensorsEnergy + 1; foreach (var coord in HexMap.Neighbors) { position.Q = (short)(warpMagnetUnit.Q + distance * coord.x); position.R = (short)(warpMagnetUnit.R + distance * coord.y); if (envi.UnitsMap.ContainsKey(position.HexMapKey) || !envi.PathFindingGraph.VertexHexCache.ContainsKey(position.HexMapKey)) { continue; } foundPosition = true; break; } } if (!foundPosition) { unitContext.EnvironmentTarget = null; returnCode = BehaviorReturnCode.Failure; return(returnCode); } unitContext.EnvironmentTarget = position; returnCode = BehaviorReturnCode.Success; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlayerBehaviorContext playerContext = context as PlayerBehaviorContext; if (playerContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } Player player = playerContext.Player; foreach (var body in player.StarSystemBodies) { Planet planet = body as Planet; if (planet == null) { continue; } BaseEnvironment envi = planet.Environment; List <BaseUnit> enviUnits = player.Units.Where(u => u.Environment == envi).ToList(); HexElement defenseUnit = enviUnits.FirstOrDefault(u => u is DefenseTowerUnit || u is Station); if (defenseUnit == null) { BaseUnit existingUnit = enviUnits.FirstOrDefault(u => u is Builder && u.Behavior == null); playerContext.BehaviorTarget = existingUnit; if (existingUnit != null) { playerContext.EnvironmentTarget = planet.Environment; returnCode = BehaviorReturnCode.Success; return(returnCode); } } } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
private void Initialize(Vector3 center) { hexElement = GetComponentInChildren <HexElement>(); gridCanvas = GetComponentInChildren <Canvas>(); hexElement.name = "HexElement"; Mesh mesh = GetComponent <MeshFilter>().mesh; transform.position = center; mesh.Clear(); vertices = new Vector3[] { new Vector3(0f, 0f, 0f), new Vector3(0f, 0f, outerRadius), new Vector3(innerRadius, 0f, 0.5f * outerRadius), new Vector3(innerRadius, 0f, -0.5f * outerRadius), new Vector3(0f, 0f, -outerRadius), new Vector3(-innerRadius, 0f, -0.5f * outerRadius), new Vector3(-innerRadius, 0f, 0.5f * outerRadius), new Vector3(0f, 0f, outerRadius) }; mesh.vertices = vertices; for (int i = 1; i < 7; i++) { addTriangle(0, i, i + 1); } mesh.triangles = triangles; void addTriangle(int v1, int v2, int v3) { triangles[triangles.Length] = v1; triangles[triangles.Length] = v2; triangles[triangles.Length] = v3; } }
public NewMediumLevelRecordEditor(Plugin p, Record r, SubRecord sr, SubrecordStructure ss) { InitializeComponent(); Icon = Resources.tesv_ico; SuspendLayout(); this.sr = sr; this.ss = ss; this.p = p; this.r = r; // walk each element in standard fashion int panelOffset = 0; try { foreach (var elem in ss.elements) { Control c = null; if (elem.options != null && elem.options.Length > 1) { c = new OptionsElement(); } else if (elem.flags != null && elem.flags.Length > 1) { c = new FlagsElement(); } else { switch (elem.type) { case ElementValueType.LString: c = new LStringElement(); break; case ElementValueType.FormID: c = new FormIDElement(); break; case ElementValueType.Blob: c = new HexElement(); break; default: c = new TextElement(); break; } } if (c is IElementControl) { var ec = c as IElementControl; ec.formIDLookup = p.GetRecordByID; ec.formIDScan = p.EnumerateRecords; ec.strIDLookup = p.LookupFormStrings; ec.Element = elem; if (elem.repeat > 0) { var ge = new RepeatingElement(); c = ge; c.Left = 8; c.Width = fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; ge.InnerControl = ec; ge.Element = elem; ec = ge; } else if (elem.optional) { var re = new OptionalElement(); c = re; c.Left = 8; c.Width = fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; re.InnerControl = ec; re.Element = elem; ec = re; c = re; } else { c.Left = 8; c.Width = fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; } c.MinimumSize = c.Size; controlMap.Add(elem, ec); fpanel1.Controls.Add(c); panelOffset = c.Bottom; } } foreach (Element elem in r.EnumerateElements(sr, true)) { var es = elem.Structure; IElementControl c; if (controlMap.TryGetValue(es, out c)) { if (c is IGroupedElementControl) { var gc = c as IGroupedElementControl; gc.Elements.Add(elem.Data); } else { c.Data = elem.Data; } } } } catch { strWarnOnSave = "The subrecord doesn't appear to conform to the expected structure.\nThe formatted information may be incorrect."; Error.SetError(bSave, strWarnOnSave); Error.SetIconAlignment(bSave, ErrorIconAlignment.MiddleLeft); AcceptButton = bCancel; // remove save as default button when exception occurs CancelButton = bCancel; UpdateDefaultButton(); } ResumeLayout(); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { UnitBehaviorContext unitContext = context as UnitBehaviorContext; if (unitContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } BaseEnvironment envi = unitContext.Unit.Environment; if (envi == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } float maxPlanetUtility = float.MinValue; Planet selectedPlanet = null; var player = unitContext.Unit.Owner; foreach (var galaxyBodyKey in player.ExploredEnvironments) { HexElement elem = null; if (!player.GameSession.Galaxy.EnvironmentMap.TryGetValue(galaxyBodyKey, out elem)) { continue; } // TODO: rogue planets colonization StarSystem system = elem as StarSystem; if (system == null || system.NumberOfPlanets == 0 || !system.HasHighestInfluence(player)) { continue; } int systemDistance = HexMap.Distance(envi, system); if (envi is Galaxy) { systemDistance = HexMap.Distance(unitContext.Unit, system); } foreach (var planet in system.Planets) { if (planet == null || planet.Owner != null || !player.CanColonizePlanetType(planet.PlanetType)) { continue; } var existingColonyShip = player.Units.FirstOrDefault(u => u.Item.UnitConfig.Actions.HasFlag(UnitActions.Colonize) && u != unitContext.Unit && u.BehaviorContext.EnvironmentTarget == planet); if (existingColonyShip != null) { continue; } float planetUtility = GetPlanetUtility(player, planet); planetUtility -= systemDistance * DistanceSystemUtilityCoefficient; if (envi == system) { planetUtility -= HexMap.Distance(unitContext.Unit, planet); } var isHomePlanet = player.GameSession.Players.FirstOrDefault(p => p.HomePlanet == planet); if (isHomePlanet != null) { selectedPlanet = planet; break; } if (maxPlanetUtility > planetUtility) { continue; } maxPlanetUtility = planetUtility; selectedPlanet = planet; } } if (selectedPlanet != null) { unitContext.EnvironmentTarget = selectedPlanet; returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { UnitBehaviorContext unitContext = context as UnitBehaviorContext; if (unitContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } MoveableUnit unit = unitContext.Unit as MoveableUnit; if (unit == null || !unit.CanMiniJump) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (unitContext.EnvironmentTarget == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } short destinationQ = unitContext.EnvironmentTarget.Q; short destinationR = unitContext.EnvironmentTarget.R; Planet planet = unitContext.EnvironmentTarget as Planet; MoveableUnit destinationUnit = unitContext.EnvironmentTarget as MoveableUnit; if (planet != null) { destinationQ = planet.NextTurnQ; destinationR = planet.NextTurnR; } else if (destinationUnit != null) { // find hex around unit short nq = destinationUnit.Q; short nr = destinationUnit.R; destinationUnit.GetMiniJumpDestination(out nq, out nr); int key = HexMap.CalculateKey(nq, nr); HexElement existingUnit = null; var envi = destinationUnit.Environment; bool foundHex = false; int searchRadius = 1; short centerQ = nq; short centerR = nr; while (!foundHex) { var range = HexMap.GetRing(centerQ, centerR, searchRadius); foreach (var coord in range) { nq = coord.Item1; nr = coord.Item2; if (envi.MapRadius > HexMap.Distance(0, nq, 0, nr) && !envi.UnitsMap.TryGetValue(HexMap.CalculateKey(nq, nr), out existingUnit)) { foundHex = true; break; } } searchRadius++; } destinationQ = nq; destinationR = nr; } else if (unitContext.EnvironmentTarget is Anomaly) { destinationQ = unitContext.EnvironmentTarget.Q; destinationR = unitContext.EnvironmentTarget.R; } else { returnCode = BehaviorReturnCode.Failure; return(returnCode); } MiniWarpJumpTask task = new MiniWarpJumpTask(unit, destinationQ, destinationR); task.Execute(); if (task.IsTaskFinished) { returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }
public NewMediumLevelRecordEditor(Plugin p, Record r, SubRecord sr, SubrecordStructure ss) { this.InitializeComponent(); Icon = Resources.tesv_ico; SuspendLayout(); this.sr = sr; this.ss = ss; this.p = p; this.r = r; // walk each element in standard fashion int panelOffset = 0; try { this.fpanel1.ColumnStyles[0] = new ColumnStyle(SizeType.Percent, 100.0f); int maxWidth = this.fpanel1.Width - SystemInformation.VerticalScrollBarWidth - 8; int leftOffset = 0; // 8; foreach (var elem in ss.elements) { Control c = null; if (elem.options != null && elem.options.Length > 1) { c = new OptionsElement(); } else if (elem.flags != null && elem.flags.Length > 1) { c = new FlagsElement(); } else { switch (elem.type) { case ElementValueType.LString: c = new LStringElement(); break; case ElementValueType.FormID: c = new FormIDElement(); break; case ElementValueType.Blob: c = new HexElement(); break; default: c = new TextElement(); break; } } if (c is IElementControl) { var ec = c as IElementControl; ec.formIDLookup = p.GetRecordByID; ec.formIDScan = p.EnumerateRecords; ec.strIDLookup = p.LookupFormStrings; ec.Element = elem; if (elem.repeat > 0) { var ge = new RepeatingElement(); c = ge; c.Left = leftOffset; c.Width = maxWidth; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; ge.InnerControl = ec; ge.Element = elem; ec = ge; } else if (elem.optional > 0) { var re = new OptionalElement(); c = re; c.Left = leftOffset; c.Width = maxWidth; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; re.InnerControl = ec; re.Element = elem; ec = re; c = re; } else { c.Left = leftOffset; c.Width = maxWidth; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; } this.controlMap.Add(elem, ec); int idx = this.fpanel1.RowCount - 1; this.fpanel1.Controls.Add(c, 0, idx); var info = new RowStyle(SizeType.Absolute, c.Size.Height + 2); if (idx == 0) { this.fpanel1.RowStyles[0] = info; } else { this.fpanel1.RowStyles.Add(info); } panelOffset = 0; ++this.fpanel1.RowCount; } } foreach (Element elem in r.EnumerateElements(sr, true)) { var es = elem.Structure; IElementControl c; if (this.controlMap.TryGetValue(es, out c)) { if (c is IGroupedElementControl) { var gc = c as IGroupedElementControl; gc.Elements.Add(elem.Data); } else { c.Data = elem.Data; } } } } catch { this.strWarnOnSave = "The subrecord doesn't appear to conform to the expected structure.\nThe formatted information may be incorrect."; this.Error.SetError(this.bSave, this.strWarnOnSave); this.Error.SetIconAlignment(this.bSave, ErrorIconAlignment.MiddleLeft); AcceptButton = this.bCancel; // remove save as default button when exception occurs CancelButton = this.bCancel; UpdateDefaultButton(); } ResumeLayout(); }
public void SetContext(Record r, SubRecord sr, bool hexView) { if (this.r == r && this.sr == sr && this.hexView == hexView) { return; } if (r == null || sr == null) { this.ClearControl(); return; } // walk each element in standard fashion int panelOffset = 0; try { this.BeginUpdate(); this.ClearControl(); SuspendLayout(); this.fpanel1.SuspendLayout(); this.fpanel1.Width = Parent.Width; this.controlMap.Clear(); this.hexView = hexView; this.r = r; this.sr = sr; var p = this.GetPluginFromNode(r); this.ss = sr.Structure; // default to blob if no elements if (this.ss == null || this.ss.elements == null || hexView) { var c = new HexElement(); c.Left = 8; c.Width = this.fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; var elem = r.EnumerateElements(sr, true).FirstOrDefault(); if (elem != null) { this.controlMap.Add(elem.Structure, c); this.fpanel1.Controls.Add(c); c.Data = elem.Data; } } else { foreach (var elem in this.ss.elements) { Control c = null; if (elem.options != null && elem.options.Length > 1) { c = new OptionsElement(); } else if (elem.flags != null && elem.flags.Length > 1) { c = new FlagsElement(); } else { switch (elem.type) { case ElementValueType.LString: c = new LStringElement(); break; case ElementValueType.FormID: c = new FormIDElement(); break; case ElementValueType.Blob: c = new HexElement(); break; default: c = new TextElement(); break; } } if (c is IElementControl) { var ec = c as IElementControl; ec.formIDLookup = p.GetRecordByID; ec.formIDScan = p.EnumerateRecords; ec.strIDLookup = p.LookupFormStrings; ec.Element = elem; if (elem.repeat > 0) { var ge = new RepeatingElement(); c = ge; c.Left = 8; c.Width = this.fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; ge.InnerControl = ec; ge.Element = elem; ec = ge; } else if (elem.optional > 0) { var re = new OptionalElement(); c = re; c.Left = 8; c.Width = this.fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; re.InnerControl = ec; re.Element = elem; ec = re; c = re; } else { c.Left = 8; c.Width = this.fpanel1.Width - 16; c.Top = panelOffset; c.Anchor = c.Anchor | AnchorStyles.Left | AnchorStyles.Right; } c.MinimumSize = c.Size; this.controlMap.Add(elem, ec); this.fpanel1.Controls.Add(c); panelOffset = c.Bottom; } } foreach (Element elem in r.EnumerateElements(sr, true)) { var es = elem.Structure; IElementControl c; if (this.controlMap.TryGetValue(es, out c)) { if (c is IGroupedElementControl) { var gc = c as IGroupedElementControl; gc.Elements.Add(elem.Data); } else { c.Data = elem.Data; } } } } Enabled = true; } catch { this.strWarnOnSave = "The subrecord doesn't appear to conform to the expected structure.\nThe formatted information may be incorrect."; } finally { this.fpanel1.ResumeLayout(); ResumeLayout(); this.EndUpdate(); Refresh(); } }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { UnitBehaviorContext unitContext = context as UnitBehaviorContext; if (unitContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } MoveableUnit unit = unitContext.Unit as MoveableUnit; if (unit == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (unit.Target == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } if (unit.Environment != unit.Target.Environment) { unit.Target = null; returnCode = BehaviorReturnCode.Failure; return(returnCode); } /* * Vector targetCoords = new Vector(); * * Vector unitCoords = new Vector(); * unitCoords.X = unit.Q; * unitCoords.Y = unit.R; * * Vector direction = Vector.Normalize(targetCoords - unitCoords); * direction.X = (float)Math.Round(direction.X, 0); * direction.Y = (float)Math.Round(direction.Y, 0); * * if (PathTargetPosition) * { * direction = Vector.Zero; * } * * unit.SelectedPath = null; * int range = (int) unit.SensorsEnergy; * while (unit.SelectedPath == null && range > 0) * { * targetCoords -= (direction * range); * unit.CalculatePath(unit.Environment, (short) targetCoords.X, (short) targetCoords.Y); * range--; * } */ short nq = unit.Target.Q; short nr = unit.Target.R; HexElement existingUnit = null; bool foundHex = false; int searchRadius = (int)unit.SensorsEnergy; short centerQ = nq; short centerR = nr; while (!foundHex && searchRadius > 0) { var range = HexMap.GetRing(centerQ, centerR, searchRadius); foreach (var coord in range) { nq = coord.Item1; nr = coord.Item2; if (unit.Environment.MapRadius > HexMap.Distance(0, nq, 0, nr) && !unit.Environment.UnitsMap.TryGetValue(HexMap.CalculateKey(nq, nr), out existingUnit)) { foundHex = true; break; } } searchRadius--; } if (foundHex) { unit.CalculatePath(unit.Environment, nq, nr); } if (!foundHex || unit.SelectedPath == null) { unit.Target = null; returnCode = BehaviorReturnCode.Failure; return(returnCode); } returnCode = BehaviorReturnCode.Success; return(returnCode); }
// Start is called before the first frame update void Start() { HexElement hexElement = new HexElement(new Vector3(0, 0, 0)); }
/// <summary> /// Executes behavior with given context /// </summary> /// <param name="context">The context.</param> /// <returns></returns> public override BehaviorReturnCode Behave(IBehaviorContext context) { PlayerBehaviorContext playerContext = context as PlayerBehaviorContext; if (playerContext == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } Player player = playerContext.Player; float maxPlanetUtility = float.MinValue; Planet planetToColonize = null; foreach (var galaxyBodyKey in player.ExploredEnvironments) { HexElement elem = null; if (!player.GameSession.Galaxy.EnvironmentMap.TryGetValue(galaxyBodyKey, out elem)) { continue; } StarSystem system = elem as StarSystem; if (system == null || system.NumberOfPlanets == 0) { continue; } foreach (var planet in system.Planets) { if (planet == null || planet.Owner != null || !player.CanColonizePlanetType(planet.PlanetType)) { continue; } /* * int planetScanned = player.ScannedStarSystemBodies.Contains(planet.GlobalKey) ? 1 : 0; * float planetPreference = player.Race.PlanetTypePreferences[(int)planet.PlanetType] / 100f; * float planetUtility = (planet.AvailResources * planetPreference) / planet.Mass + planet.AvailEnergy / planet.Mass + (planet.RareResources.Count * planetScanned) + planet.MaxSlotsCount; */ float planetUtility = FindPlanetToColonize.GetPlanetUtility(player, planet); if (maxPlanetUtility > planetUtility) { continue; } maxPlanetUtility = planetUtility; planetToColonize = planet; } } if (planetToColonize == null) { returnCode = BehaviorReturnCode.Failure; return(returnCode); } float maxUtility = float.MinValue; Planet bestPlanet = null; foreach (var body in player.StarSystemBodies) { Planet planet = body as Planet; if (planet == null) { continue; } float distance = HexMap.Distance(planetToColonize, planet); if (planetToColonize.Environment != planet.Environment) { distance = HexMap.Distance(planetToColonize.Environment, planet.Environment) * DistanceSystemUtilityCoefficient; } float utility = planet.AvailProduction + planet.Population - distance; if (maxUtility > utility) { continue; } maxUtility = utility; bestPlanet = planet; } if (bestPlanet != null) { playerContext.BehaviorTarget = bestPlanet; returnCode = BehaviorReturnCode.Success; return(returnCode); } returnCode = BehaviorReturnCode.Failure; return(returnCode); }