mysimulation/server/tso.common/Model/DynamicTuning.cs
Tony Bark 22191ce648 Removed NioTSO client and server
- NioTSO client isn't needed because we're using RayLib
- Added FreeSO's API server to handle most backend operations
2024-05-01 02:55:43 -04:00

148 lines
4.8 KiB
C#
Executable file

using System.Collections.Generic;
using System.IO;
namespace FSO.Common.Model
{
public class DynamicTuning
{
//global tuning:
// city -
// 0: terrain
// 0: forceSnow (0/1/null)
public static DynamicTuning Global;
//string type/iff, int table, int index.
public Dictionary<string, Dictionary<int, Dictionary<int, float>>> Tuning = new Dictionary<string, Dictionary<int, Dictionary<int, float>>>();
public const int CURRENT_VERSION = 0;
public int Version = CURRENT_VERSION;
public void SerializeInto(BinaryWriter writer)
{
writer.Write(CURRENT_VERSION);
writer.Write(Tuning.Count);
foreach (var type in Tuning)
{
writer.Write(type.Key);
writer.Write(type.Value.Count);
foreach (var table in type.Value)
{
writer.Write(table.Key);
writer.Write(table.Value.Count);
foreach (var value in table.Value)
{
writer.Write(value.Key);
writer.Write(value.Value);
}
}
}
}
public DynamicTuning(IEnumerable<DynTuningEntry> entries)
{
foreach (var entry in entries)
{
AddTuning(entry);
}
}
public void AddTuning(DynTuningEntry entry)
{
Dictionary<int, Dictionary<int, float>> tables;
if (!Tuning.TryGetValue(entry.tuning_type, out tables))
{
tables = new Dictionary<int, Dictionary<int, float>>();
Tuning[entry.tuning_type] = tables;
}
Dictionary<int, float> data;
if (!tables.TryGetValue(entry.tuning_table, out data))
{
data = new Dictionary<int, float>();
tables[entry.tuning_table] = data;
}
data[entry.tuning_index] = entry.value;
}
public DynamicTuning(DynamicTuning old)
{
foreach (var type in Tuning)
{
var newType = new Dictionary<int, Dictionary<int, float>>();
foreach (var table in type.Value)
{
var newTable = new Dictionary<int, float>();
foreach (var value in table.Value)
{
newTable[value.Key] = value.Value;
}
newType[table.Key] = newTable;
}
Tuning[type.Key] = newType;
}
}
public DynamicTuning(BinaryReader reader)
{
Version = reader.ReadInt32();
var count = reader.ReadInt32();
for (int i=0; i<count; i++)
{
var key = reader.ReadString();
var count2 = reader.ReadInt32();
var newType = new Dictionary<int, Dictionary<int, float>>();
for (int j = 0; j < count2; j++)
{
var key2 = reader.ReadInt32();
var count3 = reader.ReadInt32();
var newTable = new Dictionary<int, float>();
for (int k=0; k<count3; k++)
{
var key3 = reader.ReadInt32();
newTable[key3] = reader.ReadSingle();
}
newType[key2] = newTable;
}
Tuning[key] = newType;
}
}
public Dictionary<int, float> GetTable(string type, int table)
{
Dictionary<int, Dictionary<int, float>> tables;
if (Tuning.TryGetValue(type, out tables))
{
Dictionary<int, float> data;
if (tables.TryGetValue(table, out data))
{
return data;
}
}
return null;
}
public Dictionary<int, Dictionary<int, float>> GetTables(string type)
{
Dictionary<int, Dictionary<int, float>> tables;
if (Tuning.TryGetValue(type, out tables))
{
return tables;
}
return null;
}
public float? GetTuning(string type, int table, int index)
{
Dictionary<int, Dictionary<int, float>> tables;
if (Tuning.TryGetValue(type, out tables))
{
Dictionary<int, float> data;
if (tables.TryGetValue(table, out data))
{
float result;
if (data.TryGetValue(index, out result))
return result;
}
}
return null;
}
}
}