data_types.py
"""Core data types, enums, and constants for the JRPG game."""
from __future__ import annotations
from dataclasses import dataclass, field
from enum import Enum, auto
from typing import Optional, List, Dict, Any
class WeaponType(Enum):
SWORD = "Sword"
SPEAR = "Spear"
AXE = "Axe"
DAGGER = "Dagger"
BOW = "Bow"
STAFF = "Staff"
class Element(Enum):
FIRE = "Fire"
ICE = "Ice"
LIGHTNING = "Lightning"
WIND = "Wind"
EARTH = "Earth"
LIGHT = "Light"
DARK = "Dark"
NONE = "None"
class JobClass(Enum):
WARRIOR = "Warrior"
KNIGHT = "Knight"
PALADIN = "Paladin"
BERSERKER = "Berserker"
ASSASSIN = "Assassin"
RANGER = "Ranger"
HUNTER = "Hunter"
SPEARMAN = "Spearman"
DRAGOON = "Dragoon"
MONK = "Monk"
CLERIC = "Cleric"
PRIEST = "Priest"
FIRE_MAGE = "Fire Mage"
ICE_MAGE = "Ice Mage"
STORM_MAGE = "Storm Mage"
WIND_MAGE = "Wind Mage"
EARTH_MAGE = "Earth Mage"
DARK_MAGE = "Dark Mage"
LIGHT_MAGE = "Light Mage"
ARCANE_SAGE = "Arcane Sage"
class SkillType(Enum):
PHYSICAL = "Physical"
MAGICAL = "Magical"
HEAL = "Heal"
BUFF = "Buff"
DEBUFF = "Debuff"
SPECIAL = "Special"
class SkillTier(Enum):
BASIC = "Basic"
INTERMEDIATE = "Intermediate"
ULTIMATE = "Ultimate"
class SkillTarget(Enum):
SINGLE_ENEMY = "SingleEnemy"
ALL_ENEMIES = "AllEnemies"
SINGLE_ALLY = "SingleAlly"
ALL_ALLIES = "AllAllies"
SELF = "Self"
RANDOM_ENEMY = "RandomEnemy"
class StatusEffectType(Enum):
# Damage over time
POISON = "Poison"
BURN = "Burn"
BLEED = "Bleed"
VENOM = "Venom"
CURSE = "Curse"
# Action restriction
SLEEP = "Sleep"
STUN = "Stun"
FREEZE = "Freeze"
PARALYZE = "Paralyze"
PETRIFY = "Petrify"
# Debuffs
ATTACK_DOWN = "Attack Down"
DEFENSE_DOWN = "Defense Down"
MAGIC_DOWN = "Magic Down"
SPEED_DOWN = "Speed Down"
ACCURACY_DOWN = "Accuracy Down"
# Buff blockers
SILENCE = "Silence"
SKILL_SEAL = "Skill Seal"
ITEM_SEAL = "Item Seal"
HEAL_BLOCK = "Heal Block"
MANA_BURN = "Mana Burn"
# Persistent effects
REGEN = "Regen"
MANA_REGEN = "Mana Regen"
SHIELD = "Shield"
REFLECT = "Reflect"
COUNTER = "Counter"
# Special
CONFUSION = "Confusion"
CHARM = "Charm"
FEAR = "Fear"
BLIND = "Blind"
WEAKNESS_MARK = "Weakness Mark"
# Enhancements
BERSERK = "Berserk"
HASTE = "Haste"
FOCUS = "Focus"
GUARD_UP = "Guard Up"
MAGIC_BOOST = "Magic Boost"
# Advanced
DOOM = "Doom"
TIME_STOP = "Time Stop"
CURSE_MARK = "Curse Mark"
BLOOD_LINK = "Blood Link"
SOUL_DRAIN = "Soul Drain"
# Defend
DEFENDING = "Defending"
class AIType(Enum):
AGGRESSIVE = "Aggressive"
DEFENSIVE = "Defensive"
BALANCED = "Balanced"
SUPPORT = "Support"
RANDOM = "Random"
BERSERKER = "Berserker"
TACTICAL = "Tactical"
class ItemType(Enum):
RECOVERY = "Recovery"
STATUS_CURE = "Status Cure"
BUFF = "Buff"
OFFENSIVE = "Offensive"
ADVANCED = "Advanced"
REVIVAL = "Revival"
@dataclass
class SkillEffect:
status: Optional[StatusEffectType] = None
duration: int = 0
chance: float = 0.0
stat_modifier: float = 1.0
heal_percent: float = 0.0
shield_amount: int = 0
@dataclass
class Skill:
id: int
name: str
skill_type: SkillType
power: float
mp_cost: int
accuracy: float
element: Element
hits: int
target: SkillTarget
tier: SkillTier
description: str
effect: Optional[SkillEffect] = None
jobs: List[JobClass] = field(default_factory=list)
@dataclass
class StatusEffect:
effect_type: StatusEffectType
duration: int
power: float = 1.0
source_name: str = ""
def tick(self) -> bool:
"""Returns True if effect is still active after tick."""
if self.duration > 0:
self.duration -= 1
return self.duration > 0 or self.duration == -1 # -1 = permanent until removed
@dataclass
class Item:
id: int
name: str
item_type: ItemType
description: str
effect_value: int
target: SkillTarget
element: Optional[Element] = None
status_cure: Optional[List[StatusEffectType]] = None
stat_buff: Optional[Dict[str, float]] = None
buff_duration: int = 0
@dataclass
class Stats:
hp: int
mp: int
patk: int
matk: int
pdef: int
mdef: int
spd: int
eva: float
acc: float
crit: float
def copy(self) -> 'Stats':
return Stats(
hp=self.hp, mp=self.mp, patk=self.patk, matk=self.matk,
pdef=self.pdef, mdef=self.mdef, spd=self.spd,
eva=self.eva, acc=self.acc, crit=self.crit
)
@dataclass
class GrowthRates:
hp: float
mp: float
patk: float
matk: float
pdef: float
mdef: float
spd: float
eva: float
acc: float
crit: float
RARITY_COLORS = {
3: "★★★",
4: "★★★★",
5: "★★★★★"
}