60
60
bild = after_bild = IMG_LEER;
63
63
// if more than one state, we will switch direction and phase for traffic lights
64
automatic = (besch->gib_bild_anzahl()>4 && besch->gib_wtyp()==road_wt);
64
automatic = (besch->get_bild_anzahl()>4 && besch->get_wtyp()==road_wt);
69
69
roadsign_t::~roadsign_t()
71
const grund_t *gr = welt->lookup(gib_pos());
71
const grund_t *gr = welt->lookup(get_pos());
73
weg_t *weg = gr->gib_weg((waytype_t)besch->gib_wtyp());
73
weg_t *weg = gr->get_weg((waytype_t)besch->get_wtyp());
75
75
// Weg wieder freigeben, wenn das Signal nicht mehr da ist.
76
weg->setze_ribi_maske(ribi_t::keine);
76
weg->set_ribi_maske(ribi_t::keine);
79
79
dbg->error("roadsign_t::~roadsign_t()","roadsign_t %p was deleted but ground was not a road!");
89
89
void roadsign_t::set_dir(ribi_t::ribi dir)
92
weg_t *weg = welt->lookup(gib_pos())->gib_weg((waytype_t)besch->gib_wtyp());
93
if(besch->gib_wtyp()!=track_wt && besch->gib_wtyp()!=monorail_wt) {
92
weg_t *weg = welt->lookup(get_pos())->get_weg((waytype_t)besch->get_wtyp());
93
if(besch->get_wtyp()!=track_wt && besch->get_wtyp()!=monorail_wt&& besch->get_wtyp()!=maglev_wt&& besch->get_wtyp()!=narrowgauge_wt) {
96
96
if(besch->is_single_way() || besch->is_signal() || besch->is_pre_signal() || besch->is_longblock_signal()) {
97
97
// set mask, if it is a signle way ...
99
99
if(ribi_t::ist_einfach(dir)) {
100
weg->setze_ribi_maske(dir);
100
weg->set_ribi_maske(dir);
103
weg->setze_ribi_maske(ribi_t::keine);
103
weg->set_ribi_maske(ribi_t::keine);
105
105
DBG_MESSAGE("roadsign_t::set_dir()","ribi %i",dir);
109
mark_image_dirty(gib_bild(),0);
109
mark_image_dirty(get_bild(),0);
110
110
mark_image_dirty(after_bild,after_offset);
179
179
after_bild = IMG_LEER;
181
181
if(dir&ribi_t::ost) {
182
after_bild = besch->gib_bild_nr(3+zustand*4);
182
after_bild = besch->get_bild_nr(3+zustand*4);
185
185
if(dir&ribi_t::nord) {
186
186
if(after_bild!=IMG_LEER) {
187
tmp_bild = besch->gib_bild_nr(0+zustand*4);
187
tmp_bild = besch->get_bild_nr(0+zustand*4);
190
after_bild = besch->gib_bild_nr(0+zustand*4);
190
after_bild = besch->get_bild_nr(0+zustand*4);
194
194
if(dir&ribi_t::west) {
195
tmp_bild = besch->gib_bild_nr(2+zustand*4);
195
tmp_bild = besch->get_bild_nr(2+zustand*4);
198
198
if(dir&ribi_t::sued) {
199
199
if(tmp_bild!=IMG_LEER) {
200
after_bild = besch->gib_bild_nr(1+zustand*4);
200
after_bild = besch->get_bild_nr(1+zustand*4);
203
tmp_bild = besch->gib_bild_nr(1+zustand*4);
203
tmp_bild = besch->get_bild_nr(1+zustand*4);
228
228
if(weg_dir&ribi_t::nord) {
229
229
if(weg_dir&ribi_t::ost) {
230
after_bild = besch->gib_bild_nr(6+direction*8);
230
after_bild = besch->get_bild_nr(6+direction*8);
233
after_bild = besch->gib_bild_nr(1+direction*8);
233
after_bild = besch->get_bild_nr(1+direction*8);
236
236
else if(weg_dir&ribi_t::ost) {
237
after_bild = besch->gib_bild_nr(2+direction*8);
237
after_bild = besch->get_bild_nr(2+direction*8);
240
240
if(weg_dir&ribi_t::west) {
241
241
if(weg_dir&ribi_t::sued) {
242
setze_bild(besch->gib_bild_nr(7+direction*8));
242
set_bild(besch->get_bild_nr(7+direction*8));
245
setze_bild(besch->gib_bild_nr(3+direction*8));
245
set_bild(besch->get_bild_nr(3+direction*8));
248
248
else if(weg_dir&ribi_t::sued) {
249
setze_bild(besch->gib_bild_nr(0+direction*8));
249
set_bild(besch->get_bild_nr(0+direction*8));
253
253
// drive right ...
254
254
if(weg_dir&ribi_t::sued) {
255
255
if(weg_dir&ribi_t::ost) {
256
after_bild = besch->gib_bild_nr(4+direction*8);
256
after_bild = besch->get_bild_nr(4+direction*8);
259
after_bild = besch->gib_bild_nr(0+direction*8);
259
after_bild = besch->get_bild_nr(0+direction*8);
262
262
else if(weg_dir&ribi_t::ost) {
263
after_bild = besch->gib_bild_nr(2+direction*8);
263
after_bild = besch->get_bild_nr(2+direction*8);
266
266
if(weg_dir&ribi_t::west) {
267
267
if(weg_dir&ribi_t::nord) {
268
setze_bild(besch->gib_bild_nr(5+direction*8));
268
set_bild(besch->get_bild_nr(5+direction*8));
271
setze_bild(besch->gib_bild_nr(3+direction*8));
271
set_bild(besch->get_bild_nr(3+direction*8));
274
274
else if(weg_dir&ribi_t::nord) {
275
setze_bild(besch->gib_bild_nr(1+direction*8));
275
set_bild(besch->get_bild_nr(1+direction*8));
320
320
if(after_bild!=IMG_LEER) {
321
321
const int raster_width = get_tile_raster_width();
322
ypos += tile_raster_scale_x(gib_yoff()+after_offset, raster_width);
323
xpos += tile_raster_scale_x(gib_xoff(), raster_width);
322
ypos += tile_raster_scale_x(get_yoff()+after_offset, raster_width);
323
xpos += tile_raster_scale_x(get_xoff(), raster_width);
324
324
// draw with owner
325
325
if(get_player_nr()!=-1) {
326
326
display_color_img(after_bild, xpos, ypos, get_player_nr(), true, get_flag(ding_t::dirty) );
349
351
if(file->is_saving()) {
350
const char *s = besch->gib_name();
351
file->rdwr_str(s, "N");
352
const char *s = besch->get_name();
354
if(file->is_loading()) {
356
file->rd_str_into(bname, "N");
357
file->rdwr_str(bname, 128);
358
359
besch = roadsign_t::table.get(bname);
359
360
if(besch==NULL) {
360
361
besch = roadsign_t::table.get(translator::compatibility_name(bname));
361
362
if(besch==NULL) {
362
dbg->warning("roadsign_t::rwdr", "description %s for roadsign/signal at %d,%d not found! (may be ignored)", bname, gib_pos().x, gib_pos().y);
363
dbg->warning("roadsign_t::rwdr", "description %s for roadsign/signal at %d,%d not found! (may be ignored)", bname, get_pos().x, get_pos().y);
365
dbg->warning("roadsign_t::rwdr", "roadsign/signal %s at %d,%d rpleaced by %s", bname, gib_pos().x, gib_pos().y, besch->gib_name() );
366
dbg->warning("roadsign_t::rwdr", "roadsign/signal %s at %d,%d rpleaced by %s", bname, get_pos().x, get_pos().y, besch->get_name() );
388
389
void roadsign_t::laden_abschliessen()
390
grund_t *gr=welt->lookup(gib_pos());
391
if(gr==NULL || !gr->hat_weg(besch->gib_wtyp())) {
392
dbg->error("roadsign_t::laden_abschliessen","roadsing: way/ground missing at %i,%i => ignore", gib_pos().x, gib_pos().y );
391
grund_t *gr=welt->lookup(get_pos());
392
if(gr==NULL || !gr->hat_weg(besch->get_wtyp())) {
393
dbg->error("roadsign_t::laden_abschliessen","roadsing: way/ground missing at %i,%i => ignore", get_pos().x, get_pos().y );
395
396
// after loading restore directions
397
gr->gib_weg(besch->gib_wtyp())->count_sign();
398
gr->get_weg(besch->get_wtyp())->count_sign();
399
400
// only traffic light need switches
444
445
bool roadsign_t::register_besch(roadsign_besch_t *besch)
446
roadsign_t::table.put(besch->gib_name(), besch);
447
roadsign_t::liste.push_back(besch);
448
if(besch->gib_wtyp()==track_wt && besch->get_flags()==roadsign_besch_t::SIGN_SIGNAL) {
447
roadsign_t::table.put(besch->get_name(), besch);
448
roadsign_t::liste.append(besch);
449
if(besch->get_wtyp()==track_wt && besch->get_flags()==roadsign_besch_t::SIGN_SIGNAL) {
449
450
default_signal = besch;
451
if(umgebung_t::drive_on_left && besch->gib_wtyp()==road_wt) {
452
if(umgebung_t::drive_on_left && besch->get_wtyp()==road_wt) {
452
453
// correct for driving on left side
453
454
if(besch->is_traffic_light()) {
454
455
const int XOFF=(24*get_tile_raster_width())/64;
455
456
const int YOFF=(16*get_tile_raster_width())/64;
457
display_set_base_image_offset( besch->gib_bild_nr(0), -XOFF, -YOFF );
458
display_set_base_image_offset( besch->gib_bild_nr(8), -XOFF, -YOFF );
459
display_set_base_image_offset( besch->gib_bild_nr(1), +XOFF, +YOFF );
460
display_set_base_image_offset( besch->gib_bild_nr(9), +XOFF, +YOFF );
461
display_set_base_image_offset( besch->gib_bild_nr(2), -XOFF, +YOFF );
462
display_set_base_image_offset( besch->gib_bild_nr(10), -XOFF, +YOFF );
463
display_set_base_image_offset( besch->gib_bild_nr(3), +XOFF, -YOFF );
464
display_set_base_image_offset( besch->gib_bild_nr(11), +XOFF, -YOFF );
458
display_set_base_image_offset( besch->get_bild_nr(0), -XOFF, -YOFF );
459
display_set_base_image_offset( besch->get_bild_nr(8), -XOFF, -YOFF );
460
display_set_base_image_offset( besch->get_bild_nr(1), +XOFF, +YOFF );
461
display_set_base_image_offset( besch->get_bild_nr(9), +XOFF, +YOFF );
462
display_set_base_image_offset( besch->get_bild_nr(2), -XOFF, +YOFF );
463
display_set_base_image_offset( besch->get_bild_nr(10), -XOFF, +YOFF );
464
display_set_base_image_offset( besch->get_bild_nr(3), +XOFF, -YOFF );
465
display_set_base_image_offset( besch->get_bild_nr(11), +XOFF, -YOFF );
466
467
else if(!besch->is_free_route()) {
467
468
const int XOFF=(30*get_tile_raster_width())/64;
468
469
const int YOFF=(14*get_tile_raster_width())/64;
470
display_set_base_image_offset( besch->gib_bild_nr(0), -XOFF, -YOFF );
471
display_set_base_image_offset( besch->gib_bild_nr(1), +XOFF, +YOFF );
472
display_set_base_image_offset( besch->gib_bild_nr(2), -XOFF, +YOFF );
473
display_set_base_image_offset( besch->gib_bild_nr(3), +XOFF, -YOFF );
471
display_set_base_image_offset( besch->get_bild_nr(0), -XOFF, -YOFF );
472
display_set_base_image_offset( besch->get_bild_nr(1), +XOFF, +YOFF );
473
display_set_base_image_offset( besch->get_bild_nr(2), -XOFF, +YOFF );
474
display_set_base_image_offset( besch->get_bild_nr(3), +XOFF, -YOFF );
476
DBG_DEBUG( "roadsign_t::register_besch()","%s", besch->gib_name() );
477
DBG_DEBUG( "roadsign_t::register_besch()","%s", besch->get_name() );
493
494
const roadsign_besch_t* besch = (*iter);
494
495
if(time==0 || (besch->get_intro_year_month()<=time && besch->get_retire_year_month()>time)) {
496
if(besch->gib_cursor()->gib_bild_nr(1)!=IMG_LEER && wtyp==besch->gib_wtyp()) {
497
if(besch->get_cursor()->get_bild_nr(1)!=IMG_LEER && wtyp==besch->get_wtyp()) {
497
498
// only add items with a cursor
498
wkz_roadsign_t *wkz = sign_tool.get(besch->gib_name());
499
wkz_roadsign_t *wkz = sign_tool.get(besch->get_name());
500
501
// not yet in hashtable
501
502
wkz = new wkz_roadsign_t();
502
wkz->icon = besch->gib_cursor()->gib_bild_nr(1),
503
wkz->cursor = besch->gib_cursor()->gib_bild_nr(0),
504
wkz->default_param = besch->gib_name();
505
sign_tool.put(besch->gib_name(),wkz);
503
wkz->set_icon( besch->get_cursor()->get_bild_nr(1) );
504
wkz->cursor = besch->get_cursor()->get_bild_nr(0),
505
wkz->default_param = besch->get_name();
506
sign_tool.put(besch->get_name(),wkz);
507
508
wzw->add_werkzeug( (werkzeug_t*)wkz );