Help needed with really simple scripts

Talk about creating Grimrock 1 levels and mods here. Warning: forum contains spoilers!
User avatar
Merethif
Posts: 274
Joined: Tue Apr 24, 2012 1:58 pm
Location: Poland

Help needed with really simple scripts

Post by Merethif »

The first question is probably very silly but please mind that I'm at the very beginning of script using, not to even mention script making.
So I've been trying to use one of the scripts from repository but I fail every time and I really don't know what am I doing wrong.
Generally I'm looking for a teleporter activated with an item being in inventory (like the one with Fighter's Challenge and Sword of Nex).
I've found several suitable scripts in repository (viewtopic.php?p=31831#p31831), but for example when I'm using first one I get error: 'then' expected near '=' X after the line: if item.name = "blueberry_pie" then. With the script from next post I got: attempt to call method 'getItem' (a nil value) X after line: local itemObj = champion:getItem(i).

The second question is about stacks of items in container in alcove.
For example if I got:
SpoilerShow

Code: Select all

local merethifsack = spawn("sack")
   merethifsack:addItem(spawn("sling"))
   merethifsack:addItem(spawn("rock"))
   merethifsack:addItem(spawn("rock"))
   merethifsack:addItem(spawn("rock"))
merethifsackAlcove:addItem(merethifsack)
Is there an option to spawn all those three rocks in single container slot?
User avatar
Komag
Posts: 3659
Joined: Sat Jul 28, 2012 4:55 pm
Location: Boston, USA

Re: Help needed with really simple scripts

Post by Komag »

you can add the stack count right on the same line, before the end )

error "then", you need == not =

(typing on phone)
Finished Dungeons - complete mods to play
User avatar
crisman
Posts: 305
Joined: Sat Sep 22, 2012 9:23 pm
Location: Italy

Re: Help needed with really simple scripts

Post by crisman »

you should try with this:

Code: Select all

local itemObj = champion:getItem(i)
if itemObj ~= nil then
*do whatever you want*
end
for the rocks there is a setStack(n) script
let me know!
User avatar
Merethif
Posts: 274
Joined: Tue Apr 24, 2012 1:58 pm
Location: Poland

Re: Help needed with really simple scripts

Post by Merethif »

Thanks for help. Sadly, due to my lack of knowledge I'm still unable to solve both issues.

I'm not sure how to add the stack thing.
sack:addItem(spawn("rock")setStack(2)) doesn't work
merethifsack:addItem(spawn("rock")setStackSize(2)) neither.

As for the other script, adding == instead of = seems to be fine since there's no more error message, but still it doesn't work (nothing happens when I step on plate that activates script with item in backpack). Also I must admit I'm not sure where should I put those lines you provided crisman. I suppose I may need a step by step guide for dummies (with helpful comments and such).
User avatar
crisman
Posts: 305
Joined: Sat Sep 22, 2012 9:23 pm
Location: Italy

Re: Help needed with really simple scripts

Post by crisman »

my bad, the correct script is getStackSize(n)

The correct script is something like this:
SpoilerShow

Code: Select all

local sack1 = spawn("sack")
sack1:addItem(spawn("rock"):setStackSize(3))
alcove:addItem(sack1)
User avatar
Merethif
Posts: 274
Joined: Tue Apr 24, 2012 1:58 pm
Location: Poland

Re: Help needed with really simple scripts

Post by Merethif »

crisman wrote:my bad, the correct script is getStackSize(n)

The correct script is something like this:
SpoilerShow

Code: Select all

local sack1 = spawn("sack")
sack1:addItem(spawn("rock"):setStackSize(3))
alcove:addItem(sack1)
Ok, so I was experimenting with setStackSize(n), putting different combination with it in different places, when all I've needed was a colon! There's nothing more enlightening then a good example.
Thanks a lot! :-D

Probably I'm missing something as obvious as colon in the other one as well.
User avatar
crisman
Posts: 305
Joined: Sat Sep 22, 2012 9:23 pm
Location: Italy

Re: Help needed with really simple scripts

Post by crisman »

Columns are just a way to tidy up the code a bit, if you want you can write it in a single row :D
(this is untested, some parenthesis may be missing or in wrong place)
alcove:addItem(spawn("sack"):(addItem(spawn("rock"):setStackSize(3))))

For the other code: I'd like to see, if possible, what you wish to do with champion:getItem(i)
--maybe it's just because you need party:getChampion(a):getItem(i)?
User avatar
Komag
Posts: 3659
Joined: Sat Jul 28, 2012 4:55 pm
Location: Boston, USA

Re: Help needed with really simple scripts

Post by Komag »

here is another example:

Code: Select all

local alchSack = spawn("sack")
alchSack:addItem(spawn("scroll"):setScrollText("Potion of Healing\n1 flask\n1 tar bead\n\nAntivenom\n1 flask\n1 cave nettle"))
alchSack:addItem(spawn("mortar"))
alchSack:addItem(spawn("flask"))
alchSack:addItem(spawn("flask"))
alchSack:addItem(spawn("tar_bead"):setStackSize(2))
alchSack:addItem(spawn("cave_nettle"))
alchAlcove:addItem(alchSack)
Finished Dungeons - complete mods to play
User avatar
Merethif
Posts: 274
Joined: Tue Apr 24, 2012 1:58 pm
Location: Poland

Re: Help needed with really simple scripts

Post by Merethif »

crisman wrote:For the other code: I'd like to see, if possible, what you wish to do with champion:getItem(i)
--maybe it's just because you need party:getChampion(a):getItem(i)?
I've been mostly coping scripts from repository and paste them into single script_entity (the entity is activated by a hidden plate with deactivated teleporter, named entrance_teleporter on the same tile). For example something like this :
SpoilerShow

Code: Select all

    function checkForItemParty(item)
       local i = 1
       repeat
          if checkForItem(party:getChampion(i), item)
             then return true
          end
          i = i + 1
       until i == 5
       return false
    end

    function checkForItem(champion, item)
       local i = 1
       repeat
          local itemObj = champion:getItem(i)
          if itemObj ~= nil then
             if itemObj.name == item
                then return true
             end
          end
          i = i+1
          until i == 32
       return false
    end

    if checkForItemParty("entrance_scroll")
      then
      entrance_teleporter:activate()
      else
     entrance_teleporter:deactivate()
      end
end
    end
And thanks Komag for another script - the more sacks in alcoves, the better :-D
User avatar
crisman
Posts: 305
Joined: Sat Sep 22, 2012 9:23 pm
Location: Italy

Re: Help needed with really simple scripts

Post by crisman »

The script you gave me it's working fine, just had to tweak a little bit - delete last end and put function check() between last if and the end above it. Anyway, I'd like to give you a much simpler code for that:
SpoilerShow

Code: Select all

function check()
for i = 1, 4 do
	for j = 1, 31 do
	local itemObj = party:getChampion(i):getItem(j)
		if itemObj ~= nil then
			if itemObj.name == "rock" then
				teleporter_1:activate()
			end
		end
	end
end
end
It does not deactivate the teleporter though, it will only need a couple more strings.
Post Reply