257 lines
6.9 KiB
Lua
257 lines
6.9 KiB
Lua
local USE_EVENT_USE = 0x01
|
|
|
|
-- Returns true if the actor has the item or a container with the item
|
|
function actor_has_item(actor, obj)
|
|
local tobj = obj
|
|
while tobj.in_container do
|
|
tobj = tobj.parent
|
|
end
|
|
if tobj.on_map == false and
|
|
tobj.parent.luatype == "actor" and
|
|
tobj.parent.actor_num == actor.actor_num then
|
|
return true
|
|
end
|
|
return false
|
|
end
|
|
|
|
-- Check Reachable
|
|
-- A) Next to actor passed in
|
|
-- B) In inventory of any party member
|
|
-- Return actor that can reach object or nil
|
|
-- Optionally automatically print "Out of Range!" message
|
|
function check_can_reach(obj, actor, print_msg)
|
|
if math.abs(obj.x - actor.x) <= 1 and
|
|
math.abs(obj.y - actor.y) <= 1 and
|
|
obj.z == actor.z then
|
|
return actor
|
|
end
|
|
|
|
for party_member in party_members() do
|
|
if actor_has_item(party_member, obj) == true then
|
|
return party_member
|
|
end
|
|
end
|
|
|
|
if print_msg then
|
|
printl("OUT_OF_RANGE")
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-- delete an object from inventory or remove it from the map
|
|
function delete_or_remove_object(actor, obj, qty)
|
|
-- FIXME: Remove the exact object from the Actor
|
|
if Actor.inv_has_obj_n(actor, obj.obj_n) then
|
|
if qty ~= nil then
|
|
Actor.inv_remove_obj_qty(actor, obj.obj_n, qty)
|
|
else
|
|
Actor.inv_remove_obj(actor, obj)
|
|
end
|
|
-- Remove the object from the map
|
|
else
|
|
if qty ~= nil then
|
|
map_remove_obj(obj, qty)
|
|
else
|
|
map_remove_obj(obj)
|
|
end
|
|
end
|
|
end
|
|
|
|
-- create and add item to actor, qty if stackable, drop if required to create the item,
|
|
-- obj_n: Item Code to Create
|
|
-- actor: actor to get the object
|
|
-- qty: how many (or nil)
|
|
-- drop_if_fail: if true, object gets put on the map on failure
|
|
-- print_msg: if true, prints the carry too much message on failure
|
|
function add_item_to_actor(obj_n, actor, qty, drop_if_fail, print_msg)
|
|
local new_obj = Obj.new(obj_n)
|
|
if qty ~= nil then
|
|
new_obj.qty = qty
|
|
else
|
|
new_obj.qty = 1
|
|
end
|
|
|
|
if Actor.can_carry_obj(actor, new_obj) then
|
|
if qty ~= nil then
|
|
Actor.inv_add_obj(actor, new_obj, STACK_OBJECT_QTY)
|
|
else
|
|
Actor.inv_add_obj(actor, new_obj, false)
|
|
end
|
|
else
|
|
if print_msg then
|
|
printl("CARRY_TOO_MUCH")
|
|
end
|
|
return false
|
|
end
|
|
return true
|
|
end
|
|
|
|
function use_corn_stalk(obj, actor)
|
|
local use_actor = check_can_reach(obj, actor, true)
|
|
if use_actor == nil then
|
|
return
|
|
end
|
|
|
|
if add_item_to_actor(108, use_actor, 1, false, true) == true then
|
|
printl("GOT_CORN")
|
|
end
|
|
end
|
|
|
|
function use_tree(obj, actor)
|
|
local use_actor = check_can_reach(obj, actor, true)
|
|
if use_actor == nil then
|
|
return
|
|
end
|
|
|
|
if add_item_to_actor(206, use_actor, 1, false, true) == true then
|
|
printl("USE_TREE")
|
|
end
|
|
end
|
|
|
|
function use_yucca_plant(obj, actor)
|
|
local use_actor = check_can_reach(obj, actor, true)
|
|
if use_actor == nil then
|
|
return
|
|
end
|
|
|
|
if add_item_to_actor(210, use_actor, 1, false, true) == true then
|
|
printl("USE_YUCCA_PLANT")
|
|
end
|
|
end
|
|
|
|
function use_clay(obj, actor)
|
|
local use_actor = check_can_reach(obj, actor, true)
|
|
if use_actor == nil then
|
|
return
|
|
end
|
|
|
|
-- delete clay
|
|
local location_code = delete_or_remove_object(use_actor, obj, nil)
|
|
if add_item_to_actor(132, use_actor, nil, false, false) == true then
|
|
printl("USE_CLAY")
|
|
end
|
|
-- TODO: IF ADD FAILED, PUT CLAY BACK WHERE IT WAS
|
|
end
|
|
|
|
function use_fishing_pole(obj, actor)
|
|
local use_actor = check_can_reach(obj, actor, true)
|
|
if use_actor == nil then
|
|
return
|
|
end
|
|
|
|
-- Check Deep Water
|
|
-- if <<Standing Next to Deep Water>> then
|
|
printl("USE_FISHING_POLE_NO_WATER")
|
|
-- end
|
|
-- Check Success
|
|
-- if random() == SUCCESS then
|
|
if add_item_to_actor(192, use_actor, nil, false, false) == true then
|
|
-- add_item without print
|
|
-- if SUCCESS then
|
|
printl("USE_FISHING_POLE_SUCCESS")
|
|
end
|
|
-- end
|
|
printl("USE_FISHING_POLE_FAIL")
|
|
end
|
|
|
|
function use_digging_stick(obj, actor)
|
|
local use_actor = check_can_reach(obj, actor, true)
|
|
if use_actor == nil then
|
|
return
|
|
end
|
|
|
|
-- Check Water
|
|
-- if <<Standing Next to Water>> then
|
|
printl("USE_DIGGING_STICK_NO_WATER")
|
|
-- end
|
|
if add_item_to_actor(192, use_actor, 1, false, true) == true then
|
|
printl("USE_DIGGING_STICK")
|
|
end
|
|
end
|
|
|
|
local usecode_table = {
|
|
[61]=use_corn_stalk,
|
|
[131]=use_digging_stick,
|
|
[192]=use_clay,
|
|
[212]=use_fishing_pole,
|
|
[5000]=use_tree,
|
|
[108]=use_tree,
|
|
[5001]=use_oven_or_fire,
|
|
[5002]=use_yucca_plant,
|
|
--[[
|
|
[62]=use_bean_stalk,
|
|
--[127]=use_bamboo_plant, -- confirmed
|
|
[132]=use_soft_clay_pot, -- confirmed
|
|
[133]=use_fired_clay_pot, -- confirmed
|
|
[134]=use_cloth_strip, -- confirmed
|
|
[191]=use_tarred_cloth_strip, -- confirmed
|
|
[210]=use_flax, -- confirmed
|
|
]]--
|
|
--[[
|
|
[10]=use_magnesium_ribbon, -- confirmed
|
|
[12]=use_paddle, -- confirmed
|
|
[20]={["on"]=use_rope},
|
|
[25]={["on"]=use_cutting_tool}, -- confirmed (obsidian knife)
|
|
[29]=use_rock_hammer, -- confirmed (rock hammer)
|
|
[42]=use_vine, -- confirmed (vine)
|
|
[44]={["on"]=use_cutting_tool}, -- confirmed (knife)
|
|
[47]=use_turtle_bait,
|
|
[51]=use_camera,
|
|
[52]={["on"]=use_cutting_tool}, -- confirmed (scissors)
|
|
[54]={["on"]=use_chocolatl}, --Original required using totem on reagent
|
|
[55]={["on"]=use_pinde}, -- confirmed
|
|
[56]={["on"]=use_yopo}, -- confirmed
|
|
[59]=use_grinding_stone, -- confirmed (mortar)
|
|
[60]=use_grinding_stone, -- confirmed (grinding stone)
|
|
[63]=use_jug_of_platcha,
|
|
[64]=use_torch,
|
|
[75]=standing_torch, -- confirmed (almost certainly can't use)
|
|
[86]=use_heluzz, -- confirmed
|
|
[87]=use_motazz, -- confirmed
|
|
[88]=use_aphazz, -- confirmed
|
|
[93]=use_corn_meal,
|
|
[94]=use_fire_extinguisher, -- confirmed
|
|
[102]=use_tortilla, -- confirmed
|
|
[108]=use_corn, -- confirmed
|
|
[118]=use_fire_axe, -- confirmed
|
|
[119]=use_metal_hammer, -- confirmed
|
|
[128]=use_bamboo_pole, -- confirmed
|
|
[136]=use_metal_bucket, -- confirmed
|
|
[137]=use_grenade, -- confirmed
|
|
[153]=use_vine(corn_stalk)???, -- confirmed
|
|
[206]=use_tree_branch, -- confirmed
|
|
[208]=use_torch,
|
|
[240]=use_device, -- confirmed Explosive Device
|
|
[267]=use_device2 -- confirmed Compass Device? USE?
|
|
]]--
|
|
}
|
|
|
|
|
|
function has_usecode(obj, usecode_type)
|
|
if usecode_type == USE_EVENT_USE and usecode_table[obj.obj_n] ~= nil then
|
|
return true
|
|
end
|
|
|
|
return false
|
|
end
|
|
|
|
function use_obj(obj, actor)
|
|
if type(usecode_table[obj.obj_n]) == "function" then
|
|
local func = usecode_table[obj.obj_n]
|
|
if func ~= nil then
|
|
print("\n")
|
|
func(obj, actor)
|
|
end
|
|
else
|
|
use_obj_on(obj, actor, usecode_table[obj.obj_n])
|
|
end
|
|
end
|
|
|
|
function move_obj(obj, rel_x, rel_y)
|
|
return false
|
|
end
|
|
|
|
function is_ranged_select(operation)
|
|
return false
|
|
end
|