Page 1 of 2
Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 8:54 pm
by Torquemada
Hi I am currently trying to do the following:
- Put items on Pedestial1
- When correct items are placed on Pedestial1 they will be removed and the contents of Pedestial2 will be placed on Pedestial1
This is what I have currently:
Code: Select all
for i,v in pedestial1.surface:contents() do
v.go:destroyDelayed()
end
for i,v in pedestial2.surface:contents() do
v.go:destroyDelayed()
end
pedestial1.surface:addItem(spawn("some_item").item) -- Here I get Stack overflow when run
So basicly I am removing all items on Pedestial1 and Pedestial2 then spawning a new item that was on Pedestial2 and placing it on Pedestial1, however when I try to place the item (last line of the code) I get stack overflow error.
Is there perhaps a better way to clear the contents of a surface and moving an item from one to the next?
Re: Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 9:30 pm
by Pompidom
Is it a one time event?
Is the item that you're placing 1 specific item?
Does the placed item have to swap back afterwards?
If it doesn't need to be swapped back and it's a one time item, you can probably do it with 2 simple destroy - spawn scripts with a counter decrement activating the 2nd destroy and spawn on pedestal 2 script giving the illusion that the items swapped places.
It's clunky, but it might get the job done for now until someone can come up with something more advanced
What I usually do is make super simple scripts I already know.
Here is some code from my dungeon. Place skulls on pedestals and they appear on the wall, the counter decrement activates a counter that activates a 2nd script spawning the crown.
Code: Select all
function Quest2()
local s = g1_dark_temple_pedestal_1.surface
for _,e in s:contents() do
if e.go.name == "fancy_skull" then
e.go:destroy()
playSound("secret")
counter_2.counter:decrement()
ud_alcove_3.surface:addItem(spawn("fancy_skull").item)
end
end
end
Code: Select all
function Quest3()
local s = g1_dark_temple_pedestal_2.surface
for _,e in s:contents() do
if e.go.name == "fancy_skull" then
e.go:destroy()
playSound("secret")
counter_2.counter:decrement()
ud_alcove_6.surface:addItem(spawn("fancy_skull").item)
end
end
end
Code: Select all
function habba()
dm_surface_throne_1.surface:addItem(spawn("g1_treasure_golden_crown").item)
end
Screenshots included
https://ibb.co/e2K7PT
https://ibb.co/hrPcr8
Re: Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 9:45 pm
by Pompidom
This question actually just gave me the idea to make a trophy room where you turn in mythical treasures that will be displayed on pedestals in an animation while giving you rewards

Re: Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 10:11 pm
by Torquemada
It's a one time only but I need to destroy all the items I placed on the pedestial before the other item is moved to it.
I don't know why I get stack overflow error.
Re: Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 10:20 pm
by Pompidom
This can be perfectly be solved with my clunky script
Take my script,
make multiple
if e.go.name == things
that decrement a counter
then when the counter has decremented x times (x for the amount of specific items) that need to be placed.
But i'm definitely interested in a more advanced script.
Re: Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 11:01 pm
by kelly1111
Pompidom: in your screenshot. What are those 2 round things next to the throne?
Re: Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 11:02 pm
by Pompidom
g1_dark_temple_pedestal
They're placeholders and basically dropoff points for both skulls.
Just fix your patch and you can check out my mod yourself

Re: Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 11:16 pm
by Torquemada
Pompidom wrote: ↑Tue Jul 24, 2018 10:20 pm
This can be perfectly be solved with my clunky script
Take my script,
make multiple
if e.go.name == things
that decrement a counter
then when the counter has decremented x times (x for the amount of specific items) that need to be placed.
But i'm definitely interested in a more advanced script.
I think you are misunderstanding, the problem I am having is not activating the transition when correct items are placed, that I have solved, actually everything works as it should until in the final when I want to spawn the object that is on the other pedestal on the other one.
There were actually two things I wanted to know
1st. is there is better cleaner way to empty a surface like surface:emptyContents() or something like that or am I forced to use a loop and destroy each item, in that case I cannot use destroy() because that messes up the enumeration of the loop, that's why I use destroyDelayed(), although yours works because you are only destroying a single item.
2nd. why am I getting stack overflow when I spawn an item on the pedestal, doesn't happen if I do it before removing all previous items. Maybe I missed something simple.
Re: Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 11:23 pm
by Pompidom
The way I would solve it as a noob:
1st script that destroys all the items while decrementing a counter each time you have added the item.
When the counter has decremented to 0 , the counter will activate script 2, spawn the item that's displayed on pedestal 2 on pedestal 1.
2nd script simply destroys the item on pedestal 2
Re: Moving item from one pedestial to the next
Posted: Tue Jul 24, 2018 11:34 pm
by Pompidom
Code: Select all
function surfaceDestroy(surface, item)
for _,i in surface:contents() do
if i.go.name == item then
i.go:destroy()
return true
end
end
end
function checkHerbShop(alcove)
if surfaceDestroy( shop_herb_alcove.surface, "blue_gem") then
playSound("magic")
local herb = spawn("blooddrop_cap")
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("etherweed")
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("falconskyre")
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("mudwort")
shop_herb_alcove.surface:addItem(herb.item)
end
if surfaceDestroy( shop_herb_alcove.surface, "green_gem") then
playSound("magic")
local herb = spawn("blooddrop_cap")
herb.item:setStackSize(2)
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("etherweed")
herb.item:setStackSize(2)
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("falconskyre")
herb.item:setStackSize(2)
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("mudwort")
herb.item:setStackSize(2)
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("blackmoss")
shop_herb_alcove.surface:addItem(herb.item)
end
if surfaceDestroy( shop_herb_alcove.surface, "red_gem") then
playSound("magic")
local herb = spawn("blooddrop_cap")
herb.item:setStackSize(3)
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("etherweed")
herb.item:setStackSize(3)
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("falconskyre")
herb.item:setStackSize(3)
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("mudwort")
herb.item:setStackSize(3)
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("blackmoss")
herb.item:setStackSize(2)
shop_herb_alcove.surface:addItem(herb.item)
local herb = spawn("crystal_flower")
shop_herb_alcove.surface:addItem(herb.item)
end
end
This code accepts 3 different items. Taking some code from this script and combining with my script will solve your issues.