Page 1 of 2
Custom resources
Posted: 19 Nov 2010, 10:25
by kalda341
Is it possible to have resources other than metal and energy? And have them different for different factions? Eg. Worshipers for a faith faction, cells for micro-organisms gains from kills. How would I do this?
Re: Custom resources
Posted: 19 Nov 2010, 11:10
by zwzsg
Yes, but you'd have to code it yourself (with a Lua gadget). Or to nab a gadget from another mod with custom resource, but then in order to use it you'd have to understand and adapt it, which in the end could end up almost as much complicated as writing your own.
The engine only handle two resources, if it's just their name that bothers it's easier to change the GUI than to code a new resources. If it is their method of acquisition that bothers you, it's also easier to code new way to gain energy and metal but otherwise let the engine manage them than to recode a whole new resource.
But if you really need more than two resources, or a resource that behave very differently, then you have to code all the logic to handle these resources in a gadget. Depending on what kind of event modify that resources, than can be a rather simple gadget or a long and complex monster gadget.
GundamRTS had custom resource (basic/refined/exotic, plus the power supply har), but don't rush for it as GundamRTS is not compatible with current Spring.
In Kernel Panic, the network "buffer" and the "SoS" could maybe be considered like simplified sort of custom resources.
Some other KDR_11k mods like Fibre had some custom resource system as well.
Re: Custom resources
Posted: 19 Nov 2010, 16:29
by SinbadEV
this would actually make a good question/answer for
http://answers.springlobby.info/
Re: Custom resources
Posted: 19 Nov 2010, 17:18
by knorke
kalda341 wrote:cells for micro-organisms gains from kills. How would I do this?
That is easy to do with Lua.
Use something like
Code: Select all
gadget:function Spring.UnitKilled (...)
if (killer==that and killed==this) then
Spring.AddTeamResource (team of killer, "metal", 100)
end
end
(pseudeo code)
http://springrts.com/wiki/Lua_SyncedCtrl#Resources
http://springrts.com/wiki/LuaCallinReturn
For display:
Here is a quite simple widget that replaces the default resource bars.
http://code.google.com/p/conflictterra/ ... isplay.lua
ie for metal it just displays
Metal: 450
Of course that could easily by changed into
Faith: 450
And have them different for different factions?
Yes, use something like this:
Code: Select all
faction = Spring.GetTeamInfo (teamID blabla).side
if (faction=="Worshippers") then resourcename = "Faith" end
if (faction=="micro-organisms") then resourcename = "Cells" end
Re: Custom resources
Posted: 19 Nov 2010, 17:25
by zwzsg
No, because there isn't a simple answer.
It requires extensive discussion to get the initial poster to develop his idea, and a solution that'll suit one modder won't another.
Re: Custom resources
Posted: 19 Nov 2010, 19:51
by kalda341
Thanks, I'll try these out and see if they work for me.
Re: Custom resources
Posted: 28 Nov 2010, 23:04
by kalda341
knorke wrote:kalda341 wrote:cells for micro-organisms gains from kills. How would I do this?
That is easy to do with Lua.
Use something like
Code: Select all
gadget:function Spring.UnitKilled (...)
if (killer==that and killed==this) then
Spring.AddTeamResource (team of killer, "metal", 100)
end
end
(pseudeo code)
http://springrts.com/wiki/Lua_SyncedCtrl#Resources
http://springrts.com/wiki/LuaCallinReturn
For display:
Here is a quite simple widget that replaces the default resource bars.
http://code.google.com/p/conflictterra/ ... isplay.lua
ie for metal it just displays
Metal: 450
Of course that could easily by changed into
Faith: 450
And have them different for different factions?
Yes, use something like this:
Code: Select all
faction = Spring.GetTeamInfo (teamID blabla).side
if (faction=="Worshippers") then resourcename = "Faith" end
if (faction=="micro-organisms") then resourcename = "Cells" end
So this is the line I want to vary based on the faction:
Code: Select all
glText("Carbon: " .. metal, vsx/2, vsy-UIscale*1.4, UIscale*1.4, "oc")
How would I do this?
I am assuming it would be something like:
Code: Select all
If (faction=="Macrobes") then
glText("Carbon: " .. metal, vsx/2, vsy-UIscale*1.4, UIscale*1.4, "oc")
end if
Re: Custom resources
Posted: 28 Nov 2010, 23:13
by knorke
yes should work like that.
do get faction use
local _,_,_,_,faction = Spring.GetTeamInfo(localplayerID)
if you use my resourcedisplay, localplayerID will already be read, if you use or own widget do
local localplayerID = Spring.GetLocalTeamID()
to check if all that reads faction correctly try adding
Spring.Echo ("your faction is" .. faction)
Re: Custom resources
Posted: 29 Nov 2010, 00:38
by kalda341
I've played around with various syntaxes but cannot get it to function. I am using your widget:
Code: Select all
--display for resources
--because 99999[..]9 storage make the engine resbar look ugly ;)
function widget:GetInfo()
return {
name = "resouce display",
desc = "display metal as number, without storage bar",
author = "knorke",
date = "Oct 19, 2010",
license = "weeeeeee iam on horse",
layer = -3,
enabled = true -- loaded by default?
}
end
--thanks to trepan and his "com ends" widget :)
local glPopMatrix = gl.PopMatrix
local glPushMatrix = gl.PushMatrix
local glText = gl.Text
local font = 'FreeMonoBold'
local fontSize = 32
local fontName = LUAUI_DIRNAME..'Fonts/'..font..'_'..fontSize
local fh = fontHandler.UseFont(fontName)
local gameframe = 0
local vsx, vsy = widgetHandler:GetViewSizes()
local UIscale, fontsize = vsy/55
function widget:ViewResize(viewSizeX, viewSizeY)
vsx = viewSizeX
vsy = viewSizeY
UIscale = vsx/75
end
function widget:GameFrame(f)
gameframe = f
end
function widget:DrawScreen()
local localplayerID = Spring.GetLocalTeamID()
local metal = math.floor (Spring.GetTeamResources (localplayerID ,"metal"))
local energy, energystorage, energypull, energyincome= Spring.GetTeamResources (localplayerID ,"energy")
glPushMatrix()
if (fh) then
fh = fontHandler.UseFont(fontName)
fontHandler.DrawCentered(msg)
else
local ebar_startx = vsx*0.6
local ebar_endx = vsx*0.95
local ebar_length = ebar_endx-ebar_startx
local ebar_currentendx = ((energy/energystorage)*ebar_length)+ebar_startx
local ebar_height = UIscale*2
local ebar_height2 = UIscale/2
gl.Color(0.8, 0.8, 0.8, 0.5)
gl.Rect(ebar_endx, vsy-ebar_height, (vsx/2)-UIscale*8,vsy ) --background of metal display
glText("Metal: " .. metal, vsx/2, vsy-UIscale*1.5, UIscale*1.5, "oc")
gl.Color(1, 1, 0, 0.5)
gl.Rect(ebar_startx, vsy, ebar_endx, vsy-ebar_height) --background of energy bar in total size/storage
gl.Color(1, 1, 0, 0.8)
gl.Rect(ebar_startx, vsy-(ebar_height/2)+ebar_height2 , ebar_currentendx, vsy-(ebar_height/2)-ebar_height2) --actual energy bar
--sinus_bar (ebar_startx, vsy-(ebar_height/2), ebar_height/2, ebar_currentendx, 50)
sinus_bar2 (ebar_startx, vsy-(ebar_height/2), ebar_height/2, ebar_currentendx, energystorage/50)
gl.Color(0.8, 0.8, 0.8, 0.5)
--glText("Energy: " .. energy, (ebar_startx+ebar_endx)/2, vsy-UIscale*1.5, UIscale*1.5, "oc")
local msg = ""--"Energy: " .. math.floor(energy)
if (energy < 100) then
msg = "Low Energy"
if (energyincome < 10) then msg = "Energy Critical" end
end
glText(msg , (ebar_startx+ebar_endx)/2, vsy-UIscale*1.5, UIscale*1.5, "oc")
end
glPopMatrix()
end
function sinus_bar (x,y, h, endx, r)
local SINn = r
local stepx = (endx-x)/(SINn+1)
local a = 2
local SINx = x
local SINy = y
gl.Color(1, 0, 0, 1)
for i = 0, SINn, 1 do
SINy = math.sin ((gameframe+SINx)/(UIscale/2)) * (h/2) +y
SINx = SINx + stepx
gl.Rect (SINx-stepx,SINy-a, SINx, SINy+a)
end
end
function sinus_bar2 (x,y, h, endx, r)
local SINn = r
local stepx = (endx-x)/(SINn+1)
local a = 2
local SINx = x
local SINy = y
gl.Color(1, 0, 0, 1)
for i = 0, SINn, 1 do
a = math.sin ((gameframe+SINx)/(UIscale/2)) * (h/2)
SINx = SINx + stepx
gl.Rect (SINx-stepx,SINy-a, SINx, SINy+a)
end
end
function widget:Initialize()
Spring.SendCommands ("resbar 0")
Spring.Echo ("tp_ressourcedisplay.lua: type /resbar 1 to get the engines resource bars back")
end
Re: Custom resources
Posted: 29 Nov 2010, 11:28
by knorke
i will look at it later.
possibly also needs Spring.GetSideData
Re: Custom resources
Posted: 29 Nov 2010, 19:57
by kalda341
Thanks.
Re: Custom resources
Posted: 04 Dec 2010, 00:25
by kalda341
Can you see anything that might be stopping it from working?
Re: Custom resources
Posted: 04 Dec 2010, 00:47
by smoth
zwzsg wrote:GundamRTS had custom resource (basic/refined/exotic, plus the power supply har), but don't rush for it as GundamRTS is not compatible with current Spring.
SUP!?!
Re: Custom resources
Posted: 04 Dec 2010, 02:50
by knorke
oh yes, sorry.
kalda341 wrote:Can you see anything that might be stopping it from working?
something about Spring.GetSideData got me confused..did not return parameters in order i expected or it was stupidly set up in the mod i tested with. did not feel like hunting that down sorry :/
smoth:
he just wants to replace the "metal" name with something else if i understood correctly.
Re: Custom resources
Posted: 04 Dec 2010, 09:40
by kalda341
I have added this, but for some reason it won't work:
Code: Select all
local team = Spring.GetSideData()
if team = "MACROBES" then
resourcea = carbon
resourceb = energy
end
Re: Custom resources
Posted: 04 Dec 2010, 10:40
by kalda341
Don't worry, it needed a ==.
Re: Custom resources
Posted: 04 Dec 2010, 10:44
by kalda341
Code: Select all
glText(resourcea.. metal, vsx/2, vsy-UIscale*1.5, UIscale*1.5, "oc")
is the problem.
Re: Custom resources
Posted: 04 Dec 2010, 16:28
by knorke
GetSideData() expects a sideID, like this:
sideID = some other stuff to find the correct sideID
local team = Spring.GetSideData(sideID)
Code: Select all
resourcea = "Carbon"
resourceb = "Energy"
Needs " " because that means it is a string.
Code: Select all
glText(resourcea .. ": " .. metal, vsx/2, vsy-UIscale*1.5, UIscale*1.5, "oc")
Re: Custom resources
Posted: 04 Dec 2010, 19:56
by kalda341
Of course. I am fairly new to lua and quite often get it mixed up with python and basic. Does anyone know how to get the sideid?
Re: Custom resources
Posted: 04 Dec 2010, 20:16
by kalda341
Actually, I think sideName is more applicable. Does anyone know how it functions?