aboutsummaryrefslogtreecommitdiffstats
path: root/src/clicky.c
blob: 0e32fb079f03c045679233555ed4cc0996f97adc (plain) (blame)
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
#include "clicky.h"
#include "game.h"
#include "assets.h"
#include "util.h"

void initClickies(Clickies* clickies)
{
    clickies->clickiesCount = 0;
}

void closeClickies(Clickies* clickies)
{
    for (int i = 0; i < clickies->clickiesCount; ++i)
    {
        // Yes, we shall free it using a callback it stores.
        // Just wish I could free myself like this ):
        clickies->clickies[i].freeCB(clickies->clickies[i]);
    }
}

void addClickyToClickies(Clickies* clickies, Clicky clicky)
{
    if (clickies->clickiesCount >= MAX_CLICKIES)
    {
        return; // At max.
    }

    ++clickies->clickiesCount;
    clickies->clickies[clickies->clickiesCount - 1] = clicky;
}

void updateClickies(Game* game, Clickies* clickies)
{
    for (int i = 0; i < clickies->clickiesCount; ++i)
    {
        clickies->clickies[i].updateCB(game, &clickies->clickies[i]);
    }
}

void updatePenguinLol(Game* game, Clicky* clicky)
{
    // Mouse clicky.
    if (IsMouseButtonPressed(MOUSE_LEFT_BUTTON))
    {
        if (doesCollideWithAnimationData(clicky->rect, clicky->animation.asset->image.data,
            clicky->animation.width, clicky->animation.height, clicky->animation.currentFrame, getScaledMousePosition()))
        {
            clicky->wasClicked = true;
        }
    }

    // Was clicked.
    if (clicky->wasClicked)
    {
        replayAnimation(&clicky->animation);
        ++game->stones;
        clicky->wasClicked = false;
    }

    // Drag around.
    if (IsMouseButtonDown(MOUSE_LEFT_BUTTON))
    {
        if (IsCursorOnScreen() && doesCollideWithAnimationData(clicky->rect, clicky->animation.asset->image.data,
            clicky->animation.width, clicky->animation.height, clicky->animation.currentFrame, getScaledMousePosition()))
        {
            Vector2 mouseDelta = GetMouseDelta();
            clicky->rect.x += mouseDelta.x;
            clicky->rect.y += mouseDelta.y;
        }
    }

    // Run animation and update.
    runAnimation(&clicky->animation);

    Texture texture = clicky->animation.texture;
    DrawTexturePro(texture, (Rectangle){0.0, 0.0, texture.width, texture.height},
                   clicky->rect, Vector2Zero(), 0.0, WHITE);
}

void freePenginLolClicky(Clicky clicky)
{
    closeAnimation(&clicky.animation);
}

Clicky createPenguinLolClicky(Game* game)
{
    Clicky clicky;

    clicky.animation = createAnimation(&game->assets.animations[PENGUIN_LOL_ANIMATION], ANIMATION_DEFAULT_DELAY);
    setAnimationFrame(&clicky.animation, clicky.animation.frameCount - 1);
    clicky.animation.repeat = false;
    clicky.texture = NULL;
    clicky.rect = (Rectangle){0.0, 0.0, 512, 512};

    clicky.data = NULL;
    clicky.updateCB = updatePenguinLol;
    clicky.freeCB = freePenginLolClicky;

    clicky.wasClicked = false;

    return clicky;
}