syntax = "proto3";

package freeexile.combat;

enum MartialArtType {
  MARTIAL_ACTIVE_ESSENCE = 0;   // Chân Võ Đan: Kỹ năng chủ động
  MARTIAL_AUGMENT_SIGIL = 1;    // Thần Biến Phù: Yếu quyết biến hóa bổ trợ
}

enum FiveElementsType {
  ELEMENT_PHYSICAL_KIM = 0;     // Cương Khí / Kim
  ELEMENT_POISON_MOC = 1;       // U Minh Độc Khí / Mộc
  ELEMENT_COLD_THUY = 2;        // Băng Hàn / Thủy
  ELEMENT_FIRE_HOA = 3;         // Liệt Diễm / Hỏa
  ELEMENT_DEFENSE_THO = 4;      // Hộ Thể / Thổ
}

enum SkillTagProto {
  TAG_UNSPECIFIED = 0;
  TAG_MELEE = 1;
  TAG_PROJECTILE = 2;
  TAG_AOE = 3;
  TAG_STRIKE = 4;
  TAG_SLAM = 5;
  TAG_SPELL = 6;
  TAG_CHANNELING = 7;
  TAG_DOT = 8;
  TAG_DEFENSIVE = 9;
  TAG_MOVEMENT = 10;
  TAG_FIRE = 11;
  TAG_COLD = 12;
  TAG_LIGHTNING = 13;
  TAG_POISON = 14;
  TAG_PHYSICAL = 15;
}

enum WeaponRequirementProto {
  WEAPON_ANY = 0;
  WEAPON_SWORD = 1;
  WEAPON_BLADE = 2;
  WEAPON_STAFF = 3;
  WEAPON_PROJECTILE_BOW = 4;
  WEAPON_UNARMED_FIST = 5;
}

message MartialSkillCore {
  uint32 skill_id = 1;
  string skill_name = 2;
  MartialArtType art_type = 3;
  uint32 mastery_level = 4;
  FiveElementsType element = 5;
  uint32 energy_cost = 6;       // Chân Khí tiêu hao
  uint32 cooldown_ms = 7;
  repeated uint32 linked_sigil_ids = 8; // Các Thần Biến Phù bổ trợ liên kết
  repeated SkillTagProto tags = 9;      // Các nhãn thể loại chiêu thức
  WeaponRequirementProto weapon_required = 10; // Yêu cầu vũ khí để xuất chiêu
  string upside_desc = 11;      // Lợi thế vượt trội (Upside)
  string downside_desc = 12;    // Đánh đổi / Nhược điểm cơ chế (Downside)
  uint32 animation_lock_ms = 13;// Thời gian khóa chân thi triển
  float recoil_damage_pct = 14; // Phần trăm sát thương phản chấn lên bản thân
}

message CastMartialSkillRequest {
  uint32 caster_entity_id = 1;
  uint32 skill_id = 2;
  float target_x = 3;
  float target_y = 4;
  uint32 active_weapon_set = 5; // 1 = Bộ Vũ Khí 1, 2 = Bộ Vũ Khí 2
  uint64 client_timestamp_ms = 6;
  bool auto_weapon_swapped = 7; // Cờ báo hiệu server/client đã tự hoán đổi vũ khí
}

message PhantomEvasionRequest {
  uint32 entity_id = 1;
  float evasion_dir_x = 2;
  float evasion_dir_y = 3;
  uint64 client_timestamp_ms = 4;
}

message CombatDamageEvent {
  uint32 source_entity_id = 1;
  uint32 target_entity_id = 2;
  uint32 raw_damage = 3;
  uint32 mitigated_damage = 4;
  bool is_critical = 5;
  bool target_evaded = 6;
  FiveElementsType element = 7;
  uint32 recoil_damage_to_source = 8; // Sát thương phản chấn lên người ra đòn
}

