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 = listOf(), /** * При подборе предмета мгновенно заставляет игрока изучить эти рецепты крафта */ val learnBlueprintsOnPickup: List = listOf(), /** * Максимальное количество предмета в стопке, по умолчанию 9999 */ val maxStack: Long = 9999L, /** * snip */ val eventCategory: String? = null, /** * Заставляет предмет "использовать" сразу же при подборе */ val consumeOnPickup: Boolean = false, /** * Запускает следующие квест(ы) при подборе */ val pickupQuestTemplates: List = 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? = null, /** * Используется в костях-ископаемых */ val completeFossilIcon: String? = null, /** * Используется в костях-ископаемых */ val completeFossilObject: String? = null, /** * Используется в костях-ископаемых */ val completeSetDescriptions: FossilSetDescription? = null, /** * Заставляет SAIL/прочих болтать при подборе предмета в первый раз */ val radioMessagesOnPickup: List = listOf(), /** * Топливо корабля */ val fuelAmount: Long? = null, // ---------------- // Поля ниже были видны только в файлах валюты // ---------------- /** * Звуки при поднятии "малого" количества предметов. Не имеет никакого смысла без [smallStackLimit] */ val pickupSoundsSmall: List = listOf(), /** * Звуки при поднятии "среднего" количества предметов. Не имеет никакого смысла без [mediumStackLimit] */ val pickupSoundsMedium: List = listOf(), /** * Звуки при поднятии "большого" количества предметов. Не имеет никакого смысла без [smallStackLimit] и без [mediumStackLimit] */ val pickupSoundsLarge: List = 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 = listOf(), val animationScripts: List = listOf(), // ---------------- // Броня // ---------------- /** * это где либо ещё применяется кроме брони? */ val tooltipKind: String? = null, /** * Изначальный уровень, может быть изменён позднее чем угодно */ val level: Int? = null, /** * Эффекты предмета, растущие с уровнем */ val leveledStatusEffects: List = listOf(), /** * Варианты покраски (???) */ val colorOptions: List> = 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, ) { 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) } } }