|
|
|
@ -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,27 +79,80 @@ 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
|
|
|
|
|
if not auto_gears then
|
|
|
|
|
gears=args.gears or {}
|
|
|
|
|
frameLength=1
|
|
|
|
|
local frames
|
|
|
|
|
if animate~=nil then
|
|
|
|
|
frameLength=animate.frameLength
|
|
|
|
@ -105,7 +161,18 @@ function registerBuilding(args)
|
|
|
|
|
end
|
|
|
|
|
frames=processFrames(shop_def,animate.frames)
|
|
|
|
|
end
|
|
|
|
|
local roomSubset=args.canBeRoomSubset or -1
|
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
addBuilding(shop_id,fix_impassible,consume,produce,needs_power,gears,updateSkip,frames,frameLength,roomSubset)
|
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|