|
|
|
@ -63,6 +63,11 @@ GetNewsStringCallbackProc * const _get_news_string_callback[] = {
|
|
|
|
|
void InitNewsItemStructs()
|
|
|
|
|
{
|
|
|
|
|
memset(_news_items, 0, sizeof(NewsItem)*MAX_NEWS);
|
|
|
|
|
_current_news = 255;
|
|
|
|
|
_oldest_news = 0;
|
|
|
|
|
_latest_news = 255;
|
|
|
|
|
_forced_news = 255;
|
|
|
|
|
_total_news = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void DrawNewsBorder(Window *w)
|
|
|
|
@ -381,8 +386,7 @@ static void MoveToNexItem()
|
|
|
|
|
void NewsLoop()
|
|
|
|
|
{
|
|
|
|
|
// no news item yet
|
|
|
|
|
if(_total_news==0)
|
|
|
|
|
return;
|
|
|
|
|
if(_total_news==0) return;
|
|
|
|
|
|
|
|
|
|
if( ReadyForNextItem() )
|
|
|
|
|
MoveToNexItem();
|
|
|
|
@ -391,6 +395,8 @@ void NewsLoop()
|
|
|
|
|
/* Do a forced show of a specific message */
|
|
|
|
|
void ShowNewsMessage(byte i)
|
|
|
|
|
{
|
|
|
|
|
if(_total_news==0) return;
|
|
|
|
|
|
|
|
|
|
// Delete the news window
|
|
|
|
|
DeleteWindowById(WC_NEWS_WINDOW, 0);
|
|
|
|
|
|
|
|
|
@ -422,121 +428,19 @@ void ShowLastNewsMessage()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void MessageOptionsWndProc(Window *w, WindowEvent *e)
|
|
|
|
|
{
|
|
|
|
|
switch(e->event) {
|
|
|
|
|
case WE_PAINT: {
|
|
|
|
|
uint16 x = _news_display_opt;
|
|
|
|
|
uint32 cs = 0;
|
|
|
|
|
int i, y;
|
|
|
|
|
|
|
|
|
|
for(i=3; i!=23; i+=2) {
|
|
|
|
|
cs |= 1 << (i + (x&1));
|
|
|
|
|
x >>= 1;
|
|
|
|
|
}
|
|
|
|
|
cs |= (w->click_state >> 23) << 23;
|
|
|
|
|
|
|
|
|
|
w->click_state = cs;
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
|
|
|
|
DrawStringCentered(185, 15, STR_0205_MESSAGE_TYPES, 0);
|
|
|
|
|
|
|
|
|
|
y = 27;
|
|
|
|
|
for(i=STR_0206_ARRIVAL_OF_FIRST_VEHICLE; i <= STR_020F_GENERAL_INFORMATION; i++) {
|
|
|
|
|
DrawString(124, y, i, 0);
|
|
|
|
|
y += 12;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case WE_CLICK: {
|
|
|
|
|
int wid;
|
|
|
|
|
if ( (uint)(wid=e->click.widget - 3) < 20) {
|
|
|
|
|
if (!(wid & 1)) {
|
|
|
|
|
_news_display_opt &= ~(1 << (wid>>1));
|
|
|
|
|
} else {
|
|
|
|
|
_news_display_opt |= (1 << (wid>>1));
|
|
|
|
|
}
|
|
|
|
|
SetWindowDirty(w);
|
|
|
|
|
// XXX: write settings
|
|
|
|
|
}
|
|
|
|
|
if( e->click.widget == 23) {
|
|
|
|
|
_news_display_opt = 0;
|
|
|
|
|
HandleButtonClick(w, 23);
|
|
|
|
|
SetWindowDirty(w);
|
|
|
|
|
}
|
|
|
|
|
if( e->click.widget == 24) {
|
|
|
|
|
_news_display_opt = ~0;
|
|
|
|
|
HandleButtonClick(w, 24);
|
|
|
|
|
SetWindowDirty(w);
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const Widget _message_options_widgets[] = {
|
|
|
|
|
{ WWT_CLOSEBOX, 13, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
|
|
|
|
{ WWT_CAPTION, 13, 11, 369, 0, 13, STR_0204_MESSAGE_OPTIONS, STR_018C_WINDOW_TITLE_DRAG_THIS},
|
|
|
|
|
{ WWT_PANEL, 13, 0, 369, 14, 172, 0x0},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 26, 37, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 26, 37, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 38, 49, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 38, 49, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 50, 61, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 50, 61, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 62, 73, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 62, 73, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 74, 85, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 74, 85, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 86, 97, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 86, 97, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 98, 109, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 98, 109, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 110, 121, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 110, 121, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 122, 133, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 122, 133, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 134, 145, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 134, 145, STR_02B9_FULL},
|
|
|
|
|
|
|
|
|
|
{ WWT_PUSHTXTBTN, 3, 15, 170, 154, 165, STR_MESSAGES_DISABLE_ALL, STR_NULL },
|
|
|
|
|
{ WWT_PUSHTXTBTN, 3, 200, 355, 154, 165, STR_MESSAGES_ENABLE_ALL, STR_NULL },
|
|
|
|
|
|
|
|
|
|
{ WWT_LAST},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const WindowDesc _message_options_desc = {
|
|
|
|
|
270, 22, 370, 173,
|
|
|
|
|
WC_GAME_OPTIONS,0,
|
|
|
|
|
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
|
|
|
|
|
_message_options_widgets,
|
|
|
|
|
MessageOptionsWndProc
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void ShowMessageOptions()
|
|
|
|
|
{
|
|
|
|
|
DeleteWindowById(WC_GAME_OPTIONS, 0);
|
|
|
|
|
AllocateWindowDesc(&_message_options_desc);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* return news by number, with 0 being the most
|
|
|
|
|
recent news. Returns false if end of queue reached. */
|
|
|
|
|
recent news. Returns 255 if end of queue reached. */
|
|
|
|
|
static byte getNews(byte i)
|
|
|
|
|
{
|
|
|
|
|
if(i>=MAX_NEWS)
|
|
|
|
|
{
|
|
|
|
|
return -1;
|
|
|
|
|
}
|
|
|
|
|
if(i>=_total_news)
|
|
|
|
|
return 255;
|
|
|
|
|
|
|
|
|
|
i = _latest_news - i;
|
|
|
|
|
i = i % MAX_NEWS;
|
|
|
|
|
|
|
|
|
|
if(_news_items[i].string_id == 0) return -1;
|
|
|
|
|
if(_latest_news < i)
|
|
|
|
|
i = _latest_news + MAX_NEWS - i;
|
|
|
|
|
else
|
|
|
|
|
i = _latest_news - i;
|
|
|
|
|
|
|
|
|
|
i = i % MAX_NEWS;
|
|
|
|
|
return i;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -616,12 +520,23 @@ static void MessageHistoryWndProc(Window *w, WindowEvent *e)
|
|
|
|
|
int y = (e->click.pt.y - 19) / 12;
|
|
|
|
|
byte p, q;
|
|
|
|
|
|
|
|
|
|
/* // === DEBUG code only
|
|
|
|
|
for(p=0; p<_total_news; p++)
|
|
|
|
|
{
|
|
|
|
|
NewsItem *ni;
|
|
|
|
|
byte buffer[256];
|
|
|
|
|
ni=&_news_items[p];
|
|
|
|
|
GetNewsString(ni, buffer);
|
|
|
|
|
printf("%i\t%i\t%s\n", p, ni->date, buffer);
|
|
|
|
|
}
|
|
|
|
|
printf("=========================\n");
|
|
|
|
|
// === END OF DEBUG CODE */
|
|
|
|
|
|
|
|
|
|
p = y + w->vscroll.pos;
|
|
|
|
|
if( p > _total_news-1 ) break;
|
|
|
|
|
|
|
|
|
|
if(_latest_news >= p) q=_latest_news - p;
|
|
|
|
|
else q=_latest_news + MAX_NEWS - p;
|
|
|
|
|
|
|
|
|
|
ShowNewsMessage(q);
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
@ -661,3 +576,101 @@ void ShowMessageHistory()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static void MessageOptionsWndProc(Window *w, WindowEvent *e)
|
|
|
|
|
{
|
|
|
|
|
switch(e->event) {
|
|
|
|
|
case WE_PAINT: {
|
|
|
|
|
uint16 x = _news_display_opt;
|
|
|
|
|
uint32 cs = 0;
|
|
|
|
|
int i, y;
|
|
|
|
|
|
|
|
|
|
for(i=3; i!=23; i+=2) {
|
|
|
|
|
cs |= 1 << (i + (x&1));
|
|
|
|
|
x >>= 1;
|
|
|
|
|
}
|
|
|
|
|
cs |= (w->click_state >> 23) << 23;
|
|
|
|
|
|
|
|
|
|
w->click_state = cs;
|
|
|
|
|
DrawWindowWidgets(w);
|
|
|
|
|
|
|
|
|
|
DrawStringCentered(185, 15, STR_0205_MESSAGE_TYPES, 0);
|
|
|
|
|
|
|
|
|
|
y = 27;
|
|
|
|
|
for(i=STR_0206_ARRIVAL_OF_FIRST_VEHICLE; i <= STR_020F_GENERAL_INFORMATION; i++) {
|
|
|
|
|
DrawString(124, y, i, 0);
|
|
|
|
|
y += 12;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
case WE_CLICK: {
|
|
|
|
|
int wid;
|
|
|
|
|
if ( (uint)(wid=e->click.widget - 3) < 20) {
|
|
|
|
|
if (!(wid & 1)) {
|
|
|
|
|
_news_display_opt &= ~(1 << (wid>>1));
|
|
|
|
|
} else {
|
|
|
|
|
_news_display_opt |= (1 << (wid>>1));
|
|
|
|
|
}
|
|
|
|
|
SetWindowDirty(w);
|
|
|
|
|
// XXX: write settings
|
|
|
|
|
}
|
|
|
|
|
if( e->click.widget == 23) {
|
|
|
|
|
_news_display_opt = 0;
|
|
|
|
|
HandleButtonClick(w, 23);
|
|
|
|
|
SetWindowDirty(w);
|
|
|
|
|
}
|
|
|
|
|
if( e->click.widget == 24) {
|
|
|
|
|
_news_display_opt = ~0;
|
|
|
|
|
HandleButtonClick(w, 24);
|
|
|
|
|
SetWindowDirty(w);
|
|
|
|
|
}
|
|
|
|
|
} break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static const Widget _message_options_widgets[] = {
|
|
|
|
|
{ WWT_CLOSEBOX, 13, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
|
|
|
|
|
{ WWT_CAPTION, 13, 11, 369, 0, 13, STR_0204_MESSAGE_OPTIONS, STR_018C_WINDOW_TITLE_DRAG_THIS},
|
|
|
|
|
{ WWT_PANEL, 13, 0, 369, 14, 172, 0x0},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 26, 37, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 26, 37, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 38, 49, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 38, 49, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 50, 61, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 50, 61, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 62, 73, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 62, 73, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 74, 85, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 74, 85, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 86, 97, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 86, 97, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 98, 109, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 98, 109, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 110, 121, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 110, 121, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 122, 133, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 122, 133, STR_02B9_FULL},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 2, 61, 134, 145, STR_02B8_SUMMARY},
|
|
|
|
|
{ WWT_CLOSEBOX, 3, 62, 121, 134, 145, STR_02B9_FULL},
|
|
|
|
|
|
|
|
|
|
{ WWT_PUSHTXTBTN, 3, 15, 170, 154, 165, STR_MESSAGES_DISABLE_ALL, STR_NULL },
|
|
|
|
|
{ WWT_PUSHTXTBTN, 3, 200, 355, 154, 165, STR_MESSAGES_ENABLE_ALL, STR_NULL },
|
|
|
|
|
|
|
|
|
|
{ WWT_LAST},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static const WindowDesc _message_options_desc = {
|
|
|
|
|
270, 22, 370, 173,
|
|
|
|
|
WC_GAME_OPTIONS,0,
|
|
|
|
|
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
|
|
|
|
|
_message_options_widgets,
|
|
|
|
|
MessageOptionsWndProc
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
void ShowMessageOptions()
|
|
|
|
|
{
|
|
|
|
|
DeleteWindowById(WC_GAME_OPTIONS, 0);
|
|
|
|
|
AllocateWindowDesc(&_message_options_desc);
|
|
|
|
|
}
|
|
|
|
|