Commit Graph
4170 Commits
Author SHA1 Message Date
Asdow de91c7a9fd Render debug info in tactical
Functionality for rendering pathfinding and cover values in tactical was behind defunct #ifdefs.
It's now compiled always, but only enabled if cheat level is BEDUG_CHEAT_LEVEL.
Unified rendering the debug info into one function, instead of several nearly identical ones.
Ctrl + Shift + Z cycles through the different debug modes.

Now it should be fairly easy to add more info modes like these two in the future.
2024-02-21 23:24:14 +02:00
Asdow ab2c5fc10d Add BOXER() & ISVIP() macros 2024-02-18 12:03:43 +02:00
AsdowandGitHub 5fe730b075 Merge branch 'master' into decideaction 2024-02-11 17:38:27 +02:00
Asdow 57716e1c07 Revert back to original AI deadlock breaking
For now..
2024-02-11 17:20:10 +02:00
AsdowandGitHub 65698284c3 Re-enable extracover check for A* (#283)
Allows smarter pathfinding for AI, only done during turnbased pathing  to alleviate its extra cost
2024-02-11 14:57:53 +02:00
Asdow dfc17c68c6 Cancel action if new situation arises
Lot of actions are liable to deadlock if this is not done
2024-02-11 13:32:17 +02:00
AsdowandGitHub 4338b5b909 Fix AI tactical retreat (#282)
Only perform tactical traversal if pSoldier is at the map edge
2024-02-11 12:42:21 +02:00
Asdow 67a26e0936 Add more AI logging 2024-02-11 11:21:41 +02:00
AsdowandGitHub ef69f9b2e6 Allow enemy to retreat (#279)
This check was preventing enemies from retreating into another sector if tactical AI retreat was enabled, leading into AI deadlock every time AI_ACTION_RUNAWAY was the decision.
2024-02-11 00:27:14 +02:00
Asdow 1a98420160 Remove extraneous check
Allow at least considering throwing smoke for cover even if pSoldier has used some AP from its initial amount.
2024-02-10 18:56:11 +02:00
Asdow 877ec385ee Whitespace changes 2024-02-10 18:50:30 +02:00
Asdow b480a67d36 Reduce code duplication 2024-02-10 18:47:03 +02:00
Asdow adf86380ca Merge branch 'decideaction' of https://github.com/1dot13/source into decideaction 2024-02-10 18:37:11 +02:00
Asdow 93acd19c11 Try to find a cover spot when advancing to attack
Calling InternalGoAsFarAsPossibleTowards() with target's gridno means AI doesn't take into account eg. nearby friendlies resulting in them bunching up and  making a beeline straight at whoever they're trying to attack.
We'll first at least attempt to find a cover spot near said target, if it doesn't work, only then head straight at them.
2024-02-10 18:35:45 +02:00
Asdow f6052f0eff add another AI logging entry 2024-02-10 18:35:25 +02:00
Asdow eaf76957c0 Use correct string array 2024-02-10 18:35:25 +02:00
Asdow 3c2b048367 Attempt to continue moving towards enemy
when in water. If our current or last action was AI_ACTION_SEEK_OPPONENT.

The AI tends to flipflop between jumping into water, swimming a certain distance and then "panic" because they're in the water and then try to reach the closest land tile. Which is often right where they entered the water. Adding a bit of decision momentum with this change should help with that.
2024-02-10 18:35:25 +02:00
Asdow 1aec54f59c add another AI logging entry 2024-02-10 18:14:35 +02:00
Asdow 0240729c11 Use correct string array 2024-02-10 18:13:20 +02:00
Asdow 5c86cf0b07 Attempt to continue moving towards enemy
when in water. If our current or last action was AI_ACTION_SEEK_OPPONENT.

The AI tends to flipflop between jumping into water, swimming a certain distance and then "panic" because they're in the water and then try to reach the closest land tile. Which is often right where they entered the water. Adding a bit of decision momentum with this change should help with that.
2024-02-10 18:12:30 +02:00
AsdowandGitHub 28a4db0355 Guard against nullptr dereference (#278)
Encountered a situation where a pSoldier between bFirstID and bLastID was null and then we'd dereference it.
2024-02-10 17:18:19 +02:00
Asdow 79372d5d23 Try to find a cover spot when advancing to attack
Calling InternalGoAsFarAsPossibleTowards() with target's gridno means AI doesn't take into account eg. nearby friendlies resulting in them bunching up and  making a beeline straight at whoever they're trying to attack.
We'll first at least attempt to find a cover spot near said target, if it doesn't work, only then head straight at them.
2024-02-04 21:05:54 +02:00
Asdow 4faccb2957 Fix indentation 2024-02-04 20:17:09 +02:00
Asdow 0ed68b6214 Set functions to static 2024-02-04 16:17:36 +02:00
Asdow f646bc2bfa Set correct next action if npc has no AP
With aiData.bAction = AI_ACTION_NONE and aiData.bNextAction = AI_ACTION_END_TURN, the npc turn is correctly ended in the next call to TurnBasedHandleNPCAI()
2024-02-04 16:14:01 +02:00
Asdow 01327265a3 Check if action should stay inprogress state
Several actions tended to get stuck in an invalid state, where it was completed, but aiData.bActionInProgress was still TRUE resulting in an AI deadlock.

If such a situation is found, Actiondone is now called, preventing the deadlock
2024-02-04 16:10:26 +02:00
Asdow cd193c7f5e Call TurnBasedHandleNPCAI() if no action is in progress
Several actions would sometimes get stuck in a forever loop, where they would not be executed, since no proper path for executing the actions is found.

Originally TurnBasedHandleNPCAI() would only be called if aidata.bAction was AI_ACTION_NONE.
Now we'll call it if an action is not already in progress, and will be executed if the action is affordable.
2024-02-04 16:07:03 +02:00
Asdow f249406ba0 Allow specific alert status AI logging
Less clutter in the AI logs if, for example one is only interested in BLACK status decisions
2024-02-04 15:29:05 +02:00
Asdow 7ee8165e02 Prevent AI deadlocking if NEW_SITUATION is encountered 2024-02-04 15:18:43 +02:00
Asdow caf5828153 Remove deadlock breaking from TurnBasedHandleNPCAI
It's already handled before a call to this function, and TurnBasedHandleNPCAI() is only called when pSoldier's action is AI_ACTION_NONE
2024-02-04 12:39:57 +02:00
CptMooreandGitHub 32cae66229 Merge pull request #275 from 1dot13/try-number-3
Another fix for new release steps
2024-02-04 08:44:53 +01:00
CptMoore b081f2af88 Another fix for new release steps 2024-02-04 08:44:12 +01:00
CptMooreandGitHub 8b02dfe66a Merge pull request #274 from 1dot13/new-artifacts-upload
Updated github actions, fix for new release steps
2024-02-04 08:20:04 +01:00
CptMoore c1e72eaab2 Updated github actions, fix for new release steps 2024-02-04 08:16:09 +01:00
CptMooreandGitHub ec1f6e651b Merge pull request #273 from 1dot13/simplified-release-steps
Simplified release steps
2024-02-04 07:35:04 +01:00
CptMooreandGitHub 082b42ef73 Simplified release github steps 2024-02-04 07:34:02 +01:00
Asdow ffb95a2418 Remove unused variable from if checks
aiData.bRTPCombat is never initialized and is always 0 when valid values should be

#define RTP_COMBAT_AGGRESSIVE		1
#define RTP_COMBAT_CONSERVE			2
#define RTP_COMBAT_REFRAIN			3
2024-02-03 20:49:43 +02:00
Asdow 22f2c9ff9a Correct AP check
We can't do anything with negative action points either.
2024-02-02 01:00:12 +02:00
AsdowandGitHub d296789929 LOBOT: enemies wear pistol holsters (by Seven) (#271) 2024-01-30 22:53:19 +02:00
AsdowandGitHub 0910dba472 Revert "Disable AI logging by default" (#270)
This reverts commit 5a74323d1f.
2024-01-30 11:44:00 +02:00
AsdowandGitHub bb63cb9aa3 Merge pull request #268 from 1dot13/custom-music
Allow custom music to be added
2024-01-29 21:50:08 +02:00
Asdow a80fea00e2 Rename 2nd original battle music
If "Battle B" music file is found, use it instead of tensor B for the second original battle music. Allows us to replace either the enemy present or battle version of the same track instead of always both when "tensor B" is replaced.
2024-01-29 21:39:13 +02:00
Asdow e93dc3fb6d Allow separate enemy present & battle music for nighttime
Defaults to regular enemypresent and battle music if no nighttime music tracks are found
2024-01-29 21:37:05 +02:00
Asdow 51c3967c42 Smarter string formatting
Accept filenames with two digit running number
2024-01-29 21:37:05 +02:00
Asdow 2697a17010 Check if pSoldier is null
Prevent nullptr dereference in AI logging function
2024-01-28 11:16:41 +02:00
Asdow 5a74323d1f Disable AI logging by default
We only want this on when specifically debugging/working on AI.
2024-01-28 11:16:41 +02:00
Asdow 7546a23d0d Allow custom music to be added
Additional music can be added by placing sound files into Dataa/Music folder following this naming convention

musicmode_runningNumber.fileformat, so for example:

Mainmenu_001.mp3
Mainmenu_002.ogg
Laptop_002.ogg
Tactical_003.wav

*****************************************************************
Different musicmodes are

Mainmenu_ 		<-- Mainmenu music
Laptop_ 		<-- Laptop music
Tactical_		<-- Tactical with nothing special going on
Enemy_			<-- Tactical, enemy present
Battle_			<-- Tactical, enemy present and visible
Victory_		<-- Tactical, battle victory
Death_			<-- Tactical, battle defeat
Creepy_			<-- Tactical, creatures present
CreepyBattle_	<-- Tactical, creatures present and visible

Music files can be .mp3, .ogg or .wav formats and 100 songs in each category is supported.
The running numbering starts from 000

*****************************************************************
A few filenames are treated in a special way to facilitate easy replacement of original music.
To replace original music, insert the following named files into this folder

"menumix1"			<-- Mainmenu music
"marimbad 2"		<-- Laptop music
"nothing A"			<-- Tactical with nothing special going on
"nothing B"
"nothing C"
"nothing D"
"tensor A"			<-- Tactical, enemy present
"tensor B"
"tensor C"
"triumph"
"death"
"battle A"			<-- Tactical, enemy present and visible
"tensor B"			<-- This file is also used as battle music
"creepy"			<-- Tactical, creatures present
"creature battle"	<-- Tactical, creatures present and visible
2024-01-27 14:29:51 +02:00
AsdowandGitHub c7bd75b60d Merc arrival location fix (#263)
* User center insertion point for merc arrival

instead of initial arrival gridno that is meant only for the very first helidrop arrival at the start of a game.

* Prevent possible nullptr dereference
2024-01-24 00:35:39 +02:00
AsdowandGitHub 57bf3d9fa7 Call RemovePlayerFromGroup instead of RemoveGroup (#260)
There was a bug in a provided save where a merc's group had persistent flag set, even though the assignment was DRILL_MILITIA, which should never have a persistent group. When the code was calling RemoveGroup instead of RemovePlayerFromGroup at this point, it would crash the game with an assertion error in CancelEmptyPersistentGroupMovement() as the group in fact was not empty! Now we're removing the merc first and then checking if the group is empty and if so, attempt to delete it.
2024-01-03 00:39:44 +02:00
olafwqqandGitHub fd4b531d53 Fix GetAllForticationGridNo (#259)
It was still returning gridnos as 16-bit integers.
2024-01-02 11:53:29 +02:00