public void RefreshStats(EncounterState state) { var player = state.Player; // Left column var playerDefenderComponent = player.GetComponent <DefenderComponent>(); var newHPText = string.Format("HP: {0}/{1}", playerDefenderComponent.CurrentHp, playerDefenderComponent.MaxHp); GetNode <Label>("SidebarVBox/StatsAndPositionHBox/StatsBlock/HPLabel").Text = newHPText; var playerComponent = player.GetComponent <PlayerComponent>(); var newAttackPowerText = string.Format("Laser Power: {0}", playerComponent.CuttingLaserPower); GetNode <Label>("SidebarVBox/StatsAndPositionHBox/StatsBlock/AttackPowerLabel").Text = newAttackPowerText; var speedComponent = player.GetComponent <SpeedComponent>(); var newSpeedText = string.Format("Speed: {0}", speedComponent.Speed); GetNode <Label>("SidebarVBox/StatsAndPositionHBox/StatsBlock/SpeedLabel").Text = newSpeedText; var invComponent = player.GetComponent <InventoryComponent>(); var newInvText = string.Format("Cargo Space: {0}/{1}", invComponent.InventoryUsed, invComponent.InventorySize); GetNode <Label>("SidebarVBox/StatsAndPositionHBox/StatsBlock/InventoryLabel").Text = newInvText; var xpComponent = player.GetComponent <XPTrackerComponent>(); var newLevelText = string.Format("Level: {0}", xpComponent.Level); GetNode <Label>("SidebarVBox/StatsAndPositionHBox/StatsBlock/LevelLabel").Text = newLevelText; var newXPText = string.Format("Experience: {0}/{1}", xpComponent.XP, xpComponent.NextLevelAtXP); GetNode <Label>("SidebarVBox/StatsAndPositionHBox/StatsBlock/ExperienceLabel").Text = newXPText; // Right column var playerPos = player.GetComponent <PositionComponent>().EncounterPosition; var newTurnReadoutText = string.Format("Turn: {0:0.00}", state.CurrentTick / 100); GetNode <Label>("SidebarVBox/StatsAndPositionHBox/PositionBlock/TurnReadoutLabel").Text = newTurnReadoutText; var newSectorZoneText = string.Format("Current Sector: {0}", state.DungeonLevel); GetNode <Label>("SidebarVBox/StatsAndPositionHBox/PositionBlock/SectorLabel").Text = newSectorZoneText; string newPositionZoneText = string.Format("Point: ({0}, {1})", playerPos.X, playerPos.Y); GetNode <Label>("SidebarVBox/StatsAndPositionHBox/PositionBlock/PositionLabel").Text = newPositionZoneText; var containingZone = state.ContainingZone(playerPos.X, playerPos.Y); if (containingZone == null) { GetNode <Label>("SidebarVBox/StatsAndPositionHBox/PositionBlock/ZoneHeaderLabel").Text = "Not In Zone"; GetNode <VBoxContainer>("SidebarVBox/StatsAndPositionHBox/PositionBlock/ZoneBlock").Hide(); } else { GetNode <Label>("SidebarVBox/StatsAndPositionHBox/PositionBlock/ZoneHeaderLabel").Text = containingZone.ZoneName; GetNode <VBoxContainer>("SidebarVBox/StatsAndPositionHBox/PositionBlock/ZoneBlock").Show(); // ...that's a really long line, am I abusing the layout? GetNode <Label>("SidebarVBox/StatsAndPositionHBox/PositionBlock/ZoneBlock/EnemiesWarningContainer/EnemiesWarningLabel").Text = containingZone.ReadoutEncounterName; // This is very fragile! var itemsBasePath = "SidebarVBox/StatsAndPositionHBox/PositionBlock/ZoneBlock/ItemsFeatureReadout/ZoneItemReadout/ZoneItems/ZoneItem"; var itemReadouts = new List <EntityReadout>(containingZone.ReadoutItems); for (int i = 0; i < 3; i++) { var textureRect = GetNode <TextureRect>(itemsBasePath + (i + 1)); if (itemReadouts.Count >= i + 1) { var readout = itemReadouts[i]; textureRect.Show(); var entity = state.GetEntityById(readout.EntityId); if (entity != null) { textureRect.Texture = GD.Load <Texture>(entity.GetComponent <DisplayComponent>().TexturePath); } else { textureRect.Texture = GD.Load <Texture>("res://resources/checkmark_18x18.png"); } } else { textureRect.Hide(); } } var featuresBasePath = "SidebarVBox/StatsAndPositionHBox/PositionBlock/ZoneBlock/ItemsFeatureReadout/ZoneFeaturesReadout/ZoneFeatures/ZoneFeature"; var featureReadouts = new List <EntityReadout>(containingZone.ReadoutFeatures); for (int i = 0; i < 2; i++) { var textureRect = GetNode <TextureRect>(featuresBasePath + (i + 1)); if (featureReadouts.Count >= i + 1) { var readout = featureReadouts[i]; textureRect.Show(); var entity = state.GetEntityById(readout.EntityId); if (entity != null) { textureRect.Texture = GD.Load <Texture>(entity.GetComponent <DisplayComponent>().TexturePath); } else { textureRect.Texture = GD.Load <Texture>("res://resources/checkmark_18x18.png"); } } else { textureRect.Hide(); } } } }