2022-02-16 17:42:05 +01:00
|
|
|
#include "item.h"
|
|
|
|
#include "aoe.h"
|
2022-03-18 22:21:30 +01:00
|
|
|
#include "player.h"
|
2022-03-19 18:14:00 +01:00
|
|
|
#include "skills.h"
|
2022-02-16 17:42:05 +01:00
|
|
|
#include "comp/fighter.h"
|
|
|
|
#include "comp/physical.h"
|
|
|
|
#include "comp/visible.h"
|
|
|
|
#include <gint/defs/util.h>
|
|
|
|
|
2022-03-16 20:00:22 +01:00
|
|
|
anim_t const *item_anim(int item)
|
|
|
|
{
|
|
|
|
if(item == ITEM_LIFE)
|
|
|
|
return &anims_item_life;
|
|
|
|
else if(item == ITEM_POTION_ATK)
|
|
|
|
return &anims_item_potion_atk;
|
|
|
|
else if(item == ITEM_POTION_COOLDOWN)
|
|
|
|
return &anims_item_potion_cooldown;
|
|
|
|
else if(item == ITEM_POTION_DEF)
|
|
|
|
return &anims_item_potion_def;
|
|
|
|
else if(item == ITEM_POTION_FRZ)
|
|
|
|
return &anims_item_potion_frz;
|
|
|
|
else if(item == ITEM_POTION_HP)
|
|
|
|
return &anims_item_potion_hp;
|
|
|
|
else if(item == ITEM_POTION_SPD)
|
|
|
|
return &anims_item_potion_spd;
|
|
|
|
else if(item == ITEM_SCEPTER1)
|
|
|
|
return &anims_item_stick1;
|
|
|
|
else if(item == ITEM_SCEPTER2)
|
|
|
|
return &anims_item_stick2;
|
|
|
|
else if(item == ITEM_SWORD1)
|
|
|
|
return &anims_item_sword1;
|
|
|
|
else if(item == ITEM_SWORD2)
|
|
|
|
return &anims_item_sword2;
|
2022-03-19 18:14:00 +01:00
|
|
|
else if(item == ITEM_ARMOR1)
|
|
|
|
return &anims_item_armor1;
|
2022-03-16 20:00:22 +01:00
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2022-05-31 21:42:43 +02:00
|
|
|
char const *item_name(int item)
|
|
|
|
{
|
|
|
|
if(item == ITEM_LIFE)
|
|
|
|
return "Heart transpl.";
|
|
|
|
else if(item == ITEM_POTION_ATK)
|
|
|
|
return "Berserk elixir";
|
|
|
|
else if(item == ITEM_POTION_COOLDOWN)
|
|
|
|
return "Quick reload";
|
|
|
|
else if(item == ITEM_POTION_DEF)
|
|
|
|
return "Turtle potion";
|
|
|
|
else if(item == ITEM_POTION_FRZ)
|
|
|
|
return "Time freeze";
|
|
|
|
else if(item == ITEM_POTION_HP)
|
|
|
|
return "Health potion";
|
|
|
|
else if(item == ITEM_POTION_SPD)
|
|
|
|
return "Speed potion";
|
|
|
|
else if(item == ITEM_SCEPTER1)
|
|
|
|
return "Cypress wand";
|
|
|
|
else if(item == ITEM_SCEPTER2)
|
|
|
|
return "Holy staff";
|
|
|
|
else if(item == ITEM_SWORD1)
|
|
|
|
return "Short sword";
|
|
|
|
else if(item == ITEM_SWORD2)
|
|
|
|
return "Golden blade";
|
|
|
|
else if(item == ITEM_ARMOR1)
|
|
|
|
return "Leather armor";
|
|
|
|
return "???";
|
|
|
|
}
|
|
|
|
|
|
|
|
char const *item_description(int item)
|
|
|
|
{
|
|
|
|
if(item == ITEM_LIFE)
|
|
|
|
return NULL;
|
|
|
|
else if(item == ITEM_POTION_ATK)
|
|
|
|
return NULL;
|
|
|
|
else if(item == ITEM_POTION_COOLDOWN)
|
|
|
|
return NULL;
|
|
|
|
else if(item == ITEM_POTION_DEF)
|
|
|
|
return NULL;
|
|
|
|
else if(item == ITEM_POTION_FRZ)
|
|
|
|
return NULL;
|
|
|
|
else if(item == ITEM_POTION_HP)
|
|
|
|
return NULL;
|
|
|
|
else if(item == ITEM_POTION_SPD)
|
|
|
|
return NULL;
|
|
|
|
else if(item == ITEM_SCEPTER1)
|
|
|
|
return "On level up:\n ATK+1 MAG+3 DEF+1";
|
|
|
|
else if(item == ITEM_SCEPTER2)
|
|
|
|
return "On level up:\n MAG+5 DEF+1";
|
|
|
|
else if(item == ITEM_SWORD1)
|
|
|
|
return "On level up:\n ATK+3 MAG+1";
|
|
|
|
else if(item == ITEM_SWORD2)
|
|
|
|
return "On level up:\n ATK+5 MAG+0";
|
|
|
|
else if(item == ITEM_ARMOR1)
|
|
|
|
return "On level up:\n DEF+2";
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2022-03-10 19:34:32 +01:00
|
|
|
entity_t *item_make(int type, vec2 position)
|
2022-02-16 17:42:05 +01:00
|
|
|
{
|
|
|
|
entity_t *e = aoe_make(AOE_ITEM, position, fix(9999.0));
|
|
|
|
|
|
|
|
visible_t *v = getcomp(e, visible);
|
|
|
|
v->sprite_plane = VERTICAL;
|
|
|
|
v->shadow_size = 3;
|
|
|
|
v->z = fix(0.35);
|
|
|
|
|
|
|
|
physical_t *p = getcomp(e, physical);
|
|
|
|
p->hitbox = (rect){ -fix(4)/16, fix(3)/16, -fix(2)/16, fix(1)/16 };
|
|
|
|
|
|
|
|
aoe_t *aoe = getcomp(e, aoe);
|
|
|
|
aoe->origin = NULL;
|
|
|
|
aoe->repeat_delay = 0;
|
2022-03-10 19:34:32 +01:00
|
|
|
aoe->data.item.type = type;
|
2022-02-16 17:42:05 +01:00
|
|
|
|
2022-03-16 20:00:22 +01:00
|
|
|
anim_t const *anim = item_anim(type);
|
|
|
|
if(anim)
|
|
|
|
visible_set_anim(e, anim, 1);
|
2022-02-16 17:42:05 +01:00
|
|
|
return e;
|
|
|
|
}
|
|
|
|
|
2022-03-18 22:21:30 +01:00
|
|
|
bool item_pick_up(int type, entity_t *player)
|
2022-02-16 17:42:05 +01:00
|
|
|
{
|
|
|
|
fighter_t *f = getcomp(player, fighter);
|
|
|
|
|
2022-03-10 19:34:32 +01:00
|
|
|
if(type == ITEM_LIFE && f) {
|
|
|
|
int added = max(f->HP_max / 2, 8);
|
|
|
|
f->HP_max += added;
|
|
|
|
f->HP += added;
|
2022-03-18 22:21:30 +01:00
|
|
|
return true;
|
2022-03-10 19:34:32 +01:00
|
|
|
}
|
|
|
|
else if(type == ITEM_POTION_ATK && f) {
|
|
|
|
/* TODO: Double attack for 10 seconds */
|
|
|
|
}
|
|
|
|
else if(type == ITEM_POTION_COOLDOWN && f) {
|
|
|
|
/* TODO: Restore all cooldowns */
|
|
|
|
}
|
|
|
|
else if(type == ITEM_POTION_DEF && f) {
|
|
|
|
/* TODO: Defense +50% for 10 seconds */
|
|
|
|
}
|
|
|
|
else if(type == ITEM_POTION_FRZ && f) {
|
|
|
|
/* TODO: Freeze all monsters for 5 seconds */
|
|
|
|
}
|
|
|
|
else if(type == ITEM_POTION_HP && f) {
|
2022-03-18 22:21:30 +01:00
|
|
|
int restored = min(max(f->HP_max / 2, 8), f->HP_max - f->HP);
|
|
|
|
f->HP += restored;
|
|
|
|
return (restored > 0);
|
2022-03-10 19:34:32 +01:00
|
|
|
}
|
|
|
|
else if(type == ITEM_POTION_SPD && f) {
|
|
|
|
/* TODO: Speed +50% for 10 seconds */
|
|
|
|
}
|
|
|
|
|
2022-03-18 22:21:30 +01:00
|
|
|
else if(type > ITEM_EQUIPMENT_START && type < ITEM_EQUIPMENT_END
|
|
|
|
&& f->player) {
|
|
|
|
return player_give_item(player, type);
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
int item_equipment_slot(int item)
|
|
|
|
{
|
|
|
|
switch(item) {
|
|
|
|
case ITEM_SWORD1: return 0;
|
|
|
|
case ITEM_SWORD2: return 0;
|
|
|
|
case ITEM_SCEPTER1: return 0;
|
|
|
|
case ITEM_SCEPTER2: return 0;
|
2022-03-19 18:14:00 +01:00
|
|
|
case ITEM_ARMOR1: return 1;
|
2022-03-18 22:21:30 +01:00
|
|
|
default: return -1;
|
2022-02-16 17:42:05 +01:00
|
|
|
}
|
|
|
|
}
|
2022-03-18 23:36:32 +01:00
|
|
|
|
2022-05-31 21:42:43 +02:00
|
|
|
fighter_stats_t item_stat_model(int item)
|
2022-03-18 23:36:32 +01:00
|
|
|
{
|
2022-05-31 21:42:43 +02:00
|
|
|
fighter_stats_t m = { 0 };
|
2022-03-19 20:21:30 +01:00
|
|
|
|
|
|
|
switch(item) {
|
|
|
|
case ITEM_SWORD1:
|
2022-05-31 21:42:43 +02:00
|
|
|
m.ATK = 3;
|
|
|
|
m.MAG = 1;
|
2022-03-19 20:21:30 +01:00
|
|
|
break;
|
|
|
|
case ITEM_SWORD2:
|
2022-05-31 21:42:43 +02:00
|
|
|
m.ATK = 5;
|
|
|
|
m.MAG = 0;
|
2022-03-19 20:21:30 +01:00
|
|
|
break;
|
|
|
|
case ITEM_SCEPTER1:
|
2022-05-31 21:42:43 +02:00
|
|
|
m.ATK = 1;
|
|
|
|
m.MAG = 3;
|
|
|
|
m.DEF = 1;
|
2022-03-19 20:21:30 +01:00
|
|
|
break;
|
|
|
|
case ITEM_SCEPTER2:
|
2022-05-31 21:42:43 +02:00
|
|
|
m.MAG = 5;
|
|
|
|
m.DEF = 1;
|
2022-03-19 20:21:30 +01:00
|
|
|
break;
|
|
|
|
case ITEM_ARMOR1:
|
2022-05-31 21:42:43 +02:00
|
|
|
m.DEF = 2;
|
2022-03-19 20:21:30 +01:00
|
|
|
break;
|
2022-03-18 23:36:32 +01:00
|
|
|
}
|
2022-03-19 20:21:30 +01:00
|
|
|
|
|
|
|
return m;
|
2022-03-18 23:36:32 +01:00
|
|
|
}
|
2022-03-19 18:14:00 +01:00
|
|
|
|
|
|
|
void item_skills(int item, int *skill1, int *skill2, int *skill3)
|
|
|
|
{
|
|
|
|
if(item == ITEM_SWORD1) {
|
|
|
|
*skill1 = AOE_SLASH;
|
|
|
|
*skill2 = AOE_SHOCK;
|
|
|
|
}
|
|
|
|
if(item == ITEM_SWORD2) {
|
|
|
|
*skill1 = AOE_SLASH;
|
|
|
|
*skill2 = AOE_SHOCK;
|
|
|
|
}
|
|
|
|
if(item == ITEM_SCEPTER1) {
|
|
|
|
*skill1 = AOE_SLASH; // TODO: Base ranged attack
|
|
|
|
*skill2 = AOE_JUDGEMENT;
|
|
|
|
}
|
|
|
|
if(item == ITEM_SCEPTER2) {
|
|
|
|
*skill1 = AOE_SLASH;
|
|
|
|
*skill2 = AOE_JUDGEMENT;
|
|
|
|
*skill3 = AOE_BULLET;
|
|
|
|
}
|
|
|
|
if(item == ITEM_ARMOR1) {
|
|
|
|
*skill1 = SKILL_DASH;
|
|
|
|
}
|
|
|
|
}
|