teleporter puzzle + pit puzzle

Ask for help about creating mods and scripts for Grimrock 2 or share your tips, scripts, tools and assets with other modders here. Warning: forum contains spoilers!
Post Reply
bongobeat
Posts: 1076
Joined: Thu May 16, 2013 5:58 pm
Location: France

teleporter puzzle + pit puzzle

Post by bongobeat »

Hello folks,

just asking if some experienced scripter can check these scripts:
it works well, but to be sure, maybe there is a better way or it should'nt be done that way:

it's both log1 script:

this one is activated by a timer, the timer activate/deactivate 7 teleporters one by one: after going trough this, a floor trigger call the second function, to desactivate all teleporters. (the timer is desactived with the floor trigger)
SpoilerShow

Code: Select all

spot = 1
function cycletele2()
  local tele = {ctele1,ctele2,ctele3,ctele4,
                ctele5,ctele6,ctele7}
  if spot == 1 then
    ctele1.controller:activate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end

if spot == 2 then
    ctele1.controller:deactivate()
	ctele2.controller:activate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end

if spot == 3 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:activate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end
	
if spot == 4 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:activate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end
	
if spot == 5 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:activate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end

if spot == 6 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:activate()
	ctele7.controller:deactivate()
	end

if spot == 7 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:activate()
	end

  if spot == 7 then
     spot = 1
     return
  end
  spot = spot + 1
end

function teleporterStop()
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end
by the way, first I did not use a second function ( teleporterStop() ): I intended to stop the teleporters by a floor trigger. But when I connect the trigger to the teleporters, I did not have the option start/stop for the tele1. I don't understand why, as for all other teleporters it works.

now, the pit script:

it is activated by a timer, which is activated by a button, then at the end, the script stop the timer.
SpoilerShow

Code: Select all

counter = 0

function count()
	counter = counter + 1
end

function pit()
	if counter == 1 then
	pit1.controller:close()
	elseif counter == 2 then
	pit2.controller:close()
	elseif counter == 3 then
	pit3.controller:close()
	pit1.controller:open()
	elseif counter == 4 then
	pit4.controller:close()
	pit2.controller:open()
	elseif counter == 5 then
	pit5.controller:close()
	pit3.controller:open()
	elseif counter == 6 then
	pit6.controller:close()
	pit4.controller:open()
	elseif counter == 7 then
	pit7.controller:close()
	pit5.controller:open()
	elseif counter == 8 then
	pit4.controller:close()
	pit6.controller:open()
	elseif counter == 9 then
	pit3.controller:close()
	pit7.controller:open()
	elseif counter == 10 then
	pit8.controller:close()
	pit4.controller:open()
	elseif counter == 11 then
	pit7.controller:close()
	pit3.controller:open()
	elseif counter == 12 then
	pit6.controller:close()
	pit8.controller:open()
	elseif counter == 13 then
	pit9.controller:close()
	pit7.controller:open()
	elseif counter == 14 then
	pit10.controller:close()
	pit6.controller:open()
	elseif counter == 15 then
	pit9.controller:open()
	elseif counter == 16 then
	pit10.controller:open()
	timerpit.timer:stop()
	counter = 0
	end
end
My asset pack: viewtopic.php?f=22&t=9320

Log1 mod : Toorum Manor: viewtopic.php?f=14&t=5505
User avatar
Duncan1246
Posts: 404
Joined: Mon Jan 19, 2015 7:42 pm

Re: teleporter puzzle + pit puzzle

Post by Duncan1246 »

bongobeat wrote:Hello folks,

just asking if some experienced scripter can check these scripts:
it works well, but to be sure, maybe there is a better way or it should'nt be done that way:

it's both log1 script:

this one is activated by a timer, the timer activate/deactivate 7 teleporters one by one: after going trough this, a floor trigger call the second function, to desactivate all teleporters. (the timer is desactived with the floor trigger)
SpoilerShow

Code: Select all

spot = 1
function cycletele2()
  local tele = {ctele1,ctele2,ctele3,ctele4,
                ctele5,ctele6,ctele7}
  if spot == 1 then
    ctele1.controller:activate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end

if spot == 2 then
    ctele1.controller:deactivate()
	ctele2.controller:activate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end

if spot == 3 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:activate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end
	
if spot == 4 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:activate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end
	
if spot == 5 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:activate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end

if spot == 6 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:activate()
	ctele7.controller:deactivate()
	end

if spot == 7 then
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:activate()
	end

  if spot == 7 then
     spot = 1
     return
  end
  spot = spot + 1
end

function teleporterStop()
    ctele1.controller:deactivate()
	ctele2.controller:deactivate()
	ctele3.controller:deactivate()
	ctele4.controller:deactivate()
	ctele5.controller:deactivate()
	ctele6.controller:deactivate()
	ctele7.controller:deactivate()
	end
by the way, first I did not use a second function ( teleporterStop() ): I intended to stop the teleporters by a floor trigger. But when I connect the trigger to the teleporters, I did not have the option start/stop for the tele1. I don't understand why, as for all other teleporters it works.

now, the pit script:

it is activated by a timer, which is activated by a button, then at the end, the script stop the timer.
SpoilerShow

Code: Select all

counter = 0

function count()
	counter = counter + 1
end

function pit()
	if counter == 1 then
	pit1.controller:close()
	elseif counter == 2 then
	pit2.controller:close()
	elseif counter == 3 then
	pit3.controller:close()
	pit1.controller:open()
	elseif counter == 4 then
	pit4.controller:close()
	pit2.controller:open()
	elseif counter == 5 then
	pit5.controller:close()
	pit3.controller:open()
	elseif counter == 6 then
	pit6.controller:close()
	pit4.controller:open()
	elseif counter == 7 then
	pit7.controller:close()
	pit5.controller:open()
	elseif counter == 8 then
	pit4.controller:close()
	pit6.controller:open()
	elseif counter == 9 then
	pit3.controller:close()
	pit7.controller:open()
	elseif counter == 10 then
	pit8.controller:close()
	pit4.controller:open()
	elseif counter == 11 then
	pit7.controller:close()
	pit3.controller:open()
	elseif counter == 12 then
	pit6.controller:close()
	pit8.controller:open()
	elseif counter == 13 then
	pit9.controller:close()
	pit7.controller:open()
	elseif counter == 14 then
	pit10.controller:close()
	pit6.controller:open()
	elseif counter == 15 then
	pit9.controller:open()
	elseif counter == 16 then
	pit10.controller:open()
	timerpit.timer:stop()
	counter = 0
	end
end
I am not a very skilled one in Lua, but I can at least reduce the size of your script:
SpoilerShow

Code: Select all

spot = 1
    function cycletele2()
      local tele = {ctele1,ctele2,ctele3,ctele4,
                    ctele5,ctele6,ctele7}
   
       	for i=1,7 do
		if i== spot then tele[i].controller:activate()
       		else  tele[i].controller:deactivate()
       		end
      if spot == 7 then
         spot = 1
         return
      end
      spot = spot + 1
    end

    function teleporterStop()
	local tele = {ctele1,ctele2,ctele3,ctele4,
                    ctele5,ctele6,ctele7}
        for i=1,7 do
		tele[i].controller:deactivate()
       	end
end
--------------------------------------------------------------
    counter = 0

    function count()
       counter = counter + 1
    end

    function pit()
	local pitserie={pit1,pit2,pit3,pit4,pit5,pit6,pit7}
	local pitserie2={pit4,pit3,pit8,pit7,pit6,pit9,pit10,pit6,pit7,pit4,pit3,pit8,pit7,pit6,pit9,pit10}
-------------the first part is ordered at start therefore more easy to manage
		for i=1,7 do
			if i==counter then pitserie[i].controller:close()
				if i~=1 and i~=2 then pitserie[i-2].controller:open()
				end
			end
		end
      		for i=1,7 do
			if i==counter-7 then pitserie2[i].controller:close()
				pitserie2[i+7].controller:open()
			end
              end
		if counter==15 or counter==16 then pitserie2[counter].controller:open()
		end
              if counter==16  then  timerpit.timer:stop()
                                               counter = 0
                   end
    end
I hope there is no typo error, I have not tested it in the editor... for very sharp remarks, wait for the best... :D
Duncan
The Blue Monastery (LOG1)
download at:http://www.nexusmods.com/grimrock/mods/399/?

Finisterrae(LOG2)
download at:http://www.nexusmods.com/legendofgrimrock2/mods/61/?
Post Reply