Ok, so here is what I’m guessing is happening (without being able to check my code). When your attack animations are being called in my offensive abilities an immediate QueueAction macro is called, which culminates in an attack animation being played by the unit. Before the action is queued I bind an event to an event dispatcher which is responsible for showing damage dealt and ending the action. As part of this it also unbinds the event from the dispatcher.
Since the event is unbound as soon as it is called only the first attack will call the dispatcher. However, if you do not unbind it, EndAction will be called twice (which would result in issues, since you have not queued two actions. This would then end whatever the next action in the queue is). You could fix this by splitting it up. Have one event that is bound to one dispatcher, which is responsible for displaying damage dealt and another responsible for ending the action. The first dispatcher should be called whenever an attack animation lands an attack (through notifies), while the other should be called first when all attack animations have ended. Only this second event should unbind events (both) and end the action.
This is the sort of question that I wished I was back home for, as it would help to do some testing, but I’ll try my best.
So, there are roughly as many corners on a square grid as there are tiles (since all tiles have four corners, but most corners are shared between four tiles). As you mention you can put an object at the corner of a tile by placing it on the center of a tile and then offsetting it by half the width of a tile on both the X and Y axes. This is in fact what I do with multi-tile (“big”) units that occupy an even number of tiles along both axes. In the case of units sized 2*2 tiles, for instance, the unit “really” occupies only the top left of the tiles (as far as its GridIndex variable is concerned). You should be able to do something similar with your corner objects.
But this leads to some complications, as you have noted. Your objects cannot be units, or units will not be able to stand on the tile which is occupies on the grid. You should thus not use units for this. Luckily I’ve included another TMap called GridObjects which was made with these sorts of things in mind. By using AddObjectToGrid you can add a reference to your objects to any tile without disrupting unit movement. Check out the items in the HydrasLair map for examples of how to add and interact with GridObjects.
For the aura effects of your objects, that increase damage, reduce health etc. on adjacent units you can get all the appropriate tiles pretty easily. If the object really occupies the top left tile you can get the object’s GridIndex as well as GridIndex + 1, +1000 and +1001.
So to perhaps the trickiest part, which is targeting the objects with an attack. If you use a special type of attack for just targeting these objects but not units it is relatively straightforward. You would just offset the hover marker similarly to what I do for the move ability when you have a 2*2 unit as the active unit. Again you are really targeting the tile to the top left of whatever tile you are hovering over here, but for all gameplay purposes it works as if you are targeting the space between tiles.
However, I am guessing you want your attack abilities to be able to attack both units and your objects depending on what the player is hovering over, which again leads to the problem of units and your objects occupying the same tile. It was for these sorts of corner cases (forgive the pun) I made it so that abilities store not just the index of the tile being hovered over (or clicked), but also the precise world location under the mouse. You likely want to make a child actor of BP_AbilityBase that you use for your abilities (at least the ones that can target the corner objects) where you override some of what is done for the hover and click events. Normally I here check if the mouse is hovering over something that blocks path trace, which is a valid tile etc. Before this you could do a line trace for your corner objects (using some trace channel your objects are set to block. Do not use PathTrace or RangeTrace for this, as this will affect visibility and pathfinding). If this channel is blocked by one of your corner objects, do not run the regular hover and click events, but instead make custom ones which target the custom corner objects.
This is the general approach I would take for implementing something like this. It takes a bit of work, as you can see, since you’re violating an assumption of the toolkit, which is that anything relevant to gameplay exists withing tiles. However I have kept these sorts of things in mind while designing the toolkit, which makes such modifications much simpler than they could have been. I hope this helps you. I can go into more detail once I’m back from my vacation early next month if you are still in need of help.
This is a lot simpler. Modifying health or damage is as simple as modifying any variable in UE4 (though for health you would also have to remember to update the health bar appropriately). The only bit of modification you would need to do here would be related to how you determine the killer whenever a unit is killed. There are several ways you could do this. You could do this by adding a reference to the source unit in the TakeDamage event in BP_Unit and run your LevelUp event for this unit if CurrentHealth of the target is 0 after taking damage. If units only ever take damage on other unit’s turns you can simply check what is the current ActiveUnit in BP_TurnManager whenever a unit dies and level up this unit. You could even level up as part of your attack abilities. After dealing damage with the attack, check if the target unit still lives (several possibilities here. Is health 0? Can the unit still be found in the initiative array? Has a custom bDead boolean been set to true), and level up the OwningUnit if this is the case.