diff --git a/.gitignore b/.gitignore index b65a8a0..ec9b4d0 100644 --- a/.gitignore +++ b/.gitignore @@ -16,3 +16,6 @@ __pycache__/ screens/ # Concept document concept.pdf +# Random things +assets-cg/gui.xcf +assets-cg/gui2.xcf diff --git a/CMakeLists.txt b/CMakeLists.txt index bc1dbd7..d6d9f39 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -62,6 +62,7 @@ set(ASSETS assets-cg/font_hud.png # Items assets-cg/items/life.aseprite + assets-cg/items/chest.aseprite assets-cg/items/potion_atk.aseprite assets-cg/items/potion_cooldown.aseprite assets-cg/items/potion_def.aseprite @@ -93,6 +94,11 @@ set(ASSETS assets-cg/skills/bullet_left.aseprite assets-cg/skills/hit.aseprite assets-cg/skills/judgement.aseprite + assets-cg/skills/launch.aseprite + assets-cg/skills/magic_up.aseprite + assets-cg/skills/magic_right.aseprite + assets-cg/skills/magic_down.aseprite + assets-cg/skills/magic_left.aseprite assets-cg/skills/teleport.aseprite assets-cg/skills/shock.aseprite assets-cg/skills/projectile_left.aseprite @@ -109,6 +115,30 @@ set(ASSETS # Enemies: Fire Slime assets-cg/enemies/fire_slime_left.txt assets-cg/enemies/fire_slime_right.txt + # Enemies: Albinos Bat + assets-cg/enemies/albinos_bat_left.txt + assets-cg/enemies/albinos_bat_right.txt + # Enemies: Chemical Slime + assets-cg/enemies/chemical_slime_left.txt + assets-cg/enemies/chemical_slime_right.txt + # Enemies: Crimson Bat + assets-cg/enemies/crimson_bat_left.txt + assets-cg/enemies/crimson_bat_right.txt + # Enemies: Water Slime + assets-cg/enemies/water_slime_left.txt + assets-cg/enemies/water_slime_right.txt + # Enemies: GB Gunslinger + assets-cg/enemies/gb_gunslinger_left.txt + assets-cg/enemies/gb_gunslinger_right.txt + # Enemies: Master Gunslinger + assets-cg/enemies/master_gunslinger_left.txt + assets-cg/enemies/master_gunslinger_right.txt + # Enemies: Tifucile + assets-cg/enemies/tifucile_left.aseprite + assets-cg/enemies/tifucile_right.aseprite + # Enemies: Washing machine + assets-cg/enemies/washing_machine_left.aseprite + assets-cg/enemies/washing_machine_right.aseprite # Misc assets-cg/font_damage_red.png assets-cg/font_damage_white.png diff --git a/TODO b/TODO new file mode 100644 index 0000000..f011b12 --- /dev/null +++ b/TODO @@ -0,0 +1,21 @@ +Unused enemies: + slime/Attack,Fire + fire_slime/Attack,Fire + water_slime + chemical_slime + albinos_bat + crimson_bat + gunslinger/Reloading + gb_gunslinger + master_gunslinger + tifucile + washing_machine +Unused items: + chest +Unused skills: + launch + magic +Unused tilesets: + crypt + heaven + machine diff --git a/assets-cg/converters.py b/assets-cg/converters.py index 6393e9b..feccfd7 100644 --- a/assets-cg/converters.py +++ b/assets-cg/converters.py @@ -459,13 +459,26 @@ def convert_aseprite_anim(input, output, params, newpalette=None): return o def convert_aseprite_anim_variation(input, output, params): - if "base" not in params or "palette" not in params: - raise fxconv.FxconvError("aseprite anim variation needs base/palette") - from aseprite import AsepriteFile - base = os.path.join(os.path.dirname(input), params["base"]) - palette = os.path.join(os.path.dirname(input), params["palette"]) + if "base" in params: + base = params["base"] + elif "base_regex" in params: + regex = params["base_regex"].split(" ", 1) + base = re.sub(*regex, os.path.basename(input)) + else: + raise fxconv.FxconvError(f"{input} lacks a 'base:' metadata") + + if "palette" in params: + palette = params["palette"] + elif "palette_regex" in params: + regex = params["palette_regex"].split(" ", 1) + palette = re.sub(*regex, os.path.basename(input)) + else: + raise fxconv.FxconvError(f"{input} lacks a 'palette:' metadata") + + base = os.path.join(os.path.dirname(input), base) + palette = os.path.join(os.path.dirname(input), palette) with open(palette, "rb") as fp: ase = AsepriteFile(fp.read()) diff --git a/assets-cg/enemies/albinos_bat_left.txt b/assets-cg/enemies/albinos_bat_left.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/albinos_bat_right.txt b/assets-cg/enemies/albinos_bat_right.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/chemical_slime_left.txt b/assets-cg/enemies/chemical_slime_left.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/chemical_slime_right.txt b/assets-cg/enemies/chemical_slime_right.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/crimson_bat_left.txt b/assets-cg/enemies/crimson_bat_left.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/crimson_bat_right.txt b/assets-cg/enemies/crimson_bat_right.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/fxconv-metadata.txt b/assets-cg/enemies/fxconv-metadata.txt index 8c92719..53dd6da 100644 --- a/assets-cg/enemies/fxconv-metadata.txt +++ b/assets-cg/enemies/fxconv-metadata.txt @@ -26,11 +26,14 @@ gunslinger_right.aseprite: name_regex: (.*)\.txt frames_\1 profile: p8 next: Idle=Idle, Walking=Walking, Hit=Idle +*_left.txt: + palette_regex: (.*)_left\.txt \1_palette.aseprite +*_right.txt: + palette_regex: (.*)_right\.txt \1_palette.aseprite -fire_slime_left.txt: - base: slime_left.aseprite - palette: fire_slime_palette.aseprite - -fire_slime_right.txt: - base: slime_right.aseprite - palette: fire_slime_palette.aseprite +*_slime_*.txt: + base_regex: .*_slime_(.*)\.txt slime_\1.aseprite +*_bat_*.txt: + base_regex: .*_bat_(.*)\.txt bat_\1.aseprite +*_gunslinger_*.txt: + base_regex: .*_gunslinger_(.*)\.txt gunslinger_\1.aseprite diff --git a/assets-cg/enemies/gb_gunslinger_left.txt b/assets-cg/enemies/gb_gunslinger_left.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/gb_gunslinger_palette.aseprite b/assets-cg/enemies/gb_gunslinger_palette.aseprite index f1ccfa3..2af570c 100644 Binary files a/assets-cg/enemies/gb_gunslinger_palette.aseprite and b/assets-cg/enemies/gb_gunslinger_palette.aseprite differ diff --git a/assets-cg/enemies/gb_gunslinger_right.txt b/assets-cg/enemies/gb_gunslinger_right.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/master_gunslinger_left.txt b/assets-cg/enemies/master_gunslinger_left.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/master_gunslinger_right.txt b/assets-cg/enemies/master_gunslinger_right.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/water_slime_left.txt b/assets-cg/enemies/water_slime_left.txt new file mode 100644 index 0000000..e69de29 diff --git a/assets-cg/enemies/water_slime_right.txt b/assets-cg/enemies/water_slime_right.txt new file mode 100644 index 0000000..e69de29 diff --git a/src/anim.c b/src/anim.c index a099e14..bb79b5b 100644 --- a/src/anim.c +++ b/src/anim.c @@ -40,29 +40,15 @@ ANIM2(skill_projectile); ANIM1(skill_teleport); ANIM1(skill_shock); ANIM1(skill_judgement); +ANIM1(skill_launch); /* Directional skills */ ANIM4(skill_swing); ANIM4(skill_impale); ANIM4(skill_bullet); +ANIM4(skill_magic); /* Enemies */ -ANIM2(slime, Idle); -ANIM2(slime, Walking); -ANIM2(slime, Hit); -ANIM2(slime, Death); -ANIM2(bat, Idle); -ANIM2(bat, Hit); -ANIM2(bat, Death); -ANIM2(gunslinger, Idle); -ANIM2(gunslinger, Walking); -ANIM2(gunslinger, Reloading); -ANIM2(gunslinger, Fire); -ANIM2(gunslinger, Hit); -ANIM2(gunslinger, Death); -ANIM2(fire_slime, Idle); -ANIM2(fire_slime, Walking); -ANIM2(fire_slime, Hit); -ANIM2(fire_slime, Death); +ANIM_ENEMIES(ANIM2) /* Player */ ANIM4(player, Idle); @@ -77,6 +63,7 @@ ANIM1(hud_xp_Explode); /* Items */ ANIM1(item_life); +ANIM1(item_chest); ANIM1(item_potion_atk); ANIM1(item_potion_cooldown); ANIM1(item_potion_def); diff --git a/src/anim.h b/src/anim.h index 89847f7..d9f7bf7 100644 --- a/src/anim.h +++ b/src/anim.h @@ -78,23 +78,20 @@ extern anim_t anims_skill_impale; extern anim_t anims_skill_bullet; /* Enemies */ -extern anim_t anims_slime_Idle; -extern anim_t anims_slime_Walking; -extern anim_t anims_slime_Hit; -extern anim_t anims_slime_Death; -extern anim_t anims_bat_Idle; -extern anim_t anims_bat_Hit; -extern anim_t anims_bat_Death; -extern anim_t anims_gunslinger_Idle; -extern anim_t anims_gunslinger_Walking; -extern anim_t anims_gunslinger_Reloading; -extern anim_t anims_gunslinger_Fire; -extern anim_t anims_gunslinger_Hit; -extern anim_t anims_gunslinger_Death; -extern anim_t anims_fire_slime_Idle; -extern anim_t anims_fire_slime_Walking; -extern anim_t anims_fire_slime_Hit; -extern anim_t anims_fire_slime_Death; + +#define ANIM_ENEMIES(MACRO) \ + ANIM_E1(MACRO, slime, Idle, Walking, Attack, Fire, Hit, Death) \ + ANIM_E1(MACRO, fire_slime, Idle, Walking, Attack, Fire, Hit, Death) \ + ANIM_E1(MACRO, water_slime, Idle, Walking, Attack, Fire, Hit, Death) \ + ANIM_E1(MACRO, chemical_slime, Idle, Walking, Attack, Fire, Hit, Death) \ + 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, tifucile, Idle, Walking, Hit, Death) \ + ANIM_E1(MACRO, washing_machine, Idle, Walking, Attack, Hit, Death) /* Player */ extern anim_t anims_player_Idle; @@ -109,6 +106,7 @@ extern anim_t anims_hud_xp_Explode; /* Items */ extern anim_t anims_item_life; +extern anim_t anims_item_chest; extern anim_t anims_item_potion_atk; extern anim_t anims_item_potion_cooldown; extern anim_t anims_item_potion_def; @@ -120,3 +118,22 @@ extern anim_t anims_item_stick2; extern anim_t anims_item_sword1; extern anim_t anims_item_sword2; extern anim_t anims_item_armor1; + +/* Expand definitions for enemies */ + +#define ANIM_E1(MACRO, ENEMY, SEQ, ...) \ + MACRO(ENEMY, SEQ) __VA_OPT__(ANIM_E2(MACRO, ENEMY, __VA_ARGS__)) +#define ANIM_E2(MACRO, ENEMY, SEQ, ...) \ + MACRO(ENEMY, SEQ) __VA_OPT__(ANIM_E3(MACRO, ENEMY, __VA_ARGS__)) +#define ANIM_E3(MACRO, ENEMY, SEQ, ...) \ + MACRO(ENEMY, SEQ) __VA_OPT__(ANIM_E4(MACRO, ENEMY, __VA_ARGS__)) +#define ANIM_E4(MACRO, ENEMY, SEQ, ...) \ + MACRO(ENEMY, SEQ) __VA_OPT__(ANIM_E5(MACRO, ENEMY, __VA_ARGS__)) +#define ANIM_E5(MACRO, ENEMY, SEQ, ...) \ + MACRO(ENEMY, SEQ) __VA_OPT__(ANIM_E6(MACRO, ENEMY, __VA_ARGS__)) +#define ANIM_E6(MACRO, ENEMY, SEQ, ...) \ + MACRO(ENEMY, SEQ) __VA_OPT__(ANIM_ETOO_MANY_ARGS) + +#define ANIM_ENEMIES_PROTO(ENEMY, SEQ) \ + extern anim_t anims_ ## ENEMY ## _ ## SEQ; +ANIM_ENEMIES(ANIM_ENEMIES_PROTO) diff --git a/src/enemies.c b/src/enemies.c index 9524ca5..e5af723 100644 --- a/src/enemies.c +++ b/src/enemies.c @@ -20,7 +20,7 @@ static enemy_t const slime_1 = { .name = "Slime", .level = 1, - ANIMS(slime, Idle, Walking, Idle, Hit, Death), + ANIMS(slime, Idle, Walking, Attack, Hit, Death), .hitbox = (rect){ -fix(3)/16, fix(4)/16, -fix(2)/16, fix(3)/16 }, .limits = { .max_speed = fix(1),