summaryrefslogtreecommitdiff
path: root/src/barrel.c
blob: 474b15159a275470d9bce1e95caba86a6f667b33 (plain)
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
#include "barrel.h"
#include "barrel_data.h"
#include "utils.h"
#include "assets.h"
#include "physics.h"
#include "constants.h"
#include <raymath.h>

enum Barrel_State {
  BARREL_NEUTRAL,
  BARREL_DAMAGED
};

void AddBarrel(float xpos, float ypos) {
  Entity barrel = {0};
  barrel.type = Barrel_Entity;

  barrel.position = (Vector2) {xpos, ypos};
  barrel.flags |= (ENTITY_PHYSICS_ACTIVE | ENTITY_VISIBLE);

  Asset* barrelTexture = GetMatchingAssetExitOnFail("barrel", Texture_Asset);

  Sprite barrelSprite = (Sprite) {
    .texture = barrelTexture->texture,
    .layer = Foreground_Layer,
    .alpha = 1.0,

    .destRect = destRect,
    .srcRect = srcRect
  };

  AddSpriteToEntity(&barrel, barrelSprite);

  barrel.physicsCollider = physicsCollider;
  barrel.hurtBoxes[0] = physicsCollider;
  barrel.numHurtBoxes = 1;

  barrel.state = BARREL_NEUTRAL;

#ifdef BEATEMUP_DEBUG
  barrel.physicsColliderColor = RED;
  barrel.hurtboxColors[0] = BLUE;
#endif

  AddEntity(&barrel);
}

void UpdateBarrel(Entity* barrel, float dt) {
  if (barrel->state == BARREL_DAMAGED) {
    barrel->velocity.y += GRAVITY * dt * 0.5;
    MoveWithoutPhysics(barrel, dt);
    barrel->velocity.y += GRAVITY * dt * 0.5;

    barrel->sprites[0].alpha =
      1.0 - (barrel->timeSinceLastHit / BARREL_REMOVE_TIME);

    barrel->timeSinceLastHit += dt;
    if (barrel->timeSinceLastHit > BARREL_REMOVE_TIME)
      barrel->flags &= ~ENTITY_ALLOCATED;
  }
}

void GetDamaged(Entity* barrel) {
  barrel->sprites[0].srcRect = srcRectDamaged;

  barrel->flags &= ~ENTITY_PHYSICS_ACTIVE;
  barrel->state = BARREL_DAMAGED;

  barrel->velocity = (Vector2) {100.0f, -400.0f};
  barrel->timeSinceLastHit = 0.0f;
}

void BarrelHandleCollision(Entity* barrel) {
  GetDamaged(barrel);
}