Commit graph

67 commits

Author SHA1 Message Date
Vantha
8c36cc4879
Simplify GetTemplateData calls
Previously it was made so that "template data" was a sort of super type
of "entity state" and that the former could always be replaced by the
latter. Using this we can simplify some code passages by removing
GetTemplateData calls and using the entity's state directly instead.
2026-08-14 12:47:18 +02:00
Vantha
60970320e3
Rename the formation field to formationController
This patch renames the `unitAI.formation` field in entity states to
`unitAI.formationController` for clarity (there's `unitAI.formations`
as well, which was confusing)
2026-08-14 12:47:17 +02:00
Vantha
0a3bd16cb5
Optimise GetEntityState
GetEntityState is a performance-critical function in the GUI when a
large number of units are selected. The goal of this patch is to
increase the efficiency of it without modifying the returned states
visible to rest of the GUI in any way (it renames a few properties of
entities states or moves them around, but the information they contain
and the way to access it remain the complete same)

As explained the comments, certain parts (the template data) of an
entity state are "predictable" and can be reused between entities with
the same template.
What one has to account for, however, is that values of the template
data can be modified. This happens on two different levels:
Firstly, player-wide modifications, which apply to all entities owned
by that player. This includes stuff like bonuses from researched techs,
civs bonuses, team bonuses. And secondly, entity-local modifications,
which apply to individual entities. This includes buffs or debuffs from
status effects or auras (of other entities).

So we can construct a whole entity state by first just computing the
dynamic state (stuff like current hitpoints, which differs from entity
to entity) and then adding the (potentially already cached) template
data to it, which can be reused between entities with the same template
and owning player. And then overwrite the values affected by
entity-local modifications, which are usually just a few and even they
can be cached and reused for entities with the same owning player,
template, and entity-local modifications (identified by the
"modifications ID").

This saves the effort of retrieving/computing a ton of data each turn
and also saves the time it takes the engine to clone the data from the
simulation to the GUI (as the return value of the GUI interface call),
which previously took just as long as retrieving the entity states
themselves.

Since only the dynamic state is read from the components, a number of
small getter methods have become unused; they are kept (for now at
least) since they might be useful again in the future or for mods.
2026-08-14 12:47:04 +02:00
Vantha
6deca026b3
Add player to GetTemplateData calls where necessary
If no player is provided then the function falls back to the viewed
player, which is sometimes not the right one (like for observers), which
resulted in inconsistent/incorrect data being returned. This patch fixes
that.
2026-08-12 11:51:39 +02: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
f856565de9 Add formations paths to UnitMotionDebugOverlay
Formation controllers now display their movement paths when enabling
UnitMotion debug overlay.

Key changes:
- Formation controllers show long paths in blue and short paths in green
- Formation controllers path are rendered if selecting
  some of the formation's members
- Prevent the gui from making redundant calls to SetMotionDebugOverlay

Existing limitations (not regressions):
- Paths are often cleared before entities complete them
- Formation members have short paths that rarely get rendered
2025-12-29 14:30:14 +01:00
Ralph Sennhauser
b5227e03f7
Fix eslint rule 'prefer-const' in gui/session/selection
eslint --no-config-lookup --fix --rule '"prefer-const": 1' \
    binaries/data/mods/public/gui/session/selection*

Ref: #7812
Signed-off-by: Ralph Sennhauser <ralph.sennhauser@gmail.com>
2025-05-10 16:22:11 +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
paczek654321
48a4aa7f9a Changed the max selection size to 300 from 200.
Patch By: Serihilda
Fixes #6823
2024-12-16 16:35:16 +01:00
abian
798cff1f6f Left-click the portrait to follow the entity
- Left-clicking the portrait of a unit will make the camera follow that
   unit (before: no action). A tooltip informs the player of this
   possibility.

 - Left-clicking the portrait of a structure will make the camera focus on
   that structure (before: no action). A tooltip informs the player of
   this possibility.

 - Double-clicking a hero/treasure icon will make the camera follow that
   hero/treasure (before: just focus on that hero/treasure).

 - Some minor related changes.

Fixes #6879
2024-09-18 06:46:51 +02:00
Freagarach
9417a345d1 Allow selecting multiple non-owned entities when control all is on.
(Not with dragging, since that would be hard to use, UX-wise.)
It allows easier debugging; less switching between players.

Differential revision: https://code.wildfiregames.com/D4477
Comments by: @asterix, @Silier, @Stan
This was SVN commit r26327.
2022-02-09 07:02:14 +00:00
Freagarach
f66ca01603 Deselect only part of a formation when clicking the unit icon.
As requested by @wowgetoffyourcellphone to be more in line with
afc77e20a4.

Differential revision: https://code.wildfiregames.com/D4433
Tested by: @astrix, @wowgetoffyourcellphone
This was SVN commit r26221.
2022-01-15 13:44:43 +00:00
Freagarach
dfd9560748 Put the formation-selection feature behind a config.
Since it needs a better UX. (Introduced in a70a20fd42.)
Users can choose to still use it.

Differential revision: https://code.wildfiregames.com/D4360
Comment by: @wowgetoffyourcellphone
This was SVN commit r26076.
2021-12-15 08:07:59 +00:00
Freagarach
afc77e20a4 Ignore formation selection when clicking an unit icon.
It was deemed unintuitive to select the whole formation when clicking an
icon.

Differential revision: https://code.wildfiregames.com/D4295
Comments by: @alre, @Langbart, @marder, @wowgetoffyourcellphone
This was SVN commit r26075.
2021-12-15 08:00:49 +00:00
Freagarach
7670a1835b Fix (de)selection functions.
Deselecting a part of a formation didn't deselect the whole formation,
since the logic was done quite weirdly.
This clarifies and fixes that.

Reported by: @Langbart on D4282.
Differential revision: https://code.wildfiregames.com/D4285
Comments by: @Angen, @Langbart
Tested by: @Langbart
This was SVN commit r25948.
2021-10-03 06:09:01 +00:00
Freagarach
a70a20fd42 Select formations as a whole by default.
One can override this behaviour by using a hotkey when (de)selecting
entities.
The aim of this system is to reduce micromanagement a bit.

Differential revision: https://code.wildfiregames.com/D2175
Comments by: @Angen, @azayrahmad, @Langbart, @marder, @Stan,
@submariner, @wowgetoffyourcellphone, @wraitii
Refs. #4545

This was SVN commit r25939.
2021-09-24 06:11:10 +00:00
Freagarach
4195205904 Use a set for the selection internals.
Avoids recreating an object and frequent casting.
Allows some optimisations.
Simplifies some calls.

Differential revision: https://code.wildfiregames.com/D3934
Comment by: @Stan
This was SVN commit r25460.
2021-05-18 15:56:47 +00:00
wraitii
4bed678194 Handle 'orderone' hotkey for constructing buildings and walls
This was missing in 62f07098ea.

Based on a patch by: luiko
Also reported by: serveurix
Tested by: Freagarach
Fixes #5750

Differential Revision: https://code.wildfiregames.com/D2172
This was SVN commit r23830.
2020-07-14 08:04:48 +00:00
elexis
912dda50d6 Option to allow having the same entity in multiple control groups.
Differential Revision: https://code.wildfiregames.com/D2176
Patch By: Freagarach
This was SVN commit r23476.
2020-02-02 17:17:16 +00:00
elexis
b859195064 Decouple panel entities code from session code and use class notation, refs #5387, #3000, #1902, #1802, d7d1d8ccb5.
Change the logic to only insert/delete buttonhandlers on ownershipchange
and update only the entitystate dependent part on simulation update.

Differential Revision: https://code.wildfiregames.com/D2387
This was SVN commit r23089.
2019-10-22 17:53:22 +00:00
elexis
96a6a136b6 Rewrite developer overlay to use class syntax, one class per checkbox, a class for the EntityState overlay and TimeWarp debug feature, refs #5387.
Using 22 classes instead of 1 class (refs 2bcf4f678b/D1928) leverages
more benefit of the paradigm.
In particular it means the checkboxes can own the EntityState and
TimeWarp helpers and the DeveloperOverlay itself can remain independent.
Improve performance by 200 microseconds per turn by unsubscribing from
onSimulationUpdate when the developer overlay is not opened, refs
e3f43f6352 / D2378.
Move TimeWarp from input.js from 8ddef2fee0 to independent class using
hotkey release event from 78bc56f33e, refs #3194.

Differential Revision: https://code.wildfiregames.com/D2383
This was SVN commit r23081.
2019-10-19 00:26:34 +00:00
vladislavbelov
2bcf4f678b Refactors Developer Overlay using an object instead of global functions.
Reviewed By: wraitii
Commented By: elexis
Differential Revision: https://code.wildfiregames.com/D1928
This was SVN commit r22370.
2019-06-12 19:21:44 +00:00
Imarok
bc93f51a1c Add an experience status bar
Earlier version reviewed by: bb
Comments by: elexis
Differential Revision: https://code.wildfiregames.com/D1460
This was SVN commit r22226.
2019-04-25 15:58:54 +00:00
Imarok
776899c254 Show rank icon above status bars
Reviewed by: bb
Fixes: #5005
Differential Revision: https://code.wildfiregames.com/D717
This was SVN commit r21076.
2018-01-30 15:10:20 +00:00
Imarok
6c5a8269f3 Fix some style issues noticed by our linter
Reviewed By: bb
Differential Revision: https://code.wildfiregames.com/D585
This was SVN commit r20322.
2017-10-21 17:31:05 +00:00
elexis
3c73b329f2 JS cleanup.
Mark global consts as variable if mods can legitimately modify them.
Keep global objects const if mods should insert their modifications at a
different place, refs D829.
Mark the few consts inside function scope as let or var for consistency.
Don't touch the AI, simulation test and rmgen folder.
Change some var to let.
Remove an unused variable in the mainmenu and summary screen.
Inline few variables.

This was SVN commit r20047.
2017-08-26 20:10:39 +00:00
Imarok
20d34d4a97 Properly sort selected entities by owner
Fixes #4425. Refs #1807, #4167. Fixes a8b9416725

Reviewed by: mimo
Differential Revision: https://code.wildfiregames.com/D123
This was SVN commit r19202.
2017-02-06 22:17:21 +00:00
Imarok
a8b9416725 Colorize selected units in observermode, reviewed by elexis, fixes #4167
This was SVN commit r18979.
2016-11-21 21:35:26 +00:00
elexis
a2ecee4168 Rest of the previous commit, refs #3743.
This was SVN commit r17894.
2016-03-15 04:08:07 +00:00
elexis
541a5567d8 Show the attack-notification to observers.
Allow adding entities to the selection if they are owned by the observed
player.

This was SVN commit r17886.
2016-03-14 00:35:37 +00:00
elexis
9ec4f35959 Improve and fix some wrong observer-checks that didn't take defeated players into account. Refs #3168, #3215.
Introduce isPlayerObserver to easily cover that case.
Move some checks and updates into selectViewPlayer and eliminate
setObserverMode.
Initialize the music before changing the perspective.

This was SVN commit r17758.
2016-02-15 12:53:06 +00:00
elexis
823fe17dd4 Entity selection cleanup.
Replace deprecated for-each and remove trailing whitespace.

This was SVN commit r17755.
2016-02-14 23:25:28 +00:00
elexis
7c6f35b2c0 Update the unit selection for observers, refs #3168.
Don't disable the deselect button.

This was SVN commit r17704.
2016-01-24 12:33:34 +00:00
elexis
7665a9ee31 Session cleanup.
The usual suspects:
Move all constants to the top.
Rename all globals to g_Foo.
Use let for all local variables (except in the for-each parts which will
be updated later).
Quote object keys.
Ternary operator.
Fat-arrow functions.
Whitespace issues.

This was SVN commit r17468.
2015-12-14 05:37:34 +00:00
mimo
2548187474 fix selection when owner change, ref #3645
This was SVN commit r17306.
2015-11-28 11:16:13 +00:00
mimo
a90d2cd43a fix JS undefined property warning, patch by Evulant (AlThePhoenix), fixes #3496
This was SVN commit r17114.
2015-10-09 21:57:34 +00:00
mimo
4235c67764 still another bunch of cleanup (mainly missing semicolon) signaled by jshint
This was SVN commit r17046.
2015-09-19 12:55:58 +00:00
mimo
2a7dc39d07 some cleanups of gui code
This was SVN commit r16984.
2015-09-04 17:50:04 +00:00
mimo
c0d8645a6d remove some unnecessary object<->array copies + some parentheses cleanup
This was SVN commit r16978.
2015-09-02 18:14:26 +00:00
mimo
28abcb3bcc cache some formation info in gui + some cleanings, see #3078
This was SVN commit r16460.
2015-03-23 18:38:27 +00:00
Itms
9ad2fc9fac Slightly improve fogging performance by avoiding the constant deletion/re-creation of mirages.
This makes the simulation update faster per entity but also makes the
number of entities greater at a given moment. The performance gain is
positive.

This was SVN commit r15956.
2014-11-12 15:56:45 +00:00
mimo
b2f9dc305c check that selected units still exist when rebuilding the selection
This was SVN commit r15891.
2014-10-21 16:26:27 +00:00
Itms
2b1efa5035 Revert an unoptimized GUI update from f7e591c9f2. Instead, notify directly the GUI in case of miraged entities, and treat them the same way we treat renamed entities.
Fixes #2778

This was SVN commit r15703.
2014-09-06 13:34:54 +00:00
Itms
f7e591c9f2 Hide changes to buildings in the fog-of-war.
To achieve this, mirage entities are created per player, to replace the
real entities when these ones fall into the fog-of-war. These mirage
entities are created on-the-fly, and destroyed when they get back in
sight.
This depends heavily on the VisibilityChanged message added in
2174eaaeee.

As a temporary adjustment, territories do not explore the map anymore
when their borders change. See #2709.

Fixes #599

This was SVN commit r15612.
2014-08-04 22:49:19 +00:00
sanderd17
013ab4bda7 Make the barter panel uniform with the others, clean up more gui code.
This was SVN commit r15375.
2014-06-16 18:34:27 +00:00
mimo
9678cf547a cache quantities depending only on the selection, adresses #2179
This was SVN commit r14296.
2013-12-05 18:50:29 +00:00
mimo
6fae05b5f6 fix
This was SVN commit r14083.
2013-11-03 17:41:59 +00:00
leper
a362b41029 Fix grouping of garrisoned units. Patch by mimo. Fixes #1918.
This was SVN commit r13360.
2013-04-18 18:18:24 +00:00
leper
d0a695f7fb Allow mutual allies to garrison in each others buildings. Patch by mimo. Fixes #1807.
This was SVN commit r13357.
2013-04-14 00:34:14 +00:00
historic_bruno
9e163500c5 Don't use Number, parseInt, etc. per coding conventions (use the +operator instead)
This was SVN commit r13192.
2013-02-24 00:25:13 +00:00