Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add better info screen #507

Merged
merged 1 commit into from
Jun 15, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
121 changes: 119 additions & 2 deletions backend/bang/expansions/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,61 @@ def get_characters():
def get_cards():
from bang.expansions.dodge_city import cards
return cards.get_starting_deck()


def get_expansion_info(self):
return {
"id": "dodge_city",
"name": "Dodge City",
"cards": [
{"type": "characters", "cards": DodgeCity.get_characters()},
{"type": "cards", "cards": DodgeCity.get_cards()}
]
}

class HighNoon():
def get_events():
from bang.expansions.high_noon import card_events
return card_events.get_all_events() + [card_events.get_endgame_card()]

def get_expansion_info(self):
return {
"id": "high_noon",
"name": "High Noon",
"cards": [
{"type": "events", "cards": HighNoon.get_events()}
]
}
class FistfulOfCards():
def get_events():
from bang.expansions.fistful_of_cards import card_events
return card_events.get_all_events() + [card_events.get_endgame_card()]

def get_expansion_info(self):
return {
"id": "fistful_of_cards",
"name": "Fistful of Cards",
"cards": [
{"type": "events", "cards": FistfulOfCards.get_events()}
]
}
class GoldRush():
def get_characters():
from bang.expansions.gold_rush import characters
return characters.all_characters()

def get_shop_cards():
from bang.expansions.gold_rush import shop_cards
return shop_cards.get_cards()

def get_expansion_info(self):
return {
"id": "gold_rush",
"name": "Gold Rush",
"cards": [
{"type": "characters", "cards": GoldRush.get_characters()},
{"type": "cards", "cards": GoldRush.get_shop_cards()}
]
}

class TheValleyOfShadows():
def get_characters():
Expand All @@ -23,7 +73,74 @@ def get_cards():
from bang.expansions.the_valley_of_shadows import cards
return cards.get_starting_deck()

def get_expansion_info(self):
return {
"id": "the_valley_of_shadows",
"name": "The Valley of Shadows",
"cards": [
{"type": "characters", "cards": TheValleyOfShadows.get_characters()},
{"type": "cards", "cards": TheValleyOfShadows.get_cards()}
]
}

class WildWestShow():
def get_characters():
from bang.expansions.wild_west_show import characters
return characters.all_characters()
return characters.all_characters()

def get_events():
from bang.expansions.wild_west_show import card_events
return card_events.get_all_events() + [card_events.get_endgame_card()]

def get_expansion_info(self):
return {
"id": "wild_west_show",
"name": "Wild West Show",
"cards": [
{"type": "characters", "cards": WildWestShow.get_characters()},
{"type": "events", "cards": WildWestShow.get_events()}
]
}

class TrainRobbery():
def get_stations():
from bang.expansions.train_robbery import stations
return stations.get_all_stations()

def get_trains():
from bang.expansions.train_robbery import trains
return trains.get_all_cards() + trains.get_locomotives()

def get_expansion_info(self):
return {
"id": "train_robbery",
"name": "Train Robbery",
"cards": [
{"type": "stations", "cards": TrainRobbery.get_stations()},
{"type": "trains", "cards": TrainRobbery.get_trains()}
]
}

def get_expansion_info(expansion_id):
expansion_map = {
"dodge_city": DodgeCity(),
"high_noon": HighNoon(),
"fistful_of_cards": FistfulOfCards(),
"gold_rush": GoldRush(),
"the_valley_of_shadows": TheValleyOfShadows(),
"wild_west_show": WildWestShow(),
"train_robbery": TrainRobbery()
}

expansion_info = expansion_map[expansion_id].get_expansion_info()

for section in expansion_info["cards"]:
unique_cards = []
seen_card = set()
for card in section["cards"]:
if card.name not in seen_card:
unique_cards.append(card)
seen_card.add(card.name)
section["cards"] = unique_cards

return expansion_info
6 changes: 6 additions & 0 deletions backend/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -1326,6 +1326,12 @@ def get_trainrobberycards(sid):
}, default=lambda o: o.__dict__)
)

@sio.event
@bang_handler
def get_expansion_info(sid, id):
from bang.expansions import get_expansion_info
sio.emit("expansion_info", room=sid, data=json.dumps(get_expansion_info(id), default=lambda o: o.__dict__))

@sio.event
@bang_handler
def discord_auth(sid, data):
Expand Down
117 changes: 117 additions & 0 deletions frontend/src/components/ExpansionPopup.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,117 @@
<template>
<div class="popup-overlay" v-if="show" @click="handleOverlayClick">
<div class="popup-content" @click.stop>
<button class="close-button" @click="close">×</button>
<h2>{{ expansion.name }}</h2>
<div v-for="section in expansion.cards" :key="section.type" class="section">
<h3>{{ section.type }}</h3>
<div class="cards-container flexy-cards-wrapper">
<div v-for="card in section.cards" :key="card.name" class="flexy-cards">
<Card :card="card" v-if="section.type !== 'stations'" :class="getClass(expansion, section)"/>
<StationCard :card="card" :price="card.price" v-else-if="section.type === 'stations'"/>
<div style="margin-left:6pt;">
<p>{{$t(`cards.${card.name}.desc`)}}</p>
</div>
</div>
</div>
</div>
</div>
</div>
</template>

<script>
import Card from '@/components/Card.vue';
import StationCard from './StationCard.vue';

export default {
props: {
show: Boolean,
expansion: Object, // Expecting an object with id, name, and cards
},
components: {
Card,
StationCard,
},
methods: {
close() {
this.$emit('close');
},
handleOverlayClick() {
this.close();
},
getClass(expansion, section) {
let classes = ''
if (section.type == 'events') {
classes += 'last-event';
}
if (expansion.id == 'fistful_of_cards') {
classes += ' fistful-of-cards';
} else if (expansion.id == 'high_noon') {
classes += ' high-noon';
} else if (expansion.id == 'gold_rush') {
classes += ' gold-rush';
} else if (expansion.id == 'train_robbery') {
classes += ' train-robbery';
} else if (expansion.id == 'the_valley_of_shadows') {
classes += ' valley-of-shadows';
} else if (expansion.id == 'wild_west_show') {
classes += ' wild-west-show';
}
console.log(classes);
return classes;
}
},
};
</script>

<style scoped>
.popup-overlay {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
}
.popup-content {
position: relative;
background: white;
padding: 20px;
border-radius: 5px;
max-width: 80%;
max-height: 80%;
overflow-y: auto;
}
.close-button {
position: absolute;
top: 10px;
right: 10px;
background: none;
border: none;
font-size: 24px;
cursor: pointer;
}
.section {
margin-bottom: 20px;
}
.cards-container {
display: flex;
flex-wrap: wrap;
gap: 10px;
}
.card {
box-sizing: border-box;
margin-bottom: 10px;
}
.flexy-cards-wrapper {
display: flex;
flex-flow: wrap;
}
.flexy-cards {
flex: 30%;
display:flex;
}
</style>
67 changes: 55 additions & 12 deletions frontend/src/components/Lobby.vue
Original file line number Diff line number Diff line change
Expand Up @@ -195,18 +195,19 @@
<p v-else style="min-height: 19px"></p>
<h3>{{ $t("expansions") }}</h3>
<div class="players-table" style="justify-content: flex-start">
<card
v-for="ex in expansionsStatus"
v-bind:key="ex.id"
:id="ex.id"
:card="ex.card"
:class="{
'cant-play': !ex.enabled,
...ex.card.classes,
}"
:donotlocalize="true"
@click.native="toggleExpansions(ex.id)"
/>
<div v-for="ex in expansionsStatus" :key="ex.id" class="expansion-card" style="position: relative">
<card
:id="ex.id"
:card="ex.card"
:class="{
'cant-play': !ex.enabled,
...ex.card.classes,
}"
:donotlocalize="true"
@click.native="toggleExpansions(ex.id)"
/>
<button class="info-button" @click="showExpansionInfo(ex.id)">?</button>
</div>
</div>
<p v-if="isRoomOwner">{{ $t("click_to_toggle") }}</p>
<h3>{{ $t("mods") }}</h3>
Expand Down Expand Up @@ -391,6 +392,13 @@
:playerRole="deadRoleData.role"
/>
</transition>
<transition name="bounce">
<ExpansionPopup
:show="showPopup"
:expansion="selectedExpansionInfo"
@close="closePopup"
/>
</transition>
</div>
</template>

Expand All @@ -410,6 +418,7 @@ import AnimatedCard from "./AnimatedCard.vue";
import { emojiMap } from "@/utils/emoji-map.js";
import { expansionsMap } from "@/utils/expansions-map.js";
import AnimatedEffect from './AnimatedEffect.vue';
import ExpansionPopup from '@/components/ExpansionPopup.vue';

const cumulativeOffset = function (element) {
var top = 0,
Expand Down Expand Up @@ -440,6 +449,7 @@ export default {
DeadRoleNotification,
AnimatedCard,
AnimatedEffect,
ExpansionPopup,
},
data: () => ({
username: "",
Expand Down Expand Up @@ -470,8 +480,13 @@ export default {
cardsToAnimate: [],
characters_to_distribute: 2,
fullScreenEffects: [],
showPopup: false,
selectedExpansionInfo: {},
}),
sockets: {
expansion_info(data) {
this.selectedExpansionInfo = JSON.parse(data);
},
room(data) {
this.lobbyName = data.name;
if (!data.started) {
Expand Down Expand Up @@ -755,6 +770,14 @@ export default {
},
},
methods: {
showExpansionInfo(id) {
this.showPopup = true;
this.$socket.emit("get_expansion_info", id);
},
closePopup() {
this.showPopup = false;
this.selectedExpansionCards = [];
},
getExpansionCard(id) {
let ex = expansionsMap[id];
ex.classes = {
Expand Down Expand Up @@ -1050,4 +1073,24 @@ export default {
border-bottom: dashed #ccc2;
}
}
.info-button {
position: absolute;
top: 5px;
right: 5px;
background-color: #007bff;
color: white;
border: none;
border-radius: 50%;
width: 24px;
height: 24px;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
font-size: 16px;
}

.info-button:hover {
background-color: #0056b3;
}
</style>
Loading