show-buildable/control.lua

Sat, 05 Jul 2025 00:35:41 +0300

author
Teemu Piippo <teemu.s.piippo@gmail.com>
date
Sat, 05 Jul 2025 00:35:41 +0300
changeset 14
c26d4dd2af9b
permissions
-rw-r--r--

Add show-buildable mod

14
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
1 require"sb-util"
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
2
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
3 ---@param player LuaPlayer
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
4 local function get_entity_player_wants_to_place(player)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
5 local item_name = nil
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
6 if player.cursor_stack.valid_for_read
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
7 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
8 item_name = player.cursor_stack.name
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
9 elseif player.cursor_ghost
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
10 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
11 item_name = player.cursor_ghost.name.name
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
12 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
13 local entity_name = nil
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
14 local unsupported_types = {
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
15 ["straight-rail"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
16 ["rail-ramp"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
17 ["rail-support"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
18 ["rail-signal"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
19 ["rail-chain-signal"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
20 ["train-stop"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
21 ["locomotive"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
22 ["cargo-wagon"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
23 ["fluid-wagon"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
24 ["offshore-pump"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
25 ["car"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
26 ["spider-vehicle"] = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
27 }
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
28 if item_name
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
29 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
30 item_proto = prototypes.item[item_name]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
31 if item_proto and item_proto.place_result
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
32 and not item_proto.place_result.flags["placeable-off-grid"]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
33 and not unsupported_types[item_proto.place_result.type]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
34 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
35 entity_name = item_proto.place_result.name
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
36 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
37 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
38 return entity_name
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
39 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
40
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
41 -- where to try place the entity inside the grid
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
42 -- 1×1 entities require 0.5 offset, 2×2 require 1 offset,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
43 -- 3×3 entities require 0.5 again, 4×4 require 1.
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
44 -- and so on...
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
45 ---@param collision_box data.BoundingBox
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
46 local function offset_x(collision_box)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
47 local x = collision_box.left_top.x
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
48 local oy = ((x%1) - (x % 0.5)) or 1
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
49 return oy > 0 and oy or 1
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
50 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
51
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
52 ---@param collision_box data.BoundingBox
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
53 local function offset_y(collision_box)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
54 local y = collision_box.left_top.y
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
55 local oy = ((y%1) - (y % 0.5)) or 1
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
56 return oy > 0 and oy or 1
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
57 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
58
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
59 ---@param proto LuaEntityPrototype
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
60 --- can x be rotated???
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
61 local function can_be_rotated(proto)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
62 return proto.supports_direction and proto.collision_box.left_top.x ~= proto.collision_box.left_top.y
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
63 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
64
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
65 local function collision_tester(entity_name)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
66 if entity_name and prototypes.entity["collision-tester-"..entity_name]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
67 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
68 return "collision-tester-"..entity_name
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
69 else
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
70 return entity_name
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
71 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
72 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
73
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
74 ---@param a table
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
75 ---@param b any
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
76 local function find(a, b)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
77 for k, v in pairs(a)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
78 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
79 if v == b
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
80 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
81 return k
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
82 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
83 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
84 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
85
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
86 local function join(sep, x)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
87 result = ""
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
88 local i = 0
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
89 for k, v in pairs(x)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
90 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
91 if i > 0
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
92 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
93 result = result..sep
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
94 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
95 result = result..v
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
96 i = i + 1
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
97 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
98 return result
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
99 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
100
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
101 ---@param a MapPosition
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
102 ---@param b MapPosition
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
103 local function manh(a, b)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
104 return math.abs(b.x - a.x) + math.abs(b.y - a.y)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
105 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
106
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
107 ---@param surface string
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
108 ---@param pos MapPosition
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
109 ---@param proto LuaEntityPrototype
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
110 function resources_test(surface, pos, proto)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
111 if storage.num_memoized_resource_tests == nil or storage.num_memoized_resource_tests > 1000
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
112 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
113 storage.num_memoized_resource_tests = 0
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
114 ---@type table<string, table<number, table<number, table<string, boolean>>>>
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
115 storage.memoized_resource_tests = {}
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
116 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
117 if not storage.memoized_resource_tests[surface]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
118 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
119 storage.memoized_resource_tests[surface] = {}
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
120 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
121 if not storage.memoized_resource_tests[surface][pos.x]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
122 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
123 storage.memoized_resource_tests[surface][pos.x] = {}
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
124 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
125 if not storage.memoized_resource_tests[surface][pos.x][pos.y]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
126 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
127 storage.memoized_resource_tests[surface][pos.x][pos.y] = {}
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
128 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
129 local arr = storage.memoized_resource_tests[surface][pos.x][pos.y]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
130 if arr[proto.name] ~= nil
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
131 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
132 return arr[proto.name]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
133 else
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
134 -- check resources
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
135 local resources = {}
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
136 for _, resource in pairs(prototypes.entity)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
137 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
138 if resource.type == "resource"
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
139 and (
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
140 resource.resource_category == proto.resource_category
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
141 or (proto.resource_categories or {})[resource.resource_category]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
142 )
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
143 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
144 table.insert(resources, resource.name)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
145 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
146 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
147 local r = proto.mining_drill_radius
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
148 local resources_found = game.surfaces[surface].find_entities_filtered{
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
149 area = {{pos.x - r, pos.y - r}, {pos.x + r, pos.y + r}},
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
150 type = "resource",
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
151 name = resources,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
152 limit = 1
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
153 }
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
154 -- special extra test for pumpjacks because those need to be placed
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
155 -- directly on top of the resource
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
156 local found = (#resources_found > 0)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
157 if found and proto.mining_drill_radius < 1
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
158 and manh(resources_found[1].position, pos) > proto.mining_drill_radius
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
159 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
160 found = false
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
161 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
162 arr[proto.name] = found
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
163 return found
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
164 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
165 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
166
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
167 script.on_nth_tick(30, function()
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
168 for _, player in pairs(game.players)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
169 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
170 if player.game_view_settings.show_entity_info
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
171 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
172 local entity_name = get_entity_player_wants_to_place(player)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
173 local collision_box_table = {}
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
174 local scale = 1
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
175 if entity_name ~= nil
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
176 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
177 local proto = prototypes.entity[entity_name]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
178 scale = 1
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
179 if proto.type == "cargo-bay" or proto.type == "cargo-landing-pad"
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
180 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
181 scale = 2
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
182 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
183 local scaled_ceil = function(x) return math.ceil(x / scale) * scale end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
184 local rotated_box = {
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
185 left_top = {
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
186 x = proto.collision_box.left_top.y,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
187 y = proto.collision_box.left_top.x,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
188 },
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
189 right_bottom = {
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
190 x = proto.collision_box.right_bottom.y,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
191 y = proto.collision_box.right_bottom.x,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
192 },
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
193 }
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
194 ---@param x number
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
195 ---@param y number
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
196 ---@param direction defines.direction
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
197 ---@param collision_box data.BoundingBox
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
198 local function test_placement(x, y, direction, collision_box)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
199 local pos = {
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
200 x = x + offset_x(collision_box) * scale,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
201 y = y + offset_y(collision_box) * scale
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
202 }
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
203 local can_build = player.can_place_entity{
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
204 name = collision_tester(entity_name),
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
205 position = pos,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
206 direction = direction,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
207 terrain_building_size = 1,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
208 }
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
209 if can_build and proto.type == "mining-drill" and not resources_test(player.surface.name, pos, proto)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
210 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
211 can_build = false
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
212 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
213 if can_build
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
214 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
215 local xi = scaled_ceil(collision_box.left_top.x)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
216 local xj = scaled_ceil(collision_box.right_bottom.x + 0.5*scale)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
217 local yj = scaled_ceil(collision_box.right_bottom.y + 0.5*scale)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
218 while xi < xj
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
219 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
220 local yi = scaled_ceil(collision_box.left_top.y)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
221 while yi < yj
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
222 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
223 if not collision_box_table[x + xi]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
224 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
225 collision_box_table[x + xi] = {}
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
226 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
227 collision_box_table[x + xi][y + yi] = true
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
228 yi = yi + scale
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
229 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
230 xi = xi + scale
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
231 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
232 else
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
233 if collision_box_table[x][y] == nil
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
234 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
235 collision_box_table[x][y] = false
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
236 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
237 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
238 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
239 local x0 = scaled_ceil(player.position.x)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
240 local y0 = scaled_ceil(player.position.y)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
241 local x = x0 - 12*scale
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
242 local xn = x0 + 11*scale
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
243 local yn = y0 + 11*scale
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
244 while x <= xn
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
245 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
246 if not collision_box_table[x]
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
247 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
248 collision_box_table[x] = {}
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
249 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
250 local y = y0 - 12*scale
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
251 while y <= yn
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
252 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
253 local collision_box = proto.collision_box
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
254 test_placement(x, y, defines.direction.north, collision_box)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
255 if proto.type == "asteroid-collector"
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
256 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
257 test_placement(x, y, defines.direction.east, rotated_box)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
258 test_placement(x, y, defines.direction.west, rotated_box)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
259 test_placement(x, y, defines.direction.south, collision_box)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
260 elseif can_be_rotated(proto)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
261 then
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
262 test_placement(x, y, defines.direction.east, rotated_box)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
263 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
264 y = y + scale
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
265 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
266 x = x + scale
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
267 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
268 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
269 local function red(a) return {r=a, g=0, b=0, a=a } end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
270 local function green(a) return {r=0, g=a, b=0, a=a } end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
271 for x, k in pairs(collision_box_table)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
272 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
273 for y, can_build in pairs(k)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
274 do
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
275 ---@return LuaRendering.draw_rectangle_param
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
276 local parms = function(a)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
277 return {
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
278 surface = player.surface,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
279 color = (can_build and green or red)(a),
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
280 filled = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
281 left_top = {x = x, y = y },
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
282 right_bottom = { x = x + scale - 0.05, y = y + scale - 0.05 },
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
283 time_to_live = 30,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
284 players = {player},
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
285 only_in_alt_mode = true,
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
286 }
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
287 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
288 rendering.draw_rectangle(parms (0.2))
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
289 local parms_2 = parms(0.2)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
290 parms_2.draw_on_ground = true
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
291 rendering.draw_rectangle(parms_2)
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
292 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
293 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
294 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
295 end
c26d4dd2af9b Add show-buildable mod
Teemu Piippo <teemu.s.piippo@gmail.com>
parents:
diff changeset
296 end)

mercurial