*暂未完成,因为无尽BUG滚滚来。
好长时间没写完,一是能力不够,二是我还得给老板写WEB的代码。可是我不会WEB!js和PHP简直就是世界上最好的语言,因为它们能够让人更快地进入极乐世界。
让我写一个gm后台,他说好不好看无所谓,能用就行。于是,我就写了一个根据JSON数据自动生成页面的代码……哈哈,平均15分钟完成一个功能,简直不要太爽。懒人自然有懒办法。当然,之前写工具花费了大量时间。
回家还要玩激战2刷每日,还挺忙的……
好吧,我已经没有力气给自己吐槽了。。。所以,直接上代码吧,不废话了。
以下代码为C++代码。
简直通俗易懂。
接下来(预计实现):
1.结构改造:在代码中定义一个对象的属性关联以及拥有属性是不太方便的,应该将这种关系和数据放置于配置表中。甚至是接下来的事件类和故事(story)类也应当如此。
1.1 首先,需要定义基本动作,
1.2 定义动作指令
1.3 需要一个虚拟机,基于栈的或者是基于寄存器的。还是栈虚拟机实现更简单一点,尽管效率稍差。
1.3.1 图形界面或者脚本程序。前者对于设计师来说更加友好。
1.4 协议。应当将虚拟机生成的字节码翻译成数据发送给主程序处理。
1.5 存储。生成的字节码应该被存储在配置表或者数据库中。
1.6 处理。主程序应该有足够通用、健壮和效率的算法来处理这个字节码。
看来这是一个大工程。
2.集中测试(2018.11.1 19:25)
LunaObject.h
1 #pragma once 2 3 #include "stdinc.h" 4 #include "Location.h" 5 #include "QualitiesManager.h" 6 #include "QualInc.h" 7 8 namespace Lunacia 9 { 10 class ObjectInfo final 11 { 12 private: 13 //info name: value pointer 14 std::unordered_map<std::string, void*> _infos; 15 std::unordered_map<std::string, std::function<void(const std::string&)>> _destory; 16 17 public: 18 ObjectInfo(); 19 ObjectInfo(std::unordered_map<std::string, void*>& infos); 20 ~ObjectInfo(); 21 22 public: 23 template<typename T> 24 T& Get(const std::string& name) 25 { 26 if (!IsExist(name)) 27 { 28 ErrorThrow("The data is not exist what name is " + name); 29 } 30 31 return *(static_cast<T*>(_infos.find(name)->second)); 32 } 33 34 template<typename T> 35 void Set(const std::string& name, T& val) 36 { 37 auto itFound = _infos.find(name); 38 void* pFound = nullptr; 39 if (itFound == _infos.end()) 40 { 41 Add(name, val); 42 return; 43 } 44 45 pFound = itFound->second; 46 T* pVal = static_cast<T*>(pFound); 47 *pVal = val; 48 } 49 50 template<typename T> 51 void Replace(const std::string& name, const T& value) 52 { 53 Delete<T>(name); 54 Add(name, value); 55 } 56 57 template<typename T> 58 bool Add(const std::string& name, const T& value) 59 { 60 T* pValue = new T(); 61 *pValue = value; 62 63 std::function<void(const std::string&)> destoryFunc = [this](const std::string& n)->void 64 { 65 this->Delete<T>(n); 66 }; 67 68 _destory.insert(std::make_pair(name, destoryFunc)); 69 return _infos.insert(std::make_pair(name, static_cast<void*>(pValue))).second; 70 } 71 72 template<typename T> 73 bool Delete(const std::string& name) 74 { 75 auto itFound = _infos.find(name); 76 if (itFound == _infos.end()) 77 { 78 return false; 79 } 80 void* pVal = itFound->second; 81 82 T* pDel = static_cast<T*>(pVal); 83 delete pDel; 84 pVal = nullptr; 85 86 _destory.erase(name); 87 return _infos.erase(name) == 1; 88 } 89 90 bool IsExist(const std::string& name) const; 91 }; 92 93 //LunaObject// 94 class LunaObject 95 { 96 public: 97 LunaObject(); 98 virtual ~LunaObject(); 99 100 public: 101 virtual void QualitiesCorrelation() = 0; 102 103 public: 104 virtual ObjectInfo& Info(); 105 virtual void