
    -`j(6              	         d Z ddlmZ ddlZddlZddlmZmZ ddlm	Z	 ddl
mZ  e	e      j                         j                  d   Zedz  Z ej"                  d	ej$                        Zd
ddd
ddd
dddddddddddddddZej+                         D  ch c]  } | d   	 c} ZddZddZddZddZd dZd!dZd"dZedk(  r e        yyc c} w )#a  Build the field-character speaker/name review dataset.

Speaker labels come from prompt rows already classified as ``speaker``.  CNS
associations remain candidates unless the asset identity is independently
grounded; sharing one scene/resource root is not a rect-level binding.
    )annotationsN)Counterdefaultdict)Path)Any   outz/^cara_(?:[0-9][0-9a-f]?|at[123]|rs[12]|sm[12])$u	   아타호u>   주인공 필드 보행 CNS 역할 및 파일명 대응 확정)nameevidenceuA   아타호 필드 이벤트 CNS 역할 및 파일명 대응 확정u>   아타호 필드 변형 CNS 역할 및 파일명 대응 확정u   린샹u>   린샹 필드 이벤트 CNS 역할 및 파일명 대응 확정u	   스마슈uA   스마슈 필드 이벤트 CNS 역할 및 파일명 대응 확정)cara_at1cara_at2cara_at3cara_rs1cara_rs2cara_sm1cara_sm2r
   c                L    t        j                  | j                  d            S )Nutf-8encoding)jsonloads	read_text)paths    .tools/build_field_character_identity_review.py	load_jsonr   8   s    ::dnngn677    c                    | j                  d      xs g }|r|d   j                  d      dk7  ryt        |d   j                  d      xs d      j                         S )NlineRowsr   kindspeaker text)getstrstrip)promptrowss     r   speaker_namer)   <   sU    ::j!'RD47;;v&)3tAw{{6"(b)//11r   c                    g }| xs g D ]X  }t        |      j                         }|j                  d      r|d d }t        j	                  |      sH|j                  |       Z t        t        |            S )N.cns)r%   lowerendswithPRIMARY_ASSET_RE	fullmatchappendsortedset)	resourcesresultresourcer
   s       r   cara_assetsr7   C   sn    FO  8}""$== 9D%%d+MM$  #f+r   c                    | j                  d      xs g D cg c]5  }t        |      j                         st        |      j                         7 }}dj                  |d d       S c c}w )Nlinesz /    )r$   r%   r&   join)r'   liner9   s      r   prompt_sampler=   N   sV    ,2JJw,?,E2\4#d)//J[SY__\E\::eBQi   ]s
   A(A(c                   t        | j                  d|      xs d      t        | j                  d      xs d|       t        | j                  dd      xs d      t        | j                  dd      xs d      t        | j                  dd      xs d      t        | j                  dd      xs d      t        | j                  d	      xs d
      dS )Nindexr   label#xywhsourceLabelr"   )r?   r@   rB   rC   rD   rE   rF   )intr$   r%   )rectr?   s     r   
clean_rectrI   S   s    TXXgu-23TXXg&5AeW+6#q!&Q'#q!&Q'#q!&Q'#q!&Q'488M28b9 r   c                    t        t        dz        } t        t        dz        }t        t        dz        }t        t        dz        }t        t        dz        }| j                  d      xs g }|D ci c]  }|d   |
 }}|D cg c]  }t        |      s| }}t	        d |D              }	|j                  d	      xs g D 
ch c]Z  }
t        |
j                  d
      xs d      j                         r,t        |
j                  d
      xs d      j                         \ }}
t        d       }t        d       }d}d}|D ]  }t        |      }|t        v rt        |j                  d            D cg c]  }|t        vr| }}t        |      dk(  r||d      |   j                  |d          rt        |      dkD  s|dz  } |j                  d      xs g D ci c]  }|d   |
 }}|j                  d      xs g D ]  }|j                  |j                  d      i       }t        |j                  d            D cg c]  }|t        vr| }}|sWt        |      dkD  r|dz  }k|d   }t               }|j                  d      xs g D ]I  }|j                  d      xs g D ]/  }
|j                  t        |
j                  d      xs d             1 K |D ]  }|j                  |      }|st        |      }|r|t        v r-||   |   }|d   j                  |       |d   j                  t        |j                  d      xs d             |d   j                  t        |j                  d      xs d             |d   j                  t        |j                  d      xs d               |j                  d      xs g D 
ci c]P  }
t        |
j                  d      xs d      dk(  r-t        |
j                  d      xs d      j                         |
R }}
g }t        |j!                               D ]  \  }}
t"        j%                  |      st        j                  |      }t        |j                  |i             t        |j                  |i             z  }g }|D ]  }|j                  |i       j                  |t                     }|j                  |i       j                  |      xs' t               t               t               t               d} |j'                  |t        |      t        | d         t        | d         t        || d   z        t        | d         t        d | d   D              t        d | d   D              |rdnd ||v d!
        |j)                  d" #       t+        |
j                  d$      xs g       D !"cg c]  \  }!}"t-        |"|!       }#}!}"|j'                  |t        |
j                  d%      xs | d&      t/        |
j                  d'      xs d      t/        |
j                  d(      xs d      t        |
j                  d)      xs d      t        |
j                  d*      xs d      t        |
j                  d+      xs d      t        |#      |#|rd,nd-|t        |      |d.| d/        t        t0              }$|D ]]  }|d0   r$|d0   d1   }|$|   j'                  |d   d,ddd2       |d3   D ]*  }%|$|%d1      j'                  |d   |%d4   |%d5   |%d6   d2       , _ t        t0              }&|D ]  }|&t        |         j'                  |       ! g }'|&j!                         D ]  \  }}(|$j                  |g       }|j)                  d7 #       t3        |(d8 #      })|'j'                  |t        |(      t        |(D 
ch c]   }
t        |
j                  d9      xs d      " c}
      |)j                  d      |)j                  d:      t5        |)      t7        t        t	        d; |(D              j!                                     |||v d<	        |'j)                  d= #       t        d> |D              }*t9        d? |D              }+dd@g dAt        |      t        |      t        |'      t        |      t        |      z
  t7        t        |	j!                                     t        |      t9        dB |D              |+t9        dC |D              |*d||dDg dE||'dFS c c}w c c}w c c}
w c c}w c c}w c c}w c c}
w c c}"}!w c c}
w )GNzstory_prompts.jsonzcns_rect_review_data.jsonzscene_script_player_data.jsonz*scene_seq_resource_record_link_review.jsonz"battle_monster_action_catalog.jsonpromptsidc              3     K   | ]9  }t        |j                  d       xs i gd   j                  d      xs d       ; yw)r   r   r    missingNr%   r$   ).0r'   s     r   	<genexpr>zbuild.<locals>.<genexpr>i   sB        	VZZ
#+tQ/33F;HyI s   ?Aenemies	enemyNamer"   c                      t        t              S N)r   r3    r   r   <lambda>zbuild.<locals>.<lambda>t   s    {SVGW r   c                     t        d       S )Nc                 P    t               t               t               t               dS )NrK   groupscontextsr   )r3   rV   r   r   rW   z)build.<locals>.<lambda>.<locals>.<lambda>v   s    TWTYgjgl$m r   )r   rV   r   r   rW   zbuild.<locals>.<lambda>v   s    mn r   r   resourceNamesr   r[   r4   	sequencesr\   contextLabelr   evidenceStatusr(   group	characterassetrZ   c              3  &   K   | ]	  }|s|  y wrU   rV   rP   values     r   rQ   zbuild.<locals>.<genexpr>   s     &Uuu&U   c              3  &   K   | ]	  }|s|  y wrU   rV   re   s     r   rQ   zbuild.<locals>.<genexpr>   s     .]W\u.]rg   z!dialogue-block-resource-candidatezscene-root-co-load-candidate)
r
   directPromptCountscenePromptCountsceneGroupCount	promptIdssceneGroupsr\   evidenceStatusesevidenceLevelmonsterCatalogNameOverlapc                ,    | d    | d    | d    | d   fS )Nri   rk   rj   r
   rV   items    r   rW   zbuild.<locals>.<lambda>   s4    )**'((())V	 r   )keyrectscnsr+   widthheightstatusstatusLabelselectedRectSourceconfirmed-cns-identityzrect-identity-unboundz"field_character_review.html?asset=)rc   rv   rw   rx   
rectStatusrectStatusLabel
rectSource	rectCountru   identityStatusconfirmedIdentitycandidateCountspeakerCandidates
reviewHrefr   r
   )rc   ro   ri   rj   r   ro   ri   rj   c                0    | d   dk7  | d    | d    | d   fS )Nro   r|   ri   rj   rc   rV   rr   s    r   rW   zbuild.<locals>.<lambda>   s6    _%)AA)**())W	 r   c                >    t        | j                  d      xs d      S )NstartVar   )rG   r$   rr   s    r   rW   zbuild.<locals>.<lambda>  s    3txx	/B/Ga+H r   blockId
startVaHexc              3  X   K   | ]"  }t        |j                  d       xs d       $ yw)classificationr"   NrO   )rP   rows     r   rQ   zbuild.<locals>.<genexpr>  s&     6l`cs377CS;T;ZXZ7[6ls   (*)	r
   promptCount
blockCountfirstPromptIdfirstStartVaHexfirstSampleclassificationscnsCandidatesrp   c                    | d    | d   fS )Nr   r
   rV   rr   s    r   rW   zbuild.<locals>.<lambda>  s    T-%8$8$v,#G r   c              3  l   K   | ],  }|j                  d       rt        j                  |      s| . yw)cara_N)
startswithr/   r0   rP   rc   s     r   rQ   zbuild.<locals>.<genexpr>  s4      G$-=-G-G-N 	s   24c              3  2   K   | ]  }|d    s	|d     yw)r   r   NrV   r   s     r   rQ   zbuild.<locals>.<genexpr>  s     `%UK^E_5-`s   

z&hwanse-field-character-identity-review)zout/story_prompts.jsonz!out/scene_script_player_data.jsonz.out/scene_seq_resource_record_link_review.jsonzout/cns_rect_review_data.jsonz+out/active_object_resource_slot_review.jsonc              3  8   K   | ]  }t        |d            ywr   N)boolr   s     r   rQ   zbuild.<locals>.<genexpr>-  s     ,bRWT%8K2L-M,bs   c              3  (   K   | ]
  }|d       ywr   rV   r   s     r   rQ   zbuild.<locals>.<genexpr>/  s     .bRW59L3M/M.bs   )r   speakerPromptCountspeakerLabelCountnonSpeakerFirstLineCountfirstLineKindCountsfieldCnsCountconfirmedCnsIdentityCountconfirmedIdentityRectCountrectIdentityUnboundCnsCountutilityCaraAssetsExcluded+directActiveObjectCharacterRectBindingCount)ambiguousDialogueResourceBundlesNotLinkedambiguousSceneRootsNotLinked)z_Only lineRows[0].kind == speaker is accepted as a speaker label; continuation text is excluded.zNMonster sprite CNS assets are not included in this field-character asset list.ziA shared dialogue/resource block or scene root is a CNS-level candidate, not a rect-level identity proof.zA candidate is emitted only when exactly one unconfirmed field-character CNS exists in that dialogue/resource scope; multi-CNS scopes are left unlinked.zThe 15 direct active-object non-map bindings resolve only to cara_etc interaction objects, so none is promoted as a field-character identity.zUnbound cara_01..cara_25 rects remain unnamed until an object draw selector and prompt producer are linked directly or runtime tracing supplies the binding.)versionr    sourcesummaryevidencePolicyassetsspeakers)r   OUTr$   r)   r   r%   r&   r   KNOWN_PARTY_NAMESr7   CONFIRMED_IDENTITIESlenaddr3   r-   r2   itemsr/   r0   r1   sort	enumeraterI   rG   listminr=   dictsum),story	rect_dataplayerresource_linksmonster_catalogrK   r'   prompts_by_idspeaker_promptsfirst_kind_countsr   monster_namesdirect_linksscene_linksambiguous_direct_bundle_countambiguous_scene_root_countr
   rc   unresolved_assetsra   resource_group_by_idresource_group
prompt_idssequence	prompt_idlink	rect_rowsr   exactnames
candidatesdirect_prompt_idsscener?   rH   ru   asset_candidate_index	candidatespeaker_groupsr   r(   firstutility_assetsexact_rect_counts,                                               r   buildr   _   s	   c001E# ;;<Is<<=Fs%QQRN&J JKOii	"(bG8?@fVD\6)@M@,3L&|F7KvLOL     #&&y17Rsww{#)r*002 	CGGK &B'--/M  4??W3XL=Hn>K %&!!" " /F#$$*6::o+FG
00 
 
  !Q&*1-.t488F"#a')Q.)/ *8););H)E)K$dU  H%+ I-11%))D/2F*>+=+=k+JK
00 
 
 ! !A%&!+&!!$U
		+.4" 	9H||I.4" 9s3774=#6B789	9 $ 	II"&&y1F'D4#44u%d+DO	*Ns599T?#8b9:  UYY~%>%D"!EF  UYY/?%@%FB!GH	I!I> ==(.Bswww%2&+5 	CGGG"#))+S0I  FY__./ 3

s))%0$((/L$$UB/03{ub7Q3RR
 	D , 0 0 ; ? ?ce LOOE2.2248 5CEsuRURW=E  ),->)?(+E),<(='*5?';!'(9E)<L(L!M#)%/#: &&U%
:K&U U(..]%
BS.](]L]%H  dB151F	& 	 	 	
 =FcgggFVF\Z\<]^[UDD%(^^3775>;wd^<SWWW-23cggh/415!#''("3"9r:#&sww}'='C#D!#''*>"?"E2F Z>C":I`%*"%j/%/ B5'J	
E3
j >I=N $%,-f5D!$'...;Sjk  BC  D 23 	I!)F"34;;"7^%.%?)23F)G(12D(E		  7B$6GN! <|F+,33F;< H$**, 

d*..tR8
 	 	
 DHI"4y!D"QS3swwy'9'?R#@"QR!&4#(99\#:,U3#'w6lgk6l/l/r/r/t(u#v!+-1]-B
	

0 MMGMH $ N `6`` 8
 w<"%o"6!$X(+Gs?7K(K#'/@/F/F/H(I#J [),,b[a,b)b*:+..b[a.b+b)7;<9V,F

 E# #k AL&


6P _r #Rs>   4eeeAe"9e'%e,
e1Ae6+e;9%fc            	         t               } t        dz  }|j                  t        j                  | dd      dz   d       t        d|j                  t               d	| d
   d    d| d
   d    d       y )Nz$field_character_identity_review.jsonF   )ensure_asciiindent
r   r   zwrote z: r   r   z CNS, r   z speaker labels)r   r   
write_textr   dumpsprintrelative_toROOT)payloadr   s     r   mainr   B  s    gG77DOODJJwU1ELW^O_	
!!$'(9o.
/v912
3?	Dr   __main__)r   r   returnr   )r'   dict[str, Any]r   r%   )r4   zlist[str] | Noner   z	list[str])rH   r   r?   rG   r   r   )r   r   )r   None)__doc__
__future__r   r   recollectionsr   r   pathlibr   typingr   __file__resolveparentsr   r   compile
IGNORECASEr/   r   valuesr   r   r)   r7   r=   rI   r   r   __name__)r   s   0r   <module>r      s%   #  	 ,   H~''*
Ul2::PRTR_R_`  T
 W
 T
 T
 T
 T
 W3 > -A,G,G,IJSS[J 82!
	`F zF q Ks   C