• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • 🏆 Hive's 6th HD Modeling Contest: Mechanical is now open! Design and model a mechanical creature, mechanized animal, a futuristic robotic being, or anything else your imagination can tinker with! 📅 Submissions close on June 30, 2024. Don't miss this opportunity to let your creativity shine! Enter now and show us your mechanical masterpiece! 🔗 Click here to enter!

For loop item building system

Status
Not open for further replies.
Level 7
Joined
Jul 4, 2007
Messages
249
Hi, I'm making an item building system and everything works fine, it's just that it gives the wrong item for some reason I fail to see. It seems so obvious to me that it should work, but clearly I'm wrong. Can someone please help me with this?:D
  • Build Items Variables
    • Events
      • Time - Elapsed game time is 0.00 seconds
    • Conditions
    • Actions
      • -------- -------------------------------------------------------------------------------------- --------
      • -------- This is the finishing product of the recipe --------
      • Set Items_BuildItem[1] = |cFFFF9E00Book of the Ancients|r
      • -------- --------
      • Set Items_IngredientsAmount[1] = 4
      • Set Items_BuildIntStart[1] = 1
      • -------- --------
      • Set Items_Ingredients[1] = |cFF14CD00Robin's Hood|r
      • Set Items_Ingredients[2] = |cFF14CD00Talisman of Agility|r
      • Set Items_Ingredients[3] = |cFF14CD00Maul of Strength|r
      • Set Items_Ingredients[4] = |cFFFFCC99Recipe: Book of the Ancients|r
      • -------- -------------------------------------------------------------------------------------- --------
      • Set Items_BuildItem[2] = |cFFFF9E00Heart of Vitality|r
      • -------- --------
      • Set Items_IngredientsAmount[2] = 4
      • Set Items_BuildIntStart[2] = 5
      • -------- --------
      • Set Items_Ingredients[5] = |cFF14CD00Robin's Hood|r
      • Set Items_Ingredients[6] = |cFF14CD00Talisman of Agility|r
      • Set Items_Ingredients[7] = |cFF14CD00Periapt of Vitality|r
      • Set Items_Ingredients[8] = |cFFFFCC99Recipe: Heart of Vitality|r
      • Set Items_IngredientNumber[6] = 2
      • -------- -------------------------------------------------------------------------------------- --------
      • Set Items_BuildItem[3] = |cFFFF9E00Holzpfeife|r
      • -------- --------
      • Set Items_IngredientsAmount[3] = 4
      • Set Items_BuildIntStart[3] = 9
      • -------- --------
      • Set Items_Ingredients[9] = |cFF14CD00Robin's Hood|r
      • Set Items_Ingredients[10] = |cFF14CD00Manteau Doux|r
      • Set Items_Ingredients[11] = |cFF14CD00Claws of Attack|r
      • Set Items_Ingredients[12] = |cFFFFCC99Recipe: Holzpfeife|r
      • -------- -------------------------------------------------------------------------------------- --------
      • -------- --------
      • -------- This is the number of buildable items --------
      • Set Items_BuildableAmount = 3
So I tried to add another item to the list, but it still just creates the first item (Items_BuildItem[1], Book of the Ancients), even though all the ingredients are correct. So when it reads integer A in the other places that I'm referring it to, it's the correct number. But when I use Hero - "Create Items_Build[(Integer A)]" it's always 1.
  • Build Items
    • Events
      • Unit - A unit Acquires an item
    • Conditions
    • Actions
      • Set unit = (Hero manipulating item)
      • Set item = (Item being manipulated)
      • -------- From 1 to last item --------
      • For each (Integer A) from 1 to Items_BuildableAmount, do (Actions)
        • Loop - Actions
          • -------- Set end ingredient --------
          • Set int = (Items_BuildIntStart[(Integer A)] + (Items_IngredientsAmount[(Integer A)] - 1))
          • For each (Integer B) from Items_BuildIntStart[(Integer A)] to int, do (Actions)
            • Loop - Actions
              • -------- If acquired item is an ingredient --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Item-type of item) Equal to Items_Ingredients[(Integer B)]
                • Then - Actions
                  • -------- Check for all ingredients --------
                  • Set int3 = 0
                  • For each (Integer Integer_C) from Items_BuildIntStart[(Integer A)] to int, do (Actions)
                    • Loop - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (unit has an item of type Items_Ingredients[Integer_C]) Equal to True
                        • Then - Actions
                          • Set int2 = 0
                          • For each (Integer Integer_D) from 1 to 6, do (Actions)
                            • Loop - Actions
                              • -------- Count number of ingredients of type --------
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (Item-type of (Item carried by unit in slot Integer_D)) Equal to Items_Ingredients[Integer_C]
                                • Then - Actions
                                  • Set int2 = (int2 + 1)
                                • Else - Actions
                          • -------- Count how many ingredients have correct number of items --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • int2 Greater than or equal to Items_IngredientNumber[Integer_C]
                            • Then - Actions
                              • Set int3 = (int3 + 1)
                            • Else - Actions
                        • Else - Actions
                  • -------- If all ingredients have correct number of items --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • int3 Equal to Items_IngredientsAmount[(Integer A)]
                    • Then - Actions
                      • -------- Remove items and give new item --------
                      • For each (Integer Integer_C) from Items_BuildIntStart[(Integer A)] to int, do (Actions)
                        • Loop - Actions
                          • For each (Integer Integer_D) from 1 to Items_IngredientNumber[Integer_C], do (Actions)
                            • Loop - Actions
                              • Item - Remove (Item carried by unit of type Items_Ingredients[Integer_C])
                      • -------- This is where it gets weird with creating the item --------
                      • Hero - Create Items_Build[(Integer A)] and give it to unit
                      • Special Effect - Create a special effect attached to the origin of unit using Abilities\Spells\Items\AIlm\AIlmTarget.mdl
                      • Special Effect - Destroy (Last created special effect)
                    • Else - Actions
                • Else - Actions
 
Last edited:
Level 9
Joined
Jul 30, 2018
Messages
445
So basically you are trying to remove the ingredient items and then create a new item those ingredients form? Seems rather complicated, in my opinion, to run so many loops inside loops. Maybe just run one loop for each ingredient separately and and then check if all the ingredient loops return true, then remove the items and create the new item. Sometimes it just makes everything harder to try to make everything in one trigger (or even in one loop).

Here's my approach: (though, not entirely sure this achieves what you're are trying to do)
  • Create Mask of Death
    • Events
      • Unit - A unit Acquires an item
    • Conditions
      • Or - Any (Conditions) are true
        • Conditions
          • (Item-type of (Item being manipulated)) Equal to Ingredient 1
          • (Item-type of (Item being manipulated)) Equal to Ingredient 2
          • (Item-type of (Item being manipulated)) Equal to Ingredient 3
    • Actions
      • Set Hero = (Hero manipulating item)
      • Set HasIngredient1 = False
      • Set HasIngredient2 = False
      • Set HasIngredient3 = False
      • For each (Integer A) from 1 to 6, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Item-type of (Item carried by Hero in slot A)) Equal to Ingredient 1
            • Then - Actions
              • Set HasIngredient1 = True
              • Set Ingredient1SlotNumber = A
              • Custom script: exitwhen true
            • Else - Actions
      • For each (Integer B) from 1 to 6, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Item-type of (Item carried by Hero in slot B)) Equal to Ingredient 2
            • Then - Actions
              • Set HasIngredient2 = True
              • Set Ingredient2SlotNumber = B
              • Custom script: exitwhen true
            • Else - Actions
      • For each (Integer C) from 1 to 6, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Item-type of (Item carried by Hero in slot C)) Equal to Ingredient 3
            • Then - Actions
              • Set HasIngredient3 = True
              • Set Ingredient3SlotNumber = C
              • Custom script: exitwhen true
            • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • HasIngredient1 Equal to True
          • HasIngredient2 Equal to True
          • HasIngredient3 Equal to True
        • Then - Actions
          • Item - Remove (Item carried by Hero in slot Ingredient1SlotNumber)
          • Item - Remove (Item carried by Hero in slot Ingredient2SlotNumber)
          • Item - Remove (Item carried by Hero in slot Ingredient3SlotNumber)
          • Hero - Create Mask of Death and give it to Hero
        • Else - Actions
If you really want to get fancy, you could wrap those three loops in one loop, but I thought it's unnecessary. Unless you have dozens of items to create this way, then it might save some time to make those variables arrays and run those ingredient loops in another loop for each ingredient.
 
Last edited:
Level 7
Joined
Jul 4, 2007
Messages
249
So basically you are trying to remove the ingredient items and then create a new item those ingredients form? Seems rather complicated, in my opinion, to run so many loops inside loops. Maybe just run one loop for each ingredient separately and and then check if all the ingredient loops return true, then remove the items and create the new item. Sometimes it just makes everything harder to try to make everything in one trigger (or even in one loop).

Here's my approach: (though, not entirely sure this achieves what you're are trying to do)
  • Create Mask of Death
    • Events
      • Unit - A unit Acquires an item
    • Conditions
      • Or - Any (Conditions) are true
        • Conditions
          • (Item-type of (Item being manipulated)) Equal to Ingredient 1
          • (Item-type of (Item being manipulated)) Equal to Ingredient 2
          • (Item-type of (Item being manipulated)) Equal to Ingredient 3
    • Actions
      • Set Hero = (Hero manipulating item)
      • Set HasIngredient1 = False
      • Set HasIngredient2 = False
      • Set HasIngredient3 = False
      • For each (Integer A) from 1 to 6, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Item-type of (Item carried by Hero in slot A)) Equal to Ingredient 1
            • Then - Actions
              • Set HasIngredient1 = True
              • Set Ingredient1SlotNumber = A
              • Custom script: exitwhen true
            • Else - Actions
      • For each (Integer B) from 1 to 6, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Item-type of (Item carried by Hero in slot B)) Equal to Ingredient 2
            • Then - Actions
              • Set HasIngredient2 = True
              • Set Ingredient2SlotNumber = B
              • Custom script: exitwhen true
            • Else - Actions
      • For each (Integer C) from 1 to 6, do (Actions)
        • Loop - Actions
          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
            • If - Conditions
              • (Item-type of (Item carried by Hero in slot C)) Equal to Ingredient 3
            • Then - Actions
              • Set HasIngredient3 = True
              • Set Ingredient3SlotNumber = C
              • Custom script: exitwhen true
            • Else - Actions
      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
        • If - Conditions
          • HasIngredient1 Equal to True
          • HasIngredient2 Equal to True
          • HasIngredient3 Equal to True
        • Then - Actions
          • Item - Remove (Item carried by Hero in slot Ingredient1SlotNumber)
          • Item - Remove (Item carried by Hero in slot Ingredient2SlotNumber)
          • Item - Remove (Item carried by Hero in slot Ingredient3SlotNumber)
          • Hero - Create Mask of Death and give it to Hero
        • Else - Actions
If you really want to get fancy, you could wrap those three loops in one loop, but I thought it's unnecessary. Unless you have dozens of items to create this way, then it might save some time to make those variables arrays and run those ingredient loops in another loop for each ingredient.
Thanks for your answer and for the effort you put down, however I've solved the problem and it was actually a quite stupid thing that messed it up.
What happend was that when I removed the ingredient items in the end, since one of them was triggering the trigger and was removed the integer A went corrupt for some reason. So I just saved the value integer A in a new variable right before removing the items and then used that variable instead and it works perfectly now.
So this is the final trigger (if anyone wants to use it)
  • Variable examples
    • Events
      • Time - Elapsed game time is 0.00 seconds
    • Conditions
    • Actions
      • -------- -------------------------------------------------------------------------------------- --------
      • Set Items_BuildItem[1] = |cFFFF9E00Book of the Ancients|r
      • -------- --------
      • Set Items_IngredientsAmount[1] = 4
      • -------- --------
      • Set Items_Ingredients[1] = |cFF14CD00Robin's Hood|r
      • Set Items_Ingredients[2] = |cFF14CD00Talisman of Agility|r
      • Set Items_Ingredients[3] = |cFF14CD00Maul of Strength|r
      • Set Items_Ingredients[4] = |cFFFFCC99Recipe: Book of the Ancients|r
      • -------- -------------------------------------------------------------------------------------- --------
      • Set Items_BuildItem[2] = |cFFFF9E00Heart of Vitality|r
      • -------- --------
      • Set Items_IngredientsAmount[2] = 4
      • -------- --------
      • Set Items_Ingredients[5] = |cFF14CD00Robin's Hood|r
      • Set Items_Ingredients[6] = |cFF14CD00Talisman of Agility|r
      • Set Items_Ingredients[7] = |cFF14CD00Periapt of Vitality|r
      • Set Items_Ingredients[8] = |cFFFFCC99Recipe: Heart of Vitality|r
      • Set Items_IngredientNumber[6] = 2
      • -------- -------------------------------------------------------------------------------------- --------
      • Set Items_BuildItem[3] = |cFFFF9E00Holzpfeife|r
      • -------- --------
      • Set Items_IngredientsAmount[3] = 4
      • -------- --------
      • Set Items_Ingredients[9] = |cFF14CD00Robin's Hood|r
      • Set Items_Ingredients[10] = |cFF14CD00Manteau Doux|r
      • Set Items_Ingredients[11] = |cFF14CD00Claws of Attack|r
      • Set Items_Ingredients[12] = |cFFFFCC99Recipe: Holzpfeife|r
      • -------- -------------------------------------------------------------------------------------- --------
      • -------- --------
      • Set Items_BuildableAmount = 3
  • Build Items
    • Events
      • Unit - A unit Acquires an item
    • Conditions
    • Actions
      • Set unit = (Hero manipulating item)
      • Set item = (Item being manipulated)
      • Set Items_BuildStartInt = 1
      • -------- From 1 to last item --------
      • For each (Integer A) from 1 to Items_BuildableAmount, do (Actions)
        • Loop - Actions
          • -------- Set end ingredient --------
          • Set int = (Items_BuildStartInt + (Items_IngredientsAmount[(Integer A)] - 1))
          • For each (Integer B) from Items_BuildStartInt to int, do (Actions)
            • Loop - Actions
              • -------- If acquired item is an ingredient --------
              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                • If - Conditions
                  • (Item-type of item) Equal to Items_Ingredients[(Integer B)]
                • Then - Actions
                  • -------- Check for all ingredients --------
                  • Set int3 = 0
                  • -------- int3 = correct ingredients with correct amount --------
                  • For each (Integer Integer_C) from Items_BuildStartInt to int, do (Actions)
                    • Loop - Actions
                      • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                        • If - Conditions
                          • (unit has an item of type Items_Ingredients[Integer_C]) Equal to True
                        • Then - Actions
                          • Set int2 = 0
                          • -------- int2 = Count number of ingredients of type --------
                          • For each (Integer Integer_D) from 1 to 6, do (Actions)
                            • Loop - Actions
                              • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                                • If - Conditions
                                  • (Item-type of (Item carried by unit in slot Integer_D)) Equal to Items_Ingredients[Integer_C]
                                • Then - Actions
                                  • Set int2 = (int2 + 1)
                                • Else - Actions
                          • -------- Count how many ingredients have correct number of items --------
                          • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                            • If - Conditions
                              • int2 Greater than or equal to Items_IngredientNumber[Integer_C]
                            • Then - Actions
                              • Set int3 = (int3 + 1)
                            • Else - Actions
                        • Else - Actions
                  • -------- If all ingredients have correct number of items --------
                  • If (All Conditions are True) then do (Then Actions) else do (Else Actions)
                    • If - Conditions
                      • int3 Equal to Items_IngredientsAmount[(Integer A)]
                    • Then - Actions
                      • Set int2 = (Integer A)
                      • Game - Display to (All players) the text: (String(int2))
                      • -------- Remove items and give new item --------
                      • For each (Integer Integer_C) from Items_BuildStartInt to int, do (Actions)
                        • Loop - Actions
                          • For each (Integer Integer_D) from 1 to Items_IngredientNumber[Integer_C], do (Actions)
                            • Loop - Actions
                              • Item - Remove (Item carried by unit of type Items_Ingredients[Integer_C])
                      • Hero - Create Items_BuildItem[int2] and give it to unit
                      • Special Effect - Create a special effect attached to the origin of unit using Abilities\Spells\Items\AIlm\AIlmTarget.mdl
                      • Special Effect - Destroy (Last created special effect)
                      • Skip remaining actions
                    • Else - Actions
                • Else - Actions
          • Set Items_BuildStartInt = (Items_BuildStartInt + Items_IngredientsAmount[(Integer A)])
 
Last edited:
Level 39
Joined
Feb 27, 2007
Messages
5,034
It doesn't get corrupted; giving the unit the item causes the trigger to run again instantly before the first time finishes. This causes the start/end and current value of the Integer A global to be altered. All you needed to do was disable the trigger before creating & giving the item, then enable it again after.
 
Level 7
Joined
Jul 4, 2007
Messages
249
giving the unit the item causes the trigger to run again instantly before the first time finishes.
What do you mean like while the item is being given it is being changed because the trigger runs again? Haven't it already chosen what item to create before creating it?
 
Level 39
Joined
Feb 27, 2007
Messages
5,034
I'm not talking about the item. It changes the value of Integer A and the start/end variables for the loop.
  • Events
    • Map Initialization
  • Conditions
  • Actions
    • For each (Integer A) from 1 to 10 do (Actions)
      • Loop - Actions
        • Game - Display to (All players) the text ("First: " +String(Integer A))
        • Unit - Create 1 dummy at <somewhere>
  • Events
    • Unit - A unit enters (Playable map area)
  • Conditions
  • Actions
    • For each (Integer A) from 3 to 5 do (Actions)
      • Loop - Actions
        • Game - Display to (All players) the text ("Second: " +String(Integer A))
The above triggers will produce the following output:
First: 1
Second: 3
Second: 4
Second: 5

Because once the inner loop runs the value of int A and its exit bounds are now both 5. When checked by the first loop the second time it runs through it will see if 5 >= 5 and then exit.
 
Level 7
Joined
Jul 4, 2007
Messages
249
I'm not talking about the item. It changes the value of Integer A and the start/end variables for the loop.
  • Events
    • Map Initialization
  • Conditions
  • Actions
    • For each (Integer A) from 1 to 10 do (Actions)
      • Loop - Actions
        • Game - Display to (All players) the text ("First: " +String(Integer A))
        • Unit - Create 1 dummy at <somewhere>
  • Events
    • Unit - A unit enters (Playable map area)
  • Conditions
  • Actions
    • For each (Integer A) from 3 to 5 do (Actions)
      • Loop - Actions
        • Game - Display to (All players) the text ("Second: " +String(Integer A))
The above triggers will produce the following output:
I don't quite understand what you're saying, but you mean that I should do like this?
  • Trigger - Turn off (This trigger)
  • Hero - Create Items_BuildItem[Integer A] and give it to unit
  • Trigger - Turn on (This trigger)
Because I've tried this and it's not working, the problem comes when I remove the items not when I add the new one
 
Level 39
Joined
Feb 27, 2007
Messages
5,034
Yes that's what I meant. But apparently you have a trigger running off of a "Unit loses an item" event which uses the Integer A variable. That's the one you would need to disable but the way you have done it is probably without bugs. To be sure you would use the "for each integer <variable>" variant instead of the Int A or Int B loop in the "loses item" trigger.
 
Level 7
Joined
Jul 4, 2007
Messages
249
Yes that's what I meant. But apparently you have a trigger running off of a "Unit loses an item" event which uses the Integer A variable. That's the one you would need to disable but the way you have done it is probably without bugs. To be sure you would use the "for each integer <variable>" variant instead of the Int A or Int B loop in the "loses item" trigger.
Ohh I see, I didn't think of that! Is it possible to make it a local variable? Because this might actually conflict with another trigger that I use for picking up items, also using Integer A. I haven't tried it yet though.
On second thought it should be fine, but it's still good to know if it's possible.
And btw thanks for clarifying this :D
 
Level 9
Joined
Jul 30, 2018
Messages
445
You can. Technically.

  • Actions
    • Custom script: local integer i = 1
    • Custom script: loop
    • Custom script: exitwhen i > 6 //or how many times ever you want the loop to run
    • Hero - Create Tome of Experience and give it to (Triggering unit)
    • -------- Do your actions here --------
    • Custom script: set i = i + 1
    • Custom script: endloop
Do note, however, that GUI triggers sometimes do pretty weird settings and create a lot of (unnecessary) functions, especially with conditions. Local variables only work inside their own function (hence, they are local), so if you find your triggers not working, you might want to check how it is formed in JASS. You can see this by selecting the trigger, then on the top bar Edit -> Convert to Custom Text. You can then undo it with Ctrl + Z.

That being said, though, I wouldn't recommend the approach I here presented: it can work in simple cases, but not ideal for most cases. I'd say either do the entire trigger in JASS or if you use GUI, always use a custom variable for each loop (there is no way to make local variables purely in GUI).
 
Last edited:
Level 7
Joined
Jul 4, 2007
Messages
249
You can. Technically.

  • Actions
    • Custom script: local integer i = 1
    • Custom script: loop
    • Custom script: exitwhen i > 6 //or how many times ever you want the loop to run
    • Hero - Create Tome of Experience and give it to (Triggering unit)
    • -------- Do your actions here --------
    • Custom script: set i = i + 1
    • Custom script: endloop
Do note, however, that GUI triggers sometimes do pretty weird settings and create a lot of (unnecessary) functions, especially with conditions. Local variables only work inside their own function (hence, they are local), so if you find your triggers not working, you might want to check how it is formed in JASS. You can see this by selecting the trigger, then on the top bar Edit -> Convert to Custom Text. You can then undo it with Ctrl + Z.

That being said, though, I wouldn't recommend the approach I here presented: it can work in simple cases, but not ideal for most cases. I'd say either do the entire trigger in JASS or if you use GUI, always use a custom variable for each loop (there is no way to make local variables purely in GUI).
Alright thanks for your answer.
Well as long as I'm not triggering something else in the trigger, like in this case, it should be fine right? Because I don't really feel like changing all the integer A's I'm using, there's quite a few of them.
 
Level 39
Joined
Feb 27, 2007
Messages
5,034
An easier solution than what Sabe did is to use a different variable in each trigger with the "for each integer <variable>". Or at least a different variable in the ones that might be run due to the effects of another trigger.
 
Level 9
Joined
Jul 30, 2018
Messages
445
I don't really feel like changing all the integer A's I'm using, there's quite a few of them.

That can be quite a work, but it's basically the easiest thing to do at this point, because those built-in Integer A's tend to conflict with each other. I usually play it safe and make a unique variable for each individual loop. It might not be necessary if you can be sure that the same variable cannot be used in another loop at the same, but I've found that it's just easier to always create a new variable than to start to investigating and finding which loops are conflicting, if I happened to run into problems later.



An easier solution than what Sabe did is to use a different variable in each trigger with the "for each integer <variable>".

I agree. I just wanted to be precise and directly answered his question whether it was possible to make local variables with GUI loops, but at the end of the post I did mention, that it's still not very viable option in reality.
 
Last edited:
Status
Not open for further replies.
Top