Only show ship is lost messages if lost for a significant time
This commit is contained in:
@@ -127,6 +127,7 @@ const SlxiSubChunkInfo _sl_xv_sub_chunk_infos[] = {
|
|||||||
{ XSLFI_DOCKING_CACHE_VER, XSCF_IGNORABLE_ALL, 1, 1, "docking_cache_ver", nullptr, nullptr, nullptr },
|
{ XSLFI_DOCKING_CACHE_VER, XSCF_IGNORABLE_ALL, 1, 1, "docking_cache_ver", nullptr, nullptr, nullptr },
|
||||||
{ XSLFI_EXTRA_CHEATS, XSCF_NULL, 1, 1, "extra_cheats", nullptr, nullptr, "CHTX" },
|
{ XSLFI_EXTRA_CHEATS, XSCF_NULL, 1, 1, "extra_cheats", nullptr, nullptr, "CHTX" },
|
||||||
{ XSLFI_TOWN_MULTI_BUILDING, XSCF_NULL, 1, 1, "town_multi_building", nullptr, nullptr, nullptr },
|
{ XSLFI_TOWN_MULTI_BUILDING, XSCF_NULL, 1, 1, "town_multi_building", nullptr, nullptr, nullptr },
|
||||||
|
{ XSLFI_SHIP_LOST_COUNTER, XSCF_NULL, 1, 1, "ship_lost_counter", nullptr, nullptr, nullptr },
|
||||||
{ XSLFI_NULL, XSCF_NULL, 0, 0, nullptr, nullptr, nullptr, nullptr },// This is the end marker
|
{ XSLFI_NULL, XSCF_NULL, 0, 0, nullptr, nullptr, nullptr, nullptr },// This is the end marker
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -84,6 +84,7 @@ enum SlXvFeatureIndex {
|
|||||||
XSLFI_DOCKING_CACHE_VER, ///< Multiple docks - docking tile cache version
|
XSLFI_DOCKING_CACHE_VER, ///< Multiple docks - docking tile cache version
|
||||||
XSLFI_EXTRA_CHEATS, ///< Extra cheats
|
XSLFI_EXTRA_CHEATS, ///< Extra cheats
|
||||||
XSLFI_TOWN_MULTI_BUILDING, ///< Allow multiple stadium/church buildings in a single town
|
XSLFI_TOWN_MULTI_BUILDING, ///< Allow multiple stadium/church buildings in a single town
|
||||||
|
XSLFI_SHIP_LOST_COUNTER, ///< Ship lost counter
|
||||||
|
|
||||||
XSLFI_RIFF_HEADER_60_BIT, ///< Size field in RIFF chunk header is 60 bit
|
XSLFI_RIFF_HEADER_60_BIT, ///< Size field in RIFF chunk header is 60 bit
|
||||||
XSLFI_HEIGHT_8_BIT, ///< Map tile height is 8 bit instead of 4 bit, but savegame version may be before this became true in trunk
|
XSLFI_HEIGHT_8_BIT, ///< Map tile height is 8 bit instead of 4 bit, but savegame version may be before this became true in trunk
|
||||||
|
@@ -840,6 +840,7 @@ const SaveLoad *GetVehicleDescription(VehicleType vt)
|
|||||||
SLE_VAR(Ship, state, SLE_UINT8),
|
SLE_VAR(Ship, state, SLE_UINT8),
|
||||||
SLE_CONDDEQUE(Ship, path, SLE_UINT8, SLV_SHIP_PATH_CACHE, SL_MAX_VERSION),
|
SLE_CONDDEQUE(Ship, path, SLE_UINT8, SLV_SHIP_PATH_CACHE, SL_MAX_VERSION),
|
||||||
SLE_CONDVAR(Ship, rotation, SLE_UINT8, SLV_SHIP_ROTATION, SL_MAX_VERSION),
|
SLE_CONDVAR(Ship, rotation, SLE_UINT8, SLV_SHIP_ROTATION, SL_MAX_VERSION),
|
||||||
|
SLE_CONDVAR_X(Ship, lost_count, SLE_UINT8, SL_MIN_VERSION, SL_MAX_VERSION, SlXvFeatureTest(XSLFTO_AND, XSLFI_SHIP_LOST_COUNTER)),
|
||||||
|
|
||||||
SLE_CONDNULL(16, SLV_2, SLV_144), // old reserved space
|
SLE_CONDNULL(16, SLV_2, SLV_144), // old reserved space
|
||||||
|
|
||||||
|
@@ -31,6 +31,7 @@ struct Ship FINAL : public SpecializedVehicle<Ship, VEH_SHIP> {
|
|||||||
Direction rotation; ///< Visible direction.
|
Direction rotation; ///< Visible direction.
|
||||||
int16 rotation_x_pos; ///< NOSAVE: X Position before rotation.
|
int16 rotation_x_pos; ///< NOSAVE: X Position before rotation.
|
||||||
int16 rotation_y_pos; ///< NOSAVE: Y Position before rotation.
|
int16 rotation_y_pos; ///< NOSAVE: Y Position before rotation.
|
||||||
|
uint8 lost_count; ///< Count of number of failed pathfinder attempts
|
||||||
|
|
||||||
/** We don't want GCC to zero our struct! It already is zeroed and has an index! */
|
/** We don't want GCC to zero our struct! It already is zeroed and has an index! */
|
||||||
Ship() : SpecializedVehicleBase() {}
|
Ship() : SpecializedVehicleBase() {}
|
||||||
|
@@ -12,6 +12,7 @@
|
|||||||
#include "../newgrf_roadtype.h"
|
#include "../newgrf_roadtype.h"
|
||||||
#include "../date_func.h"
|
#include "../date_func.h"
|
||||||
#include "../timetable.h"
|
#include "../timetable.h"
|
||||||
|
#include "../ship.h"
|
||||||
|
|
||||||
/* Helper for filling property tables */
|
/* Helper for filling property tables */
|
||||||
#define NIP(prop, base, variable, type, name) { name, (ptrdiff_t)cpp_offsetof(base, variable), cpp_sizeof(base, variable), prop, type }
|
#define NIP(prop, base, variable, type, name) { name, (ptrdiff_t)cpp_offsetof(base, variable), cpp_sizeof(base, variable), prop, type }
|
||||||
@@ -149,6 +150,12 @@ class NIHVehicle : public NIHelper {
|
|||||||
t->wait_counter, t->reverse_distance, t->tunnel_bridge_signal_num, t->speed_restriction);
|
t->wait_counter, t->reverse_distance, t->tunnel_bridge_signal_num, t->speed_restriction);
|
||||||
print(buffer);
|
print(buffer);
|
||||||
}
|
}
|
||||||
|
if (v->type == VEH_SHIP) {
|
||||||
|
const Ship *s = Ship::From(v);
|
||||||
|
seprintf(buffer, lastof(buffer), " Lost counter: %u",
|
||||||
|
s->lost_count);
|
||||||
|
print(buffer);
|
||||||
|
}
|
||||||
|
|
||||||
if (HasBit(v->vehicle_flags, VF_SEPARATION_ACTIVE)) {
|
if (HasBit(v->vehicle_flags, VF_SEPARATION_ACTIVE)) {
|
||||||
std::vector<TimetableProgress> progress_array = PopulateSeparationState(v);
|
std::vector<TimetableProgress> progress_array = PopulateSeparationState(v);
|
||||||
|
@@ -885,16 +885,27 @@ void Vehicle::HandlePathfindingResult(bool path_found)
|
|||||||
|
|
||||||
/* Clear the flag as the PF's problem was solved. */
|
/* Clear the flag as the PF's problem was solved. */
|
||||||
ClrBit(this->vehicle_flags, VF_PATHFINDER_LOST);
|
ClrBit(this->vehicle_flags, VF_PATHFINDER_LOST);
|
||||||
|
if (this->type == VEH_SHIP) {
|
||||||
|
Ship::From(this)->lost_count = 0;
|
||||||
|
}
|
||||||
/* Delete the news item. */
|
/* Delete the news item. */
|
||||||
DeleteVehicleNews(this->index, STR_NEWS_VEHICLE_IS_LOST);
|
DeleteVehicleNews(this->index, STR_NEWS_VEHICLE_IS_LOST);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (this->type == VEH_SHIP) {
|
||||||
|
SetBit(this->vehicle_flags, VF_PATHFINDER_LOST);
|
||||||
|
if (Ship::From(this)->lost_count == 255) return;
|
||||||
|
Ship::From(this)->lost_count++;
|
||||||
|
if (Ship::From(this)->lost_count != 16) return;
|
||||||
|
} else {
|
||||||
/* Were we already lost? */
|
/* Were we already lost? */
|
||||||
if (HasBit(this->vehicle_flags, VF_PATHFINDER_LOST)) return;
|
if (HasBit(this->vehicle_flags, VF_PATHFINDER_LOST)) return;
|
||||||
|
|
||||||
/* It is first time the problem occurred, set the "lost" flag. */
|
/* It is first time the problem occurred, set the "lost" flag. */
|
||||||
SetBit(this->vehicle_flags, VF_PATHFINDER_LOST);
|
SetBit(this->vehicle_flags, VF_PATHFINDER_LOST);
|
||||||
|
}
|
||||||
|
|
||||||
/* Notify user about the event. */
|
/* Notify user about the event. */
|
||||||
AI::NewEvent(this->owner, new ScriptEventVehicleLost(this->index));
|
AI::NewEvent(this->owner, new ScriptEventVehicleLost(this->index));
|
||||||
if (_settings_client.gui.lost_vehicle_warn && this->owner == _local_company) {
|
if (_settings_client.gui.lost_vehicle_warn && this->owner == _local_company) {
|
||||||
|
Reference in New Issue
Block a user