replay logic
This commit is contained in:
		
							parent
							
								
									ad27e067e9
								
							
						
					
					
						commit
						acc6532648
					
				| @ -191,9 +191,130 @@ def join_room(sid, room): | |||||||
|         games[i].notify_room(sid) |         games[i].notify_room(sid) | ||||||
|         games[i].notify_all() |         games[i].notify_all() | ||||||
| 
 | 
 | ||||||
|  | """ | ||||||
|  | Sockets for the status page | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def get_all_rooms(sid, deploy_key): | ||||||
|  |     if 'DEPLOY_KEY' in os.environ and deploy_key == os.environ['DEPLOY_KEY']: | ||||||
|  |         sio.emit('all_rooms', room=sid, data=[{ | ||||||
|  |             'name': g.name, | ||||||
|  |             'hidden': g.is_hidden, | ||||||
|  |             'players': [{'name':p.name, 'bot': p.is_bot, 'health': p.lives, 'sid': p.sid} for p in g.players], | ||||||
|  |             'password': g.password, | ||||||
|  |             'expansions': g.expansions, | ||||||
|  |             'started': g.started, | ||||||
|  |             'current_turn': g.turn, | ||||||
|  |             'incremental_turn': g.incremental_turn, | ||||||
|  |             'debug': g.debug, | ||||||
|  |             'spectators': len(g.spectators) | ||||||
|  |         } for g in games]) | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def kick(sid, data): | ||||||
|  |     if 'DEPLOY_KEY' in os.environ and data['key'] == os.environ['DEPLOY_KEY']: | ||||||
|  |         sio.emit('kicked', room=data['sid']) | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def hide_toogle(sid, data): | ||||||
|  |     if 'DEPLOY_KEY' in os.environ and data['key'] == os.environ['DEPLOY_KEY']: | ||||||
|  |         game = [g for g in games if g.name==data['room']] | ||||||
|  |         if len(games) > 0: | ||||||
|  |             game[0].is_hidden = not game[0].is_hidden | ||||||
|  |             if game[0].is_hidden: | ||||||
|  |                 if not data['room'] in blacklist: | ||||||
|  |                     blacklist.append(data['room']) | ||||||
|  |             elif data['room'] in blacklist: | ||||||
|  |                 blacklist.remove(data['room']) | ||||||
|  |             advertise_lobbies() | ||||||
|  | 
 | ||||||
|  | """ | ||||||
|  | Sockets for the game | ||||||
|  | """ | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def start_game(sid): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};start_game') | ||||||
|  |     ses.game.start_game() | ||||||
|  |     advertise_lobbies() | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def set_character(sid, name): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};set_character;{name}') | ||||||
|  |     ses.set_character(name) | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def refresh(sid): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.notify_self() | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def draw(sid, pile): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};draw;{pile}') | ||||||
|  |     ses.draw(pile) | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def pick(sid): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};pick') | ||||||
|  |     ses.pick() | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def end_turn(sid): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};end_turn') | ||||||
|  |     ses.end_turn() | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def play_card(sid, data): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};play_card;{json.dumps(data)}') | ||||||
|  |     ses.play_card(data['index'], data['against'], data['with']) | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def respond(sid, card_index): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};respond;{card_index}') | ||||||
|  |     ses.respond(card_index) | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def choose(sid, card_index): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};choose;{card_index}') | ||||||
|  |     ses.choose(card_index) | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def scrap(sid, card_index): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};scrap;{card_index}') | ||||||
|  |     ses.scrap(card_index) | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def special(sid, data): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};play_card;{json.dumps(data)}') | ||||||
|  |     ses.special(data) | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def gold_rush_discard(sid): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};gold_rush_discard;') | ||||||
|  |     ses.gold_rush_discard() | ||||||
|  | 
 | ||||||
|  | @sio.event | ||||||
|  | def buy_gold_rush_card(sid, data:int): | ||||||
|  |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};buy_gold_rush_card;{data}') | ||||||
|  |     ses.buy_gold_rush_card(data) | ||||||
|  | 
 | ||||||
| @sio.event | @sio.event | ||||||
| def chat_message(sid, msg): | def chat_message(sid, msg): | ||||||
|     ses: Player = sio.get_session(sid) |     ses: Player = sio.get_session(sid) | ||||||
|  |     ses.game.rpc_log.append(f'{ses.name};chat_message;{msg}') | ||||||
|     if len(msg) > 0: |     if len(msg) > 0: | ||||||
|         if msg[0] == '/': |         if msg[0] == '/': | ||||||
|             commands = msg.split(';') |             commands = msg.split(';') | ||||||
| @ -210,6 +331,38 @@ def chat_message(sid, msg): | |||||||
|                         ses.game.add_player(bot) |                         ses.game.add_player(bot) | ||||||
|                         bot.bot_spin() |                         bot.bot_spin() | ||||||
|                     return |                     return | ||||||
|  |                 if '/replay' in msg: | ||||||
|  |                     for i in range(len(ses.game.rpc_log)): | ||||||
|  |                         print('replay:', i, 'of', len(ses.game.rpc_log)) | ||||||
|  |                         cmd = ses.game.rpc_log[i].split(';') | ||||||
|  |                         player = [p for p in ses.game.players if p.name == cmd[0]][0] | ||||||
|  |                         if cmd[1] == 'start_game': | ||||||
|  |                             ses.game.start_game(ses.game.SEED) | ||||||
|  |                         if cmd[1] == 'set_character': | ||||||
|  |                             set_character(player.sid, cmd[2]) | ||||||
|  |                         if cmd[1] == 'draw': | ||||||
|  |                             draw(player.sid, cmd[2]) | ||||||
|  |                         if cmd[1] == 'pick': | ||||||
|  |                             pick(player.sid) | ||||||
|  |                         if cmd[1] == 'end_turn': | ||||||
|  |                             end_turn(player.sid) | ||||||
|  |                         if cmd[1] == 'play_card': | ||||||
|  |                             play_card(player.sid, json.loads(cmd[2])) | ||||||
|  |                         if cmd[1] == 'respond': | ||||||
|  |                             respond(player.sid, int(cmd[2])) | ||||||
|  |                         if cmd[1] == 'choose': | ||||||
|  |                             choose(player.sid, int(cmd[2])) | ||||||
|  |                         if cmd[1] == 'scrap': | ||||||
|  |                             scrap(player.sid, int(cmd[2])) | ||||||
|  |                         if cmd[1] == 'special': | ||||||
|  |                             special(player.sid, json.loads(cmd[2])) | ||||||
|  |                         if cmd[1] == 'gold_rush_discard': | ||||||
|  |                             gold_rush_discard(player.sid) | ||||||
|  |                         if cmd[1] == 'buy_gold_rush_card': | ||||||
|  |                             buy_gold_rush_card(player.sid, int(cmd[2])) | ||||||
|  |                         if cmd[1] == 'chat_message': | ||||||
|  |                             chat_message(player.sid, cmd[2]) | ||||||
|  |                         eventlet.sleep(1) | ||||||
|                 if '/startwithseed' in msg and not ses.game.started: |                 if '/startwithseed' in msg and not ses.game.started: | ||||||
|                     if len(msg.split()) > 1: |                     if len(msg.split()) > 1: | ||||||
|                         ses.game.start_game(int(msg.split()[1])) |                         ses.game.start_game(int(msg.split()[1])) | ||||||
| @ -378,105 +531,10 @@ def chat_message(sid, msg): | |||||||
|             color = sid.encode('utf-8').hex()[-3:] |             color = sid.encode('utf-8').hex()[-3:] | ||||||
|             sio.emit('chat_message', room=ses.game.name, data={'color': f'#{color}','text':f'[{ses.name}]: {msg}'}) |             sio.emit('chat_message', room=ses.game.name, data={'color': f'#{color}','text':f'[{ses.name}]: {msg}'}) | ||||||
| 
 | 
 | ||||||
| @sio.event |  | ||||||
| def get_all_rooms(sid, deploy_key): |  | ||||||
|     if 'DEPLOY_KEY' in os.environ and deploy_key == os.environ['DEPLOY_KEY']: |  | ||||||
|         sio.emit('all_rooms', room=sid, data=[{ |  | ||||||
|             'name': g.name, |  | ||||||
|             'hidden': g.is_hidden, |  | ||||||
|             'players': [{'name':p.name, 'bot': p.is_bot, 'health': p.lives, 'sid': p.sid} for p in g.players], |  | ||||||
|             'password': g.password, |  | ||||||
|             'expansions': g.expansions, |  | ||||||
|             'started': g.started, |  | ||||||
|             'current_turn': g.turn, |  | ||||||
|             'incremental_turn': g.incremental_turn, |  | ||||||
|             'debug': g.debug, |  | ||||||
|             'spectators': len(g.spectators) |  | ||||||
|         } for g in games]) |  | ||||||
| 
 | 
 | ||||||
| @sio.event | """ | ||||||
| def kick(sid, data): | Sockets for the help screen | ||||||
|     if 'DEPLOY_KEY' in os.environ and data['key'] == os.environ['DEPLOY_KEY']: | """ | ||||||
|         sio.emit('kicked', room=data['sid']) |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def hide_toogle(sid, data): |  | ||||||
|     if 'DEPLOY_KEY' in os.environ and data['key'] == os.environ['DEPLOY_KEY']: |  | ||||||
|         game = [g for g in games if g.name==data['room']] |  | ||||||
|         if len(games) > 0: |  | ||||||
|             game[0].is_hidden = not game[0].is_hidden |  | ||||||
|             if game[0].is_hidden: |  | ||||||
|                 if not data['room'] in blacklist: |  | ||||||
|                     blacklist.append(data['room']) |  | ||||||
|             elif data['room'] in blacklist: |  | ||||||
|                 blacklist.remove(data['room']) |  | ||||||
|             advertise_lobbies() |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def start_game(sid): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.game.start_game() |  | ||||||
|     advertise_lobbies() |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def set_character(sid, name): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.set_character(name) |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def refresh(sid): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.notify_self() |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def draw(sid, pile): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.draw(pile) |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def pick(sid): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.pick() |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def end_turn(sid): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.end_turn() |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def play_card(sid, data): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.play_card(data['index'], data['against'], data['with']) |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def respond(sid, data): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.respond(data) |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def choose(sid, card_index): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.choose(card_index) |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def scrap(sid, card_index): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.scrap(card_index) |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def special(sid, data): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.special(data) |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def gold_rush_discard(sid): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.gold_rush_discard() |  | ||||||
| 
 |  | ||||||
| @sio.event |  | ||||||
| def buy_gold_rush_card(sid, data:int): |  | ||||||
|     ses: Player = sio.get_session(sid) |  | ||||||
|     ses.buy_gold_rush_card(data) |  | ||||||
| 
 | 
 | ||||||
| @sio.event | @sio.event | ||||||
| def get_cards(sid): | def get_cards(sid): | ||||||
|  | |||||||
| @ -48,6 +48,7 @@ class Game: | |||||||
|         self.is_changing_pwd = False |         self.is_changing_pwd = False | ||||||
|         self.is_hidden = False |         self.is_hidden = False | ||||||
|         self.rng = random.Random() |         self.rng = random.Random() | ||||||
|  |         self.rpc_log = [] | ||||||
| 
 | 
 | ||||||
|     def reset(self): |     def reset(self): | ||||||
|         print(f'{self.name}: resetting lobby') |         print(f'{self.name}: resetting lobby') | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Alberto Xamin
						Alberto Xamin