source: nrEngine/src/IScript.cpp @ 27

Revision 27, 6.4 KB checked in by art, 12 years ago (diff)

nrScript: using of subscripts is now possible

Line 
1/***************************************************************************
2 *                                                                         *
3 *   (c) Art Tevs, MPI Informatik Saarbruecken                             *
4 *       mailto: <tevs@mpi-sb.mpg.de>                                      *
5 *                                                                         *
6 *   This program is free software; you can redistribute it and/or modify  *
7 *   it under the terms of the GNU General Public License as published by  *
8 *   the Free Software Foundation; either version 2 of the License, or     *
9 *   (at your option) any later version.                                   *
10 *                                                                         *
11 ***************************************************************************/
12
13
14//----------------------------------------------------------------------------------
15// Includes
16//----------------------------------------------------------------------------------
17#include "IScript.h"
18#include "Log.h"
19#include "Kernel.h"
20
21namespace nrEngine{
22
23
24        //--------------------------------------------------------------------
25        void IScript::notifyResReloaded()
26        {
27                // if we reload a resource, so we set the task name to the resource name
28                setTaskName(std::string("Script_") + getResName());
29        }
30
31        //--------------------------------------------------------------------
32        void IScript::notifyLoaded()
33        {
34                markResLoaded();
35        }
36
37        //--------------------------------------------------------------------
38        Result IScript::onStartTask()
39        {
40                // notice derived classes about starting
41                onStartScript();
42
43                return OK;
44        }
45
46        //--------------------------------------------------------------------
47        Result IScript::execute(bool runOnce)
48        {
49                // set running counter parameter
50                mbRunOnce = runOnce;
51
52                // if task is already running, so do not do anything
53                if (getTaskState() == TASK_RUNNING) return SCRIPT_ALREADY_RUNNING;
54
55                // add the task to the kernel
56                // also kernel is not allowed to remove this object, because
57                // we created it from this, so no reference counting is used
58                SharedPtr<ITask> task (this, null_deleter());
59                Engine::sKernel()->AddTask(task, ORDER_NORMAL);
60
61                return OK;
62        }
63
64        //--------------------------------------------------------------------
65        Result IScript::forceExecute(bool runOnce)
66        {
67                mbRunOnce = runOnce;
68
69                // we only run the script nothing more
70                if (runOnce) return run();
71
72                // we add it to the kernel and run it first
73                return execute(runOnce);
74        }
75
76        //--------------------------------------------------------------------
77        Result IScript::updateTask()
78        {
79                // run the script
80                Result ret = run();
81
82                // if script should run once, so check if it has still commands
83                if (shouldRunOnce())
84                {
85                        // check if script still have some commands
86                        if (!hasCommands())
87                        {
88                                Engine::sKernel()->RemoveTask(this->getTaskID());
89                        }
90                }
91
92                // return result
93                return ret;
94        }
95
96        //--------------------------------------------------------------------
97        IScript::~IScript()
98        {
99
100        }
101
102        //--------------------------------------------------------------------
103        IScript::IScript(const std::string& name) : IResource(name)
104        {
105                mbRunOnce = true;
106                setTaskName(std::string("Script_") + name);
107        }
108
109        //--------------------------------------------------------------------
110        uint32 IScript::pushArgument(const std::string& funcName, const std::string& type, const std::string& value)
111        {
112                // store the new argument in the database
113                mArguments[funcName].push_back(std::pair<std::string,std::string>(type, value));
114
115                // get the number of arguments for the function
116                return mArguments[funcName].size();
117        }
118
119        //--------------------------------------------------------------------
120        uint32 IScript::setArguments(const std::string& funcName, const ArgumentList& args)
121        {
122                mArguments[funcName] = args;
123                return mArguments[funcName].size();
124        }
125
126        //--------------------------------------------------------------------
127        int32 IScript::popArgument(const std::string& funcName, std::string& type, std::string& value)
128        {
129                // first check if such a function does exists
130                ArgumentDatabase::iterator it = mArguments.find(funcName);
131                if (it == mArguments.end()) return -1;
132
133                // check the number of elements
134                if (it->second.size() == 0) return -1;
135
136                // pop the element and return the number of remaining elements
137                const std::pair<std::string, std::string>& first = it->second.front();
138                type = first.first;
139                value = first.second;
140
141                it->second.pop_front();
142
143                return it->second.size();
144        }
145
146        //----------------------------------------------------------------------------------
147        ScriptResult IScript::call(const std::string& funcName)
148        {
149                // call a certain function
150                ScriptResult res;
151                Result ret = callfunc(funcName, res);
152                if (ret == OK) return res;
153
154                // we got an error, so throw an error
155                NR_EXCEPT(ret, mErrorMsg.front(), "IScript::call()");
156        }
157
158        //----------------------------------------------------------------------------------
159        Result IScript::callfunc(const std::string& funcName, ScriptResult& result)
160        {
161                // remove all parameters from the stack
162                std::string type, value;
163                while (popArgument(funcName, type, value) > 0){}
164
165                // return ok
166                return OK;
167        }
168
169        //----------------------------------------------------------------------------------
170        std::string IScript::popLastError()
171        {
172                if (mErrorMsg.size() == 0) return std::string();
173                std::string msg = mErrorMsg.front();
174                mErrorMsg.pop_front();
175                return msg;
176        }
177
178        //----------------------------------------------------------------------------------
179        void IScript::pushErrorMessage(const std::string& sh)
180        {
181                mErrorMsg.push_front(sh);
182                NR_Log(Log::LOG_CONSOLE, Log::LL_ERROR, "%s", sh.c_str());
183        }
184
185        //----------------------------------------------------------------------------------
186        // ----------------- Implementation of the empty script object ---------------------
187        //----------------------------------------------------------------------------------
188        //----------------------------------------------------------------------------------
189        EmptyScript::EmptyScript(const std::string& typeName) : IScript(typeName + "Empty")
190        {
191
192        }
193
194        //----------------------------------------------------------------------------------
195        EmptyScript::~EmptyScript()
196        {
197
198        }
199
200        //----------------------------------------------------------------------------------
201        Result EmptyScript::loadFromString(const std::string& str)
202        {
203                return OK;
204        }
205
206        //----------------------------------------------------------------------------------
207        Result EmptyScript::run()
208        {
209                return OK;
210        }
211
212}; // end namespace
213
Note: See TracBrowser for help on using the repository browser.