490 Commits

Author SHA1 Message Date
mehmed-faheim-arslan 39b1311fac Allow players to set rally points on allied buildings
Instead of storing a single flat list of positions and data per
building, RallyPoint now stores them keyed by player ID. This lets
mutual allies independently set and display rally points on each
other's structures.

The GUI now allows selecting allied buildings with a rally point
and only shows the viewing player's own rally point data.
GuiInterface gets an OnUpdate handler to keep displayed positions
in sync when rally point targets move.

GetRallyPointCommands now takes raw position and data arrays instead
of a component reference. The network command field is also renamed
from "entities" to "structures".

Fixes #3115
2026-06-10 00:09:48 +02:00
Atrik 0ad6d36049 Fix Trainer-ProductionQueue sync OnOwnershipChange
Use ProductionQueue.RemoveItem() instead of direct StopBatch() calls
to ensure both components stay in sync when entity training lists
change due to ownership changes.

Fixes #8691
2026-02-17 16:07:24 +01:00
Atrik fb1c0d2a82 Fix renamed entities on TurretPoint
Some units would retain an undue HeightOffset after renaming
while being on a TurretPoint.

Fixes #8651
Fixes #2004
2026-02-04 11:05:07 +01:00
Atrik 2735cdc156 Add unit tests for multi-level class sorting 2026-01-23 17:20:11 +01:00
Dunedan 93ce94655d Use @stylistic/brace-style for eslint
Up to now `eslint-plugin-brace-rules` was used to enforce a common brace
style for JavaScript code. This plugin was however updated the last time
over 9 years ago and will be incompatible with ESLint v10, as that
[removes `context.getSourceCode()`][1], the plugin relies on.

To keep the eslint config working with ESLint v10, this replaces
`eslint-plugin-brace-rules` with the [`@stylistic/brace-style`][2] rule
from `@stylistic/eslint-plugin`, a package we already use.

While `@stylistic/brace-style` doesn't offer an option to format braces
in exactly the same way as before, the "allman" style seems to be the
one closest to the existing code.

[1]: https://eslint.org/blog/2025/11/eslint-v10.0.0-alpha.0-released/#removed-deprecated-rule-context-members
[2]: https://eslint.style/rules/brace-style
2026-01-12 21:33:52 +01:00
Atrik 0f58a8511c Add a test for IsRearrangementAllowed 2025-12-18 10:22:27 +01:00
Atrik 45fd632cef Add a test for AttemptObstructionMitigation 2025-12-18 10:22:27 +01:00
Atrik be6670df89 Add a test for GetClosestMemberFunctions 2025-12-18 10:22:27 +01:00
real_tabasco_sauce 94d3699ce4 Fix market exploit by basing the price change on the amount purchased.
Fix credit to Atrik
Credit for test fix goes to Itms

Fixes #6760
2025-10-29 15:29:28 +01:00
Ralph Sennhauser 0baafb5375 Don't set animation for production with UnitAi
Entities with a production queue when queueing or unqueueing items for
will set an appropriate animation which is desired for structures, like
the forge producing smoke, but not so for units as it interferes with
UnitAi animation state.

Units don't have animations for training or researching so the idle
animation will be set in that case instead. If such a unit is in motion
this results in the unit gliding. To avoid this just skip setting an
animation for entities having a UnitAI.

Reported-by: wowgetoffyourcellphone
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-10-07 19:25:21 +02:00
wowgetoffyourcellphone 3592814aa8 Gendered Civilians
Adds a randomly male and female Civilian unit which replaces the old "Female Citizen" for each civ.
New actors, new portraits, some new body textures, but the same stats as the old Female Citizen.
Updates maps, technologies, skirmish templates, et al. including the Tutorials.

Co-Authored By: Itms
Reviewed By: Vantha
2025-09-02 10:23:44 +02:00
elexis 8b11f6a151 Delete redundant per player CheatsEnable property
We do not see benefit in enabling cheats for certain players but not for the rest.
The AI cheats irrespective of the CheatsEnable property.

This patch uses InitAttributes to check if cheats are enabled making it
slightly harder to workaround it from js.

See SetLosRevealAll in CCmpAIManager and PETRA.Config.prototype.Cheat.

refs 996a32125c / #879 (AI reveal los);
refs 202a02568b /  #1555 (cheat codes, cheatsEnable for AI);
refs 25293ce0cc  (AIDiff GatherRateMultiplier),
refs f6e0c4c5a4  / #2019 (no more cheatsEnable for AI),
refs 3246b02cda  (SetTradeRateMultiplier)
refs de72510c60  / #6302 (move from InitGame.js to petra/config.js)
2025-08-25 20:41:31 +02:00
phosit 582541ea80 Enable eslint rule 'no-useless-assignment'
Enable rule 'no-useless-assignment' [1] and fix violations.

[1] https://eslint.org/docs/latest/rules/no-useless-assignment
2025-08-01 11:26:40 +02:00
Stan e35fce8524 Move globals to the PopCapManager prototype. 2025-07-27 19:00:04 +02:00
Ralph Sennhauser 25c53cb0ac Enable eslint style rule 'keyword-spacing'
After Stan suggesting change in a review comment just enable the rule
'keyword-spacing' [1] and fix violations so this is no longer a topic in
spirit of #7812.

[1] https://eslint.style/rules/keyword-spacing

Ref: #7245
Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-06-25 14:34:12 +02:00
Ralph Sennhauser b382a4c47a Enable eslint rule 'no-sparse-arrays'
Enable recommended rule 'no-sparse-arrays' [1] and manually fix
violations. Solution proposed by elexis.

[1] https://eslint.org/docs/latest/rules/no-sparse-arrays

Fixes: #8068
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-06-17 19:21:19 +02:00
Ralph Sennhauser f29f0b7fd1 Enable eslint rule 'no-prototype-builtins'
Enable recommended rule 'no-prototype-builtins' [1] and manually fix violations.

[1] https://eslint.org/docs/latest/rules/no-prototype-builtins

Ref: #8068
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-06-17 13:47:11 +02:00
Lancelot de Ferrière ff754b8bb1 Reset modifiers properly when changing ownership
The ModifiersManagers needs to reset caches and recompute modifiers when changing ownership. However, the code only did this for global modifiers for the new player entity, not the old player entity. This meant we would not reset all modifiers, and could OOS (#7996) or lead to incorrect values.

Fixes #7996

Reported by: Itms
2025-06-15 21:37:00 +02:00
Ralph Sennhauser 0ce889ca6d Use stylistic for deprecated eslint rules
During the eslint 8 cycle the formatting rules were split out [1],
deprecating the corresponding rules in core.

This replaces all rules that where moved to @stylistic/eslint-plugin [2]
and accounts for the difference in the indenting rule behaviour.

To allow the pre-commit import hack to continue to work with the
stylisitc plugin for a recent nodejs version to be used.

[1] https://eslint.org/blog/2023/10/deprecating-formatting-rules/
[2] https://eslint.style/packages/default

Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-06-10 21:23:23 +02:00
Stan 167020c05c Fix broken build restrictions
In f3ac9e9669 the fail condition was broken causing it to allow building on restricted areas.

Add a test to ensure correct behavior for this case.

Reported by: @wowgetoffyourcellphone
Pull Request: #8021
2025-05-31 10:58:14 +02:00
Ralph Sennhauser 97d76b1495 Fix eslint rule 'prefer-const'
Manual fixes needed for:
eslint --no-config-lookup --rule '"prefer-const": 1'

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-05-28 19:34:46 +02:00
Ralph Sennhauser 7b4cf11e25 Fix eslint rule 'no-shadow'
Manual fixes needed for:
eslint --no-config-lookup --rule '"no-shadow": 1'

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-05-17 09:48:36 +02:00
Ralph Sennhauser 74f475f9fd Fix eslint rule 'no-return-assign'
Manual fixes needed for:
eslint --no-config-lookup --rule '"no-return-assign": 1'

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-05-13 20:12:35 +02:00
Ralph Sennhauser 88eea5c7e3 Fix eslint rule 'prefer-const' in components/tests
eslint --no-config-lookup --fix --rule '"prefer-const": 1' \
    binaries/data/mods/public/simulation/components/tests

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-05-11 10:03:30 +02:00
Ralph Sennhauser 2e090c2daa Fix eslint rule 'prefer-const' in components/tests/[A-R]*
eslint --no-config-lookup --fix --rule '"prefer-const": 1' \
    binaries/data/mods/public/simulation/components/tests

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-05-11 09:06:57 +02:00
Ralph Sennhauser 81c119bf39 Fix eslint rule 'semi'
eslint --no-config-lookup --fix --rule '"semi": 1'

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-05-03 14:13:14 +02:00
Ralph Sennhauser 24c47c81c7 Fix eslint rule 'no-multi-spaces'
eslint --no-config-lookup --fix --rule '"no-multi-spaces": ["warn", { "ignoreEOLComments": true, }]'

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-05-03 10:50:50 +02:00
Ralph Sennhauser b6df170303 Fix eslint indent rule
eslint --no-config-lookup --fix --rule 'indent:  ["warn", "tab", { "outerIIFEBody": 0, }]'

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-05-03 09:39:58 +02:00
Lancelot de Ferrière 0a4bfefb1e Fix modifiersManager cache incorrectly storing values with player-wide modifier
The cache would take the value post-player-modification, which is incorrect. This would usually just make caching fail, but could trigger worse problems if the post-player value is also used in other situations.

One such situation leads to an OOS for britons.

Thanks to elexis for the thorough investigation.

Fixes #7634
2025-04-19 12:37:24 +02:00
Vantha 5741f77c6e Add a 'team population' gamesetting
Remove the world population setting from the game setup.
Add a dropdown for choosing the "Population Cap Type".
(-> containing Player Population, World Population, Team Population)

Use a single "Population Cap" dropdown adapting to the pop cap types.
Move all population data into a single .json file.

New system component "PopulationCapManager" for distributing pop caps.

Resolves: #6918
2025-03-06 13:25:43 +01:00
Lancelot de Ferrière 2f7ac026c1 Avoid idle 'flicker' because of regular formation regroups
Since 71a61d5f50, formations regularly regroup. However, units already at their correct offset should remain idle. This doesn't happen as we cannot check if we are at destination.
This exposes that and handles things properly... Unfortunately UnitAI has already left the IDLE state at this point, so we still get counted as no-longer idle for a turn.
To fix this, try and detect that particular situation without triggering infinite loops.
2025-01-02 16:59:13 +01:00
Stan 9e5e2708f4 Raise Loot.js and Looter.js' coverage to 100% 2024-11-13 23:19:56 +01:00
Stan d116d27327 Fix testing components with no Init method() 2024-11-13 23:19:56 +01:00
Stan 68d3aa1af9 Make PACKING_INTERVAL a static class member.
This allows mods to edit it and the coverage to work better.
See: https://github.com/StanleySweet/zeroad-coverage-generator/issues/1
2024-10-27 21:34:26 +01:00
Dunedan f58dc9b485 Remove unnecessary executable bits
This removes the executable bits from files which aren't supposed to
have them.

Also removes shebangs for files which aren't supposed to be executable.
2024-08-26 07:46:34 +02:00
Freagarach a10e025324 Fix typo in c917c39a0d.
Reported by @Mr.lie at
https://wildfiregames.com/forum/topic/108069-diplomacy-broken-since-rev-27722.
Based on a patch by: @elexis
This was SVN commit r27824.
2023-09-04 13:05:36 +00:00
Freagarach ce25351443 Fix typo in CanTrade.
Introduced in c917c39a0d.
Reported by @gameboy at
https://wildfiregames.com/forum/topic/107586-an-error-occurred/?do=findComment&comment=553753.

Also adds a small test.

Differential revision: https://code.wildfiregames.com/D5060
Reviewed by: @wraitii
This was SVN commit r27737.
2023-06-23 12:58:14 +00:00
Freagarach c917c39a0d Pull Diplomacy out of cmpPlayer.
Who says only players should be able to conduct diplomacy?
Also separation of concerns, more maintainable files.

Differential revision: https://code.wildfiregames.com/D4921
Comments by: @elexis, @Stan
Refs. #5894

This was SVN commit r27722.
2023-06-19 06:33:33 +00:00
Freagarach fdd30b3d85 Some cleaning in the Barter component.
- Add explicit variables for magic values.
- `let`s to `const`.
- Don't start the regen timer when not needed.

Differential revision: https://code.wildfiregames.com/D4965
Comments by: @Stan
This was SVN commit r27707.
2023-06-16 06:25:36 +00:00
Freagarach 291f17b3c5 Reset speed when stopping.
And use an explicit function for running.

Differential revision: https://code.wildfiregames.com/D4957
Comments by: @Stan
This was SVN commit r27706.
2023-06-15 06:56:41 +00:00
Stan 91509290d6 Workaround TriggerHelper.js not being able to spawn units correctly because of promotion.
Avoid duplication by moving the function to Transform.js.
Add tests to Transform.js
Add tests to TurretHolder.js
Optimize slightly Trainer.js by removing some useless
Engine.QueryInterface calls.
Refs #6784 (symptoms in TriggerHelper.js are fixed underlying cause not)

`SkirmishReplacer` is called before the Modifier Manager so it does not
suffer the same fate.
Entities using `ChangeEntityTemplate` function are still affected.
Maps calling Engine.AddEntity directly are still affected.

Ideally this should be handled by hotloading components instead of
creating new entities each time. See =>
https://code.wildfiregames.com/D4991
Tested using:
https://github.com/0ADMods/trailer_tools/commit/908dd631d950b5050d1784530c65f29ccfc67913

Differential Revision: https://code.wildfiregames.com/D4984
This was SVN commit r27636.
2023-05-10 15:13:52 +00:00
Freagarach de72510c60 Fix Atlas warning on reinit.
AIDiff is undefined when calling InitGame. But this cheat stuff should
not be in the helper.
(Now people don't need to change the helper if they want a non-cheating
AI. @Silier)

This patch is favoured over @trompetin17's by Wilfy:
https://irclogs.wildfiregames.com/%230ad-dev/2023-01-16-QuakeNet-%230ad-dev.log
@ 21:14.

Reported by: @Langbart
Differential revision: https://code.wildfiregames.com/D4881
Fixes #6302

This was SVN commit r27463.
2023-01-18 07:56:03 +00:00
Freagarach 9bb9ff8b16 Add Requirements helper.
Allows more flexibility in e.g. the Identity requirements and unifies
the checking of requirements.
One can use the script at https://code.wildfiregames.com/P265 to fix
templates.

Differential revision: https://code.wildfiregames.com/D4514
Comments by: @elexis, @Stan
Fixes #6421

This was SVN commit r27245.
2022-11-24 11:20:11 +00:00
Freagarach 966727b52e Make the player state an enum.
So we don't need to hassle with strings all over the place.

Differential revision: D4504
Comments by: @Silier
This was SVN commit r27242.
2022-11-22 07:54:11 +00:00
Freagarach 856e876148 Only have capturing entities contribute to the capture regenrate.
Only entities which have capture attack themselves will contribute to
the regen-rate of a structure.
The `garrisonRegenRate` is now a multiplier how much each unit
contributes their strength.

Quite some gameplay change, but we can experiment with this.

Differential revision: https://code.wildfiregames.com/D4679
Comments by: @chrstgtr, @marder, @wraitii
This was SVN commit r27142.
2022-10-10 05:36:27 +00:00
marder a80ce526b7 [Fix] Patch globalscripts technology template helper after 8d80a2186e and the ProductionQueue split
Patch by @s0600204.

This lets all technologies show up correctly in-game and in the
structure tree again.

accepted by: @marder @Freagarach
Fixes: #6587

Differential Revision: https://code.wildfiregames.com/D4755
This was SVN commit r27042.
2022-08-10 21:49:15 +00:00
Freagarach fd08ab051f Fix other civs being able to upgrade Han CC to Court.
This ensures the `{civ}` and `{native}` tags are (properly) supported
for upgrades and uses it for the Han CC.

Reported on the forums
(https://wildfiregames.com/forum/topic/82754-alpha-26-pre-releaserelease-candidate-build-testing/page/10/#comment-508908)
by @Gurken Khan.
Differential revision: https://code.wildfiregames.com/D4733
Comments by: @Stan, @wowgetoffyourcellphone
This was SVN commit r27008.
2022-07-15 17:16:00 +00:00
marder efc2d39372 Fix a comment and rename the formation angle function to better reflect what it does
wrong comment noticed by: @Silier
accepted by : @Freagarach

Differential revision: https://code.wildfiregames.com/D4658
This was SVN commit r26893.
2022-05-20 07:02:22 +00:00
marder dec727ce8e Fix missing parentheses in formation turning angle calculation
The function that is calculating the difference between the two angles
is missing some parentheses.

Didn't notice it sooner as it works in 95% of all cases without them,
but sometimes you can see the formation doing a wrong turn.

reviewed by : @Freagarach

Differential revision: https://code.wildfiregames.com/D4626
This was SVN commit r26874.
2022-05-11 15:22:54 +00:00
Freagarach ed4e07e594 Allow setting the passability class depending on formation members.
Improves pathfinding for the general case (no large entities in a
formation).

Differential revision: https://code.wildfiregames.com/D4605
Comments by: @marder, @Stan, @wraitii
This was SVN commit r26873.
2022-05-11 14:47:16 +00:00