From 33ad9774fb7c51f1ec706851c7a96a7ced5ff622 Mon Sep 17 00:00:00 2001 From: zuu Date: Sun, 9 Jun 2013 12:57:22 +0000 Subject: [PATCH] (svn r25352) -Feature: GameScript API for selecting a story page to view --- src/command.cpp | 2 ++ src/command_type.h | 1 + src/gui.h | 3 ++- src/script/api/game/game_story_page.hpp.sq | 1 + src/script/api/script_story_page.cpp | 8 ++++++++ src/script/api/script_story_page.hpp | 11 +++++++++++ src/story.cpp | 23 ++++++++++++++++++++++ src/story_gui.cpp | 9 +++++++-- 8 files changed, 55 insertions(+), 3 deletions(-) diff --git a/src/command.cpp b/src/command.cpp index 38dc43521d..d0d08ca315 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 78e8c188e7..f3236f261c 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 diff --git a/src/gui.h b/src/gui.h index 79c33e0b37..fe14e2d6e9 100644 --- a/src/gui.h +++ b/src/gui.h @@ -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 abc9500d19..1d0fe6cedf 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 e94bc00177..8d6253b3c5 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 b013f25158..d026650be5 100644 --- a/src/script/api/script_story_page.hpp +++ b/src/script/api/script_story_page.hpp @@ -128,6 +128,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. diff --git a/src/story.cpp b/src/story.cpp index e492ded4da..74cdd1d5c6 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; @@ -246,6 +247,28 @@ CommandCost CmdSetStoryPageTitle(TileIndex tile, DoCommandFlag flags, uint32 p1, return CommandCost(); } +/** + * 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. diff --git a/src/story_gui.cpp b/src/story_gui.cpp index 62ec3606a8..64782b90e7 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(&_story_book_desc, 0); + StoryBookWindow *w = AllocateWindowDescFront(&_story_book_desc, 0); + if (page_id != INVALID_STORY_PAGE) { + if (w == NULL) w = (StoryBookWindow *)FindWindowById(WC_STORY_BOOK, 0); + w->SetSelectedPage(page_id); + } }