1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-24 00:03:11 +01:00

add title menu and dropdown

This commit is contained in:
IntelOrca
2014-04-09 14:43:27 +01:00
parent c8d2b0bf1e
commit 0402ffe6fc
13 changed files with 675 additions and 44 deletions

View File

@@ -20,6 +20,7 @@
<ClInclude Include="..\src\climate.h" /> <ClInclude Include="..\src\climate.h" />
<ClInclude Include="..\src\config.h" /> <ClInclude Include="..\src\config.h" />
<ClInclude Include="..\src\date.h" /> <ClInclude Include="..\src\date.h" />
<ClInclude Include="..\src\editor.h" />
<ClInclude Include="..\src\game.h" /> <ClInclude Include="..\src\game.h" />
<ClInclude Include="..\src\gfx.h" /> <ClInclude Include="..\src\gfx.h" />
<ClInclude Include="..\src\intro.h" /> <ClInclude Include="..\src\intro.h" />
@@ -35,9 +36,11 @@
<ClInclude Include="..\src\sprites.h" /> <ClInclude Include="..\src\sprites.h" />
<ClInclude Include="..\src\strings.h" /> <ClInclude Include="..\src\strings.h" />
<ClInclude Include="..\src\title.h" /> <ClInclude Include="..\src\title.h" />
<ClInclude Include="..\src\tutorial.h" />
<ClInclude Include="..\src\viewport.h" /> <ClInclude Include="..\src\viewport.h" />
<ClInclude Include="..\src\widget.h" /> <ClInclude Include="..\src\widget.h" />
<ClInclude Include="..\src\window.h" /> <ClInclude Include="..\src\window.h" />
<ClInclude Include="..\src\window_dropdown.h" />
<ClInclude Include="resource.h" /> <ClInclude Include="resource.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -45,6 +48,7 @@
<ClCompile Include="..\src\climate.c" /> <ClCompile Include="..\src\climate.c" />
<ClCompile Include="..\src\config.c" /> <ClCompile Include="..\src\config.c" />
<ClCompile Include="..\src\date.c" /> <ClCompile Include="..\src\date.c" />
<ClCompile Include="..\src\editor.c" />
<ClCompile Include="..\src\game.c" /> <ClCompile Include="..\src\game.c" />
<ClCompile Include="..\src\gfx.c" /> <ClCompile Include="..\src\gfx.c" />
<ClCompile Include="..\src\intro.c" /> <ClCompile Include="..\src\intro.c" />
@@ -58,9 +62,11 @@
<ClCompile Include="..\src\scenario.c" /> <ClCompile Include="..\src\scenario.c" />
<ClCompile Include="..\src\strings.c" /> <ClCompile Include="..\src\strings.c" />
<ClCompile Include="..\src\title.c" /> <ClCompile Include="..\src\title.c" />
<ClCompile Include="..\src\tutorial.c" />
<ClCompile Include="..\src\viewport.c" /> <ClCompile Include="..\src\viewport.c" />
<ClCompile Include="..\src\widget.c" /> <ClCompile Include="..\src\widget.c" />
<ClCompile Include="..\src\window.c" /> <ClCompile Include="..\src\window.c" />
<ClCompile Include="..\src\window_dropdown.c" />
<ClCompile Include="..\src\window_title_exit.c" /> <ClCompile Include="..\src\window_title_exit.c" />
<ClCompile Include="..\src\window_title_logo.c" /> <ClCompile Include="..\src\window_title_logo.c" />
<ClCompile Include="..\src\window_main.c" /> <ClCompile Include="..\src\window_main.c" />
@@ -133,6 +139,9 @@
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<StructMemberAlignment>1Byte</StructMemberAlignment> <StructMemberAlignment>1Byte</StructMemberAlignment>
<TreatSpecificWarningsAsErrors>4013</TreatSpecificWarningsAsErrors> <TreatSpecificWarningsAsErrors>4013</TreatSpecificWarningsAsErrors>
<OmitFramePointers>
</OmitFramePointers>
<BufferSecurityCheck>false</BufferSecurityCheck>
</ClCompile> </ClCompile>
<Link> <Link>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>

View File

@@ -90,6 +90,15 @@
<ClInclude Include="..\src\climate.h"> <ClInclude Include="..\src\climate.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="..\src\window_dropdown.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\tutorial.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\src\editor.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\src\game.c"> <ClCompile Include="..\src\game.c">
@@ -167,6 +176,15 @@
<ClCompile Include="..\src\climate.c"> <ClCompile Include="..\src\climate.c">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="..\src\window_dropdown.c">
<Filter>Windows</Filter>
</ClCompile>
<ClCompile Include="..\src\tutorial.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="..\src\editor.c">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Include="..\openrct2.exe"> <None Include="..\openrct2.exe">

58
src/editor.c Normal file
View File

@@ -0,0 +1,58 @@
/*****************************************************************************
* Copyright (c) 2014 Ted John
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
*
* OpenRCT2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#include "addresses.h"
#include "editor.h"
/**
*
* rct2: 0x0066FFE1
*/
void editor_load()
{
RCT2_CALLPROC_EBPSAFE(0x0066FFE1);
}
/**
*
* rct2: 0x00672781
*/
void editor_convert_save_to_scenario()
{
RCT2_CALLPROC_EBPSAFE(0x00672781);
}
/**
*
* rct2: 0x00672957
*/
void trackdesigner_load()
{
RCT2_CALLPROC_EBPSAFE(0x00672957);
}
/**
*
* rct2: 0x006729FD
*/
void trackmanager_load()
{
RCT2_CALLPROC_EBPSAFE(0x006729FD);
}

29
src/editor.h Normal file
View File

@@ -0,0 +1,29 @@
/*****************************************************************************
* Copyright (c) 2014 Ted John
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
*
* OpenRCT2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#ifndef _EDITOR_H_
#define _EDITOR_H_
void editor_load();
void editor_convert_save_to_scenario();
void trackdesigner_load();
void trackmanager_load();
#endif

View File

@@ -272,3 +272,43 @@ void gfx_redraw_screen_rect(short left, short top, short right, short bottom)
window_draw(w, left, top, right, bottom); window_draw(w, left, top, right, bottom);
} }
} }
/**
*
* rct2: 0x006C2321
* buffer (esi)
*/
int gfx_get_string_width(char *buffer)
{
int eax, ebx, ecx, edx, esi, edi, ebp;
esi = buffer;
RCT2_CALLFUNC_X(0x006C2321, &eax, &ebx, &ecx, &edx, &esi, &edi, &ebp);
return ecx & 0xFFFF;
}
/**
* Draws i formatted text string left aligned at i specified position but clips
* the text with an elipsis if the text width exceeds the specified width.
* rct2: 0x006C1B83
* dpi (edi)
* format (bx)
* args (esi)
* colour (al)
* x (cx)
* y (dx)
* width (bp)
*/
void gfx_draw_string_left_clipped(rct_drawpixelinfo* dpi, int format, void* args, int colour, int x, int y, int width)
{
RCT2_CALLPROC_X(0x006C1B83, colour, format, x, y, args, dpi, width);
//char* buffer;
//buffer = (char*)0x0141ED68;
//format_string(buffer, format, args);
//rctmem->current_font_sprite_base = 224;
//clip_text(buffer, width);
//gfx_draw_string(dpi, buffer, colour, x, y);
}

31
src/tutorial.c Normal file
View File

@@ -0,0 +1,31 @@
/*****************************************************************************
* Copyright (c) 2014 Ted John
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
*
* OpenRCT2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#include "addresses.h"
#include "tutorial.h"
/**
*
* rct2: 0x0066ECC1
*/
void tutorial_start(int type)
{
RCT2_CALLPROC_X(0x0066ECC1, type, 0, 0, 0, 0, 0, 0);
}

26
src/tutorial.h Normal file
View File

@@ -0,0 +1,26 @@
/*****************************************************************************
* Copyright (c) 2014 Ted John
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
*
* OpenRCT2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#ifndef _TUTORIAL_H_
#define _TUTORIAL_H_
void tutorial_start(int type);
#endif

View File

@@ -109,7 +109,7 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han
if (RCT2_NEW_WINDOW == &(RCT2_FIRST_WINDOW[12])) { if (RCT2_NEW_WINDOW == &(RCT2_FIRST_WINDOW[12])) {
// Close least recently used window // Close least recently used window
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++) for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++)
if (!(w->flags & 0x203)) if (!(w->flags & (0x01 | 0x02 | 0x200)))
break; break;
window_close(w); window_close(w);
@@ -119,15 +119,18 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han
// Flags // Flags
if (flags & 0x01) { if (flags & 0x01) {
for (; w >= RCT2_FIRST_WINDOW + 1; w--) for (; w >= RCT2_FIRST_WINDOW + 1; w--) {
if (((w - 1)->flags & 0x01) && !((w - 1)->flags & 0x02)) if ((w - 1)->flags & 0x02)
continue;
if ((w - 1)->flags & 0x01)
break; break;
} }
else if (flags & 0x02) { } else if (!(flags & 0x02)) {
for (; w >= RCT2_FIRST_WINDOW + 1; w--) for (; w >= RCT2_FIRST_WINDOW + 1; w--) {
if (!((w - 1)->flags & 0x02)) if (!((w - 1)->flags & 0x02))
break; break;
} }
}
// Move w to new window slot // Move w to new window slot
if (w != RCT2_NEW_WINDOW) if (w != RCT2_NEW_WINDOW)
@@ -137,11 +140,10 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han
w->classification = cls; w->classification = cls;
w->var_4B8 = -1; w->var_4B8 = -1;
w->var_4B9 = -1; w->var_4B9 = -1;
w->flags = 0; w->flags = flags;
w->flags |= flags;
// Play sound // Play sound
if (!(flags & 0x03)) if (!(flags & (0x01 | 0x02)))
sound_play_panned(40, x + (width / 2)); sound_play_panned(40, x + (width / 2));
w->number = 0; w->number = 0;
@@ -169,6 +171,7 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han
w->var_4AE = 0; w->var_4AE = 0;
RCT2_NEW_WINDOW++; RCT2_NEW_WINDOW++;
window_invalidate(w);
return w; return w;
} }
@@ -208,6 +211,33 @@ void window_close(rct_window* window)
viewport_update_pointers(); viewport_update_pointers();
} }
/**
*
* rct2: 0x006ECCF4
* @param cls (cl)
* @param number (dx)
*/
void window_close_by_id(rct_windowclass cls, rct_windownumber number)
{
rct_window* w;
if (cls & 0x80) {
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++) {
if (w->classification == cls) {
window_close(w);
w = RCT2_FIRST_WINDOW - 1;
}
}
} else {
for (w = RCT2_FIRST_WINDOW; w < RCT2_NEW_WINDOW; w++) {
if (w->classification == cls && w->number == number) {
window_close(w);
w = RCT2_FIRST_WINDOW - 1;
}
}
}
}
/** /**
* *
* rct2: 0x006EA8A0 * rct2: 0x006EA8A0
@@ -537,3 +567,15 @@ static int window_draw_split(rct_window *w, int left, int top, int right, int bo
// No windows overlap // No windows overlap
return 0; return 0;
} }
/**
*
* rct2: 0x006EB15C
*
* @param window (esi)
* @param dpi (edi)
*/
void window_draw_widgets(rct_window *w, rct_drawpixelinfo *dpi)
{
RCT2_CALLPROC_X(0x006EB15C, 0, 0, 0, 0, w, dpi, 0);
}

View File

@@ -21,6 +21,7 @@
#ifndef _WINDOW_H_ #ifndef _WINDOW_H_
#define _WINDOW_H_ #define _WINDOW_H_
#include "gfx.h"
#include "rct2.h" #include "rct2.h"
struct rct_window; struct rct_window;
@@ -135,7 +136,7 @@ typedef struct rct_window {
sint16 min_height; // 0x038 sint16 min_height; // 0x038
sint16 max_height; // 0x03A sint16 max_height; // 0x03A
rct_windownumber number; // 0x03C rct_windownumber number; // 0x03C
uint16 flags; uint16 flags; // 0x03E
rct_scroll scrolls[3]; // 0x040 rct_scroll scrolls[3]; // 0x040
uint8 pad_076[0x40A]; uint8 pad_076[0x40A];
sint16 var_480; sint16 var_480;
@@ -270,6 +271,7 @@ void window_dispatch_update_all();
void window_update_all(); void window_update_all();
rct_window *window_create(int x, int y, int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags); rct_window *window_create(int x, int y, int width, int height, uint32 *event_handlers, rct_windowclass cls, uint16 flags);
void window_close(rct_window *window); void window_close(rct_window *window);
void window_close_by_id(rct_windowclass cls, rct_windownumber number);
rct_window *window_find_by_id(rct_windowclass cls, rct_windownumber number); rct_window *window_find_by_id(rct_windowclass cls, rct_windownumber number);
void window_invalidate(rct_window *window); void window_invalidate(rct_window *window);
void window_invalidate_by_id(uint16 cls, rct_windownumber number); void window_invalidate_by_id(uint16 cls, rct_windownumber number);
@@ -280,5 +282,6 @@ rct_window *window_bring_to_front_by_id(rct_windowclass cls, rct_windownumber nu
rct_window *window_bring_to_front(rct_window *w); rct_window *window_bring_to_front(rct_window *w);
void window_draw(rct_window *w, int left, int top, int right, int bottom); void window_draw(rct_window *w, int left, int top, int right, int bottom);
void window_draw_widgets(rct_window *w, rct_drawpixelinfo *dpi);
#endif #endif

238
src/window_dropdown.c Normal file
View File

@@ -0,0 +1,238 @@
/*****************************************************************************
* Copyright (c) 2014 Ted John
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
*
* OpenRCT2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#include <memory.h>
#include "addresses.h"
#include "scenario.h"
#include "strings.h"
#include "sprites.h"
#include "widget.h"
#include "window.h"
#include "window_dropdown.h"
enum {
WIDX_BACKGROUND,
};
static rct_widget window_dropdown_widgets[] = {
{ WWT_IMGBTN, 0, 0, 0, 0, 0, -1, STR_NONE },
{ WIDGETS_END },
};
int _dropdown_num_items;
int _dropdown_num_columns;
int _dropdown_num_rows;
int _dropdown_item_width;
int _dropdown_item_height;
int _dropdown_highlighted_index;
uint16 gDropdownItemsFormat[64];
sint32 gDropdownItemsArgs[64];
static void window_dropdown_emptysub() { }
static void window_dropdown_paint();
static uint32 window_dropdown_events[] = {
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_emptysub,
window_dropdown_paint,
window_dropdown_emptysub
};
/**
* Shows a text dropdown menu.
* rct2: 0x006ECFB9
*
* @param x (cx)
* @param y (dx)
* @param extray (di)
* @param flags (bh)
* @param num_items (bx)
* @param colour (al)
*/
void window_dropdown_show_text(int x, int y, int extray, uint8 colour, uint8 flags, int num_items)
{
rct_window* w;
int i, string_width, max_string_width;
char buffer[256];
// Copy the formats and arguments until all use of it is decompiled
memcpy(0x009DEBA4, gDropdownItemsFormat, 37 * 2);
memcpy(0x009DEBF4, gDropdownItemsArgs, 80 * 4);
RCT2_GLOBAL(0x009DE518, uint32) &= ~(0x04 | 0x02);
if (flags & 0x80)
RCT2_GLOBAL(0x009DE518, uint32) |= 0x02;
window_dropdown_close();
_dropdown_num_columns = 1;
_dropdown_item_width = 0;
_dropdown_item_height = 10;
if (flags & 0x40)
_dropdown_item_height = flags & 0x3F;
// Calculate the longest string width
max_string_width = 0;
for (i = 0; i < num_items; i++) {
format_string(buffer, gDropdownItemsFormat[i], (void*)(&gDropdownItemsArgs[i]));
RCT2_GLOBAL(0x013CE950, sint16) = 224;
string_width = gfx_get_string_width(buffer);
max_string_width = max(string_width, max_string_width);
}
// Set the widgets
_dropdown_item_width = max_string_width + 3;
_dropdown_num_items = num_items;
_dropdown_num_rows = num_items;
window_dropdown_widgets[WIDX_BACKGROUND].bottom = _dropdown_item_height * num_items + 3;
window_dropdown_widgets[WIDX_BACKGROUND].right = _dropdown_item_width + 3;
// Create the window
w = window_create(
x, y + extray,
window_dropdown_widgets[WIDX_BACKGROUND].right + 1,
window_dropdown_widgets[WIDX_BACKGROUND].bottom + 1,
window_dropdown_events,
WC_DROPDOWN,
0x02
);
w->widgets = window_dropdown_widgets;
if (colour & 0x80)
w->flags |= WF_TRANSPARENT;
w->colours[0] = colour;
// Input state
_dropdown_highlighted_index = -1;
RCT2_GLOBAL(0x009DED34, sint32) = 0;
RCT2_GLOBAL(0x009DED38, sint32) = 0;
RCT2_GLOBAL(RCT2_ADDRESS_INPUT_STATE, sint8) = 5;
// Copy the following properties until all use of it is decompiled
RCT2_GLOBAL(0x009DEBA0, sint16) = _dropdown_num_items;
RCT2_GLOBAL(0x009DED44, sint32) = _dropdown_num_columns;
RCT2_GLOBAL(0x009DED48, sint32) = _dropdown_num_rows;
RCT2_GLOBAL(0x009DED40, sint32) = _dropdown_item_width;
RCT2_GLOBAL(0x009DED3C, sint32) = _dropdown_item_height;
RCT2_GLOBAL(0x009DEBA2, sint16) = _dropdown_highlighted_index;
}
void window_dropdown_close()
{
window_close_by_id(WC_DROPDOWN, 0);
}
static void window_dropdown_paint()
{
rct_window *w;
rct_drawpixelinfo *dpi;
__asm mov w, esi
__asm mov dpi, edi
window_draw_widgets(w, dpi);
_dropdown_highlighted_index = RCT2_GLOBAL(0x009DEBA2, sint16);
{
int i, cell_x, cell_y, l, t, r, b, item, colour;
for (i = 0; i < _dropdown_num_items; i++) {
cell_x = i % _dropdown_num_columns;
cell_y = i / _dropdown_num_columns;
if (gDropdownItemsFormat[i] == DROPDOWN_SEPARATOR) {
l = w->x + 2 + (cell_x * _dropdown_item_width);
t = w->y + 2 + (cell_y * _dropdown_item_height);
r = l + _dropdown_item_width - 1;
t += (_dropdown_item_height / 2);
b = t;
if (w->colours[0] & 0x80) {
gfx_fill_rect(dpi, l, t, r, b, (RCT2_ADDRESS(0x009DEDF4, uint8)[w->colours[0]] | 0x02000000) + 1);
gfx_fill_rect(dpi, l, t + 1, r, b + 1, (RCT2_ADDRESS(0x009DEDF4, uint8)[w->colours[0]] | 0x02000000) + 2);
} else {
gfx_fill_rect(dpi, l, t, r, b,
*((char*)(0x00141FC47 + (w->colours[0] * 8))));
gfx_fill_rect(dpi, l, t + 1, r, b + 1,
*((char*)(0x00141FC4B + (w->colours[0] * 8))));
}
} else {
//
if (i == _dropdown_highlighted_index) {
l = w->x + 2 + (cell_x * _dropdown_item_width);
t = w->y + 2 + (cell_y * _dropdown_item_height);
r = l + _dropdown_item_width - 1;
b = t + _dropdown_item_height - 1;
gfx_fill_rect(dpi, l, t, r, b, 0x2000000 | 0x2F);
}
item = gDropdownItemsFormat[i];
if (item == -1 || item == -2) {
// Image item
} else {
// Text item
if (i < 32)
if (RCT2_GLOBAL(0x009DED38, uint32) & (1 << i))
item++;
// Calculate colour
colour = w->colours[0] & 0x7F;
if (i == _dropdown_highlighted_index)
colour = 2;
if (RCT2_GLOBAL(0x009DED34, uint32) & (1 << i))
if (i < 32)
colour = (w->colours[0] & 0x7F) | 0x40;
// Draw item string
gfx_draw_string_left_clipped(
dpi,
item,
(void*)(&gDropdownItemsArgs[i]), colour,
w->x + 2 + (cell_x * _dropdown_item_width),
w->y + 1 + (cell_y * _dropdown_item_height),
w->width - 5
);
}
}
}
}
}

29
src/window_dropdown.h Normal file
View File

@@ -0,0 +1,29 @@
/*****************************************************************************
* Copyright (c) 2014 Ted John
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
*
* This file is part of OpenRCT2.
*
* OpenRCT2 is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*****************************************************************************/
#include "rct2.h"
#define DROPDOWN_SEPARATOR 0
extern uint16 gDropdownItemsFormat[64];
extern sint32 gDropdownItemsArgs[64];
void window_dropdown_show_text(int x, int y, int extray, uint8 colour, uint8 flags, int num_items);
void window_dropdown_close();

View File

@@ -19,10 +19,13 @@
*****************************************************************************/ *****************************************************************************/
#include "addresses.h" #include "addresses.h"
#include "editor.h"
#include "strings.h" #include "strings.h"
#include "sprites.h" #include "sprites.h"
#include "tutorial.h"
#include "widget.h" #include "widget.h"
#include "window.h" #include "window.h"
#include "window_dropdown.h"
void window_levelselect_open(); void window_levelselect_open();
@@ -41,35 +44,42 @@ static rct_widget window_title_menu_widgets[] = {
{ WIDGETS_END }, { WIDGETS_END },
}; };
static void window_title_menu_emptysub() { }
static void window_title_menu_mouseup();
static void window_title_menu_mousedown();
static void window_title_menu_dropdown();
static void window_title_menu_unknown17();
static void window_title_menu_paint();
static uint32 window_title_menu_events[] = { static uint32 window_title_menu_events[] = {
0x0066B834, window_title_menu_emptysub,
0x0066B6EC, window_title_menu_mouseup,
0x0066B834, window_title_menu_emptysub,
0x0066B70E, window_title_menu_mousedown,
0x0066B71F, window_title_menu_dropdown,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B730, window_title_menu_unknown17,
0x0066B834, window_title_menu_emptysub,
0x0066B834, window_title_menu_emptysub,
0x0066B6E6, window_title_menu_paint,
0x0066B834 window_title_menu_emptysub
}; };
/** /**
@@ -93,3 +103,96 @@ void window_title_menu_open()
window->colours[1] = 140; window->colours[1] = 140;
window->colours[2] = 140; window->colours[2] = 140;
} }
static void window_title_menu_mouseup()
{
short widgetIndex;
__asm mov widgetIndex, dx
if (widgetIndex == WIDX_START_NEW_GAME) {
window_levelselect_open();
} else if (widgetIndex == WIDX_CONTINUE_SAVED_GAME) {
RCT2_CALLPROC_X(0x006677F2, 0, 1, 0, 0, 5, 0, 0);
}
}
static void window_title_menu_mousedown()
{
short widgetIndex;
rct_window *w;
rct_widget *widget;
__asm mov widgetIndex, dx
__asm mov w, esi
__asm mov widget, edi
if (widgetIndex == WIDX_SHOW_TUTORIAL) {
gDropdownItemsFormat[0] = STR_TUTORIAL_BEGINNERS;
gDropdownItemsFormat[1] = STR_TUTORIAL_CUSTOM_RIDES;
gDropdownItemsFormat[2] = STR_TUTORIAL_ROLLER_COASTER;
window_dropdown_show_text(
w->x + widget->left,
w->y + widget->top,
widget->bottom - widget->top + 1,
w->colours[0] | 0x80,
0x80,
3
);
} else if (widgetIndex == WIDX_GAME_TOOLS) {
gDropdownItemsFormat[0] = STR_SCENARIO_EDITOR;
gDropdownItemsFormat[1] = STR_CONVERT_SAVED_GAME_TO_SCENARIO;
gDropdownItemsFormat[2] = STR_ROLLER_COASTER_DESIGNER;
gDropdownItemsFormat[3] = STR_TRACK_DESIGNS_MANAGER;
window_dropdown_show_text(
w->x + widget->left,
w->y + widget->top,
widget->bottom - widget->top + 1,
w->colours[0] | 0x80,
0x80,
4
);
}
}
static void window_title_menu_dropdown()
{
short widgetIndex, dropdownIndex;
__asm mov widgetIndex, dx
__asm mov dropdownIndex, ax
if (widgetIndex == WIDX_SHOW_TUTORIAL) {
tutorial_start(dropdownIndex);
} else if (widgetIndex == WIDX_GAME_TOOLS) {
switch (dropdownIndex) {
case 0:
editor_load();
break;
case 1:
editor_convert_save_to_scenario();
break;
case 2:
trackdesigner_load();
break;
case 3:
trackmanager_load();
break;
}
}
}
static void window_title_menu_unknown17()
{
RCT2_GLOBAL(RCT2_ADDRESS_TOOLTIP_TIMEOUT, sint16) = 2000;
}
static void window_title_menu_paint()
{
rct_window *w;
rct_drawpixelinfo *dpi;
__asm mov w, esi
__asm mov dpi, edi
window_draw_widgets(w, dpi);
}

View File

@@ -19,6 +19,7 @@
*****************************************************************************/ *****************************************************************************/
#include "addresses.h" #include "addresses.h"
#include "scenario.h"
#include "strings.h" #include "strings.h"
#include "sprites.h" #include "sprites.h"
#include "widget.h" #include "widget.h"
@@ -45,18 +46,22 @@ static rct_widget window_levelselect_widgets[] = {
void window_levelselect_open() void window_levelselect_open()
{ {
rct_window* window; rct_window* window;
int y;
if (window_bring_to_front_by_id(WC_LEVEL_SELECT, 0) != NULL) if (window_bring_to_front_by_id(WC_LEVEL_SELECT, 0) != NULL)
return; return;
// Load scenario list // Load scenario list
RCT2_CALLPROC_EBPSAFE(0x006775A8); // scenario_load_list(); scenario_load_list();
y = (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) / 2) - 167; window = window_create(
if (y < 28) (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) / 2) - 305,
y = 28; max(28, (RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_HEIGHT, sint16) / 2) - 167),
window = window_create((RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_WIDTH, sint16) / 2) - 305, y, 610, 334, 0x0097FC4C, WC_LEVEL_SELECT, 0x0402); 610,
334,
0x0097FC4C,
WC_LEVEL_SELECT,
0x400 | 0x02
);
window->widgets = window_levelselect_widgets; window->widgets = window_levelselect_widgets;
window->enabled_widgets = 0x04 | 0x10 | 0x20 | 0x40 | 0x80 | 0x100; window->enabled_widgets = 0x04 | 0x10 | 0x20 | 0x40 | 0x80 | 0x100;