§
    O¼»j«  ã            
       ón  — d Z ddlZddlmc mZ ddlZddlZddl	Z	ddl
Z
e	j                             de
j                             e
j                             e
j                             e¦  «        d¦  «        ¦  «        ¦  «         ddlmZ ddlmZmZmZmZmZmZmZ ddlmZ ddlmZ  G d„ d	¦  «        ZdS )
zõ
Unit tests for FreeExile Savage Monster Ecosystem & Procedural Generation Engine.
Verifies 100-level scaling, 10,000 monster variants, ferocity & size distribution,
memory/hardware optimization, and server-authoritative Feral AI state machine.
é    Nz../../server)ÚFiveElements)ÚMonsterGenusÚMonsterRankÚMonsterAIStateÚProceduralMonsterÚAggressionProfileÚMonsterRuntimeStateÚMonsterAIAction)ÚMonsterProceduralEngine)ÚMonsterAIEnginec                   ó6   — e Zd Zdd„Zdd„Zdd„Zdd„Zdd„ZdS )	ÚTestMonsterSystemÚreturnNc           	      ó  — t          ¦   «         }|                     d¦  «        }|                     d¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}|j        }|j        }	||	k    }|sèt          j        d|fd	||	f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |	¦  «        dœz  }
dd|
iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}	|j        }|j        }	||	k    }|sèt          j        d|fd||	f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |	¦  «        dœz  }
dd|
iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}	|j        }|j        }	||	k    }|sèt          j        d|fd||	f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |	¦  «        dœz  }
dd|
iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}	|j        }|j        }	||	k    }|sèt          j        d|fd||	f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |	¦  «        dœz  }
dd|
iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}	|j        }|j        }	||	k    }|sèt          j        d|fd||	f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |	¦  «        dœz  }
dd|
iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}	|j        }|j        }|j        }|j        }||k    }	|	�st          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}	x}}|j        }|j        }|j        }|j        }||k    }	|	�st          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d
t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd
t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}	x}}dS )zDGeneration of a monster with same ID must produce identical results.i9  ©ú==)z2%(py2)s
{%(py2)s = %(py0)s.monster_id
} == %(py5)sÚm1©Úpy0Úpy2Úpy5úassert %(py7)sÚpy7N)zF%(py2)s
{%(py2)s = %(py0)s.name
} == %(py6)s
{%(py6)s = %(py4)s.name
}Úm2©r   r   Úpy4Úpy6úassert %(py8)sÚpy8)zH%(py2)s
{%(py2)s = %(py0)s.genus
} == %(py6)s
{%(py6)s = %(py4)s.genus
})zL%(py2)s
{%(py2)s = %(py0)s.element
} == %(py6)s
{%(py6)s = %(py4)s.element
})zF%(py2)s
{%(py2)s = %(py0)s.rank
} == %(py6)s
{%(py6)s = %(py4)s.rank
})zJ%(py2)s
{%(py2)s = %(py0)s.max_hp
} == %(py6)s
{%(py6)s = %(py4)s.max_hp
})zŒ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.visual
}.base_scale
} == %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.visual
}.base_scale
}©r   r   r   r   r   Úpy10úassert %(py12)sÚpy12)zœ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.aggression
}.ferocity_index
} == %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.aggression
}.ferocity_index
})r   Úgenerate_monsterÚ
monster_idÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚnameÚgenusÚelementÚrankÚmax_hpÚvisualÚ
base_scaleÚ
aggressionÚferocity_index)ÚselfÚenginer   r   Ú@py_assert1Ú@py_assert4Ú@py_assert3Ú@py_format6Ú@py_format8Ú@py_assert5Ú@py_format7Ú@py_format9Ú@py_assert7Ú@py_assert9Ú@py_format11Ú@py_format13s                   ú7C:\Projects\FreeExile\tests\unit\test_monster_system.pyÚ,test_single_monster_generation_deterministicz>TestMonsterSystem.test_single_monster_generation_deterministic   sA	  € å(Ñ*Ô*ˆØ×$Ò$ TÑ*Ô*ˆØ×$Ò$ TÑ*Ô*ˆàŒ}Ð$ Ð$ˆ} Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ} Ð$Ñ$Ô$Ð$Õ$Ô$Ñ$Ô$Ð$Ð$Õ$Ô$ˆrÑ$Ô$Ð$Õ$Ô$ˆrÑ$Ô$Ð$Ð$Õ$Ô$ˆ}Ñ$Ô$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ØŒwÐ!˜"œ'Ð!ˆw˜'Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆw˜'Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆrÑ!Ô!Ð!Õ!Ô!ˆrÑ!Ô!Ð!Ð!Õ!Ô!ˆwÑ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!˜"Ñ!Ô!Ð!Õ!Ô!˜"Ñ!Ô!Ð!Ð!Õ!Ô!˜'Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØŒxÐ#˜2œ8Ð#ˆx˜8Ò#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆx˜8Ð#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆrÑ#Ô#Ð#Õ#Ô#ˆrÑ#Ô#Ð#Ð#Õ#Ô#ˆxÑ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#˜2Ñ#Ô#Ð#Õ#Ô#˜2Ñ#Ô#Ð#Ð#Õ#Ô#˜8Ñ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#ØŒzÐ'˜RœZÐ'ˆz˜ZÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆz˜ZÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆrÑ'Ô'Ð'Õ'Ô'ˆrÑ'Ô'Ð'Ð'Õ'Ô'ˆzÑ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'˜RÑ'Ô'Ð'Õ'Ô'˜RÑ'Ô'Ð'Ð'Õ'Ô'˜ZÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØŒwÐ!˜"œ'Ð!ˆw˜'Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆw˜'Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆrÑ!Ô!Ð!Õ!Ô!ˆrÑ!Ô!Ð!Ð!Õ!Ô!ˆwÑ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!˜"Ñ!Ô!Ð!Õ!Ô!˜"Ñ!Ô!Ð!Ð!Õ!Ô!˜'Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!ØŒyÐ%˜BœIÐ%ˆy˜IÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆy˜IÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆrÑ%Ô%Ð%Õ%Ô%ˆrÑ%Ô%Ð%Ð%Õ%Ô%ˆyÑ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%˜BÑ%Ô%Ð%Õ%Ô%˜BÑ%Ô%Ð%Ð%Õ%Ô%˜IÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØŒyÐ;ˆyÔ#Ð; r¤yÐ; yÔ';Ð;Ð#Ð';Ò;Ð;Ð;Ñ;Õ;Ô;Ð;Ð;Ð;Ð;Ð#Ð';Ð;Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;ˆrÑ;Ô;Ð;Õ;Ô;ˆrÑ;Ô;Ð;Ð;Õ;Ô;ˆyÑ;Ô;Õ;Ô;Ð#Ñ;Ô;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô; rÑ;Ô;Ð;Õ;Ô; rÑ;Ô;Ð;Ð;Õ;Ô; yÑ;Ô;Õ;Ô;Ð';Ñ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ØŒ}ÐKˆ}Ô+ÐK¨r¬}ÐK¨}Ô/KÐKÐ+Ð/KÒKÐKÐKÑKÕKÔKÐKÐKÐKÐKÐ+Ð/KÐKÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔKˆrÑKÔKÐKÕKÔKˆrÑKÔKÐKÐKÕKÔKˆ}ÑKÔKÕKÔKÐ+ÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK¨rÑKÔKÐKÕKÔK¨rÑKÔKÐKÐKÕKÔK¨}ÑKÔKÕKÔKÐ/KÑKÔKÐKÐKÑKÐKÐKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKó    c                 ó„  — t          ¦   «         }|                     dd¬¦  «        }|                     dd¬¦  «        }|                     dd¬¦  «        }|j        }|j        }|j        }|j        }||k     }	|j        }
|
j        }||k     }|	r|�stt	          j        d|	|fd|||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd	t	          j	        |¦  «        t	          j	        |¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |
¦  «        t	          j	        |¦  «        dœ	z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}	x}x}x}x}
}|j        }|j        }|j        }|j        }||k     }	|	�st	          j        d|	fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}	x}}|j        }|j        }|j        }|j        }||k     }	|j        }
|
j        }||k     }|	r|�stt	          j        d|	|fd|||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd	t	          j	        |¦  «        t	          j	        |¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |
¦  «        t	          j	        |¦  «        dœ	z  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}	x}x}x}x}
}|j        }|j        }|j        }|j        }||k     }	|	�st	          j        d|	fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}	x}}|j        }|j        }|j        }|j        }||k     }	|	�st	          j        d|	fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}	x}}|j        }|j        }|j        }|j        }||k    }	|	�st	          j        d|	fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}	x}}|j        }|j        }|j        }|j        }||k    }	|	�st	          j        d|	fd||f¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}	x}}|j        }|j        }|j        }|j        }||k    }	|	�st	          j        d|	fd||f¦  «        d
t          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        nd
t	          j	        |¦  «        t	          j	        |¦  «        dt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}x}	x}}dS )zRLevel 100 monsters must have strictly greater ferocity, speed, aggro than Level 1.é
   é   ©Útarget_levelé2   éd   )ú<rO   )z‹%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.visual
}.base_scale
} < %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s.visual
}.base_scale
}z�%(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s.visual
}.base_scale
} < %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s.visual
}.base_scale
}Úlow_lvlÚmid_lvlÚhigh_lvl)	r   r   r   r   Úpy9Úpy11r#   Úpy14Úpy16zassert %(py18)sÚpy18N©rO   )z—%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.visual
}.collision_radius
} < %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.visual
}.collision_radius
}r    r"   r#   )z›%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.aggression
}.ferocity_index
} < %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s.aggression
}.ferocity_index
}z %(py11)s
{%(py11)s = %(py9)s
{%(py9)s = %(py7)s.aggression
}.ferocity_index
} < %(py16)s
{%(py16)s = %(py14)s
{%(py14)s = %(py12)s.aggression
}.ferocity_index
})z¥%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.aggression
}.aggro_radius_meters
} < %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.aggression
}.aggro_radius_meters
})z›%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.aggression
}.movement_speed
} < %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.aggression
}.movement_speed
})ú>)zŸ%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.aggression
}.attack_windup_ms
} > %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.aggression
}.attack_windup_ms
})z£%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.aggression
}.attack_cooldown_ms
} > %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.aggression
}.attack_cooldown_ms
})ú>=)z”%(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.aggression
}.combo_hits
} >= %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.aggression
}.combo_hits
})r   r$   r3   r4   r&   r'   r(   r)   r*   r+   r,   r-   Úcollision_radiusr5   r6   Úaggro_radius_metersÚmovement_speedÚattack_windup_msÚattack_cooldown_msÚ
combo_hits)r7   r8   rP   rQ   rR   r9   r;   Ú@py_assert8Ú@py_assert10r>   Ú@py_assert13Ú@py_assert15Ú@py_assert6Ú@py_format17Ú@py_format19rA   rB   rC   rD   s                      rE   Ú-test_level_distribution_and_monotonic_scalingz?TestMonsterSystem.test_level_distribution_and_monotonic_scaling,   se  € å(Ñ*Ô*ˆØ×)Ò)¨"¸1Ð)Ñ=Ô=ˆØ×)Ò)¨"¸2Ð)Ñ>Ô>ˆØ×*Ò*¨2¸CÐ*Ñ@Ô@ˆð Œ~Ðaˆ~Ô(Ða¨7¬>Ða¨>Ô+DÐaÐ(Ð+DÒaÐaÀxÄÐaÀÔGaÐaÐ+DÐGaÒaÐaÐaÐaÐaÑaÕaÔaÐaÐaÐaÐaÐaÐ(Ð+DÐGaÐaÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔaˆwÑaÔaÐaÕaÔaˆwÑaÔaÐaÐaÕaÔaˆ~ÑaÔaÕaÔaÐ(ÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔa¨7ÑaÔaÐaÕaÔa¨7ÑaÔaÐaÐaÕaÔa¨>ÑaÔaÕaÔaÐ+DÑaÔaÐaÕaÔaÑaÔaÐaÐaÕaÔaÀxÑaÔaÐaÕaÔaÀxÑaÔaÐaÐaÕaÔaÀÑaÔaÕaÔaÐGaÑaÔaÐaÐaÑaÐaÐaÐaÐaÐaÑaÐaÕaÕaÔaÐaÑaÔaÑaÔaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaÐaØŒ~ÐQˆ~Ô.ÐQ°´ÐQ°Ô1QÐQÐ.Ð1QÒQÐQÐQÑQÕQÔQÐQÐQÐQÐQÐ.Ð1QÐQÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQˆwÑQÔQÐQÕQÔQˆwÑQÔQÐQÐQÕQÔQˆ~ÑQÔQÕQÔQÐ.ÑQÔQÐQÕQÔQÑQÔQÐQÐQÕQÔQ°ÑQÔQÐQÕQÔQ°ÑQÔQÐQÐQÕQÔQ°ÑQÔQÕQÔQÐ1QÑQÔQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQð Ô!ÐyÐ!Ô0Ðy°7Ô3EÐyÐ3EÔ3TÐyÐ0Ð3TÒyÐyÐW_ÔWjÐyÐWjÔWyÐyÐ3TÐWyÒyÐyÐyÐyÐyÑyÕyÔyÐyÐyÐyÐyÐyÐ0Ð3TÐWyÐyÑyÔyÐyÕyÔyÑyÔyÐyÐyÕyÔyˆwÑyÔyÐyÕyÔyˆwÑyÔyÐyÐyÕyÔyÐ!ÑyÔyÕyÔyÐ0ÑyÔyÐyÕyÔyÑyÔyÐyÐyÕyÔy°7ÑyÔyÐyÕyÔy°7ÑyÔyÐyÐyÕyÔyÐ3EÑyÔyÕyÔyÐ3TÑyÔyÐyÕyÔyÑyÔyÐyÐyÕyÔyÐW_ÑyÔyÐyÕyÔyÐW_ÑyÔyÐyÐyÕyÔyÐWjÑyÔyÕyÔyÐWyÑyÔyÐyÐyÑyÐyÐyÐyÐyÐyÑyÐyÕyÕyÔyÐyÑyÔyÑyÔyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyÐyØÔ!Ð_Ð!Ô5Ð_¸Ô8KÐ_Ð8KÔ8_Ð_Ð5Ð8_Ò_Ð_Ð_Ñ_Õ_Ô_Ð_Ð_Ð_Ð_Ð5Ð8_Ð_Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_ˆwÑ_Ô_Ð_Õ_Ô_ˆwÑ_Ô_Ð_Ð_Õ_Ô_Ð!Ñ_Ô_Õ_Ô_Ð5Ñ_Ô_Ð_Õ_Ô_Ñ_Ô_Ð_Ð_Õ_Ô_¸Ñ_Ô_Ð_Õ_Ô_¸Ñ_Ô_Ð_Ð_Õ_Ô_Ð8KÑ_Ô_Õ_Ô_Ð8_Ñ_Ô_Ð_Ð_Ñ_Ð_Ð_Ð_Ð_Ð_Ñ_Ð_Õ_Õ_Ô_Ð_Ñ_Ô_Ñ_Ô_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_Ð_ØÔ!ÐUÐ!Ô0ÐU°8Ô3FÐUÐ3FÔ3UÐUÐ0Ð3UÒUÐUÐUÑUÕUÔUÐUÐUÐUÐUÐ0Ð3UÐUÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔUˆwÑUÔUÐUÕUÔUˆwÑUÔUÐUÐUÕUÔUÐ!ÑUÔUÕUÔUÐ0ÑUÔUÐUÕUÔUÑUÔUÐUÐUÕUÔU°8ÑUÔUÐUÕUÔU°8ÑUÔUÐUÐUÕUÔUÐ3FÑUÔUÕUÔUÐ3UÑUÔUÐUÐUÑUÐUÐUÐUÐUÐUÑUÐUÕUÕUÔUÐUÑUÔUÑUÔUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUÐUð Ô!ÐYÐ!Ô2ÐY°XÔ5HÐYÐ5HÔ5YÐYÐ2Ð5YÒYÐYÐYÑYÕYÔYÐYÐYÐYÐYÐ2Ð5YÐYÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔYˆwÑYÔYÐYÕYÔYˆwÑYÔYÐYÐYÕYÔYÐ!ÑYÔYÕYÔYÐ2ÑYÔYÐYÕYÔYÑYÔYÐYÐYÕYÔY°XÑYÔYÐYÕYÔY°XÑYÔYÐYÐYÕYÔYÐ5HÑYÔYÕYÔYÐ5YÑYÔYÐYÐYÑYÐYÐYÐYÐYÐYÑYÐYÕYÕYÔYÐYÑYÔYÑYÔYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYÐYØÔ!Ð]Ð!Ô4Ð]°xÔ7JÐ]Ð7JÔ7]Ð]Ð4Ð7]Ò]Ð]Ð]Ñ]Õ]Ô]Ð]Ð]Ð]Ð]Ð4Ð7]Ð]Ñ]Ô]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]ˆwÑ]Ô]Ð]Õ]Ô]ˆwÑ]Ô]Ð]Ð]Õ]Ô]Ð!Ñ]Ô]Õ]Ô]Ð4Ñ]Ô]Ð]Õ]Ô]Ñ]Ô]Ð]Ð]Õ]Ô]°xÑ]Ô]Ð]Õ]Ô]°xÑ]Ô]Ð]Ð]Õ]Ô]Ð7JÑ]Ô]Õ]Ô]Ð7]Ñ]Ô]Ð]Ð]Ñ]Ð]Ð]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ð]ð Ô"ÐNÐ"Ô-ÐN°Ô1CÐNÐ1CÔ1NÐNÐ-Ð1NÒNÐNÐNÑNÕNÔNÐNÐNÐNÐNÐ-Ð1NÐNÑNÔNÐNÕNÔNÑNÔNÐNÐNÕNÔNˆxÑNÔNÐNÕNÔNˆxÑNÔNÐNÐNÕNÔNÐ"ÑNÔNÕNÔNÐ-ÑNÔNÐNÕNÔNÑNÔNÐNÐNÕNÔN°ÑNÔNÐNÕNÔN°ÑNÔNÐNÐNÕNÔNÐ1CÑNÔNÕNÔNÐ1NÑNÔNÐNÐNÑNÐNÐNÐNÐNÐNÑNÐNÕNÕNÔNÐNÑNÔNÑNÔNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNÐNrG   c           	      óÈ  — t          ¦   «         }t          j        ¦   «         }|                     dd¬¦  «        }t          j        ¦   «         |z
  dz  }t	          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        d	œz  }d
d|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}x}}d}||k     }
|
s±t          j        d|
fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }t          j        d|d›d�¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
}d„ |D ¦   «         }t	          |¦  «        }t	          t          ¦  «        }||k    }|�s‚t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndt          j
        |¦  «        dœz  }	dd|	iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d„ |D ¦   «         }t	          |¦  «        }t	          t          ¦  «        }||k    }|�s‚t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndd t          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nd t          j
        |¦  «        dœz  }	dd|	iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}d!„ |D ¦   «         }t	          |¦  «        }t	          t           ¦  «        }||k    }|�s‚t          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndd"t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd"t          j
        |¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        ndd#t          j        ¦   «         v st          j	        t           ¦  «        rt          j
        t           ¦  «        nd#t          j
        |¦  «        dœz  }	dd|	iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS )$zVValidates that generating 10,000 distinct monsters completes in < 250ms with 0 errors.rJ   i'  )Ústart_idÚcountiè  r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚlenÚmonsters)r   Úpy1Úpy3r   r   r   Ng     @@rX   )z%(py0)s < %(py3)sÚ
elapsed_ms)r   ro   zProcedural generation took z.2fzms, exceeds 500ms limitz
>assert %(py5)sr   c                 ó   — h | ]	}|j         ’Œ
S © )r/   ©Ú.0Úms     rE   ú	<setcomp>zXTestMonsterSystem.test_all_10_000_variants_generation_and_performance.<locals>.<setcomp>P   s   € Ð7Ð7Ð7¨˜QœWÐ7Ð7Ð7rG   )zN%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py8)s
{%(py8)s = %(py5)s(%(py6)s)
}Úrepresented_genusr   ©r   rn   ro   r   r   r   zassert %(py10)sr!   c                 ó   — h | ]	}|j         ’Œ
S rr   )r0   rs   s     rE   rv   zXTestMonsterSystem.test_all_10_000_variants_generation_and_performance.<locals>.<setcomp>T   s   € Ð<Ð<Ð<¨a ¤	Ð<Ð<Ð<rG   Úrepresented_elementsr   c                 ó   — h | ]	}|j         ’Œ
S rr   )r1   rs   s     rE   rv   zXTestMonsterSystem.test_all_10_000_variants_generation_and_performance.<locals>.<setcomp>X   s   € Ð6Ð6Ð6¨˜QœVÐ6Ð6Ð6rG   Úrepresented_ranksr   )r   ÚtimeÚperf_counterÚgenerate_batchrl   r&   r'   r(   r)   r*   r+   r,   r-   Ú_format_assertmsgr   r   r   )r7   r8   Ú
start_timerm   rp   Ú@py_assert2r>   r:   r?   r@   r9   Ú@py_format4r<   rw   rA   rC   rz   r|   s                     rE   Ú3test_all_10_000_variants_generation_and_performancezETestMonsterSystem.test_all_10_000_variants_generation_and_performanceC   sv  € å(Ñ*Ô*ˆÝÔ&Ñ(Ô(ˆ
à×(Ò(°!¸5Ð(ÑAÔAˆÝÔ'Ñ)Ô)¨JÑ6¸$Ñ>ˆ
å�8‰}Œ}Ð% Ð%ˆ} Ò%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ} Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�sÑ%Ô%Ð%Õ%Ô%�sÑ%Ô%Ð%Ð%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�8Ñ%Ô%Ð%Õ%Ô%�8Ñ%Ô%Ð%Ð%Õ%Ô%ˆ}Ñ%Ô%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%à!Ðhˆz˜EÒ!ÐhÐhÐhÕhÔhÐhÐhÐhÐhˆz˜EÐhÑhÔhÐhÕhÔhÑhÔhÐhÐhÕhÔhˆzÑhÔhÐhÕhÔhˆzÑhÔhÐhÐhÕhÔh˜EÑhÔhÐhÐhÑhÐhÕhÔhÐ#hÀÐ#hÐ#hÐ#hÐ#hÑhÔhÐhÑhÐhÐhÐhÑhÐhÕhÕhÔhÐhÑhÔhÑhÔhÐhÐhÐhÐhÐhð 8Ð7¨hÐ7Ñ7Ô7ÐÝÐ$Ñ%Ô%Ð:­­\Ñ):Ô):Ð:Ð%Ð):Ò:Ð:Ð:Ñ:Õ:Ô:Ð:Ð:Ð:Ð:Ð%Ð):Ð:Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:�sÑ:Ô:Ð:Õ:Ô:�sÑ:Ô:Ð:Ð:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:Ð$Ñ:Ô:Ð:Õ:Ô:Ð$Ñ:Ô:Ð:Ð:Õ:Ô:Ð%Ñ:Ô:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:­Ñ:Ô:Ð:Õ:Ô:­Ñ:Ô:Ð:Ð:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:­\Ñ:Ô:Ð:Õ:Ô:­\Ñ:Ô:Ð:Ð:Õ:Ô:Ð):Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:ð  =Ð<°8Ð<Ñ<Ô<ÐÝÐ'Ñ(Ô(Ð=­CµÑ,=Ô,=Ð=Ð(Ð,=Ò=Ð=Ð=Ñ=Õ=Ô=Ð=Ð=Ð=Ð=Ð(Ð,=Ð=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=�sÑ=Ô=Ð=Õ=Ô=�sÑ=Ô=Ð=Ð=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=Ð'Ñ=Ô=Ð=Õ=Ô=Ð'Ñ=Ô=Ð=Ð=Õ=Ô=Ð(Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=­CÑ=Ô=Ð=Õ=Ô=­CÑ=Ô=Ð=Ð=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=µÑ=Ô=Ð=Õ=Ô=µÑ=Ô=Ð=Ð=Õ=Ô=Ð,=Ñ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ð 7Ð6¨XÐ6Ñ6Ô6ÐÝÐ$Ñ%Ô%Ð9­­[Ñ)9Ô)9Ð9Ð%Ð)9Ò9Ð9Ð9Ñ9Õ9Ô9Ð9Ð9Ð9Ð9Ð%Ð)9Ð9Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9�sÑ9Ô9Ð9Õ9Ô9�sÑ9Ô9Ð9Ð9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9Ð$Ñ9Ô9Ð9Õ9Ô9Ð$Ñ9Ô9Ð9Ð9Õ9Ô9Ð%Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9­Ñ9Ô9Ð9Õ9Ô9­Ñ9Ô9Ð9Ð9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9­[Ñ9Ô9Ð9Õ9Ô9­[Ñ9Ô9Ð9Ð9Õ9Ô9Ð)9Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9rG   c           	      óä  — t          ¦   «         }|                     d¦  «        }d}|j        }|j        }||k    }d}||k    }|r|sÒt	          j        d||fd|||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j	        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }	dd	|	iz  }
t          t	          j        |
¦  «        ¦  «        ‚d
x}x}x}x}x}}|j        }|j        }|j        }d} ||¦  «        }|sÄddt          j        ¦   «         v st	          j	        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }	t          t	          j        |	¦  «        ¦  «        ‚d
x}x}x}x}}|j        }|j        }t          |t           ¦  «        }|�s.ddt          j        ¦   «         v st	          j	        t          ¦  «        rt	          j        t          ¦  «        nddt          j        ¦   «         v st	          j	        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j	        t           ¦  «        rt	          j        t           ¦  «        ndt	          j        |¦  «        dœz  }t          t	          j        |¦  «        ¦  «        ‚d
x}x}}d}|j        }|j        }||k    }d}||k    }|r|sÒt	          j        d||fd|||f¦  «        t	          j        |¦  «        dt          j        ¦   «         v st	          j	        |¦  «        rt	          j        |¦  «        ndt	          j        |¦  «        t	          j        |¦  «        t	          j        |¦  «        dœz  }	dd	|	iz  }
t          t	          j        |
¦  «        ¦  «        ‚d
x}x}x}x}x}}d
S )zcMonsters must contain valid shader palette LUT index and attachment keys for client GPU instancing.i+  r   é   )ú<=r‡   )zU%(py1)s <= %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.visual
}.palette_lut_index
}zV%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.visual
}.palette_lut_index
} <= %(py10)sru   )rn   r   r   r   r!   r"   r#   Nú#z’assert %(py10)s
{%(py10)s = %(py6)s
{%(py6)s = %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.visual
}.elemental_tint_hex
}.startswith
}(%(py8)s)
}r    zuassert %(py8)s
{%(py8)s = %(py0)s(%(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.visual
}.attachment_ids
}, %(py6)s)
}Ú
isinstanceÚlistrx   g        g       @)z[%(py1)s <= %(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.visual
}.emissive_glow_intensity
}z\%(py8)s
{%(py8)s = %(py6)s
{%(py6)s = %(py4)s.visual
}.emissive_glow_intensity
} <= %(py10)s)r   r$   r3   Úpalette_lut_indexr&   r'   r+   r(   r)   r*   r,   r-   Úelemental_tint_hexÚ
startswithÚattachment_idsr‰   rŠ   Úemissive_glow_intensity)r7   r8   ru   Ú@py_assert0r>   rA   r‚   rB   r;   rC   rD   r9   r:   r@   s                 rE   Ú/test_procedural_palette_and_modular_attachmentszATestMonsterSystem.test_procedural_palette_and_modular_attachments[   sÄ  € å(Ñ*Ô*ˆØ×#Ò# CÑ(Ô(ˆàÐ4�A”HÐ4�HÔ.Ð4ˆqÐ.Ò4Ð4°"Ð4Ð.°"Ò4Ð4Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð4ˆqÐ.°"Ð4Ñ4Ô4Õ4Ô4ˆqÑ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4�AÑ4Ô4Ð4Õ4Ô4�AÑ4Ô4Ð4Ð4Õ4Ô4�HÑ4Ô4Õ4Ô4Ð.Ñ4Ô4Õ4Ô4°"Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4ØŒxÐ:ˆxÔ*Ð:Ð*Ô5Ð:°cÐ:Ð5Ð5°cÑ:Ô:Ð:Ð:Ð:Ð:Ð:Õ:Ô:Ñ:Ô:Ð:Ð:Õ:Ô:ˆqÑ:Ô:Ð:Õ:Ô:ˆqÑ:Ô:Ð:Ð:Õ:Ô:ˆxÑ:Ô:Õ:Ô:Ð*Ñ:Ô:Õ:Ô:Ð5Ñ:Ô:Õ:Ô:°cÑ:Ô:Õ:Ô:Ð:Ñ:Ô:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Øœ(Ð8˜(Ô1Ð8�zÐ1µ4Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8�zÑ8Ô8Ð8Õ8Ô8�zÑ8Ô8Ð8Ð8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8˜!Ñ8Ô8Ð8Õ8Ô8˜!Ñ8Ô8Ð8Ð8Õ8Ô8˜(Ñ8Ô8Õ8Ô8Ð1Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8µ4Ñ8Ô8Ð8Õ8Ô8µ4Ñ8Ô8Ð8Ð8Õ8Ô8Ð8Ñ8Ô8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ØÐ=�a”hÐ=�hÔ6Ð=ˆsÐ6Ò=Ð=¸#Ð=Ð6¸#Ò=Ð=Ð=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð=ˆsÐ6¸#Ð=Ñ=Ô=Õ=Ô=ˆsÑ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=�aÑ=Ô=Ð=Õ=Ô=�aÑ=Ô=Ð=Ð=Õ=Ô=�hÑ=Ô=Õ=Ô=Ð6Ñ=Ô=Õ=Ô=¸#Ñ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ð=rG   c           	      óP  — t          ¦   «         }t          ¦   «         }|                     dd¬¦  «        }t          |dddd|j        t
          j        ¬¦  «        }|                     |dd¬¦  «        }|j        }t
          j        t
          j	        f}||v }|sªt          j        d	|fd
||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t!          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }d}||v }|sªt          j        d	|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t!          t          j        |
¦  «        ¦  «        ‚dx}x}}d}|                     ||d¬¦  «        }|j        }t
          j        }||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t
          ¦  «        rt          j        t
          ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t!          t          j        |
¦  «        ¦  «        ‚dx}x}}d|_        d|_        |                     ||d¬¦  «        }|j        }t
          j        }||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t
          ¦  «        rt          j        t
          ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t!          t          j        |
¦  «        ¦  «        ‚dx}x}}d|_        d|_        |                     |d d¬¦  «        }|j        }t
          j        }||k    }|sòt          j        d|fd!||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dt          j        ¦   «         v st          j        t
          ¦  «        rt          j        t
          ¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d"}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t!          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        }d#}||u }|sªt          j        d$|fd%||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t!          t          j        |
¦  «        ¦  «        ‚dx}x}}dS )&z^Verifies server-authoritative Feral AI transitions: IDLE -> PURSUIT -> ATTACK -> LEASH_RETURN.rN   é   rK   ç      $@)ÚmonsterÚ	current_xÚ	current_yÚspawn_xÚspawn_yÚ
current_hpÚai_state)ç      I@rœ   gL7‰A`å ?)Ú
player_posÚdt)Úin)z0%(py2)s
{%(py2)s = %(py0)s.ai_state
} in %(py5)sÚstater   r   r   N)ÚSTANDÚPATROL)z3%(py2)s
{%(py2)s = %(py0)s.action_type
} in %(py5)sÚaction)ç      (@r”   r   )zM%(py2)s
{%(py2)s = %(py0)s.ai_state
} == %(py6)s
{%(py6)s = %(py4)s.PURSUIT
}r   r   r   r   ÚMOVE_TOWARDS)z3%(py2)s
{%(py2)s = %(py0)s.action_type
} == %(py5)sr¤   )zL%(py2)s
{%(py2)s = %(py0)s.ai_state
} == %(py6)s
{%(py6)s = %(py4)s.ATTACK
}ÚATTACKç      Y@)g     @Y@r§   )zR%(py2)s
{%(py2)s = %(py0)s.ai_state
} == %(py6)s
{%(py6)s = %(py4)s.LEASH_RETURN
}ÚRETURN_TO_SPAWNT)Úis)z7%(py2)s
{%(py2)s = %(py0)s.is_invulnerable
} is %(py5)s)r   r   r$   r	   r2   r   ÚIDLEÚupdater›   r¢   r&   r'   r(   r)   r*   r+   r,   r-   Úaction_typeÚPURSUITr–   r—   r¦   ÚLEASH_RETURNÚis_invulnerable)r7   r8   Úair•   r    r£   r9   r:   r;   r<   r=   Úplayer_nearr>   r?   r@   s                  rE   Ú%test_feral_ai_state_machine_and_leashz7TestMonsterSystem.test_feral_ai_state_machine_and_leashe   s˜	  € å(Ñ*Ô*ˆÝÑÔˆØ×)Ò)¨#¸BÐ)Ñ?Ô?ˆå#ØØØØØØ”~Ý#Ô(ð
ñ 
ô 
ˆð —’˜5¨\¸e�ÑDÔDˆØŒ~ÐM¥.Ô"5µ~Ô7LÐ!MÐMˆ~Ð!MÐMÐMÐMÐMÕMÔMÐMÐMÐMÐMˆ~Ð!MÐMÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMˆuÑMÔMÐMÕMÔMˆuÑMÔMÐMÐMÕMÔMˆ~ÑMÔMÕMÔMÐ!MÑMÔMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMØÔ!Ð8Ð%8Ð8Ð!Ð%8Ð8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð!Ð%8Ð8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8ˆvÑ8Ô8Ð8Õ8Ô8ˆvÑ8Ô8Ð8Ð8Õ8Ô8Ð!Ñ8Ô8Õ8Ô8Ð%8Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ð #ˆØ—’˜5¨[¸U�ÑCÔCˆØŒ~Ð7¥Ô!7Ð7ˆ~Ð!7Ò7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7ˆ~Ð!7Ð7Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7ˆuÑ7Ô7Ð7Õ7Ô7ˆuÑ7Ô7Ð7Ð7Õ7Ô7ˆ~Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7¥Ñ7Ô7Ð7Õ7Ô7¥Ñ7Ô7Ð7Ð7Õ7Ô7Ð!7Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ØÔ!Ð3 ^Ð3Ð! ^Ò3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð! ^Ð3Ñ3Ô3Ð3Õ3Ô3Ñ3Ô3Ð3Ð3Õ3Ô3ˆvÑ3Ô3Ð3Õ3Ô3ˆvÑ3Ô3Ð3Ð3Õ3Ô3Ð!Ñ3Ô3Õ3Ô3 ^Ñ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3ð ˆŒØˆŒØ—’˜5¨[¸U�ÑCÔCˆØŒ~Ð6¥Ô!6Ð6ˆ~Ð!6Ò6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6ˆ~Ð!6Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6ˆuÑ6Ô6Ð6Õ6Ô6ˆuÑ6Ô6Ð6Ð6Õ6Ô6ˆ~Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6¥Ñ6Ô6Ð6Õ6Ô6¥Ñ6Ô6Ð6Ð6Õ6Ô6Ð!6Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ØÔ!Ð- XÐ-Ð! XÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð! XÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆvÑ-Ô-Ð-Õ-Ô-ˆvÑ-Ô-Ð-Ð-Õ-Ô-Ð!Ñ-Ô-Õ-Ô- XÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð  ˆŒØˆŒØ—’˜5¨^À�ÑFÔFˆØŒ~Ð<¥Ô!<Ð<ˆ~Ð!<Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<ˆ~Ð!<Ð<Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<ˆuÑ<Ô<Ð<Õ<Ô<ˆuÑ<Ô<Ð<Ð<Õ<Ô<ˆ~Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<¥Ñ<Ô<Ð<Õ<Ô<¥Ñ<Ô<Ð<Ð<Õ<Ô<Ð!<Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØÔ!Ð6Ð%6Ð6Ð!Ð%6Ò6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð!Ð%6Ð6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6ˆvÑ6Ô6Ð6Õ6Ô6ˆvÑ6Ô6Ð6Ð6Õ6Ô6Ð!Ñ6Ô6Õ6Ô6Ð%6Ñ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ØÔ$Ð,¨Ð,Ð$¨Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð$¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆuÑ,Ô,Ð,Õ,Ô,ˆuÑ,Ô,Ð,Ð,Õ,Ô,Ð$Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,rG   )r   N)Ú__name__Ú
__module__Ú__qualname__rF   rh   r„   r‘   r²   rr   rG   rE   r   r      s€   € € € € € ðLð Lð Lð LðOð Oð Oð Oð.:ð :ð :ð :ð0>ð >ð >ð >ð(-ð (-ð (-ð (-ð (-ð (-rG   r   ) Ú__doc__Úbuiltinsr(   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter&   Úpytestr}   ÚsysÚosÚpathÚinsertÚabspathÚjoinÚdirnameÚ__file__Úworld.martial_matrixr   Úworld.monster_typesr   r   r   r   r   r	   r
   Úworld.monster_procedural_enginer   Úworld.monster_ai_enginer   r   rr   rG   rE   ú<module>rÈ      s`  ððð ð € € € € € € € € € € € € €€€€Ø €€€Ø 
€
€
€
Ø 	€	€	€	à „‡‚��2”7—?’? 2¤7§<¢<°´·²ÀÑ0IÔ0IÈ>Ñ#ZÔ#ZÑ[Ô[Ñ \Ô \Ð \à -Ð -Ð -Ð -Ð -Ð -ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð DÐ CÐ CÐ CÐ CÐ CØ 3Ð 3Ð 3Ð 3Ð 3Ð 3ðq-ð q-ð q-ð q-ð q-ñ q-ô q-ð q-ð q-ð q-rG   