楠瀬さん、嵐のリリース
http://www.geocities.jp/kusunosetooru/
わーお、今プログラマーズ・ハイ状態になっておられると想像。ていうか自分も今そうだから。最近日記かかないけど、プログラムはすげー書いてます。Dungeon Crawl の。え?ZAngband アップデートしろ?平謝り。

オブジェクト指向にこの年でめざめた。クラス書きまくり。超便利だー!


/*
* ウィンドウと内部領域(ステータス、メッセージ、ダンジョン) のクラス
*/

class WinClass
{
public:
int ox; //Offset x in dots
int oy; //Offset y in dots

int wx; //width in dots
int wy; //height in dots

// 同一ウィンドウでダンジョン/インベントリなど同じ場所で
// 表示を切り替える場合に使用
int active_layer;

// Pointer to the window
#ifdef USE_X11
Window win;
#elif defined(WINDOWS)
HWND hWnd;
#endif

// 初期化
WinClass()
{
wx = 0;
wy = 0;
}

//黒で塗りつぶす Sys dep
void clear();
};

class RegionClass
{
public:

WinClass *win;
int layer;

// Geometry
// <-----------------wx----------------------->
// sx ox ex
// |margin| text/tile area |margin|

int ox; //Offset x in dots
int oy; //Offset y in dots

int dx; //unit width
int dy; //unit height

int mx; //window width in dx
int my; //window height in dy

int wx; //width in dots = dx*mx + margins
int wy; //height in dots = dy*my + margins

int sx; //Left edge pos
int sy; //Top edge pos
int ex; //right edge pos
int ey; //bottom edge pos

bool flag;// use or no

// 初期化
RegionClass()
{
flag = false;
}

// Sys indep
bool is_active()
{
if (!flag) return false;
if (win->active_layer == layer)
return true;
else return false;
}

// Sys indep
void make_active()
{
if (!flag) return;
win->active_layer = layer;
}

// Sys indep
void place(WinClass *w, int layer0, RegionClass *neighbor,
int pflag, int margin_top, int margin_left,
int margin_bottom, int margin_right);

//以下はテキスト/マップ/タイル等の派生クラスで挙動を変える

//Sys indep
//マウス位置をダンジョン位置に変換、範囲内なら true を返す
virtual bool mouse_pos(){return false;}

//Sys dep
// exposure 時などの再描画
virtual void redraw(){};

// abuf, cbuf の malloc など
virtual void init_size() {};

// Sys dep
// 黒で塗る
virtual void clear() {};
};



// 派生
class TextRegionClass :public RegionClass
{
public:
#ifdef USE_X11
int asc; //font ascent
#ifdef JP
XFontSet font; //fontset
#else
XFontStruct *font;
#endif
void init_font(const char *name);
#elif defined(WINDOWS)
HFONT font;
void init_font(const char *name, int height);
#endif

unsigned char *cbuf; //text backup
unsigned char *abuf; //textcolor backup

int cx_ofs; //cursor x offset
int cy_ofs; //cursor y offset

//Sys dep
void addstr_aux(char *buffer, int len);
//Sys indep
void addstr(char *buffer);
//Sys indep
void scroll();

void clear();

// 初期化
TextRegionClass()
{
flag = false;
cbuf = NULL;
abuf = NULL;
cx_ofs = 0;
cy_ofs = 0;
}

bool mouse_pos(int mouse_x, int mouse_y, int *cx, int *cy);
void redraw(int x1, int x2, int y1, int y2);
void init_size(int mx0, int my0);
};

class TileRegionClass :public RegionClass
{
public:
bool force_redraw;
bool mouse_pos(int mouse_x, int mouse_y, int *cx, int *cy);
void redraw(int x1, int x2, int y1, int y2);
void init_size(int dx0, int dy0, int mx0, int my0);
void clear();
#ifdef WINDOWS
int palette;
#endif

// 初期化
TileRegionClass()
{
force_redraw = false;
}
};

class MapRegionClass :public RegionClass
{
public:
int px; // remember player position
int py; // remember player position
unsigned char *mbuf;
bool force_redraw;
bool mouse_pos(int mouse_x, int mouse_y, int *cx, int *cy);
void redraw(int x1, int x2, int y1, int y2);
void init_size(int dx0, int dy0, int mx0, int my0);
void clear();

void set_col(int col, int x, int y)
{
mbuf[x + y * mx] = col;
}

int get_col(int x, int y)
{
return mbuf[x + y * mx];
}

// 初期化
MapRegionClass()
{
force_redraw = false;
}
};