Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
413 changes: 413 additions & 0 deletions common/luaUtilities/economy/economy_waterfill_solver.lua

Large diffs are not rendered by default.

58 changes: 58 additions & 0 deletions common/luaUtilities/economy/manual_share_ledger.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
local M = {}

local ledger = {} ---@type table<number, table<ResourceName, {sent: number, received: number}>>

local function entry(teamId, resourceType)
local perTeam = ledger[teamId]
if not perTeam then
perTeam = {}
ledger[teamId] = perTeam
end
local e = perTeam[resourceType]
if not e then
e = { sent = 0, received = 0 }
perTeam[resourceType] = e
end
return e
end

---@param senderTeamId number
---@param receiverTeamId number
---@param resourceType ResourceName
---@param sent number
---@param received number
function M.Record(senderTeamId, receiverTeamId, resourceType, sent, received)
local s = entry(senderTeamId, resourceType)
s.sent = s.sent + sent
local r = entry(receiverTeamId, resourceType)
r.received = r.received + received
end

--- Fold accumulated manual-share stats into the redistribution result entries, then clear.
---@param results EconomyTeamResult[]
function M.FoldInto(results)
if not next(ledger) then return results end
for i = 1, #results do
local result = results[i]
local perTeam = ledger[result.teamId]
local e = perTeam and perTeam[result.resourceType]
if e then
result.sent = result.sent + e.sent
result.received = result.received + e.received
e.sent = 0
e.received = 0
end
end
return results
end

function M.Clear()
for teamId, perTeam in pairs(ledger) do
for resourceType, e in pairs(perTeam) do
e.sent = 0
e.received = 0
end
end
end

return M
53 changes: 53 additions & 0 deletions common/luaUtilities/economy/shared_config.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
local ModeEnums = VFS.Include("modes/sharing_mode_enums.lua")
local MOD_OPTIONS = ModeEnums.ModOptions
local TechBlockingShared = VFS.Include("common/luaUtilities/team_transfer/tech_blocking_shared.lua")

local M = {}

---@type number?
local cachedTax = nil
---@type boolean?
local cachedSharingEnabled = nil

function M.resetCache()
cachedTax = nil
cachedSharingEnabled = nil
end

---@param springRepo SpringSynced
---@return boolean
function M.isResourceSharingEnabled(springRepo)
if cachedSharingEnabled ~= nil then
return cachedSharingEnabled
end
local v = springRepo.GetModOptions()[MOD_OPTIONS.ResourceSharingEnabled]
cachedSharingEnabled = not (v == false or v == "0")
return cachedSharingEnabled
end

---@param springRepo SpringSynced
---@return number tax Base tax rate
function M.getTaxConfig(springRepo)
if cachedTax then
return cachedTax
end

local modOpts = springRepo.GetModOptions()
local tax = tonumber(modOpts[MOD_OPTIONS.TaxResourceSharingAmount]) or 0
if tax < 0 then tax = 0 end
if tax > 1 then tax = 1 end

cachedTax = tax

return tax
end

-- per-team tax rate by tech level; degrades to base rate when tech_blocking inactive
---@param springRepo SpringSynced
---@param teamId number
---@return number
function M.getTeamTaxRate(springRepo, teamId)
return TechBlockingShared.GetTaxRate(teamId, nil, springRepo)
end

return M
90 changes: 90 additions & 0 deletions modes/sharing/customize.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
local ModeEnums = VFS.Include("modes/sharing_mode_enums.lua")

---@type ModeConfig
return {
key = ModeEnums.Modes.Customize,
category = ModeEnums.ModeCategories.Sharing,
name = "Customize",
desc = "Tweak everything. Switching to Customize keeps the current mode's settings as a starting point (defaults if you start here).",
allowRanked = true,
-- non-sticky: keeps current values; entries below only expose/unlock options (values ignored by lobby).
retainValues = true,
modOptions = {
[ModeEnums.ModOptions.TechBlocking] = {
value = false,
locked = false,
},
[ModeEnums.ModOptions.T2TechThreshold] = {
value = 1,
locked = false,
},
[ModeEnums.ModOptions.T3TechThreshold] = {
value = 1.5,
locked = false,
},
[ModeEnums.ModOptions.UnitSharingMode] = {
value = ModeEnums.UnitFilterCategory.All,
locked = false,
},
[ModeEnums.ModOptions.UnitSharingModeAtT2] = {
value = ModeEnums.UnitFilterCategory.None,
locked = false,
},
[ModeEnums.ModOptions.UnitSharingModeAtT3] = {
value = ModeEnums.UnitFilterCategory.None,
locked = false,
},
[ModeEnums.ModOptions.UnitShareStunSeconds] = {
value = 0,
locked = false,
},
[ModeEnums.ModOptions.UnitStunCategory] = {
value = ModeEnums.UnitFilterCategory.Resource,
locked = false,
},
[ModeEnums.ModOptions.ConstructorBuildDelay] = {
value = 0,
locked = false,
},
[ModeEnums.ModOptions.ResourceSharingEnabled] = {
value = true,
locked = false,
},
[ModeEnums.ModOptions.TaxResourceSharingAmount] = {
value = 0,
locked = false
},
[ModeEnums.ModOptions.TaxResourceSharingAmountAtT2] = {
value = -1,
locked = false,
},
[ModeEnums.ModOptions.TaxResourceSharingAmountAtT3] = {
value = -1,
locked = false,
},
[ModeEnums.ModOptions.AlliedAssistMode] = {
value = ModeEnums.AlliedAssistMode.Enabled,
locked = false
},
[ModeEnums.ModOptions.AlliedUnitReclaimMode] = {
value = ModeEnums.AlliedUnitReclaimMode.Enabled,
locked = false
},
[ModeEnums.ModOptions.AllowPartialResurrection] = {
value = ModeEnums.AllowPartialResurrection.Enabled,
locked = false,
},
[ModeEnums.ModOptions.TakeMode] = {
value = ModeEnums.TakeMode.Enabled,
locked = false,
},
[ModeEnums.ModOptions.TakeDelaySeconds] = {
value = 30,
locked = false,
},
[ModeEnums.ModOptions.TakeDelayCategory] = {
value = ModeEnums.UnitCategory.Resource,
locked = false,
},
}
}
37 changes: 37 additions & 0 deletions modes/sharing/disabled.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
local ModeEnums = VFS.Include("modes/sharing_mode_enums.lua")

---@type ModeConfig
return {
key = ModeEnums.Modes.Disabled,
category = ModeEnums.ModeCategories.Sharing,
name = "Disabled",
desc = "Disable all sharing; apply a 30% tax; lock most controls.",
allowRanked = true,
modOptions = {
[ModeEnums.ModOptions.UnitSharingMode] = {
value = ModeEnums.UnitFilterCategory.None,
locked = true
},
[ModeEnums.ModOptions.ResourceSharingEnabled] = {
value = false,
locked = true
},
[ModeEnums.ModOptions.TaxResourceSharingAmount] = {
value = 0.30,
locked = false,
ui = "hidden"
},
[ModeEnums.ModOptions.AlliedAssistMode] = {
value = ModeEnums.AlliedAssistMode.Disabled,
locked = true
},
[ModeEnums.ModOptions.AlliedUnitReclaimMode] = {
value = ModeEnums.AlliedUnitReclaimMode.Disabled,
locked = true
},
[ModeEnums.ModOptions.TakeMode] = {
value = ModeEnums.TakeMode.Disabled,
locked = false,
},
}
}
61 changes: 61 additions & 0 deletions modes/sharing/easy_tax.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
local ModeEnums = VFS.Include("modes/sharing_mode_enums.lua")

---@type ModeConfig
return {
key = ModeEnums.Modes.EasyTax,
category = ModeEnums.ModeCategories.Sharing,
name = "Easy Tax",
desc = "Anti co-op sharing tax mode. Tax on resource sharing, assist, and resurrection. Eco buildings stunned, mobile constructors debuffed.",
allowRanked = true,
-- curated preset: structural choices locked; only intensity dials (rates/durations) stay editable.
modOptions = {
[ModeEnums.ModOptions.UnitSharingMode] = {
value = ModeEnums.UnitFilterCategory.All,
locked = true,
},
[ModeEnums.ModOptions.UnitShareStunSeconds] = {
value = 30,
locked = false,
},
[ModeEnums.ModOptions.UnitStunCategory] = {
value = ModeEnums.UnitFilterCategory.Resource,
locked = true,
},
[ModeEnums.ModOptions.ConstructorBuildDelay] = {
value = 30,
locked = false,
},
[ModeEnums.ModOptions.ResourceSharingEnabled] = {
value = true,
locked = true,
},
[ModeEnums.ModOptions.TaxResourceSharingAmount] = {
value = 0.30,
locked = false,
},
[ModeEnums.ModOptions.AlliedAssistMode] = {
value = ModeEnums.AlliedAssistMode.Enabled,
locked = true,
},
[ModeEnums.ModOptions.AlliedUnitReclaimMode] = {
value = ModeEnums.AlliedUnitReclaimMode.Enabled,
locked = true,
},
[ModeEnums.ModOptions.AllowPartialResurrection] = {
value = ModeEnums.AllowPartialResurrection.Enabled,
locked = true,
},
[ModeEnums.ModOptions.TakeMode] = {
value = ModeEnums.TakeMode.StunDelay,
locked = true,
},
[ModeEnums.ModOptions.TakeDelaySeconds] = {
value = 30,
locked = false,
},
[ModeEnums.ModOptions.TakeDelayCategory] = {
value = ModeEnums.UnitCategory.Resource,
locked = true,
},
},
}
37 changes: 37 additions & 0 deletions modes/sharing/enabled.lua
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
local ModeEnums = VFS.Include("modes/sharing_mode_enums.lua")

---@type ModeConfig
return {
key = ModeEnums.Modes.Enabled,
category = ModeEnums.ModeCategories.Sharing,
name = "Enabled",
desc = "All sharing on with fixed defaults.",
allowRanked = true,
modOptions = {
[ModeEnums.ModOptions.UnitSharingMode] = {
value = ModeEnums.UnitFilterCategory.All,
locked = true,
},
[ModeEnums.ModOptions.ResourceSharingEnabled] = {
value = true,
locked = true,
},
[ModeEnums.ModOptions.TaxResourceSharingAmount] = {
value = 0.0,
locked = true,
ui = "hidden"
},
[ModeEnums.ModOptions.AlliedAssistMode] = {
value = ModeEnums.AlliedAssistMode.Enabled,
locked = true,
},
[ModeEnums.ModOptions.AlliedUnitReclaimMode] = {
value = ModeEnums.AlliedUnitReclaimMode.Enabled,
locked = true,
},
[ModeEnums.ModOptions.TakeMode] = {
value = ModeEnums.TakeMode.Enabled,
locked = true,
},
}
}
Loading
Loading