# Energy

**URL:** https://heroiclabs.com/docs/hiro/cpp/energy/
**Keywords:** energy, hiro
**Categories:** hiro, cpp, energy

---


# Energy

Read more about the Energy system in Hiro [here](../../concepts/energy/).

## Get all energies

Get the energies and their current timers for the player.

```cpp
void onEnergyGet(const Hiro::EnergyList& energyList)
{
    for (auto it = energyList.energies.begin(); it != energyList.energies.end(); it++)
    {
        std::cout << "Found energy: " << it->first << " with value: " << it->second.current << '\n';
    }
}

void onError(const Nakama::NError& error)
{
    std::cout << Nakama::toString(error.code) << ": " << error.message << '\n';
}

hiroClient->energyGet(session, onEnergyGet, onError);
```

## Spend one or more energies

Spend one or more energies for the player.

```cpp
void onEnergySpend(const Hiro::EnergySpendReward& energySpendReward)
{
    for (auto it = energySpendReward.energies.energies.begin(); it != energySpendReward.energies.energies.end(); it++)
    {
        std::cout << "Found energy: " << it->first << " with value: " << it->second.current << '\n';
    }
}

void onError(const Nakama::NError& error)
{
    std::cout << Nakama::toString(error.code) << ": " << error.message << '\n';
}

Hiro::EnergySpendRequest request;
request.amounts.insert(std::make_pair<std::string, int32_t>("power", 10));
request.amounts.insert(std::make_pair<std::string, int32_t>("tickets", 1));

hiroClient->energySpend(session, request, onEnergySpend, onError);
```

## Spend energies with custom refill start times

Spend one or more energies and set a custom refill start time for each.

```cpp
void onEnergySpendWithRefillStartTime(const Hiro::EnergySpendReward& energySpendReward)
{
    for (auto it = energySpendReward.energies.energies.begin(); it != energySpendReward.energies.energies.end(); it++)
    {
        std::cout << "Found energy: " << it->first << " with value: " << it->second.current << '\n';
    }
}

void onError(const Nakama::NError& error)
{
    std::cout << Nakama::toString(error.code) << ": " << error.message << '\n';
}

Hiro::EnergySpendWithRefillStartTimeRequest request;
Hiro::EnergySpendWithTime powerSpend;
powerSpend.amount = 10;
powerSpend.refillStartTime = std::chrono::duration_cast<std::chrono::seconds>(
    std::chrono::system_clock::now().time_since_epoch()).count();
request.spends.insert(std::make_pair<std::string, Hiro::EnergySpendWithTime>("power", powerSpend));

hiroClient->energySpendWithRefillStartTime(session, request, onEnergySpendWithRefillStartTime, onError);
```

## Granting energy

While energy can be granted as part of a reward, you can also grant it directly.

```cpp
void onEnergyGrant(const Hiro::EnergyList& energyList)
{
    for (auto it = energyList.energies.begin(); it != energyList.energies.end(); it++)
    {
        std::cout << "Found energy: " << it->first << " with value: " << it->second.current << '\n';
    }
}

void onError(const Nakama::NError& error)
{
    std::cout << Nakama::toString(error.code) << ": " << error.message << '\n';
}

Hiro::EnergyGrantRequest request;
request.amounts.insert(std::make_pair<std::string, int32_t>("power", 10));
request.amounts.insert(std::make_pair<std::string, int32_t>("tickets", 1));

hiroClient->energyGrant(session, request, onEnergyGrant, onError);
```