
    vai                         d dl Z d dlZd dlZd dlZd dlmZmZmZ d dlm	Z	 d dl
mZ d dlmZmZmZmZmZmZmZmZmZmZmZmZmZmZ  ej        e          Z G d d          Z G d d	          ZdS )
    N)DictOptionalList)	WebSocket)Game)CELL_WCELL_HROWSCOLSSCREEN_WIDTHSCREEN_HEIGHTPLANT_WPLANT_HZOMBIE_WZOMBIE_HBULLET_WBULLET_HROOM_EMPTY_TIMEOUTROOM_RECONNECT_BUFFERc                   ^    e Zd Zd ZdedefdZdefdZd Zdede	fdZ
d	 Zd
 Zde	fdZdS )Roomc                     || _         || _        i | _        d | _        d| _        dddd| _        d | _        d| _        i | _        i | _	        d S )Nwaitingpve130)modeleveltpsF)
room_idnameplayershoststatesettingsgamerunningrolesplayer_decksselfr    s     )/root/workspace/PVZOnline/backend/room.py__init__zRoom.__init__   sY    	-/#'	
!&TBB$(	
    	websocketusernamec                   K   |                                  d {V  || j        |<   | j        s|| _        |                                  d {V  | j        dk    r|                    dt          t          t          t          t          t          t          t          t          t          t           t"          d| j        d           d {V  | j        r6|                    | j                                                   d {V  d S d S d S )Nplaying
start_gamer   r	   r
   r   r   r   r   r   r   r   r   r   typeconfigdecks)acceptr"   r#   broadcast_room_stater$   	send_jsonr   r	   r
   r   r   r   r   r   r   r   r   r   r)   r&   	get_state)r+   r/   r0   s      r,   connectzRoom.connect   sL              !*Xy 	! DI''))))))))):""%%$$$  $0%2&& ( ( ( (  *!' '         & y A))$)*=*=*?*?@@@@@@@@@@@+ #"(A Ar.   c                 h   || j         v r| j         |= || j        k    r@| j         r2t          | j                                                   d         | _        nd | _        | j         s| j        dk    r	d| _        d S | j         s| j        dk    rd S t          j        |                                            d S )Nr   r   Fr2   )	r"   r#   listkeysr$   r'   asyncioensure_futurer:   )r+   r0   s     r,   
disconnectzRoom.disconnect<   s    t|##X&ty  | ! !2!2!4!455a8		 	| 	?
i 7 7 DLLL 	?$*	"9"9D!$";";"="=>>>>>r.   c                    K   d| j         | j        t          | j                                                  | j        | j        | j        dd}|                     |           d {V  d S )N
room_state)r    r!   r"   r#   r%   r$   )r6   data)	r    r!   r?   r"   r@   r#   r%   r$   	broadcast)r+   r$   s     r,   r:   zRoom.broadcast_room_stateL   s}       <	 1 1 3 344	 M 

 

 nnU###########r.   rF   c                   K   |d         dk    rG|| j         k    r<|                    d| j                  | _        |                                  d {V  d S |d         dk    rJ|| j         k    r?|                    d          }|dv r$|| j        d<   |                                  d {V  d S |d         dk    rg|| j         k    r\|                    di           }d|v r|d         dvrd S | j                            |           |                                  d {V  d S |d         d	k    r=|                    d
i           }|                    di           }||d<   || j        |<   d S | j        dk    r|d         dk    r[|| j         k    rOd| _        d| _	        t          | j                                                  }| j                            d          dk    r|D ]}d| j        |<   n3d| j        |d         <   t          |          dk    rd| j        |d         <   |                     dt           t"          t$          t&          t(          t*          t,          t.          t0          t2          t4          t6          d| j        d           d {V  t9          | j        | j        | j                  | _        t=          j        |                                             d S |d         dk    rU|| j         k    rL| j                            |                    di                      |                                  d {V  d S d S d S | j        dk    r$| j        r| j        !                    ||           d S d S d S )Nr6   rename_roomr!   set_moder   )r   endlessupdate_settingsr%   set_deckdeckplant_levelsr   r3   r2   TrK   plantr      zombier4   r5   )"r#   getr    r!   r:   r%   updater)   r$   r'   r?   r"   r@   r(   lenrG   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r&   rA   rB   	game_loophandle_command)	r+   r0   rF   r   new_settingsrN   rO   players_listps	            r,   rW   zRoom.handle_commandZ   s     <=((X-B-B66DI++---------F<:%%(di*?*?88F##D)))(,f%//111111111F<,,,TY1F1F88J33L%%,v*>FX*X*XM  ...++---------F<:%%88FB''D88NB77L#/D *.Dh'F:""F||++DI0E0E&
#  $DL$5$5$7$788=$$V,,	99) 0 0(/
10 3:DJ|A/<((1,,6>
<?3nn("("( $ $(4)6#*#*$,$,$,$,  ".!& &         ( !
D<MNN	%dnn&6&677777f!222x497L7L$$TXXj"%=%=>>>//11111111111 327L7L Z9$$$I$$Xt44444 %$$$r.   c                 N  K   t                               d| j         d           t          | j                            dd                    }d|z  }d}| j        rD| j        dk    r:| j        sn|dk    rt          j	                    }nVt          j	                    |z
  t          k    r4t                               d| j         dt           d	           d
| _        dS nd}| j        r	 | j                                         | j                                        }|                     |           d{V  n<# t          $ r/}t                               d| j         d|            Y d}~nd}~ww xY wt#          j        |           d{V  | j        r| j        dk    6dS dS dS dS )u   游戏主循环zRoom z game startedr      g      ?r   r2   z stopped (timeout after zs)FNzGame update error in room z: )loggerinfor    intr%   rS   r'   r$   r"   timer   r&   rT   r<   rG   	ExceptionerrorrA   sleep)r+   r   
sleep_timeempty_start_timer$   es         r,   rV   zRoom.game_loop   s     7DL777888$-##E2..//3Y
l 	,tzY66< %#q(('+y{{$$Y[[#336HHHKK d d dN` d d deee#(DLE I
 $%  y SSI$$&&& I//11E..//////////  S S SLL!Qdl!Q!Qa!Q!QRRRRRRRRS -
+++++++++) l 	,tzY6666 	, 	,66 	, 	,s   (AD6 6
E/ %E**E/c                 2    t          | j                  dk    S )Nr   )rU   r"   r+   s    r,   is_emptyzRoom.is_empty   s    4<  A%%r.   messagec                    K   t          | j                                                  D ]%}	 |                    |           d {V  #  Y #xY wd S N)r?   r"   valuesr;   )r+   rj   conns      r,   rG   zRoom.broadcast   so      ,,..// 	 	DnnW----------		 	s   AAN)__name__
__module____qualname__r-   r   strr=   rC   r:   dictrW   rV   ri   rG    r.   r,   r   r      s        
 
 
Ay AC A A A A>?3 ? ? ? ? $ $ $L5S L5 L5 L5 L5 L5\, , ,:& & &t      r.   r   c                   N    e Zd Zd ZdefdZdedee         fdZd Z	defdZ
dS )	RoomManagerc                     i | _         d S rl   roomsrh   s    r,   r-   zRoomManager.__init__   s    &(


r.   returnc                     t          t          j                              d d         }t          |          | j        |<   |S )N   )rr   uuiduuid4r   ry   r*   s     r,   create_roomzRoomManager.create_room   s5    djll##BQB'"7mm
7r.   r    c                 6    | j                             |          S rl   )ry   rS   r*   s     r,   get_roomzRoomManager.get_room   s    z~~g&&&r.   c                 H    d | j                                         D             S )Nc                 ^    g | ]*}|j         |j        t          |j                  |j        d +S ))idr!   r"   r$   )r    r!   rU   r"   r$   ).0rs     r,   
<listcomp>z*RoomManager.list_rooms.<locals>.<listcomp>   s5    |||cdqy!&S^^VWV]^^|||r.   )ry   rm   rh   s    r,   
list_roomszRoomManager.list_rooms   s&    ||hlhrhyhyh{h{||||r.   c                 ,    || j         v r
| j         |= d S d S rl   rx   r*   s     r,   remove_roomzRoomManager.remove_room   s'    dj  
7### ! r.   N)ro   rp   rq   r-   rr   r   r   r   r   r   r   rt   r.   r,   rv   rv      s        ) ) )S    
' ' ' ' ' '} } }$3 $ $ $ $ $ $r.   rv   ) r}   rA   r`   loggingtypingr   r   r   fastapir   game.enginer   game.configr   r	   r
   r   r   r   r   r   r   r   r   r   r   r   	getLoggerro   r]   r   rv   rt   r.   r,   <module>r      s       ' ' ' ' ' ' ' ' ' '                                            
	8	$	$} } } } } } } }~$ $ $ $ $ $ $ $ $ $r.   