#include "item.h" #include "aoe.h" #include "player.h" #include "skills.h" #include "comp/fighter.h" #include "comp/physical.h" #include "comp/visible.h" #include 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; else if(item == ITEM_ARMOR1) return &anims_item_armor1; return NULL; } 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 "???"; } int item_buff_color(int item) { if(item == ITEM_LIFE) return C_RGB(31, 0, 31); else if(item == ITEM_POTION_ATK) return C_RGB(31, 16, 16); else if(item == ITEM_POTION_COOLDOWN) return C_BLUE; else if(item == ITEM_POTION_DEF) return C_RGB(0, 15, 31); else if(item == ITEM_POTION_FRZ) return 0x5555; else if(item == ITEM_POTION_HP) return C_RGB(0, 31, 0); else if(item == ITEM_POTION_SPD) return C_RGB(31, 31, 0); return -1; } 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 "Freezes time\nfor 5 sec."; else if(item == ITEM_POTION_HP) return "Restores 50% HP"; 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; } entity_t *item_make(int type, vec2 position) { 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; aoe->data.item.type = type; anim_t const *anim = item_anim(type); if(anim) visible_set_anim(e, anim, 1); return e; } bool item_use(int type, game_t *game, entity_t *player) { fighter_t *f = getcomp(player, fighter); if(type == ITEM_LIFE && f) { int added = max(f->HP_max / 2, 8); f->HP_max += added; f->HP += added; return true; } else if(type == ITEM_POTION_ATK && f) { /* TODO: Double attack for 10 seconds */ } else if(type == ITEM_POTION_COOLDOWN && f) { for(int i = 0; i < 6; i++) { f->actions_cooldown[i] = 0; } return true; } else if(type == ITEM_POTION_DEF && f) { /* TODO: Defense +50% for 10 seconds */ } else if(type == ITEM_POTION_FRZ && f) { game_freeze(game, fix(5.0)); return true; } else if(type == ITEM_POTION_HP && f) { int restored = min(max(f->HP_max / 2, 8), f->HP_max - f->HP); f->HP += restored; return (restored > 0); } else if(type == ITEM_POTION_SPD && f) { /* TODO: Speed +50% for 10 seconds */ } 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; case ITEM_ARMOR1: return 1; default: return -1; } } fighter_stats_t item_stat_model(int item) { fighter_stats_t m = { 0 }; switch(item) { case ITEM_SWORD1: m.ATK = 3; m.MAG = 1; break; case ITEM_SWORD2: m.ATK = 5; m.MAG = 0; break; case ITEM_SCEPTER1: m.ATK = 1; m.MAG = 3; m.DEF = 1; break; case ITEM_SCEPTER2: m.MAG = 5; m.DEF = 1; break; case ITEM_ARMOR1: m.DEF = 2; break; } return m; } 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_PROJECTILE_FAST; *skill2 = AOE_JUDGEMENT; } if(item == ITEM_SCEPTER2) { *skill1 = AOE_PROJECTILE_FAST; *skill2 = AOE_JUDGEMENT; *skill3 = AOE_BULLET; } if(item == ITEM_ARMOR1) { *skill1 = SKILL_DASH; } }