Skip to content

Forcing specific weapon by target type #1631

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 5 commits into
base: develop
Choose a base branch
from

Conversation

Coronia
Copy link
Contributor

@Coronia Coronia commented Apr 16, 2025

This is a supplement for #1630. With multiple weapons being set, you can use ForceWeapon to enable them when attacking different targets. This pull request is a basic one that should be enough for many cases

  • A series of tags can force specified weapons based on the target's type.
    • ForceWeapon.Naval forces specified weapon to be used against Naval=yes targets. Taking priority to other target type-based forced weapons.
    • If ForceWeapon.Defenses is enabled, it'll be used if the target is a building with IsBaseDefense=yes. Otherwise it'll follow ForceWeapon.Buildings, if enabled.
    • ForceWeapon.Infantry/Units/Aircraft can be applied to both ground and air target if ForceAAWeapon.Infantry/Units/Aircraft is not set.
    • ForceAAWeapon.Infantry/Units/Aircraft do the same things but only for air target. Taking priority to ForceWeapon.Infantry/Units/Aircraft, which means that they can only be applied to ground target when they're both set.

In rulesmd.ini:

[SOMETECHNO]                                    ; TechnoType
ForceWeapon.Naval=-1                            ; integer, -1 to disable
ForceWeapon.Buildings=-1                        ; integer, -1 to disable
ForceWeapon.Defenses=-1                         ; integer, -1 to disable
ForceWeapon.Infantry=-1                         ; integer, -1 to disable
ForceWeapon.Units=-1                            ; integer, -1 to disable
ForceWeapon.Aircraft=-1                         ; integer, -1 to disable
ForceAAWeapon.Infantry=-1                       ; integer, -1 to disable
ForceAAWeapon.Units=-1                          ; integer, -1 to disable
ForceAAWeapon.Aircraft=-1                       ; integer, -1 to disable

Copy link

github-actions bot commented Apr 16, 2025

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.

@Coronia
Copy link
Contributor Author

Coronia commented Apr 16, 2025

besides, if you're certain that weapons of a techno won't make use of the following things, you can use this ability to make it skip previous weapon index picking logic, to save some calculation cost

  • CanTarget
  • CanTargetHouse
  • AttachEffect.RequiredTypes/Groups
  • AttachEffect.DisallowedTypes/Groups
  • Land/NavalTargeting

a similar optimization was also made in #1568

@Coronia Coronia added Tested ⚙️T1 T1 maintainer review is sufficient labels Apr 17, 2025
Coronia pushed a commit that referenced this pull request Jun 4, 2025
…n-techno (#1693)

- Also encapsulated the function for #1631 to use.
  > 顺便封装了函数,以便 #1631 使用。
Copy link
Contributor

@CrimRecya CrimRecya left a comment

Choose a reason for hiding this comment

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

I think after updating it, we can merge this.


By the way, my opinion on ForceWeapon.Naval is probably like this, what do you think?

case AbstractType::Unit:
{
	forceWeaponIndex = (this->ForceAAWeapon_Units >= 0 && pTarget->IsInAir())
		? this->ForceAAWeapon_Units
		: ((this->ForceWeapon_Naval >= 0 && pTargetType->Naval)
			? this->ForceWeapon_Naval
			: this->ForceWeapon_Units);

	break;
}

@Coronia
Copy link
Contributor Author

Coronia commented Jun 13, 2025

I think after updating it, we can merge this.

By the way, my opinion on ForceWeapon.Naval is probably like this, what do you think?

case AbstractType::Unit:
{
	forceWeaponIndex = (this->ForceAAWeapon_Units >= 0 && pTarget->IsInAir())
		? this->ForceAAWeapon_Units
		: ((this->ForceWeapon_Naval >= 0 && pTargetType->Naval)
			? this->ForceWeapon_Naval
			: this->ForceWeapon_Units);

	break;
}

Naval=yes can not only be applied to unit, but also other type of techno. If we're changing it to this way I'm afraid it might be somehow misleading

@Coronia Coronia force-pushed the force-weapon-by-type branch from 610296a to 4027758 Compare June 13, 2025 07:16
@CrimRecya
Copy link
Contributor

Naval=yes can not only be applied to unit, but also other type of techno. If we're changing it to this way I'm afraid it might be somehow misleading

In this case, I think it's necessary to further distinguish between vehicles and buildings that Naval=yes.

…type

# Conflicts:
#	CREDITS.md
#	docs/New-or-Enhanced-Logics.md
#	src/Ext/Techno/Body.h
#	src/Ext/Techno/Hooks.Firing.cpp
#	src/Ext/Techno/WeaponHelpers.cpp
#	src/Ext/TechnoType/Body.cpp
@Coronia Coronia force-pushed the force-weapon-by-type branch from 4027758 to 5b4225b Compare June 13, 2025 07:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Fix and merge this ⚙️T1 T1 maintainer review is sufficient Tested
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants