SimCityがオープンソースになったのでコンパイルしてみた
http://www.donhopkins.com/home/micropolis/ からダウンロード。Linux 用バイナリ micropolis-activity.tgz を試したら、浮動小数点演算例外とか言われていきなり終了する。なのでソース micropolis-activity-source.tgz からビルドする。
ソースの展開
tar zxvf ../micropolis-activity-source.tgz cd micropolis-activity
yacc が syntax error, unexpected = とか error: conflicting types for 'yyerror' というエラーを出してコンパイルできない。よく分かってないけどテキトーに修正してエラーは出ないようにしてみる。追記: Berkeley Yacc なら大丈夫っぽい。
patch -p1 < ../下の方にあるパッチ
コンパイルする。リンカが -lX11 を見つけてくれなかったので LIBRARY_PATH を指定した。
cd src/ env LIBRARY_PATH=/usr/X11/lib make make install cd ..
実行は
./Micropolis
だと思うのだが、建物を建てると金が減ったり人口が増えたりはするものの、画像がちゃんと表示されない。シナリオの方をやってみると、何もない空間を電車だけが走り回っていたりする。
以下パッチ
diff -ur micropolis-activity/src/tclx/src/tclxgdat.y micropolis-activity-patch/src/tclx/src/tclxgdat.y --- micropolis-activity/src/tclx/src/tclxgdat.y 2007-12-01 11:49:55.000000000 +0900 +++ micropolis-activity-patch/src/tclx/src/tclxgdat.y 2008-01-13 20:25:02.000000000 +0900 @@ -64,78 +64,78 @@ timedate: /* empty */ | timedate item; -item: tspec = +item: tspec {timeflag++;} - | zone = + | zone {zoneflag++;} - | dtspec = + | dtspec {dateflag++;} - | dyspec = + | dyspec {dayflag++;} - | rspec = + | rspec {relflag++;} | nspec; -nspec: NUMBER = +nspec: NUMBER {if (timeflag && dateflag && !relflag) year = $1; else {timeflag++;hh = $1/100;mm = $1%100;ss = 0;merid = 24;}}; -tspec: NUMBER MERIDIAN = +tspec: NUMBER MERIDIAN {hh = $1; mm = 0; ss = 0; merid = $2;} - | NUMBER ':' NUMBER = + | NUMBER ':' NUMBER {hh = $1; mm = $3; merid = 24;} - | NUMBER ':' NUMBER MERIDIAN = + | NUMBER ':' NUMBER MERIDIAN {hh = $1; mm = $3; merid = $4;} - | NUMBER ':' NUMBER NUMBER = + | NUMBER ':' NUMBER NUMBER {hh = $1; mm = $3; merid = 24; dayLight = STANDARD; ourzone = -($4%100 + 60*$4/100);} - | NUMBER ':' NUMBER ':' NUMBER = + | NUMBER ':' NUMBER ':' NUMBER {hh = $1; mm = $3; ss = $5; merid = 24;} - | NUMBER ':' NUMBER ':' NUMBER MERIDIAN = + | NUMBER ':' NUMBER ':' NUMBER MERIDIAN {hh = $1; mm = $3; ss = $5; merid = $6;} - | NUMBER ':' NUMBER ':' NUMBER NUMBER = + | NUMBER ':' NUMBER ':' NUMBER NUMBER {hh = $1; mm = $3; ss = $5; merid = 24; dayLight = STANDARD; ourzone = -($6%100 + 60*$6/100);}; -zone: ZONE = +zone: ZONE {ourzone = $1; dayLight = STANDARD;} - | DAYZONE = + | DAYZONE {ourzone = $1; dayLight = DAYLIGHT;}; -dyspec: DAY = +dyspec: DAY {dayord = 1; dayreq = $1;} - | DAY ',' = + | DAY ',' {dayord = 1; dayreq = $1;} - | NUMBER DAY = + | NUMBER DAY {dayord = $1; dayreq = $2;}; -dtspec: NUMBER '/' NUMBER = +dtspec: NUMBER '/' NUMBER {month = $1; day = $3;} - | NUMBER '/' NUMBER '/' NUMBER = + | NUMBER '/' NUMBER '/' NUMBER {month = $1; day = $3; year = $5;} - | MONTH NUMBER = + | MONTH NUMBER {month = $1; day = $2;} - | MONTH NUMBER ',' NUMBER = + | MONTH NUMBER ',' NUMBER {month = $1; day = $2; year = $4;} - | NUMBER MONTH = + | NUMBER MONTH {month = $2; day = $1;} - | NUMBER MONTH NUMBER = + | NUMBER MONTH NUMBER {month = $2; day = $1; year = $3;}; -rspec: NUMBER UNIT = +rspec: NUMBER UNIT {relsec += 60L * $1 * $2;} - | NUMBER MUNIT = + | NUMBER MUNIT {relmonth += $1 * $2;} - | NUMBER SUNIT = + | NUMBER SUNIT {relsec += $1;} - | UNIT = + | UNIT {relsec += 60L * $1;} - | MUNIT = + | MUNIT {relmonth += $1;} - | SUNIT = + | SUNIT {relsec++;} - | rspec AGO = + | rspec AGO {relsec = -relsec; relmonth = -relmonth;}; %% @@ -580,7 +580,7 @@ * Error message are not used, so discard with dummy function. */ -void +int yyerror(msg) char *msg; {