Magic: The Gathering Combat with Abilities Related
Goal:
Given two creatures with optional combat abilities, return unique but consistent values that represent which creatures died, if any.
Input:
#Longest form:
[[P,T, &quot;&lt;abilities&gt;&quot;], [P,T, &quot;&lt;abilities&gt;&quot;]]
#Shortest form:
[[P,T], [P,T]]

Each creature will be given in the form of [P,T,&quot;&lt;abilities&gt;&quot;]. It will be in the form [P,T], [P,T,&quot;&quot;], or [P,T,0] if it has no abilities, your choice on form. P is an integer &gt;=0, T is an integer &gt;=1. &lt;abilities&gt; is a subset of &quot;DFI&quot;, or can be represented via a single number/bitstring if you wish. Order of the flags is also up to you.
Combat Mechanics:
Each creature has two stats, Power and Toughness in that order, and optional abilities. A creature's power is &gt;=0. A creature's Toughness is &gt;=1.
Each creature will simultaneously do damage equal to its power to the opposing creature (unless one has first-strike). If the value is greater than or equal to the opponent's toughness, it will die (unless it is indestructible).
Example: Alice is a 2/2, Bob is a 3/4, both with no abilities. Alice will do 2 damage to Bob and take 3 damage in return. Alice's toughness is 2 so it will die, Bob's toughness is 4 so it will live.
There are only 3 optional abilities we will consider for this (although there are more in the game). These will be one character flags:

[D]eathtouch: Any amount of damage (X&gt;0) is considered lethal.
[F]irst Strike: Will deal its damage first, able to kill the other creature before it can attack back. If both creatures have First Strike, Resolve combat as normal.
[I]ndestructible: No amount of damage is considered lethal, including Deathtouch.

Output:
Any consistent value for each of the following four cases. State the four values in your answer, please. Example return value in parens:

Neither creature died (0)
1st creature died (1)
2nd creature died (2)
Both creatures died (3)

Rules:

Input is guaranteed to have two correctly formatted creatures.
If you are using characters for abilities, you can assume they're ordered how you want but post the order used if relevant.
If you are using a number/bitstring for abilities, post what encoding you're using. e.g.: 111 is D/F/I, 7 is D/F/I, etc.
If a creature has no abilities, It can also be taken as [P,T, &quot;&quot;] or number equivalent
Standard Loopholes Forbidden
This is code-golf so shortest code wins.

Examples:
Input: [[2,2], [1,1]]
Output: 2nd Dies
    
Input: [[0,2], [0,1]] #0/2 vs 0/1
Output: Neither Die
    
Input: [[2,1], [2,1]] #2/1 vs 2/1
Output: Both Die

Input: [[1,1, &quot;D&quot;], [2,2]] #1/1 Deathtoucher vs 2/2 
Output: Both Die

Input: [[2,2], [0,1, &quot;D&quot;]] #2/2 vs 0/1 Deathtoucher
Output: 2nd Dies

Input: [[2,2], [1,1, &quot;DF&quot;]] #2/2 vs 1/1 Deathtouch First-striker 
Output: 1st Dies
    
Input: [[0,2, &quot;D&quot;], [0,1, &quot;DF&quot;]] #0/2 Deathtoucher vs 0/1 Deathtouch First-striker
Output: Neither Die

Input: [[2,2], [2,2, &quot;F&quot;]] #2/2 vs 2/2 First-striker
Output: 1st Dies

Input: [[2,2, &quot;I&quot;], [1,1, &quot;DF&quot;]] #2/2 Indestructible vs 1/1 Deathtouch First-striker
Output: 2nd Dies

Input: [[9999,9999], [1,1, &quot;I&quot;]] #9999/9999 vs 1/1 Indestructible
Output: Neither Die

Input: [[2,2, &quot;F&quot;], [1,1, &quot;F&quot;]] #2/2 First-Striker vs 1/1 First-Striker
Output: 2nd Dies

#9/9 Deathtouch, Indestructible First-Striker vs 9/9 Deathtouch, Indestructible First-Striker
Input: [[9,9, &quot;DFI&quot;], [9,9, &quot;DFI&quot;]] 
Output: Neither Die
Perl 5, 248 bytes

...without spaces and newlines:



sub c{eval'
(P,T,A,p,t,a)=@_;
     A=~/F/&amp;&amp;a!~/F/&amp;&amp;a!~/I/ ? c( P,2e9,A=~s/F//r,p,t, a         )
    :a=~/F/&amp;&amp;A!~/F/&amp;&amp;A!~/I/ ? c( P,T, A,        p,2e9,a=~s/F//r )
    : do{
        P=1e9 ifA=~/D/&amp;&amp;P&gt;0;
        p=1e9 ifa=~/D/&amp;&amp;p&gt;0;
        T=3e9 ifA=~/I/;
        t=3e9 ifa=~/I/;
        T-=p;
        t-=P;
        T&gt;0&amp;&amp;t&gt;0  ? 0
            : T&gt;0 ? 2
            : t&gt;0 ? 1
            :       3
}'=~s,[pta],\$$&amp;,gri }


Try it online!

My ungolfed version with the ten tests from @Veskah (OP), tests passes:

sub co { #combat
    my($p1,$t1,$a1, $p2,$t2,$a2)=@_; #p=power, t=toughness, a=abilities
    $a1=~s/F// and $a2=~s/F// if "$a1$a2"=~/F.*F/; #both F, no F
    return co($p1,2e9,$a1=~s/F//r, $p2,$t2,$a2        ) if $a1=~/F/ &amp;&amp; $a2!~/I/;
    return co($p1,$t1,$a1,         $p2,2e9,$a2=~s/F//r) if $a2=~/F/ &amp;&amp; $a1!~/I/;
    $p1=1e9 if $a1=~/D/ and $p1&gt;0;
    $p2=1e9 if $a2=~/D/ and $p2&gt;0;
    $t1=3e9 if $a1=~/I/;
    $t2=3e9 if $a2=~/I/;
    $t1-=$p2;
    $t2-=$p1;
    $t1&lt;=0 &amp;&amp; $t2&lt;=0 ? "Both Die"
   :$t1&lt;=0           ? "1st Dies"
   :$t2&lt;=0           ? "2nd Dies"
                     : "Neither Die"
}

my @test=map{[/Input: .*? (\d+),(\d+)(?:,\s*"([FDI]+)")?
                      .*? (\d+),(\d+)(?:,\s*"([FDI]+)")?
           .*? Output: \s* (1st.Dies|2nd.Dies|Both.Die|Neither.Die)? /xsi]}
         split/\n\n/,join"",&lt;DATA&gt;;
my $t=0;
for(@test){ $t++;
  my $r=co(@$_);#result
  $r=~s,0,Neither Die,; $r=~s,3,Both Die,;
  print $$_[-1]=~/^$r/
    ? "Ok $t\n"
    : "Not ok, combat $t --&gt; $r, wrong! (".join(",",@$_).")\n"
}
__DATA__
Input: [[2,2], [1,1]]
Output: 2nd Dies

Input: [[0,2], [0,1]] #0/2 vs 0/1
Output: Neither Die

Input: [[2,1], [2,1]] #2/1 vs 2/1
Output: Both Die

Input: [[1,1, "D"], [2,2]] #1/1 Deathtoucher vs 2/2
Output: Both Die

Input: [[2,2], [0,1, "D"]] #2/2 vs 0/1 Deathtoucher
Output: 2nd Dies

Input: [[2,2], [1,1, "DF"]] #2/2 vs 1/1 First-strike, Deathtoucher
Output: 1st Dies

Input: [[2,2], [2,2, "F"]] #2/2 vs 2/2 First-striker
Output: 1st Dies

Input: [[2,2, "I"], [1,1, "DF"]] #2/2 Indestructible vs 1/1 First-strike, Deatht.
Output: 2nd Dies

Input: [[99999,99999], [1,1, "I"]] #99999/99999 vs 1/1 Indestructible
Output: Neither Die

Input: [[2,2, "F"], [1,1, "F"]] #2/2 First-Striker vs 1/1 First-Striker
Output: 2nd Dies