Compare commits

..
Author SHA1 Message Date
whatsy a4c4dadee1 Moved MoveDescriptionScrollList and MetDataScrollList to a general ScrollableTextBox + Added a custom scroll bar for them 2026-10-27 20:33:25 -04:00
whatsy 990cb1886e PokemonMetData entries no longer nullable + formatting changes (RIP my HorizontalScrollingBox) 2026-10-27 18:27:34 -04:00
whatsy 15ae1100ac store and display info about meeting a pokemon 2026-10-27 15:04:47 -04:00
Hiroku f4140a097d Put the snap back on 2026-10-27 20:16:12 +10:00
Hiroku b79dbcca80 no scope. I mean no snap 2026-10-27 19:42:59 +10:00
Hiroku 5ac12a897a Merge remote-tracking branch 'origin/lang-updates' 2026-10-27 19:28:28 +10:00
Polymeta ae5f7c83f2 Merge branch 'implement_pokemon' into 'main'
implement_pokemon

See merge request cable-mc/cobblemon!2507
2026-10-26 23:10:50 +00:00
geumuandWeblate 4caa736e0b Translated using Weblate (Korean)
Currently translated at 99.6% (9549 of 9587 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ko/
2026-10-26 02:38:47 +00:00
geumuandWeblate c3e9051918 Translated using Weblate (Korean)
Currently translated at 98.5% (9445 of 9587 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/ko/
2026-10-26 02:26:52 +00:00
阿鱼andWeblate 0b38e063d2 Translated using Weblate (Chinese (Simplified Han script))
Currently translated at 98.7% (9464 of 9587 strings)

Translation: Cobblemon/Mod
Translate-URL: https://lang.cobblemon.com/projects/cobblemon/mod/zh_Hans/
2026-10-25 10:52:25 +00:00
18 changed files with 392 additions and 103 deletions
+1 -27
View File
@@ -2,41 +2,15 @@
## [1.8.x (MONTH xth, 2026)](#1-8-x)
### Additions
### New rideable Pokémon
### Pokémon Added
### Model updates for the following Pokémon
- Froakie
- Frogadier
- Greninja
(They have eyelids now.)
### Animation updates for the following Pokémon
- Froakie
- Frogadier
- Greninja
(They can blink now.)
- You can now view the biome, level, and date you caught a Pokémon.
### Changes
- Reworked spawn presets and added structure tags for spawns
### Fixes
- Fixed blank Cooking Pot recipe book entries and missing tabs on Fabric.
- Fixed Minior's "Shields Down" ability not working as intended
- Fixed Dusclops using Squirtle's cry
- Fixed size error with ceiling attached Orb hitbox
### Developer
### Molang & Datapacks
- Added `q.target_fainted` function to move action effects that checks if any opponents fainted from the move.
### Particles
- Updated Water shuriken to account for new `q.target_fainted` function
#### New Move Animations
### Localization
- Updated translations for:
+25
View File
@@ -0,0 +1,25 @@
# Changelog
## [1.8.4 (October 27th, 2026)](#1-8-4)
### Changes
- The Froakie line now blinks. The world will never be the same.
### Fixes
- Fixed heaps of spawns not working. This was caused by us missing something before release. RIP.
- Fixed a crash caused by Fearow blinking while you're riding one. Makes sense to me.
- Fixed Minior's "Shields Down" ability being very broken.
- Fixed Dusclops using Squirtle's cry sound (lol).
- Fixed blank Cooking Pot recipe book entries and missing tabs on Fabric.
- Fixed a hitbox issue with placeable Orb held items attached to a ceiling.
- Fixed something sneaky. I'll tell you about it later.
### Molang & Datapacks
- Added `q.target_fainted` function to move action effects that checks if any opponents fainted from the move.
### Particles
- Updated Water Shuriken effect to be timed better when the opponent faints.
### Localization
- Updated translations for:
- Korean
- Simplified Chinese
@@ -344,6 +344,7 @@ object CobblemonNetwork {
list.add(PacketRegisterInfo(RideStaminaUpdatePacket.ID, RideStaminaUpdatePacket::decode, PokemonUpdatePacketHandler()))
list.add(PacketRegisterInfo(AlphaUpdatePacket.ID, AlphaUpdatePacket::decode, PokemonUpdatePacketHandler()))
list.add(PacketRegisterInfo(ScaleModifierUpdatePacket.ID, ScaleModifierUpdatePacket::decode, PokemonUpdatePacketHandler()))
list.add(PacketRegisterInfo(MetDataUpdatePacket.ID, MetDataUpdatePacket::decode, PokemonUpdatePacketHandler()))
// Evolution start
list.add(PacketRegisterInfo(AddEvolutionPacket.ID, AddEvolutionPacket::decode, PokemonUpdatePacketHandler()))
@@ -6,23 +6,59 @@
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.gui.summary.widgets.screens.moves
package com.cobblemon.mod.common.client.gui.summary
import com.cobblemon.mod.common.client.gui.CobblemonRenderable
import com.cobblemon.mod.common.client.render.drawScaledText
import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.components.ObjectSelectionList
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.MutableComponent
import net.minecraft.util.Mth
class MoveDescriptionScrollList(
class ScrollableTextBoxEntry(
var line : MutableComponent
) :
ObjectSelectionList.Entry<ScrollableTextBoxEntry>() {
override fun render(
context: GuiGraphics,
index: Int,
rowTop: Int,
rowLeft: Int,
rowWidth: Int,
rowHeight: Int,
mouseX: Int,
mouseY: Int,
isHovered: Boolean,
partialTicks: Float
) {
drawScaledText(
context = context,
text = line,
x = rowLeft + 82,
y = rowTop,
scale = 0.5F,
shadow = true
)
}
override fun getNarration(): Component {
return line
}
}
class ScrollableTextBox(
private val listX: Int,
private val listY: Int,
height: Int,
width: Int,
slotHeight: Int
) : ObjectSelectionList<MoveDescriptionEntry>(
) : ObjectSelectionList<ScrollableTextBoxEntry>(
Minecraft.getInstance(),
60, // width
30, // height
width, // width
height, // height
0, // top
slotHeight
), CobblemonRenderable {
@@ -38,8 +74,31 @@ class MoveDescriptionScrollList(
return x + width - 3
}
override fun getMaxPosition(): Int {
return super.getMaxPosition() + 3 // add bottom padding
}
// we do our own scrollbar rendering, and this being true renders the vanilla one
override fun scrollbarVisible() = false
override fun renderWidget(context: GuiGraphics, pMouseX: Int, pMouseY: Int, f: Float) {
isHovered = pMouseX >= x && pMouseY >= y && pMouseX < x + width && pMouseY < y + height
if (maxScroll > 0) {
val right = x + width
val bottom = y + height
val darkGray = 0xFF5B595B.toInt()
val lightGray = 0xFF8C8C8C.toInt()
context.fill(right - 2, y + 2, right - 4, bottom - 2, darkGray)
// vanilla scrollbar mumbo jumbo
var scrollHeight = ((height * height).toFloat() / maxPosition.toFloat()).toInt()
scrollHeight = Mth.clamp(scrollHeight, 32, height - 8)
var scrollY = scrollAmount.toInt() * (height - scrollHeight + 2) / maxScroll + y - 1
if (scrollY < y) { scrollY = y }
context.fill(right - 2, scrollY + 2, right - 4, scrollY + scrollHeight - 3, lightGray)
}
context.enableScissor(
x,
y,
@@ -79,7 +138,7 @@ class MoveDescriptionScrollList(
&& mouseY < bottom
}
fun setMoveDescription(moveDescription: MutableComponent) {
fun setText(moveDescription: MutableComponent) {
clearEntries()
val splitWidth = 100
val text = moveDescription.string
@@ -103,7 +162,8 @@ class MoveDescriptionScrollList(
}
for (part in splitText) {
addEntry(MoveDescriptionEntry(Component.literal(part)))
addEntry(ScrollableTextBoxEntry(Component.literal(part)))
}
scrollAmount = 0.0
}
}
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.api.gui.MultiLineLabelK
import com.cobblemon.mod.common.api.gui.blitk
import com.cobblemon.mod.common.api.text.*
import com.cobblemon.mod.common.client.CobblemonResources
import com.cobblemon.mod.common.client.gui.summary.ScrollableTextBox
import com.cobblemon.mod.common.client.gui.summary.widgets.SoundlessWidget
import com.cobblemon.mod.common.client.gui.summary.widgets.common.reformatNatureTextIfMinted
import com.cobblemon.mod.common.client.gui.summary.widgets.screens.stats.StatWidget.Companion.SCALE
@@ -27,6 +28,7 @@ import net.minecraft.client.Minecraft
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.MutableComponent
import net.minecraft.resources.ResourceLocation
class InfoWidget(
pX: Int,
@@ -45,6 +47,25 @@ class InfoWidget(
private val infoBaseResource = cobblemonResource("textures/gui/summary/summary_info_base.png")
}
private var metDataWidget: ScrollableTextBox = ScrollableTextBox(x + 5, y + 123, 20, 61, 5)
init {
pokemon.metData?.let { metData ->
val biome = ResourceLocation.parse(metData.biome.registeredName)
val biomeName = Component.translatable("biome.${biome.namespace}.${biome.path}")
metDataWidget.setText(lang("ui.info.met_data",
biomeName,
metData.date.monthValue,
metData.date.dayOfMonth,
metData.date.year,
metData.level
))
} ?: run {
metDataWidget.setText(lang("ui.info.met_data_unavailable"))
}
addWidget(metDataWidget)
}
override fun renderWidget(context: GuiGraphics, pMouseX: Int, pMouseY: Int, pPartialTicks: Float) {
val matrices = context.pose()
// Base texture
@@ -163,6 +184,17 @@ class InfoWidget(
)
matrices.popPose()
metDataWidget.render(context, pMouseX, pMouseY, pPartialTicks)
// val textLines = mutableListOf<MutableComponent>()
// pokemon.metData?.let { metData ->
// }
//
// metDataWidget.textLines = textLines
// metDataWidget.render(context, pMouseX, pMouseY, pPartialTicks)
drawScaledText(
context = context,
text = lang("ui.info.experience_points"),
@@ -1,47 +0,0 @@
/*
* Copyright (C) 2023 Cobblemon Contributors
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at https://mozilla.org/MPL/2.0/.
*/
package com.cobblemon.mod.common.client.gui.summary.widgets.screens.moves
import com.cobblemon.mod.common.client.render.drawScaledText
import net.minecraft.client.gui.GuiGraphics
import net.minecraft.client.gui.components.ObjectSelectionList
import net.minecraft.network.chat.Component
import net.minecraft.network.chat.MutableComponent
class MoveDescriptionEntry(
var line : MutableComponent
) :
ObjectSelectionList.Entry<MoveDescriptionEntry>() {
override fun render(
context: GuiGraphics,
index: Int,
rowTop: Int,
rowLeft: Int,
rowWidth: Int,
rowHeight: Int,
mouseX: Int,
mouseY: Int,
isHovered: Boolean,
partialTicks: Float
) {
drawScaledText(
context = context,
text = line,
x = rowLeft + 82,
y = rowTop,
scale = 0.5F,
shadow = true
)
}
override fun getNarration(): Component {
return line
}
}
@@ -13,6 +13,7 @@ import com.cobblemon.mod.common.api.gui.blitk
import com.cobblemon.mod.common.api.moves.Move
import com.cobblemon.mod.common.api.text.text
import com.cobblemon.mod.common.client.CobblemonClient
import com.cobblemon.mod.common.client.gui.summary.ScrollableTextBox
import com.cobblemon.mod.common.client.gui.summary.Summary
import com.cobblemon.mod.common.client.gui.summary.widgets.SoundlessWidget
import com.cobblemon.mod.common.client.render.drawScaledText
@@ -70,9 +71,11 @@ class MovesWidget(
addWidget(it)
}
private var descriptionScrollList = MoveDescriptionScrollList(
x + 69,
private var descriptionScrollList = ScrollableTextBox(
x + 68,
y + 113,
30,
61,
5
)
@@ -215,7 +218,7 @@ class MovesWidget(
fun selectMove(move: Move?) {
selectedMove = if (selectedMove == move || move == null) null else move
descriptionScrollList.setMoveDescription(selectedMove?.description ?: "".text())
descriptionScrollList.setText(selectedMove?.description ?: "".text())
}
override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean {
@@ -47,6 +47,7 @@ import com.cobblemon.mod.common.net.messages.client.battle.BattleCaptureStartPac
import com.cobblemon.mod.common.net.messages.client.effect.SpawnSnowstormEntityParticlePacket
import com.cobblemon.mod.common.net.messages.client.spawn.SpawnPokeballPacket
import com.cobblemon.mod.common.pokeball.PokeBall
import com.cobblemon.mod.common.pokemon.PokemonMetData
import com.cobblemon.mod.common.pokemon.ai.PokemonBrain
import com.cobblemon.mod.common.pokemon.properties.UncatchableProperty
import com.cobblemon.mod.common.util.*
@@ -74,6 +75,9 @@ import net.minecraft.world.phys.BlockHitResult
import net.minecraft.world.phys.EntityHitResult
import net.minecraft.world.phys.HitResult
import net.minecraft.world.phys.Vec3
import java.time.LocalDate
import java.time.ZoneId
import java.util.Date
import java.util.concurrent.CompletableFuture
class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragModifier, Schedulable {
@@ -360,6 +364,12 @@ class EmptyPokeBallEntity : ThrowableItemProjectile, PosableEntity, WaterDragMod
party.add(pokemon.pokemon)
val leashHolder = pokemon.leashHolder
pokemon.pokemon.metData = PokemonMetData(
this.level().getBiome(this.blockPosition()),
LocalDate.now(ZoneId.systemDefault()),
pokemon.pokemon.level
)
if (leashHolder != null) {
val blockPos = leashHolder.blockPosition()
val blockState = level().getBlockState(blockPos)
@@ -0,0 +1,44 @@
package com.cobblemon.mod.common.net.messages.client.pokemon.update
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.pokemon.PokemonMetData
import com.cobblemon.mod.common.util.cobblemonResource
import net.minecraft.core.registries.Registries
import net.minecraft.network.RegistryFriendlyByteBuf
import net.minecraft.resources.ResourceKey
import net.minecraft.resources.ResourceLocation
import java.time.Instant
import java.time.ZoneId
import kotlin.jvm.optionals.getOrNull
class MetDataUpdatePacket(pokemon: () -> Pokemon?, value: PokemonMetData): SingleUpdatePacket<PokemonMetData, MetDataUpdatePacket>(pokemon, value) {
override val id = ID
override fun encodeValue(buffer: RegistryFriendlyByteBuf) {
val biome = value.biome.unwrapKey().getOrNull()
?: ResourceKey.create(Registries.BIOME, ResourceLocation.parse("minecraft:plains"))
buffer.writeResourceKey(biome)
buffer.writeLong(value.date.atStartOfDay(ZoneId.systemDefault()).toInstant().toEpochMilli())
buffer.writeInt(value.level)
}
override fun set(
pokemon: Pokemon,
value: PokemonMetData
) {
pokemon.metData = value
}
companion object {
val ID = cobblemonResource("met_data_update")
fun decode(buffer: RegistryFriendlyByteBuf): MetDataUpdatePacket {
val pokemon = decodePokemon(buffer)
val biomeKey = buffer.readResourceKey(Registries.BIOME)
val dateTime = buffer.readLong()
val date = Instant.ofEpochMilli(dateTime).atZone(ZoneId.systemDefault()).toLocalDate()
val level = buffer.readInt()
val biome = buffer.registryAccess().lookupOrThrow(Registries.BIOME).getOrThrow(biomeKey)
return MetDataUpdatePacket(pokemon, PokemonMetData(biome, date, level))
}
}
}
@@ -550,6 +550,12 @@ open class Pokemon : ShowdownIdentifiable {
onChange(OriginalTrainerUpdatePacket({ this }, value))
}
var metData: PokemonMetData? = null
set(value) {
field = value
value?.let { onChange(MetDataUpdatePacket({ this }, it)) }
}
/**
* Cache friendship on trade for OT
*/
@@ -1527,6 +1533,7 @@ open class Pokemon : ShowdownIdentifiable {
this.potentialMarks.clear()
this.potentialMarks += other.marks
this.markings = other.markings
this.metData = other.metData
this.recalculateCharacteristic()
this.updateAspects()
this.refreshOriginalTrainer()
@@ -0,0 +1,47 @@
package com.cobblemon.mod.common.pokemon
import com.mojang.serialization.Codec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.core.Holder
import net.minecraft.world.level.biome.Biome
import java.time.LocalDate
/**
* Stores information about the circumstances of a player's meeting with a [Pokemon]
*
* @param biome A [Holder] for the [Biome] the [Pokemon] was caught in
* @param date A [LocalDate] of the real life date the [Pokemon] was caught
* @param level The level the [Pokemon] was when caught
*/
data class PokemonMetData(
val biome: Holder<Biome>,
val date: LocalDate,
val level: Int
) {
companion object {
private val LOCAL_DATE_CODEC: Codec<LocalDate> = Codec.STRING.xmap(
LocalDate::parse,
LocalDate::toString
)
val CODEC: Codec<PokemonMetData> = RecordCodecBuilder.create { instance ->
instance.group(
Biome.CODEC
.fieldOf("biome")
.forGetter { it.biome },
LOCAL_DATE_CODEC
.fieldOf("date")
.forGetter { it.date },
Codec.INT
.fieldOf("level")
.forGetter { it.level }
).apply(instance) { biome, date, level ->
PokemonMetData(
biome = biome,
date = date,
level = level
)
}
}
}
}
@@ -86,6 +86,7 @@ object DataKeys {
const val POKEMON_ORIGINAL_TRAINER_NAME = "PokemonOriginalTrainerName"
const val POKEMON_ORIGINAL_TRAINER_TYPE = "PokemonOriginalTrainerType"
const val POKEMON_ORIGINAL_TRAINER_FRIENDSHIP = "PokemonOriginalTrainerFriendship"
const val POKEMON_MET_DATA = "PokemonMetData"
const val POKEMON_PROPERTIES_MOVES = "Moves"
const val POKEMON_PROPERTIES_HELDITEM = "HeldItem"
@@ -8,25 +8,23 @@
package com.cobblemon.mod.common.util.codec.internal
import com.cobblemon.mod.common.api.mark.Marks
import com.cobblemon.mod.common.api.riding.stats.RidingStat
import com.cobblemon.mod.common.client.settings.ServerSettings
import com.cobblemon.mod.common.pokemon.OriginalTrainerType
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.pokemon.PokemonMetData
import com.cobblemon.mod.common.util.DataKeys
import com.mojang.serialization.Codec
import com.mojang.serialization.MapCodec
import com.mojang.serialization.codecs.RecordCodecBuilder
import net.minecraft.resources.ResourceLocation
import net.minecraft.world.item.ItemStack
import java.util.*
internal data class ClientPokemonP4(
val originalTrainerFriendship: Optional<Int>
val originalTrainerFriendship: Optional<Int>,
val pokemonMetData: Optional<PokemonMetData>
) : Partial<Pokemon> {
override fun into(other: Pokemon): Pokemon {
this.originalTrainerFriendship.ifPresent { other.originalTrainerFriendship = it }
other.metData = this.pokemonMetData.orElse(null)
return other
}
@@ -36,12 +34,18 @@ internal data class ClientPokemonP4(
*/
internal val CODEC: MapCodec<ClientPokemonP4> = RecordCodecBuilder.mapCodec { instance ->
instance.group(
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(ClientPokemonP4::originalTrainerFriendship)
).apply(instance, ::ClientPokemonP4)
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(ClientPokemonP4::originalTrainerFriendship),
PokemonMetData.CODEC.optionalFieldOf(DataKeys.POKEMON_MET_DATA).forGetter(ClientPokemonP4::pokemonMetData)
).apply(instance) {
originalTrainerFriendship, pokemonMetData -> ClientPokemonP4(
originalTrainerFriendship, pokemonMetData
)
}
}
internal fun from(pokemon: Pokemon): ClientPokemonP4 = ClientPokemonP4(
Optional.ofNullable(pokemon.originalTrainerFriendship)
Optional.ofNullable(pokemon.originalTrainerFriendship),
Optional.ofNullable(pokemon.metData)
)
}
}
@@ -9,6 +9,7 @@
package com.cobblemon.mod.common.util.codec.internal
import com.cobblemon.mod.common.pokemon.Pokemon
import com.cobblemon.mod.common.pokemon.PokemonMetData
import com.cobblemon.mod.common.util.DataKeys
import com.mojang.serialization.Codec
import com.mojang.serialization.MapCodec
@@ -16,28 +17,32 @@ import com.mojang.serialization.codecs.RecordCodecBuilder
import java.util.*
internal data class PokemonP4(
val originalTrainerFriendship: Optional<Int>
val originalTrainerFriendship: Optional<Int>,
val pokemonMetData: Optional<PokemonMetData>
) : Partial<Pokemon> {
override fun into(other: Pokemon): Pokemon {
this.originalTrainerFriendship.ifPresent { other.originalTrainerFriendship = it }
other.refreshOriginalTrainer()
other.metData = this.pokemonMetData.orElse(null)
return other
}
companion object {
internal val CODEC: MapCodec<PokemonP4> = RecordCodecBuilder.mapCodec { instance ->
instance.group(
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(PokemonP4::originalTrainerFriendship)
Codec.INT.optionalFieldOf(DataKeys.POKEMON_ORIGINAL_TRAINER_FRIENDSHIP).forGetter(PokemonP4::originalTrainerFriendship),
PokemonMetData.CODEC.optionalFieldOf(DataKeys.POKEMON_MET_DATA).forGetter(PokemonP4::pokemonMetData)
).apply(instance) {
originalTrainerFriendship -> PokemonP4(
originalTrainerFriendship
originalTrainerFriendship, pokemonMetData -> PokemonP4(
originalTrainerFriendship, pokemonMetData
)
}
}
internal fun from(pokemon: Pokemon): PokemonP4 = PokemonP4(
Optional.ofNullable(pokemon.originalTrainerFriendship)
Optional.ofNullable(pokemon.originalTrainerFriendship),
Optional.ofNullable(pokemon.metData)
)
}
}
@@ -1267,6 +1267,8 @@
"cobblemon.ui.info.ability": "Ability",
"cobblemon.ui.info.experience_points": "Exp. Points",
"cobblemon.ui.info.to_next_level": "To Next Lv.",
"cobblemon.ui.info.met_data": "Met in %1$s on %2$s/%3$s/%4$s at Lv.%5$s",
"cobblemon.ui.info.met_data_unavailable": "Met a long time ago",
"cobblemon.ui.trade": "Trade",
"cobblemon.trade.expired.sender": "Your request to trade with %1$s has timed out!",
"cobblemon.trade.expired.receiver": "The trade request from %1$s has timed out!",
@@ -6526,7 +6526,7 @@
"cobblemon.move.10000000voltthunderbolt": "1000만볼트",
"cobblemon.species.unown-x.desc": "고대 문자를 닮은 모습의 포켓몬이다. 먼저 생겨난 것은 문자인가 안농인가. 연구 중이지만 아직도 수수께끼다.",
"cobblemon.ui.pokedex.info.form.qwilfish-hisui": "히스이의 모습",
"cobblemon.ui.pokedex.info.form.groudon-primal": "원시그란돈",
"cobblemon.ui.pokedex.info.form.groudon-primal": "원시회귀",
"cobblemon.ui.pokedex.info.form.burmy-sandy": "모래땅도롱",
"cobblemon.ui.pokedex.info.form.abomasnow-mega": "메가눈설왕",
"cobblemon.species.rotom-frost.desc": "특수한 모터로 움직이는 냉장고에 들어갔다. 냉기를 뿜으며 싸운다.",
@@ -6758,7 +6758,7 @@
"cobblemon.species.salamence-mega.desc": "앞다리를 껍질 틈에 얹어서 비행 태세를 갖춘다. 복잡한 지형도 고속으로 날아다닌다.",
"cobblemon.species.metagross-mega.desc": "이길 수 없다고 판단하면 발톱으로 상대를 붙잡고 대폭발의 카운트를 시작한다.",
"cobblemon.species.latios-mega.desc": "본 것이나 생각한 이미지를 상대방에게 영상으로 보여주는 능력을 지녔다. 인간의 말을 이해할 수 있다.",
"cobblemon.ui.pokedex.info.form.kyogre-primal": "원시가이오가",
"cobblemon.ui.pokedex.info.form.kyogre-primal": "원시회귀",
"cobblemon.species.deoxys-attack.desc": "공격적인 형상으로 변화한 테오키스. 다른 모습을 보여 적을 혼란시키는 힘을 가졌다.",
"cobblemon.ui.pokedex.info.form.deoxys-speed": "스피드폼",
"cobblemon.ui.pokedex.info.form.burmy-trash": "슈레도롱",
@@ -9549,5 +9549,125 @@
"cobblemon.config.ui.world_spawning_blocklist": "월드별 스폰 차단 목록",
"cobblemon.config.ui.world_spawning_blocklist.tooltip": "포켓몬 생성 로직을 비활성화하는 월드입니다.",
"advancements.cobblemon.obtain_tm": "기술을 보여줘!",
"advancements.cobblemon.obtain_tm.description": "TM을 찾거나 제작하세요"
"advancements.cobblemon.obtain_tm.description": "TM을 찾거나 제작하세요",
"itemGroup.cobblemon.tm_item": "코블몬: 기술머신",
"block.cobblemon.pomohana": "이글이글꽃",
"block.cobblemon.pauvillea": "파칙파칙꽃",
"block.cobblemon.lobaila": "훌라훌라꽃",
"block.cobblemon.wistensu": "하늘하늘꽃",
"block.cobblemon.voltaconia": "찌릿꽃",
"block.cobblemon.verdroot": "풀빛뿌리",
"block.cobblemon.lucibell": "빛방울꽃",
"block.cobblemon.mistleaf": "안개잎",
"cobblemon.ui.pokedex.info.evolution_tree": "진화 계통",
"cobblemon.ui.pokedex.evolution.item_interact.tooltip": "진화하려면 %1$s 필요",
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_species": "%1$s와(과) 교환 시 진화",
"cobblemon.ui.pokedex.evolution.trade.tooltip.with_any_species": "교환 시 진화",
"cobblemon.ui.pokedex.evolution.shedder.tooltip": "남는 몬스터볼과 파티 빈칸도 필요",
"cobblemon.ui.pokedex.evolution.or": "또는",
"cobblemon.ui.pokedex.evolution.one_of": "다음 중 하나:",
"cobblemon.ui.pokedex.requirement.advancement.tooltip": "발전 과제 %1$s 달성 필요",
"cobblemon.ui.pokedex.requirement.battle_critical_hits.tooltip": "배틀에서 급소 %1$s회 맞히기",
"cobblemon.ui.pokedex.requirement.biome.anticondition.tooltip": "%1$s 바이옴 밖에 있기",
"cobblemon.ui.pokedex.requirement.biome.both.tooltip": "%1$s 바이옴 안, %2$s 바이옴 밖에 있기",
"cobblemon.ui.pokedex.requirement.biome.tooltip": "%1$s 바이옴에 있기",
"cobblemon.ui.pokedex.requirement.blocks_traveled.tooltip": "%1$s블록 이동하기",
"cobblemon.ui.pokedex.requirement.damage_taken.tooltip": "배틀에서 기절하지 않고 데미지 %1$s 받기",
"cobblemon.ui.pokedex.requirement.defeat.tooltip": "배틀에서 %1$s을(를) 쓰러뜨리기",
"cobblemon.ui.pokedex.requirement.friendship.tooltip": "친밀도 %1$s 이상 필요",
"cobblemon.ui.pokedex.requirement.has_move.tooltip": "기술 %1$s 배우고 있기",
"cobblemon.ui.pokedex.requirement.has_move_type.tooltip": "%1$s 타입 기술 배우고 있기",
"cobblemon.ui.pokedex.requirement.held_item.tooltip": "%1$s 지니고 있기",
"cobblemon.ui.pokedex.requirement.level.tooltip.min": "레벨 %1$s부터 진화",
"cobblemon.ui.pokedex.requirement.level.tooltip.between": "레벨 %1$s~%2$s 사이에 진화",
"cobblemon.ui.pokedex.requirement.moon_phase.tooltip": "달 모양이 %1$s일 때 진화",
"cobblemon.ui.pokedex.requirement.nature.toxtricity_amped": "§a노력§r, §a용감§r, §a고집§r, §a개구쟁이§r, §a온순§r, §a장난꾸러기§r, §a촐랑§r, §a성급§r, §a명랑§r, §a천진난만§r, §a덜렁§r, §a건방§r, §a변덕§r 성격 중 하나",
"cobblemon.ui.pokedex.requirement.nature.toxtricity_low_key": "§a외로움§r, §a대담§r, §a무사태평§r, §a겁쟁이§r, §a성실§r, §a조심§r, §a의젓§r, §a냉정§r, §a수줍음§r, §a차분§r, §a얌전§r, §a신중§r 성격 중 하나",
"cobblemon.ui.pokedex.requirement.negate.tooltip": "아님: %1$s",
"cobblemon.ui.pokedex.requirement.nickname.malamar": "이름이 §aDinnerbone§r 또는 §aGrumm§r이어야 함",
"cobblemon.ui.pokedex.requirement.party_member.anticondition.tooltip": "파티에 %1$s 포켓몬이 없기",
"cobblemon.ui.pokedex.requirement.party_member.tooltip": "파티에 %1$s 포켓몬이 있기",
"cobblemon.ui.pokedex.requirement.pokemon_properties.tooltip": "조건: %1$s",
"cobblemon.ui.pokedex.requirement.properties.and": "%1$s, %2$s",
"cobblemon.ui.pokedex.requirement.properties.custom.cocoon_species": "%1$s 고치",
"cobblemon.ui.pokedex.requirement.properties.held_item": "%1$s 지닌",
"cobblemon.ui.pokedex.requirement.properties.int_feature": "%1$s %2$s",
"cobblemon.ui.pokedex.requirement.properties.nature": "%1$s 성격",
"cobblemon.ui.pokedex.requirement.properties.nickname": "이름이 %1$s인",
"cobblemon.ui.pokedex.requirement.properties.type": "%1$s 타입",
"cobblemon.ui.pokedex.requirement.property_range.tooltip": "%1$s이(가) %2$s~%3$s 사이여야 함",
"cobblemon.ui.pokedex.requirement.recoil.tooltip": "배틀에서 반동 데미지 %1$s 받기",
"cobblemon.ui.pokedex.requirement.stat_compare.tooltip": "%1$s이(가) %2$s보다 높아야 함",
"cobblemon.ui.pokedex.requirement.stat_equal.tooltip": "%1$s와(과) %2$s이(가) 같아야 함",
"cobblemon.ui.pokedex.requirement.structure.anticondition.tooltip": "%1$s 구조물 밖에 있기",
"cobblemon.ui.pokedex.requirement.structure.both.tooltip": "%1$s 구조물 안, %2$s 구조물 밖에 있기",
"cobblemon.ui.pokedex.requirement.structure.tooltip": "%1$s 구조물에 있기",
"cobblemon.ui.pokedex.requirement.time_range.tooltip": "%1$s에 진화",
"cobblemon.ui.pokedex.requirement.use_move.tooltip": "배틀에서 기술 %1$s 사용하기",
"cobblemon.ui.pokedex.requirement.weather.tooltip.raining": "비가 올 때 진화",
"cobblemon.ui.pokedex.requirement.weather.tooltip.thundering": "뇌우가 칠 때 진화",
"cobblemon.ui.moon_phase.full_moon": "보름달",
"cobblemon.ui.moon_phase.waning_gibbous": "기우는 볼록달",
"cobblemon.ui.moon_phase.third_quarter": "하현달",
"cobblemon.ui.moon_phase.waning_crescent": "그믐달",
"cobblemon.ui.moon_phase.new_moon": "삭",
"cobblemon.ui.moon_phase.waxing_crescent": "초승달",
"cobblemon.ui.moon_phase.first_quarter": "상현달",
"cobblemon.ui.moon_phase.waxing_gibbous": "차오르는 볼록달",
"cobblemon.ui.time_range.any": "언제든",
"cobblemon.ui.time_range.day": "낮",
"cobblemon.ui.time_range.night": "밤",
"cobblemon.ui.time_range.noon": "정오",
"cobblemon.ui.time_range.midnight": "자정",
"cobblemon.ui.time_range.dawn": "새벽",
"cobblemon.ui.time_range.dusk": "해 질 녘",
"cobblemon.ui.time_range.twilight": "황혼",
"cobblemon.ui.time_range.morning": "아침",
"cobblemon.ui.time_range.afternoon": "오후",
"cobblemon.ui.time_range.predawn": "동트기 전",
"cobblemon.ui.time_range.evening": "저녁",
"cobblemon.subtitle.item.bright_powder.use": "반짝가루가 빛남",
"cobblemon.config.ui.type_gem_max_connected": "연결된 타입주얼 블록 최대 수",
"cobblemon.config.ui.type_gem_min_growth": "타입주얼 최소 성장",
"cobblemon.config.ui.type_gem_growth_chance": "타입주얼 성장 확률",
"cobblemon.config.ui.type_gem_initial_expansion_cycles": "타입주얼 초기 확장 횟수",
"cobblemon.battle.activate.ficklebeam": "%1$s은(는) 전력을 다해 공격한다!",
"tag.item.cobblemon.oricorio_flowers": "꽃꿀 꽃",
"tag.item.cobblemon.terrain_plants": "필드 식물",
"tag.item.cobblemon.tall_flowers": "큰 꽃",
"tag.worldgen.biome.cobblemon.evolution.regional.bergmite_hisuibiome": "히스이",
"tag.worldgen.biome.cobblemon.evolution.regional.bergmite_kalosbiome": "칼로스",
"tag.worldgen.biome.cobblemon.evolution.regional.cubone_alolabiome": "알로라",
"tag.worldgen.biome.cobblemon.evolution.regional.cubone_kantobiome": "관동",
"tag.worldgen.biome.cobblemon.evolution.regional.dartrix_alolabiome": "알로라",
"tag.worldgen.biome.cobblemon.evolution.regional.dartrix_hisuibiome": "히스이",
"tag.worldgen.biome.cobblemon.evolution.regional.dewott_hisuibiome": "히스이",
"tag.worldgen.biome.cobblemon.evolution.regional.dewott_unovabiome": "하나",
"tag.worldgen.biome.cobblemon.evolution.regional.exeggcute_alolabiome": "알로라",
"tag.worldgen.biome.cobblemon.evolution.regional.exeggcute_kantobiome": "관동",
"tag.worldgen.biome.cobblemon.evolution.regional.goomy_hisuibiome": "히스이",
"tag.worldgen.biome.cobblemon.evolution.regional.goomy_kalosbiome": "칼로스",
"tag.worldgen.biome.cobblemon.evolution.regional.koffing_galarbiome": "가라르",
"tag.worldgen.biome.cobblemon.evolution.regional.koffing_kantobiome": "관동",
"tag.worldgen.biome.cobblemon.evolution.regional.mimejr_galarbiome": "가라르",
"tag.worldgen.biome.cobblemon.evolution.regional.mimejr_sinnohbiome": "신오",
"tag.worldgen.biome.cobblemon.evolution.regional.petilil_hisuibiome": "히스이",
"tag.worldgen.biome.cobblemon.evolution.regional.petilil_unovabiome": "하나",
"tag.worldgen.biome.cobblemon.evolution.regional.pikachu_alolabiome": "알로라",
"tag.worldgen.biome.cobblemon.evolution.regional.pikachu_kantobiome": "관동",
"tag.worldgen.biome.cobblemon.evolution.regional.quilava_hisuibiome": "히스이",
"tag.worldgen.biome.cobblemon.evolution.regional.quilava_johtobiome": "성도",
"tag.worldgen.biome.cobblemon.evolution.regional.rufflet_hisuibiome": "히스이",
"tag.worldgen.biome.cobblemon.evolution.regional.rufflet_unovabiome": "하나",
"cobblemon.ui.pokedex.info.form.vivillon-icy snow": "빙설의 모양",
"cobblemon.species.vivillon-icy-snow.desc": "태어난 땅의 기후나 풍토에 영향을 받아 모양이 달라진다. 얼어붙은 땅에서의 모습이다.",
"cobblemon.ui.pokedex.info.form.vivillon-high plains": "황야의 모양",
"cobblemon.species.vivillon-high-plains.desc": "태어난 땅의 기후나 풍토에 영향을 받아 모양이 달라진다. 비가 적게 내리는 땅에서의 모습이다.",
"cobblemon.ui.pokedex.info.form.vivillon-inferno": "지옥의 모양",
"cobblemon.species.vivillon-inferno.desc": "살고 있는 장소의 기후나 풍토에 따라 날개의 모양이 다른 포켓몬이다. 화려한 색의 날개 가루를 뿌린다.",
"cobblemon.ui.pokedex.info.form.vivillon-void": "공허의 모양",
"cobblemon.species.vivillon-void.desc": "살고 있는 장소의 기후나 풍토에 따라 날개의 모양이 다른 포켓몬이다. 화려한 색의 날개 가루를 뿌린다.",
"cobblemon.ui.pokedex.info.form.vivillon-forsaken": "망각의 모양",
"cobblemon.species.vivillon-forsaken.desc": "살고 있는 장소의 기후나 풍토에 따라 날개의 모양이 다른 포켓몬이다. 화려한 색의 날개 가루를 뿌린다.",
"cobblemon.species.minior-red.desc": "겉껍질이 벗겨진 모습. 코어의 색이 다른 이유는 먹은 먹이의 성분이 다르기 때문이다."
}
@@ -9677,5 +9677,6 @@
"cobblemon.config.ui.world_spawning_blocklist": "维度生成黑名单",
"cobblemon.config.ui.world_spawning_blocklist.tooltip": "禁用宝可梦生成逻辑的维度。",
"advancements.cobblemon.obtain_tm": "让我看看你的招式",
"advancements.cobblemon.obtain_tm.description": "发现或刻写一个招式学习器"
"advancements.cobblemon.obtain_tm.description": "发现或刻写一个招式学习器",
"itemGroup.cobblemon.tm_item": "招式学习器"
}
+1 -1
View File
@@ -14,7 +14,7 @@ parchment_version = 2024.07.28@zip
java_version = 21
mod_id=cobblemon
mod_version=1.8.4
mod_version=1.8.5
snapshot=true
fabric.loom.multiProjectOptimisation=false