#pragma once #include #include #include namespace ksys::act { class ActorConstDataAccess; class InstParamPack; namespace ai { struct InlineParamPack; } } // namespace ksys::act namespace ksys::evt { class OrderParam; } namespace ksys::res { class GParamList; } namespace uking::ui { class PouchItem; } namespace uking::act { enum class WeaponModifier : u32 { None = 0, /// Attack Up (swords and bows) AddAtk = 0x1, /// Durability Up AddLife = 0x2, /// Critical Hit (swords) AddCrit = 0x4, /// Long Throw (swords) AddThrow = 0x8, /// Multi-shot (bows) AddSpreadFire = 0x10, /// ??? (bows) AddZoomRapid = 0x20, /// Quick Shot (bows) AddRapidFire = 0x40, /// Unused bonus type (shields) AddSurfMaster = 0x80, /// Shield Guard Up (shields) AddGuard = 0x100, /// Whether this is a yellow tier (PoweredSharp) modifier. IsYellow = 0x80000000, }; struct WeaponModifierRanges; struct WeaponModifierInfo { WeaponModifierInfo() : value() {} explicit WeaponModifierInfo(const ui::PouchItem& item); void fromItem(const ui::PouchItem& item); int getAddLife() const; static int getLifeMultiplier(); void loadPorchSwordFlag(int idx); void loadPorchShieldFlag(int idx); void loadPorchBowFlag(int idx); void savePorchSwordFlag(int idx) const; void savePorchShieldFlag(int idx) const; void savePorchBowFlag(int idx) const; void loadEquipStandSwordFlag(int idx); void loadEquipStandShieldFlag(int idx); void loadEquipStandBowFlag(int idx); void saveEquipStandSwordFlag(int idx) const; void saveEquipStandShieldFlag(int idx) const; void saveEquipStandBowFlag(int idx) const; void addModifierParams(ksys::act::InstParamPack& params) const; void set(u32 type_, u32 value_); static void addModifierParams(WeaponModifierInfo* self, ksys::evt::OrderParam& params); static void addModifierParams(WeaponModifierInfo* self, ksys::act::ai::InlineParamPack& params); bool pickRandomBlueModifierAmiibo(const sead::SafeString& actor); bool pickRandomYellowModifierAmiibo(const sead::SafeString& actor); bool pickRandomModifierAmiibo(const WeaponModifierRanges& ranges); bool pickRandomModifier(const WeaponModifierRanges& ranges); bool pickRandomBlueModifierTbox(const sead::SafeString& actor); bool pickRandomYellowModifierTbox(const sead::SafeString& actor); bool pickRandomBlueModifierActor(const ksys::act::ActorConstDataAccess& acc); bool pickRandomYellowModifierActor(const ksys::act::ActorConstDataAccess& acc); void setModifier(WeaponModifier modifier, s32 value_) { flags.setDirect((flags.getDirect() & u32(WeaponModifier::IsYellow)) | u32(modifier)); value = value_; } void setModifierFloat(WeaponModifier modifier, f32 value_) { flags.setDirect((flags.getDirect() & u32(WeaponModifier::IsYellow)) | u32(modifier)); value = value_ * 1000.0f; } sead::TypedBitFlag flags; s32 value; }; struct WeaponModifierRanges { bool loadTierBlue(const sead::SafeString& actor); bool loadTierYellow(const sead::SafeString& actor); bool loadTierBlue(const ksys::res::GParamList& gparamlist); bool loadTierYellow(const ksys::res::GParamList& gparamlist); WeaponModifier getRandomModifier() const; bool isConfigValid() const; int addAtkMin = 0; int addAtkMax = 0; int addLifeMin = 0; int addLifeMax = 0; bool addCrit = false; int addGuardMin = 0; int addGuardMax = 0; float addThrowMin = 1.0; float addThrowMax = 1.0; bool addSpreadFire = false; bool addZoomRapid = false; float addRapidFireMin = 1.0; float addRapidFireMax = 1.0; bool addSurfMaster = false; bool isTierYellow = false; }; // TODO: Weapon class } // namespace uking::act