KStarbound/src/main/kotlin/ru/dbotthepony/kstarbound/defs/item/ItemDefinition.kt

340 lines
9.7 KiB
Kotlin
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}
}
}