pick up items, dynamic message, easier lv1

This commit is contained in:
Lephenixnoir 2022-06-05 22:11:06 +01:00
parent 26c4fd9e1c
commit c66a526566
Signed by: Lephenixnoir
GPG Key ID: 1BBA026E13FC0495
10 changed files with 59 additions and 20 deletions

4
TODO
View File

@ -1,6 +1,4 @@
Unused enemies:
slime/Attack,Fire
fire_slime/Attack,Fire
water_slime
chemical_slime
albinos_bat
@ -19,3 +17,5 @@ Unused tilesets:
crypt
heaven
machine
Unused animations:
items/upgrade

View File

@ -10,14 +10,16 @@ wave: 9s 3*slime/1
item: armor1
wave: 12s 4*slime/1
wave: 4s 1*bat/2
wave: 20s 8*slime/1
item: sword1
wave: 20s 6*slime/1
wave: 8s 2*bat/2
delay: 4s
wave: 10s 4*slime/1
delay: 4s
# "Boss" wave #1
item: potion_hp
wave: 8s 12*slime/1 4*bat/2
wave: 8s 10*slime/1 3*bat/2
delay: 8s
wave: 10s 10*slime/1

View File

@ -113,8 +113,11 @@ entity_t *aoe_make_attack(uint16_t type, entity_t *origin, vec2 dir)
if(type == AOE_HIT
|| type == AOE_SLASH
|| type == AOE_IMPALE
|| type == AOE_JUDGEMENT) {
|| type == AOE_IMPALE) {
aoe->data.generic.strength = f->ATK;
aoe->data.generic.dir = p->facing;
}
else if(type == AOE_JUDGEMENT) {
aoe->data.generic.strength = f->MAG;
aoe->data.generic.dir = p->facing;
}
@ -265,7 +268,7 @@ void aoe_apply(game_t *game, entity_t *entity, entity_t *e)
fighter_t *e_f = getcomp(e, fighter);
if(aoe->type == AOE_ITEM && e_f && e_f->player) {
bool picked = item_pick_up(aoe->data.item.type, e);
bool picked = player_give_item(e, aoe->data.item.type);
if(picked)
aoe->lifetime = 0;
/* Don't bother recording the hit since the item will disappear */

View File

@ -12,6 +12,7 @@
#include <gint/defs/util.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
bool game_load(game_t *g, level_t const *level)
{
@ -130,6 +131,8 @@ void game_next_event(game_t *g)
for(int i = 0; i < event->wave->entry_count; i++)
g->wave_left[i] = event->wave->entries[i].amount;
game_message(g, fix(2.0), "Wave %d incoming!", g->wave_number);
}
if(event && event->type == LEVEL_EVENT_ITEM) {
int x=-1, y=-1;
@ -157,6 +160,7 @@ void game_next_event(game_t *g)
entity_t *item = item_make(event->item,
(vec2){ fix(x)+fix(0.5), fix(y)+fix(0.5) });
game_add_entity(g, item);
game_message(g, fix(2.0), "A %s dropped!", item_name(event->item));
}
}
@ -169,6 +173,18 @@ void game_shake(game_t *g, int amplitude, fixed_t duration)
g->screenshake_amplitude = amplitude;
}
void game_message(game_t *g, fixed_t duration, char const *fmt, ...)
{
static char message[128];
va_list args;
va_start(args, fmt);
vsnprintf(message, sizeof message, fmt, args);
va_end(args);
g->message = message;
g->message_time = duration;
}
//---
// Object management functions
//---

View File

@ -60,6 +60,10 @@ typedef struct game {
/* Cursor within the inventory menu */
int menu_cursor;
/* Current UI message, and how long it stays on (if not overwritten) */
char const *message;
fixed_t message_time;
} game_t;
/* Allocate resources to load a level. */
@ -83,6 +87,9 @@ void game_next_event(game_t *g);
/* Shake the screen for the specified amount of time */
void game_shake(game_t *g, int amplitude, fixed_t duration);
/* Set the current game message */
void game_message(game_t *g, fixed_t duration, char const *fmt, ...);
//---
// Managing dynamic game elements
//---

View File

@ -78,7 +78,7 @@ char const *item_description(int item)
else if(item == ITEM_POTION_FRZ)
return NULL;
else if(item == ITEM_POTION_HP)
return NULL;
return "Restores 50% HP";
else if(item == ITEM_POTION_SPD)
return NULL;
else if(item == ITEM_SCEPTER1)
@ -117,7 +117,7 @@ entity_t *item_make(int type, vec2 position)
return e;
}
bool item_pick_up(int type, entity_t *player)
bool item_use(int type, entity_t *player)
{
fighter_t *f = getcomp(player, fighter);
@ -148,11 +148,6 @@ bool item_pick_up(int type, entity_t *player)
/* TODO: Speed +50% for 10 seconds */
}
else if(type > ITEM_EQUIPMENT_START && type < ITEM_EQUIPMENT_END
&& f->player) {
return player_give_item(player, type);
}
return false;
}

View File

@ -44,7 +44,7 @@ char const *item_description(int item);
entity_t *item_make(int item, vec2 position);
/* Give an item to a player entity. */
bool item_pick_up(int item, entity_t *player);
bool item_use(int item, entity_t *player);
/* Which equipment slot an item goes in. */
int item_equipment_slot(int item);

View File

@ -106,8 +106,8 @@ int main(void)
.xp_level = 0,
.xp_to_next_level = 0,
.xp_current = 0,
// .inventory = { -1, -1, -1, -1, -1, -1, -1, -1 },
.inventory = { 1, 2, 3, 5, 101, -1, -1, -1 },
.inventory = { ITEM_POTION_HP, ITEM_POTION_ATK, -1, -1,
-1, -1, -1, -1 },
.equipment = { -1, -1, -1 },
};
@ -449,7 +449,7 @@ int main(void)
game.menu_cursor = 4 * y + x;
}
/* Equipping and unequipping items */
/* Using and equipping items */
if(!debug.paused && game.menu_open && ev.key == KEY_SHIFT) {
int item = player_data.inventory[game.menu_cursor];
int slot = item_equipment_slot(item);
@ -473,6 +473,9 @@ int main(void)
player_f->skills[i] = sk[i];
}
}
else if(item >= 0 && item_use(item, player)) {
player_data.inventory[game.menu_cursor] = -1;
}
}
}
@ -619,6 +622,15 @@ int main(void)
game.menu_time = max(game.menu_time - 2 * dt_rt, fix(0));
}
/* Reduce message time */
if(game.message && game.message_time > 0) {
game.message_time -= dt_rt;
if(game.message_time <= 0) {
game.message_time = 0;
game.message = NULL;
}
}
game.time_total += dt;
game.event_time += dt;

View File

@ -43,7 +43,7 @@ void camera_init(camera_t *c, map_t const *m)
c->y = (c->limits.y_min + c->limits.y_max) / 2;
/* Vertical adjustment to add space for the HUD */
c->y -= fix(0);
c->y -= fix(2)/16;
}
ivec2 camera_map2screen(camera_t const *c, vec2 p)
@ -582,6 +582,10 @@ void render_game(game_t const *g, bool show_hitboxes)
/* Render wave information */
render_info(0, HEADER_Y, g);
/* Render current message */
if(g->message)
dtext(8, HEADER_Y + 13, C_RGB(20, 20, 20), g->message);
/* Render HUD */
extern bopti_image_t img_hud;
dimage(0, HUD_Y - img_hud.height, &img_hud);

View File

@ -15,7 +15,7 @@ fixed_t skill_cooldown(int skill)
else if(skill == AOE_PROJECTILE)
return fix(2.0);
else if(skill == AOE_SHOCK)
return fix(8.0);
return fix(6.0);
else if(skill == AOE_JUDGEMENT)
return fix(3.0);
else if(skill == AOE_BULLET)