Return to Inventory

Talk about creating Grimrock 1 levels and mods here. Warning: forum contains spoilers!
User avatar
Emciel
Posts: 34
Joined: Fri Sep 14, 2012 2:19 am

Re: Return to Inventory

Post by Emciel »

ahhhh i see how you can make insertItem work now =)
therefore i present 100% working (i'm sure you can find some problem if you look xD) remove item and return item to inventory script!!!

- create a timer and a script entity
- set the timer to running and connect it on activate to the checkTorch() function

Code: Select all

function itemCheck(item)
	for champ = 1,4 do
	for slot = 7,8 do
		x = party:getChampion(champ):getItem(slot)
		if x ~= nil then
		if x.name == item then
            party:getChampion(champ):removeItem(slot)
			print("item removed")
			returnItem(item)
		end
        end   
	end    
	end   
end

function returnItem(item)
	local itemReturned = false
	for slot = 11,32 do
	for champ = 1,4 do
		if itemReturned == false then
			if slot < 32 then
				if party:getChampion(champ):getItem(slot) == nil then
					print("item returned")
					party:getChampion(champ):insertItem(slot,x)
					itemReturned = true
				end
			else
				spawn(item,player.level,player.x,player.y,player.facing)
			end
			
		end
	end
	end
end

function checkTorch()
	itemCheck("torch")
end

if you guys want to check it out that'd be good, then we can add it to the useful scripts repository =) (my first entry ^_^)
Last edited by Emciel on Thu Sep 20, 2012 8:15 pm, edited 2 times in total.
User avatar
Xzalander
Posts: 62
Joined: Thu Sep 13, 2012 1:27 pm
Location: Yorkshire, United Kingdom

Re: Return to Inventory

Post by Xzalander »

Kudos Emciel. Much more elegant than my attempt :P

Oh god you've created it perfectly. I'm not kidding. I even tried overloading one character with notes and he just passed the torch onto character #2. So I overloaded all of them with notes.

It drops to the floor.

I'd try to fill a floor tile but I don't think you can.... Excellent dude!

Ah wait sorry rain parade...

second try at overloading ALL the characters, and it crashed.

Code: Select all

spawn(item,player.level,player.x,player.y,player.facing)
"Attempt to index a global 'player' (nil value)"

edit:

Just reloaded the scenario and its done it again;

The issue is on that spawn code line; where it drops the item to the floor. I'm guessing the first time I misclicked or something?

Although as it stands it is very robust, I doubt anyone will ever manage to fill ALL their inventory slots at once.
Last edited by Xzalander on Thu Sep 20, 2012 8:22 pm, edited 4 times in total.
User avatar
Montis
Posts: 340
Joined: Sun Apr 15, 2012 1:25 am
Location: Grimrock II 2nd playthrough (hard/oldschool)

Re: Return to Inventory

Post by Montis »

"-- Disabled due to bug"?
What is? :)

Anyway, nice work. I wanted to comment before that you shouldn't include the "empty slot search" in every loop since you only need it when actually finding an empty slot for the torch. But now you seem to have integrated that for yourself already, good job.
I think the last touch would be to print a message like "No torchlight allowed" or something like that so the player will know that he can find the torch in his inventory.

for the error: it should be party.level etc, not player.level
When destiny calls, the chosen have no choice.

My completed dungeon (LoG1): Hypercube
User avatar
Malveus
Posts: 25
Joined: Tue Jul 17, 2012 5:03 am
Location: Louisville, KY

Re: Return to Inventory

Post by Malveus »

With a tiny bit of tweaking, I could make a cursed item with this code that not only returns the item to the champion's bag, but duplicates itself in the process , right?. Picture a 5 pound tribble.Or a 50 pound one. Prepare to get overburdened as a new way of tormenting adventurers.
User avatar
Montis
Posts: 340
Joined: Sun Apr 15, 2012 1:25 am
Location: Grimrock II 2nd playthrough (hard/oldschool)

Re: Return to Inventory

Post by Montis »

Ah yeah, one additional thing: I would suggest that you only use the inventory of the character that actually holds the torch, so you would need to forward that variable as a parameter.
The following should work: (yet untested)

Code: Select all

function itemCheck(item)
       for champ = 1,4 do
       for slot = 7,8 do
          x = party:getChampion(champ):getItem(slot)
          if x ~= nil then
          if x.name == item then
                party:getChampion(champ):removeItem(slot)
             print("item removed")
             returnItem(item,champ)
          end
            end   
       end   
       end   
    end

    function returnItem(item,champ)
       for slot = 11,32 do
             if slot < 32 then
                if party:getChampion(champ):getItem(slot) == nil then
                   print(item.." returned")
                   party:getChampion(champ):insertItem(slot,x)
                   break
                end
             else
                spawn(item,party.level,party.x,party.y,party.facing)
             end
             
       end
    end

    function checkTorch()
       itemCheck("torch")
    end
Last edited by Montis on Thu Sep 20, 2012 8:28 pm, edited 1 time in total.
When destiny calls, the chosen have no choice.

My completed dungeon (LoG1): Hypercube
User avatar
Xzalander
Posts: 62
Joined: Thu Sep 13, 2012 1:27 pm
Location: Yorkshire, United Kingdom

Re: Return to Inventory

Post by Xzalander »

Now that I fixed the player/party bug. Ive found another.

Torch Multiplication!

It takes the one torch off you, but then drops 4 (1 for each player).

If it takes four off you, it drops 8.

If it takes 8 off you it places 32.

Conditions:

All inventory full. Floor space empty.
User avatar
Montis
Posts: 340
Joined: Sun Apr 15, 2012 1:25 am
Location: Grimrock II 2nd playthrough (hard/oldschool)

Re: Return to Inventory

Post by Montis »

Xzalander wrote:Now that I fixed the player/party bug. Ive found another.

Torch Multiplication!

It takes the one torch off you, but then drops 4 (1 for each player).

If it takes four off you, it drops 8.

If it takes 8 off you it places 32.

Conditions:

All inventory full. Floor space empty.
lol
try it with my updated script, that should work if I didn't make a mistake with removing one "end" too much/less.
When destiny calls, the chosen have no choice.

My completed dungeon (LoG1): Hypercube
User avatar
Xzalander
Posts: 62
Joined: Thu Sep 13, 2012 1:27 pm
Location: Yorkshire, United Kingdom

Re: Return to Inventory

Post by Xzalander »

Yup Montis that fixed it.

Great job guys! You all well and truly :ugeek: 'd it :D
User avatar
Emciel
Posts: 34
Joined: Fri Sep 14, 2012 2:19 am

Re: Return to Inventory

Post by Emciel »

following all comments i've revised the script =D
thanks for the help guys!

Code: Select all

function itemCheck(item)
	-- checks for the item in champions hands
	for champ = 1,4 do
	for slot = 7,8 do
		x = party:getChampion(champ):getItem(slot)
		if x ~= nil then
		if x.name == item then
			-- if found it is removed and the returnItem function is triggered
            party:getChampion(champ):removeItem(slot)
			print("item removed")
			returnItem(item,champ)
		end
        end   
	end    
	end   
end

function returnItem(item,champ)
	-- checks backpacks for empty slot
	for slot = 11,32 do
			if slot < 32 then
				if party:getChampion(champ):getItem(slot) == nil then
					-- once found, the item is placed in a slot and the player is told where
					print("item returned")
					party:getChampion(champ):insertItem(slot,x)
					hudPrint("The torch is too hot to hold,\nso is put into "..party:getChampion(champ):getName().."'s bag.")
					break
				end
			else
				-- if no slots are empty, the item is dropped
				spawn(item,party.level,party.x,party.y,party.facing)
				hudPrint("The torch is too hot to hold,\nand drops to the floor")
				break
			end
	end
end

function checkTorch()
	itemCheck("torch")
end
User avatar
Xzalander
Posts: 62
Joined: Thu Sep 13, 2012 1:27 pm
Location: Yorkshire, United Kingdom

Re: Return to Inventory

Post by Xzalander »

using your revised script I've added a couple of things:

1. Flavoured the text up a bit.

2. Added a sound

Code: Select all

function itemCheck(item)
   -- checks for the item in champions hands
   for champ = 1,4 do
   for slot = 7,8 do
      x = party:getChampion(champ):getItem(slot)
      if x ~= nil then
      if x.name == item then
         -- if found it is removed and the returnItem function is triggered
            party:getChampion(champ):removeItem(slot)
         print("item removed")
         returnItem(item,champ)
      end
        end   
   end    
   end   
end

function returnItem(item,champ)
   -- checks backpacks for empty slot
   for slot = 11,32 do
         if slot < 32 then
            if party:getChampion(champ):getItem(slot) == nil then
               -- once found, the item is placed in a slot and the player is told where
               print("item returned")
               party:getChampion(champ):insertItem(slot,x)
               hudPrint("The torch fizzles out, and a voice booms 'Scared of the Dark? You will be!!'\n Laughter echoes through the halls maniacally.\nIt  is put into "..party:getChampion(champ):getName().."'s bag." )
				playSound("lightning_bolt_hit")
               break
            end
         else
            -- if no slots are empty, the item is dropped
            spawn(item,party.level,party.x,party.y,party.facing)
            hudPrint("Your bags are full. The torch is dropped to the floor.")
            break
         end
   end
end

function checkTorch()
   itemCheck("torch")
end
Post Reply