56 lines
2.9 KiB
Go
56 lines
2.9 KiB
Go
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
|
|
}
|