botw/src/Game/Actor/actWeapon.h

144 lines
3.9 KiB
C++

#pragma once
#include <basis/seadTypes.h>
#include <prim/seadSafeString.h>
#include <prim/seadTypedBitFlag.h>
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<WeaponModifier> 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