Files
gogame/models/calc.go
2019-07-22 19:02:38 +02:00

326 lines
9.4 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package models
import (
"math"
"github.com/arnaucube/gogame/constants"
)
// formulas
// https://ogame.fandom.com/wiki/Formulas
// https://ogame.fandom.com/wiki/Research
// idelta is time in seconds units
func MetalGrowth(ilvl int64, idelta int64) int64 {
lvl := float64(ilvl)
delta := float64(idelta)
// 30 * L * 1.1^L
perHour := constants.UniverseAcceleration * 30 * lvl * math.Pow(1.1, lvl)
r := (perHour / 60) * delta * constants.MineVelocity
return int64(r)
}
func CrystalGrowth(ilvl int64, idelta int64) int64 {
lvl := float64(ilvl)
delta := float64(idelta)
// 20 * L * 1.1^L
perHour := constants.UniverseAcceleration * 20 * lvl * math.Pow(1.1, lvl)
r := (perHour / 60) * delta * constants.MineVelocity
return int64(r)
}
func DeuteriumGrowth(ilvl int64, idelta int64) int64 {
lvl := float64(ilvl)
delta := float64(idelta)
t := float64(240) // t: max temperature
// 10 * L * 1.1^L * (0.002 * T + 1.28))
perHour := constants.UniverseAcceleration * 10 * lvl * math.Pow(1.1, lvl) * ((-0.002)*t + 1.28)
r := (perHour / 60) * delta * constants.MineVelocity
return int64(r)
}
func SolarGrowth(ilvl int64) int64 {
lvl := float64(ilvl)
// 20 * L * 1.1^L
production := 20 * lvl * math.Pow(1.1, lvl)
return int64(production)
}
func FusionGrowth(ilvl int64, ilvlTech int64, idelta int64) int64 {
lvl := float64(ilvl)
lvlTech := float64(ilvlTech)
delta := float64(idelta)
// 30 * L * (1.05 + lvlTech * 0.01)^lvl
perHour := constants.UniverseAcceleration * 30 * math.Pow((1.05+lvlTech*0.01), lvl)
r := (perHour / 60) * delta * constants.MineVelocity
return int64(r)
}
func MetalMineEnergyConsumption(ilvl int64) int64 {
lvl := float64(ilvl)
// 10 * lvl * 1.1^lvl
c := 10 * lvl * math.Pow(1.1, lvl)
return int64(c)
}
func CrystalMineEnergyConsumption(ilvl int64) int64 {
lvl := float64(ilvl)
// 10 * lvl * 1.1^lvl
c := 10 * lvl * math.Pow(1.1, lvl)
return int64(c)
}
func DeuteriumMineEnergyConsumption(ilvl int64) int64 {
lvl := float64(ilvl)
// 20 * lvl * 1.1^lvl
c := 10 * lvl * math.Pow(1.1, lvl)
return int64(c)
}
// https://ogame.fandom.com/wiki/Buildings
// https://ogame.fandom.com/wiki/Metal_Mine
func MetalMineCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 60,
Crystal: 15,
Deuterium: 0,
Energy: 0,
}
// cost = base * 1.5^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(1.5, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(1.5, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(1.5, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(1.5, lvl-1))
return cost
}
// https://ogame.fandom.com/wiki/Crystal_Mine
func CrystalMineCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 48,
Crystal: 24,
Deuterium: 0,
Energy: 0,
}
// cost = base * 1.6^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(1.6, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(1.6, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(1.6, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(1.6, lvl-1))
return cost
}
// https://ogame.fandom.com/wiki/Deuterium_Synthesizer
func DeuteriumMineCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 225,
Crystal: 75,
Deuterium: 0,
Energy: 0,
}
// cost = base * 1.5^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(1.5, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(1.5, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(1.5, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(1.5, lvl-1))
return cost
}
func EnergyMineCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 75,
Crystal: 30,
Deuterium: 0,
Energy: 0,
}
// cost = base * 1.5^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(1.5, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(1.5, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(1.5, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(1.5, lvl-1))
return cost
}
func FussionReactorCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 900,
Crystal: 360,
Deuterium: 180,
Energy: 0,
}
// cost = base * 1.8^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(1.8, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(1.8, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(1.8, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(1.8, lvl-1))
return cost
}
func RoboticsFactoryCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 400,
Crystal: 120,
Deuterium: 200,
Energy: 0,
}
// cost = base * 2^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(2, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(2, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(2, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(2, lvl-1))
return cost
}
func ShipyardCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 400,
Crystal: 200,
Deuterium: 100,
Energy: 0,
}
// cost = base * 2^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(2, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(2, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(2, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(2, lvl-1))
return cost
}
func MetalStorageCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 1000,
Crystal: 0,
Deuterium: 0,
Energy: 0,
}
// cost = base * 2^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(2, lvl-1))
cost.Crystal = 0
cost.Deuterium = 0
cost.Energy = 0
return cost
}
func CrystalStorageCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 1000,
Crystal: 500,
Deuterium: 0,
Energy: 0,
}
// cost = base * 2^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(2, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(2, lvl-1))
cost.Deuterium = 0
cost.Energy = 0
return cost
}
func DeuteriumStorageCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 1000,
Crystal: 1000,
Deuterium: 0,
Energy: 0,
}
// cost = base * 2^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(2, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(2, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(2, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(2, lvl-1))
return cost
}
func RessearchLabCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 200,
Crystal: 400,
Deuterium: 200,
Energy: 0,
}
// cost = base * 2^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(2, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(2, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(2, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(2, lvl-1))
return cost
}
func AllianceDepotCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 20000,
Crystal: 40000,
Deuterium: 0,
Energy: 0,
}
// cost = base * 2^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(2, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(2, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(2, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(2, lvl-1))
return cost
}
func MissileSiloCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 20000,
Crystal: 20000,
Deuterium: 1000,
Energy: 0,
}
// cost = base * 2^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(2, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(2, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(2, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(2, lvl-1))
return cost
}
func SpaceDockCost(ilvl int64) Resources {
lvl := float64(ilvl)
base := Resources{
Metal: 20000,
Crystal: 20000,
Deuterium: 1000,
Energy: 0,
}
// cost = base * 2^(lvl-1)
cost := Resources{}
cost.Metal = int64(float64(base.Metal) * math.Pow(2, lvl-1))
cost.Crystal = int64(float64(base.Crystal) * math.Pow(2, lvl-1))
cost.Deuterium = int64(float64(base.Deuterium) * math.Pow(2, lvl-1))
cost.Energy = int64(float64(base.Energy) * math.Pow(2, lvl-1))
return cost
}
// TODO ConstructionTime and ResearchTime are following the formulas from https://ogame.fandom.com/wiki/Formulas
// but are not giving exact same numbers than in online calculators
func ConstructionTime(r Resources, roboticsLvl int64) int64 {
naniteLvl := float64(1)
// T(h) = (metal + crystal) / (2500 * (1+roboticsLvl) * 2^naniteLvl * universespeed)
tHours := float64(r.Metal+r.Crystal) / (float64(2500) * float64(1+roboticsLvl) * math.Pow(2, naniteLvl) * constants.UniverseAcceleration)
return int64(tHours * 3600)
}
func RessearchTime(r Resources, researchLvl int64) int64 {
// T(h) = (metal + crystal) / (1000 * (1+researchLvl * universespeed)
tHours := float64(r.Metal+r.Crystal) / (float64(1000) * float64(1+researchLvl*constants.UniverseAcceleration))
return int64(tHours * 3600)
}