StendhalScripting/Lua: Difference between revisions
imported>AntumDeluge add navigation menu |
imported>AntumDeluge →Adding Entities: instructions on how to add merchant behavior to NPCs |
||
| Line 108: | Line 108: | ||
logger:error("Could not set zone: " .. zone) |
logger:error("Could not set zone: " .. zone) |
||
end |
end |
||
</pre> |
|||
==== Adding Merchant Behavior ==== |
|||
Merchant behavior ''(buying/selling)'' can be set with one of the following helper functions: |
|||
* ''npcHelper:addMerchant(merchantType, npc, prices, addOffer)'' |
|||
* ''npcHelper:addBuyer(npc, prices, addOffer)'' |
|||
* ''npcHelper:addSeller(npc, prices, addOffer)'' |
|||
** Arguments: |
|||
*** ''merchantType:'' (string) If set to "buyer", will add buyer behavior, otherwise will be "seller" (may change type to boolean in future). |
|||
*** ''npc:'' (SpeakerNPC) The NPC to add the behavior to. |
|||
*** ''prices:'' (Map<String, Integer> or LuaTable) List of items & their prices. |
|||
*** ''addOffer:'' (boolean) If <code>true</code>, will add default replies for "offer". |
|||
Example of adding seller behavior to an NPC: |
|||
<pre> |
|||
if game:setZone("0_semos_city") then |
|||
local frank = npcHelper.createSpeakerNPC("Frank") |
|||
npcHelper:addSeller(frank, shops:get("shopname"), true) |
|||
game:add(frank) |
|||
end |
|||
</pre> |
|||
To create a custom shop list, you can use a Lua table (there are multiple ways to add elements to a Lua table): |
|||
Method 1: |
|||
<pre> |
|||
local priceList = { |
|||
meat = 50, |
|||
["ham"] = 70, |
|||
} |
|||
</pre> |
|||
Method 2: |
|||
<pre> |
|||
local priceList = {} |
|||
priceList.meat = 50 |
|||
priceList["ham"] = 70 |
|||
</pre> |
|||
The helper methods have special handling for underscore characters as well (the following are all the same): |
|||
<pre> |
|||
local priceList = { |
|||
smoked_ham = 100, |
|||
["smoked ham"] = 100, |
|||
} |
|||
priceList.smoked_ham = 100 |
|||
priceList["smoked ham"] = 100 |
|||
</pre> |
|||
Then add the seller behavior using the custom list: |
|||
<pre> |
|||
npcHelper:addSeller(frank, priceList, true) |
|||
</pre> |
</pre> |
||
Revision as of 09:09, 2 April 2020
this page is a work-in progress
Stendhal supports Lua scripting via the LuaJ library.
Lua scripts end in the .lua extension & are stored in the data/script directory.
Objects and Functions
The following objects & functions are exposed to the Lua engine:
game
The main object that handles setting zone & adding entities to game.
Methods:
game:add(object)- Adds an object to the current zone.game:setZone(name)- Sets the current zone.game:createSign(visible)- Creates a new Sign instance.game:createShopSign(name, title, caption, seller)- Creates a new ShopSign instance.
npcHelper
This object helps to create instances of SpeakerNPC & SilentNPC classes.
Methods:
npcHelper:createSpeakerNPC(name)- Creates a new SpeakerNPC.npcHelper:createSilentNPC()- Creates a new SilentNPC.npcHelper:setPath(npc, path, loop)- Sets the path for the specified NPC.npcHelper:setPathAndPosition(npc, path, loop)- Sets the path & starting position of the specified NPC.npcHelper:addMerchant(merchantType, npc, items, offer)- Adds merchant behavior tonpcof either a buyer or seller defined bymerchantType.npcHelper:addSeller(npc, items, offer)- Adds seller merchant behavior tonpc.npcHelper:addBuyer(npc, items, offer)- Adds buyer merchant behavior tonpc.
Setting Zone
To set the zone to work with, use the game object:
game:setZone("0_semos_city")
The logger is exposed to Lua via the logger object:
local zone = "0_semos_city"
if game:setZone(zone) then
-- do something
else
logger:error("Could not set zone: " .. zone)
end
Adding Entities
Signs
Signs can be created with game:createSign and game:createShopSign:
local zone = "0_semos_city"
if game:setZone(zone) then
-- create the sign instance
local sign = game:createSign()
sign:setEntityClass("signpost")
sign:setPosition(12, 55)
sign:setText("Meet Lua!")
-- Add it to the world
game:add(sign)
else
logger:error("Could not set zone: " .. zone)
end
NPCs
Use the game:createSpeakerNPC method to create an interactive NPC:
local zone = "0_semos_city"
if game:setZone(zone) then
-- Use helper object to create a new NPC
local npc = npcHelper:createSpeakerNPC("Lua")
npc:setEntityClass("littlegirlnpc")
npc:setPosition(10, 55)
npc:setBaseSpeed(0.1)
npc:setCollisionAction(CollisionAction.STOP)
local nodes = {
{10, 55},
{11, 55},
{11, 56},
{10, 56},
}
-- Use helper object to create NPC path
npcHelper:setPath(npc, nodes)
-- Dialogue
npc:addJob("Actually, I am jobless.")
npc:addGoodbye();
-- Add to the world
game:add(npc)
else
logger:error("Could not set zone: " .. zone)
end
Adding Merchant Behavior
Merchant behavior (buying/selling) can be set with one of the following helper functions:
- npcHelper:addMerchant(merchantType, npc, prices, addOffer)
- npcHelper:addBuyer(npc, prices, addOffer)
- npcHelper:addSeller(npc, prices, addOffer)
- Arguments:
- merchantType: (string) If set to "buyer", will add buyer behavior, otherwise will be "seller" (may change type to boolean in future).
- npc: (SpeakerNPC) The NPC to add the behavior to.
- prices: (Map<String, Integer> or LuaTable) List of items & their prices.
- addOffer: (boolean) If
true, will add default replies for "offer".
- Arguments:
Example of adding seller behavior to an NPC:
if game:setZone("0_semos_city") then
local frank = npcHelper.createSpeakerNPC("Frank")
npcHelper:addSeller(frank, shops:get("shopname"), true)
game:add(frank)
end
To create a custom shop list, you can use a Lua table (there are multiple ways to add elements to a Lua table):
Method 1:
local priceList = {
meat = 50,
["ham"] = 70,
}
Method 2:
local priceList = {}
priceList.meat = 50
priceList["ham"] = 70
The helper methods have special handling for underscore characters as well (the following are all the same):
local priceList = {
smoked_ham = 100,
["smoked ham"] = 100,
}
priceList.smoked_ham = 100
priceList["smoked ham"] = 100
Then add the seller behavior using the custom list:
npcHelper:addSeller(frank, priceList, true)