diff options
-rw-r--r-- | src/command.cpp | 2 | ||||
-rw-r--r-- | src/command_type.h | 1 | ||||
-rw-r--r-- | src/gui.h | 3 | ||||
-rw-r--r-- | src/script/api/game/game_story_page.hpp.sq | 1 | ||||
-rw-r--r-- | src/script/api/script_story_page.cpp | 8 | ||||
-rw-r--r-- | src/script/api/script_story_page.hpp | 11 | ||||
-rw-r--r-- | src/story.cpp | 23 | ||||
-rw-r--r-- | src/story_gui.cpp | 9 |
8 files changed, 55 insertions, 3 deletions
diff --git a/src/command.cpp b/src/command.cpp index 38dc43521..d0d08ca31 100644 --- a/src/command.cpp +++ b/src/command.cpp @@ -159,6 +159,7 @@ CommandProc CmdCreateStoryPage; CommandProc CmdCreateStoryPageElement; CommandProc CmdUpdateStoryPageElement; CommandProc CmdSetStoryPageTitle; +CommandProc CmdShowStoryPage; CommandProc CmdRemoveStoryPage; CommandProc CmdLevelLand; @@ -309,6 +310,7 @@ static const Command _command_proc_table[] = { DEF_CMD(CmdCreateStoryPageElement, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_CREATE_STORY_PAGE_ELEMENT DEF_CMD(CmdUpdateStoryPageElement, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_UPDATE_STORY_PAGE_ELEMENT DEF_CMD(CmdSetStoryPageTitle, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_SET_STORY_PAGE_TITLE + DEF_CMD(CmdShowStoryPage, CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_SHOW_STORY_PAGE DEF_CMD(CmdRemoveStoryPage, CMD_STR_CTRL | CMD_DEITY, CMDT_OTHER_MANAGEMENT ), // CMD_REMOVE_STORY_PAGE DEF_CMD(CmdLevelLand, CMD_ALL_TILES | CMD_NO_TEST | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_LEVEL_LAND; test run might clear tiles multiple times, in execution that only happens once diff --git a/src/command_type.h b/src/command_type.h index 78e8c188e..f3236f261 100644 --- a/src/command_type.h +++ b/src/command_type.h @@ -275,6 +275,7 @@ enum Commands { CMD_CREATE_STORY_PAGE_ELEMENT, ///< create a new story page element CMD_UPDATE_STORY_PAGE_ELEMENT, ///< update a story page element CMD_SET_STORY_PAGE_TITLE, ///< update title of a story page + CMD_SHOW_STORY_PAGE, ///< show a story page CMD_REMOVE_STORY_PAGE, ///< remove a story page CMD_LEVEL_LAND, ///< level land @@ -16,6 +16,7 @@ #include "economy_type.h" #include "tile_type.h" #include "transport_type.h" +#include "story_type.h" struct Window; @@ -51,7 +52,7 @@ void ShowIndustryCargoesWindow(); void ShowSubsidiesList(); void ShowGoalsList(); void ShowGoalQuestion(uint16 id, byte type, uint32 button_mask, const char *question); -void ShowStoryBook(); +void ShowStoryBook(uint16 page_id = INVALID_STORY_PAGE); void ShowEstimatedCostOrIncome(Money cost, int x, int y); diff --git a/src/script/api/game/game_story_page.hpp.sq b/src/script/api/game/game_story_page.hpp.sq index abc9500d1..1d0fe6ced 100644 --- a/src/script/api/game/game_story_page.hpp.sq +++ b/src/script/api/game/game_story_page.hpp.sq @@ -33,6 +33,7 @@ void SQGSStoryPage_Register(Squirrel *engine) SQGSStoryPage.DefSQStaticMethod(engine, &ScriptStoryPage::NewElement, "NewElement", 5, ".iii."); SQGSStoryPage.DefSQStaticMethod(engine, &ScriptStoryPage::UpdateElement, "UpdateElement", 4, ".ii."); SQGSStoryPage.DefSQStaticMethod(engine, &ScriptStoryPage::SetTitle, "SetTitle", 3, ".i."); + SQGSStoryPage.DefSQStaticMethod(engine, &ScriptStoryPage::Show, "Show", 2, ".i"); SQGSStoryPage.DefSQStaticMethod(engine, &ScriptStoryPage::Remove, "Remove", 2, ".i"); SQGSStoryPage.PostRegister(engine); diff --git a/src/script/api/script_story_page.cpp b/src/script/api/script_story_page.cpp index e94bc0017..8d6253b3c 100644 --- a/src/script/api/script_story_page.cpp +++ b/src/script/api/script_story_page.cpp @@ -109,6 +109,14 @@ return ScriptObject::DoCommand(0, story_page_id, 0, CMD_SET_STORY_PAGE_TITLE, title != NULL? title->GetEncodedText() : NULL); } +/* static */ bool ScriptStoryPage::Show(StoryPageID story_page_id) +{ + EnforcePrecondition(false, IsValidStoryPage(story_page_id)); + EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); + + return ScriptObject::DoCommand(0, story_page_id, 0, CMD_SHOW_STORY_PAGE); +} + /* static */ bool ScriptStoryPage::Remove(StoryPageID story_page_id) { EnforcePrecondition(false, ScriptObject::GetCompany() == OWNER_DEITY); diff --git a/src/script/api/script_story_page.hpp b/src/script/api/script_story_page.hpp index b013f2515..d026650be 100644 --- a/src/script/api/script_story_page.hpp +++ b/src/script/api/script_story_page.hpp @@ -129,6 +129,17 @@ public: static bool SetTitle(StoryPageID story_page_id, Text *title); /** + * Opens the Story Book if not yet open and selects the given page. + * @param story_page_id The story page to update. If it is a global page, clients of all + * companies are affecetd. Otherwise only the clients of the company which the page belongs + * to are affected. + * @return True if the action succeeded. + * @pre No ScriptCompanyMode may be in scope. + * @pre IsValidStoryPage(story_page_id). + */ + static bool Show(StoryPageID story_page_id); + + /** * Remove a story page from the list. * @param story_page_id The story page to remove. * @return True if the action succeeded. diff --git a/src/story.cpp b/src/story.cpp index e492ded4d..74cdd1d5c 100644 --- a/src/story.cpp +++ b/src/story.cpp @@ -21,6 +21,7 @@ #include "goal_type.h" #include "goal_base.h" #include "window_func.h" +#include "gui.h" StoryPageElementID _new_story_page_element_id; @@ -247,6 +248,28 @@ CommandCost CmdSetStoryPageTitle(TileIndex tile, DoCommandFlag flags, uint32 p1, } /** + * Display a story page for all clients that are allowed to + * view the story page. + * @param tile unused. + * @param flags type of operation + * @param p1 StoryPageID to show. + * @param p2 unused + * @param text unused + * @return the cost of this operation or an error + */ +CommandCost CmdShowStoryPage(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text) +{ + if (_current_company != OWNER_DEITY) return CMD_ERROR; + if (!StoryPage::IsValidID(p1)) return CMD_ERROR; + + if (flags & DC_EXEC) { + StoryPage *g = StoryPage::Get(p1); + if ((g->company != INVALID_COMPANY && g->company == _local_company) || (g->company == INVALID_COMPANY && Company::IsValidID(_local_company))) ShowStoryBook(p1); + } + + return CommandCost(); +} +/** * Remove a story page and associated story page elements. * @param tile unused. * @param flags type of operation diff --git a/src/story_gui.cpp b/src/story_gui.cpp index 62ec3606a..64782b90e 100644 --- a/src/story_gui.cpp +++ b/src/story_gui.cpp @@ -23,6 +23,7 @@ #include "sortlist_type.h" #include "goal_base.h" #include "viewport_func.h" +#include "window_func.h" #include "widgets/story_widget.h" @@ -725,7 +726,11 @@ static WindowDesc _story_book_desc( _nested_story_book_widgets, lengthof(_nested_story_book_widgets) ); -void ShowStoryBook() +void ShowStoryBook(uint16 page_id) { - AllocateWindowDescFront<StoryBookWindow>(&_story_book_desc, 0); + StoryBookWindow *w = AllocateWindowDescFront<StoryBookWindow>(&_story_book_desc, 0); + if (page_id != INVALID_STORY_PAGE) { + if (w == NULL) w = (StoryBookWindow *)FindWindowById(WC_STORY_BOOK, 0); + w->SetSelectedPage(page_id); + } } |