Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | 22x 22x 21x 1x 21x 4x 21x 1x 21x 21x 21x 21x 21x 9x 8x 1x 1x 53x 3x 5x | import { NumberLabel, NumberLabelImpl, NumberLabelOptions } from './numberLabel' /** * {@link Scorer} の状態. * * 'enabled': 得点の変更を許可します. * * 'disabled': 得点を変更しようとしても無視します. */ export type ScorerStatus = 'enabled' | 'disabled' /** * プレイヤーの得点を制御、描画します. */ export interface Scorer extends NumberLabel { /** * 得点を取得します. (0点以上、小数点以下切り捨て) */ readonly value: number /** * 得点を取得します. (負の値あり、小数点以下あり) */ readonly rawValue: number /** * 得点の変更を受け付けるか状態を取得します */ readonly status: ScorerStatus /** * 得点を記録しても、サーバーには送信しない設定か取得します. */ readonly refrainsSendingScore: boolean /** * ライブラリ利用者が自由に使えるフィールドです. */ vars?: unknown /** * 加点します. * * @param score 加点する値 */ add (score: number): void /** * 引数の値に得点を設定します. * * @param score 設定する値 */ set (score: number): void /** * 得点を設定できるようにします. */ enable (): void /** * 得点を設定しようとしても無視します. */ disable (): void /** * 得点をサーバーに常時送るようにします. * * サーバーへの送信を抑止(refrainsSendingScore)している場合、 * 本メソッドを呼び出して抑止を解除する必要があります. */ keepSendingScore (): void } export type ScorerOptions = Omit<NumberLabelOptions, 'value' | 'textAlign'> & { refrainsSendingScore: boolean, vars: unknown } export class ScorerImpl extends NumberLabelImpl implements Scorer { vars?: unknown private game: g.Game private _refrainsSendingScore: boolean constructor ({ scene, font, digit, prefix, suffix, refrainsSendingScore, vars }: ScorerOptions) { if (!scene.game.vars) { scene.game.vars = { gameState: { score: 0 } } } if (!('gameState' in scene.game.vars)) { scene.game.vars.gameState = { score: 0 } } if (!('score' in scene.game.vars.gameState)) { scene.game.vars.gameState.score = 0 } super({ scene, value: scene.game.vars.gameState.score as number, font, digit, prefix, suffix, textAlign: 'right' }) this.game = scene.game this._refrainsSendingScore = refrainsSendingScore this.vars = vars this.onValue.add(() => { if (!this._refrainsSendingScore) { this.game.vars.gameState.score = this.value } }) } keepSendingScore () { this._refrainsSendingScore = false this.game.vars.gameState.score = this.value } override get value (): number { return Math.max(Math.floor(super.value), 0) } get rawValue (): number { return super.value } get refrainsSendingScore (): boolean { return this._refrainsSendingScore } } |