harbour-tetrafish/qml/game/Functions.qml
2025-05-30 16:09:44 +02:00

1176 lines
38 KiB
QML

import QtQuick 2.2
import Sailfish.Silica 1.0
import QtMultimedia 5.6
import QtQuick.LocalStorage 2.0
import "../js/settings.js" as Settings
Item {
id: functions
property bool backtoback: false
property bool garunning: false
property bool gapaused: false
property bool maenabled: true
property int levelCount: 0
property int nr: 0
signal gameRunning(bool running)
signal gameOver()
signal paused(bool pause)
signal bonusStart()
signal bonusEnd()
signal bonusCount(int counts)
signal gameBonus(int bonus,int grav)
signal gameLevel(int level)
signal brickRotate()
signal brickMove(string direction) // not used but could be useful maybe?!
signal brickBottom(bool instant)
signal direction(string dir)
Connections { // Check if app is active or pause
target: Qt.application
onStateChanged: {
if (Qt.application.state === 2 && garunning && !gapaused) pause()
}
}
// New Game: ok!
onPaused: {
pause ? gapaused = true : gapaused = false
pauseLabel.visible = gapaused
if (musicEnabled && pause) {
pausePlay()
pauseLabel.visible = true
} else {
if (musicEnabled && !pause) musicPlay()
}
}
onGameRunning: {
garunning = running
if (musicEnabled) running ? musicPlay() : stopPlay()
}
NumberAnimation{
id:audiofadeout;
target: playMusic;
property: "volume";
from:playMusic.volume;
to: 0;
duration:3000
onStopped: {
playMusic.stop()
playMusic.volume = 0.6
}
}
onGameOver: {
comboTimeout.running = false
countTimer.running = false
garunning = false
functions.gameRunning(false)
bonusLabel.opacity = 0
// var index = difficulty
mouseArea.enabled = false
downTimer.running = false
highScoreModel.newScore = false
highScoreModel.compareScore(scoreValue)
root.interactive = true
gameOverTimer.running = true
scoreValue -= 1
}
onGameBonus: {
if (sfxEnabled) bonus ? bonuss.play() : gravi.play() //
}
onBonusStart: {
}
onBonusEnd: {
if (sfxEnabled) nobonus.play() //nobonus. .play()
bonusLabel.opacity = 0
}
onBonusCount: {
bonusLabel.opacity = 0
bonusLabel.text = counts
bonusLabel.opacity = 0.8
}
onBrickRotate: {
if (sfxEnabled) rotate.play()
}
onBrickBottom: {
if (sfxEnabled) instant ? instantBottom.play() : bottom.play()
maenabled = false
}
onGameLevel: {
downSpeed -= downSpeed/9
infoLabel.text = "LEVEL "+level
infoLabel.opacity = 0.8
infoTimer.restart()
if (sfxEnabled) levelup.play()
}
function newGame() {
pullDownMenu.enabled = false
root.interactive = false
mouseArea.enabled = true
downTimer.running = true
pauseVal = false
playMusic.source = musicEnabled ? musicScore : "" //http://nectarine.from-de.com/necta192" : ""
for ( var i = 15; i > 0; i--)
for ( var j = 1; j < 11; j++) {
repeater.itemAt(i*12+j).color = Theme.secondaryColor
repeater.itemAt(i*12+j).active = 0
repeater.itemAt(i*12+j).opacity = 0.1
}
for ( i = 0; i < 12; i++) {
futureRepeater.itemAt(i).opacity = 0.1
futureRepeater.itemAt(i).color = Theme.secondaryColor
}
activeBlock = -1
futureBlock = -1
// Reset score
level = 1
downSpeedCalc(level)
scoreValue = 0
speedValue = 0
linesTotal = 0
functions.gameRunning(true)
generate()
}
function musicPlay() {
if (musicEnabled) playMusic.play()
}
function stopPlay() {
if (musicEnabled) audiofadeout.start() //playMusic.stop()
}
function pausePlay() {
if (musicEnabled) playMusic.pause()
}
function ghost() {
if ( ghostEnabled) {
var min = 16
for ( var i = 15; i > 0; i--)
for ( var j = 1; j < 11; j++) {
var index = i*12+j
if (repeater.itemAt(index).ghost) {
repeater.itemAt(index).ghost = !repeater.itemAt(index).ghost
if (repeater.itemAt(index).active === 0)
repeater.itemAt(index).opacity = 0.1
else
repeater.itemAt(index).opacity = 1
}
}
for ( i = 15; i > 0; i--)
for ( j = 1; j < 11; j++) {
index = i*12+j
if ( repeater.itemAt(index).active === 1 && repeater.itemAt(index + 12).active === 0 )
for ( var k = i+1; k < 17; k++)
if((repeater.itemAt(k*12+j).active === 2 || repeater.itemAt(k*12+j).active === 3) && min > k-i-1) {
min = k-i-1
k = 16
}
}
for ( i = 15; i > 0; i--)
for ( j = 1; j < 11; j++) {
index = i*12+j
if ( repeater.itemAt(index).active === 1 && repeater.itemAt(index+12*min).active === 0) {
repeater.itemAt(index+12*min).ghost = true
repeater.itemAt(index+12*min).opacity = 0.5
}
}
} else {
for ( i = 15; i > 0; i--)
for ( j = 1; j < 11; j++) {
index = i*12+j
if (repeater.itemAt(index).ghost) {
repeater.itemAt(index).ghost = !repeater.itemAt(index).ghost
if (repeater.itemAt(index).active === 0)
repeater.itemAt(index).opacity = 0.1
else
repeater.itemAt(index).opacity = 1
}
}
}
}
// Pause: ok!
function pause() {
pauseVal = !pauseVal
pullDownMenu.enabled = !pullDownMenu.enabled
root.interactive = !root.interactive
mouseArea.enabled = !mouseArea.enabled
downTimer.running = !downTimer.running
if (pauseVal) {
//console.log("pause " + countTimer.count)
//////////////////////////
functions.paused(true)
////////////////////////////
comboTimeout.running = false
countTimer.running = false
for (var index = 0; index < 204; index++) {
if ( repeater.itemAt(index).active === 3){
repeater.itemAt(index).glowing = false
repeater.itemAt(index).opacity = 1
}
}
} else { functions.paused(false); if ( combo > 1 ) {
comboTimeout.running = true //???
countTimer.running = true //??? //STARTING COUNTTIMER (PAUSED)
if (combo > 1)
for ( index = 0; index < 204; index++)
if ( repeater.itemAt(index).active === 3)
repeater.itemAt(index).glowing = true
}
}
}
/* function saveGame() {
var values = [activeColor, centerX, centerY, activeBlock, futureBlock, scoreValue, speedValue, level, difficulty]
fileIO.save(1,values)
var active = []
for (var i = 0; i < 204; i++)
active[i] = repeater.itemAt(i).active
fileIO.save(1, "active", active)
var color = []
for (i = 0; i < 204; i++)
color[i] = repeater.itemAt(i).color
fileIO.save(1, "color", color)
fileIO.save("count", countTimer.count)
fileIO.save("combo",combo)
fileIO.write("slot1",1)
savedGame = 1
}
function loadGame() {
var active = []
active = fileIO.load(1, "active")
var color = []
color = fileIO.load(1, "color")
var values = []
values = fileIO.load(1)
// console.log(values)
for ( var i = 0; i < 204; i++) {
repeater.itemAt(i).active = active[i]
repeater.itemAt(i).color = color[i]
if (repeater.itemAt(i).active === 0)
repeater.itemAt(i).opacity = 0.1
else
repeater.itemAt(i).opacity = 1
}
activeColor = values[0]
centerX = values[1]
centerY = values[2]
activeBlock = values[3]
futureBlock = values[4]
scoreValue = values[5]
speedValue = values[6]
level = values[7]
difficulty = values[8]
countTimer.count = fileIO.read("count")
combo = fileIO.read("combo")
if (combo > 1) {
// console.log("restart " + countTimer.count)
comboTimeout.running = true
countTimer.running = true
//ticktock.play()
for ( index = 0; index < 204; index++)
if ( repeater.itemAt(index).active === 3)
repeater.itemAt(index).glowing = true
}
switch (futureBlock) {
case 0 :
future_l_normal()
break
case 1 :
future_l_reverse()
break
case 2 :
future_s_normal()
break
case 3 :
future_s_reverse()
break
case 4 :
future_t_normal()
break
case 5 :
future_square()
break
case 6 :
future_line()
break
}
pullDownMenu.enabled = false
root.interactive = false
mouseArea.enabled = true
pushUpMenu.enabled = false
downTimer.running = true
pauseVal = false
ghost()
} */
// Tetraminos Active: ok!
function l_normal() { // 0 index = [17,29,41,42]
var index = [17,29,41,42]
centerX = 5
centerY = 2
activeColor = "orange" // orange
for ( var i = 0; i < 4; i++) {
repeater.itemAt(index[i]).opacity = 1
repeater.itemAt(index[i]).color = activeColor
repeater.itemAt(index[i]).active = 1
}
}
function l_reverse() { // 1 index = [18,30,41,42]
var index = [18,30,41,42]
centerX = 6
centerY = 2
activeColor = "blue" // yellow
for ( var i = 0; i < 4; i++) {
repeater.itemAt(index[i]).opacity = 1
repeater.itemAt(index[i]).color = activeColor
repeater.itemAt(index[i]).active = 1
}
}
function s_normal() { // 2 index = [17,29,30,42]
var index = [17,29,30,42]
centerX = 5
centerY = 2
activeColor = "lime" // red
for ( var i = 0; i < 4; i++) {
repeater.itemAt(index[i]).opacity = 1
repeater.itemAt(index[i]).color = activeColor
repeater.itemAt(index[i]).active = 1
}
}
function s_reverse() { // 3 index = [18,29,30,41]
var index = [18,29,30,41]
centerX = 6
centerY = 2
activeColor = "red" // green
for ( var i = 0; i < 4; i++) {
repeater.itemAt(index[i]).opacity = 1
repeater.itemAt(index[i]).color = activeColor
repeater.itemAt(index[i]).active = 1
}
}
function t_normal() { // 4 index = [17,29,30,41]
var index = [17,29,30,41]
centerX = 5
centerY = 2
activeColor = "magenta" //blue
for ( var i = 0; i < 4; i++) {
repeater.itemAt(index[i]).opacity = 1
repeater.itemAt(index[i]).color = activeColor
repeater.itemAt(index[i]).active = 1
}
}
function square() { // 5 index = [17,18,29,30]
var index = [17,18,29,30]
centerX = 5.5
centerY = 1.5
activeColor = "yellow" // purple (was magenta)
for ( var i = 0; i < 4; i++) {
repeater.itemAt(index[i]).opacity = 1
repeater.itemAt(index[i]).color = activeColor
repeater.itemAt(index[i]).active = 1
}
}
function line() { // 6 index = [16,17,18,19]
var index = [16,17,18,19]
centerX = 5
centerY = 1
activeColor = "cyan" // pink
for ( var i = 0; i < index.length; i++) {
repeater.itemAt(index[i]).opacity = 1
repeater.itemAt(index[i]).color = activeColor
repeater.itemAt(index[i]).active = 1
}
}
// Tetraminos Future: ok!
function future_l_normal() { // 0
var index = [1,5,9,10]
futureColor = "orange" // orange
for ( var i = 0; i < 12; i++) {
futureRepeater.itemAt(i).opacity = 0.1
futureRepeater.itemAt(i).color = Theme.secondaryColor
}
for (i = 0; i < 4; i++) {
futureRepeater.itemAt(index[i]).opacity = 1
futureRepeater.itemAt(index[i]).color = futureColor
}
}
function future_l_reverse() { // 1
var index = [2,6,9,10]
futureColor = "blue" // yellow
for ( var i = 0; i < 12; i++) {
futureRepeater.itemAt(i).opacity = 0.1
futureRepeater.itemAt(i).color = Theme.secondaryColor
}
for (i = 0; i < 4; i++) {
futureRepeater.itemAt(index[i]).opacity = 1
futureRepeater.itemAt(index[i]).color = futureColor
}
}
function future_s_normal() { // 2
var index = [1,5,6,10]
futureColor = "lime" // orange
for ( var i = 0; i < 12; i++) {
futureRepeater.itemAt(i).opacity = 0.1
futureRepeater.itemAt(i).color = Theme.secondaryColor
}
for (i = 0; i < 4; i++) {
futureRepeater.itemAt(index[i]).opacity = 1
futureRepeater.itemAt(index[i]).color = futureColor
}
}
function future_s_reverse() { // 3
var index = [2,5,6,9]
futureColor = "red" // green
for ( var i = 0; i < 12; i++) {
futureRepeater.itemAt(i).opacity = 0.1
futureRepeater.itemAt(i).color = Theme.secondaryColor
}
for (i = 0; i < 4; i++) {
futureRepeater.itemAt(index[i]).opacity = 1
futureRepeater.itemAt(index[i]).color = futureColor
}
}
function future_t_normal() { // 4
var index = [1,5,6,9]
futureColor = "magenta" // blue
for ( var i = 0; i < 12; i++) {
futureRepeater.itemAt(i).opacity = 0.1
futureRepeater.itemAt(i).color = Theme.secondaryColor
}
for (i = 0; i < 4; i++) {
futureRepeater.itemAt(index[i]).opacity = 1
futureRepeater.itemAt(index[i]).color = futureColor
}
}
function future_square() { // 5
var index = [5,6,9,10]
futureColor = "yellow" // purple
for ( var i = 0; i < 12; i++) {
futureRepeater.itemAt(i).opacity = 0.1
futureRepeater.itemAt(i).color = Theme.secondaryColor
}
for (i = 0; i < 4; i++) {
futureRepeater.itemAt(index[i]).opacity = 1
futureRepeater.itemAt(index[i]).color = futureColor
}
}
function future_line() { // 6
var index = [4,5,6,7]
futureColor = "cyan" // pink
for ( var i = 0; i < 12; i++) {
futureRepeater.itemAt(i).opacity = 0.1
futureRepeater.itemAt(i).color = Theme.secondaryColor
}
for (i = 0; i < 4; i++) {
futureRepeater.itemAt(index[i]).opacity = 1
futureRepeater.itemAt(index[i]).color = futureColor
}
}
// Rotation: ok!
function rotate() {
var x = [], newX = [], originX = [], tempX = [],
y = [], newY = [], originY = [], tempY = []
for (var i = 15; i > 0; i--)
for (var j = 1; j < 11; j++)
if (repeater.itemAt(i*12+j).active === 1) {
x[x.length] = j
y[y.length] = i
}
// Traslation
for (i = 0; i < x.length; i++) {
originX[i] = (x[i] - centerX)
originY[i] = (y[i] - centerY)
}
// Rotation
for (i = 0; i < x.length; i++) {
tempX[i] = -originY[i]
tempY[i] = originX[i]
}
// Second Traslation
for (i = 0; i < x.length; i++) {
newX[i] = (tempX[i] + centerX)
newY[i] = (tempY[i] + centerY)
}
// Empty
for ( i = 0; i < x.length; i++) {
repeater.itemAt( y[i] * 12 + x[i] ).color = Theme.secondaryColor
repeater.itemAt( y[i] * 12 + x[i] ).active = 0
repeater.itemAt( y[i] * 12 + x[i] ).opacity = 0.1
}
// Check if space available
var available = 1
for ( i = 0; i < x.length; i++)
if (repeater.itemAt( newY[i] * 12 + newX[i] ).active !== 0 )
available = 0
if (available === 1) {
// Refill new dots
for ( i = 0; i < x.length; i++) {
repeater.itemAt( newY[i] * 12 + newX[i] ).color = activeColor
repeater.itemAt( newY[i] * 12 + newX[i] ).active = 1
repeater.itemAt( newY[i] * 12 + newX[i] ).opacity = 1
}
//////////////////////////////
functions.brickRotate()
/////////////////////////////
} else if (available === 0) {
// Refill old dots
for ( i = 0; i < x.length; i++) {
repeater.itemAt( y[i] * 12 + x[i] ).color = activeColor
repeater.itemAt( y[i] * 12 + x[i] ).active = 1
repeater.itemAt( y[i] * 12 + x[i] ).opacity = 1
}
}
ghost()
}
// Random choice of tetramino: ok!
function generate() {
if ( futureBlock === -1 ) {
var rand = Math.floor(Math.random()*7)
activeBlock = rand
switch (activeBlock) {
case 0 :
l_normal()
break
case 1 :
l_reverse()
break
case 2 :
s_normal()
break
case 3 :
s_reverse()
break
case 4 :
t_normal()
break
case 5 :
square()
break
case 6 :
line()
break
case 7 :
generate()
break
}
var futureRand = Math.floor(Math.random()*7)
futureBlock = futureRand
switch (futureBlock) {
case 0 :
future_l_normal()
break
case 1 :
future_l_reverse()
break
case 2 :
future_s_normal()
break
case 3 :
future_s_reverse()
break
case 4 :
future_t_normal()
break
case 5 :
future_square()
break
case 6 :
future_line()
break
case 7 :
generate()
break
}
} else {
var game = true
activeBlock = futureBlock
switch (activeBlock) {
case 0 :
if ( repeater.itemAt(17).active + repeater.itemAt(29).active + repeater.itemAt(41).active + repeater.itemAt(42).active === 0)
l_normal()
else {
gameOver()
game = false
}
break
case 1 :
if ( repeater.itemAt(18).active + repeater.itemAt(30).active + repeater.itemAt(41).active + repeater.itemAt(42).active === 0)
l_reverse()
else {
gameOver()
game = false
}
break
case 2 :
if ( repeater.itemAt(17).active + repeater.itemAt(29).active + repeater.itemAt(30).active + repeater.itemAt(42).active === 0)
s_normal()
else {
gameOver()
game = false
}
break
case 3 :
if ( repeater.itemAt(18).active + repeater.itemAt(29).active + repeater.itemAt(30).active + repeater.itemAt(41).active === 0)
s_reverse()
else {
gameOver()
game = false
}
break
case 4 :
if ( repeater.itemAt(17).active + repeater.itemAt(29).active + repeater.itemAt(30).active + repeater.itemAt(41).active === 0)
t_normal()
else {
gameOver()
game = false
}
break
case 5 :
if ( repeater.itemAt(17).active + repeater.itemAt(18).active + repeater.itemAt(29).active + repeater.itemAt(30).active === 0)
square()
else {
gameOver()
game = false
}
break
case 6 :
if ( repeater.itemAt(16).active + repeater.itemAt(17).active + repeater.itemAt(18).active + repeater.itemAt(19).active === 0)
line()
else {
gameOver()
game = false
}
break
}
if (game) {
futureRand = Math.floor(Math.random()*7)
futureBlock = futureRand
switch (futureBlock) {
case 0 :
future_l_normal()
break
case 1 :
future_l_reverse()
break
case 2 :
future_s_normal()
break
case 3 :
future_s_reverse()
break
case 4 :
future_t_normal()
break
case 5 :
future_square()
break
case 6 :
future_line()
break
case 7 :
generate()
break
}
}
}
ghost()
}
// Game over: ok!
function saveHighscore(name,point){
highScoreModel.savePlayerScore(name,point)
}
// Gravity bonus
function gravity() {
var count = 0
for (var i = 15; i > 0; i--)
for ( var j = 10; j > 0; j--) {
var index = i*12+j
if ( repeater.itemAt(index).active === 0) {
for ( var k = 1; k < i; k++) {
if (repeater.itemAt(index-12*k).active === 2) {
repeater.itemAt(index).active = repeater.itemAt(index-12*k).active
repeater.itemAt(index).opacity = repeater.itemAt(index-12*k).opacity
repeater.itemAt(index).color = repeater.itemAt(index-12*k).color
repeater.itemAt(index-12*k).active = 0
repeater.itemAt(index-12*k).opacity = 0.1
repeater.itemAt(index-12*k).color = Theme.secondaryColor
break
}
}
}
}
var score = 0
var lines = []
for ( i = 1; i < 16; i++) {
var full = 0
for ( j = 1; j < 11; j++) {
if (repeater.itemAt(i*12+j).active === 2) {
full++
}
}
if (full === 10)
lines[lines.length] = i
}
score += lines.length*10
linesTotal = linesTotal+lines.length
scoreValue += score*level//*(level+1)
speedValue += score
linesValue = linesValue + linesValue+lines.length
if (linesValue >= 10) {
linesValue = 0
level += 1
// difficulty -= 0.014
functions.gameLevel(level)
}
for ( k = 0; k < lines.length; k++) {
for ( i = lines[k]; i > 0; i--) {
if ( i === 1) {
for ( j = 1; j < 11; j++) {
repeater.itemAt(i*12+j).color = Theme.secondaryColor
repeater.itemAt(i*12+j).active = 0
repeater.itemAt(i*12+j).opacity = 0.1
}
} else
for ( j = 1; j < 11; j++) {
if (repeater.itemAt(i*12+j).active !== 3){
repeater.itemAt(i*12+j).color = repeater.itemAt(i*12+j-12).color
repeater.itemAt(i*12+j).active = repeater.itemAt(i*12+j-12).active
repeater.itemAt(i*12+j).opacity = repeater.itemAt(i*12+j-12).opacity
}
}
}
}
}
// Down Flow Traslation: ok!
function flow() {
var down = 1
for (var i = 190; i > 12; i-- )
if (repeater.itemAt(i).active === 1 && repeater.itemAt(i+12).active > 1) {
down = 0
} if ( down === 1 ) {
for (i = 190; i > 12; i-- ) {
if (repeater.itemAt(i).active === 1) {
repeater.itemAt(i+12).color = repeater.itemAt(i).color
repeater.itemAt(i+12).active = repeater.itemAt(i).active
repeater.itemAt(i+12).opacity = repeater.itemAt(i).opacity
repeater.itemAt(i).color = Theme.secondaryColor
repeater.itemAt(i).active = 0
repeater.itemAt(i).opacity = 0.1
}
}
centerY += 1
} else if (down === 0) {
for (i = 190; i > 12; i-- )
if (repeater.itemAt(i).active === 1) {
repeater.itemAt(i).active = 2
}
/////////////////////////
functions.brickBottom(false)
// console.log("FLOW DOWN = 0")
scoreValue += 1*level
////////////////////////
score()
generate()
}
}
// Instant Down
function instantDown() {
var min = 16
var down = 1
for (var i = 15; i > 0; i--)
for ( var j = 1; j < 11; j++) {
var index = i*12+j
if (repeater.itemAt(index).active === 1 && repeater.itemAt(index+12).active > 1) {
down = 0
}
}
if (down === 1) {
for ( i = 15; i > 0; i--)
for ( j = 1; j < 11; j++) {
index = i*12+j
if ( repeater.itemAt(index).active === 1 && repeater.itemAt(index + 12).active === 0 )
for ( var k = i+1; k < 17; k++)
if((repeater.itemAt(k*12+j).active === 2 || repeater.itemAt(k*12+j).active === 3) && min > k-i-1) {
min = k-i-1
k = 16
}
}
for ( i = 15; i > 0; i--)
for ( j = 1; j < 11; j++) {
index = i*12+j
if ( repeater.itemAt(index).active === 1 ) {
repeater.itemAt(index+12*min).color = repeater.itemAt(index).color
repeater.itemAt(index+12*min).active = 1
repeater.itemAt(index+12*min).opacity = 1
repeater.itemAt(index).color = Theme.secondaryColor
repeater.itemAt(index).active = 0
repeater.itemAt(index).opacity = 0.1
}
}
}
scoreValue += 1*level
/////////////////////////
functions.brickBottom(true)
///////////////////////////
flow()
}
// Down Traslation: ok!
function down() {
var down = 1
for (var i = 190; i > 12; i-- )
if (repeater.itemAt(i).active === 1 && repeater.itemAt(i+12).active > 1){
down = 0
scoreValue += 1*level
} if ( down === 1 ) {
for (i = 190; i > 12; i-- ) {
if (repeater.itemAt(i).active === 1) {
repeater.itemAt(i+12).color = repeater.itemAt(i).color
repeater.itemAt(i+12).active = repeater.itemAt(i).active
repeater.itemAt(i+12).opacity = repeater.itemAt(i).opacity
repeater.itemAt(i).color = Theme.secondaryColor
repeater.itemAt(i).active = 0
repeater.itemAt(i).opacity = 0.1
}
}
centerY += 1
} else
flow()
}
// Left Traslation: ok!
function left() {
var left = 1
for (var i = 1; i < 204; i++ )
if (repeater.itemAt(i).active === 1 && repeater.itemAt(i-1).active > 1)
left = 0
if ( left === 1 ) {
for (i = 1; i < 204; i++ ) {
if (repeater.itemAt(i).active === 1) {
repeater.itemAt(i-1).color = repeater.itemAt(i).color
repeater.itemAt(i-1).active = repeater.itemAt(i).active
repeater.itemAt(i-1).opacity = repeater.itemAt(i).opacity
repeater.itemAt(i).color = Theme.secondaryColor
repeater.itemAt(i).active = 0
repeater.itemAt(i).opacity = 0.1
}
}
centerX -= 1
}
ghost()
}
// Right traslation: ok!
function right() {
var right = 1
for (var i = 202; i > 0; i-- )
if (repeater.itemAt(i).active === 1 && repeater.itemAt(i+1).active > 1)
right = 0
if ( right === 1 ) {
for (i = 202; i > 0; i-- ) {
if (repeater.itemAt(i).active === 1) {
repeater.itemAt(i+1).color = repeater.itemAt(i).color
repeater.itemAt(i+1).active = repeater.itemAt(i).active
repeater.itemAt(i+1).opacity = repeater.itemAt(i).opacity
repeater.itemAt(i).color = Theme.secondaryColor
repeater.itemAt(i).active = 0
repeater.itemAt(i).opacity = 0.1
}
}
centerX += 1
}
ghost()
}
// Score function:
// Set 10 points for each full line: ok!
// Set 100 point bonus for combos: ok!
// Empty full lines and traslate other dots: ok!
// Increase speed each 1000 points! ok!
// Set 1000 point bonus for 4 lines combo: ok!
function score() {
var score = 0
var lines = []
for (var i = 1; i < 16; i++) {
var full = 0
for (var j = 1; j < 11; j++) {
if (repeater.itemAt(i*12+j).active === 2) {
full++
}
}
if (full === 10)
lines[lines.length] = i
}
linesTotal=linesTotal+lines.length
linesValue = linesValue+lines.length
// Bonus
if (lines.length > 0) {
if ( comboTimeout.running ) {
combo += 1
gravityBreak += 1
for (var index = 0; index < 204; index++)
if ( repeater.itemAt(index).active === 3)
repeater.itemAt(index).glowing = true
}
countTimer.count = 0
countTimer.restart() // STARTING COUNTTIMER
comboTimeout.restart()
if (lines.length === 4) { ////// Fyra i rad bonus grej
if (backtoback) {
if (sfxEnabled) b2b.play()
infoLabel.text = "BACK TO BACK TETRIS\nCOMBO x "+combo
infoLabel.opacity = 0.8
infoTimer.restart()
score += 1200*level
backtoback=false
} else {
if (sfxEnabled) fourrows.play()
infoLabel.text = "TETRIS\nCOMBO x "+combo
infoLabel.opacity = 0.8
infoTimer.restart()
score += 800*level
backtoback=true
}
} else if (lines.length === 3) {
if (sfxEnabled) bonuss.play()
backtoback=false
infoLabel.text = "3 LINES\nCOMBO x "+combo
infoLabel.opacity = 0.8
infoTimer.restart()
score += 500*level
} else if (lines.length === 2) {
if (sfxEnabled) bonuss.play()
backtoback=false
infoLabel.text = "2 LINES\nCOMBO x "+combo
infoLabel.opacity = 0.8
infoTimer.restart()
score += 300*level
} else if (lines.length === 1) {
if (sfxEnabled) bonuss.play()
backtoback=false
infoLabel.text = "1 LINE\nCOMBO x "+combo
infoLabel.opacity = 0.8
infoTimer.restart()
score += 100*level
}
}
scoreValue += score*combo//*(level+1)
speedValue += score
// Increase Level
if (linesValue >= 10) {
linesValue = 0
level += 1
// difficulty -= 0.014
functions.gameLevel(level)
functions.gameBonus(combo,1)
functions.gameLevel(level)
}
// Da rivedere ( forse ora va bene )
for (var k = 0; k < lines.length; k++) {
for ( i = lines[k]; i > 0; i--) {
if ( i === 1) {
for ( j = 1; j < 11; j++) {
repeater.itemAt(i*12+j).color = Theme.secondaryColor
repeater.itemAt(i*12+j).active = 0
repeater.itemAt(i*12+j).opacity = 0.1
}
} else
for ( j = 1; j < 11; j++) {
if (repeater.itemAt(i*12+j).active !== 3){
repeater.itemAt(i*12+j).color = repeater.itemAt(i*12+j-12).color
repeater.itemAt(i*12+j).active = repeater.itemAt(i*12+j-12).active
repeater.itemAt(i*12+j).opacity = repeater.itemAt(i*12+j-12).opacity
}
}
}
}
if ( gravityBreak === 4 ) { // Insert Gravity label
gravityBreak = 0
functions.gameBonus(0,1)
infoLabel.text = "GRAVITY BONUS\nCOMBO x "+combo
infoLabel.opacity = 0.8
infoTimer.restart()
functions.gravity()
}
}
Timer {
id: comboTimeout
running: false
repeat: false
interval: 10000-((level*100)/2)
onTriggered: {
for (var index = 0; index < 204; index++) {
if ( repeater.itemAt(index).active === 3){
repeater.itemAt(index).glowing = false
repeater.itemAt(index).opacity = 1
}
}
backtoback = false
combo = 1
gravityBreak = 1
running = false
countTimer.running = false
countTimer.count = 0
}
}
Timer {
id: countTimer
property int count: 0
running: false
repeat: true
interval: comboTimeout.interval/11
onTriggered: {
var combi
////////////////////////////////////////
functions.bonusCount(10-count)
/////////////////////////////////////////
count += 1
if (count == 11) {
comboTimeout.stop()
infoLabel.text="LOST COMBO"
infoLabel.opacity = 0.8
infoTimer.restart()
///////////////////////////////
functions.bonusEnd()
/////////////////////////////////
for (var index = 0; index < 204; index++) {
if ( repeater.itemAt(index).active === 3){
repeater.itemAt(index).glowing = false
repeater.itemAt(index).opacity = 1
}
}
combo = 1
gravityBreak = 1
count = 0
countTimer.running = false
}
}
}
SoundEffect {
id: b2b
// volume: 0.9
source: "../data/back2back.wav"
//loops: SoundEffect.Infinite
}
Audio {
id: countdown
volume: 0.6
autoLoad: true
//source: "bonus.wav"
}
SoundEffect {
id: rotate
volume: 0.8
source: "../data/rotate.wav"
}
SoundEffect {
id: bonuss
source: "../data/bonus.wav"
}
SoundEffect {
id: fourrows
source: "../data/tetris.wav"
}
SoundEffect {
id: gravi
source: "../data/gravity.wav"
}
SoundEffect {
id: bottom
// volume: 0.8
source: "../data/down.wav"
}
SoundEffect {
id: instantBottom
volume: 0.6
source: "../data/harddrop.wav"
}
SoundEffect {
id: nobonus
source: "../data/nobonus.wav"
}
SoundEffect {
id: levelup
source: "../data/levelup.wav"
}
Audio {
id: playMusic
autoPlay: false
autoLoad: true
loops: Audio.Infinite
source: musicEnabled ? musicScore : "" //http://nectarine.from-de.com/necta192" : ""
volume: 0.6
}
} // Item End