Improved sharing
This commit is contained in:
parent
dfe3caa7eb
commit
5ef3abb66e
|
@ -8,7 +8,7 @@
|
|||
</RouterLink>
|
||||
<h1
|
||||
class="z-20 py-2 font-mono text-3xl text-center bg-stone-300 dark:bg-stone-900">
|
||||
N<span class="text-cyan-500">0</span>mbers<span class="text-xs">beta</span>
|
||||
N<span class="text-cyan-500">0</span>mbers<span class="text-xs">alpha</span>
|
||||
</h1>
|
||||
<button @click="isSideMenuVisible = true">
|
||||
<IconMenu class="text-xl btn" />
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
<IconClose class="absolute top-0 right-1 h-12 text-xl btn" />
|
||||
</button>
|
||||
</div>
|
||||
<div class="flex flex-col flex-1 content-center items-center">
|
||||
<div class="flex flex-col flex-1 content-center items-center text-sm">
|
||||
<div class="h-12" />
|
||||
<InputSwitch
|
||||
class="mb-4"
|
||||
|
@ -24,15 +24,6 @@
|
|||
v-model="isLocaleFrench" />
|
||||
</div>
|
||||
|
||||
<div class="mb-8 text-xs text-stone-500">
|
||||
Features to come:
|
||||
<ul class="ml-4 list-disc">
|
||||
<li>Keyboard input</li>
|
||||
<li>Random number</li>
|
||||
<li>Less bugs</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="text-xs text-stone-500 dark:text-stone-600">
|
||||
Build {{ buildDate }}
|
||||
</div>
|
||||
|
|
|
@ -1,38 +1,54 @@
|
|||
import { i18n } from '@/i18n'
|
||||
import { percentageDiff } from '@/utils'
|
||||
import { percentageDiff, setDailyPRNG, shuffle } from '@/utils'
|
||||
|
||||
import { numberOfGamesSinceStart, operations, result } from './game-state'
|
||||
import { showToast } from './toast-manager'
|
||||
|
||||
const squareSymbols = ['🟦', '🟨', '🟫', '🟧', '🟥', '🟩', '🟪']
|
||||
const roundSymbols = ['🔵', '🟡', '🟤', '🟠', '🔴', '🟢', '🟣']
|
||||
|
||||
export function shuffleSymbols(): void {
|
||||
setDailyPRNG()
|
||||
shuffle(squareSymbols)
|
||||
shuffle(roundSymbols)
|
||||
}
|
||||
|
||||
function getSharingText(): string {
|
||||
console.log(squareSymbols)
|
||||
console.log(roundSymbols)
|
||||
// × ÷ + -
|
||||
const emojis: string[] = []
|
||||
const endResult = operations[operations.length - 1].result?.value ?? 0
|
||||
|
||||
const lines: string[] = []
|
||||
for (const op of operations) {
|
||||
switch (op.operator) {
|
||||
case '+':
|
||||
emojis.push('+')
|
||||
break
|
||||
case '-':
|
||||
emojis.push('-')
|
||||
break
|
||||
case '*':
|
||||
emojis.push('×')
|
||||
break
|
||||
case '/':
|
||||
emojis.push('÷')
|
||||
break
|
||||
if (op.left && !op.left.symbol) {
|
||||
op.left.symbol = op.left.original
|
||||
? squareSymbols.pop()
|
||||
: roundSymbols.pop()
|
||||
}
|
||||
if (op.right && !op.right.symbol) {
|
||||
op.right.symbol = op.right.original
|
||||
? squareSymbols.pop()
|
||||
: roundSymbols.pop()
|
||||
}
|
||||
if (op.result && !op.result.symbol) {
|
||||
op.result.symbol = roundSymbols.pop()
|
||||
}
|
||||
}
|
||||
const endResult = operations[operations.length - 1].result?.value ?? 0
|
||||
for (const op of operations) {
|
||||
lines.push(
|
||||
`${op.left?.symbol} ${op.operator} ${op.right?.symbol} = ${op.result?.value === endResult ? endResult : op.result?.symbol}`,
|
||||
)
|
||||
}
|
||||
|
||||
return `N0mbers #${numberOfGamesSinceStart()}
|
||||
===========
|
||||
${emojis.join(' ')} = ${endResult}
|
||||
Score: ${100 - percentageDiff(result.value, endResult) * 100}%
|
||||
===========
|
||||
|
||||
${lines.join('\n')} ${result.value === endResult ? '✔' : '❌'}
|
||||
|
||||
https://n0mbers.scambier.xyz`
|
||||
}
|
||||
|
||||
export function toClipboard(): void {
|
||||
navigator.clipboard.writeText(getSharingText())
|
||||
showToast(i18n.global.t('copiedInClipboard'), 3000)
|
||||
}
|
||||
}
|
|
@ -8,8 +8,8 @@ export const LSK_STATS = 'n0_stats'
|
|||
export const operators = ['+', '-', '*', '/'] as const
|
||||
|
||||
export const pools = {
|
||||
1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25],
|
||||
2: [2, 2, 3, 3, 5, 5, 7, 11, 13, 17, 19, 23],
|
||||
1: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 25, 50, 75, 100],
|
||||
2: [2, 2, 3, 3, 5, 5, 7, 7, 11, 13, 17, 19, 23],
|
||||
3: [5, 5, 5, 5, 5, 2, 2, 2, 2, 2],
|
||||
} as const
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
"dailyDescription": "The daily challenge changes every day at midnight (CET), and is common to all players.",
|
||||
"share": "Share",
|
||||
"finishDailyToPlayRandom": "Finish the daily challenge to unlock.",
|
||||
"gameDescription": "Combine the numbers to reach the result.",
|
||||
"gameDescription": "Combine the required numbers to reach the result.<br><strong>Game under development, some features are missing or changing.</strong>",
|
||||
"randomDescription": "A challenge at random, just for fun.",
|
||||
"copiedInClipboard": "Copied in clipboard",
|
||||
"soon": "Soon",
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
"impossible": "☠",
|
||||
"dailyGame": "Défi quotidien",
|
||||
"randomGame": "Nombre au hasard",
|
||||
"gameDescription": "Combinez les nombres imposés afin d'atteindre le résultat.",
|
||||
"gameDescription": "Combinez les nombres imposés afin d'atteindre le résultat.<br><strong>Jeu en cours de développement, certaines fonctionnalités sont manquantes ou changeantes.</strong>",
|
||||
"dailyDescription": "Le défi quotidien change chaque jour à minuit (CET), et est commun à tous les joueurs.",
|
||||
"randomDescription": "Une partie au hasard, pour le plaisir.",
|
||||
"share": "Partager",
|
||||
|
|
|
@ -3,6 +3,12 @@ export type OperatorType = '+' | '-' | '*' | '/'
|
|||
export type Plaquette = {
|
||||
value: number
|
||||
free: boolean
|
||||
|
||||
/** If the plaquette is one of the pre-selected */
|
||||
original: boolean
|
||||
|
||||
/** For sharing */
|
||||
symbol?: string
|
||||
}
|
||||
|
||||
export type Operation = {
|
||||
|
|
|
@ -40,7 +40,7 @@
|
|||
|
||||
<Transition name="slide_up">
|
||||
<div v-if="gameIsRunning">
|
||||
<!-- OPERATORS -->
|
||||
<!-- Operators -->
|
||||
<OperatorsList @click="selectOperator" />
|
||||
|
||||
<!-- Divider -->
|
||||
|
@ -64,7 +64,7 @@
|
|||
v-html="t('endGame.failureLabel')" />
|
||||
<button
|
||||
v-if="!isPracticeMode"
|
||||
@click="toClipboard"
|
||||
@click="sharing.toClipboard"
|
||||
class="inline-flex items-center btn-border">
|
||||
<IconShare class="mr-2" />
|
||||
{{ t('share') }}
|
||||
|
@ -109,7 +109,7 @@ import {
|
|||
plaquettes,
|
||||
result,
|
||||
} from '@/composables/game-state'
|
||||
import { toClipboard } from '@/composables/sharing'
|
||||
import * as sharing from '@/composables/sharing'
|
||||
import { hasPlayed } from '@/composables/statistics'
|
||||
import { GameDifficultyType, GameStateType, pools } from '@/globals'
|
||||
import { OperatorType, Plaquette } from '@/types'
|
||||
|
@ -121,8 +121,8 @@ import {
|
|||
setDailyPRNG,
|
||||
setMathPRNG,
|
||||
} from '@/utils'
|
||||
import IconShare from '~icons/ph/share-network'
|
||||
import IconReload from '~icons/ph/arrow-clockwise'
|
||||
import IconShare from '~icons/ph/share-network'
|
||||
|
||||
const { t } = useI18n() // call `useI18n`, and spread `t` from `useI18n` returning
|
||||
|
||||
|
@ -151,6 +151,7 @@ watch(
|
|||
if (isOperationReady(op) && isOperationResultValid(op) && !op.result) {
|
||||
op.result = {
|
||||
free: true,
|
||||
original: false,
|
||||
value: operate(op.operator!, op.left!.value, op.right!.value),
|
||||
}
|
||||
if (operations.length < 5 && !isEndGame.value) {
|
||||
|
@ -218,7 +219,7 @@ function reboot(): void {
|
|||
for (let i = 0; i < numPlaquettes; ++i) {
|
||||
const rndItem = Math.floor(random() * poolCopy.length)
|
||||
const el = poolCopy.splice(rndItem, 1)[0]
|
||||
plaquettes.value.push({ value: el, free: true })
|
||||
plaquettes.value.push({ value: el, free: true, original: true })
|
||||
}
|
||||
|
||||
// Solve it
|
||||
|
|
|
@ -1,10 +1,7 @@
|
|||
<template>
|
||||
<div class="flex flex-col grow p-1 w-full text-center">
|
||||
<div class="flex flex-col grow gap-8 justify-center my-4 md:my-16">
|
||||
<div>
|
||||
{{ t('gameDescription') }}
|
||||
<br>
|
||||
</div>
|
||||
<div v-html="t('gameDescription')" />
|
||||
|
||||
<!-- Normal -->
|
||||
<div class="flex flex-col items-center">
|
||||
|
|
Loading…
Reference in New Issue
Block a user