diff --git a/game/components.h b/game/components.h index 8840e06..ad8623f 100644 --- a/game/components.h +++ b/game/components.h @@ -115,6 +115,32 @@ static ParticleEmitter GET_FIREBALL_EMITTER() { .data.blend = BLEND_ADDITIVE }; } +static ParticleEmitter GET_BLOOD_EMITTER() { + return (ParticleEmitter) { + .emitterLifetime = 0.3f, + .data.emmitRate = 1.8f, + .data.minOffset = { -3.6f, -3.6f }, + .data.maxOffset = { 3.6f, 3.6f }, + .data.minStartVel = { 4.5f, 7.3f }, + .data.maxStartVel = { 2.5f, 3.3f }, + .data.minEndVel = { -0.8f, 1.2f }, + .data.maxEndVel = { -0.4f, 1.6f }, + .data.minStartSize = 2.45f, + .data.maxStartSize = 3.3f, + .data.minEndSize = 0.8f, + .data.maxEndSize = 1.1f, + .data.minStartRotSpeed = 8.0f, + .data.maxStartRotSpeed = 14.0f, + .data.minEndRotSpeed = 4.5f, + .data.maxEndRotSpeed = 6.2f, + .data.startColor = { 210, 0, 0, 255 }, + .data.endColor = { 110, 10, 10, 32 }, + .data.minLifetime = 0.23, + .data.maxLifetime = 0.37, + .data.blend = BLEND_ALPHA, + .data.tileID = getParticleTypeTile(PARTICLE_SMALL_SQUARE), + }; +} typedef struct Particle { Vector2 pos; diff --git a/game/main.c b/game/main.c index c8d0420..1838b02 100644 --- a/game/main.c +++ b/game/main.c @@ -464,6 +464,7 @@ static void drawOverScreen(Color c) { DrawRectangle(0, 0, width, height, c); } +static ParticleEmitter editedEmitter; static void renderGame(Game *game, float dt) { ClearBackground(RAYWHITE); BeginMode2D(game->camera); @@ -568,9 +569,15 @@ static void renderGame(Game *game, float dt) { EndMode2D(); + static bool firstRun = true; + if (firstRun) { + editedEmitter = GET_BLOOD_EMITTER(); + firstRun = false; + } + InputState *input = ecs_singleton_get_mut(ECS, InputState); if (IsKeyReleased(KEY_SPACE)) { - ParticleEmitter emitter = GET_FIREBALL_EMITTER(); + ParticleEmitter emitter = editedEmitter; emitter.pos = input->mouseWorld; emitter.targetParticles = ecs_id(ParticleLayer1); ecs_entity_t e = entityCreateEmpty(); @@ -715,11 +722,14 @@ void imguiRender(float dt, void *userData) { } igText("Input state: %s", inputState); if (igCollapsingHeader_TreeNodeFlags("ParticleEditor", 0)) { - static ParticleEmitter emitter = {0.0f}; - emitter.data.tileID = getParticleTypeTile(PARTICLE_CIRCLE); - emitter.data.blend = BLEND_ADDITIVE; - struct ParticleEmitterData *data = &emitter.data; - igSliderFloat2("Pos", &emitter.pos.x, 0.0f, 1000.0f, "%.2f", 0); + struct ParticleEmitterData *data = &editedEmitter.data; + igSliderFloat("EmitterLifetime", &editedEmitter.emitterLifetime, 0.0f, 10.0f, "%.2f", 0); + igSliderFloat2("Pos", &editedEmitter.pos.x, 0.0f, 1000.0f, "%.2f", 0); + + igSliderFloat("emmitRate", &data->emmitRate, 0.0f, 10.0f, "%.2f", 0); + igSliderFloat("emmitVarianceScl", &data->emmitVariance, 0.0f, 10.0f, "%.2f", 0); + igSliderFloat2("emmitVariance", &data->emmitVarianceMin, -10.0f, 10.0f, "%.2f", 0); + igSliderFloat2("minOffset", &data->minOffset.x, -50.0f, 50.0f, "%.2f", 0); igSliderFloat2("maxOffset", &data->maxOffset.x, -50.0f, 50.0f, "%.2f", 0); @@ -760,10 +770,31 @@ void imguiRender(float dt, void *userData) { igSliderFloat("minLifetime", &data->minLifetime, 0.0f, 6.0f, "%.2f", 0); igSliderFloat("maxLifetime", &data->maxLifetime, 0.0f, 6.0f, "%.2f", 0); - Particle particle = spawnParticle(&emitter); - //ecs_entity_t e = entityCreateEmpty(); - //ecs_set_ptr(ECS, e, ParticleLayer1, &particle); - } + +#define NUM_BLEND_MODES 6 + const char *blendModeNames[NUM_BLEND_MODES] = { + "Alpha", + "Additive", + "Multiplied", + "AddColors", + "SubtractColors", + "AlphaPremultiply" + }; + int blendMode = data->blend; + igCombo_Str_arr("BlendMode", &blendMode, blendModeNames, NUM_BLEND_MODES, 0); + data->blend = blendMode; +#undef NUM_BLEND_MODES +#define NUM_SHAPES 3 + const char *typeNames[NUM_SHAPES] = { + "Circle", + "SmallSquare", + "Square", + }; + int type = getParticleType(data->tileID); + igCombo_Str_arr("ParticleType", &type, typeNames, NUM_SHAPES, 0); + data->tileID = getParticleTypeTile(type); +#undef NUM_SHAPES + }; if (igCollapsingHeader_TreeNodeFlags("Selection", 0)) { switch (input->state) { case INPUT_SELECTED_UNITS: diff --git a/game/systems/s_event.c b/game/systems/s_event.c index 2af7f49..df69960 100644 --- a/game/systems/s_event.c +++ b/game/systems/s_event.c @@ -12,6 +12,16 @@ void damageEvent(ecs_entity_t entity, DamageEvent event) { Health *health = ecs_get_mut(ECS, entity, Health); health->hp -= event.amount; + Vector2 center = { + event.hitbox.x + event.hitbox.width * 0.5f, + event.hitbox.y + event.hitbox.height * 0.5f, + }; + ecs_entity_t bloodEmitterEntity = entityCreateEmpty(); + ParticleEmitter bloodEmitter = GET_BLOOD_EMITTER(); + bloodEmitter.pos = center; + bloodEmitter.targetParticles = ecs_id(ParticleLayer1); + ecs_set_ptr(ECS, bloodEmitterEntity, ParticleEmitter, &bloodEmitter); + Vector2 pos = { event.hitbox.x + event.hitbox.width * 0.5f + randFloatRange(-2, 2), event.hitbox.y + randFloatRange(2, 4)