You Must Construct Additional... (YMCA) was created to make mass battles great again. If you have played titles like Age of Empires II, Supreme Commander or Rusted Warfare, these games sometimes end up in games where two teams just keep pumping masses of units into each other. We think this meat grinder party is awesome and desirable, so we have created a game that aims to provide this experience reliably. If you look at those great games, the mass battles unfortunately only happen occassionaly, in AoE2 it is because most games end in Castle Age, when knights give one side a too big advantage because eco raids were succesful, but once it goes into the late game, it is all about just pumping more and more units from many production facilities into the enemy, in this mode it is important to keep looking at the enemy unit composition and constantly adapt. In Supreme Commander these mass battles are in principle core of the game play, but the exponential growing economy is very fragile, units are built quite slow, so either rushes end the game very fast or a player outgrows the other, so that only a few games happen to have a balance of forces supplying the meat grinder. Rusted Warfare does a better job at this, but unfortunately the economic balance has been changed a couple of years ago, so that everything got slower and early game rushes became stronger. Still it is a good game if you are looking for mass battles.
Another inspiration for this mod was Combined Arms, another OpenRA mod, which was not only an inspiration, but even from which this mod was forked. It is a testament of what is possible with the Command & Conquer universe and we highly encourage you to play it, even though it is very unlikely you don't know it yet ;-)
Find other players on our Discord:
Discord.gg
So let's have a look at the core concepts of YMCA:
1. This game focuses more on strategic decisions, mostly how to scale up your economy and your unit composition. Having the right mix of units is more important than micro around the enemy units.
2. Strong Rock-Paper-Scissor cycles. Strategy games without this concept are very rare, but they differ a lot regarding the strength of this concept. Strength means how hard units counter each other. For example in games like Starcraft, units do not counter each other strongly. You can still win with a certain unit type against it's counter if your micro management is good and your opponent is not playing attention. This means depending on the situation it is not clear if Zealots will beat Siege Tanks or vice versa. In Command & Conquer it does not really matter how you use Conscripts against Tanya. Strong Rock-Paper-Scissor cycles shift the importance of micro management away in favor of strategical decisions mostly unit composition.
3. Linear economic scaling. If you have 10 war factories those will produce 2 times faster than 5 war factories. Classic C&Cs and OpenRA have sub-linear scaling, which means having 5 instead of 1 war factory will not make your production 5 times faster but rather 2 times faster. In YMCA we are consciously chosing linear scaling, because we want this game to boom very fast and arrive at mass battles fast. This does not mean that rushes do not work, but for them to work you need a rather small map or an opponent who does not scout. Otherwise you have much more opportunity to build defense units in the time frame in which the rusher is coming. In most RTS if scaling is linear the production queues are parallel. Here this is different, we use the classic production queue, this means all factories produce the same unit, but this production is faster. We pick this combination because it needs the least clicks and is easiest to oversee when organizing your production. Along with this comes infinite production, so if you queue more than 10 of the same unit it is just produced infinitely. These choices are made to reduce the necessary APM (actions per minute) to be a good player. Keep in mind that linear production scaling also applies to buildings, so additional construction yards are crucial in expanding bases quickly. The key takeway here is "You Must Consctruct Additional..." and for ... you can basically enter everything - not just Pylons.
4. Complex armor and weapon system. Beside the usual armor classes like infantry, light and heavy, there is also reflector armor and the point defense laser in addition. The latter is not a class, but it intercepts incoming projectiles, which means it counters missiles and cannon shells. A tank that is weak against projectiles becomes a counter to those once upgraded with point defense laser. In contrast this system does not provide any help against energy weapons (Tesla, Laser, Prism), combined with the higher cost the upgrade makes a tank weak against energy weapons. Energy weapons in contrast are weak against Reflector armor, which is weak against projectile weapons. This complex weapon and armor system can lead to drastic changes in the role of a unit, depending on which upgrades are chosen for it. However the combat mechanics are not complicated. There are no hidden bonus damages, no complicated armor-damage relations, just click a unit and it shows how much damage % it deals against which armor type.
The YMCA - Cameo Friendship Tournament is over! We have a winner!
It was a great event, with a lot new strategies being developed and some very surprising turnarounds.
Finals:
Finals Loser Bracket:
Semi Finals Loser Bracket:
Quarter Finals Loser Bracket #1:
Quarter Finals Loser Bracket #2:
Semi Finals:
Quarter Finals#1:
Quarter Finals #2
Loser Bracket opening match:
Congrats to the winners of the tournament!
#1 David + TeaCommissar + Sovet_33
#2 Patrick + AedisToru + Nils
Prize money has been paid out, firstborns were named, what a time to be alive!
It was a great group stage and here is the coverage.
The games of the world championships 2025 have been covered and can be watched on YT, the links will be here. A friendship tournament will be held together...
At the last weekend we have held the World Championships of YMCA another time and it was an unforgettable experience!
Another small update with mostly bug fixes and a few new models for some units!
A small update to fix some crashes and add 2 new models for nod units:
A big swing of other bugs were fixed! We are getting closer to a stable version after the big engine upgrade.
After the huge engine upgrade we had many crashes and bugs but now we have found the last super annoying desync! The new formation command by dragging...
More fixes, more nice. 0.96 is approaching stable runtimes!
After the rushed release yesterday to fix the last minute bugs, now all other bugs that players found are fixed now. I'm sure we will find more, so stay...
OpenRA engine version e5233a123319072a7b94c2922bb3a4a358c64602
OpenRA Language: en
You Must Contruct Additional... mod version $v0.95.47
on map 7722c12d256cf41542a86eb930967ef6fd947230 (Vegetation by hamb/Chris Forbes).
Date: 2025-02-05 11:29:20Z
Operating System: Windows (Microsoft Windows NT 10.0.19045.0)
Runtime Version: .NET CLR 6.0.36
Installed Language: ru (Installed) ru (Current) ru (Current UI)
Exception of type `System.IO.FileNotFoundException`: File not found: yf23icon.shp
at OpenRA.Mods.Common.Graphics.FileNotFoundSequence.OpenRA.Graphics.ISpriteSequence.get_Tick() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Graphics/DefaultSpriteSequence.cs:line 112
at OpenRA.Graphics.Animation.PlaySequence(String sequenceName) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Graphics/Animation.cs:line 126
at OpenRA.Graphics.Animation.PlayThen(String sequenceName, Action after) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Graphics/Animation.cs:line 171
at OpenRA.Mods.Common.Traits.ArmyUnit..ctor(ActorInfo actorInfo, Player owner) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs:line 156
at OpenRA.Mods.Common.Traits.PlayerStatistics.<>c__DisplayClass24_0.<.ctor>b__0(String name) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs:line 69
at OpenRA.Mods.Common.Traits.UpdatesPlayerStatistics.OpenRA.Traits.INotifyCreated.Created(Actor self) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Player/PlayerStatistics.cs:line 265
at OpenRA.Actor.Initialize(Boolean addToWorld) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Actor.cs:line 207
at OpenRA.Mods.CA.Traits.InterceptorPower.SendAirstrike(Actor self, WPos target, Nullable`1 facing) in /home/runner/work/YMCA/YMCA/OpenRA.Mods.CA/Traits/SupportPowers/InterceptorPower.cs:line 156
at OpenRA.Mods.CA.Traits.InterceptorPower.Activate(Actor self, Order order, SupportPowerManager manager) in /home/runner/work/YMCA/YMCA/OpenRA.Mods.CA/Traits/SupportPowers/InterceptorPower.cs:line 82
at OpenRA.Mods.Common.Traits.SupportPowerInstance.Activate(Order order) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/SupportPowers/SupportPowerManager.cs:line 262
at OpenRA.Actor.ResolveOrder(Order order) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Actor.cs:line 430
at OpenRA.Network.UnitOrders.ProcessOrder(OrderManager orderManager, World world, Int32 clientId, Order order) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Network/UnitOrders.cs:line 350
at OpenRA.Network.OrderManager.ProcessOrders() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Network/OrderManager.cs:line 244
at OpenRA.Network.OrderManager.TryTick() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Network/OrderManager.cs:line 314
at OpenRA.Game.InnerLogicTick(OrderManager orderManager) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 639
at OpenRA.Game.LogicTick() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 654
at OpenRA.Game.Loop() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 823
at OpenRA.Game.Run() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 876
at OpenRA.Game.InitializeAndRun(String[] args) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 308
at OpenRA.WindowsLauncher.WindowsLauncher.RunGame(String[] args) in /home/runner/work/YMCA/YMCA/engine/OpenRA.WindowsLauncher/Program.cs:line 71
oh forgot to comment, this was already fixed in one of the previous releases
OpenRA engine version 1a22d86dfdbffa1497c835a9cfafc207eeded3c2
OpenRA Language: en
You Must Contruct Additional... mod version $v0.95.35
on map 100b729af0e86e1ed13d83f77f98daca1210e60e (Crossfire by Janitor).
Date: 2024-07-27 12:39:15Z
Operating System: Windows (Microsoft Windows NT 10.0.19045.0)
Runtime Version: .NET CLR 6.0.32
Installed Language: ru (Installed) ru (Current) ru (Current UI)
Exception of type `System.InvalidOperationException`: Model `suk.conc` does not have any sequences defined.
at OpenRA.Mods.Cnc.Graphics.VoxelModelCache.GetModelSequence(String model, String sequence) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Cnc/Graphics/VoxelModelSequenceLoader.cs:line 104
at OpenRA.Mods.Common.Traits.Render.WithVoxelBody..ctor(Actor self, WithVoxelBodyInfo info) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs:line 0
at OpenRA.Mods.Common.Traits.Render.WithVoxelBodyInfo.Create(ActorInitializer init) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Render/WithVoxelBody.cs:line 29
at OpenRA.Actor..ctor(World world, String name, TypeDictionary initDict) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Actor.cs:line 161
at OpenRA.Mods.Common.Traits.Production.<>c__DisplayClass7_0.<DoProduction>b__0(World w) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Production.cs:line 139
at OpenRA.World.Tick() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/World.cs:line 448
at OpenRA.Game.InnerLogicTick(OrderManager orderManager) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 639
at OpenRA.Game.LogicTick() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 654
at OpenRA.Game.Loop() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 823
at OpenRA.Game.Run() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 876
at OpenRA.Game.InitializeAndRun(String[] args) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 308
at OpenRA.WindowsLauncher.WindowsLauncher.RunGame(String[] args) in /home/runner/work/YMCA/YMCA/engine/OpenRA.WindowsLauncher/Program.cs:line 71
fixed by today's release
OpenRA engine version 1a22d86dfdbffa1497c835a9cfafc207eeded3c2
OpenRA Language: en
You Must Contruct Additional... mod version $v0.95.33
on map d1ef5e6724df5fd974e069c2bd922a4a11588646 (Singles by Nuke'm Bro.).
Date: 2024-07-19 07:22:23Z
Operating System: Windows (Microsoft Windows NT 10.0.19045.0)
Runtime Version: .NET CLR 6.0.31
Installed Language: ru (Installed) ru (Current) ru (Current UI)
Exception of type `System.Collections.Generic.KeyNotFoundException`: The given key 'Mammoth' was not present in the dictionary.
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at OpenRA.Mods.Common.Traits.GiveUnitCrateAction.GetSuitableCells(CPos near, String unitName)+MoveNext() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Crates/GiveUnitCrateAction.cs:line 102
at System.Linq.Enumerable.Any[TSource](IEnumerable`1 source)
at OpenRA.Mods.Common.Traits.GiveUnitCrateAction.CanGiveTo(Actor collector) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Crates/GiveUnitCrateAction.cs:line 60
at OpenRA.Mods.Common.Traits.GiveUnitCrateAction.GetSelectionShares(Actor collector) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Crates/GiveUnitCrateAction.cs:line 73
at OpenRA.Mods.Common.Traits.Crate.<>c__DisplayClass12_0.<OnCrushInner>b__0(CrateAction a) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Crates/Crate.cs:line 153
at System.Linq.Enumerable.SelectEnumerableIterator`2.MoveNext()
at System.Linq.Enumerable.Sum[TSource](IEnumerable`1 source, Func`2 selector)
at OpenRA.Mods.Common.Traits.Crate.OnCrushInner(Actor crusher) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Crates/Crate.cs:line 155
at OpenRA.Mods.Common.Traits.Crate.OpenRA.Mods.Common.Traits.INotifyCrushed.OnCrush(Actor self, Actor crusher, BitSet`1 crushClasses) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Crates/Crate.cs:line 109
at OpenRA.Mods.Common.Traits.Mobile.CrushAction(Actor self, Func`2 action) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Mobile.cs:line 586
at OpenRA.Mods.Common.Traits.Mobile.SetPosition(Actor self, CPos cell, SubCell subCell) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Traits/Mobile.cs:line 470
at OpenRA.Mods.Common.Activities.Move.MoveSecondHalf.OnComplete(Actor self, Mobile mobile, Move parent) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Activities/Move/Move.cs:line 566
at OpenRA.Mods.Common.Activities.Move.MovePart.Tick(Actor self) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Mods.Common/Activities/Move/Move.cs:line 459
at OpenRA.Activities.Activity.TickOuter(Actor self) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Activities/Activity.cs:line 108
at OpenRA.Traits.ActivityUtils.RunActivity(Actor self, Activity act) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Traits/ActivityUtils.cs:line 31
at OpenRA.Activities.Activity.TickChild(Actor self) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Activities/Activity.cs:line 144
at OpenRA.Activities.Activity.TickOuter(Actor self) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Activities/Activity.cs:line 108
at OpenRA.Traits.ActivityUtils.RunActivity(Actor self, Activity act) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Traits/ActivityUtils.cs:line 31
at OpenRA.Actor.Tick() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Actor.cs:line 262
at OpenRA.World.Tick() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/World.cs:line 441
at OpenRA.Game.InnerLogicTick(OrderManager orderManager) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 639
at OpenRA.Game.LogicTick() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 654
at OpenRA.Game.Loop() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 823
at OpenRA.Game.Run() in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 876
at OpenRA.Game.InitializeAndRun(String[] args) in /home/runner/work/YMCA/YMCA/engine/OpenRA.Game/Game.cs:line 308
at OpenRA.WindowsLauncher.WindowsLauncher.RunGame(String[] args) in /home/runner/work/YMCA/YMCA/engine/OpenRA.WindowsLauncher/Program.cs:line 71
fixed by Github.com
will be fixed in the next release
OpenRA engine version 842b42ec45fd5d5c975d38b051f60a56f4003204
OpenRA Language: en
You Must Contruct Additional... mod version $v0.95.24
on map ea1bcf382ea22f097b2b460954392727bf5f027c (Kay´s Warland by Kay).
Date: 2024-05-14 17:29:29Z
Operating System: Windows (Microsoft Windows NT 10.0.26120.0)
Runtime Version: .NET CLR 6.0.29
Installed Language: de (Installed) de (Current) de (Current UI)
Exception of type `System.NotImplementedException`: No rules definition for unit e4
at OpenRA.Actor..ctor(World world, String name, TypeDictionary initDict)
at OpenRA.Mods.Common.Traits.SpawnMapActors.WorldLoaded(World world, WorldRenderer wr)
at OpenRA.World.LoadComplete(WorldRenderer wr)
at OpenRA.Game.StartGame(String mapUID, WorldType type)
at OpenRA.Network.UnitOrders.ProcessOrder(OrderManager orderManager, World world, Int32 clientId, Order order)
at OpenRA.Network.OrderManager.ReceiveImmediateOrders(Int32 clientId, OrderPacket orders)
at OpenRA.Network.NetworkConnection.OpenRA.Network.IConnection.Receive(OrderManager orderManager)
at OpenRA.Sync.<>c__DisplayClass13_0.<RunUnsynced>b__0()
at OpenRA.Sync.RunUnsynced(World world, Action fn)
at OpenRA.Game.InnerLogicTick(OrderManager orderManager)
at OpenRA.Game.LogicTick()
at OpenRA.Game.Loop()
at OpenRA.Game.Run()
at OpenRA.Game.InitializeAndRun(String[] args)
at OpenRA.WindowsLauncher.WindowsLauncher.RunGame(String[] args)
is fixed by now
Getting fatel error when I try enter the game...
OpenRA engine version 0a06cf1789c66d8f5cf7566199187181aef0dbec
OpenRA Language: en
You Must Contruct Additional... mod version $v0.95.23
on map 0f86cd7333d4f558d9c7eb77cc55d58aabe8c02e (DeliriumShellmap by Darkademic).
Date: 2024-04-15 21:32:10Z
Operating System: Windows (Microsoft Windows NT 10.0.22631.0)
Runtime Version: .NET CLR 6.0.28
Installed Language: tr (Installed) tr (Current) tr (Current UI)
Exception of type `Eluant.LuaException`: [string "--[[..."]:15: module 'sandbox' not found:
no field package.preload['sandbox']
no file 'C:\Users\palad\OneDrive\Masaüstü\YMC\/lua/sandbox.lua'
no file '.\sandbox.dll'
no file 'C:\Users\palad\OneDrive\Masa st \YMC\sandbox.dll'
no file 'C:\Users\palad\OneDrive\Masa st \YMC\loadall.dll'
no file 'C:\Users\palad\OneDrive\Masa st \YMC\clibs\sandbox.dll'
no file 'C:\Users\palad\OneDrive\Masa st \YMC\clibs\loadall.dll'
no file '.\sandbox51.dll'
no file 'C:\Users\palad\OneDrive\Masa st \YMC\sandbox51.dll'
no file 'C:\Users\palad\OneDrive\Masa st \YMC\clibs\sandbox51.dll'
at Eluant.LuaRuntime.Call(IList`1 args)
at Eluant.LuaRuntime.DoBuffer(String str, String name)
at OpenRA.Scripting.ScriptContext..ctor(World world, WorldRenderer worldRenderer, IEnumerable`1 scripts)
at OpenRA.Mods.Common.Scripting.LuaScript.OpenRA.Traits.IWorldLoaded.WorldLoaded(World world, WorldRenderer worldRenderer)
at OpenRA.World.LoadComplete(WorldRenderer wr)
at OpenRA.Game.StartGame(String mapUID, WorldType type)
at OpenRA.Game.LoadShellMap()
at OpenRA.Mods.Common.LoadScreens.BlankLoadScreen.StartGame(Arguments args)
at OpenRA.Game.InitializeMod(String mod, Arguments args)
at OpenRA.Game.Initialize(Arguments args)
at OpenRA.Game.InitializeAndRun(String[] args)
at OpenRA.WindowsLauncher.WindowsLauncher.RunGame(String[] args)
Thanks for that report, do you get this error only from the installer version or also from the winportable version?
Installer version
can you try the winportable? Do you have other OpenRA mods installed? If yes, do they work?