go_games_collection/wayfarer_economy.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
}