Code Sketch


Bixuu02
By: Mhalsakant School
Category: Programming
// ============================================================
// GANESH CHATURTHI ANIMATED MISSION GAME - BRINGING BAPPA HOME
// ============================================================

cleari()
originBottomLeft()

// ============================================================
// GAME STATES & ANIMATION VARIABLES
// ============================================================
var screen = 0
var selectedBappa = ""

// Animation Variables
var carX = -120.0
var carY = 100.0
var isCarAtPandal = false
var isCarBringingBappa = false

class Star(val x: Double, val y: Double, val size: Double) {
    var phase = randomDouble(6.28)
    def step() { phase += 0.04 }
    def view(canvas: CanvasDraw) {
        val brightness = 150 + (math.sin(phase) * 80).toInt
        canvas.noStroke()
        canvas.fill(255, brightness, 100, 220)
        canvas.ellipse(x, y, size, size)
    }
}

val stars = ArrayBuffer.empty[Star]
for (i <- 0 until 60) {
    stars.append(new Star(randomDouble(cwidth), randomDouble(cheight), 1.0 + randomDouble(3.0)))
}

// ============================================================
// DRAW GANPATI BAPPA IDOLS
// ============================================================
def drawGanpatiBappa(canvas: CanvasDraw, x: Double, y: Double, bappaType: String, scale: Double) {
    canvas.noStroke()

    // Base / Throne
    canvas.fill(180, 100, 30)
    canvas.rect(x - 30 * scale, y - 20 * scale, 60 * scale, 15 * scale)

    // Body (Pitambar / Clothes)
    canvas.fill(255, 140, 0) // Orange Dhoti
    canvas.ellipse(x, y + 10 * scale, 50 * scale, 40 * scale)

    // Stomach (Lambo-dara)
    canvas.fill(255, 215, 0)
    canvas.ellipse(x, y + 25 * scale, 45 * scale, 45 * scale)

    // Big Ears
    canvas.fill(255, 200, 150)
    canvas.ellipse(x - 22 * scale, y + 45 * scale, 25 * scale, 30 * scale)
    canvas.ellipse(x + 22 * scale, y + 45 * scale, 25 * scale, 30 * scale)

    // Head & Trunk
    canvas.ellipse(x, y + 48 * scale, 32 * scale, 35 * scale)
    canvas.stroke(255, 180, 130)
    canvas.strokeWeight(6 * scale)
    canvas.line(x, y + 45 * scale, x - 8 * scale, y + 25 * scale) // Curved trunk
    canvas.line(x - 8 * scale, y + 25 * scale, x + 5 * scale, y + 20 * scale)

    // Crown (Mukut) based on Type
    canvas.noStroke()
    if (bappaType == "Lalbaugcha Raja") {
        canvas.fill(220, 20, 60) // Royal Red Crown
        canvas.rect(x - 18 * scale, y + 60 * scale, 36 * scale, 35 * scale)
        canvas.fill(255, 215, 0)
        canvas.ellipse(x, y + 80 * scale, 15 * scale, 20 * scale)
    } else if (bappaType == "Dagdusheth") {
        canvas.fill(255, 215, 0) // Full Golden Crown
        canvas.rect(x - 20 * scale, y + 60 * scale, 40 * scale, 40 * scale)
        canvas.fill(255, 60, 0)
        canvas.ellipse(x, y + 75 * scale, 12 * scale, 15 * scale)
    } else if (bappaType == "Eco-Friendly") {
        canvas.fill(34, 139, 34) // Eco Green Crown
        canvas.rect(x - 16 * scale, y + 60 * scale, 32 * scale, 28 * scale)
        canvas.fill(255, 255, 255)
        canvas.ellipse(x, y + 70 * scale, 10 * scale, 10 * scale)
    } else {
        // Bal Ganesha
        canvas.fill(0, 191, 255) // Cute Blue Crown
        canvas.rect(x - 14 * scale, y + 60 * scale, 28 * scale, 22 * scale)
        canvas.fill(255, 215, 0)
        canvas.ellipse(x, y + 70 * scale, 8 * scale, 8 * scale)
    }

    // Tilak
    canvas.fill(220, 0, 0)
    canvas.ellipse(x, y + 55 * scale, 6 * scale, 8 * scale)
}

// ============================================================
// CAR DRAWING WITH GANPATI BAPPA
// ============================================================
def drawCarWithBappa(canvas: CanvasDraw, x: Double, y: Double, bappaType: String) {
    canvas.noStroke()
    // Shadow
    canvas.fill(50, 50, 50, 100)
    canvas.ellipse(x + 75, y - 5, 170, 20)

    // Festive Car Body
    canvas.fill(220, 30, 30) // Red festive car
    canvas.rect(x, y + 10, 150, 45)
    canvas.rect(x + 30, y + 55, 85, 30)

    // Windows
    canvas.fill(200, 230, 255)
    canvas.rect(x + 35, y + 58, 35, 22)
    canvas.rect(x + 75, y + 58, 35, 22)

    // Wheels
    val wheelPositions = Array(x + 35, x + 115)
    for (wx <- wheelPositions) {
        canvas.fill(20, 20, 20)
        canvas.ellipse(wx, y + 8, 36, 36)
        canvas.fill(255, 215, 0) // Golden Rim
        canvas.ellipse(wx, y + 8, 18, 18)
    }

    // IF BAPPA IS SELECTED, PLACE BAPPA ON TOP OF CAR WITH DECORATION!
    if (bappaType != "") {
        // Festive Flag
        canvas.stroke(255, 140, 0)
        canvas.strokeWeight(3)
        canvas.line(x + 10, y + 55, x + 10, y + 110)
        canvas.fill(255, 100, 0)
        canvas.noStroke()
        canvas.rect(x + 10, y + 90, 25, 20)

        // Bappa Seated on Car Top
        drawGanpatiBappa(canvas, x + 75, y + 85, bappaType, 0.45)
    }
}

// ============================================================
// SCREEN 0: GANESH CHATURTHI WELCOME LETTER
// ============================================================
def drawLetterScreen(canvas: CanvasDraw) {
    canvas.background(40, 10, 20)
    repeatFor(stars) { s => s.view(canvas) }

    // Letter Card
    canvas.fill(255, 248, 220)
    canvas.stroke(255, 215, 0)
    canvas.strokeWeight(5)
    canvas.rect(cwidth/2 - 240, cheight/2 - 180, 480, 370)

    canvas.fill(200, 30, 30)
    canvas.text("GANESH CHATURTHI MISSION!", cwidth/2 - 150, cheight/2 + 140)

    canvas.fill(40, 40, 40)
    canvas.text("Dear Friend,", cwidth/2 - 210, cheight/2 + 100)
    canvas.text("The most awaited festival of joy and blessing is here!", cwidth/2 - 210, cheight/2 + 70)
    canvas.text("May Lord Ganesha remove all obstacles from your path", cwidth/2 - 210, cheight/2 + 45)
    canvas.text("and fill your life with wisdom, peace, and happiness.", cwidth/2 - 210, cheight/2 + 20)
    
    canvas.fill(0, 120, 50)
    canvas.text("Ganpati Bappa Morya! Mangal Murti Morya!", cwidth/2 - 210, cheight/2 - 15)

    // Button: Come To Ganpati Bappa
    canvas.fill(220, 50, 50)
    canvas.noStroke()
    canvas.rect(cwidth/2 - 140, cheight/2 - 120, 280, 50)
    canvas.fill(255, 255, 255)
    canvas.text("WELCOME GANPATI BAPPA", cwidth/2 - 110, cheight/2 - 90)
}

// ============================================================
// SCREEN 1: DRIVING CAR TO PICK UP BAPPA
// ============================================================
def drawDrivingToPandalScene(canvas: CanvasDraw) {
    canvas.background(135, 206, 235)

    // Ground & Road
    canvas.noStroke()
    canvas.fill(40, 160, 60)
    canvas.rect(0, 0, cwidth, 160)
    canvas.fill(70, 70, 75)
    canvas.rect(0, 80, cwidth, 70) 

    // Ganesh Murti Workshop / Pandal
    val pandalX = cwidth - 220.0
    val pandalY = 140.0
    canvas.fill(255, 140, 0)
    canvas.rect(pandalX, pandalY, 190, 140)
    canvas.fill(220, 20, 20)
    canvas.rect(pandalX - 10, pandalY + 140, 210, 40)

    canvas.fill(255, 255, 255)
    canvas.text("GANESH MURTI WORKSHOP", pandalX + 10, pandalY + 152)

    // Car Driving
    drawCarWithBappa(canvas, carX, carY, "")

    // Select Ganpati Bappa Button when arrived
    if (isCarAtPandal) {
        canvas.fill(0, 180, 80)
        canvas.noStroke()
        canvas.rect(cwidth / 2 - 110, 20, 220, 50)
        canvas.fill(255, 255, 255)
        canvas.text("SELECT GANPATI BAPPA", cwidth / 2 - 90, 42)
    }
}

// ============================================================
// SCREEN 2: SELECT TYPES OF GANPATI BAPPA
// ============================================================
def drawBappaSelectionScreen(canvas: CanvasDraw) {
    canvas.background(40, 20, 50)
    canvas.fill(255, 215, 0)
    canvas.text("SELECT YOUR GANPATI BAPPA IDOL", cwidth/2 - 150, cheight - 50)

    val options = Array("Lalbaugcha Raja", "Dagdusheth", "Eco-Friendly", "Bal Ganesha")
    
    for (i <- 0 until 4) {
        val bx = if (i % 2 == 0) cwidth/2 - 210 else cwidth/2 + 20
        val by = if (i < 2) cheight/2 + 10 else cheight/2 - 130
        
        // Box Card
        canvas.fill(255, 248, 220)
        canvas.stroke(212, 175, 55)
        canvas.strokeWeight(3)
        canvas.rect(bx, by, 190, 120)

        // Draw Mini Idol inside box
        drawGanpatiBappa(canvas, bx + 95, by + 20, options(i), 0.5)

        // Text
        canvas.fill(180, 0, 0)
        canvas.noStroke()
        canvas.text(options(i), bx + 30, by + 102)
    }
}

// ============================================================
// SCREEN 3: BRINGING BAPPA HOME IN CAR
// ============================================================
def drawBringingBappaHomeScene(canvas: CanvasDraw) {
    canvas.background(255, 182, 193) // Festive Sky

    // Ground & Decorative Festive Road
    canvas.noStroke()
    canvas.fill(50, 180, 80)
    canvas.rect(0, 0, cwidth, 160)
    canvas.fill(80, 80, 85)
    canvas.rect(0, 80, cwidth, 70) 

    // Festive Marigold Garland Lights
    for (i <- 0 until 10) {
        canvas.fill(255, 140, 0)
        canvas.ellipse(i * (cwidth / 9), cheight - 30, 20, 20)
        canvas.fill(255, 215, 0)
        canvas.ellipse(i * (cwidth / 9), cheight - 42, 14, 14)
    }

    // Car with Ganpati Bappa on top!
    drawCarWithBappa(canvas, carX, carY, selectedBappa)

    canvas.fill(180, 0, 0)
    canvas.text("BRINGING GANPATI BAPPA HOME WITH JOY!", cwidth/2 - 170, cheight - 80)
}

// ============================================================
// SCREEN 4: FINAL CELEBRATION & COMPLETION SCREEN
// ============================================================
def drawFinalCompletionScreen(canvas: CanvasDraw) {
    canvas.background(30, 10, 40)
    repeatFor(stars) { s => s.view(canvas) }

    // Big Bappa in Center
    drawGanpatiBappa(canvas, cwidth/2, cheight/2 - 40, selectedBappa, 1.1)

    canvas.fill(255, 215, 0)
    canvas.text("HAPPY GANESH CHATURTHI!", cwidth/2 - 130, cheight - 60)

    canvas.fill(255, 255, 255)
    canvas.text("THANK YOU FOR PARTICIPATING IN THIS MISSION!", cwidth/2 - 185, cheight - 95)

    canvas.fill(100, 255, 100)
    canvas.text("Ganpati Bappa Morya! Mangal Murti Morya!", cwidth/2 - 160, 40)
}

// ============================================================
// ANIMATION UPDATER
// ============================================================
def updateDeliveryAnimation() {
    if (screen == 1) {
        if (!isCarAtPandal) {
            carX += 3.8
            if (carX >= cwidth - 360) {
                isCarAtPandal = true
            }
        }
    } else if (screen == 3) {
        // Car driving Bappa home
        carX += 4.2
        if (carX > cwidth + 120) {
            screen = 4 // Go to Final Screen
        }
    }
}

// ============================================================
// CLICK HANDLER
// ============================================================
def handleClick(x: Double, y: Double) {
    if (screen == 0) {
        // Click "WELCOME GANPATI BAPPA"
        if (x >= cwidth/2 - 140 && x <= cwidth/2 + 140 && y >= cheight/2 - 120 && y <= cheight/2 - 70) {
            carX = -120.0
            screen = 1
        }
    } else if (screen == 1) {
        // Click "SELECT GANPATI BAPPA"
        if (isCarAtPandal) {
            if (x >= cwidth / 2 - 110 && x <= cwidth / 2 + 110 && y >= 20 && y <= 70) {
                screen = 2
            }
        }
    } else if (screen == 2) {
        // Select Bappa Idol
        val options = Array("Lalbaugcha Raja", "Dagdusheth", "Eco-Friendly", "Bal Ganesha")
        for (i <- 0 until 4) {
            val bx = if (i % 2 == 0) cwidth/2 - 210 else cwidth/2 + 20
            val by = if (i < 2) cheight/2 + 10 else cheight/2 - 130
            if (x >= bx && x <= bx + 190 && y >= by && y <= by + 120) {
                selectedBappa = options(i)
                carX = -120.0 // Reset Car Position for returning
                screen = 3
            }
        }
    }
}

onMouseClick { (x, y) => handleClick(x, y) }

// ============================================================
// MAIN ANIMATION LOOP
// ============================================================
animateWithCanvasDraw { canvas =>
    repeatFor(stars) { s => s.step() }
    updateDeliveryAnimation()

    if (screen == 0) drawLetterScreen(canvas)
    else if (screen == 1) drawDrivingToPandalScene(canvas)
    else if (screen == 2) drawBappaSelectionScreen(canvas)
    else if (screen == 3) drawBringingBappaHomeScene(canvas)
    else if (screen == 4) drawFinalCompletionScreen(canvas)
}