A reimplementation of Mario Kart Wii's physics engine in C++
Loading...
Searching...
No Matches
KartItem.cc
1#include "KartItem.hh"
2
3#include "game/kart/KartMove.hh"
4#include "game/kart/KartState.hh"
5
6#include "game/system/RaceManager.hh"
7
8namespace Item {
9
11KartItem::KartItem() {
12 m_flags.makeAllZero();
13}
14
16KartItem::~KartItem() = default;
17
19void KartItem::init(size_t playerIdx) {
20 apply(playerIdx);
21}
22
26 bool prevButton = m_flags.onBit(eFlags::ItemButtonHold);
27 m_flags.resetBit(eFlags::ItemButtonHold, eFlags::ItemButtonActivation);
28
29 const auto &currentInputs = inputs()->currentState();
30 if (currentInputs.item()) {
31 m_flags.setBit(eFlags::ItemButtonHold).changeBit(!prevButton, eFlags::ItemButtonActivation);
32 }
33
34 auto &status = KartObjectProxy::status();
35
36 if (m_flags.onBit(eFlags::Lockout)) {
37 if (status.offBit(Kart::eStatus::BeforeRespawn, Kart::eStatus::InAction,
38 Kart::eStatus::TriggerRespawn, Kart::eStatus::CannonStart,
39 Kart::eStatus::InCannon, Kart::eStatus::AfterCannon)) {
40 m_flags.resetBit(eFlags::Lockout);
41 }
42 } else {
43 if (status.onBit(Kart::eStatus::InRespawn, Kart::eStatus::InAction,
44 Kart::eStatus::TriggerRespawn, Kart::eStatus::CannonStart,
45 Kart::eStatus::InCannon)) {
46 m_flags.setBit(eFlags::Lockout);
47 } else {
48 const auto *raceMgr = System::RaceManager::Instance();
49 bool canUse = m_flags.onBit(eFlags::ItemButtonActivation);
50 canUse = canUse && raceMgr->isStageReached(System::RaceManager::Stage::Race);
51 canUse = canUse && status.offBit(Kart::eStatus::InAction, Kart::eStatus::Burnout);
52 canUse = canUse && (m_inventory.id() != ItemId::NONE);
53
54 if (canUse) {
55 // For now, assume only time trials are valid and use a mushroom
56 useMushroom();
57 }
58 }
59 }
60}
61
63void KartItem::clear() {
64 if (m_inventory.id() != ItemId::NONE) {
65 m_inventory.clear();
66 }
67}
68
70void KartItem::activateMushroom() {
71 move()->activateMushroom();
72}
73
75void KartItem::useMushroom() {
76 activateMushroom();
77 m_inventory.useItem(1);
78}
79
80} // namespace Item
constexpr bool offBit(Es... es) const
Checks if all of the corresponding bits for the provided enum values are off.
Definition BitFlag.hh:412
constexpr bool onBit(Es... es) const
Checks if any of the corresponding bits for the provided enum values are on.
Definition BitFlag.hh:379
void calc()
Calculates item activation based on the controller input state.
Definition KartItem.cc:25
Pertains to item handling.
@ Burnout
Set during a burnout on race start.
@ BeforeRespawn
Set on respawn collision, cleared on position snap.
constexpr TBitFlag< T, E > & resetBit(Es... es)
Resets the corresponding bits for the provided enum values.
Definition BitFlag.hh:73
constexpr bool onBit(Es... es) const
Checks if any of the corresponding bits for the provided enum values are on.
Definition BitFlag.hh:108
constexpr TBitFlag< T, E > & changeBit(bool on, Es... es)
Changes the state of the corresponding bits for the provided enum values.
Definition BitFlag.hh:85
constexpr void makeAllZero()
Resets all the bits to zero.
Definition BitFlag.hh:234
constexpr TBitFlag< T, E > & setBit(Es... es)
Sets the corresponding bits for the provided enum values.
Definition BitFlag.hh:62