From 36fbddbb5c4c72867f1e831581fcd1d84502b3e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Fri, 20 Jul 2012 23:05:28 +0200 Subject: [PATCH] fix d2k production queues ClassicProductionQueue gets support for new notification system d2k now uses the ClassicProductionQueue system to avoid spamming Starport has cheaper threshold prices adds a new production queue but has long delivery times also no starport price fluctuation to improve balancing --- OpenRA.Mods.Cnc/ProductionAirdrop.cs | 4 +- .../Widgets/ProductionPaletteWidget.cs | 6 +- OpenRA.Mods.RA/Player/ProductionQueue.cs | 18 ++- OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs | 9 +- mods/cnc/notifications.yaml | 8 ++ mods/cnc/rules/structures.yaml | 31 +---- mods/d2k/TODO | 5 +- mods/d2k/notifications.yaml | 11 +- mods/d2k/rules/atreides.yaml | 123 +++++++++++------- mods/d2k/rules/harkonnen.yaml | 112 +++++++++------- mods/d2k/rules/ordos.yaml | 104 ++++++++------- mods/d2k/rules/structures.yaml | 49 +------ mods/d2k/rules/system.yaml | 36 +++++ mods/d2k/uibits/tabs.png | Bin 48179 -> 49884 bytes mods/ra/notifications.yaml | 7 + mods/ra/rules/system.yaml | 8 +- 16 files changed, 300 insertions(+), 231 deletions(-) diff --git a/OpenRA.Mods.Cnc/ProductionAirdrop.cs b/OpenRA.Mods.Cnc/ProductionAirdrop.cs index 476f48f7d7..ccc439f851 100644 --- a/OpenRA.Mods.Cnc/ProductionAirdrop.cs +++ b/OpenRA.Mods.Cnc/ProductionAirdrop.cs @@ -20,7 +20,7 @@ namespace OpenRA.Mods.Cnc { public class ProductionAirdropInfo : ProductionInfo { - public readonly string ReadyAudio = "reinfor1.aud"; + public readonly string ReadyAudio = "Reinforce"; [ActorReference] public readonly string ActorType = "c17"; public override object Create(ActorInitializer init) { return new ProductionAirdrop(this); } @@ -66,7 +66,7 @@ namespace OpenRA.Mods.Cnc rb.PlayCustomAnimRepeating(self, "idle"); self.World.AddFrameEndTask(ww => DoProduction(self, producee, exit)); - Sound.PlayToPlayer(self.Owner, (Info as ProductionAirdropInfo).ReadyAudio); + Sound.PlayNotification(self.Owner, "Speech", (Info as ProductionAirdropInfo).ReadyAudio, self.Owner.Country.Race); })); a.QueueActivity(Fly.ToCell(endPos)); a.QueueActivity(new RemoveSelf()); diff --git a/OpenRA.Mods.Cnc/Widgets/ProductionPaletteWidget.cs b/OpenRA.Mods.Cnc/Widgets/ProductionPaletteWidget.cs index b921634394..3e2b0c1ada 100755 --- a/OpenRA.Mods.Cnc/Widgets/ProductionPaletteWidget.cs +++ b/OpenRA.Mods.Cnc/Widgets/ProductionPaletteWidget.cs @@ -146,7 +146,7 @@ namespace OpenRA.Mods.Cnc.Widgets else if (CurrentQueue.BuildableItems().Any(a => a.Name == clicked.Name)) { Sound.Play(TabClick); - Sound.Play(CurrentQueue.Info.QueuedAudio); + Sound.PlayNotification(world.LocalPlayer, "Speech", CurrentQueue.Info.QueuedAudio, world.LocalPlayer.Country.Race); world.IssueOrder(Order.StartProduction(CurrentQueue.self, clicked.Name, Game.GetModifierKeys().HasModifier(Modifiers.Shift) ? 5 : 1)); } @@ -164,13 +164,13 @@ namespace OpenRA.Mods.Cnc.Widgets // instant cancel of things we havent started yet and things that are finished if (first.Paused || first.Done || first.TotalCost == first.RemainingCost) { - Sound.Play(CurrentQueue.Info.CancelledAudio); + Sound.PlayNotification(world.LocalPlayer, "Speech", CurrentQueue.Info.CancelledAudio, world.LocalPlayer.Country.Race); world.IssueOrder(Order.CancelProduction(CurrentQueue.self, clicked.Name, Game.GetModifierKeys().HasModifier(Modifiers.Shift) ? 5 : 1)); } else { - Sound.Play(CurrentQueue.Info.OnHoldAudio); + Sound.PlayNotification(world.LocalPlayer, "Speech", CurrentQueue.Info.OnHoldAudio, world.LocalPlayer.Country.Race); world.IssueOrder(Order.PauseProduction(CurrentQueue.self, clicked.Name, true)); } } diff --git a/OpenRA.Mods.RA/Player/ProductionQueue.cs b/OpenRA.Mods.RA/Player/ProductionQueue.cs index 06a31a31ec..87b12c1075 100755 --- a/OpenRA.Mods.RA/Player/ProductionQueue.cs +++ b/OpenRA.Mods.RA/Player/ProductionQueue.cs @@ -24,11 +24,11 @@ namespace OpenRA.Mods.RA public float BuildSpeed = 0.4f; public readonly int LowPowerSlowdown = 3; - public readonly string ReadyAudio = "unitrdy1.aud"; - public readonly string BlockedAudio = "nobuild1.aud"; - public readonly string QueuedAudio = "train1.aud"; - public readonly string OnHoldAudio = "onhold1.aud"; - public readonly string CancelledAudio = "cancld1.aud"; + public readonly string ReadyAudio = "UnitReady"; + public readonly string BlockedAudio = "NoBuild"; + public readonly string QueuedAudio = "Training"; + public readonly string OnHoldAudio = "OnHold"; + public readonly string CancelledAudio = "Cancelled"; public virtual object Create(ActorInitializer init) { return new ProductionQueue(init.self, init.self.Owner.PlayerActor, this); } } @@ -211,17 +211,15 @@ namespace OpenRA.Mods.RA if (isBuilding && !hasPlayedSound) { - Sound.PlayToPlayer(order.Player, Info.ReadyAudio); - hasPlayedSound = true; + hasPlayedSound = Sound.PlayNotification(self.Owner, "Speech", Info.ReadyAudio, self.Owner.Country.Race); } else if (!isBuilding) { if (BuildUnit(order.TargetString)) - Sound.PlayToPlayer(order.Player, Info.ReadyAudio); + Sound.PlayNotification(self.Owner, "Speech", Info.ReadyAudio, self.Owner.Country.Race); else if (!hasPlayedSound && time > 0) { - Sound.PlayToPlayer(order.Player, Info.BlockedAudio); - hasPlayedSound = true; + hasPlayedSound = Sound.PlayNotification(self.Owner, "Speech", Info.BlockedAudio, self.Owner.Country.Race); } } }))); diff --git a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs index 3e578febcf..ea4a28b562 100755 --- a/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs +++ b/OpenRA.Mods.RA/Widgets/BuildPaletteWidget.cs @@ -374,15 +374,15 @@ namespace OpenRA.Mods.RA.Widgets { // instant cancel of things we havent really started yet, and things that are finished if (producing.Paused || producing.Done || producing.TotalCost == producing.RemainingCost) - { - Sound.Play(CurrentQueue.Info.CancelledAudio); + { + Sound.PlayNotification(world.LocalPlayer, "Speech", CurrentQueue.Info.CancelledAudio, world.LocalPlayer.Country.Race); int numberToCancel = Game.GetModifierKeys().HasModifier(Modifiers.Shift) ? 5 : 1; world.IssueOrder(Order.CancelProduction(CurrentQueue.self, item, numberToCancel)); } else { - Sound.Play(CurrentQueue.Info.OnHoldAudio); + Sound.PlayNotification(world.LocalPlayer, "Speech", CurrentQueue.Info.OnHoldAudio, world.LocalPlayer.Country.Race); world.IssueOrder(Order.PauseProduction(CurrentQueue.self, item, true)); } } @@ -391,7 +391,8 @@ namespace OpenRA.Mods.RA.Widgets void StartProduction( World world, string item ) { - Sound.Play(CurrentQueue.Info.QueuedAudio); + + Sound.PlayNotification(world.LocalPlayer, "Speech", CurrentQueue.Info.QueuedAudio, world.LocalPlayer.Country.Race); world.IssueOrder(Order.StartProduction(CurrentQueue.self, item, Game.GetModifierKeys().HasModifier(Modifiers.Shift) ? 5 : 1)); } diff --git a/mods/cnc/notifications.yaml b/mods/cnc/notifications.yaml index 96665b28cc..2509fe17ce 100644 --- a/mods/cnc/notifications.yaml +++ b/mods/cnc/notifications.yaml @@ -12,6 +12,14 @@ Speech: BaseAttack: baseatk1 HarvesterAttack: Leave: batlcon1 + UnitReady: unitredy + NoBuild: nobuild1 + Training: bldging1 + OnHold: onhold1 + Cancelled: cancel1 + Building: bldging1 + ConstructionComplete: constru1 + Reinforce: reinfor1 Sounds: Notifications: diff --git a/mods/cnc/rules/structures.yaml b/mods/cnc/rules/structures.yaml index c84fb9e367..7a4be19e88 100644 --- a/mods/cnc/rules/structures.yaml +++ b/mods/cnc/rules/structures.yaml @@ -29,19 +29,15 @@ FACT: Group: Building BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: bldging1.aud - ReadyAudio: constru1.aud - OnHoldAudio: onhold1.aud - CancelledAudio: cancel1.aud + QueuedAudio: Building + ReadyAudio: ConstructionComplete ProductionQueue@Defense: Type: Defense Group: Defense BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: bldging1.aud - ReadyAudio: constru1.aud - OnHoldAudio: onhold1.aud - CancelledAudio: cancel1.aud + QueuedAudio: Building + ReadyAudio: ConstructionComplete BaseBuilding: ProductionBar: @@ -180,10 +176,6 @@ PYLE: Group: Infantry BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: bldging1.aud - ReadyAudio: unitredy.aud - OnHoldAudio: onhold1.aud - CancelledAudio: cancel1.aud ProductionBar: HAND: @@ -220,10 +212,6 @@ HAND: Group: Infantry BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: bldging1.aud - ReadyAudio: unitredy.aud - OnHoldAudio: onhold1.aud - CancelledAudio: cancel1.aud ProductionBar: AFLD: @@ -262,10 +250,7 @@ AFLD: Group: Vehicle BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: bldging1.aud ReadyAudio: - OnHoldAudio: onhold1.aud - CancelledAudio: cancel1.aud ProductionBar: WEAP: @@ -305,10 +290,6 @@ WEAP: Group: Vehicle BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: bldging1.aud - ReadyAudio: unitredy.aud - OnHoldAudio: onhold1.aud - CancelledAudio: cancel1.aud ProductionBar: HQ: @@ -430,10 +411,6 @@ HPAD: Group: Aircraft BuildSpeed: .4 LowPowerSlowdown: 3 - QueuedAudio: bldging1.aud - ReadyAudio: unitredy.aud - OnHoldAudio: onhold1.aud - CancelledAudio: cancel1.aud ProductionBar: EYE: diff --git a/mods/d2k/TODO b/mods/d2k/TODO index b81d0df29f..82b65b01a6 100644 --- a/mods/d2k/TODO +++ b/mods/d2k/TODO @@ -13,16 +13,13 @@ # add game logic for concrete plates (use terrain overlay from bridges/ressources) # allow placing turrets on walls # make sandworm behave like a moving anti-everything mine (currently not attacking anything) -# allow upgrades # add muzzles and explosions (currently falls back to RA) # create a shellmap (currently just a blank placeholder) # add sonic tank weapon (currently uses tesla) -# starport prices should vary # some transparent tiles (see Atreides Hightech Factory) should be white # gamefile extraction (setup/setup.z) from CD fails # support patch 1.06 gamefiles: DATA.R8 has more frames and currently fails to extract, also featuring new terrain with white houses and new units: grenade thrower, stealth raider icon # put TilesetBuilder.Export into OpenRA.Utility to call the functions directly when extracting game-files (instead of opening a GUI) # group number metrics are off # building offsets wrong (worst for towers) -# spice blooms should explode and create new spice field instead of growing spice -# build light vehicles only at light factory, don't create a new production queue and tab for every new factory except starport \ No newline at end of file +# spice blooms should explode and create new spice field instead of growing spice \ No newline at end of file diff --git a/mods/d2k/notifications.yaml b/mods/d2k/notifications.yaml index e380106b80..35bf5d8aea 100644 --- a/mods/d2k/notifications.yaml +++ b/mods/d2k/notifications.yaml @@ -1,4 +1,4 @@ -# requires Dune 2000/DATA/GAMESFX copied to ~/.openra/Content/d2k +# requires Dune 2000/DATA/GAMESFX copied to $PlatformSupportDir/Content/d2k Speech: DefaultVariant: .AUD @@ -19,6 +19,15 @@ Speech: BaseAttack: ATACK HarvesterAttack: HATTK Leave: ABORT + UnitReady: UNRDY + NoRoom: NROOM + Training: TRAIN + OnHold: HOLD + Cancelled: CANCL + Building: BUILD + BuildingReady: BDRDY + OrderPlaced: ORDER + Reinforce: REINF Sounds: Notifications: diff --git a/mods/d2k/rules/atreides.yaml b/mods/d2k/rules/atreides.yaml index 8165bfc6d2..6586f70451 100644 --- a/mods/d2k/rules/atreides.yaml +++ b/mods/d2k/rules/atreides.yaml @@ -6,18 +6,6 @@ CONYARDA: IntoActor: mcva Offset:1,1 Facing: 270 - ProductionQueue@Building: - QueuedAudio: AI_BUILD.AUD - OnHoldAudio: AI_HOLD.AUD - ReadyAudio: AI_BDRDY.AUD - CancelledAudio: AI_CANCL.AUD - BlockedAudio: AI_NROOM.AUD - ProductionQueue@Defense: - QueuedAudio: AI_BUILD.AUD - OnHoldAudio: AI_HOLD.AUD - ReadyAudio: AI_BDRDY.AUD - CancelledAudio: AI_CANCL.AUD - BlockedAudio: AI_NROOM.AUD PWRA: Inherits: ^POWER @@ -61,41 +49,86 @@ HARVESTERA: Buildable: Prerequisites: heavya,refa Owner: atreides + BuiltAt: heavya RenderUnit: Image: HARVESTER +HARVESTERA.starport: + Inherits: HARVESTERA + Buildable: + Queue: Ship + BuiltAt: starporta + Valued: + Cost: 895 + TRIKEA: Inherits: ^TRIKE Buildable: Prerequisites: lighta Owner: atreides + BuiltAt: lighta RenderUnit: Image: TRIKE +TRIKEA.starport: + Inherits: TRIKEA + Buildable: + Queue: Ship + BuiltAt: starporta + Valued: + Cost: 149 + QUADA: Inherits: ^QUAD Buildable: Prerequisites: lighta Owner: atreides + BuiltAt: lighta RenderUnit: Image: QUAD +QUADA.starport: + Inherits: QUADA + Buildable: + Queue: Ship + BuiltAt: starporta + Valued: + Cost: 295 + SIEGETANKA: Inherits: ^SIEGETANK Buildable: Prerequisites: heavya, radara Owner: atreides + BuiltAt: heavya RenderUnitTurreted: Image: SIEGETANK +SIEGETANKA.starport: + Inherits: SIEGETANKA + Buildable: + Queue: Ship + BuiltAt: starporta + Valued: + Cost: 495 + MISSILETANKA: Inherits: ^MISSILETANK Buildable: Prerequisites: heavya Owner: atreides + BuiltAt: heavya RenderUnit: Image: MISSILETANK +MISSILETANKA.starport: + Inherits: MISSILETANKA + Buildable: + Queue: Ship + BuiltAt: starporta + Valued: + Cost: 599 + CARRYALLA: Inherits: ^CARRYALL Buildable: @@ -105,29 +138,26 @@ CARRYALLA: RenderUnit: Image: CARRYALL +CARRYALLA.starport: + Inherits: CARRYALLA + Buildable: + Queue: Ship + BuiltAt: starporta + Valued: + Cost: 999 + BARRA: Inherits: ^BARRACKS Buildable: Prerequisites: pwra Owner: atreides - ProductionQueue@Infantry: - ReadyAudio: AI_UNRDY.AUD - QueuedAudio:AI_TRAIN.AUD - OnHoldAudio: AI_HOLD.AUD - CancelledAudio: AI_CANCL.AUD - BlockedAudio: AI_NROOM.AUD + HIGHTECHA: Inherits: ^HIGHTECH Buildable: Prerequisites: radara Owner: atreides - ProductionQueue@Plane: - ReadyAudio: AI_UNRDY.AUD - QueuedAudio:AI_TRAIN.AUD - OnHoldAudio: AI_HOLD.AUD - CancelledAudio: AI_CANCL.AUD - BlockedAudio: AI_NROOM.AUD RESEARCHA: Inherits: ^RESEARCH @@ -165,12 +195,6 @@ LIGHTA: Owner: atreides RenderBuildingWarFactory: Image: LIGHTA - ProductionQueue@Vehicle: - ReadyAudio: AI_UNRDY.AUD - QueuedAudio:AI_TRAIN.AUD - OnHoldAudio: AI_HOLD.AUD - CancelledAudio: AI_CANCL.AUD - BlockedAudio: AI_NROOM.AUD HEAVYA: Inherits: ^HEAVY @@ -179,12 +203,6 @@ HEAVYA: Owner: atreides RenderBuildingWarFactory: Image: HEAVYA - ProductionQueue@Vehicle: - ReadyAudio: AI_UNRDY.AUD - QueuedAudio:AI_TRAIN.AUD - OnHoldAudio: AI_HOLD.AUD - CancelledAudio: AI_CANCL.AUD - BlockedAudio: AI_NROOM.AUD RADARA: Inherits: ^RADAR @@ -197,14 +215,6 @@ STARPORTA: Buildable: Prerequisites: radara Owner: atreides - ProductionAirdrop: - ReadyAudio: AI_REINF.AUD - ProductionQueue@Vehicle: - QueuedAudio: AI_ORDER.AUD - ReadyAudio: - OnHoldAudio: AI_HOLD.AUD - CancelledAudio: AI_CANCL.AUD - BlockedAudio: AI_NROOM.AUD REPAIRA: Inherits: ^REPAIR @@ -217,6 +227,7 @@ MCVA: Buildable: Prerequisites: heavya,repaira Owner: atreides + BuiltAt: heavya Transforms: Facing: 10 IntoActor: conyarda @@ -225,11 +236,32 @@ MCVA: RenderUnit: Image: DMCV +MCVA.starport: + Inherits: MCVA + Buildable: + Queue: Ship + BuiltAt: starporta + Valued: + Cost: 1499 + COMBATA: Inherits: ^COMBAT + Tooltip: + Icon: combataicon Buildable: Prerequisites: heavya Owner: atreides + BuiltAt: heavya + RenderUnitTurreted: + Image: COMBATA + +COMBATA.starport: + Inherits: COMBATA + Buildable: + Queue: Ship + BuiltAt: starporta + Valued: + Cost: 595 SONICTANK: Inherits: ^Vehicle @@ -238,11 +270,13 @@ SONICTANK: BuildPaletteOrder: 15 Prerequisites: heavya,researcha Owner: atreides + BuiltAt: heavya Valued: Cost: 1500 Tooltip: Name: Sonic Tank Description: Fires a sound wave\n Strong vs Infantry.\n Weak vs Tanks + Icon: sonictankicon Selectable: Bounds: 30,30 Health: @@ -254,6 +288,7 @@ SONICTANK: RevealsShroud: Range: 7 RenderUnit: + Image: SONICTANK AttackFrontal: PrimaryWeapon: TTankZap PrimaryOffset: 0,0,0,-5 diff --git a/mods/d2k/rules/harkonnen.yaml b/mods/d2k/rules/harkonnen.yaml index 7403908a2d..8e5e40b967 100644 --- a/mods/d2k/rules/harkonnen.yaml +++ b/mods/d2k/rules/harkonnen.yaml @@ -6,18 +6,6 @@ CONYARDH: IntoActor: mcvh Offset:1,1 Facing: 270 - ProductionQueue@Building: - QueuedAudio: HI_BUILD.AUD - OnHoldAudio: HI_HOLD.AUD - ReadyAudio: HI_BDRDY.AUD - CancelledAudio: HI_CANCL.AUD - BlockedAudio: HI_NROOM.AUD - ProductionQueue@Defense: - QueuedAudio: HI_BUILD.AUD - OnHoldAudio: HI_HOLD.AUD - ReadyAudio: HI_BDRDY.AUD - CancelledAudio: HI_CANCL.AUD - BlockedAudio: HI_NROOM.AUD PWRH: Inherits: ^POWER @@ -46,6 +34,14 @@ HARVESTERH: RenderUnit: Image: HARVESTER +HARVESTERH.starport: + Inherits: HARVESTERH + Buildable: + Queue: Ship + BuiltAt: starporth + Valued: + Cost: 895 + TRIKEH: Inherits: ^TRIKE Buildable: @@ -54,6 +50,14 @@ TRIKEH: RenderUnit: Image: TRIKE +TRIKEH.starport: + Inherits: TRIKEH + Buildable: + Queue: Ship + BuiltAt: starporth + Valued: + Cost: 149 + QUADH: Inherits: ^QUAD Buildable: @@ -62,6 +66,14 @@ QUADH: RenderUnit: Image: QUAD +QUADH.starport: + Inherits: QUADH + Buildable: + Queue: Ship + BuiltAt: starporth + Valued: + Cost: 295 + SIEGETANKH: Inherits: ^SIEGETANK Buildable: @@ -70,6 +82,14 @@ SIEGETANKH: RenderUnitTurreted: Image: SIEGETANK +SIEGETANKH.starport: + Inherits: SIEGETANKH + Buildable: + Queue: Ship + BuiltAt: starporta + Valued: + Cost: 495 + MISSILETANKH: Inherits: ^MISSILETANK Buildable: @@ -78,6 +98,14 @@ MISSILETANKH: RenderUnit: Image: MISSILETANK +MISSILETANKH.starport: + Inherits: MISSILETANKH + Buildable: + Queue: Ship + BuiltAt: starporth + Valued: + Cost: 599 + CARRYALLH: Inherits: ^CARRYALL Buildable: @@ -87,17 +115,19 @@ CARRYALLH: RenderUnit: Image: CARRYALL +CARRYALLH.starport: + Inherits: CARRYALLH + Buildable: + Queue: Ship + BuiltAt: starporth + Valued: + Cost: 999 + BARRH: Inherits: ^BARRACKS Buildable: Prerequisites: pwrh Owner: harkonnen - ProductionQueue@Infantry: - ReadyAudio: HI_UNRDY.AUD - QueuedAudio:HI_TRAIN.AUD - OnHoldAudio: HI_HOLD.AUD - CancelledAudio: HI_CANCL.AUD - BlockedAudio: HI_NROOM.AUD GUNTOWERH: Inherits: ^GUNTOWER @@ -122,12 +152,6 @@ HIGHTECHH: Buildable: Prerequisites: radarh Owner: harkonnen - ProductionQueue@Plane: - ReadyAudio: HI_UNRDY.AUD - QueuedAudio:HI_TRAIN.AUD - OnHoldAudio: HI_HOLD.AUD - CancelledAudio: HI_CANCL.AUD - BlockedAudio: HI_NROOM.AUD RESEARCHH: Inherits: ^RESEARCH @@ -168,12 +192,6 @@ LIGHTH: Owner: harkonnen RenderBuildingWarFactory: Image: LIGHTH - ProductionQueue@Vehicle: - ReadyAudio: HI_UNRDY.AUD - QueuedAudio:HI_TRAIN.AUD - OnHoldAudio: HI_HOLD.AUD - CancelledAudio: HI_CANCL.AUD - BlockedAudio: HI_NROOM.AUD HEAVYH: Inherits: ^HEAVY @@ -182,12 +200,6 @@ HEAVYH: Owner: harkonnen RenderBuildingWarFactory: Image: HEAVYH - ProductionQueue@Vehicle: - ReadyAudio: HI_UNRDY.AUD - QueuedAudio:HI_TRAIN.AUD - OnHoldAudio: HI_HOLD.AUD - CancelledAudio: HI_CANCL.AUD - BlockedAudio: HI_NROOM.AUD RADARH: Inherits: ^RADAR @@ -200,14 +212,6 @@ STARPORTH: Buildable: Prerequisites: radarh Owner: harkonnen - ProductionAirdrop: - ReadyAudio: HI_REINF.AUD - ProductionQueue@Vehicle: - QueuedAudio: HI_ORDER.AUD - ReadyAudio: - OnHoldAudio: HI_HOLD.AUD - CancelledAudio: HI_CANCL.AUD - BlockedAudio: HI_NROOM.AUD REPAIRH: Inherits: ^REPAIR @@ -228,11 +232,31 @@ MCVH: RenderUnit: Image: DMCV +MCVH.starport: + Inherits: MCVH + Buildable: + Queue: Ship + BuiltAt: starporth + Valued: + Cost: 1499 + COMBATH: Inherits: ^COMBAT + Tooltip: + Icon: combathicon Buildable: Prerequisites: heavyh Owner: harkonnen + RenderUnitTurreted: + Image: COMBATH + +COMBATH.starport: + Inherits: COMBATH + Buildable: + Queue: Ship + BuiltAt: starporth + Valued: + Cost: 595 DEVAST: Inherits: ^Tank diff --git a/mods/d2k/rules/ordos.yaml b/mods/d2k/rules/ordos.yaml index acf66e5989..cc7b34f06a 100644 --- a/mods/d2k/rules/ordos.yaml +++ b/mods/d2k/rules/ordos.yaml @@ -6,18 +6,6 @@ CONYARDO: IntoActor: mcvo Offset:1,1 Facing: 270 - ProductionQueue@Building: - QueuedAudio: OI_BUILD.AUD - OnHoldAudio: OI_HOLD.AUD - ReadyAudio: OI_BDRDY.AUD - CancelledAudio: OI_CANCL.AUD - BlockedAudio: OI_NROOM.AUD - ProductionQueue@Defense: - QueuedAudio: OI_BUILD.AUD - OnHoldAudio: OI_HOLD.AUD - ReadyAudio: OI_BDRDY.AUD - CancelledAudio: OI_CANCL.AUD - BlockedAudio: OI_NROOM.AUD PWRO: Inherits: ^POWER @@ -43,12 +31,6 @@ BARRO: Buildable: Prerequisites: pwro Owner: ordos - ProductionQueue@Infantry: - ReadyAudio: OI_UNRDY.AUD - QueuedAudio:OI_TRAIN.AUD - OnHoldAudio: OI_HOLD.AUD - CancelledAudio: OI_CANCL.AUD - BlockedAudio: OI_NROOM.AUD GUNTOWERO: Inherits: ^GUNTOWER @@ -73,12 +55,6 @@ HIGHTECHO: Buildable: Prerequisites: radaro Owner: ordos - ProductionQueue@Plane: - ReadyAudio: OI_UNRDY.AUD - QueuedAudio:OI_TRAIN.AUD - OnHoldAudio: OI_HOLD.AUD - CancelledAudio: OI_CANCL.AUD - BlockedAudio: OI_NROOM.AUD RESEARCHO: Inherits: ^RESEARCH @@ -119,12 +95,6 @@ LIGHTO: Owner: ordos RenderBuildingWarFactory: Image: LIGHTO - ProductionQueue@Vehicle: - ReadyAudio: OI_UNRDY.AUD - QueuedAudio:OI_TRAIN.AUD - OnHoldAudio: OI_HOLD.AUD - CancelledAudio: OI_CANCL.AUD - BlockedAudio: OI_NROOM.AUD HEAVYO: Inherits: ^HEAVY @@ -133,12 +103,6 @@ HEAVYO: Owner: ordos RenderBuildingWarFactory: Image: HEAVYO - ProductionQueue@Vehicle: - ReadyAudio: OI_UNRDY.AUD - QueuedAudio:OI_TRAIN.AUD - OnHoldAudio: OI_HOLD.AUD - CancelledAudio: OI_CANCL.AUD - BlockedAudio: OI_NROOM.AUD RADARO: Inherits: ^RADAR @@ -151,14 +115,6 @@ STARPORTO: Buildable: Prerequisites: radaro Owner: ordos - ProductionAirdrop: - ReadyAudio: OI_REINF.AUD - ProductionQueue@Vehicle: - QueuedAudio: OI_ORDER.AUD - ReadyAudio: - OnHoldAudio: OI_HOLD.AUD - CancelledAudio: OI_CANCL.AUD - BlockedAudio: OI_NROOM.AUD REPAIRO: Inherits: ^REPAIR @@ -179,6 +135,14 @@ MCVO: RenderUnit: Image: DMCV +MCVO.starport: + Inherits: MCVO + Buildable: + Queue: Ship + BuiltAt: starporto + Valued: + Cost: 1499 + HARVESTERO: Inherits: ^HARVESTER Buildable: @@ -187,11 +151,31 @@ HARVESTERO: RenderUnit: Image: HARVESTER +HARVESTERO.starport: + Inherits: HARVESTERO + Buildable: + Queue: Ship + BuiltAt: starporto + Valued: + Cost: 895 + COMBATO: Inherits: ^COMBAT + Tooltip: + Icon: combatoicon Buildable: Prerequisites: heavyo Owner: ordos + RenderUnitTurreted: + Image: COMBATO + +COMBATO.starport: + Inherits: COMBATO + Buildable: + Queue: Ship + BuiltAt: starporto + Valued: + Cost: 595 RAIDER: Inherits: ^Vehicle @@ -237,6 +221,14 @@ QUADO: RenderUnit: Image: QUAD +QUADO.starport: + Inherits: QUADO + Buildable: + Queue: Ship + BuiltAt: starporto + Valued: + Cost: 295 + SIEGETANKO: Inherits: ^SIEGETANK Buildable: @@ -245,6 +237,14 @@ SIEGETANKO: RenderUnitTurreted: Image: SIEGETANK +SIEGETANKO.starport: + Inherits: SIEGETANKO + Buildable: + Queue: Ship + BuiltAt: starporto + Valued: + Cost: 495 + MISSILETANKO: Inherits: ^MISSILETANK Buildable: @@ -253,6 +253,14 @@ MISSILETANKO: RenderUnit: Image: MISSILETANK +MISSILETANKO.starport: + Inherits: MISSILETANKO + Buildable: + Queue: Ship + BuiltAt: starporto + Valued: + Cost: 599 + CARRYALLO: Inherits: ^CARRYALL Buildable: @@ -262,6 +270,14 @@ CARRYALLO: RenderUnit: Image: CARRYALL +CARRYALLO.starport: + Inherits: CARRYALLO + Buildable: + Queue: Ship + BuiltAt: starporto + Valued: + Cost: 999 + DEVIATORTANK: Inherits: ^Tank Valued: diff --git a/mods/d2k/rules/structures.yaml b/mods/d2k/rules/structures.yaml index 7676bb22df..a71a1c2d47 100644 --- a/mods/d2k/rules/structures.yaml +++ b/mods/d2k/rules/structures.yaml @@ -21,14 +21,6 @@ Value: 2500 BaseBuilding: ProductionBar: - ProductionQueue@Building: - Type: Building - BuildSpeed: .4 - LowPowerSlowdown: 3 - ProductionQueue@Defense: - Type: Defense - BuildSpeed: .4 - LowPowerSlowdown: 3 ^POWER: Inherits: ^Building @@ -86,10 +78,6 @@ Produces: Infantry PrimaryBuilding: ProductionBar: - ProductionQueue@Infantry: - Type: Infantry - BuildSpeed: .4 - LowPowerSlowdown: 3 ^HIGHTECH: Inherits: ^Building @@ -120,10 +108,6 @@ Produces: Plane PrimaryBuilding: ProductionBar: - ProductionQueue@Plane: - Type: Plane - BuildSpeed: .4 - LowPowerSlowdown: 3 ^RESEARCH: Inherits: ^Building @@ -238,7 +222,7 @@ Cost: 1000 Tooltip: Name: Light Factory - Description: produces light vehicles. + Description: Produces light vehicles. Building: Power: -30 Footprint: xxx xxx @@ -259,10 +243,6 @@ Produces: Vehicle PrimaryBuilding: ProductionBar: - ProductionQueue@Vehicle: - Type: Vehicle - BuildSpeed: .4 - LowPowerSlowdown: 3 ^HEAVY: Inherits: ^Building @@ -273,7 +253,7 @@ Cost: 2000 Tooltip: Name: Heavy Factory - Description: produces tanks + Description: Produces heavy vehicles. Building: Power: -30 Footprint: _x_ xxx xxx @@ -295,10 +275,6 @@ Produces: Vehicle PrimaryBuilding: ProductionBar: - ProductionQueue@Vehicle: - Type: Vehicle - BuildSpeed: .4 - LowPowerSlowdown: 3 ^RADAR: RequiresPower: @@ -331,7 +307,7 @@ Cost: 2000 Tooltip: Name: Starport - Description: Provides a dropzone for vehicle reinforcements + Description: Dropzone for cheap reinforcements Buildable: Queue: Building BuildPaletteOrder: 60 @@ -351,13 +327,10 @@ SpawnOffset: -24,0 ExitCell: 3,1 ProductionAirdrop: - Produces: Vehicle + Produces: Ship ActorType: frigate - ProductionQueue@Vehicle: - Type: Vehicle - BuildSpeed: .4 - LowPowerSlowdown: 3 ProductionBar: + PrimaryBuilding: ^WALL: Buildable: @@ -520,12 +493,6 @@ STARPORTC: Inherits: ^STARPORT ProductionAirdrop: ReadyAudio: - ProductionQueue@Vehicle: - QueuedAudio: - ReadyAudio: - OnHoldAudio: - CancelledAudio: - BlockedAudio: -Buildable: PALACEC: @@ -537,12 +504,6 @@ HEAVYC: -Buildable: RenderBuildingWarFactory: Image: HEAVYC - ProductionQueue@Vehicle: - ReadyAudio: - QueuedAudio: - OnHoldAudio: - CancelledAudio: - BlockedAudio: #4PLATES: # Inherits: ^WALL diff --git a/mods/d2k/rules/system.yaml b/mods/d2k/rules/system.yaml index 0e78f11d9f..7ee0130fd7 100644 --- a/mods/d2k/rules/system.yaml +++ b/mods/d2k/rules/system.yaml @@ -1,5 +1,41 @@ Player: TechTree: + ClassicProductionQueue@Building: + Type: Building + BuildSpeed: .4 + LowPowerSlowdown: 3 + QueuedAudio: Building + ReadyAudio: BuildingReady + BlockedAudio: NoRoom + ClassicProductionQueue@Defense: + Type: Defense + BuildSpeed: .4 + LowPowerSlowdown: 3 + QueuedAudio: Building + ReadyAudio: BuildingReady + BlockedAudio: NoRoom + ClassicProductionQueue@Vehicle: + Type: Vehicle + BuildSpeed: .4 + LowPowerSlowdown: 3 + BlockedAudio: NoRoom + ClassicProductionQueue@Infantry: + Type: Infantry + BuildSpeed: .4 + LowPowerSlowdown: 3 + BlockedAudio: NoRoom + ClassicProductionQueue@Ship: + Type: Ship + BuildSpeed: .4 + LowPowerSlowdown: 3 + BlockedAudio: NoRoom + QueuedAudio: OrderPlaced + ReadyAudio: + ClassicProductionQueue@Plane: + Type: Plane + BuildSpeed: .4 + LowPowerSlowdown: 3 + BlockedAudio: NoRoom PlaceBuilding: SupportPowerManager: ConquestVictoryConditions: diff --git a/mods/d2k/uibits/tabs.png b/mods/d2k/uibits/tabs.png index 20badc72ea909ce070b3b39b77ada2571bc2d23b..c2842f134f3c88b3af7587cbbd222fa1ace0cf7b 100644 GIT binary patch delta 9673 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 Rsto!!RA0VQtd_S3{XYOGYrX&g delta 7954 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