Merge pull request #866 from warmist/building_hacks_update

Add auto-gears mode for building hacks
develop
expwnent 2016-03-13 07:45:17 -04:00
commit c4528d4e0e
3 changed files with 88 additions and 12 deletions

@ -45,6 +45,7 @@ Internals
Lua
---
- `building-hacks` now supports ``auto_gears`` flags. It automatically finds and animates gears in building definition
- Changed how `eventful` triggers reaction complete. Now it has ``onReactionComplete`` and ``onReactionCompleting``. Second one can be canceled
New Plugins

@ -3449,7 +3449,7 @@ Functions
3. consume -- how much machine power is needed to work. Disables reactions if not supplied enough and needs_power=1
4. produce -- how much machine power is produced.
5. needs_power -- if produced in network < consumed stop working, default true
6. gears -- a table or ``{x=?,y=?}`` of connection points for machines
6. gears -- a table or ``{x=?,y=?}`` of connection points for machines.
7. action -- a table of number (how much ticks to skip) and a function which gets called on shop update
8. animate -- a table of frames which can be a table of:
@ -3457,6 +3457,7 @@ Functions
b. empty table (tile not modified) OR
c. ``{x=<number> y=<number> + 4 numbers like in first case}``, this generates full frame useful for animations that change little (1-2 tiles)
9. canBeRoomSubset -- a flag if this building can be counted in room. 1 means it can, 0 means it can't and -1 default building behaviour
10. auto_gears -- a flag that automatically fills up gears and animate. It looks over building definition for gear icons and maps them.
Animate table also might contain:
1. frameLenght -- how many ticks does one frame take OR
@ -3482,6 +3483,13 @@ Simple mechanical workshop::
}
}
Or with auto_gears::
require('plugins.building-hacks').registerBuilding{name="BONE_GRINDER",
consume=15,
auto_gears=true
}
Luasocket
=========

@ -11,8 +11,11 @@ local _ENV = mkmodule('plugins.building-hacks')
fix_impassible -- make impassible tiles impassible to liquids too
consume -- how much machine power is needed to work
produce -- how much machine power is produced
gears -- a table or {x=?,y=?} of connection points for machines
needs_power -- needs power to be able to add jobs
action -- a table of number (how much ticks to skip) and a function which gets called on shop update
canBeRoomSubset -- room is considered in to be part of the building defined by chairs etc...
auto_gears -- find the gears automatically and animate them
gears -- a table or {x=?,y=?} of connection points for machines
animate -- a table of
frames -- a table of
tables of 4 numbers (tile,fore,back,bright) OR
@ -76,36 +79,100 @@ local function processFrames(shop_def,frames)
end
return frames
end
local function findGears( shop_def ) --finds positions of all gears and inverted gears
local w,h=shop_def.dim_x,shop_def.dim_y
local stage=shop_def.build_stages
local ret={}
for x=0,w-1 do
for y=0,h-1 do
local tile=shop_def.tile[stage][x][y]
if tile==42 then --gear icon
table.insert(ret,{x=x,y=y,invert=false})
elseif tile==15 then --inverted gear icon
table.insert(ret,{x=x,y=y,invert=true})
end
end
end
return ret
end
local function lookup_color( shop_def,x,y,stage )--TODO: background and bright?
return shop_def.tile_color[stage][x][y]
end
local function processFramesAuto( shop_def ,gears) --adds frames for all gear icons and inverted gear icons
local w,h=shop_def.dim_x,shop_def.dim_y
local frames={{},{}} --two frames only
local stage=shop_def.build_stages
for i,v in ipairs(gears) do
local tile,tile_inv
if v.inverted then
tile=42
tile_inv=15
else
tile=15
tile_inv=42
end
table.insert(frames[1],{x=v.x,y=v.y,tile,lookup_color(shop_def,v.x,v.y),0,0})
table.insert(frames[2],{x=v.x,y=v.y,tile_inv,lookup_color(shop_def,v.x,v.y),0,0})
end
for frame_id,frame in ipairs(frames) do
frames[frame_id]=generateFrame(frame,w,h)
end
return frames
end
function registerBuilding(args)
local shop_def=findCustomWorkshop(args.name)
local shop_id=shop_def.id
--misc
local fix_impassible
if args.fix_impassible then
fix_impassible=1
else
fix_impassible=0
end
local roomSubset=args.canBeRoomSubset or -1
--power
local consume=args.consume or 0
local produce=args.produce or 0
local needs_power=args.needs_power or 1
local gears=args.gears or {}
local action=args.action --could be nil
local auto_gears=args.auto_gears or false
local updateSkip=0
local action=args.action --could be nil
if action~=nil then
updateSkip=action[1]
registerUpdateAction(shop_id,action[2])
end
--animations and connections next:
local gears
local frameLength
local animate=args.animate
local frameLength=1
local frames
if animate~=nil then
frameLength=animate.frameLength
if animate.isMechanical then
frameLength=-1
if not auto_gears then
gears=args.gears or {}
frameLength=1
local frames
if animate~=nil then
frameLength=animate.frameLength
if animate.isMechanical then
frameLength=-1
end
frames=processFrames(shop_def,animate.frames)
end
frames=processFrames(shop_def,animate.frames)
else
frameLength=-1
if animate~=nil then
frameLength=animate.frameLength or frameLength
if animate.isMechanical then
frameLength=-1
end
end
gears=findGears(shop_def)
frames=processFramesAuto(shop_def,gears)
end
local roomSubset=args.canBeRoomSubset or -1
addBuilding(shop_id,fix_impassible,consume,produce,needs_power,gears,updateSkip,frames,frameLength,roomSubset)
end