投稿者 トピック: [102-2-2, r3111以降] 古いセーブゲーム(88.00以前?)が読めない  (参照数 2434 回)

z9999+

  • 管理人
  • 急行
  • *
  • 投稿: 364
問題点:
grund_tのNULLチェックができていないため、古いセーブゲーム(86.07以前?)の読み込み時にクラッシュする

補足:
古いセーブゲームを読み込む必要がなければ修正不要

dings/gebaeude.cc:350-351
引用
   // snow image?
   snow = (!gr->ist_tunnel()  ||  gr->ist_karten_boden())  &&  (get_pos().z+(get_yoff()/TILE_HEIGHT_STEP)>= welt->get_snowline());


引用
   // snow image?
   snow = (!gr || (!gr->ist_tunnel()  ||  gr->ist_karten_boden()))  &&  (get_pos().z+(get_yoff()/TILE_HEIGHT_STEP)>= welt->get_snowline());
« 最終編集: 2010/06/23 21:59 by z9999+ »

z9999+

  • 管理人
  • 急行
  • *
  • 投稿: 364
新しいパッチです。
クラッシュの原因そのものを取り除きました。
88.00とそれ以前のセーブゲームを読む場合に必要です。

手持ちの0.86.0、0.86.2、0.88.0のセーブゲームが読めることと、スロープ上の建物が正常に撤去できることを確認しています。

コード: [選択]
Index: simworld.cc
===================================================================
--- simworld.cc (リビジョン 3468)
+++ simworld.cc (作業コピー)
@@ -4179,9 +4179,16 @@
  for (int y = 0; y < get_groesse_y(); y++) {
  for (int x = 0; x < get_groesse_x(); x++) {
  koord k(x,y);
- if(access(x,y)->get_kartenboden()->get_typ()==grund_t::fundament) {
- access(x,y)->get_kartenboden()->set_hoehe( max_hgt(k) );
- access(x,y)->get_kartenboden()->set_grund_hang(hang_t::flach);
+ grund_t *gr1 = access(x, y)->get_kartenboden();
+ if(gr1->get_typ()==grund_t::fundament) {
+ gr1->set_hoehe( max_hgt(k) );
+ // get new grund
+ grund_t *gr2 = access(x, y)->get_kartenboden();
+ gr2->set_grund_hang(hang_t::flach);
+ // transfer object to on new grund
+ for(  int i=0;  i<gr1->get_top();  i++  ) {
+ gr1->obj_bei(i)->set_pos( gr2->get_pos() );
+ }
  }
  }
  }