340 lines
9.7 KiB
Kotlin
340 lines
9.7 KiB
Kotlin
package ru.dbotthepony.kstarbound.defs.item
|
||
|
||
import com.google.gson.GsonBuilder
|
||
import ru.dbotthepony.kstarbound.Starbound
|
||
import ru.dbotthepony.kstarbound.io.json.KConcreteTypeAdapter
|
||
import ru.dbotthepony.kstarbound.io.json.asJsonObject
|
||
import ru.dbotthepony.kstarbound.io.json.asList
|
||
import ru.dbotthepony.kstarbound.registerTypeAdapter
|
||
import ru.dbotthepony.kvector.vector.ndouble.Vector2d
|
||
|
||
data class ItemDefinition(
|
||
/**
|
||
* Внутреннее имя предмета, как строка
|
||
*/
|
||
val itemName: String,
|
||
|
||
/**
|
||
* Цена в пикселях
|
||
*/
|
||
val price: Long = 0L,
|
||
|
||
/**
|
||
* Редкость как [ItemRarity]
|
||
*/
|
||
val rarity: ItemRarity = ItemRarity.COMMON,
|
||
|
||
/**
|
||
* Категория предмета, определяет, в какую вкладку инвентаря оно попадает
|
||
*/
|
||
val category: String? = null,
|
||
|
||
/**
|
||
* Иконка в инвентаре, относительный и абсолютный пути
|
||
*/
|
||
val inventoryIcon: String? = null,
|
||
|
||
/**
|
||
* Описание предмета
|
||
*/
|
||
val description: String = "...",
|
||
|
||
/**
|
||
* Название предмета
|
||
*/
|
||
val shortdescription: String = "...",
|
||
|
||
/**
|
||
* Теги предмета
|
||
*/
|
||
val itemTags: List<String> = listOf(),
|
||
|
||
/**
|
||
* При подборе предмета мгновенно заставляет игрока изучить эти рецепты крафта
|
||
*/
|
||
val learnBlueprintsOnPickup: List<String> = listOf(),
|
||
|
||
/**
|
||
* Максимальное количество предмета в стопке, по умолчанию 9999
|
||
*/
|
||
val maxStack: Long = 9999L,
|
||
|
||
/**
|
||
* snip
|
||
*/
|
||
val eventCategory: String? = null,
|
||
|
||
/**
|
||
* Заставляет предмет "использовать" сразу же при подборе
|
||
*/
|
||
val consumeOnPickup: Boolean = false,
|
||
|
||
/**
|
||
* Запускает следующие квест(ы) при подборе
|
||
*/
|
||
val pickupQuestTemplates: List<String> = listOf(),
|
||
|
||
/**
|
||
* Используется в костях-ископаемых
|
||
*/
|
||
val race: String? = null,
|
||
val displayImage: String? = null,
|
||
val displayoffset: Vector2d? = null,
|
||
|
||
/**
|
||
* Используется в костях-ископаемых
|
||
*/
|
||
val fossilSetName: String? = null,
|
||
|
||
/**
|
||
* Используется в костях-ископаемых
|
||
*/
|
||
val setIndex: Int? = null,
|
||
|
||
/**
|
||
* Используется в костях-ископаемых
|
||
*/
|
||
val setCount: Int? = null,
|
||
|
||
/**
|
||
* Используется в костях-ископаемых
|
||
*/
|
||
val setCollectables: Map<String, String>? = null,
|
||
|
||
/**
|
||
* Используется в костях-ископаемых
|
||
*/
|
||
val completeFossilIcon: String? = null,
|
||
|
||
/**
|
||
* Используется в костях-ископаемых
|
||
*/
|
||
val completeFossilObject: String? = null,
|
||
|
||
/**
|
||
* Используется в костях-ископаемых
|
||
*/
|
||
val completeSetDescriptions: FossilSetDescription? = null,
|
||
|
||
/**
|
||
* Заставляет SAIL/прочих болтать при подборе предмета в первый раз
|
||
*/
|
||
val radioMessagesOnPickup: List<String> = listOf(),
|
||
|
||
/**
|
||
* Топливо корабля
|
||
*/
|
||
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(),
|
||
val animationScripts: List<String> = listOf(),
|
||
|
||
// ----------------
|
||
// Броня
|
||
// ----------------
|
||
|
||
/**
|
||
* это где либо ещё применяется кроме брони?
|
||
*/
|
||
val tooltipKind: String? = null,
|
||
|
||
/**
|
||
* Изначальный уровень, может быть изменён позднее чем угодно
|
||
*/
|
||
val level: Int? = null,
|
||
|
||
/**
|
||
* Эффекты предмета, растущие с уровнем
|
||
*/
|
||
val leveledStatusEffects: List<StatusEffect> = listOf(),
|
||
|
||
/**
|
||
* Варианты покраски (???)
|
||
*/
|
||
val colorOptions: List<Map<String, String>> = listOf(),
|
||
|
||
/**
|
||
* Визуальные кадры анимации, когда надето на гуманоида мужского пола
|
||
*/
|
||
val maleFrames: ArmorFrames? = null,
|
||
|
||
/**
|
||
* Визуальные кадры анимации, когда надето на гуманоида женского пола
|
||
*/
|
||
val femaleFrames: ArmorFrames? = null,
|
||
|
||
// ----------------
|
||
// /Броня
|
||
// ----------------
|
||
|
||
// ----------------
|
||
// activeitem
|
||
// ----------------
|
||
|
||
// TODO: это указатель на структуру
|
||
val animation: String? = null,
|
||
|
||
/**
|
||
* Занимает ли предмет обе руки
|
||
*/
|
||
val twoHanded: Boolean = false,
|
||
|
||
// ----------------
|
||
// /activeitem
|
||
// ----------------
|
||
|
||
/**
|
||
* Прототип данного предмета, как JSON структура
|
||
*
|
||
* Имеет смысл только для Lua скриптов
|
||
*/
|
||
val json: Map<String, Any>,
|
||
) {
|
||
data class FossilSetDescription(
|
||
val price: Long = 0L,
|
||
val shortdescription: String = "...",
|
||
val description: String = "..."
|
||
)
|
||
|
||
data class ArmorFrames(
|
||
val body: String,
|
||
val backSleeve: String,
|
||
val frontSleeve: String,
|
||
)
|
||
|
||
data class StatusEffect(
|
||
val levelFunction: String,
|
||
val stat: String,
|
||
val baseMultiplier: Double,
|
||
)
|
||
|
||
companion object {
|
||
val ADAPTER = KConcreteTypeAdapter.Builder(ItemDefinition::class)
|
||
.auto(ItemDefinition::itemName)
|
||
.auto(ItemDefinition::price)
|
||
.auto(ItemDefinition::rarity)
|
||
.auto(ItemDefinition::category)
|
||
.auto(ItemDefinition::inventoryIcon, Starbound::readingFolderTransformerNullable)
|
||
.auto(ItemDefinition::description)
|
||
.auto(ItemDefinition::shortdescription)
|
||
|
||
.list(ItemDefinition::itemTags)
|
||
.list(ItemDefinition::learnBlueprintsOnPickup)
|
||
|
||
.auto(ItemDefinition::maxStack)
|
||
.auto(ItemDefinition::eventCategory)
|
||
.auto(ItemDefinition::consumeOnPickup)
|
||
.list(ItemDefinition::pickupQuestTemplates)
|
||
|
||
.auto(ItemDefinition::race)
|
||
.auto(ItemDefinition::displayImage, transformer = Starbound::readingFolderTransformerNullable)
|
||
.auto(ItemDefinition::displayoffset)
|
||
.auto(ItemDefinition::fossilSetName)
|
||
.auto(ItemDefinition::setIndex)
|
||
.auto(ItemDefinition::setCount)
|
||
.mapAsObject(ItemDefinition::setCollectables, String::class)
|
||
.auto(ItemDefinition::completeFossilIcon)
|
||
.auto(ItemDefinition::completeFossilObject)
|
||
|
||
.auto(ItemDefinition::completeSetDescriptions)
|
||
.list(ItemDefinition::radioMessagesOnPickup)
|
||
.auto(ItemDefinition::fuelAmount)
|
||
|
||
.list(ItemDefinition::pickupSoundsSmall)
|
||
.list(ItemDefinition::pickupSoundsMedium)
|
||
.list(ItemDefinition::pickupSoundsLarge)
|
||
.auto(ItemDefinition::smallStackLimit)
|
||
.auto(ItemDefinition::mediumStackLimit)
|
||
.auto(ItemDefinition::currency)
|
||
.auto(ItemDefinition::value)
|
||
|
||
.list(ItemDefinition::scripts, transformer = Starbound::readingFolderListTransformer)
|
||
.list(ItemDefinition::animationScripts, transformer = Starbound::readingFolderListTransformer)
|
||
|
||
.auto(ItemDefinition::tooltipKind)
|
||
.auto(ItemDefinition::level)
|
||
.list(ItemDefinition::leveledStatusEffects)
|
||
.add(ItemDefinition::colorOptions, Starbound.nonnullStringTypeAdapter.asJsonObject().asList())
|
||
.auto(ItemDefinition::maleFrames)
|
||
.auto(ItemDefinition::femaleFrames)
|
||
|
||
.auto(ItemDefinition::animation, transformer = Starbound::readingFolderTransformerNullable)
|
||
.auto(ItemDefinition::twoHanded)
|
||
|
||
.storesJson()
|
||
|
||
.build()
|
||
|
||
val FOSSIL_ADAPTER = KConcreteTypeAdapter.Builder(FossilSetDescription::class)
|
||
.auto(FossilSetDescription::price)
|
||
.auto(FossilSetDescription::shortdescription)
|
||
.auto(FossilSetDescription::description)
|
||
.build()
|
||
|
||
val ARMOR_FRAMES_ADAPTER = KConcreteTypeAdapter.Builder(ArmorFrames::class)
|
||
.auto(ArmorFrames::body, transformer = Starbound::readingFolderTransformer)
|
||
.auto(ArmorFrames::backSleeve, transformer = Starbound::readingFolderTransformer)
|
||
.auto(ArmorFrames::frontSleeve, transformer = Starbound::readingFolderTransformer)
|
||
.build()
|
||
|
||
val STATUS_EFFECT_ADAPTER = KConcreteTypeAdapter.Builder(StatusEffect::class)
|
||
.auto(StatusEffect::levelFunction)
|
||
.auto(StatusEffect::stat)
|
||
.auto(StatusEffect::baseMultiplier)
|
||
.build()
|
||
|
||
fun registerGson(gsonBuilder: GsonBuilder) {
|
||
gsonBuilder.registerTypeAdapter(ADAPTER)
|
||
gsonBuilder.registerTypeAdapter(FOSSIL_ADAPTER)
|
||
gsonBuilder.registerTypeAdapter(ARMOR_FRAMES_ADAPTER)
|
||
gsonBuilder.registerTypeAdapter(STATUS_EFFECT_ADAPTER)
|
||
}
|
||
}
|
||
}
|