Skip to content

Commit

Permalink
ADD: Maintenance costs for roadsigns and signals
Browse files Browse the repository at this point in the history
git-svn-id: svn://tron.homeunix.org/simutrans/simutrans/trunk@11648 8aca7d54-2c30-db11-9de9-000461428c89
  • Loading branch information
ceeac committed Mar 2, 2025
1 parent 02135b0 commit 78dc5ec
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 46 deletions.
1 change: 1 addition & 0 deletions simutrans/history.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
FIX: makro building with way order and stations extensions fixed
FIX: Freelist allocated objects (tiles, ways, trees etc.) use 3x more memory than necessary
FIX: Do not change underground mode when scrolling from the minimap
ADD: Monthly maintenance for roadsigns and signals (maintenance=1234 in dat file)


Release of 124.3 (r11590 on 10-Jan-2025):
Expand Down
82 changes: 46 additions & 36 deletions src/simutrans/descriptor/reader/roadsign_reader.cc
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@
#include "../../network/pakset_info.h"
#include "../../tpl/array_tpl.h"

#include <cinttypes>


void roadsign_reader_t::register_obj(obj_desc_t *&data)
{
Expand All @@ -36,7 +38,7 @@ bool roadsign_reader_t::successfully_loaded() const
}


obj_desc_t * roadsign_reader_t::read_node(FILE *fp, obj_node_info_t &node)
obj_desc_t *roadsign_reader_t::read_node(FILE *fp, obj_node_info_t &node)
{
array_tpl<char> desc_buf(node.size);
if (fread(desc_buf.begin(), node.size, 1, fp) != 1) {
Expand All @@ -48,55 +50,62 @@ obj_desc_t * roadsign_reader_t::read_node(FILE *fp, obj_node_info_t &node)
const int version = v & 0x8000 ? v & 0x7FFF : 0;
roadsign_desc_t *desc = new roadsign_desc_t();

if(version==5) {
// Versioned node, version 5
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = decode_uint32(p);
desc->flags = decode_uint16(p);
if (version == 6) {
// cost as sint64, maintenance added
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = decode_sint64(p);
desc->maintenance = decode_sint64(p);
desc->flags = decode_uint16(p);
desc->offset_left = decode_sint8(p);
desc->wtyp = decode_uint8(p);
desc->intro_date = decode_uint16(p);
desc->retire_date = decode_uint16(p);
}
else if (version == 5) {
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = decode_uint32(p);
desc->flags = decode_uint16(p);
desc->offset_left = decode_sint8(p);
desc->wtyp = decode_uint8(p);
desc->intro_date = decode_uint16(p);
desc->wtyp = decode_uint8(p);
desc->intro_date = decode_uint16(p);
desc->retire_date = decode_uint16(p);
}
else if(version==4) {
// Versioned node, version 4
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = decode_uint32(p);
desc->flags = decode_uint8(p);
else if (version == 4) {
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = decode_uint32(p);
desc->flags = decode_uint8(p);
desc->offset_left = decode_sint8(p);
desc->wtyp = decode_uint8(p);
desc->intro_date = decode_uint16(p);
desc->wtyp = decode_uint8(p);
desc->intro_date = decode_uint16(p);
desc->retire_date = decode_uint16(p);
}
else if(version==3) {
// Versioned node, version 3
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = decode_uint32(p);
desc->flags = decode_uint8(p);
else if (version == 3) {
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = decode_uint32(p);
desc->flags = decode_uint8(p);
desc->offset_left = 14;
desc->wtyp = decode_uint8(p);
desc->intro_date = decode_uint16(p);
desc->wtyp = decode_uint8(p);
desc->intro_date = decode_uint16(p);
desc->retire_date = decode_uint16(p);
}
else if(version==2) {
// Versioned node, version 2
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = decode_uint32(p);
desc->flags = decode_uint8(p);
else if (version == 2) {
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = decode_uint32(p);
desc->flags = decode_uint8(p);
desc->offset_left = 14;
desc->intro_date = DEFAULT_INTRO_YEAR*12;
desc->intro_date = DEFAULT_INTRO_YEAR*12;
desc->retire_date = DEFAULT_RETIRE_YEAR*12;
desc->wtyp = road_wt;
desc->wtyp = road_wt;
}
else if(version==1) {
else if (version == 1) {
// Versioned node, version 1
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = 50000;
desc->flags = decode_uint8(p);
desc->min_speed = kmh_to_speed(decode_uint16(p));
desc->price = 50000;
desc->flags = decode_uint8(p);
desc->offset_left = 14;
desc->intro_date = DEFAULT_INTRO_YEAR*12;
desc->intro_date = DEFAULT_INTRO_YEAR*12;
desc->retire_date = DEFAULT_RETIRE_YEAR*12;
desc->wtyp = road_wt;
desc->wtyp = road_wt;
}
else {
dbg->fatal( "roadsign_reader_t::read_node()", "Cannot handle too new node version %i", version );
Expand All @@ -108,10 +117,11 @@ obj_desc_t * roadsign_reader_t::read_node(FILE *fp, obj_node_info_t &node)
}

PAKSET_INFO("roadsign_reader_t::read_node()",
"version=%i, min_speed=%i, price=%i, flags=%x, wtyp=%i, offset_left=%i, intro=%i/%i, retire=%i/%i",
"version=%i, min_speed=%i, price=%" PRId64 ", maintenance=%" PRId64, "flags=%x, wtyp=%i, offset_left=%i, intro=%i/%i, retire=%i/%i",
version,
desc->min_speed,
desc->price/100,
desc->maintenance,
desc->flags,
desc->wtyp,
desc->offset_left,
Expand Down
22 changes: 12 additions & 10 deletions src/simutrans/descriptor/writer/roadsign_writer.cc
Original file line number Diff line number Diff line change
Expand Up @@ -77,15 +77,15 @@ void parse_images_numbered(slist_tpl<std::string>& keys, tabfileobj_t& obj)
}
}


void roadsign_writer_t::write_obj(FILE* fp, obj_node_t& parent, tabfileobj_t& obj)
{
obj_node_t node(this, 16, &parent);

uint32 const price = obj.get_int("cost", 500) * 100;
uint16 const min_speed = obj.get_int("min_speed", 0);
sint8 const offset_left = obj.get_int("offset_left", 14);
uint8 const wtyp = get_waytype(obj.get("waytype"));
roadsign_desc_t::types flags = roadsign_desc_t::NONE;
const sint64 price = obj.get_int64("cost", 500) * 100;
const sint64 maintenance = obj.get_int64("maintenance", 0);
const uint16 min_speed = obj.get_int("min_speed", 0);
const sint8 offset_left = obj.get_int("offset_left", 14);
const uint8 wtyp = get_waytype(obj.get("waytype"));
roadsign_desc_t::types flags = roadsign_desc_t::NONE;

if( obj.get_int("is_signal",0) ) {
flags = roadsign_desc_t::SIGN_SIGNAL;
Expand Down Expand Up @@ -113,10 +113,12 @@ void roadsign_writer_t::write_obj(FILE* fp, obj_node_t& parent, tabfileobj_t& ob
}
// this causes unused entries to give a warning that they are ignored

// write version data
node.write_version(fp, 5);
obj_node_t node(this, 28, &parent);

node.write_version(fp, 6);
node.write_uint16(fp, min_speed);
node.write_uint32(fp, price);
node.write_sint64(fp, price);
node.write_sint64(fp, maintenance);
node.write_uint16(fp, flags);
node.write_uint8 (fp, offset_left);
node.write_uint8 (fp, wtyp);
Expand Down

0 comments on commit 78dc5ec

Please sign in to comment.