Current section
Files
Jump to
Current section
Files
src/tallgrass/internal/evolution/evolution_chain/evolution_chain.gleam
import decode
import gleam/option.{type Option}
import tallgrass/internal/common/affordance.{type Affordance, affordance}
pub type EvolutionChain {
EvolutionChain(
id: Int,
baby_trigger_item: Option(Affordance),
chain: ChainLink,
)
}
pub type ChainLink {
ChainLink(
is_baby: Bool,
species: Affordance,
evolution_details: List(EvolutionDetails),
// TODO: Figure out how to decode a recursive type.
// evolves_to: List(ChainLink),
)
}
pub type EvolutionDetails {
EvolutionDetails(
item: Option(Affordance),
trigger: Affordance,
gender: Int,
held_item: Option(Affordance),
known_move: Option(Affordance),
known_move_type: Option(Affordance),
location: Option(Affordance),
min_level: Int,
min_happiness: Option(Int),
min_beauty: Option(Int),
min_affection: Option(Int),
needs_overworld_rain: Bool,
party_species: Option(Affordance),
party_type: Option(Affordance),
relative_physical_stats: Int,
time_of_day: String,
trade_species: Option(Affordance),
turn_upside_down: Bool,
)
}
pub fn evolution_chain() {
decode.into({
use id <- decode.parameter
use baby_trigger_item <- decode.parameter
use chain <- decode.parameter
EvolutionChain(id, baby_trigger_item, chain)
})
|> decode.field("id", decode.int)
|> decode.field("baby_trigger_item", decode.optional(affordance()))
|> decode.field("chain", chain_link())
}
fn chain_link() {
decode.into({
use is_baby <- decode.parameter
use species <- decode.parameter
use evolution_details <- decode.parameter
// TODO: Figure out how to decode a recursive type.
// use evolves_to <- decode.parameter
ChainLink(is_baby, species, evolution_details)
})
|> decode.field("is_baby", decode.bool)
|> decode.field("species", affordance())
|> decode.field("evolution_details", decode.list(of: evolution_details()))
// TODO: Figure out how to decode a recursive type.
// |> decode.field("evolves_to", decode.list(of: chain_link()))
}
fn evolution_details() {
decode.into({
use item <- decode.parameter
use trigger <- decode.parameter
use gender <- decode.parameter
use held_item <- decode.parameter
use known_move <- decode.parameter
use known_move_type <- decode.parameter
use location <- decode.parameter
use min_level <- decode.parameter
use min_happiness <- decode.parameter
use min_beauty <- decode.parameter
use min_affection <- decode.parameter
use needs_overworld_rain <- decode.parameter
use party_species <- decode.parameter
use party_type <- decode.parameter
use relative_physical_stats <- decode.parameter
use time_of_day <- decode.parameter
use trade_species <- decode.parameter
use turn_upside_down <- decode.parameter
EvolutionDetails(
item,
trigger,
gender,
held_item,
known_move,
known_move_type,
location,
min_level,
min_happiness,
min_beauty,
min_affection,
needs_overworld_rain,
party_species,
party_type,
relative_physical_stats,
time_of_day,
trade_species,
turn_upside_down,
)
})
|> decode.field("item", decode.optional(affordance()))
|> decode.field("trigger", affordance())
|> decode.field("gender", decode.int)
|> decode.field("held_item", decode.optional(affordance()))
|> decode.field("known_move", decode.optional(affordance()))
|> decode.field("known_move_type", decode.optional(affordance()))
|> decode.field("location", decode.optional(affordance()))
|> decode.field("min_level", decode.int)
|> decode.field("min_happiness", decode.optional(decode.int))
|> decode.field("min_beauty", decode.optional(decode.int))
|> decode.field("min_affection", decode.optional(decode.int))
|> decode.field("needs_overworld_rain", decode.bool)
|> decode.field("party_species", decode.optional(affordance()))
|> decode.field("party_type", decode.optional(affordance()))
|> decode.field("relative_physical_stats", decode.int)
|> decode.field("time_of_day", decode.string)
|> decode.field("trade_species", decode.optional(affordance()))
|> decode.field("turn_upside_down", decode.bool)
}