stanza privata

This commit is contained in:
Alberto Xamin 2020-11-25 20:48:05 +01:00
parent 0a0cc6600e
commit 8f35e86196
No known key found for this signature in database
GPG Key ID: 4F026F48309500A2
9 changed files with 61 additions and 27 deletions

View File

@ -8,7 +8,7 @@ jobs:
steps:
- uses: actions/checkout@v2
- name: Build the Unified Docker image
run: docker build . --file Dockerfile --tag albertoxamin/bang:latest
run: docker build . --file Dockerfile --tag albertoxamin/bang:dev
- name: Log into registry
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
- name: Push images

View File

@ -1,4 +1,5 @@
import json
import random
from typing import List
import eventlet
import socketio
@ -17,7 +18,7 @@ games: List[Game] = []
online_players = 0
def advertise_lobbies():
sio.emit('lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players)} for g in games if not g.started and len(g.players) < 7])
sio.emit('lobbies', room='lobby', data=[{'name': g.name, 'players': len(g.players), 'locked': g.password != ''} for g in games if not g.started and len(g.players) < 7])
@sio.event
def connect(sid, environ):
@ -62,11 +63,20 @@ def create_room(sid, room_name):
advertise_lobbies()
@sio.event
def join_room(sid, room_name):
def private(sid):
g = sio.get_session(sid).game
g.set_private()
advertise_lobbies()
@sio.event
def join_room(sid, room):
room_name = room['name']
print(f'{sid} joined a room named {room_name}')
i = [g.name for g in games].index(room_name)
if games[i].password != '' and games[i].password != room['password'].upper():
return
sio.leave_room(sid, 'lobby')
sio.enter_room(sid, room_name)
i = [g.name for g in games].index(room_name)
while len([p for p in games[i].players if p.name == sio.get_session(sid).name]):
sio.get_session(sid).name += '_1'
games[i].add_player(sio.get_session(sid))

View File

@ -2,12 +2,8 @@
from typing import List, Set, Dict, Tuple, Optional
import random
import socketio
import cards
from cards import Bang
import players
from players import PendingAction, Player
import characters
from characters import all_characters
from deck import Deck
import roles
@ -23,6 +19,7 @@ class Game:
self.readyCount = 0
self.waiting_for = 0
self.initial_players = 0
self.password = ''
def add_player(self, player: players.Player):
if player in self.players or len(self.players) >= 7:
@ -30,16 +27,24 @@ class Game:
player.join_game(self)
self.players.append(player)
print(f'Added player {player.name} to game')
self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players]})
self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players], 'password': self.password})
self.sio.emit('chat_message', room=self.name, data=f'{player.name} è entrato nella lobby.')
def set_private(self):
if self.password == '':
self.password = ''.join(random.choice("AEIOUJKZT123456789") for x in range(6))
print(self.name, 'is now private pwd', self.password)
else:
self.password = ''
self.sio.emit('room', room=self.name, data={'name': self.name, 'started': self.started, 'players': [p.name for p in self.players], 'password': self.password})
def notify_character_selection(self):
self.readyCount += 1
if self.readyCount == len(self.players):
self.distribute_roles()
def choose_characters(self):
char_cards = random.sample(all_characters(), len(self.players)*2)
char_cards = random.sample(characters.all_characters(), len(self.players)*2)
for i in range(len(self.players)):
self.players[i].set_available_character(char_cards[i * 2 : i * 2 + 2])
@ -80,7 +85,7 @@ class Game:
self.players[i].notify_self()
self.play_turn()
def attack_others(self, attacker:Player):
def attack_others(self, attacker: players.Player):
attacker.pending_action = players.PendingAction.WAIT
attacker.notify_self()
self.waiting_for = 0
@ -93,7 +98,7 @@ class Game:
attacker.pending_action = players.PendingAction.PLAY
attacker.notify_self()
def indian_others(self, attacker:Player):
def indian_others(self, attacker: players.Player):
attacker.pending_action = players.PendingAction.WAIT
attacker.notify_self()
self.waiting_for = 0
@ -106,14 +111,14 @@ class Game:
attacker.pending_action = players.PendingAction.PLAY
attacker.notify_self()
def attack(self, attacker:Player, target_username:str):
def attack(self, attacker: players.Player, target_username:str):
if self.players[self.players_map[target_username]].get_banged(attacker=attacker, double=isinstance(attacker.character, characters.SlabTheKiller)):
self.readyCount = 0
self.waiting_for = 1
attacker.pending_action = players.PendingAction.WAIT
attacker.notify_self()
def duel(self, attacker:Player, target_username:str):
def duel(self, attacker: players.Player, target_username:str):
if self.players[self.players_map[target_username]].get_dueled(attacker=attacker):
self.readyCount = 0
self.waiting_for = 1
@ -230,7 +235,7 @@ class Game:
if died_in_his_turn:
self.next_turn()
def get_visible_players(self, player:Player):
def get_visible_players(self, player: players.Player):
i = self.players.index(player)
sight = player.get_sight()
return [{

View File

@ -9,7 +9,7 @@
},
"dependencies": {
"core-js": "^3.6.5",
"pretty-checkbox": "^3.0.3",
"pretty-checkbox-vue": "^1.1.9",
"socket.io-client": "^3.0.3",
"vue": "^2.6.11",
"vue-socket.io": "^3.0.10"

View File

@ -5,7 +5,6 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<script src="https://twemoji.maxcdn.com/v/latest/twemoji.min.js" crossorigin="anonymous"></script>
<title><%= htmlWebpackPlugin.options.title %></title>
</head>
<body>

View File

@ -109,7 +109,7 @@ export default {
return {
name: lobby.name,
icon: "💥",
number: `${lobby.players}🤠`,
number: `${lobby.players}🤠 ${lobby.locked?'🔐':''}`,
is_equipment: true,
}
},
@ -120,7 +120,8 @@ export default {
e.preventDefault();
},
joinLobby(lobby) {
this.$socket.emit('join_room', lobby.name)
let password = lobby.locked ? prompt("Room password:", "") : '';
this.$socket.emit('join_room', {name:lobby.name,password:password})
},
init() {
location.reload();

View File

@ -3,13 +3,9 @@
<div style="flex-grow: 4;">
<h2 v-if="!started">Lobby: {{ lobbyName }}</h2>
<h3>Giocatori (tu sei {{username}})</h3>
<div v-if="startGameCard">
<div class="pretty p-switch p-fill">
<input type="checkbox" />
<div class="state">
<label>Stanza Privata</label>
</div>
</div>
<h3 v-if="!started && password !== ''">Password: {{ password }}</h3>
<div v-if="!started && isRoomOwner">
<PrettyCheck class="p-switch p-fill" v-model="privateRoom">Stanza Privata</PrettyCheck>
</div>
<div class="players-table">
<Card v-if="startGameCard" :card="startGameCard" @click.native="startGame"/>
@ -45,6 +41,7 @@
</template>
<script>
import PrettyCheck from 'pretty-checkbox-vue/check'
import Card from '@/components/Card.vue'
import Chooser from './Chooser.vue'
import Chat from './Chat.vue'
@ -61,6 +58,7 @@ export default {
Player,
Deck,
TinyHand,
PrettyCheck,
},
props: {
username: String
@ -77,11 +75,14 @@ export default {
chooseCards: [],
wantsToEndTurn: false,
selectedInfo: null,
privateRoom: false,
password: '',
}),
sockets: {
room(data) {
this.lobbyName = data.name
this.started = data.started
this.password = data.password
this.players = data.players.map(x => {
return {
name: x,
@ -106,8 +107,11 @@ export default {
// },
},
computed: {
isRoomOwner() {
return this.players[0].name == this.username
},
startGameCard() {
if (!this.started && this.players.length > 2 && this.players[0].name == this.username) {
if (!this.started && this.players.length > 2 && this.isRoomOwner) {
return {
name: 'Start',
icon: '▶️',
@ -187,6 +191,11 @@ export default {
this.$socket.emit('draw', name)
},
},
watch: {
privateRoom() {
this.$socket.emit('private')
}
}
}
</script>

View File

@ -8,6 +8,9 @@ Vue.use(new VueSocketIO({
connection: Vue.config.devtools ? 'http://localhost:5001' : window.location.origin,
}))
import PrettyCheckbox from 'pretty-checkbox-vue';
Vue.use(PrettyCheckbox)
new Vue({
render: h => h(App),
}).$mount('#app')

View File

@ -6651,6 +6651,13 @@ prettier@^1.18.2:
resolved "https://registry.npm.taobao.org/prettier/download/prettier-1.19.1.tgz#f7d7f5ff8a9cd872a7be4ca142095956a60797cb"
integrity sha1-99f1/4qc2HKnvkyhQglZVqYHl8s=
pretty-checkbox-vue@^1.1.9:
version "1.1.9"
resolved "https://registry.yarnpkg.com/pretty-checkbox-vue/-/pretty-checkbox-vue-1.1.9.tgz#2d4bfc7f20c54a0e7b94b3d205641dbf8f390fb4"
integrity sha512-45HOanzF+BUTD5prwCoNrtEFYVzWtASTIIPtPQxGCajC097pFD/9mbyjEjoTsu8Tk4/rSyA7RNk6JpFWVHpLag==
dependencies:
pretty-checkbox "^3.0.3"
pretty-checkbox@^3.0.3:
version "3.0.3"
resolved "https://registry.yarnpkg.com/pretty-checkbox/-/pretty-checkbox-3.0.3.tgz#d49c8013a8fc08ee0c2d6ebde453464bfdbc428e"