Array.prototype.random = function () { return this[Math.floor((Math.random()*this.length))]; } const FishApp = { data() { return { score: 0, force: 0, pull: false, pullRate: 2, dropRate: 3, intervals: { forceIntervalID: null, fishMovementIntervalID: null }, fishy: null, fishies: [ { name: 'Franz the Flying Fishy', strength: 3, quirkyness: 10, points: 100, position: 0, sprite: './assets/fish/ol/blue.png' }, { name: 'Paul the Pufferfishy', strength: 3, quirkyness: 5, points: 50, position: 200, sprite: './assets/fish/ol/puff.png' }, { name: 'Sandro the Squishyfishy', strength: 3, quirkyness: 15, points: 50, position: 200, sprite: './assets/fish/ol/pink.png' } ], fishyScore: 0 } }, watch: { pull() { let vue = this; window.clearInterval(vue.intervals.forceIntervalID); if (vue.pull) { vue.intervals.forceIntervalID = setInterval(function () { if (vue.force < 125) { vue.force = Number(vue.force) + vue.pullRate; } }, 50); } else { vue.intervals.forceIntervalID = setInterval(function () { if (vue.force >= 0.0) { vue.force = Number(vue.force) - vue.dropRate; } if (vue.force < 0.7) { vue.force = 0; } }, 50); } } }, computed: { fishyPosition() { return this.fishy ? (this.fishy.position / 2) : -200; }, fishyInRange() { return (this.force < (this.fishyPosition + 10) && this.force > (this.fishyPosition -10)); } }, methods: { pullRod() { this.force = Number(this.force) + 0.5; }, deployFish() { this.fishy = this.fishies.random(); this.fishyScore = 20; this.startFishLifecycle(); }, startFishLifecycle() { let vue = this; this.fishy.position = 0; this.intervals.fishMovementIntervalID = setInterval(() => { let up = Math.floor(Math.random() * 101) <= 55; if (up) { if (vue.fishy.position < 250) { vue.fishy.position += vue.fishy.quirkyness; } else { vue.fishy.position -= vue.fishy.quirkyness; } } else { if (vue.fishy.position >= vue.fishy.quirkyness) { vue.fishy.position = Number(vue.fishy.position) - vue.fishy.quirkyness; } } if (vue.fishyScore >= 100) { vue.fishyCaught(); } else if (vue.fishyInRange) { vue.fishyScore++; } else { if (vue.fishyScore > 0) { vue.fishyScore--; } else { vue.fishyFled(); } } }, 100); }, fishyCaught() { window.clearInterval(this.intervals.fishMovementIntervalID); this.score += this.fishy.points; this.fishy = null; this.pull = false; alert('fischi ist jetzt dein freund'); }, fishyFled() { window.clearInterval(this.intervals.fishMovementIntervalID); this.fishy = null; this.pull = false; alert('fischi fort!'); } } }; Vue.createApp(FishApp).mount('#root');