mirror of
				https://github.com/OpenMW/openmw.git
				synced 2025-11-03 23:26:40 +00:00 
			
		
		
		
	added first batch of AI-related instructions and functions (they don't do anything at this point)
This commit is contained in:
		
							parent
							
								
									c18e83d7c0
								
							
						
					
					
						commit
						14cf007a3f
					
				
					 5 changed files with 252 additions and 3 deletions
				
			
		| 
						 | 
					@ -60,6 +60,7 @@ set(GAMESCRIPT
 | 
				
			||||||
    mwscript/skyextensions.cpp
 | 
					    mwscript/skyextensions.cpp
 | 
				
			||||||
    mwscript/statsextensions.cpp
 | 
					    mwscript/statsextensions.cpp
 | 
				
			||||||
    mwscript/containerextensions.cpp
 | 
					    mwscript/containerextensions.cpp
 | 
				
			||||||
 | 
					    mwscript/aiextensions.cpp
 | 
				
			||||||
    mwscript/extensions.cpp
 | 
					    mwscript/extensions.cpp
 | 
				
			||||||
    mwscript/globalscripts.cpp
 | 
					    mwscript/globalscripts.cpp
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
| 
						 | 
					@ -75,6 +76,7 @@ set(GAMESCRIPT_HEADER
 | 
				
			||||||
    mwscript/skyextensions.hpp
 | 
					    mwscript/skyextensions.hpp
 | 
				
			||||||
    mwscript/statsextensions.hpp
 | 
					    mwscript/statsextensions.hpp
 | 
				
			||||||
    mwscript/containerextensions.hpp
 | 
					    mwscript/containerextensions.hpp
 | 
				
			||||||
 | 
					    mwscript/aiextensions.hpp
 | 
				
			||||||
    mwscript/extensions.hpp
 | 
					    mwscript/extensions.hpp
 | 
				
			||||||
    mwscript/globalscripts.hpp
 | 
					    mwscript/globalscripts.hpp
 | 
				
			||||||
    )
 | 
					    )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										214
									
								
								apps/openmw/mwscript/aiextensions.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										214
									
								
								apps/openmw/mwscript/aiextensions.cpp
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,214 @@
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "aiextensions.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <components/compiler/extensions.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <components/interpreter/interpreter.hpp>
 | 
				
			||||||
 | 
					#include <components/interpreter/runtime.hpp>
 | 
				
			||||||
 | 
					#include <components/interpreter/opcodes.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "interpretercontext.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <iostream>
 | 
				
			||||||
 | 
					namespace MWScript
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    namespace Ai
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        class OpAiTravel : public Interpreter::Opcode1
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                virtual void execute (Interpreter::Runtime& runtime, unsigned int arg0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    MWScript::InterpreterContext& context
 | 
				
			||||||
 | 
					                        = static_cast<MWScript::InterpreterContext&> (runtime.getContext());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    MWWorld::Ptr ptr = context.getReference();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float x = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float y = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float z = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // discard additional arguments (reset), because we have no idea what they mean.
 | 
				
			||||||
 | 
					                    for (unsigned int i=0; i<arg0; ++i) runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::cout << "AiTravel: " << x << ", " << y << ", " << z << std::endl;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class OpAiTravelExplicit : public Interpreter::Opcode1
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                virtual void execute (Interpreter::Runtime& runtime, unsigned int arg0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    MWScript::InterpreterContext& context
 | 
				
			||||||
 | 
					                        = static_cast<MWScript::InterpreterContext&> (runtime.getContext());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::string id = runtime.getStringLiteral (runtime[0].mInteger);
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    MWWorld::Ptr ptr = context.getWorld().getPtr (id, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float x = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float y = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float z = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // discard additional arguments (reset), because we have no idea what they mean.
 | 
				
			||||||
 | 
					                    for (unsigned int i=0; i<arg0; ++i) runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::cout << "AiTravel: " << x << ", " << y << ", " << z << std::endl;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class OpAiEscort : public Interpreter::Opcode1
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                virtual void execute (Interpreter::Runtime& runtime, unsigned int arg0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    MWScript::InterpreterContext& context
 | 
				
			||||||
 | 
					                        = static_cast<MWScript::InterpreterContext&> (runtime.getContext());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::string id = runtime.getStringLiteral (runtime[0].mInteger);
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    MWWorld::Ptr ptr = context.getReference();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::string actor = runtime.getStringLiteral (runtime[0].mInteger);
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float duration = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float x = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float y = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float z = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // discard additional arguments (reset), because we have no idea what they mean.
 | 
				
			||||||
 | 
					                    for (unsigned int i=0; i<arg0; ++i) runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::cout << "AiEscort: " << x << ", " << y << ", " << z << ", " << duration
 | 
				
			||||||
 | 
					                        << std::endl;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class OpAiEscortExplicit : public Interpreter::Opcode1
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                virtual void execute (Interpreter::Runtime& runtime, unsigned int arg0)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    MWScript::InterpreterContext& context
 | 
				
			||||||
 | 
					                        = static_cast<MWScript::InterpreterContext&> (runtime.getContext());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::string id = runtime.getStringLiteral (runtime[0].mInteger);
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    MWWorld::Ptr ptr = context.getWorld().getPtr (id, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::string actor = runtime.getStringLiteral (runtime[0].mInteger);
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float duration = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float x = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float y = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Float z = runtime[0].mInteger;
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    // discard additional arguments (reset), because we have no idea what they mean.
 | 
				
			||||||
 | 
					                    for (unsigned int i=0; i<arg0; ++i) runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::cout << "AiEscort: " << x << ", " << y << ", " << z << ", " << duration
 | 
				
			||||||
 | 
					                        << std::endl;
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class OpGetAiPackageDone : public Interpreter::Opcode0
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                virtual void execute (Interpreter::Runtime& runtime)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    MWScript::InterpreterContext& context
 | 
				
			||||||
 | 
					                        = static_cast<MWScript::InterpreterContext&> (runtime.getContext());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    MWWorld::Ptr ptr = context.getReference();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Integer value = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    runtime.push (value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        class OpGetAiPackageDoneExplicit : public Interpreter::Opcode0
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            public:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                virtual void execute (Interpreter::Runtime& runtime)
 | 
				
			||||||
 | 
					                {
 | 
				
			||||||
 | 
					                    MWScript::InterpreterContext& context
 | 
				
			||||||
 | 
					                        = static_cast<MWScript::InterpreterContext&> (runtime.getContext());
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    std::string id = runtime.getStringLiteral (runtime[0].mInteger);
 | 
				
			||||||
 | 
					                    runtime.pop();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    MWWorld::Ptr ptr = context.getWorld().getPtr (id, false);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    Interpreter::Type_Integer value = 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                    runtime.push (value);
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					        };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const int opcodeAiTravel = 0x20000;
 | 
				
			||||||
 | 
					        const int opcodeAiTravelExplicit = 0x20001;
 | 
				
			||||||
 | 
					        const int opcodeAiEscort = 0x20002;
 | 
				
			||||||
 | 
					        const int opcodeAiEscortExplicit = 0x20003;
 | 
				
			||||||
 | 
					        const int opcodeGetAiPackageDone = 0x200007c;
 | 
				
			||||||
 | 
					        const int opcodeGetAiPackageDoneExplicit = 0x200007d;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void registerExtensions (Compiler::Extensions& extensions)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            extensions.registerInstruction ("aitravel", "cllll/l", opcodeAiTravel,
 | 
				
			||||||
 | 
					                opcodeAiTravelExplicit);
 | 
				
			||||||
 | 
					            extensions.registerInstruction ("aiescort", "cllll/l", opcodeAiEscort,
 | 
				
			||||||
 | 
					                opcodeAiEscortExplicit);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            extensions.registerFunction ("getaipackagedone", 'l', "", opcodeGetAiPackageDone,
 | 
				
			||||||
 | 
					                opcodeGetAiPackageDoneExplicit);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void installOpcodes (Interpreter::Interpreter& interpreter)
 | 
				
			||||||
 | 
					        {
 | 
				
			||||||
 | 
					            interpreter.installSegment3 (opcodeAiTravel, new OpAiTravel);
 | 
				
			||||||
 | 
					            interpreter.installSegment3 (opcodeAiTravelExplicit, new OpAiTravelExplicit);
 | 
				
			||||||
 | 
					            interpreter.installSegment3 (opcodeAiEscort, new OpAiEscort);
 | 
				
			||||||
 | 
					            interpreter.installSegment3 (opcodeAiEscortExplicit, new OpAiEscortExplicit);
 | 
				
			||||||
 | 
					            interpreter.installSegment5 (opcodeGetAiPackageDone, new OpGetAiPackageDone);
 | 
				
			||||||
 | 
					            interpreter.installSegment5 (opcodeGetAiPackageDoneExplicit, new OpGetAiPackageDoneExplicit);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										25
									
								
								apps/openmw/mwscript/aiextensions.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								apps/openmw/mwscript/aiextensions.hpp
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					#ifndef GAME_SCRIPT_AIEXTENSIONS_H
 | 
				
			||||||
 | 
					#define GAME_SCRIPT_AIEXTENSIONS_H
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Compiler
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    class Extensions;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace Interpreter
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    class Interpreter;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace MWScript
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    /// \brief AI-related script functionality
 | 
				
			||||||
 | 
					    namespace Ai
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        void registerExtensions (Compiler::Extensions& extensions);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        void installOpcodes (Interpreter::Interpreter& interpreter);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					@ -13,8 +13,11 @@ Segment 2:
 | 
				
			||||||
opcodes 0x200-0x3ff unused
 | 
					opcodes 0x200-0x3ff unused
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Segment 3:
 | 
					Segment 3:
 | 
				
			||||||
(not implemented yet)
 | 
					op 0x20000: AiTravel
 | 
				
			||||||
opcodes 0x20000-0x3ffff unused
 | 
					op 0x20001: AiTravel, explicit reference
 | 
				
			||||||
 | 
					op 0x20002: AiEscort
 | 
				
			||||||
 | 
					op 0x20003: AiEscort, explicit reference
 | 
				
			||||||
 | 
					opcodes 0x20004-0x3ffff unused
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Segment 4:
 | 
					Segment 4:
 | 
				
			||||||
(not implemented yet)
 | 
					(not implemented yet)
 | 
				
			||||||
| 
						 | 
					@ -83,4 +86,6 @@ op 0x2000078: GetItemCount
 | 
				
			||||||
op 0x2000079: GetItemCount, explicit reference
 | 
					op 0x2000079: GetItemCount, explicit reference
 | 
				
			||||||
op 0x200007a: RemoveItem
 | 
					op 0x200007a: RemoveItem
 | 
				
			||||||
op 0x200007b: RemoveItem, explicit reference
 | 
					op 0x200007b: RemoveItem, explicit reference
 | 
				
			||||||
opcodes 0x200007c-0x3ffffff unused
 | 
					op 0x200007c: GetAiPackageDone
 | 
				
			||||||
 | 
					op 0x200007d: GetAiPackageDone, explicit reference
 | 
				
			||||||
 | 
					opcodes 0x200007e-0x3ffffff unused
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,6 +11,7 @@
 | 
				
			||||||
#include "skyextensions.hpp"
 | 
					#include "skyextensions.hpp"
 | 
				
			||||||
#include "statsextensions.hpp"
 | 
					#include "statsextensions.hpp"
 | 
				
			||||||
#include "containerextensions.hpp"
 | 
					#include "containerextensions.hpp"
 | 
				
			||||||
 | 
					#include "aiextensions.hpp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace MWScript
 | 
					namespace MWScript
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -23,6 +24,7 @@ namespace MWScript
 | 
				
			||||||
        Sky::registerExtensions (extensions);
 | 
					        Sky::registerExtensions (extensions);
 | 
				
			||||||
        Stats::registerExtensions (extensions);
 | 
					        Stats::registerExtensions (extensions);
 | 
				
			||||||
        Container::registerExtensions (extensions);
 | 
					        Container::registerExtensions (extensions);
 | 
				
			||||||
 | 
					        Ai::registerExtensions (extensions);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    void installOpcodes (Interpreter::Interpreter& interpreter)
 | 
					    void installOpcodes (Interpreter::Interpreter& interpreter)
 | 
				
			||||||
| 
						 | 
					@ -35,5 +37,6 @@ namespace MWScript
 | 
				
			||||||
        Sky::installOpcodes (interpreter);
 | 
					        Sky::installOpcodes (interpreter);
 | 
				
			||||||
        Stats::installOpcodes (interpreter);
 | 
					        Stats::installOpcodes (interpreter);
 | 
				
			||||||
        Container::installOpcodes (interpreter);
 | 
					        Container::installOpcodes (interpreter);
 | 
				
			||||||
 | 
					        Ai::installOpcodes (interpreter);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue