LoG Framework (dynamic hooks etc.)

Talk about creating Grimrock 1 levels and mods here. Warning: forum contains spoilers!
User avatar
djoldgames
Posts: 107
Joined: Fri Mar 23, 2012 11:28 pm
Contact:

Re: Advanced scripting: a scripting framework

Post by djoldgames »

@JKos: No problem, updated ;-)
I see, you're not deactivate the timer in illusion_walls entity and I added it, but much simpler: illusion_walls_timer:deactivate()
Yours, by using findEntity("illusion_walls_timer") is obviously better. Thanks!

Question: in framework.lua you (and I too) use clone cutom objects. Is there any reason for that? Can I clone these specified object in extra file myobjects.lua, and added it to init.lua before framework.lua?
User avatar
JKos
Posts: 464
Joined: Wed Sep 12, 2012 10:03 pm
Location: Finland
Contact:

Re: Advanced scripting: a scripting framework

Post by JKos »

You can clone (or override) objects multiple times, it doesn't really matter if you clone your objects before or after my framework, at least if you don't modify the hooks in lua files. My framework just adds those hook-functions to original assets.

NEWS

I found an undocumented function script_entity:setSource() and was able to move all my scripts to single lua-file :) I edited documentation to the first post of this thread. But basically you just need to include framework.lua to you init.lua and add few lines of code to script entity. It is now really easy to add this framework to existing mods.
- LoG Framework 2http://sites.google.com/site/jkoslog2 Define hooks in runtime by entity.name or entity.id + multiple hooks support.
- cloneObject viewtopic.php?f=22&t=8450
User avatar
JKos
Posts: 464
Joined: Wed Sep 12, 2012 10:03 pm
Location: Finland
Contact:

Re: Advanced scripting: a scripting framework

Post by JKos »

Sorry, I accidentally uploaded a non working version but now it should work.

EDIT:
BTW: You have to remove or rename script entities named: fw,help,data,monsters_can_open_doors,illusion_walls or damage_dealing_doors from you dungeon if you want to use this new version. Those are generated in runtime now.
- LoG Framework 2http://sites.google.com/site/jkoslog2 Define hooks in runtime by entity.name or entity.id + multiple hooks support.
- cloneObject viewtopic.php?f=22&t=8450
User avatar
JKos
Posts: 464
Joined: Wed Sep 12, 2012 10:03 pm
Location: Finland
Contact:

Re: Advanced scripting: a scripting framework

Post by JKos »

There was a fatal bug: it wasn't working in game but only in editor, but now it's fixed and it should be safe to use. I also tested that it is savegame compatible.
- LoG Framework 2http://sites.google.com/site/jkoslog2 Define hooks in runtime by entity.name or entity.id + multiple hooks support.
- cloneObject viewtopic.php?f=22&t=8450
User avatar
djoldgames
Posts: 107
Joined: Fri Mar 23, 2012 11:28 pm
Contact:

Re: Advanced scripting: a scripting framework

Post by djoldgames »

Thanks for updates.
For now I have a lot of new hooks using your framework.

Savegame compatibility: you're right, I need some refactoring my scripts, and defining all temporary function variables as "local" ;-)

In the entity "logfw_init" there is debug toggler: options.debug = true, but not working. Only way to enable/disable is in the framework.lua ?
User avatar
djoldgames
Posts: 107
Joined: Fri Mar 23, 2012 11:28 pm
Contact:

Advanced script: Fake portcullis

Post by djoldgames »

For my EOB mod, I need to create some portcullis, through that can player throwing items.
I created the fake portcullis (portcullis model as decoration) and on the party hook (onMove) block player move through them by spawning real portcullis for the short time period and destroy it after.
Working beautifull.

Code: Select all

activeThrowablePortcullis = {}

function activate()

	fw.hooks.party.throwable_portcullis = {
		onMove = function(self,dir)
			for e in help.entitiesAtDir(self,dir) do
				if ( (e.name == 'portcullis_throwable') and 
					e.facing == (dir + 2)%4) then
					throwable_portcullis.doTheMagic(e)
				end
			end
			for e in help.entitiesAtSameTile(self) do
				if ( (e.name == 'portcullis_throwable') and 
					e.facing == dir) then
					throwable_portcullis.doTheMagic(e)
				end
			end			
			
		end
	}
	fw.debugPrint("Throwable portcullis activated")
end

function doTheMagic(door)
	local tmp = findEntity("throwable_portcullis_door")
	if tmp then
		tmp:destroy()
	end
	local portcullis = spawn("portcullis_secret_door", door.level, door.x, door.y, door.facing, "throwable_portcullis_door")
	portcullis:setDoorState('closed')

	local timer = findEntity("throwable_portcullis_door_timer")
	if (not timer) then
		timer = spawn("timer", door.level, door.x, door.y, door.facing, "throwable_portcullis_door_timer")
		timer:setTimerInterval(0.5)
		timer:addConnector('activate','throwable_portcullis','removeDoor')		
	end
	timer:activate()
	throwable_portcullis.activeThrowablePortcullis[portcullis.id] = portcullis
	fw.debugPrint("Door spawned - "..portcullis.id)
end

function removeDoor()
	for id,door in pairs(throwable_portcullis.activeThrowablePortcullis) do
		-- fw.debugPrint("Door destroyed - "..door.id)
		door:destroy()
		throwable_portcullis.activeThrowablePortcullis[id] = nil
	end
	local timer = findEntity("throwable_portcullis_door_timer")
	timer:deactivate()
end
User avatar
JKos
Posts: 464
Joined: Wed Sep 12, 2012 10:03 pm
Location: Finland
Contact:

Re: Advanced scripting: a scripting framework

Post by JKos »

Yeah I tried to make it possible to enable debug in options table, but it was not so easy as tought it would be :) so that option was left there accidentally. But you can enable debug mode by setting fw.debug.enabled = true inside any function, it doesn't work if you try to set it in initialize time, because fw-script entity is available only in runtime.

Example:
logfw_init

Code: Select all

options = {}
options.modules = {
	monsters_can_open_doors = false,
	damage_dealing_doors = false,
	illusion_walls = true,
}

spawn("LoGFramework", 1,1,1,0,'fwInit')
fwInit:open()
fwInit:destroy()

-- call this to enable debug
function main()
	fw.debug.enabled = true
	-- add your code here
end
Can I ask how you did the fake portcullis? I think that would be perfect solution for illusion walls, much better than my scripting solution.
edit: Ah I got it, but it doesn't show on map as a wall, but i got an idea from your script how i could make illusion walls to be passable by monsters. I could just replace the illusion wall with fake illusion wall when monster is standing next to it and facing towards it. So walls would be revealed on map only if monster is next to wall and facing it. So thanks, I will try it.

A tip: I think you could just return false from fw.hooks.party.throwable_portcullis.onMove - function when party is trying to go trough portcullis_throwable and party movement will be cancelled, so you don't have to replace it with real portcullis.
- LoG Framework 2http://sites.google.com/site/jkoslog2 Define hooks in runtime by entity.name or entity.id + multiple hooks support.
- cloneObject viewtopic.php?f=22&t=8450
User avatar
JKos
Posts: 464
Joined: Wed Sep 12, 2012 10:03 pm
Location: Finland
Contact:

Re: Advanced scripting: a scripting framework

Post by JKos »

YES it works beautifully, monsters can now walk though illusion walls and you can attack through them. Wall will be opened if a monster comes close to it and stays open for 2 seconds, but graphically it just seems to be a solid wall all the time.
You can't shoot through them yet (if the wall is not already open), but it's totally doable.

It's possible to make pretty nasty jump scare scenes with this :) a spider suddenly jumping through wall will scare a shit out of you.

just update framework.lua and you are good to go.
- LoG Framework 2http://sites.google.com/site/jkoslog2 Define hooks in runtime by entity.name or entity.id + multiple hooks support.
- cloneObject viewtopic.php?f=22&t=8450
User avatar
JKos
Posts: 464
Joined: Wed Sep 12, 2012 10:03 pm
Location: Finland
Contact:

Re: Advanced scripting: a scripting framework

Post by JKos »

I added talk-script entity to demo-dungeon. Basically it adds a timed conversations to events. I think it's a good example what can be done with dynamic hooks.
I will add it to framework, but it's not ready yet, and it's easier to develop in script entities and then copy-paste to framework.lua.
Try it :) It's updated to my google drive (link can be found from 1st post).

example

Code: Select all

talk.addTalkHook('spider_1','onDie','Die you 8 legged ugly bastard!',2)
it will print

Code: Select all

Random champion name: Die you 8 legged ugly bastard!
2 seconds after the death of the spider_1.
- LoG Framework 2http://sites.google.com/site/jkoslog2 Define hooks in runtime by entity.name or entity.id + multiple hooks support.
- cloneObject viewtopic.php?f=22&t=8450
User avatar
JKos
Posts: 464
Joined: Wed Sep 12, 2012 10:03 pm
Location: Finland
Contact:

Re: LoG Framework (update: experimental turn based combat)

Post by JKos »

Pretty big update this time, updated documentation to first post. I also renamed this thread.

Sorry djoldgames, this is not fully compatible with old version, you have to use fw.addHooks-function, so you can't add hooks directly anymore (fw.hooks.monster.etc={...}).
- LoG Framework 2http://sites.google.com/site/jkoslog2 Define hooks in runtime by entity.name or entity.id + multiple hooks support.
- cloneObject viewtopic.php?f=22&t=8450
Post Reply