implemented duel
This commit is contained in:
		
							parent
							
								
									89a3a4e4d6
								
							
						
					
					
						commit
						f65f46528e
					
				| @ -1,6 +1,8 @@ | ||||
| import cards | ||||
| from typing import List, Set, Dict, Tuple, Optional | ||||
| import random | ||||
| import socketio | ||||
| from cards import Bang | ||||
| import players | ||||
| from characters import all_characters | ||||
| from deck import Deck | ||||
| @ -95,15 +97,19 @@ class Game: | ||||
|         } for j in range(len(self.players)) if i != j] | ||||
| 
 | ||||
|     def attack(self, attacker:Player, target_username:str): | ||||
|         self.sio.emit('chat_message', room=self.name, data=f'{attacker.name} ha fatto Bang contro {target_username}.') | ||||
|         if self.players[self.players_map[target_username]].get_banged(): | ||||
|             attacker.pending_action = players.PendingAction.WAIT | ||||
|             attacker.notify_self() | ||||
| 
 | ||||
|     def duel(self, attacker:Player, target_username:str): | ||||
|         if self.players[self.players_map[target_username]].get_dueled(attacker=attacker): | ||||
|             attacker.pending_action = players.PendingAction.WAIT | ||||
|             attacker.notify_self() | ||||
| 
 | ||||
|     def get_player_named(self, name:str): | ||||
|         return self.players[self.players_map[name]] | ||||
| 
 | ||||
|     def responders_did_respond(self): | ||||
|     def responders_did_respond_resume_turn(self): | ||||
|         self.players[self.turn].pending_action = players.PendingAction.PLAY | ||||
|         self.players[self.turn].notify_self() | ||||
| 
 | ||||
|  | ||||
| @ -35,8 +35,10 @@ class Player: | ||||
|         self.available_characters = [] | ||||
|         self.was_shot = False | ||||
|         self.on_pick_cb = None | ||||
|         self.on_response_cb = None | ||||
|         self.on_failed_response_cb = None | ||||
|         self.event_type: str = None | ||||
|         self.expected_response = None | ||||
|         self.attacker = None | ||||
|         self.target_p: str  = None | ||||
| 
 | ||||
|     def join_game(self, game): | ||||
| @ -78,8 +80,9 @@ class Player: | ||||
|         ser.pop('sio') | ||||
|         ser.pop('sid') | ||||
|         ser.pop('on_pick_cb') | ||||
|         ser.pop('on_response_cb') | ||||
|         ser.pop('expected_response') | ||||
|         ser.pop('on_failed_response_cb') | ||||
|         # ser.pop('expected_response') | ||||
|         ser.pop('attacker') | ||||
|         self.sio.emit('self', room=self.sid, data=json.dumps(ser, default=lambda o: o.__dict__)) | ||||
|         self.sio.emit('self_vis', room=self.sid, data=json.dumps(self.game.get_visible_players(self), default=lambda o: o.__dict__)) | ||||
|         self.game.notify_all() | ||||
| @ -211,7 +214,7 @@ class Player: | ||||
|                     self.hand.append(self.game.deck.draw()) | ||||
|             if isinstance(card, cards.Duello): | ||||
|                 self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name} contro {againts}.') | ||||
|                 pass | ||||
|                 self.game.duel(self, againts) | ||||
|             if isinstance(card, cards.Emporio): | ||||
|                 self.sio.emit('chat_message', room=self.game.name, data=f'{self.name} ha giocato {card.name}.') | ||||
|                 pass | ||||
| @ -272,17 +275,18 @@ class Player: | ||||
|             if picked.suit == cards.Suit.HEARTS: | ||||
|                 self.notify_self() | ||||
|                 self.game.responders_did_respond() | ||||
|                 self.attacker = None | ||||
|                 return | ||||
|         if len([c for c in self.hand if isinstance(c, cards.Mancato)]) == 0: | ||||
|             self.take_damage_response() | ||||
|             self.game.responders_did_respond() | ||||
|         else: | ||||
|             self.pending_action = PendingAction.RESPOND | ||||
|             self.expected_response = cards.Mancato | ||||
|             self.on_response_cb = self.take_damage_response | ||||
|             self.expected_response = cards.Mancato(0,0).name | ||||
|             self.on_failed_response_cb = self.take_damage_response | ||||
|             self.notify_self() | ||||
| 
 | ||||
|     def get_banged(self): | ||||
|     def get_banged(self, attacker = None): | ||||
|         if len([c for c in self.hand if isinstance(c, cards.Mancato)]) == 0 and len([c for c in self.equipment if isinstance(c, cards.Barile)]) == 0: | ||||
|             print('Cant defend') | ||||
|             self.take_damage_response() | ||||
| @ -295,24 +299,45 @@ class Player: | ||||
|             else: | ||||
|                 print('has mancato') | ||||
|                 self.pending_action = PendingAction.RESPOND | ||||
|                 self.expected_response = cards.Mancato | ||||
|                 self.on_response_cb = self.take_damage_response | ||||
|                 self.expected_response = cards.Mancato(0,0).name | ||||
|                 self.on_failed_response_cb = self.take_damage_response | ||||
|             self.notify_self() | ||||
|             return True | ||||
|      | ||||
| 
 | ||||
|     def get_dueled(self, attacker): | ||||
|         if len([c for c in self.hand if isinstance(c, cards.Bang)]) == 0: | ||||
|             print('Cant defend') | ||||
|             self.take_damage_response() | ||||
|             self.game.responders_did_respond_resume_turn() | ||||
|             return False | ||||
|         else: | ||||
|             self.attacker = attacker | ||||
|             self.pending_action = PendingAction.RESPOND | ||||
|             self.expected_response = cards.Bang(0,0).name | ||||
|             self.event_type = 'duel' | ||||
|             self.on_failed_response_cb = self.take_damage_response | ||||
|             self.notify_self() | ||||
|             return True | ||||
| 
 | ||||
|     def take_damage_response(self): | ||||
|         self.lives -= 1 | ||||
|         self.attacker = None | ||||
|         self.notify_self() | ||||
| 
 | ||||
|     def respond(self, hand_index): | ||||
|         self.pending_action = PendingAction.WAIT | ||||
|         if hand_index != -1 and isinstance(self.hand[hand_index], self.expected_response): | ||||
|         if hand_index != -1 and self.hand[hand_index].name == self.expected_response: | ||||
|             self.game.deck.scrap(self.hand.pop(hand_index)) | ||||
|             self.notify_self() | ||||
|             self.game.responders_did_respond() | ||||
|             if self.event_type == 'duel': | ||||
|                 self.game.duel(self, self.attacker.name) | ||||
|             else: | ||||
|                 self.game.responders_did_respond_resume_turn() | ||||
|             self.event_type = '' | ||||
|         else: | ||||
|             self.on_response_cb() | ||||
|             self.game.responders_did_respond() | ||||
|             self.on_failed_response_cb() | ||||
|             self.game.responders_did_respond_resume_turn() | ||||
|         self.attacker = None | ||||
| 
 | ||||
|     def get_sight(self): | ||||
|         aim = 0 | ||||
|  | ||||
| @ -55,6 +55,7 @@ export default { | ||||
| 		has_played_bang: false, | ||||
| 		visiblePlayers: [], | ||||
| 		is_my_turn: false, | ||||
| 		expected_response: null, | ||||
| 	}), | ||||
| 	sockets: { | ||||
| 		role(role) { | ||||
| @ -71,6 +72,7 @@ export default { | ||||
| 			this.max_lives = self.max_lives | ||||
| 			this.has_played_bang = self.has_played_bang | ||||
| 			this.is_my_turn = self.is_my_turn | ||||
| 			this.expected_response = self.expected_response | ||||
| 			if (this.pending_action == 5) { | ||||
| 				this.chooseCardFromPlayer(self.target_p) | ||||
| 			} | ||||
| @ -103,7 +105,7 @@ export default { | ||||
| 					icon: '❌', | ||||
| 					is_equipment: true, | ||||
| 				}] | ||||
| 			this.hand.filter(x => x.name == 'Mancato!').forEach(x=>{ | ||||
| 			this.hand.filter(x => x.name == this.expected_response).forEach(x=>{ | ||||
| 				cc.push(x) | ||||
| 			}) | ||||
| 			return cc | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 Alberto Xamin
						Alberto Xamin