Optimize level/biome 2

This commit is contained in:
Tnze
2023-04-23 08:41:17 +08:00
parent 93e06594bd
commit d4d9653038

View File

@ -2,101 +2,114 @@ package biome
import ( import (
"errors" "errors"
"hash/maphash"
"math/bits" "math/bits"
) )
type Type int type Type int
var hashSeed = maphash.MakeSeed()
func (t Type) MarshalText() (text []byte, err error) { func (t Type) MarshalText() (text []byte, err error) {
if t >= 0 && int(t) < len(biomesNames) { if t >= 0 && int(t) < len(biomesNames) {
return []byte(biomesNames[t]), nil return biomesNames[t], nil
} }
return nil, errors.New("invalid type") return nil, errors.New("invalid type")
} }
func (t *Type) UnmarshalText(text []byte) error { func (t *Type) UnmarshalText(text []byte) error {
var ok bool var ok bool
*t, ok = biomesIDs[string(text)] *t, ok = biomesIDs[maphash.Bytes(hashSeed, text)]
if ok { if ok {
return nil return nil
} }
return errors.New("unknown type") return errors.New("invalid type")
}
// String returns the biome id. Debugging purposes only.
func (t Type) String() string {
if t >= 0 && int(t) < len(biomesNames) {
return string(biomesNames[t])
}
return "<invalid biome type>"
} }
var ( var (
// BitsPerBiome reports how many bits are required to represent all possible biomes.
BitsPerBiome int BitsPerBiome int
biomesIDs map[string]Type biomesIDs map[uint64]Type
biomesNames = []string{ biomesNames = [][]byte{
"minecraft:the_void", []byte("minecraft:the_void"),
"minecraft:plains", []byte("minecraft:plains"),
"minecraft:sunflower_plains", []byte("minecraft:sunflower_plains"),
"minecraft:snowy_plains", []byte("minecraft:snowy_plains"),
"minecraft:ice_spikes", []byte("minecraft:ice_spikes"),
"minecraft:desert", []byte("minecraft:desert"),
"minecraft:swamp", []byte("minecraft:swamp"),
"minecraft:mangrove_swamp", []byte("minecraft:mangrove_swamp"),
"minecraft:forest", []byte("minecraft:forest"),
"minecraft:flower_forest", []byte("minecraft:flower_forest"),
"minecraft:birch_forest", []byte("minecraft:birch_forest"),
"minecraft:dark_forest", []byte("minecraft:dark_forest"),
"minecraft:old_growth_birch_forest", []byte("minecraft:old_growth_birch_forest"),
"minecraft:old_growth_pine_taiga", []byte("minecraft:old_growth_pine_taiga"),
"minecraft:old_growth_spruce_taiga", []byte("minecraft:old_growth_spruce_taiga"),
"minecraft:taiga", []byte("minecraft:taiga"),
"minecraft:snowy_taiga", []byte("minecraft:snowy_taiga"),
"minecraft:savanna", []byte("minecraft:savanna"),
"minecraft:savanna_plateau", []byte("minecraft:savanna_plateau"),
"minecraft:windswept_hills", []byte("minecraft:windswept_hills"),
"minecraft:windswept_gravelly_hills", []byte("minecraft:windswept_gravelly_hills"),
"minecraft:windswept_forest", []byte("minecraft:windswept_forest"),
"minecraft:windswept_savanna", []byte("minecraft:windswept_savanna"),
"minecraft:jungle", []byte("minecraft:jungle"),
"minecraft:sparse_jungle", []byte("minecraft:sparse_jungle"),
"minecraft:bamboo_jungle", []byte("minecraft:bamboo_jungle"),
"minecraft:badlands", []byte("minecraft:badlands"),
"minecraft:eroded_badlands", []byte("minecraft:eroded_badlands"),
"minecraft:wooded_badlands", []byte("minecraft:wooded_badlands"),
"minecraft:meadow", []byte("minecraft:meadow"),
"minecraft:grove", []byte("minecraft:grove"),
"minecraft:snowy_slopes", []byte("minecraft:snowy_slopes"),
"minecraft:frozen_peaks", []byte("minecraft:frozen_peaks"),
"minecraft:jagged_peaks", []byte("minecraft:jagged_peaks"),
"minecraft:stony_peaks", []byte("minecraft:stony_peaks"),
"minecraft:river", []byte("minecraft:river"),
"minecraft:frozen_river", []byte("minecraft:frozen_river"),
"minecraft:beach", []byte("minecraft:beach"),
"minecraft:snowy_beach", []byte("minecraft:snowy_beach"),
"minecraft:stony_shore", []byte("minecraft:stony_shore"),
"minecraft:warm_ocean", []byte("minecraft:warm_ocean"),
"minecraft:lukewarm_ocean", []byte("minecraft:lukewarm_ocean"),
"minecraft:deep_lukewarm_ocean", []byte("minecraft:deep_lukewarm_ocean"),
"minecraft:ocean", []byte("minecraft:ocean"),
"minecraft:deep_ocean", []byte("minecraft:deep_ocean"),
"minecraft:cold_ocean", []byte("minecraft:cold_ocean"),
"minecraft:deep_cold_ocean", []byte("minecraft:deep_cold_ocean"),
"minecraft:frozen_ocean", []byte("minecraft:frozen_ocean"),
"minecraft:deep_frozen_ocean", []byte("minecraft:deep_frozen_ocean"),
"minecraft:mushroom_fields", []byte("minecraft:mushroom_fields"),
"minecraft:dripstone_caves", []byte("minecraft:dripstone_caves"),
"minecraft:lush_caves", []byte("minecraft:lush_caves"),
"minecraft:deep_dark", []byte("minecraft:deep_dark"),
"minecraft:nether_wastes", []byte("minecraft:nether_wastes"),
"minecraft:warped_forest", []byte("minecraft:warped_forest"),
"minecraft:crimson_forest", []byte("minecraft:crimson_forest"),
"minecraft:soul_sand_valley", []byte("minecraft:soul_sand_valley"),
"minecraft:basalt_deltas", []byte("minecraft:basalt_deltas"),
"minecraft:the_end", []byte("minecraft:the_end"),
"minecraft:end_highlands", []byte("minecraft:end_highlands"),
"minecraft:end_midlands", []byte("minecraft:end_midlands"),
"minecraft:small_end_islands", []byte("minecraft:small_end_islands"),
"minecraft:end_barrens", []byte("minecraft:end_barrens"),
} }
) )
func init() { func init() {
BitsPerBiome = bits.Len(uint(len(biomesNames))) BitsPerBiome = bits.Len(uint(len(biomesNames)))
biomesIDs = make(map[string]Type, len(biomesNames)) biomesIDs = make(map[uint64]Type, len(biomesNames))
for i, v := range biomesNames { for i, v := range biomesNames {
biomesIDs[v] = Type(i) h := maphash.Bytes(hashSeed, v)
biomesIDs[h] = Type(i)
} }
} }