From bc72b2d535b784eef9d474baba5d09b8beec4f1b Mon Sep 17 00:00:00 2001 From: gugus Date: Sun, 12 Feb 2012 22:24:23 +0100 Subject: [PATCH 1/4] fixed text color --- apps/openmw/mwgui/dialogue.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/openmw/mwgui/dialogue.cpp b/apps/openmw/mwgui/dialogue.cpp index 5754d1d7e..055b0a75f 100644 --- a/apps/openmw/mwgui/dialogue.cpp +++ b/apps/openmw/mwgui/dialogue.cpp @@ -190,7 +190,7 @@ void DialogueWindow::displayTopicText(std::string topic) void DialogueWindow::addText(std::string text) { - history->addDialogText(parseText(text)); + history->addDialogText("#B29154"+parseText(text)+"#B29154"); } void DialogueWindow::askQuestion(std::string question,std::list answers) From 232e478768a488e341a3255c71bab4e770db73d1 Mon Sep 17 00:00:00 2001 From: gugus Date: Wed, 15 Feb 2012 13:23:59 +0100 Subject: [PATCH 2/4] Fix for prefix/suffix stuff --- apps/openmw/mwdialogue/dialoguemanager.cpp | 50 +++++++++++++--------- apps/openmw/mwdialogue/dialoguemanager.hpp | 2 + apps/openmw/mwgui/dialogue.cpp | 21 ++++++--- 3 files changed, 47 insertions(+), 26 deletions(-) diff --git a/apps/openmw/mwdialogue/dialoguemanager.cpp b/apps/openmw/mwdialogue/dialoguemanager.cpp index d4b2234d6..b2915b10a 100644 --- a/apps/openmw/mwdialogue/dialoguemanager.cpp +++ b/apps/openmw/mwdialogue/dialoguemanager.cpp @@ -404,6 +404,32 @@ namespace MWDialogue knownTopics[toLower(topic)] = true; } + void DialogueManager::parseText(std::string text) + { + std::map::iterator it; + for(it = actorKnownTopics.begin();it != actorKnownTopics.end();it++) + { + MWGui::DialogueWindow* win = mEnvironment.mWindowManager->getDialogueWindow(); + size_t pos = find_str_ci(text,it->first,0); + if(pos !=std::string::npos) + { + if(pos==0) + { + //std::cout << "fouuuuuuuuuuund"; + knownTopics[it->first] = true; + win->addKeyword(it->first,it->second); + } + else if(text.substr(pos -1,1) == " ") + { + //std::cout << "fouuuuuuuuuuund"; + knownTopics[it->first] = true; + win->addKeyword(it->first,it->second); + } + } + + } + } + void DialogueManager::startDialogue (const MWWorld::Ptr& actor) { std::cout << "talking with " << MWWorld::Class::get (actor).getName (actor) << std::endl; @@ -463,18 +489,9 @@ namespace MWDialogue // TODO execute script } std::string text = iter->response; - std::map::iterator it; - for(it = actorKnownTopics.begin();it != actorKnownTopics.end();it++) - { - if(find_str_ci(text,it->first,0) !=std::string::npos) - { - //std::cout << "fouuuuuuuuuuund"; - knownTopics[it->first] = true; - MWGui::DialogueWindow* win2 = mEnvironment.mWindowManager->getDialogueWindow(); - win2->addKeyword(it->first,it->second); - } - } + parseText(text); win->addText(iter->response); + greetingFound = true; break; } @@ -486,16 +503,7 @@ namespace MWDialogue void DialogueManager::keywordSelected(std::string keyword) { std::string text = actorKnownTopics[keyword]; - std::map::iterator it; - for(it = actorKnownTopics.begin();it != actorKnownTopics.end();it++) - { - if(find_str_ci(text,it->first,0) !=std::string::npos) - { - knownTopics[it->first] = true; - MWGui::DialogueWindow* win = mEnvironment.mWindowManager->getDialogueWindow(); - win->addKeyword(it->first,it->second); - } - } + parseText(text); } void DialogueManager::goodbyeSelected() diff --git a/apps/openmw/mwdialogue/dialoguemanager.hpp b/apps/openmw/mwdialogue/dialoguemanager.hpp index 88ae9e35c..4d16abf6d 100644 --- a/apps/openmw/mwdialogue/dialoguemanager.hpp +++ b/apps/openmw/mwdialogue/dialoguemanager.hpp @@ -21,6 +21,8 @@ namespace MWDialogue bool isMatching (const MWWorld::Ptr& actor, const ESM::DialInfo& info) const; + void parseText(std::string text); + std::map knownTopics;// Those are the topics the player knows. std::map actorKnownTopics; diff --git a/apps/openmw/mwgui/dialogue.cpp b/apps/openmw/mwgui/dialogue.cpp index 055b0a75f..f336d8a38 100644 --- a/apps/openmw/mwgui/dialogue.cpp +++ b/apps/openmw/mwgui/dialogue.cpp @@ -154,12 +154,23 @@ void addColorInString(std::string& str, const std::string& keyword,std::string c size_t pos = 0; while((pos = find_str_ci(str,keyword, pos)) != std::string::npos) { + if(pos==0) + { + str.insert(pos,color1); + pos += color1.length(); + pos += keyword.length(); + str.insert(pos,color2); + pos+= color2.length(); + } + else if(str.substr(pos -1,1) == " ") + { + str.insert(pos,color1); + pos += color1.length(); + pos += keyword.length(); + str.insert(pos,color2); + pos+= color2.length(); + } //str.replace(pos, oldStr.length(), "#686EBA"+str.get); - str.insert(pos,color1); - pos += color1.length(); - pos += keyword.length(); - str.insert(pos,color2); - pos+= color2.length(); } } From c0bd86ce4446a4ac340b5f6947de616aac28db0a Mon Sep 17 00:00:00 2001 From: gugus Date: Fri, 17 Feb 2012 20:20:23 +0100 Subject: [PATCH 3/4] scripts. Not tested --- apps/openmw/mwdialogue/dialoguemanager.cpp | 91 ++++++++++++++++++++-- apps/openmw/mwdialogue/dialoguemanager.hpp | 23 +++++- 2 files changed, 105 insertions(+), 9 deletions(-) diff --git a/apps/openmw/mwdialogue/dialoguemanager.cpp b/apps/openmw/mwdialogue/dialoguemanager.cpp index b2915b10a..5830832db 100644 --- a/apps/openmw/mwdialogue/dialoguemanager.cpp +++ b/apps/openmw/mwdialogue/dialoguemanager.cpp @@ -24,6 +24,19 @@ #include +#include "../mwscript/extensions.hpp" +#include +#include +#include +#include +#include +#include +#include + +#include "../mwscript/compilercontext.hpp" +#include "../mwscript/interpretercontext.hpp" +#include + namespace { std::string toLower (const std::string& name) @@ -397,7 +410,10 @@ namespace MWDialogue return true; } - DialogueManager::DialogueManager (MWWorld::Environment& environment) : mEnvironment (environment) {} + DialogueManager::DialogueManager (MWWorld::Environment& environment) : + mEnvironment (environment),mCompilerContext (MWScript::CompilerContext::Type_Dialgoue, environment) + { + } void DialogueManager::addTopic(std::string topic) { @@ -406,7 +422,7 @@ namespace MWDialogue void DialogueManager::parseText(std::string text) { - std::map::iterator it; + std::map::iterator it; for(it = actorKnownTopics.begin();it != actorKnownTopics.end();it++) { MWGui::DialogueWindow* win = mEnvironment.mWindowManager->getDialogueWindow(); @@ -417,13 +433,13 @@ namespace MWDialogue { //std::cout << "fouuuuuuuuuuund"; knownTopics[it->first] = true; - win->addKeyword(it->first,it->second); + win->addKeyword(it->first,it->second.response); } else if(text.substr(pos -1,1) == " ") { //std::cout << "fouuuuuuuuuuund"; knownTopics[it->first] = true; - win->addKeyword(it->first,it->second); + win->addKeyword(it->first,it->second.response); } } @@ -434,6 +450,8 @@ namespace MWDialogue { std::cout << "talking with " << MWWorld::Class::get (actor).getName (actor) << std::endl; + mActor = actor; + //initialise the GUI mEnvironment.mInputManager->setGuiMode(MWGui::GM_Dialogue); MWGui::DialogueWindow* win = mEnvironment.mWindowManager->getDialogueWindow(); @@ -451,7 +469,7 @@ namespace MWDialogue { if (isMatching (actor, *iter)) { - actorKnownTopics[it->first] = iter->response; + actorKnownTopics[it->first] = *iter; if(knownTopics.find(toLower(it->first)) != knownTopics.end()) { MWGui::DialogueWindow* win = mEnvironment.mWindowManager->getDialogueWindow(); @@ -491,7 +509,7 @@ namespace MWDialogue std::string text = iter->response; parseText(text); win->addText(iter->response); - + executeScript(iter->resultScript); greetingFound = true; break; } @@ -500,10 +518,63 @@ namespace MWDialogue } } + bool DialogueManager::compile (const std::string& cmd, Compiler::Output& output) + { + try + { + ErrorHandler::reset(); + + std::istringstream input (cmd + '\n'); + + Compiler::Scanner scanner (*this, input, mCompilerContext.getExtensions()); + + Compiler::FileParser parser(*this,mCompilerContext); + + scanner.scan (parser); + + return isGood(); + } + catch (const Compiler::SourceException& error) + { + // error has already been reported via error handler + } + catch (const std::exception& error) + { + printError (std::string ("An exception has been thrown: ") + error.what()); + } + + return false; + } + + void DialogueManager::executeScript(std::string script) + { + Compiler::Locals locals; + Compiler::Output output (locals); + + if(compile(script,output)) + { + try + { + MWScript::InterpreterContext interpreterContext(mEnvironment,&mActor.getRefData().getLocals(),mActor); + Interpreter::Interpreter interpreter; + MWScript::installOpcodes (interpreter); + std::vector code; + output.getCode (code); + interpreter.run (&code[0], code.size(), interpreterContext); + } + catch (const std::exception& error) + { + printError (std::string ("An exception has been thrown: ") + error.what()); + } + } + } + void DialogueManager::keywordSelected(std::string keyword) { - std::string text = actorKnownTopics[keyword]; + std::string text = actorKnownTopics[keyword].response; + std::string script = actorKnownTopics[keyword].resultScript; parseText(text); + executeScript(script); } void DialogueManager::goodbyeSelected() @@ -516,4 +587,10 @@ namespace MWDialogue std::cout << "and the ansere is..."<< answere; } + void DialogueManager::printError(std::string error) + { + MWGui::DialogueWindow* win = mEnvironment.mWindowManager->getDialogueWindow(); + win->addText(error); + } + } diff --git a/apps/openmw/mwdialogue/dialoguemanager.hpp b/apps/openmw/mwdialogue/dialoguemanager.hpp index 4d16abf6d..4226a447c 100644 --- a/apps/openmw/mwdialogue/dialoguemanager.hpp +++ b/apps/openmw/mwdialogue/dialoguemanager.hpp @@ -3,6 +3,11 @@ #include +#include +#include "../mwscript/compilercontext.hpp" +#include "../mwscript/interpretercontext.hpp" +#include + #include "../mwworld/ptr.hpp" #include @@ -13,7 +18,7 @@ namespace MWWorld namespace MWDialogue { - class DialogueManager + class DialogueManager: private Compiler::ErrorHandler { MWWorld::Environment& mEnvironment; @@ -24,7 +29,21 @@ namespace MWDialogue void parseText(std::string text); std::map knownTopics;// Those are the topics the player knows. - std::map actorKnownTopics; + std::map actorKnownTopics; + + MWScript::CompilerContext mCompilerContext; + + /// Report error to the user. + virtual void report (const std::string& message, const Compiler::TokenLoc& loc, Type type){}; + + /// Report a file related error + virtual void report (const std::string& message, Type type){}; + + bool compile (const std::string& cmd, Compiler::Output& output); + void executeScript(std::string script); + MWWorld::Ptr mActor; + + void printError(std::string error); public: From 9716199d187d21be6d4793e35a442f64b2747192 Mon Sep 17 00:00:00 2001 From: gugus Date: Sat, 18 Feb 2012 12:19:42 +0100 Subject: [PATCH 4/4] script "fix". I'm waiting for you Zini^^ --- apps/openmw/mwdialogue/dialoguemanager.cpp | 31 +++++++++++----------- apps/openmw/mwdialogue/dialoguemanager.hpp | 15 +++++------ 2 files changed, 22 insertions(+), 24 deletions(-) diff --git a/apps/openmw/mwdialogue/dialoguemanager.cpp b/apps/openmw/mwdialogue/dialoguemanager.cpp index 5830832db..2aea3fcc3 100644 --- a/apps/openmw/mwdialogue/dialoguemanager.cpp +++ b/apps/openmw/mwdialogue/dialoguemanager.cpp @@ -27,7 +27,6 @@ #include "../mwscript/extensions.hpp" #include #include -#include #include #include #include @@ -35,7 +34,7 @@ #include "../mwscript/compilercontext.hpp" #include "../mwscript/interpretercontext.hpp" -#include +#include namespace { @@ -411,7 +410,8 @@ namespace MWDialogue } DialogueManager::DialogueManager (MWWorld::Environment& environment) : - mEnvironment (environment),mCompilerContext (MWScript::CompilerContext::Type_Dialgoue, environment) + mEnvironment (environment),mCompilerContext (MWScript::CompilerContext::Type_Dialgoue, environment), + mErrorStream(std::cout.rdbuf()),mErrorHandler(mErrorStream) { } @@ -518,21 +518,26 @@ namespace MWDialogue } } - bool DialogueManager::compile (const std::string& cmd, Compiler::Output& output) + bool DialogueManager::compile (const std::string& cmd,std::vector& code) { try { - ErrorHandler::reset(); + mErrorHandler.reset(); - std::istringstream input (cmd + '\n'); + std::istringstream input (cmd); - Compiler::Scanner scanner (*this, input, mCompilerContext.getExtensions()); + Compiler::Scanner scanner (mErrorHandler, input, mCompilerContext.getExtensions()); - Compiler::FileParser parser(*this,mCompilerContext); + Compiler::ScriptParser parser(mErrorHandler,mCompilerContext,Compiler::Locals());//??????&mActor.getRefData().getLocals()); scanner.scan (parser); - return isGood(); + if(mErrorHandler.isGood()) + { + parser.getCode(code); + return true; + } + return false; } catch (const Compiler::SourceException& error) { @@ -548,18 +553,14 @@ namespace MWDialogue void DialogueManager::executeScript(std::string script) { - Compiler::Locals locals; - Compiler::Output output (locals); - - if(compile(script,output)) + std::vector code; + if(compile(script,code)) { try { MWScript::InterpreterContext interpreterContext(mEnvironment,&mActor.getRefData().getLocals(),mActor); Interpreter::Interpreter interpreter; MWScript::installOpcodes (interpreter); - std::vector code; - output.getCode (code); interpreter.run (&code[0], code.size(), interpreterContext); } catch (const std::exception& error) diff --git a/apps/openmw/mwdialogue/dialoguemanager.hpp b/apps/openmw/mwdialogue/dialoguemanager.hpp index 4226a447c..600171d33 100644 --- a/apps/openmw/mwdialogue/dialoguemanager.hpp +++ b/apps/openmw/mwdialogue/dialoguemanager.hpp @@ -3,7 +3,7 @@ #include -#include +#include #include "../mwscript/compilercontext.hpp" #include "../mwscript/interpretercontext.hpp" #include @@ -18,7 +18,7 @@ namespace MWWorld namespace MWDialogue { - class DialogueManager: private Compiler::ErrorHandler + class DialogueManager { MWWorld::Environment& mEnvironment; @@ -32,14 +32,11 @@ namespace MWDialogue std::map actorKnownTopics; MWScript::CompilerContext mCompilerContext; + std::ostream mErrorStream; + Compiler::StreamErrorHandler mErrorHandler; + - /// Report error to the user. - virtual void report (const std::string& message, const Compiler::TokenLoc& loc, Type type){}; - - /// Report a file related error - virtual void report (const std::string& message, Type type){}; - - bool compile (const std::string& cmd, Compiler::Output& output); + bool compile (const std::string& cmd,std::vector& code); void executeScript(std::string script); MWWorld::Ptr mActor;