Author: shadowmaster
Date: Tue Mar 31 18:06:04 2009
New Revision: 34337

URL: http://svn.gna.org/viewcvs/wesnoth?rev=34337&view=rev
Log:
More stuff for the storyscreen code refactoring.

The code at the moment is sketchy and messy; this will change later.

Added:
    trunk/src/storyscreen_controller.cpp
    trunk/src/storyscreen_controller.hpp
    trunk/src/storyscreen_page.cpp
    trunk/src/storyscreen_page.hpp
Modified:
    trunk/src/CMakeLists.txt
    trunk/src/Makefile.am
    trunk/src/SConscript
    trunk/src/intro.cpp
    trunk/src/storyscreen.cpp
    trunk/src/storyscreen.hpp

Modified: trunk/src/CMakeLists.txt
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/CMakeLists.txt?rev=34337&r1=34336&r2=34337&view=diff
==============================================================================
--- trunk/src/CMakeLists.txt (original)
+++ trunk/src/CMakeLists.txt Tue Mar 31 18:06:04 2009
@@ -307,6 +307,8 @@
     statistics.cpp
     statistics_dialog.cpp
     storyscreen.cpp
+    storyscreen_controller.cpp
+    storyscreen_page.cpp
     team.cpp
     terrain_filter.cpp
     time_of_day.cpp

Modified: trunk/src/Makefile.am
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/Makefile.am?rev=34337&r1=34336&r2=34337&view=diff
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Tue Mar 31 18:06:04 2009
@@ -144,6 +144,8 @@
        statistics.cpp \
        statistics_dialog.cpp \
        storyscreen.cpp \
+       storyscreen_controller.cpp \
+       storyscreen_page.cpp \
        team.cpp \
        terrain_filter.cpp \
        text.cpp \

Modified: trunk/src/SConscript
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/SConscript?rev=34337&r1=34336&r2=34337&view=diff
==============================================================================
--- trunk/src/SConscript (original)
+++ trunk/src/SConscript Tue Mar 31 18:06:04 2009
@@ -199,6 +199,8 @@
     statistics.cpp
     statistics_dialog.cpp
     storyscreen.cpp
+    storyscreen_controller.cpp
+    storyscreen_page.cpp
     team.cpp
     terrain_filter.cpp
     time_of_day.cpp

Modified: trunk/src/intro.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/intro.cpp?rev=34337&r1=34336&r2=34337&view=diff
==============================================================================
--- trunk/src/intro.cpp (original)
+++ trunk/src/intro.cpp Tue Mar 31 18:06:04 2009
@@ -17,8 +17,6 @@
  * Introduction sequence at start of a scenario, End-screen after end of
  * campaign.
  */
-
-// Do not remove the #ifndef below. See storyscreen.hpp.
 #ifndef SHADOWM_STORYSCREEN
 
 #include "global.hpp"

Modified: trunk/src/storyscreen.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen.cpp?rev=34337&r1=34336&r2=34337&view=diff
==============================================================================
--- trunk/src/storyscreen.cpp (original)
+++ trunk/src/storyscreen.cpp Tue Mar 31 18:06:04 2009
@@ -13,16 +13,20 @@
    See the COPYING file for more details.
 */
 
-// This code is work in progress, and shouldn't be enabled for production
-// builds. It is supposed to completely replace the old story screens code
-// at intro.cpp, introducing new WML conventions while at it.
-//
-// Do not remove the #ifdef below.
+/**
+ * @file storyscreen.cpp
+ * This code is work in progress, and shouldn't be enabled for production
+ * builds. It is supposed to completely replace the old story screens code
+ * at intro.cpp, introducing new WML conventions while at it.
+ */
 #ifdef SHADOWM_STORYSCREEN
 
 #include "global.hpp"
 #include "foreach.hpp"
 #include "variable.hpp"
+
+#include "storyscreen.hpp"
+#include "storyscreen_controller.hpp"
 
 #include "display.hpp"
 #include "game_events.hpp"
@@ -39,33 +43,22 @@
 #define ERR_DI LOG_STREAM(err , display)
 
 // TODO: remove when completed
-#include "boost/current_function.hpp"
-#define STUB() \
-       std::cerr << "OUCH: entered stub " << BOOST_CURRENT_FUNCTION << " [at " 
<< __FILE__ << ":" << __LINE__ << "]\n"
-
-class storyscreen
-{
-public:
-       storyscreen(display& disp, const vconfig& data, const config& 
scenario_cfg);
-
-private:
-       display& disp_;
-       vconfig data_;
-       config scenario_;
-};
+#include "stub.hpp"
 
 namespace {
-       void write_generic_endscreen_config(config& append_to_cfg)
+       void generate_endscreen_page_config(config& append_to_cfg)
        {
                config& partcfg = 
append_to_cfg.add_child("story").add_child("page");
                partcfg["text_align"] = "centered";
        }
 } // end anonymous namespace
 
-void show_storyscreen(display& disp, const vconfig& data, const config& 
scenario_cfg)
+void show_storyscreen(display& disp, const vconfig& story_cfg, const 
std::string& scenario_name)
 {
        STUB();
        LOG_NG << "entering storyscreen procedure...\n";
+
+       storyscreen::controller ctl(disp, story_cfg, scenario_name);
 
        // FIXME: stub!
 
@@ -77,6 +70,8 @@
        STUB();
        LOG_NG << "show_endscreen() invoked...\n";
 
+       config story_cfg;
+
        // FIXME: stub!
 
        LOG_NG << "show_endscreen() completed...\n";
@@ -85,7 +80,8 @@
 // Trivial drop-in compatibility with intro.cpp
 void show_intro(display &disp, const vconfig& data, const config& level)
 {
-       show_storyscreen(disp,data,level);
+       const std::string scenario_name = level["name"];
+       show_storyscreen(disp,data,scenario_name);
 }
 
 void the_end(display &disp, std::string text, unsigned int duration)

Modified: trunk/src/storyscreen.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen.hpp?rev=34337&r1=34336&r2=34337&view=diff
==============================================================================
--- trunk/src/storyscreen.hpp (original)
+++ trunk/src/storyscreen.hpp Tue Mar 31 18:06:04 2009
@@ -13,14 +13,13 @@
    See the COPYING file for more details.
 */
 
-/** @file storyscreen.hpp */
 // FIXME: textscreen.[ch]pp ??
-
-// This code is work in progress, and shouldn't be enabled for production
-// builds. It is supposed to completely replace the old story screens code
-// at intro.cpp, introducing new WML conventions while at it.
-//
-// Do not remove the #ifdef below.
+/**
+ * @file storyscreen.hpp
+ * This code is work in progress, and shouldn't be enabled for production
+ * builds. It is supposed to completely replace the old story screens code
+ * at intro.cpp, introducing new WML conventions while at it.
+ */
 #ifdef SHADOWM_STORYSCREEN
 
 #ifndef STORYSCREEN_HPP_INCLUDED
@@ -30,13 +29,12 @@
 class vconfig;
 class display;
 class t_string;
-#include "SDL.h"
 
 #include <string>
 
 /**
  * Function to show an introduction sequence using story WML.
- * The WML config data has a format similar to:
+ * The WML config data (story_cfg) has a format similar to:
  * @code
  * [part]
  *     id='id'
@@ -49,7 +47,7 @@
  * be displayed in turn, with the user able to go to the next part, or skip
  * it entirely.
  */
-void show_storyscreen(display& disp, const vconfig& data, const config& 
scenario_cfg);
+void show_storyscreen(display& disp, const vconfig& story_cfg, const 
std::string& scenario_name);
 
 /**
  * Displays a simple fading screen with any user-provided text.

Added: trunk/src/storyscreen_controller.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen_controller.cpp?rev=34337&view=auto
==============================================================================
--- trunk/src/storyscreen_controller.cpp (added)
+++ trunk/src/storyscreen_controller.cpp Tue Mar 31 18:06:04 2009
@@ -1,0 +1,102 @@
+/* $Id$ */
+/*
+   Copyright (C) 2003 - 2009 by David White <[email protected]>
+   Copyright (C) 2009 by Ignacio R. Morelle <[email protected]>
+   Part of the Battle for Wesnoth Project http://www.wesnoth.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License version 2
+   or at your option any later version.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY.
+
+   See the COPYING file for more details.
+*/
+
+// FIXME: textscreen.[ch]pp ??
+/**
+ * @file storyscreen_controller.cpp
+ * This code is work in progress, and shouldn't be enabled for production
+ * builds. It is supposed to completely replace the old story screens code
+ * at intro.cpp, introducing new WML conventions while at it.
+ */
+#ifdef SHADOWM_STORYSCREEN
+
+#include "global.hpp"
+#include "SDL.h"
+
+#include "storyscreen_controller.hpp"
+#include "storyscreen_page.hpp"
+
+#include "asserts.hpp"
+#include "foreach.hpp"
+#include "variable.hpp"
+
+#include "display.hpp"
+#include "game_events.hpp"
+#include "gamestatus.hpp"
+#include "gettext.hpp"
+#include "intro.hpp"
+#include "language.hpp"
+#include "log.hpp"
+#include "sound.hpp"
+#include "text.hpp"
+
+#define ERR_NG LOG_STREAM(err , engine)
+#define LOG_NG LOG_STREAM(info, engine)
+#define ERR_DI LOG_STREAM(err , display)
+
+// TODO: remove when completed
+#include "stub.hpp"
+
+namespace storyscreen {
+
+controller::controller(display& disp, const vconfig& data, const std::string& 
scenario_name)
+       : disp_(disp)
+       , disp_resize_lock_()
+       , evt_context_()
+       , data_(data)
+       , scenario_name_(scenario_name)
+       , pages_()
+       , gamestate_(game_events::get_state_of_game())
+{
+       ASSERT_LOG(gamestate_ != NULL, "Ouch: gamestate is NULL when 
initializing storyscreen controller");
+       build_pages();
+}
+
+controller::~controller()
+{
+       clear_pages();
+}
+
+void controller::build_pages()
+{
+
+
+       for(vconfig::all_children_iterator i = data_.ordered_begin(); i != 
data_.ordered_end(); i++) {
+               const std::pair<const std::string, const vconfig> item = *i;
+
+               if(item.first == "page" && !item.second.empty()) {
+                       vconfig cfg = item.second;
+                       // Use scenario name as page title if the WML doesn't 
supply a custom one.
+//                     if(cfg["title"].empty()) {
+//                             cfg["title"] = scenario_name_;
+//                     }
+
+                       page* story_page = new page(*gamestate_, cfg);
+               }
+               
+       }
+}
+
+void controller::clear_pages()
+{
+       foreach(page* p, pages_) {
+               delete p;
+       }
+       pages_.clear();
+}
+
+} // end namespace storyscreen
+
+#endif /* SHADOWM_STORYSCREEN */

Added: trunk/src/storyscreen_controller.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen_controller.hpp?rev=34337&view=auto
==============================================================================
--- trunk/src/storyscreen_controller.hpp (added)
+++ trunk/src/storyscreen_controller.hpp Tue Mar 31 18:06:04 2009
@@ -1,0 +1,81 @@
+/* $Id$ */
+/*
+   Copyright (C) 2003 - 2009 by David White <[email protected]>
+   Copyright (C) 2009 by Ignacio R. Morelle <[email protected]>
+   Part of the Battle for Wesnoth Project http://www.wesnoth.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License version 2
+   or at your option any later version.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY.
+
+   See the COPYING file for more details.
+*/
+
+// FIXME: textscreen.[ch]pp ??
+/**
+ * @file storyscreen_controller.hpp
+ * This code is work in progress, and shouldn't be enabled for production
+ * builds. It is supposed to completely replace the old story screens code
+ * at intro.cpp, introducing new WML conventions while at it.
+ */
+#ifdef SHADOWM_STORYSCREEN
+
+#ifndef STORYSCREEN_CONTROLLER_HPP_INCLUDED
+#define STORYSCREEN_CONTROLLER_HPP_INCLUDED
+
+#include "events.hpp"
+#include "variable.hpp"
+#include "video.hpp"
+
+class display;
+class game_state;
+// class vconfig;
+
+namespace storyscreen {
+
+class page;
+class floating_image;
+
+class controller
+{
+public:
+       controller(display& disp, const vconfig& data, const std::string& 
scenario_name);
+       ~controller();
+
+       /**
+       * Display story screen pages.
+       */
+       void show_all_pages() const;
+
+
+private:
+       // Used by ctor; processes possible WML branching instructions
+       // ([if]/[else] and [switch]) and builds the page cache.
+       void build_pages();
+       // Used by dtor.
+       void clear_pages();
+
+       display& disp_;
+       const resize_lock disp_resize_lock_;
+       const events::event_context evt_context_;
+
+       vconfig data_;
+       std::string scenario_name_;
+
+       // The page cache.
+       std::vector<page*> pages_;
+
+       // The state of the world.
+       game_state* gamestate_;
+
+public:
+       struct no_pages {};
+
+};
+
+} // end namespace storyscreen
+
+#endif /* ! STORYSCREEN_CONTROLLER_HPP_INCLUDED */
+#endif /* SHADOWM_STORYSCREEN */

Added: trunk/src/storyscreen_page.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen_page.cpp?rev=34337&view=auto
==============================================================================
--- trunk/src/storyscreen_page.cpp (added)
+++ trunk/src/storyscreen_page.cpp Tue Mar 31 18:06:04 2009
@@ -1,0 +1,142 @@
+/* $Id$ */
+/*
+   Copyright (C) 2009 by Ignacio R. Morelle <[email protected]>
+   Part of the Battle for Wesnoth Project http://www.wesnoth.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License version 2
+   or at your option any later version.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY.
+
+   See the COPYING file for more details.
+*/
+
+#ifdef SHADOWM_STORYSCREEN
+#include "global.hpp"
+#include "asserts.hpp"
+#include "log.hpp"
+#include "storyscreen_page.hpp"
+
+#include "config.hpp"
+#include "gamestatus.hpp"
+#include "game_events.hpp"
+#include "serialization/string_utils.hpp"
+#include "util.hpp"
+#include "variable.hpp"
+
+// TODO: remove when completed
+#include "stub.hpp"
+
+namespace storyscreen {
+
+floating_image::floating_image(const config& cfg)
+       : file_(cfg["file"])
+       , x_(lexical_cast_default<int>(cfg["x"]))
+       , y_(lexical_cast_default<int>(cfg["y"]))
+       , delay_(lexical_cast_default<int>(cfg["delay"]))
+       , autoscaled_(utils::string_bool(cfg["scaled"], false))
+       , centered_(utils::string_bool(cfg["centered"], false))
+{
+}
+
+page::page(game_state& state_of_game, const vconfig& page_cfg)
+       : scale_background_(utils::string_bool(page_cfg["scale_background"], 
true))
+       , background_file_(page_cfg["background"])
+       , show_title_(utils::string_bool(page_cfg["show_title"], false))
+       , text_(page_cfg["story"])
+       , text_title_(page_cfg["title"])
+       , text_block_loc_(string_tblock_loc(page_cfg["text_layout"]))
+       , music_(page_cfg["music"])
+       , floating_images_()
+{
+       resolve_wml(page_cfg);
+}
+
+page::TEXT_BLOCK_LOCATION page::string_tblock_loc(const std::string& s)
+{
+       if(s.empty() != true) {
+               if(s == "top") {
+                       return page::TOP;
+               }
+               else if(s == "middle" || s == "center") {
+                       return page::MIDDLE;
+               }
+       }
+
+       return page::BOTTOM;
+}
+
+void page::resolve_wml(const vconfig& page_cfg)
+{
+       STUB();
+       for(vconfig::all_children_iterator i = page_cfg.ordered_begin(); i != 
page_cfg.ordered_end(); ++ i) {
+               const std::pair<const std::string, const vconfig> xi = *i;
+               if(xi.first == "image") {
+                       
floating_images_.push_back(xi.second.get_parsed_config());
+               }
+               else if(xi.first == "if") {
+                       const std::string type = 
game_events::conditional_passed(
+                               NULL, xi.second) ? "then":"else";
+                       const vconfig branch = xi.second.child(type);
+                       if(!branch.empty()) {
+                               if(branch.has_attribute("background")) {
+                                       this->background_file_ = 
branch["background"];
+                               }
+                               if(branch.has_attribute("scale_background")) {
+                                       this->scale_background_ = 
utils::string_bool(branch["scale_background"], true);
+                               }
+                               if(branch.has_attribute("show_title")) {
+                                       this->show_title_ = 
utils::string_bool(branch["show_title"], false);
+                               }
+                               if(branch.has_attribute("title")) {
+                                       this->text_title_ = branch["title"];
+                               }
+                               if(branch.has_attribute("story")) {
+                                       this->text_ = branch["story"];
+                               }
+                               if(branch.has_attribute("text_layout")) {
+                                       this->text_block_loc_ = 
string_tblock_loc(branch["text_layout"]);
+                               }
+                               if(branch.has_attribute("music")) {
+                                       this->text_ = branch["music"];
+                               }
+
+                               // TODO recursive eval
+                               // TODO image stack
+                               
+                       }
+               }
+               else if(xi.first == "switch") {
+               }
+               else if(xi.first == "deprecated_message") {
+                       const std::string dmsg = (xi.second)["message"];
+                       if(!dmsg.empty()) {
+                               lg::wml_error << dmsg << '\n';
+                       }
+               }
+       }
+}
+
+floating_image::floating_image()
+       : file_(), x_(0), y_(0), delay_(0), autoscaled_(false), centered_(false)
+{
+       ASSERT_EQ(0xBAD,0xBEEF);
+}
+
+page::page()
+       : scale_background_()
+       , background_file_()
+       , show_title_()
+       , text_()
+       , text_title_()
+       , text_block_loc_()
+       , music_()
+       , floating_images_()
+{
+       ASSERT_EQ(0xDEAD,0xBEEF);
+}
+
+} // end namespace storyscreen
+
+#endif /* SHADOWM_STORYSCREEN */

Added: trunk/src/storyscreen_page.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/storyscreen_page.hpp?rev=34337&view=auto
==============================================================================
--- trunk/src/storyscreen_page.hpp (added)
+++ trunk/src/storyscreen_page.hpp Tue Mar 31 18:06:04 2009
@@ -1,0 +1,103 @@
+/* $Id$ */
+/*
+   Copyright (C) 2009 by Ignacio R. Morelle <[email protected]>
+   Part of the Battle for Wesnoth Project http://www.wesnoth.org/
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License version 2
+   or at your option any later version.
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY.
+
+   See the COPYING file for more details.
+*/
+
+#ifdef SHADOWM_STORYSCREEN
+#ifndef STORYSCREEN_PAGE_HPP_INCLUDED
+#define STORYSCREEN_PAGE_HPP_INCLUDED
+
+#include <string>
+#include <vector>
+
+class config;
+class vconfig;
+class game_state;
+
+namespace storyscreen {
+
+/**
+ * Represents and contains informations about image labels used
+ * in story screen pages.
+ */
+class floating_image
+{
+public:
+       floating_image(const config& cfg);
+
+       /** Returns the referential X coordinate of the image. */
+       int ref_x() const { return x_; }
+       /** Returns the referential Y coordinate of the image. */
+       int ref_y() const { return y_; }
+
+       bool autoscale() const { return autoscaled_; }
+       bool centered() const  { return centered_; }
+
+       /** Delay before displaying, in milliseconds. */
+       int display_delay() const { return delay_; }
+
+private:
+       floating_image();
+
+       std::string file_;
+       int x_, y_; // referential (non corrected) x,y
+       int delay_;
+       bool autoscaled_;
+       bool centered_;
+};
+
+/**
+ * Represents and contains information about a single storyscreen page.
+ */
+class page
+{
+public:
+       enum TEXT_BLOCK_LOCATION {
+               TOP,
+               MIDDLE,
+               BOTTOM
+       };
+
+       page(game_state& state_of_game, const vconfig& page_cfg);
+
+       bool scale_background() const { return scale_background_; }
+       const std::string& background() const { return background_file_; }
+
+       bool show_title() const { return show_title_; }
+       const std::string& text() const { return text_; }
+       const std::string& title() const { return text_title_; }
+
+private:
+       page();
+
+       void resolve_wml(const vconfig& page_cfg);
+
+       static TEXT_BLOCK_LOCATION string_tblock_loc(const std::string& s);
+
+       bool scale_background_;
+       std::string background_file_;
+
+       bool show_title_;
+       std::string text_;
+       std::string text_title_;
+       TEXT_BLOCK_LOCATION text_block_loc_;
+
+       std::string music_;
+
+       std::vector<floating_image> floating_images_;
+};
+
+} // end namespace storyscreen
+
+
+#endif /* ! STORYSCREEN_PAGE_HPP_INCLUDED */
+#endif /* ! SHADOWM_STORYSCREEN */


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to