package main import "math/rand" // WayfarerCommodity — один вид товара для торговли. type WayfarerCommodity struct { Key string BasePrice float64 IndustrialBias float64 // >0 — дешевле в промышленных системах, <0 — дешевле в аграрных WealthBias float64 // >0 — дешевле в богатых системах, <0 — дешевле в бедных Illegal bool // патрули иногда проверяют такой груз } // WayfarerCommodities — список доступных для торговли товаров. // Индекс в этом срезе используется как компактный идентификатор // товара в трюме корабля. var WayfarerCommodities = []WayfarerCommodity{ {Key: "commodity.food", BasePrice: 12, IndustrialBias: -0.5, WealthBias: 0}, {Key: "commodity.textiles", BasePrice: 18, IndustrialBias: -0.3, WealthBias: -0.1}, {Key: "commodity.machinery", BasePrice: 65, IndustrialBias: 0.6, WealthBias: 0.1}, {Key: "commodity.computers", BasePrice: 140, IndustrialBias: 0.5, WealthBias: 0.3}, {Key: "commodity.luxuries", BasePrice: 220, IndustrialBias: 0, WealthBias: -0.6}, {Key: "commodity.medicine", BasePrice: 90, IndustrialBias: 0.2, WealthBias: 0.2}, {Key: "commodity.minerals", BasePrice: 35, IndustrialBias: 0.4, WealthBias: 0}, {Key: "commodity.rare_metals", BasePrice: 310, IndustrialBias: 0.3, WealthBias: 0.4}, {Key: "commodity.contraband", BasePrice: 260, IndustrialBias: 0, WealthBias: -0.4, Illegal: true}, {Key: "commodity.firearms", BasePrice: 180, IndustrialBias: 0.3, WealthBias: 0, Illegal: true}, } // wayfarerPriceNoise — насколько случайный шум может отклонить цену // от расчётного значения (±15%). const wayfarerPriceNoise = 0.15 // CommodityPrice вычисляет цену покупки товара commodityIdx в // системе sys. rng используется для небольшого случайного разброса // цены (тесты передают детерминированный источник). func CommodityPrice(commodityIdx int, sys WayfarerSystem, rng *rand.Rand) float64 { c := WayfarerCommodities[commodityIdx] price := c.BasePrice price *= 1 - c.IndustrialBias*(sys.Industrial*2-1)*0.5 price *= 1 - c.WealthBias*(sys.Wealth*2-1)*0.5 noise := 1 + (rng.Float64()*2-1)*wayfarerPriceNoise price *= noise if price < 1 { price = 1 } return price } // SellPrice — цена продажи (обычно чуть ниже цены покупки — так // станция зарабатывает на посреднической марже, как в привычных // торговых играх). func SellPrice(buyPrice float64) float64 { return buyPrice * 0.9 }