Ask a simple question, get a simple answer

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!
User avatar
Isaac
Posts: 3185
Joined: Fri Mar 02, 2012 10:02 pm

Re: Ask a simple question, get a simple answer

Post by Isaac »

The cube wrote:How do i make a item that triggers a script on power attack?
Use the itemActionComponent's onAttack hook in the item's definition.

There you can either script what effect you want, or call a script entity on the map.

Example:

Code: Select all

onAttack =  function(self) custom.script:action() end,
This ~placed in the item's power attack component, will call the action() function in the custom object each time the power attack is used.
Azel
Posts: 808
Joined: Thu Nov 06, 2014 10:40 pm

Re: Ask a simple question, get a simple answer

Post by Azel »

Azel wrote:
The cube wrote:The player is unable to interact with the tiles where the chasms can spawn in any way, but he can see them.
The tile must look like a normal tile before the explosion, and have a chasm in it after the explosion.

The player is in the level below so he can not see the chasm appear.
Okay so I was able to get everything to work in a Dungeon by spawning a Pit and using some tricks. I know it's not an outdoor Chasm but I was limited on time today and I wanted to get you something at least semi-useful.

You can download both the playable dungeon and the editor project files here: http://mystrock.com/files/chasms.zip

Tomorrow I will add the outdoor region and do the same thing with a forest_chasm. I tested this out (save/reload, etc) and everything works fine. I was able to simulate the item problem you mentioned (it didn't fall when the pit spawned), but a simple invisible teleporter solved it. You will notice a floor trigger where the pit appears. The trigger is a placeholder, but if for some reason a Chasm doesn't work the same as the Pit, then I have a function near the floor trigger that can be called to simulate the party falling down the chasm.

This was pretty fun; I hope to have the outdoor version ready by tomorrow night :mrgreen:
Okay, I completed the Forest Chasm version. You can download the updated file from the same location: http://mystrock.com/files/chasms.zip

This was done entirely using the out-of-box Editor (no modified Assets, etc). The only thing I changed from your original description, is I put a Chest on top of the Stone Ring. When the bomb goes off, I simulate the Chest falling down through the Chasm and "breaking" ... which reveals whatever items were inside (eg, a Gold Key).

Both the dungeon file and Editor files are available in the ZIP. Hope this helps!
User avatar
The cube
Posts: 94
Joined: Tue Apr 23, 2013 6:09 pm
Location: Barren Desert

Re: Ask a simple question, get a simple answer

Post by The cube »

How do i define a monster that triggers a script when damaged? I tried this, but it didin't seem to work.
(The base object is ice elemental) (Game crashes when i try to spawn the object.)(I am trying to create a monster that gains health from normal attacks, but instantly dies to backstabs)

Code: Select all

{
			class = "Monster",
			resistances = {},
			onDamage = function(self, damage, damageType) 
				if this.facing ~= party.facing then
					this.setHealth(this.getHealth()+damage*2)
					if this.getHealth() > this.getMaxHealth() then
						this.setMaxHealth(this.getHealth())
					end
				else
					this:die()
				end
			end,
},
User avatar
Isaac
Posts: 3185
Joined: Fri Mar 02, 2012 10:02 pm

Re: Ask a simple question, get a simple answer

Post by Isaac »

The cube wrote:How do i define a monster that triggers a script when damaged?
There are some differences from Grimrock 1 scripting, with the new component model for objects.

*Also you have to replace the whole component when defining a new one; not just the properties added or needing replaced.

Code: Select all

defineObject {
name = "custom",
baseObject = "ice_guardian",
components =  {
			{	
				class = "Monster",
				meshName = "ice_guardian_mesh",
				hitSound = "ice_guardian_hit",
				dieSound = "ice_guardian_die",
				deathEffect = "death_icy",
				hitEffect = "hit_ice",
				capsuleHeight = 0.6,
				capsuleRadius = 0.3,
				collisionRadius = 0.8,
				health = 400,
				protection = 10,
				evasion = 10,
				flying = true,
				exp = 500,
				immunities = { "sleep", "blinded" },
				traits = { "elemental" },
				resistances = {},
				onDamage = function(self, damage, damageType)
							if self.go.facing ~= party.facing then
							   self.go.monster:setHealth(self.go.monster:getHealth()+damage*2)
							   if self.go.monster:getHealth() > self.go.monster:getMaxHealth() then
							      self.go.monster:setMaxHealth(self.go.monster:getHealth())
							   end
							else
							   self.go.monster:die()
							end
				end,
			    
			}
	}
} 
User avatar
AndakRainor
Posts: 674
Joined: Thu Nov 20, 2014 5:18 pm

Re: Ask a simple question, get a simple answer

Post by AndakRainor »

Is there a way to know if the current Weapon Set of a champion is the first or the second set ?
User avatar
Isaac
Posts: 3185
Joined: Fri Mar 02, 2012 10:02 pm

Re: Ask a simple question, get a simple answer

Post by Isaac »

AndakRainor wrote:Is there a way to know if the current Weapon Set of a champion is the first or the second set ?
The item slots are 1 & 2 and 11 & 12 ~respectively.

Code: Select all

party.party:getChampion(1)getItem(11)
...would be the PC's right [their right] hand weapon in the second set; unless I'm misunderstanding your question.
____

I have my own question about this. What reason is there that Champion:getOtherHandItem(slot) returns the item in the opposite hand, instead of the item from the same hand in the opposite set? (Slot 11 instead of slot 2 for instance.)

Is this a bug? It would seem to make sense that the first function return the current items, and the second returns the alternates.

(Obviously it does say ~exactly what it does, but it's still counterintuitive IMO; though I can see it both ways... I guess it's a loop optimization? To check both hands in one pass ~with one value?)
User avatar
AndakRainor
Posts: 674
Joined: Thu Nov 20, 2014 5:18 pm

Re: Ask a simple question, get a simple answer

Post by AndakRainor »

Isaac wrote:The item slots are 1 & 2 and 11 & 12 ~respectively.
____

I have my own question about this. What reason is there that Champion:getOtherHandItem(slot) returns the item in the opposite hand, instead of the item from the same hand in the opposite set? (Slot 11 instead of slot 2 for instance.)

Is this a bug? It would seem to make sense that the first function return the current items, and the second returns the alternates.

(Obviously it does say ~exactly what it does, but it's still counterintuitive IMO.)
But when I swap between the two hand sets, the current items in hands are always in slots 1 & 2. 11 & 12 are never the current set. So I have no information on which set is active, as shown by the default gui with the I / II icons. I try to show the same I / II icons in a custom gui but I can't tell which one should be drawn.

You are right about this confusing function! It's a good thing is a totally useless function to begin with in both case ;)
User avatar
Isaac
Posts: 3185
Joined: Fri Mar 02, 2012 10:02 pm

Re: Ask a simple question, get a simple answer

Post by Isaac »

AndakRainor wrote: But when I swap between the two hand sets, the current items in hands are always in slots 1 & 2. 11 & 12 are never the current set. So I have no information on which set is active, as shown by the default gui with the I / II icons. I try to show the same I / II icons in a custom gui but I can't tell which one should be drawn.
I'm missing something [probably very basic] then... If slots 11 & 12 are never the current set, why would they matter to the GUI? What's wrong about just rendering slots 1 & 2? (...and presumably, when the player swaps them, then slots 1 & 2 become ... Aha, you are asking how to detect the swap in realtime?)
User avatar
AndakRainor
Posts: 674
Joined: Thu Nov 20, 2014 5:18 pm

Re: Ask a simple question, get a simple answer

Post by AndakRainor »

Yes, the default gui makes the difference between set 1 and set 2 by drawing different icons :
- g.drawGuiItem(""HandSlot1", x, y)
- g.drawGuiItem(""HandSlot2", x, y)
those have the "I" or "II" symbols highlighted...
User avatar
Isaac
Posts: 3185
Joined: Fri Mar 02, 2012 10:02 pm

Re: Ask a simple question, get a simple answer

Post by Isaac »

Well my first thought was to assign an onUnequipItem connector to any item equipped; to signal when it was unequipped (and then remove the hook)... But that crashes the game... So to use that option, it looks like you would have to add the hook to the initial definition of every item. :(
*But it works.

Barring a better method, if every item had the onUnequipItem hook call ~notify your GUI that an item was unequipped, then you could check for a changed slot (was 1, now 11), and know the sets had been switched. But it seems rather involved. There should be a better way than this.

What about doing that slot check every time the mouse is clicked on the UI?

It seems possible to add an onDrawGui hook to the party, and call function to check the party's equipment on context.mouseDown(3), but I haven't managed a good check to detect the swap ~yet.

*context.mouseDown(3) seems undocumented. The usual number for 'left mouse button' is 0 [zero], but that continuously triggers while pressed... 3 seems to only trigger once per press.
Post Reply