diff options
author | orwell96 <orwell@bleipb.de> | 2023-06-24 14:37:52 +0200 |
---|---|---|
committer | orwell96 <orwell@bleipb.de> | 2023-06-24 14:37:52 +0200 |
commit | 2d7640d424c3d7d558ed0b81b8d98fd306562d11 (patch) | |
tree | 8850737a635a3ae6a09e081b7b0661b6643a7a5c /advtrains/path.lua | |
parent | 283efc44ce78001ebd17f64555eb795e36b27a61 (diff) | |
download | advtrains-2d7640d424c3d7d558ed0b81b8d98fd306562d11.tar.gz advtrains-2d7640d424c3d7d558ed0b81b8d98fd306562d11.tar.bz2 advtrains-2d7640d424c3d7d558ed0b81b8d98fd306562d11.zip |
Occupation system: store multiple indices for the same train, introduce reverse_lookup_sel() to select appropriate index out of multiple based on a heuristic
Diffstat (limited to 'advtrains/path.lua')
-rw-r--r-- | advtrains/path.lua | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/advtrains/path.lua b/advtrains/path.lua index 19387b1..15a61fe 100644 --- a/advtrains/path.lua +++ b/advtrains/path.lua @@ -119,7 +119,7 @@ function advtrains.path_invalidate(train, ignore_lock) if train.path then for i,p in pairs(train.path) do - advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(p)) + advtrains.occ.clear_all_items(train.id, advtrains.round_vector_floor_y(p)) end end train.path = nil @@ -393,7 +393,7 @@ local PATH_CLEAR_KEEP = 4 function advtrains.path_clear_unused(train) local i for i = train.path_ext_b, train.path_req_b - PATH_CLEAR_KEEP do - advtrains.occ.clear_item(train.id, advtrains.round_vector_floor_y(train.path[i])) + advtrains.occ.clear_specific_item(train.id, advtrains.round_vector_floor_y(train.path[i]), i) train.path[i] = nil train.path_dist[i-1] = nil train.path_cp[i] = nil @@ -434,18 +434,19 @@ end -- Projects the path of "train" onto the path of "onto_train_id", and returns the index on onto_train's path -- that corresponds to "index" on "train"'s path, as well as whether both trains face each other -- index may be fractional +-- heuristic: see advtrains.occ.reverse_lookup_sel() -- returns: res_index, trains_facing -- returns nil when path can not be projected, either because trains are on different tracks or -- node at "index" happens to be on a turnout and it's the wrong direction -- Note - duplicate with similar functionality is in train_step_b() - that code combines train detection with projecting -function advtrains.path_project(train, index, onto_train_id) +function advtrains.path_project(train, index, onto_train_id, heuristic) local base_idx = atfloor(index) local frac_part = index - base_idx local base_pos = advtrains.path_get(train, base_idx) local base_cn = train.path_cn[base_idx] local otrn = advtrains.trains[onto_train_id] -- query occupation - local occ = advtrains.occ.get_trains_over(base_pos) + local occ = advtrains.occ.reverse_lookup_sel(base_pos, heuristic) -- is wanted train id contained? local ob_idx = occ[onto_train_id] if not ob_idx then |