package personal_world import ( "chain" "chain/runtime" "strconv" "gno.land/p/nt/avl" "gno.land/p/nt/ufmt" ) const ( SetSizeInfoEvent = "SetSizeInfo" ) var ( sizeInfos avl.Tree // sizeID -> map[string]string ) func init() { // Initialize SizeInfo as map[string]string sizeInfos.Set("0", map[string]string{"id": "0", "size": "100", "cost": "0"}) sizeInfos.Set("1", map[string]string{"id": "1", "size": "200", "cost": "20000000"}) sizeInfos.Set("2", map[string]string{"id": "2", "size": "300", "cost": "30000000"}) sizeInfos.Set("3", map[string]string{"id": "3", "size": "400", "cost": "40000000"}) } // SetSizeInfo sets a single size info (admin only) func SetSizeInfo(cur realm, sizeID int, size int, cost int64, option string) { caller := runtime.PreviousRealm().Address() assertIsAdmin(caller) // Validate inputs if sizeID < 0 { panic("sizeID must be non-negative") } if size < 0 { panic("size must be non-negative") } if cost < 0 { panic("cost must be non-negative") } // Create size info key := ufmt.Sprintf("%d", sizeID) sizeInfo := map[string]string{ "id": ufmt.Sprintf("%d", sizeID), "size": ufmt.Sprintf("%d", size), "cost": ufmt.Sprintf("%d", cost), "option": option, } sizeInfos.Set(key, sizeInfo) chain.Emit( SetSizeInfoEvent, "admin", caller.String(), "sizeID", ufmt.Sprintf("%d", sizeID), "size", ufmt.Sprintf("%d", size), "cost", ufmt.Sprintf("%d", cost), ) } func ListSizeInfos() []map[string]string { var result []map[string]string sizeInfos.Iterate("", "", func(key string, value interface{}) bool { sizeInfo := value.(map[string]string) result = append(result, sizeInfo) return false }) return result } // mustGetSizeInfo gets size info with panic on not found func mustGetSizeInfo(sizeID int) map[string]string { sizeInfo, found := sizeInfos.Get(ufmt.Sprintf("%d", sizeID)) if !found { panic("size info not found: " + ufmt.Sprintf("%d", sizeID)) } return sizeInfo.(map[string]string) } // GetWorldExpansionCost returns the cost to expand a world to the next size func GetWorldExpansionCost(worldID uint32) int64 { world := mustGetWorld(worldID) // Get current size ID and world biome currentSizeID, _ := strconv.Atoi(world["sizeId"]) // Get next size info nextSizeID := currentSizeID + 1 nextSizeInfo := mustGetSizeInfo(nextSizeID) baseCost, _ := strconv.ParseInt(nextSizeInfo["cost"], 10, 64) // Get world type info for multiplier biomeInfo := mustGetBiomeInfo(world["biome"]) multiple, _ := strconv.ParseFloat(biomeInfo["priceMultiplier"], 64) // Calculate expansion cost with multiplier expansionCost := int64(float64(baseCost) * multiple) return expansionCost }