Functions - add, subtract

Get help using Construct 2

Post » Sat Jul 30, 2016 7:16 am

Hello Constructniacs! :D

As I work on my "Country Management" I have few issues with my projecct wwhat I'm solving right now. But there is one what I can't solve y myself and I'd like to hear some opinions of yours!

I'm using functions for buildings (Array XYZ for building costs and production per 2s) but I use also this array for Military layout (Soldier price, -gold per 2s, -food per 2s).

When I had only buildings, everything was fine. My GoldTX showed me CurrentGold & " Gold" & newline & array.At(1,GoldUp,1) & " Gold each " & TickForProd & " seconds"

When I create new conditions for Soldiers - 1 soldier cost 2 people, 20 gold and every TickForProd cost 20g and 15 food, my GoldTX show me NaN Gold and NaN food........ Any idea how to solve this?

Army script is now just this: System -> Army > 0 ->> Subtrac from tokenat(array.At(11,0,1+Army1),1,",") from CurrentGold ; Subtract from tokenat(Array.At(11,0,1),2,",") from Food
SoftWork Group Ltd

Co-founders:
Robert Matik (UK Division)
Lukas Zyrek (CZ Division)

07399443703 (UK Division)

International(at)softworkgroup.wtf - for basic questions and information
Office(at)softworkgroup.wtf - email for questions about team and proposals
B
16
S
5
G
1
Posts: 49
Reputation: 1,656

Post » Sat Jul 30, 2016 10:46 am

Tokenat returns a string. Cant substract/add from/to a string. Got to translate the string to a number first. With int().

No sure why you use a string for this in the array. And not sure why it has to be 3D.

For me, it is easyer to store numbers in the array. Like.

Store an ID on the X-axis that pairs with the house or the soldiier. So you know wich place on the X-axis is witch house or soldier.
Now, if we write the positions in the array as (a,b) .... (yes just a 2D array) ...
Then all values on the X-axis lay on positions .... (a = some ID, b = zero.)

Now 'b' represents a whole big world we can use.
Just note the 'b' positions down.
Lets say
position (ID,1) = price
position (ID,2) = buildtime
position (ID,3) = range
position (ID,4) = color

So storing the the range for soldier number 15 .... is easy as ...
Array > Set at XY(15,3) to Range

Retreiving the color for soldier number 12 ...
color = Array.at(12,4)

Hope this helps you.
B
33
S
18
G
28
Posts: 2,493
Reputation: 20,950

Post » Sat Jul 30, 2016 11:24 am

After I arrive from work I will explain :)
SoftWork Group Ltd

Co-founders:
Robert Matik (UK Division)
Lukas Zyrek (CZ Division)

07399443703 (UK Division)

International(at)softworkgroup.wtf - for basic questions and information
Office(at)softworkgroup.wtf - email for questions about team and proposals
B
16
S
5
G
1
Posts: 49
Reputation: 1,656

Post » Sat Jul 30, 2016 8:19 pm

Well, I use XYZ array because of this:

(1,0,0) means - 1 for Gold, 0 for level, 0 for info for production.

As example:
tokenat(Array.At(1,GoldUp,0),0,",")
tokenat(Array.At(1,GoldUp,0),1,",")
Is for Goldmine, depending on level cost - Like: Build GOLDMINE lvl 1, for 150 gold, 150 lumber.

And those zeros in (1,GoldUP,0) are for production per TickForProd - like 50 gold per 2s.

That's why I use Array. :) I don't have any experience with int() (Unfortunatuly). First, I have to read and learn something about that. :) I'm still new in this software but I want to learn everything what is necessary. :)
SoftWork Group Ltd

Co-founders:
Robert Matik (UK Division)
Lukas Zyrek (CZ Division)

07399443703 (UK Division)

International(at)softworkgroup.wtf - for basic questions and information
Office(at)softworkgroup.wtf - email for questions about team and proposals
B
16
S
5
G
1
Posts: 49
Reputation: 1,656

Post » Sat Jul 30, 2016 10:27 pm

Tokenat is used as follow:

tokenat(string, index, separator)
Return the Nth token from the string by separator.
For example, tokenat("apples|oranges|bananas", 1, "|") returns oranges.

So i suppose you store on the position (1,GoldUp,0) in the array a string like "50,gold,"
Now tokenat(Array.At(1,GoldUp,0),0,",") will return the string "50"
If it is not string or the string does not contain a "," then the tokenat is totaly useless. So i assume that is what you do.

Tot make calculations with the string "50", we need to convert it to a number. Int() is the way to do that.
So ... int("50") returns 50
or in general it is int(tokenat(Array.At(1,GoldUp,0),0,","))

But, you make it yourself very very very difficult.

If GoldUP = goldproduction/tick then the array needs as many positions on the Y-axis as the maxium ever producable gold.
Again (1,GoldUp,0) means no more then a position in the array. Position 1 on the x-axis, position GoldUp (wich can be zero but also 9999999999999999999)on the Y-axis, 0 on the Z-axis.
On that postion you can store a value. But those values you will never ever find back. Because GoldUp keeps gooing and gooing. All youre values are from one second to the other second on another place in the array.

It is ofcourse up to you to find a way to make that work. And maybe one day, when you have this working you can explain this to me again. (if i am still here)
In the mean time, i suggest to look at my suggestion again. Or take some Array tutorials if you dont beleive me, all fine for me.

Example ... GOLDMINE lvl 1, for 150 gold, 150 lumber ... and lets do it as you wish with a 3D array

Make a global variable with the name 'GoldMine' = 1
Make a global variable with the name 'Gold' = 1
Make a global variable with the name 'Lumber' = 2
I assume you have a variable 'level'.

Now store the values in the array.
Array > Set at XYZ(Goldmine,level,Gold) to 150
Array > Set at XYZ(Goldmine,level,Lumber) to 150

Retreive the values from the array.
BuildCostInGold (for a Goldmine) = Array.at(Goldmine,level,Gold)
BuildCostInLumber (for a Goldmine) = Array.at(Goldmine,level,Lumber)

(and ofcourse, if GoldUP > BuildCostInGold, build the thing, substract BuildCostInGold from GoldUP)

Okay now, lets do another building.
Make a global variable with the name ''RandDunit" = 2
Now store the values in the array.
Array > Set at XYZ(RandDunit,level,Gold) to 400
Array > Set at XYZ(RandDunit,level,Lumber) to 300

And so on ..............
As you see, the value of 'level' > you change. Meaning the values for different levels are stored on a different place in the array. And they can always be found back.
B
33
S
18
G
28
Posts: 2,493
Reputation: 20,950

Post » Sun Jul 31, 2016 7:25 am

I'm using those positions :
1-Goldmine
2-Lumbermill
3-Laboratory
11-Soldier1
12-Soldier2
13-Soldier3
21-GovBuilding1
22-Gov2
23-Gov3
31-Research1
32-Res2
33-Res3
Etc...

Those array positions are good for me and I know where is what. I just had question about adding resources per TickForProd (2 seconds) and if is possible to create subtract function what will subtract from current production and from stored resources.
SoftWork Group Ltd

Co-founders:
Robert Matik (UK Division)
Lukas Zyrek (CZ Division)

07399443703 (UK Division)

International(at)softworkgroup.wtf - for basic questions and information
Office(at)softworkgroup.wtf - email for questions about team and proposals
B
16
S
5
G
1
Posts: 49
Reputation: 1,656


Return to How do I....?

Who is online

Users browsing this forum: NN81, pmerineau and 28 guests