Skip to content

Distribution click action mode - #1993

Open
TaranDahl wants to merge 27 commits into
Phobos-developers:developfrom
TaranDahl:分散点击模式

Hidden character warning

The head ref may contain hidden characters: "\u5206\u6563\u70b9\u51fb\u6a21\u5f0f"
Open

TaranDahl wants to merge 27 commits into
Phobos-developers:developfrom
TaranDahl:分散点击模式

Conversation

@TaranDahl

@TaranDahl TaranDahl commented Dec 8, 2025 •

Copy link
Copy Markdown
Contributor

Reopen #1453 again.

[ ] Switch No-Move Command

  • Now you can change the click action by using AllowSwitchNoMoveCommand hotkey. If the behavior to be executed by the current techno is different from the behavior displayed by the mouse, and the behavior to be executed will make the techno move near the target, the behavior will be replaced with area guard. Regardless of whether or not switch hotkey is used, default behavior can be changed through DefaultApplyNoMoveCommand.
  • For localization add TXT_SWITCH_NOMOVE and TXT_SWITCH_NOMOVE_DESC into your .csf file.

In rulesmd.ini:

[GlobalControls]
AllowSwitchNoMoveKeyEnabled=false                   ; boolean
DefaultApplyNoMoveCommand=true                      ; boolean

[ ] Distribution Mode

  • You can now distribute commands across similar targets in a specified range when holding down a hotkey if AllowDistributionCommand is enabled. This behavior is like using the selected objects one by one to click on each target within the spread range.
    • The targets within the spread range will be allocated equally to the selected technos. Only when the behavior to be performed by the current techno is the same as that displayed by the mouse will it be allocated (e.g. a healer will only be allocated friendly targets it can heal, while combat units will only be allocated the targets they would attack). Neutral targets are only eligible if the clicked target itself is neutral. Otherwise, the techno will fall back to the vanilla behavior of clicking the original target (the move fallback, or area guard if the switch no-move command is active). This will display a range ring.
    • AllowDistributionFilterKeyEnabled allows you to set target filter by hotkey, which default to DefaultDistributionFilterMode.
      • When the filter is None, it is the default behavior of the game. If the range is not zero at this time, a green ring will be displayed. You can adjust the filter mode to:
        • Like - only targets with the same armor type (Completely identical Armor) will be selected among the targets allocated in the range. At this time, a blue ring will be displayed.
        • Type - only targets of the same type (like infantries, vehicles or buildings) will be selected among the targets allocated in the range. At this time, a yellow ring will be displayed.
        • Name - only targets of the same name (or with the same GroupAs) will be selected among the targets allocated in the range. At this time, a red ring will be displayed.
    • DefaultDistributionSpreadRange controls the initial spread range, which is a number that's corresponding to the amount of cell radius * 512.
  • AllowDistributionSpreadKeyEnabled allows you to cycle through preset spread ranges by hotkey. There're 4 tiers of range that can be selected by this hotkey which are identical to 0, 4, 8 and 16 cells.
    • When the range is 0, it is the original default behavior of the game.
  • AllowDistributionUseClick controls whether distribution mode is activated by clicking on a target. When set to false, distribution mode only works via press-and-drag, and the range ring will only be shown while dragging.
  • You can also adjust spread range by using the mouse wheel while holding down the specific hotkey if AllowDistributionSpreadScroll set to true. This allows a more precise control of spread range that each step will increase/decrease it by DistributionSpreadScrollStep, with 20 cells as its maximum value.
  • AllowDistributionSpreadDrag allows you to adjust the spread range by pressing and dragging the mouse while holding down the specific hotkey. The drag distance from the starting point determines the spread range. This can naturally co-exist with AllowDistributionSpreadScroll.
  • AllowDistributionCommandOnOwner, AllowDistributionCommandOnAllies, AllowDistributionCommandOnEnemies & AllowDistributionCommandOnNeutral allow the distribution command to work on owner, allies, enemies or neutral target. If picking a target that's not eligible, it'll fallback to vanilla command.
  • It's possible to add a button for distribution mode in the bottom bar by adding DistributionMode in the ButtonList of AdvancedCommandBar and MultiplayerAdvancedCommandBar.
    • The positions of each button are hardcoded, so it'll only decide whether enable this button or not. Distribute Mode button is now always listed after all the vanilla ones.
    • The asset of these buttons should be added in sidec0x.mix files which correspond to different sides, with the name button12.shp.
  • The distribution mode hotkey works like the vanilla waypoint mode hotkey: holding it down activates the mode while releasing it deactivates it, a sound is played and a message is shown when the mode is turned on/off, and the bottom bar button (if added) toggles the mode as well. The sounds played when the mode is turned on/off can be customized with StartDistributionModeSound and EndDistributionModeSound, which default to the planning mode sounds.
  • A sound is also played each time a distribution command is issued, either by clicking a target or on drag release. It can be customized with AddDistributionModeCommandSound.
  • For localization add TXT_SWITCH_NOMOVE, TXT_DISTR_SPREAD, TXT_DISTR_FILTER, TXT_DISTR_HOLDDOWN, TXT_SWITCH_NOMOVE_DESC, TXT_DISTR_SPREAD_DESC, TXT_DISTR_FILTER_DESC, TXT_DISTR_HOLDDOWN_DESC, MSG:DistributionModeOn, MSG:DistributionModeOff, TIP:DistributionMode into your .csf file.

In rulesmd.ini:

[GlobalControls]
AllowDistributionCommand=false                      ; boolean
AllowDistributionCommandOnOwner=true                ; boolean
AllowDistributionCommandOnAllies=true               ; boolean
AllowDistributionCommandOnEnemies=true              ; boolean
AllowDistributionCommandOnNeutral=true              ; boolean
AllowDistributionSpreadKeyEnabled=true              ; boolean
AllowDistributionFilterKeyEnabled=false             ; boolean
DefaultDistributionSpreadRange=2048                 ; integer between 0 and 5120
DefaultDistributionFilterMode=2                     ; integer, 0 - None , 1 - Like , 2 - Type , 3 - Name
DistributionSpreadScrollStep=256                    ; integer, minimum 16

[AudioVisual]
StartDistributionModeSound=                         ; sound entry, defaults to `StartPlanningModeSound`
EndDistributionModeSound=                           ; sound entry, defaults to `EndPlanningModeSound`
AddDistributionModeCommandSound=                    ; sound entry

In ra2md.ini:

[Phobos]
AllowDistributionSpreadScroll=true                  ; boolean
AllowDistributionSpreadDrag=true                    ; boolean
AllowDistributionUseClick=true                      ; boolean

In uimd.ini:

[AdvancedCommandBar]
ButtonList=[Button1],DistributionMode,[ButtonX]     ; List of button entry

[MultiplayerAdvancedCommandBar]
ButtonList=[Button1],DistributionMode,[ButtonX]     ; List of button entry

@github-actions

github-actions Bot commented Dec 8, 2025 •

Copy link
Copy Markdown

Nightly build for this pull request:

This comment is automatic and is meant to allow guests to get latest nightly builds for this pull request without registering. It is updated on every successful build.

@TaranDahl

Copy link
Copy Markdown
Contributor Author

@Metadorius Any issue other than #1949 (review)?

@TaranDahl

TaranDahl commented Dec 8, 2025 •

Copy link
Copy Markdown
Contributor Author

TODO:
(Summarized from #1949 (review))

  • Create independent file for AdvancedCommandBarButtonClass.
  • Allow registering new AdvancedCommandBarButtonClass like MakeCommand.
  • Rewrite the spread range code to allow exact range.
  • Press-and-drag mode

@Metadorius Please confirm the above summary, or supplement/correct the incorrect parts.

@Metadorius

Copy link
Copy Markdown
Member

@TaranDahl yeah, correct, there was also a comment about implementing press-and-drag mode (and not sure if the "same type" (infantry/buildings/vehicles/etc) is needed, since we have "same armor" mode). CrimRecya said it's too problematic, however I don't really see why, since we already have drag selection and we could reuse drag selection to calculate the radius.

@TaranDahl

TaranDahl commented Dec 10, 2025 •

Copy link
Copy Markdown
Contributor Author

there was also a comment about implementing press-and-drag mode (and not sure if the "same type" (infantry/buildings/vehicles/etc) is needed

I think there is not enough labor force to add more features.
I think the existing work is sufficient in terms of completion. We should just perfect the existing features and then merge them.
As for more features, they should be another work, and can be implemented later, by anyone who wants them.
Breaking it into two PR can also help avoid the problem of having an excessive amount of code piled up in one PR, which may lead to no one willing to review it.

@Metadorius

Copy link
Copy Markdown
Member

I think there is not enough labor force to add more features. I think the existing work is sufficient in terms of completion. We should just perfect the existing features and then merge them. As for more features, they should be another work, and can be implemented later, by anyone who wants them. Breaking it into two PR can also help avoid the problem of having an excessive amount of code piled up in one PR, which may lead to no one willing to review it.

This isn't a feature though? It is just a somewhat small improvement that brings it in line with how modern games do it.

  • 0x6D2280 (exists in YRpp) for transforming screen coords into world coords (though Z is 0, maybe would want to account for that)
  • 0x4AC4CC is where the drag-selection band is set and the mouse hold is done
  • 0x4ABCEB is where the drag-selection release is handled
  • 0xD90 in TacticalClass is Rect that contains X, Y, Width, Height

From that you could calculate 2 points, get world coords via function above, use this info to draw a corresponding circle and set the mode to such. I am not sure what is complex here. If needed I can send my decompile for this.

@TaranDahl

Copy link
Copy Markdown
Contributor Author

@Metadorius Is there any difference between ShapeButtonClass and AdvancedCommandBarButtonClass?

@Metadorius

Metadorius commented Dec 24, 2025 •

Copy link
Copy Markdown
Member

@TaranDahl ShapeButtonClass is a vanilla engine class, AdvancedCommandBarButtonClass is something I propose to invent (perhaps a descendant from ShapeButtonClass) that stores the extra things that are currently stored as static arrays, for example.

@TaranDahl

Copy link
Copy Markdown
Contributor Author

@TaranDahl ShapeButtonClass is a vanilla engine class, AdvancedCommandBarButtonClass is something I propose to invent (perhaps a descendant from ShapeButtonClass) that stores the extra things that are currently stored as static arrays, for example.

Judging from the current code, there seems to be no need for it to inherit from ShapeButtonClass. After all, the game originally stores those attributes in a static array.
image

@Metadorius

Copy link
Copy Markdown
Member

After all, the game originally stores those attributes in a static array.

Which is a bad pattern. You have class fields and methods for that.

@TaranDahl

Copy link
Copy Markdown
Contributor Author

Yeah I will make a new class to arrange the new buttons. But for the vanilla buttons, maybe we should just let them be?

@Metadorius

Copy link
Copy Markdown
Member

Yeah I will make a new class to arrange the new buttons. But for the vanilla buttons, maybe we should just let them be?

Yeah I didn't mean we should be squeezing vanilla static array shitcode into proper classes necessarily, should be good.

@TaranDahl

Copy link
Copy Markdown
Contributor Author

If we want to implement dragging, how should we handle the selection range?
Right now, it's several specific values.

Comment thread src/Commands/DistributionMode.cpp Outdated

@Metadorius Metadorius left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

partial review

Comment thread src/Commands/DistributionMode.cpp
Comment thread src/Commands/DistributionMode.cpp Outdated
Comment thread src/Commands/DistributionMode.cpp Outdated
@NetsuNegi
NetsuNegi marked this pull request as draft December 29, 2025 09:27
@TaranDahl TaranDahl removed the Tested label Jan 25, 2026
@TaranDahl
TaranDahl force-pushed the 分散点击模式 branch from 22dd6fa to 769c5a2 Compare July 14, 2026 07:19
update

update doc

禁止分配到回收站

update

update

Update src/Commands/DistributionMode.cpp

fix

core

disable force attack for distribution mode

fix double keys breaking distribution command

fix distribution mode crash

add AffectsNeutral for distribution mode

Update Phobos.vcxproj

move things to new files

update doc

Button on bottom

TODO

Fit with FakeOf

Fix include

Separate functions

Fix default value

Remove useless

Refactor

remove unnecessary Grinder process

Code style

...

Low distance first

Fix merge

Message, sound and scroll action

Global toggle

Fix target outside units

Fix target disguised units

Fix target shrouded units

Doc

Add a hold down key to enable

Fix target cloaked units

Fix a typo

Show range ring

Draw at mouse

Core

Co-Authored-By: Kerbiter <crabiter@vivaldi.net>
Co-Authored-By: Coronia <28055583+Coronia@users.noreply.github.com>
Co-Authored-By: 绯红热茶 <169989423+CrimRecya@users.noreply.github.com>
@TaranDahl
TaranDahl force-pushed the 分散点击模式 branch from d4daaa2 to f644c0a Compare July 15, 2026 18:37
@TaranDahl
TaranDahl marked this pull request as ready for review July 15, 2026 18:41
@TaranDahl
TaranDahl requested a review from Metadorius July 15, 2026 18:48
@Coronia

Coronia commented Jul 16, 2026 •

Copy link
Copy Markdown
Contributor

maybe the default DistributionSpreadScrollStep of 16 is too small. Now it takes long time to scroll it to a desirable value. Maybe make it 256 which is 1 cell per scroll, making it more intuitive and easy to use while keeping the preciseness

also the upper limit of DistributionSpreadScrollStep seems to be not needed, as it was 0-4-8-16 range before which are all greater than 512

as for the drag, I think instead of a choice between it and scroll, it'd better just make a toggle in rulesmd.ini to enable or disable it, like AllowDistributionCommand.SpreadModeScroll did, since these 2 patterns can naturally co-exist without conflict

@Metadorius

Copy link
Copy Markdown
Member

How about the rest of your review?

Have you addressed the design changes I requested? without that it would be a moot point to get deeper into code

@TaranDahl

Copy link
Copy Markdown
Contributor Author

How about the rest of your review?

Have you addressed the design changes I requested? without that it would be a moot point to get deeper into code

So there are no further issues with the design, right?

@Metadorius

Copy link
Copy Markdown
Member

So there are no further issues with the design, right?

you left some of my comments/suggestion unaddressed though, either by changes or replies, that's what I was pointing at

@TaranDahl

Copy link
Copy Markdown
Contributor Author

So there are no further issues with the design, right?

you left some of my comments/suggestion unaddressed though, either by changes or replies, that's what I was pointing at

Yeah I know it. I was looking forward to some other reviews, to deal with them together.

Comment thread docs/User-Interface.md Outdated
@TaranDahl

Copy link
Copy Markdown
Contributor Author

@Metadorius Please check again when you are free.

@Coronia

Coronia commented Sep 19, 2026 •

Copy link
Copy Markdown
Contributor

The house filter is still needed for modders to decide targets from which houses could distribution command be applied to

Also you get me wrong, I'm just saying that whether filter mode could be controlled by players should be decided by the modders, since it's affecting how the target will be selecting which can be balance-breaking. The hotkey itself could still be kept if modders allow that, which is why it's been put in rulesmd.ini instead of ra2md.ini and default to false

And add some handling for Armor filter mode to make it take shield armor into account

@Coronia

Coronia commented Sep 19, 2026 •

Copy link
Copy Markdown
Contributor

@TaranDahl @Metadorius after re-reviewing the current design I think only AllowDistributionSpreadScroll, AllowDistributionSpreadDrag and AllowDistributionUseClick should be made toggleable by players through client. AllowDistributionSpreadHotkey is meaningless since players can already decide whether or not to set the hotkey. So it should either be removed or put back to rules for global control

As for DefaultDistributionSpreadRange, DistributionSpreadScrollStep and DefaultDistributionFilterMode, I think it's hard to make it controlled by players through client either since it's neither supporting a drag box setting nor a manually enter setting. Besides, normal players can't understand that '256 means 1 cell' and what are those filter mode means, so it's also not feasible to make them as settings. Since DefaultDistributionSpreadRange and DefaultDistributionFilterMode are default values that can be changed by other method later on, it's also a bit meaningless to customize them

Last but not least, I'm still going back to the topic of 'whether a hotkey needs toggle'. Now I believe that every hotkey needs a toggle even if it's purely QoL change, because it'll still require the modders to manually set them up in client or it'll go wrong ingame, which can't be automatically completed whenever a new hotkey is added. I don't think it's a wise idea to let modders having to redefine client ini again when something new is added. If some hotkey is really about QoL, then we can make its toggle default to true, but it's still needed

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

❓New feature ⚙️T2 T2 maintainer review is sufficient Tested

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants