
    Ii                         S r SSKrSSKJrJr  SSKJr  SSKJrJrJ	r	  SSK
Jr  SS	KJrJr  SS
KJrJr  SSKJr  \ " S S\5      5       r\ " S S\	5      5       r\\ " S S\5      5       5       rg)z
Metal Pipe Game Implementation for PlayPalace v11.

A joke game where one random player hits another with a metal pipe.
Supports single bonk (bonker wins) and multiple bonks (last alive wins).
    N)	dataclassfield)datetime   )GamePlayerGameOptions)register_game   )
GameResultPlayerResult)
BoolOptionoption_field)Localizationc                   (    \ rS rSr% SrSr\\S'   Srg)MetalPipePlayer   z!Player state for Metal Pipe game.Talive N)	__name__
__module____qualname____firstlineno____doc__r   bool__annotations____static_attributes__r       :c:\Users\dbart\PlayPalace11\server\games\metalpipe\game.pyr   r      s    +E4r   r   c            
       n    \ rS rSr% Sr\" \" SSSSSS95      r\\	S	'   \" \" S
SSSSS95      r
\\	S'   Srg)MetalPipeOptions   zOptions for Metal Pipe game.Fenabledzmetalpipe-set-multiple-bonksz'metalpipe-option-changed-multiple-bonkszmetalpipe-desc-multiple-bonks)default	value_keylabel
change_msgdescriptionmultiple_bonksTzmetalpipe-set-allow-self-bonkz(metalpipe-option-changed-allow-self-bonkzmetalpipe-desc-allow-self-bonkallow_self_bonkr   N)r   r   r   r   r   r   r   r)   r   r   r*   r   r   r   r   r!   r!      sW    &'0@7	
ND  )1A8	
OT r   r!   c            	       x  ^  \ rS rSr% Sr\" \S9r\\   \	S'   \" \
S9r\
\	S'   \" \S9r\\   \	S'   \S\4S j5       r\S\4S	 j5       r\S\4S
 j5       r\S\4S j5       r\S\4S j5       rSS\S\S\S\4S jjrSS jrS\\   SS4S jrS\S\SS4S jrSU 4S jjrS\4S jrS\S\S\\   4S jrSrU =r $ )MetalPipeGame2   a  
Metal Pipe - a joke game.

A random player hits another random player over the head with a metal pipe.
In single bonk mode, the bonker wins (unless they bonked themselves, in which
case everyone else wins). In multiple bonks mode, bonking continues until
only one player remains.
)default_factoryplayersoptions_winner_namesreturnc                     g)Nz
Metal Piper   clss    r   get_nameMetalPipeGame.get_nameD   s    r   c                     g)N	metalpiper   r4   s    r   get_typeMetalPipeGame.get_typeH   s    r   c                     g)Nzcategory-uncategorizedr   r4   s    r   get_categoryMetalPipeGame.get_categoryL   s    'r   c                     g)Nr   r   r4   s    r   get_min_playersMetalPipeGame.get_min_playersP       r   c                     g)N   r   r4   s    r   get_max_playersMetalPipeGame.get_max_playersT   rB   r   	player_idnameis_botc                     [        XUS9$ )N)idrH   rI   )r   )selfrG   rH   rI   s       r   create_playerMetalPipeGame.create_playerX   s    )vFFr   Nc                 p    SU l         SU l        U R                  5       n/ U l        U R	                  U5        g)zCalled when the game starts.playingTN)statusgame_activeget_active_playersr1   
_run_bonks)rL   active_playerss     r   on_startMetalPipeGame.on_start[   s3    002'r   c                    U R                   R                  (       + nU Vs/ s H  o3R                  PM     nnSn/ n[        U5      S:  Ga,  [        R
                  " U5      nU R                   R                  (       a  [        R
                  " U5      nO7U V	s/ s H  oU:w  d  M
  U	PM     n
n	U
(       d  O[        R
                  " U
5      nXx:H  nU R                  SUUUS.US9  U V	s/ s H  oU:w  d  M
  U	PM     nn	U(       a]  U(       a.  U Vs/ s H   o3R                  U:w  d  M  UR                  PM"     nnO'U R                  U5      nU(       a  UR                  /O/ nOUS-  n[        U5      S:  a  GM,  U(       d  U(       d  [        U5      S:X  a+  U R                  US   5      nU(       a  UR                  /O/ nOf/ nU H8  n	U R                  U	5      nU(       d  M  UR                  UR                  5        M:     [        U5      S:  a  [        R
                  " U5      /nU R                  SSU0US	-   S9  g
s  snf s  sn	f s  sn	f s  snf )z-Pre-calculate and schedule all bonk outcomes.      bonk)	bonker_id	bonked_idis_self)delay_ticksr   winnerwinner_names   N)r0   r)   rK   lenrandomchoicer*   schedule_eventrH   get_player_by_idappend)rL   r/   singlep	alive_idsdelayra   r\   r]   pidothersr^   bonkerwinner_players                 r   rT   MetalPipeGame._run_bonkse   s   \\000#*+7aTT7	+"$)nq i0I||++"MM)4	)2G#Y6F#G"MM&1	,G!*!*&
 "    )2F	I5E	IF4;#QGqtty?PFAFFGL#QL!229=F4:FKK=LQJEE )nq J l9~" $ 5 5il C7D 2 23"!$C--c2Aq$++AFF3 % |$q($*MM,$?#@L 
 	 	
m , H" G
 $Rs)   H<	I$I'	I4II%I
event_typedatac                    US:X  a  U R                  US   5      nU R                  US   5      nU(       a  U(       d  gU R                  S5        SUl        US   (       a  U R                  SUR                  S	9  gU R                  S
UR                  UR                  S9  gUS:X  a-  US   nXPl        U R                  S5        U R                  5         gg)zHandle scheduled game events.r[   r\   r]   Nz
lsmack.oggFr^   zmetalpipe-hit-self)ro   zmetalpipe-hit-other)ro   bonkedr`   ra   zgamewin.ogg)rg   
play_soundr   broadcast_lrH   r1   finish_game)rL   rr   rs   ro   ru   ra   s         r   on_game_eventMetalPipeGame.on_game_event   s    **4+<=F**4+<=FOOL) FLI  !5fkk J  )!;;!;; !  8#/L!-OOM* $r   c                 B   > [         TU ]  5         U R                  5         g)zCalled every game tick.N)superon_tickprocess_scheduled_events)rL   	__class__s    r   r}   MetalPipeGame.on_tick   s    %%'r   c                 "   U R                    Vs/ s H/  n[        U[        5      (       d  M  UR                  (       a  M-  UPM1     nn[	        U R                  5       [        R                  " 5       R                  5       U R                  U Vs/ s H8  n[        UR                  UR                  UR                  [        USS5      S9PM:     snU R                  U R                   R"                  U R                   R$                  S.S9$ s  snf s  snf )zBuild the game result.is_virtual_botF)rG   player_namerI   r   )ra   r)   r*   )	game_type	timestampduration_ticksplayer_resultscustom_data)r/   
isinstancer   is_spectatorr   r:   r   now	isoformatsound_scheduler_tickr   rK   rH   rI   getattrr1   r0   r)   r*   )rL   rj   all_playerss      r   build_game_resultMetalPipeGame.build_game_result   s     ||
#!z!_'EAannA| 	 
 mmolln..044 % %A dd !88#*1.>#F	 % !% 2 2"&,,"="=#'<<#?#?
 	
	
s   DDD?Dresultlocalec           	          UR                   R                  S/ 5      nU(       a'  U Vs/ s H  n[        R                  " USUS9PM     sn$ / $ s  snf )zFormat the end screen.ra   zmetalpipe-winner)player)r   getr   )rL   r   r   ra   rH   s        r   format_end_screenMetalPipeGame.format_end_screen   sV    ))--nbAVbVbd  );DIVb  	s    A)r1   rR   rQ   )F)r2   N)!r   r   r   r   r   r   listr/   r   r   r!   r0   r1   strclassmethodr6   r:   r=   intr@   rE   r   rM   rV   rT   dictry   r}   r   r   r   r   __classcell__)r   s   @r   r,   r,   2   s\    &+4%@GT/"@ %6F GGG  %T:M49:      (S ( (      Gs G# Gt GP_ G(?
$"7 ?
D ?
B 4 D 6(

: 
4
 C DI  r   r,   )r   rd   dataclassesr   r   r   baser   r   r	   registryr
   game_utils.game_resultr   r   game_utils.optionsr   r   messages.localizationr   r   r!   r,   r   r   r   <module>r      s     (  , , $ > : 1 f   {  . sD s  sr   