1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2026-01-30 13:18:27 +00:00
openmw/components/esm3/weatherstate.cpp

80 lines
2.7 KiB
C++

#include "weatherstate.hpp"
#include <stddef.h>
#include <utility>
#include "esmreader.hpp"
#include "esmwriter.hpp"
#include <components/esm/esmcommon.hpp>
namespace ESM
{
namespace
{
constexpr NAME currentRegionRecord = "CREG";
constexpr NAME timePassedRecord = "TMPS";
constexpr NAME fastForwardRecord = "FAST";
constexpr NAME weatherUpdateTimeRecord = "WUPD";
constexpr NAME transitionFactorRecord = "TRFC";
constexpr NAME currentWeatherRecord = "CWTH";
constexpr NAME nextWeatherRecord = "NWTH";
constexpr NAME queuedWeatherRecord = "QWTH";
constexpr NAME regionNameRecord = "RGNN";
constexpr NAME regionWeatherRecord = "RGNW";
constexpr NAME regionChanceRecord = "RGNC";
}
}
namespace ESM
{
void WeatherState::load(ESMReader& esm)
{
mCurrentRegion = ESM::RefId::stringRefId(esm.getHNString(currentRegionRecord));
esm.getHNT(mTimePassed, timePassedRecord);
esm.getHNT(mFastForward, fastForwardRecord);
esm.getHNT(mWeatherUpdateTime, weatherUpdateTimeRecord);
esm.getHNT(mTransitionFactor, transitionFactorRecord);
esm.getHNT(mCurrentWeather, currentWeatherRecord);
esm.getHNT(mNextWeather, nextWeatherRecord);
esm.getHNT(mQueuedWeather, queuedWeatherRecord);
while (esm.isNextSub(regionNameRecord))
{
ESM::RefId regionID = esm.getRefId();
RegionWeatherState region;
esm.getHNT(region.mWeather, regionWeatherRecord);
while (esm.isNextSub(regionChanceRecord))
{
char chance;
esm.getHT(chance);
region.mChances.push_back(chance);
}
mRegions.insert(std::make_pair(regionID, region));
}
}
void WeatherState::save(ESMWriter& esm) const
{
esm.writeHNCString(currentRegionRecord, mCurrentRegion.getRefIdString());
esm.writeHNT(timePassedRecord, mTimePassed);
esm.writeHNT(fastForwardRecord, mFastForward);
esm.writeHNT(weatherUpdateTimeRecord, mWeatherUpdateTime);
esm.writeHNT(transitionFactorRecord, mTransitionFactor);
esm.writeHNT(currentWeatherRecord, mCurrentWeather);
esm.writeHNT(nextWeatherRecord, mNextWeather);
esm.writeHNT(queuedWeatherRecord, mQueuedWeather);
auto it = mRegions.begin();
for (; it != mRegions.end(); ++it)
{
esm.writeHNCString(regionNameRecord, it->first.getRefIdString().c_str());
esm.writeHNT(regionWeatherRecord, it->second.mWeather);
for (size_t i = 0; i < it->second.mChances.size(); ++i)
{
esm.writeHNT(regionChanceRecord, it->second.mChances[i]);
}
}
}
}