Compare commits

...

3 Commits

Author SHA1 Message Date
Lephenixnoir 03e9a822e3
update add-in icon 2022-12-30 17:38:13 +01:00
Lephenixnoir 8a5eba945d
update TODO 2022-12-30 17:38:13 +01:00
Lephenixnoir e2ba1f51c2
fix animation transition issue for hit enemies
Transitioning to the `next` animation frame preserved the priority,
which was a problem for enemies with a next: Hit=Idle or similar
transition, as that would give an infinite Idle loop with high
priority.

This change forces a clear of the animation priority when such a
transition occurs. This relies on the flawed linked list system, which
means that it will not happen if the new animation is just after the
current one in the source file. This is a fundamental issue due to
mixing all frames as single pointers in the anim_t structure. This will
be fixed in engine code eventually.
2022-12-30 16:00:29 +01:00
13 changed files with 95 additions and 50 deletions

104
TODO
View File

@ -1,43 +1,81 @@
Pixel art to do (by priority):
- More varied attacks: circular slash? dash attack?
- Environment damage
- Particles after monsters' deaths? Slime puddles, dark enemy outlines, ...
- Enemies planned (skeletons; more tifuciles; a final boss for Crypt GLOOM?)
Pixel art to do
===============
Unused enemies:
water_slime
chemical_slime
crimson_bat
gunslinger/Reloading
gb_gunslinger
master_gunslinger
tifucile
washing_machine
Unused items:
chest
Unused skills:
launch
magic
Unused animations:
items/upgrade
- More varied attacks:
* Sharp shadow attack (see skill icon for inspiration)
* Circular slash? (We already have shock)
* AOE-style bomb/meteor/etc?
- Enemies:
* A new jumping attack for slimes for variety in Wrecked Lab (Arcuz)
* Or maybe a flying slime?
* Skeletons
* More tifuciles (including mamafucile)
* Crypt boss (Dracula / Skeleton archmagus / etc)
- Environment damage
- Particles after monsters' deaths? Slime puddles, dark enemy outlines, ...
* Have camera move (eg. in the direction of movement)
Programming to do
=================
Core mechanics:
* Compute a score at the end of each level
- Only increases, so we can show its real-time value
- Based on: combo chains, simult-kills, one-shot kills, waves survived
* Have a deterministic mode for grinding
* Use for items in battle (potions mainly)
* Infinite mode for every level
* Map events, including removable tombstones in Crypt GLOOM
* Elaborate AIs that force the player to move and adapt, not just mash
* Tutorial
* Bindings for higher score:
- Faster waves
- No skills
- Reduced weapon damage
Content:
* Additional skills
Extra details
=============
* Have camera move? (eg. in the direction of movement)
* More explosions
* Cool-looking shaders?
* Leaves particles on monsters' death
* Leaves environment damage after spells and explosions
* Thorned dash
* Mini cutscenes?
* Bonemeal easter egg (grow plants wherever skeletons die)
* Also the other easter egg
* More variety in the moveset: circular attack, dash attack
* Elaborate AIs that force the player to move and adapt, not just mash
* Buffed gunslingers with bullet hell vibes
* Arcade gameplay: add score and marks based on health lost, time spent, etc
- Make loot drops and spawn locations deterministic
- Large graphics for combos etc
Reference data
==============
* Tutorial?!
Level gimmicks:
1. [Mossy Dungeon]: No gimmick, this is the tutorial/baseline
2. [Wrecked lab]: All sorts of slimes
3. [X's Garden]: Tifuciles and the tifucile boss
4. [Mecha Airship]: Gunslinger-loaded bullet hell
5. [Crypt GLOOM]: Map clears when enemies resurrect + final boss
Unused resources:
- Enemies:
* water_slime
* chemical_slime
* crimson_bat
* gb_gunslinger
* master_gunslinger
* tifucile
* washing_machine
- Items:
* chest
Skills:
* launch
* magic
Animations:
* items/upgrade
Enemies for each level:
1. [Mossy Dungeon]: Introduce basic enemies
2. [Wrecked Lab]: All slimes + some bats
3. [X's Garden]: Tifuciles + Normal and chemical slimes
4. [Mecha Airship]: All gunslingers + Fire slimes
5. [Crypt GLOOM]: Skeletons + Bats + Water slimes

View File

@ -16,10 +16,10 @@ bat_right.aseprite:
gunslinger_left.aseprite:
center: 15, 22
next: Idle=Idle, Walking=Walking, Hit=Idle, Fire=Reloading
next: Idle=Idle, Walking=Walking, Hit=Idle
gunslinger_right.aseprite:
center: 8, 22
next: Idle=Idle, Walking=Walking, Hit=Idle, Fire=Reloading
next: Idle=Idle, Walking=Walking, Hit=Idle
*.txt:
custom-type: aseprite-anim-variation

Binary file not shown.

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

View File

@ -1,15 +1,15 @@
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.8" tiledversion="1.8.4" orientation="orthogonal" renderorder="right-down" width="24" height="11" tilewidth="16" tileheight="16" infinite="0" nextlayerid="3" nextobjectid="1">
<map version="1.9" tiledversion="1.9.2" orientation="orthogonal" renderorder="right-down" width="24" height="11" tilewidth="16" tileheight="16" infinite="0" nextlayerid="3" nextobjectid="1">
<tileset firstgid="1" source="../tilesets/cavern.tsx"/>
<layer id="1" name="Ground" width="24" height="11">
<data encoding="csv">
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
2,2,2,2,2,7,15,8,7,8,7,16,8,7,15,7,7,16,8,2,2,2,2,2,
2,2,2,2,2,4,4,14,14,6,3,3,3,3,6,4,4,14,4,2,2,2,2,2,
2,2,2,2,2,14,14,5,3,3,3,5,5,3,3,3,5,4,4,2,2,2,2,2,
2,2,2,2,2,3,5,3,3,3,4,5,5,4,3,3,3,5,3,2,2,2,2,2,
2,2,2,2,2,5,3,3,6,5,5,6,6,5,5,6,3,3,5,2,2,2,2,2,
2,2,2,2,2,3,5,3,3,3,4,5,5,4,3,3,3,5,3,2,2,2,2,2,
2,2,2,2,2,14,14,5,3,3,3,2,2,3,3,3,5,4,4,2,2,2,2,2,
2,2,2,2,2,3,5,3,3,3,2,2,2,2,3,3,3,5,3,2,2,2,2,2,
2,2,2,2,2,5,3,3,6,5,7,2,2,7,5,6,3,3,5,2,2,2,2,2,
2,2,2,2,2,3,5,3,3,3,4,7,23,4,3,3,3,5,3,2,2,2,2,2,
2,2,2,2,2,14,4,5,3,3,3,5,5,3,3,3,5,4,14,2,2,2,2,2,
2,2,2,2,2,4,14,4,4,6,3,3,3,3,6,14,14,4,4,2,2,2,2,2,
2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,

View File

@ -138,14 +138,19 @@ void anim_frame_subrender(int x, int y, anim_frame_t const *frame, int left,
frame->x + left, frame->y + top, width, height, DIMAGE_NONE);
}
void anim_state_update(anim_state_t *state, fixed_t dt)
bool anim_state_update(anim_state_t *state, fixed_t dt)
{
if(!state->frame) return;
if(!state->frame) return false;
state->elapsed += fround(dt * 1000);
if(state->elapsed < state->frame->duration) return;
if(state->elapsed < state->frame->duration) return false;
// TODO: FIXME: This is incorrect if the next animation is just behind
bool transitioning = (state->frame->next != state->frame + 1);
/* Switch to next frame */
state->elapsed -= state->frame->duration;
state->frame = state->frame->next;
return transitioning;
}

View File

@ -61,8 +61,9 @@ void anim_frame_render(int x, int y, anim_frame_t const *frame);
void anim_frame_subrender(int x, int y, anim_frame_t const *frame, int left,
int top, int width, int height);
/* Update an animation to next frame. */
void anim_state_update(anim_state_t *state, fixed_t dt);
/* Update an animation to next frame. Returns true if the update transitioned
to another animation. */
bool anim_state_update(anim_state_t *state, fixed_t dt);
/* List of animations. */
@ -87,9 +88,9 @@ extern anim_t anims_skill_bullet;
ANIM_E1(MACRO, bat, Idle, Hit, Death) \
ANIM_E1(MACRO, albinos_bat, Idle, Hit, Death) \
ANIM_E1(MACRO, crimson_bat, Idle, Hit, Death) \
ANIM_E1(MACRO, gunslinger, Idle, Walking, Reloading, Fire, Hit, Death) \
ANIM_E1(MACRO, gb_gunslinger, Idle, Walking, Reloading, Fire, Hit, Death) \
ANIM_E1(MACRO, master_gunslinger, Idle, Walking,Reloading,Fire,Hit,Death) \
ANIM_E1(MACRO, gunslinger, Idle, Walking, Fire, Hit, Death) \
ANIM_E1(MACRO, gb_gunslinger, Idle, Walking, Fire, Hit, Death) \
ANIM_E1(MACRO, master_gunslinger, Idle, Walking, Fire,Hit,Death) \
ANIM_E1(MACRO, tifucile, Idle, Walking, Hit, Death) \
ANIM_E1(MACRO, washing_machine, Idle, Walking, Attack, Hit, Death)

View File

@ -38,7 +38,8 @@ void visible_update(entity_t *e, fixed_t dt)
if(v->anim.frame == NULL)
return;
anim_state_update(&v->anim, dt);
if(anim_state_update(&v->anim, dt))
v->anim_priority = 0;
if(v->anim.frame == NULL)
v->anim_priority = 0;

View File

@ -504,7 +504,7 @@ void render_arcade(int x, int y, int halign, int value, int color_style)
/* Auto style based on the number of digits */
if(color_style < 0)
color_style = (value >= 10) + (value >= 100);
color_style = (value >= 10) + (value >= 30);
char str[16];
sprintf(str, "%d", value);