Подгрузка денежных предметов

This commit is contained in:
DBotThePony 2022-12-30 14:07:44 +07:00
parent fef29b3f37
commit e5728e5ec9
Signed by: DBot
GPG Key ID: DCC23B5715498507
3 changed files with 88 additions and 8 deletions
src/main/kotlin/ru/dbotthepony/kstarbound

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.kstarbound
import com.google.common.collect.ImmutableList
import com.google.gson.*
import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap
@ -65,6 +66,13 @@ object Starbound {
return null
}
fun readingFolderListTransformer(input: List<String>?): List<String>? {
if (input == null)
return null
return input.stream().map { readingFolderTransformer(it) }.collect(ImmutableList.toImmutableList())
}
private val tiles = Object2ObjectOpenHashMap<String, TileDefinition>()
private val tilesByMaterialID = Int2ObjectOpenHashMap<TileDefinition>()
@ -429,8 +437,10 @@ object Starbound {
}
private fun loadItemDefinitions(callback: (String) -> Unit) {
val files = listOf(".item", ".currency")
for (fs in fileSystems) {
for (listedFile in fs.explore().filter { it.isFile }.filter { it.name.endsWith(".item") }) {
for (listedFile in fs.explore().filter { it.isFile }.filter { f -> files.any { f.name.endsWith(it) } }) {
try {
callback("Loading $listedFile")
@ -448,5 +458,7 @@ object Starbound {
}
}
}
items.values.stream().filter { it.currency != null }.forEach(::println)
}
}

View File

@ -1,5 +1,6 @@
package ru.dbotthepony.kstarbound.defs.item
import com.google.common.collect.ImmutableList
import com.google.gson.GsonBuilder
import ru.dbotthepony.kstarbound.Starbound
import ru.dbotthepony.kstarbound.io.KConcreteTypeAdapter
@ -123,6 +124,54 @@ data class ItemDefinition(
* Топливо корабля
*/
val fuelAmount: Long? = null,
// ----------------
// Поля ниже были видны только в файлах валюты
// ----------------
/**
* Звуки при поднятии "малого" количества предметов. Не имеет никакого смысла без [smallStackLimit]
*/
val pickupSoundsSmall: List<String> = listOf(),
/**
* Звуки при поднятии "среднего" количества предметов. Не имеет никакого смысла без [mediumStackLimit]
*/
val pickupSoundsMedium: List<String> = listOf(),
/**
* Звуки при поднятии "большого" количества предметов. Не имеет никакого смысла без [smallStackLimit] и без [mediumStackLimit]
*/
val pickupSoundsLarge: List<String> = listOf(),
/**
* Количество предметов ниже или равному данному значению проиграет звук [pickupSoundsSmall]
*/
val smallStackLimit: Long? = null,
/**
* Количество предметов ниже или равному данному значению (но не меньше [smallStackLimit]) проиграет звук [pickupSoundsMedium]
*/
val mediumStackLimit: Long? = null,
/**
* Превращает предмет в валюту
*/
val currency: String? = null,
/**
* Ценность в [currency]
*/
val value: Long? = null,
// ----------------
// /Валюта
// ----------------
/**
* Lua скрипты для выполнения
*/
val scripts: List<String> = listOf(),
) {
data class FossilSetDescription(
val price: Long = 0L,
@ -162,12 +211,23 @@ data class ItemDefinition(
.list(ItemDefinition::radioMessagesOnPickup)
.plain(ItemDefinition::fuelAmount)
.list(ItemDefinition::pickupSoundsSmall)
.list(ItemDefinition::pickupSoundsMedium)
.list(ItemDefinition::pickupSoundsLarge)
.plain(ItemDefinition::smallStackLimit)
.plain(ItemDefinition::mediumStackLimit)
.plain(ItemDefinition::currency)
.plain(ItemDefinition::value)
.list(ItemDefinition::scripts, transformer = Starbound::readingFolderListTransformer)
.build()
val FOSSIL_ADAPTER = KConcreteTypeAdapter.Builder(FossilSetDescription::class)
.plain(FossilSetDescription::price)
.plain(FossilSetDescription::shortdescription)
.plain(FossilSetDescription::description)
.specifyStringInterner(ADAPTER.stringInterner)
.build()
fun registerGson(gsonBuilder: GsonBuilder) {

View File

@ -174,7 +174,7 @@ class KConcreteTypeAdapter<T : Any> private constructor(
val bound: KClass<T>,
private val types: ImmutableList<PackedProperty<T, *>>,
private val asJsonArray: Boolean = false,
private val stringInterner: Interner<String>
val stringInterner: Interner<String>
) : TypeAdapter<T>() {
private val mapped = Object2IntArrayMap<String>()
private val loggedMisses = ObjectArraySet<String>()
@ -219,7 +219,10 @@ class KConcreteTypeAdapter<T : Any> private constructor(
private val syntheticFactory: Constructor<T>? = try {
bound.java.getDeclaredConstructor(*types.map { (it.returnType.classifier as KClass<*>).java }.also {
it as MutableList
it.add(Int::class.java)
for (i in 0 until (if (types.size % 31 == 0) types.size / 31 else types.size / 31 + 1))
it.add(Int::class.java)
it.add(DefaultConstructorMarker::class.java)
}.toTypedArray())
} catch(_: NoSuchMethodException) {
@ -434,7 +437,12 @@ class KConcreteTypeAdapter<T : Any> private constructor(
*/
class Builder<T : Any>(val clazz: KClass<T>) {
private val types = ArrayList<PackedProperty<T, *>>()
private val stringInterner = Interners.newWeakInterner<String>()
var stringInterner: Interner<String> = Interners.newWeakInterner()
fun specifyStringInterner(interner: Interner<String>): Builder<T> {
stringInterner = interner
return this
}
private val internedStringAdapter: TypeAdapter<String> = object : TypeAdapter<String>() {
override fun write(out: JsonWriter, value: String) {
@ -511,8 +519,8 @@ class KConcreteTypeAdapter<T : Any> private constructor(
*
* Список неизменяем (создаётся объект [ImmutableList])
*/
fun <V : Any> list(field: KProperty1<T, List<V>?>, type: Class<V>): Builder<T> {
types.add(PackedProperty(field, ListAdapter(type, internedStringAdapter)))
fun <V : Any> list(field: KProperty1<T, List<V>?>, type: Class<V>, transformer: (List<V>?) -> List<V>? = { it }): Builder<T> {
types.add(PackedProperty(field, ListAdapter(type, internedStringAdapter), transformer = transformer))
return this
}
@ -521,8 +529,8 @@ class KConcreteTypeAdapter<T : Any> private constructor(
*
* Список неизменяем (создаётся объект [ImmutableList])
*/
inline fun <reified V : Any> list(field: KProperty1<T, List<V>?>): Builder<T> {
return this.list(field, V::class.java)
inline fun <reified V : Any> list(field: KProperty1<T, List<V>?>, noinline transformer: (List<V>?) -> List<V>? = { it }): Builder<T> {
return this.list(field, V::class.java, transformer)
}
/**