private AnimDrawable LoadExtraImage(string extraImage, DrawProperties inheritProps) { string animSection = Art.ReadString(extraImage); if (animSection == "") { return(null); } IniFile.IniSection extraRules = OwnerCollection.Rules.GetOrCreateSection(animSection); IniFile.IniSection extraArt = OwnerCollection.Art.GetOrCreateSection(animSection); var anim = new AnimDrawable(extraRules, extraArt); anim.OwnerCollection = OwnerCollection; anim.LoadFromRules(); anim.NewTheater = this.NewTheater; if (extraArt.HasKey("YSortAdjust") || Art.HasKey(extraImage + "YSort") || extraArt.HasKey("ZAdjust") || Art.HasKey(extraImage + "ZAdjust")) { anim.Props.SortIndex = extraArt.ReadInt("YSortAdjust", Art.ReadInt(extraImage + "YSort")) - extraArt.ReadInt("ZAdjust", Art.ReadInt(extraImage + "ZAdjust")); } else { anim.Props.SortIndex = inheritProps.SortIndex; } if (Art.HasKey(extraImage + "X") || Art.HasKey(extraImage + "Y")) { anim.Props.Offset = this.Props.Offset + new Size(Art.ReadInt(extraImage + "X"), Art.ReadInt(extraImage + "Y")); } else { anim.Props.Offset = inheritProps.Offset; } anim.Props.ZAdjust = Art.ReadInt(extraImage + "ZAdjust"); anim.IsBuildingPart = true; anim.Shp = VFS.Open <ShpFile>(anim.GetFilename()); return(anim); }
private static Button ReadIniButton(IniFile.IniSection sec, string workingDir) { if (sec == null) { return(null); } var ret = new Button { Offset = sec.ReadPoint("Position"), Size = sec.ReadSize("Size"), }; if (sec.HasKey("File_Free", false)) { ret.ImagePath = System.IO.Path.Combine(workingDir, sec.ReadString("File_Free", "", false)); } if (sec.HasKey("File_Push", false)) { ret.PressedImagePath = System.IO.Path.Combine(workingDir, sec.ReadString("File_Push", "", false)); } return(ret); }
private static Button ReadIniButton(IniFile.IniSection sec, FileInfo pi) { if (sec == null) { return(null); } var ret = new Button { Offset = sec.ReadPoint("Position"), Size = sec.ReadSize("Size"), }; if (sec.HasKey("File_Free", false)) { ret.Bitmap = (Bitmap)Image.FromFile(System.IO.Path.Combine(pi.DirectoryName, sec.ReadString("File_Free", "", false))); ret.Texture = TextureHelper.CreateTexture(ret.Bitmap); } if (sec.HasKey("File_Push", false)) { ret.Pressed = (Bitmap)Image.FromFile(System.IO.Path.Combine(pi.DirectoryName, sec.ReadString("File_Push", "", false))); ret.PressedTexture = TextureHelper.CreateTexture(ret.Pressed); } return(ret); }
private AnimDrawable LoadUpgrade(StructureObject structObj, int upgradeSlot, DrawProperties inheritProps) { string upgradeName = ""; if (upgradeSlot == 0) { upgradeName = structObj.Upgrade1; } else if (upgradeSlot == 1) { upgradeName = structObj.Upgrade2; } else if (upgradeSlot == 2) { upgradeName = structObj.Upgrade3; } IniFile.IniSection upgradeRules = OwnerCollection.Rules.GetOrCreateSection(upgradeName); if (upgradeRules != null && upgradeRules.HasKey("Image")) { upgradeName = upgradeRules.ReadString("Image"); } IniFile.IniSection upgradeArt = OwnerCollection.Art.GetOrCreateSection(upgradeName); if (upgradeArt != null && upgradeArt.HasKey("Image")) { upgradeName = upgradeArt.ReadString("Image"); } IniFile.IniSection upgRules = OwnerCollection.Rules.GetOrCreateSection(upgradeName); IniFile.IniSection upgArt = OwnerCollection.Art.GetOrCreateSection(upgradeName); AnimDrawable upgrade = new AnimDrawable(_config, _vfs, upgRules, upgArt); upgrade.OwnerCollection = OwnerCollection; upgrade.Props = inheritProps; upgrade.LoadFromRules(); upgrade.NewTheater = this.NewTheater; upgrade.IsBuildingPart = true; string shpfilename = NewTheater ? OwnerCollection.ApplyNewTheaterIfNeeded(upgradeName, upgradeName + ".shp") : upgradeName + ".shp"; upgrade.Shp = _vfs.Open <ShpFile>(shpfilename); Point powerupOffset = new Point(_powerupSlots[upgradeSlot].X, _powerupSlots[upgradeSlot].Y); upgrade.Props.Offset.Offset(powerupOffset); return(upgrade); }
private static Trigger ReadIniTrigger(IniFile.IniSection sec, string workingDir) { if (sec == null) { return(null); } var ret = new Trigger { Offset = sec.ReadPoint("Position"), Size = sec.ReadSize("Size"), }; ret.Axis = sec.ReadInt("Axis"); ret.OffsetScale = 0.08f; if (sec.HasKey("File_Trigger", false)) { ret.ImagePath = System.IO.Path.Combine(workingDir, sec.ReadString("File_Trigger", "", false)); } ret.Z = -1; // default to behind controller return(ret); }
private static Trigger ReadIniTrigger(IniFile.IniSection sec, FileInfo pi) { if (sec == null) { return(null); } var ret = new Trigger { Offset = sec.ReadPoint("Position"), Size = sec.ReadSize("Size"), }; ret.Axis = sec.ReadInt("Axis"); ret.OffsetScale = 0.08f; if (sec.HasKey("File_Trigger", false)) { ret.Bitmap = (Bitmap)Image.FromFile(System.IO.Path.Combine(pi.DirectoryName, sec.ReadString("File_Trigger", "", false))); ret.Texture = TextureHelper.CreateTexture(ret.Bitmap); } ret.Z = -1; // default to behind controller return(ret); }
public override void LoadFromRules() { base.LoadFromRules(); IsBuildingPart = true; InvisibleInGame = Rules.ReadBool("InvisibleInGame") || LampNames.Contains(Name.ToUpper()); string foundation = Art.ReadString("Foundation", "1x1"); if (!foundation.Equals("custom", StringComparison.InvariantCultureIgnoreCase)) { int fx = foundation[0] - '0'; int fy = foundation[2] - '0'; Foundation = new Size(fx, fy); } else { int fx = Art.ReadInt("Foundation.X", 1); int fy = Art.ReadInt("Foundation.Y", 1); Foundation = new Size(fx, fy); } Props.SortIndex = Art.ReadInt("NormalYSort") - Art.ReadInt("NormalZAdjust"); // "main" building image before anims Props.ZShapePointMove = Art.ReadPoint("ZShapePointMove"); _canBeOccupied = Rules.ReadBool("CanBeOccupied"); _techLevel = Rules.ReadInt("TechLevel"); _conditionYellowHealth = 128; _conditionRedHealth = 64; IniFile.IniSection audioVisual = OwnerCollection.Rules.GetOrCreateSection("AudioVisual"); if (audioVisual != null) { if (audioVisual.HasKey("ConditionYellow")) { int conditionYellow = audioVisual.ReadPercent("ConditionYellow"); _conditionYellowHealth = (int)(256 * (double)conditionYellow / 100); } if (audioVisual.HasKey("ConditionRed")) { int conditionRed = audioVisual.ReadPercent("ConditionRed"); _conditionRedHealth = (int)(256 * (double)conditionRed / 100); } } _baseShp = new ShpDrawable(_config, _vfs, Rules, Art); _baseShp.OwnerCollection = OwnerCollection; _baseShp.LoadFromArtEssential(); _baseShp.Props = Props; _baseShp.Shp = _vfs.Open <ShpFile>(_baseShp.GetFilename()); var extraProps = Props.Clone(); extraProps.SortIndex = 0; foreach (string extraImage in AnimImages) { var extra = LoadExtraImage(extraImage, extraProps); if (extra != null && extra.Shp != null) { _anims.Add(extra); var extraDmg = LoadExtraImage(extraImage + "Damaged", extra.Props); if (extraDmg != null && extraDmg.Shp != null) { _animsDamaged.Add(extraDmg); } else // no damaged anim --> use normal anim also in damaged state { _animsDamaged.Add(extra); } } } // RA2 and later support adding fire animations to buildings, supports custom-paletted animations. if (_config.Engine >= EngineType.RedAlert2) { LoadFireAnimations(); } // Add turrets if (Rules.ReadBool("Turret") && Rules.HasKey("TurretAnim")) { string turretName = Rules.ReadString("TurretAnim"); IniFile.IniSection turretArt = OwnerCollection.Art.GetOrCreateSection(turretName); if (turretArt.HasKey("Image")) { turretName = turretArt.ReadString("Image"); } // NewTheater/generic image fallback support for turrets. string turretNameShp = NewTheater ? OwnerCollection.ApplyNewTheaterIfNeeded(turretName, turretName + ".shp") : turretName + ".shp"; Drawable turret = Rules.ReadBool("TurretAnimIsVoxel") ? (Drawable) new VoxelDrawable(_config, _vfs.Open <VxlFile>(turretName + ".vxl"), _vfs.Open <HvaFile>(turretName + ".hva")) : (Drawable) new ShpDrawable(new ShpRenderer(_config, _vfs), _vfs.Open <ShpFile>(turretNameShp)); turret.Props.Offset = Props.Offset + new Size(Rules.ReadInt("TurretAnimX"), Rules.ReadInt("TurretAnimY")); turret.Props.HasShadow = Rules.ReadBool("UseTurretShadow"); turret.Props.FrameDecider = FrameDeciders.TurretFrameDecider; turret.Props.ZAdjust = Rules.ReadInt("TurretAnimZAdjust"); turret.Props.Cloakable = Props.Cloakable; SubDrawables.Add(turret); if (turret is VoxelDrawable && turretName.ToUpper().Contains("TUR")) { string barrelName = turretName.Replace("TUR", "BARL"); if (_vfs.FileExists(barrelName + ".vxl")) { var barrel = new VoxelDrawable(_config, _vfs.Open <VxlFile>(barrelName + ".vxl"), _vfs.Open <HvaFile>(barrelName + ".hva")); SubDrawables.Add(barrel); barrel.Props = turret.Props; } } } // Bib if (Art.HasKey("BibShape")) { var bibImg = Art.ReadString("BibShape") + ".shp"; if (NewTheater) { bibImg = OwnerCollection.ApplyNewTheaterIfNeeded(bibImg, bibImg); } var bibShp = _vfs.Open <ShpFile>(bibImg); if (bibShp != null) { var bib = new ShpDrawable(new ShpRenderer(_config, _vfs), bibShp); bib.Props = this.Props.Clone(); bib.Flat = true; SubDrawables.Add(bib); } } // Powerup slots, at most 3 for (int i = 1; i <= 3; i++) { _powerupSlots.Add(new PowerupSlot { X = Art.ReadInt(String.Format("PowerUp{0}LocXX", i), 0), Y = Art.ReadInt(String.Format("PowerUp{0}LocYY", i), 0), Z = Art.ReadInt(String.Format("PowerUp{0}LocZZ", i), 0), YSort = Art.ReadInt(String.Format("PowerUp{0}LocYSort", i), 0), }); } if (IsWall && _baseShp.Shp != null) { _baseShp.Shp.Initialize(); if (_baseShp.Shp.NumImages >= 32) { IsActualWall = true; } } }