aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--advtrains_interlocking/lzb.lua49
1 files changed, 31 insertions, 18 deletions
diff --git a/advtrains_interlocking/lzb.lua b/advtrains_interlocking/lzb.lua
index c352869..e439703 100644
--- a/advtrains_interlocking/lzb.lua
+++ b/advtrains_interlocking/lzb.lua
@@ -41,25 +41,38 @@ The traverser stops at signals that result in spd==0, because changes beyond the
local il = advtrains.interlocking
-local BRAKE_SPACE = 10
-local AWARE_ZONE = 50
+local params = {
+ BRAKE_SPACE = 10,
+ AWARE_ZONE = 50,
-local ADD_STAND = 2.5
-local ADD_SLOW = 1.5
-local ADD_FAST = 7
-local ZONE_ROLL = 2
-local ZONE_HOLD = 5 -- added on top of ZONE_ROLL
-local ZONE_VSLOW = 3 -- When speed is <2, still allow accelerating
+ ADD_STAND = 2.5,
+ ADD_SLOW = 1.5,
+ ADD_FAST = 7,
+ ZONE_ROLL = 2,
+ ZONE_HOLD = 5, -- added on top of ZONE_ROLL
+ ZONE_VSLOW = 3, -- When speed is <2, still allow accelerating
+
+ DST_FACTOR = 1.5,
+
+ SHUNT_SPEED_MAX = advtrains.SHUNT_SPEED_MAX,
+}
+
+function advtrains.interlocking.set_lzb_param(par, val)
+ if params[par] and tonumber(val) then
+ params[par] = tonumber(val)
+ else
+ error("Inexistant param or not a number")
+ end
+end
-local SHUNT_SPEED_MAX = advtrains.SHUNT_SPEED_MAX
local function look_ahead(id, train)
local acc = advtrains.get_acceleration(train, 1)
local vel = train.velocity
- local brakedst = -(vel*vel) / (2*acc)
+ local brakedst = ( -(vel*vel) / (2*acc) ) * params.DST_FACTOR
- local brake_i = advtrains.path_get_index_by_offset(train, train.index, brakedst + BRAKE_SPACE)
+ local brake_i = advtrains.path_get_index_by_offset(train, train.index, brakedst + params.BRAKE_SPACE)
--local aware_i = advtrains.path_get_index_by_offset(train, brake_i, AWARE_ZONE)
local lzb = train.lzb
@@ -103,7 +116,7 @@ local function look_ahead(id, train)
if lzb.travsht then
--shunt move
if asp.shunt.free then
- nspd = SHUNT_SPEED_MAX
+ nspd = params.SHUNT_SPEED_MAX
elseif asp.shunt.proceed_as_main and asp.main.free then
nspd = asp.main.speed
lzb.travsht = false
@@ -113,7 +126,7 @@ local function look_ahead(id, train)
if asp.main.free then
nspd = asp.main.speed
elseif asp.shunt.free then
- nspd = SHUNT_SPEED_MAX
+ nspd = params.SHUNT_SPEED_MAX
lzb.travsht = true
end
end
@@ -190,12 +203,12 @@ local function apply_control(id, train)
local f = (v1-v0) / a
local s = v0*f + a*f*f/2
- local st = s + ADD_SLOW
+ local st = s + params.ADD_SLOW
if v0 > 3 then
- st = s + ADD_FAST
+ st = s + params.ADD_FAST
end
if v0<=0 then
- st = s + ADD_STAND
+ st = s + params.ADD_STAND
end
local i = advtrains.path_get_index_by_offset(train, it.idx, -st)
@@ -208,13 +221,13 @@ local function apply_control(id, train)
return
end
- i = advtrains.path_get_index_by_offset(train, i, -ZONE_ROLL)
+ i = advtrains.path_get_index_by_offset(train, i, -params.ZONE_ROLL)
if i <= train.index and v0>1 then
-- roll control
train.ctrl.lzb = 2
return
end
- i = advtrains.path_get_index_by_offset(train, i, -ZONE_HOLD)
+ i = advtrains.path_get_index_by_offset(train, i, -params.ZONE_HOLD)
if i <= train.index and v0>1 then
-- hold speed
train.ctrl.lzb = 3
c">#pragma once #include <map> #include <mutex> #include "network/networkprotocol.h" #include "irr_v3d.h" #include "util/container.h" #include "mapgen/mapgen.h" // for MapgenParams #include "map.h" #define BLOCK_EMERGE_ALLOW_GEN (1 << 0) #define BLOCK_EMERGE_FORCE_QUEUE (1 << 1) #define EMERGE_DBG_OUT(x) { \ if (enable_mapgen_debug_info) \ infostream << "EmergeThread: " x << std::endl; \ } class EmergeThread; class NodeDefManager; class Settings; class BiomeManager; class OreManager; class DecorationManager; class SchematicManager; class Server; class ModApiMapgen; // Structure containing inputs/outputs for chunk generation struct BlockMakeData { MMVManip *vmanip = nullptr; u64 seed = 0; v3s16 blockpos_min; v3s16 blockpos_max; v3s16 blockpos_requested; UniqueQueue<v3s16> transforming_liquid; const NodeDefManager *nodedef = nullptr; BlockMakeData() = default; ~BlockMakeData() { delete vmanip; } }; // Result from processing an item on the emerge queue enum EmergeAction { EMERGE_CANCELLED, EMERGE_ERRORED, EMERGE_FROM_MEMORY, EMERGE_FROM_DISK, EMERGE_GENERATED, }; // Callback typedef void (*EmergeCompletionCallback)( v3s16 blockpos, EmergeAction action, void *param); typedef std::vector< std::pair< EmergeCompletionCallback, void * > > EmergeCallbackList; struct BlockEmergeData { u16 peer_requested; u16 flags; EmergeCallbackList callbacks; }; class EmergeParams { friend class EmergeManager; public: EmergeParams() = delete; ~EmergeParams(); DISABLE_CLASS_COPY(EmergeParams); const NodeDefManager *ndef; // shared bool enable_mapgen_debug_info; u32 gen_notify_on; const std::set<u32> *gen_notify_on_deco_ids; // shared BiomeManager *biomemgr; OreManager *oremgr; DecorationManager *decomgr; SchematicManager *schemmgr; private: EmergeParams(EmergeManager *parent, const BiomeManager *biomemgr, const OreManager *oremgr, const DecorationManager *decomgr, const SchematicManager *schemmgr); }; class EmergeManager { /* The mod API needs unchecked access to allow: * - using decomgr or oremgr to place decos/ores * - using schemmgr to load and place schematics */ friend class ModApiMapgen; public: const NodeDefManager *ndef; bool enable_mapgen_debug_info; // Generation Notify u32 gen_notify_on = 0; std::set<u32> gen_notify_on_deco_ids; // Parameters passed to mapgens owned by ServerMap // TODO(hmmmm): Remove this after mapgen helper methods using them // are moved to ServerMap MapgenParams *mgparams; // Hackish workaround: // For now, EmergeManager must hold onto a ptr to the Map's setting manager // since the Map can only be accessed through the Environment, and the // Environment is not created until after script initialization. MapSettingsManager *map_settings_mgr; // Methods EmergeManager(Server *server); ~EmergeManager(); DISABLE_CLASS_COPY(EmergeManager); // no usage restrictions const BiomeManager *getBiomeManager() const { return biomemgr; } const OreManager *getOreManager() const { return oremgr; } const DecorationManager *getDecorationManager() const { return decomgr; } const SchematicManager *getSchematicManager() const { return schemmgr; } // only usable before mapgen init BiomeManager *getWritableBiomeManager(); OreManager *getWritableOreManager(); DecorationManager *getWritableDecorationManager(); SchematicManager *getWritableSchematicManager(); void initMapgens(MapgenParams *mgparams); void startThreads(); void stopThreads(); bool isRunning(); bool enqueueBlockEmerge( session_t peer_id, v3s16 blockpos, bool allow_generate, bool ignore_queue_limits=false); bool enqueueBlockEmergeEx( v3s16 blockpos, session_t peer_id, u16 flags, EmergeCompletionCallback callback, void *callback_param); v3s16 getContainingChunk(v3s16 blockpos); Mapgen *getCurrentMapgen(); // Mapgen helpers methods int getSpawnLevelAtPoint(v2s16 p); int getGroundLevelAtPoint(v2s16 p); bool isBlockUnderground(v3s16 blockpos); static v3s16 getContainingChunk(v3s16 blockpos, s16 chunksize); private: std::vector<Mapgen *> m_mapgens; std::vector<EmergeThread *> m_threads; bool m_threads_active = false; std::mutex m_queue_mutex; std::map<v3s16, BlockEmergeData> m_blocks_enqueued; std::unordered_map<u16, u16> m_peer_queue_count; u16 m_qlimit_total; u16 m_qlimit_diskonly; u16 m_qlimit_generate; // Managers of various map generation-related components // Note that each Mapgen gets a copy(!) of these to work with BiomeManager *biomemgr; OreManager *oremgr; DecorationManager *decomgr; SchematicManager *schemmgr; // Requires m_queue_mutex held EmergeThread *getOptimalThread(); bool pushBlockEmergeData( v3s16 pos, u16 peer_requested, u16 flags, EmergeCompletionCallback callback, void *callback_param, bool *entry_already_exists); bool popBlockEmergeData(v3s16 pos, BlockEmergeData *bedata); friend class EmergeThread; };