mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-02-22 12:39:59 +00:00
Add an actual probability column
This commit is contained in:
parent
f9da2b6b26
commit
1d69d38081
@ -235,6 +235,7 @@ namespace CSMWorld
|
||||
{ ColumnId_RegionSounds, "Sounds" },
|
||||
{ ColumnId_SoundName, "Sound Name" },
|
||||
{ ColumnId_SoundChance, "Chance" },
|
||||
{ ColumnId_SoundProbability, "Probability" },
|
||||
|
||||
{ ColumnId_FactionReactions, "Reactions" },
|
||||
{ ColumnId_FactionRanks, "Ranks" },
|
||||
|
@ -349,6 +349,8 @@ namespace CSMWorld
|
||||
|
||||
ColumnId_SelectionGroupObjects = 316,
|
||||
|
||||
ColumnId_SoundProbability = 317,
|
||||
|
||||
// Allocated to a separate value range, so we don't get a collision should we ever need
|
||||
// to extend the number of use values.
|
||||
ColumnId_UseValue1 = 0x10000,
|
||||
|
@ -301,8 +301,8 @@ CSMWorld::Data::Data(ToUTF8::FromType encoding, const Files::PathContainer& data
|
||||
mRegions.addColumn(new NestedParentColumn<ESM::Region>(Columns::ColumnId_RegionWeather));
|
||||
index = mRegions.getColumns() - 1;
|
||||
mRegions.addAdapter(std::make_pair(&mRegions.getColumn(index), new RegionWeatherAdapter()));
|
||||
mRegions.getNestableColumn(index)->addColumn(
|
||||
new NestedChildColumn(Columns::ColumnId_WeatherName, ColumnBase::Display_String, false));
|
||||
mRegions.getNestableColumn(index)->addColumn(new NestedChildColumn(
|
||||
Columns::ColumnId_WeatherName, ColumnBase::Display_String, ColumnBase::Flag_Dialogue, false));
|
||||
mRegions.getNestableColumn(index)->addColumn(
|
||||
new NestedChildColumn(Columns::ColumnId_WeatherChance, ColumnBase::Display_UnsignedInteger8));
|
||||
// Region Sounds
|
||||
@ -313,6 +313,8 @@ CSMWorld::Data::Data(ToUTF8::FromType encoding, const Files::PathContainer& data
|
||||
new NestedChildColumn(Columns::ColumnId_SoundName, ColumnBase::Display_Sound));
|
||||
mRegions.getNestableColumn(index)->addColumn(
|
||||
new NestedChildColumn(Columns::ColumnId_SoundChance, ColumnBase::Display_UnsignedInteger8));
|
||||
mRegions.getNestableColumn(index)->addColumn(new NestedChildColumn(
|
||||
Columns::ColumnId_SoundProbability, ColumnBase::Display_Float, ColumnBase::Flag_Dialogue, false));
|
||||
|
||||
mBirthsigns.addColumn(new StringIdColumn<ESM::BirthSign>);
|
||||
mBirthsigns.addColumn(new RecordStateColumn<ESM::BirthSign>);
|
||||
|
@ -414,20 +414,31 @@ namespace CSMWorld
|
||||
|
||||
QVariant RegionSoundListAdapter::getData(const Record<ESM::Region>& record, int subRowIndex, int subColIndex) const
|
||||
{
|
||||
ESM::Region region = record.get();
|
||||
const ESM::Region& region = record.get();
|
||||
|
||||
std::vector<ESM::Region::SoundRef>& soundList = region.mSoundList;
|
||||
const std::vector<ESM::Region::SoundRef>& soundList = region.mSoundList;
|
||||
|
||||
if (subRowIndex < 0 || subRowIndex >= static_cast<int>(soundList.size()))
|
||||
const size_t index = static_cast<size_t>(subRowIndex);
|
||||
if (subRowIndex < 0 || index >= soundList.size())
|
||||
throw std::runtime_error("index out of range");
|
||||
|
||||
ESM::Region::SoundRef soundRef = soundList[subRowIndex];
|
||||
const ESM::Region::SoundRef& soundRef = soundList[subRowIndex];
|
||||
switch (subColIndex)
|
||||
{
|
||||
case 0:
|
||||
return QString(soundRef.mSound.getRefIdString().c_str());
|
||||
case 1:
|
||||
return soundRef.mChance;
|
||||
case 2:
|
||||
{
|
||||
float probability = 1.f;
|
||||
for (size_t i = 0; i < index; ++i)
|
||||
{
|
||||
const float p = std::min(soundList[i].mChance / 100.f, 1.f);
|
||||
probability *= 1.f - p;
|
||||
}
|
||||
return probability * std::min(soundRef.mChance / 100.f, 1.f) * 100.f;
|
||||
}
|
||||
default:
|
||||
throw std::runtime_error("Region sounds subcolumn index out of range");
|
||||
}
|
||||
@ -463,7 +474,7 @@ namespace CSMWorld
|
||||
|
||||
int RegionSoundListAdapter::getColumnsCount(const Record<ESM::Region>& record) const
|
||||
{
|
||||
return 2;
|
||||
return 3;
|
||||
}
|
||||
|
||||
int RegionSoundListAdapter::getRowsCount(const Record<ESM::Region>& record) const
|
||||
|
Loading…
x
Reference in New Issue
Block a user