Nico Bendlin, которого все мы знаем как NicoDE, опубликовал 1 октября все свои наработки за прошедший год с дня релиза Risen .
Тема на форуме модификаций (англ) - [release] RisenSDK.
Чтобы обяснить что это такое, пожалуйста, прочтите полный текст описания который идет ниже :
____________________Code:От коммюнити, не полный Software Development Kit для Risen Version 1.0.96124.0 (Patch 1.10) 1. Лицензия ~~~~~~~~~~ В общем, RisenSDK распостраняется под лицензией - Creative Commons BY-NC-SA 3.0 (за более детальной информацией, посетите - http://creativecommons.org/licenses/by-nc-sa/3.0/). Все остальные имена, которые использовались в SDK пренадлежат их владельцам. RisenSDK - это полностью независимый проект и если не считать самой игры - не имеет никакого отношения к разработчикам Piranha Bytes или издателю Deep Silver. Пожалуйста, не обращайтесь к ним за помощю или поддержкой по данному SDK. Они не сделали никакого вклада (не сделали ничего) чтобы он появился. 2. Предисловие ~~~~~~~~~~ Игрок: Как мне попасть в замок? Охранник: Тебе нельзя. Только люди Гомеза могут туда попасть. Игрок: Хорошо. Этот SDK предназначен только для разработчиков ПО с большим опытом в C++ и обратной разработке/реинжинирингу (reverse engineering) (Microsoft Visual C++ бинарные программы в частности). Без этого опыта, рано или поздно вы скорее всего потеряетесь в коде. Идея этого проекта лежит в использовании экспортированых класов, функций и данных библиотек движка Genome, чтобы улучшить Risen и сделать возможным создание своих программ или плагинов. Из-за нескольких причин (распределение памяти и т.п.) мы привязаны к использованию такого-же компилятора, который использовали Piranha Bytes при создании Risen (Visual C++ 2005 SP1). К счастью, бесплатный Visual C++ 2005 Express Edition ISO-образ еще можно скачать с сайта Microsoft (ищите в google - "0434C5AF-8FB5-4D64-B8D8-E9BDF3C83152"). Также необходимый - "Windows Server 2003 R2 Platform SDK" (заменен на Windows SDK, но в новых SDK не включены ATL/MFC заголовки) можно добавить к среде разработки бесплатно. Чтобы корректно обрабатывать экспортированые данные и функции, мне пришлось разработать утилиту для создания импортируемых библиотек, которые можно найти в папке "\lib" каталога SDK. Эта программа не является частью данного проекта (но я думаю что это не будет проблемой, она работает и никаких изменений пока не предвидится). Для вашего собственного исследования кода, вы можете попробовать сами убрать защитную Solidshield-обгортку файлов программы (bin/Risen.exe) и защищенных библиотек (bin/Engine.dll, bin/Game.dll и bin/scripts/Script_Game.dll) чтобы иметь возможность анализировать статический (непосредственно) код. Не будем тратить время, файлы со снятой защитой не будут опубликованы из-за понятных причин. 3. Загрузка ~~~~~~~~~~ Игрок: Мне нужно попасть в замок! У меня есть письмо для высшего мага огня. Охранник: И ты ожидаешь что я тебя пропущу в замок чтобы ты отдал послание и забрал свою награду? Игрок: Конечно. Найти SDK можно в репозитарии SVN (Subversion repository) по адресу svn://nicode.net/risensdk/trunk/ (структура файлов такая-же как и в папке Risen после установки). Чтобы иметь возможность редактировать исходники (права на запись), вам нужен логин и пароль (если кто захочет такой доступ - отправтье мне запрос на email). Чтобы просто просмотреть репозитарий SVN (в этом случае - RisenSDK), вы можете использовать обычный интернет браузер, для этого перейдите по следующей ссылке : http://svn.nicode.net/risensdk/trunk/ 4. Игра ~~~~~~~~~~ Ксардас: КТО СМЕЕТ БЕСПОКОИТЬ МЕНЯ В МОИХ ИССЛЕДОВАНИЯХ? Игрок: Меня зовут... Ксардас: Я не желаю знать твоего имени. Это не имеет никакого значения. Важно то, что ты первый кто за долгие годы смог разгадать тайну моих Големов. Как вы уже заметили, RisenSDK находится еще на очень раннем этапе. Экспорт библиотеки - SharedBase.dll завершен, но исходный код еще полон ошибок и заданий на будущее (еще много надо доделать). Ожидаемым есть нахождение многих проблем и багов в шаблоне классов (разработан очень приблизительно, коечто надо переписать) и почти все параметры идут без имен. Причина очень проста - нехватает времени. Большинство кода было написано за две недели. Библиотека - SharedBase.dll была наиболее легкой частью. Понадобится куда больше времени чтобы добавить поддержку "foundation" (FF) и "framework" (FX) модулей. Виртуальное наследование является хорошей особенностью для интерфейсов, которые должны изменяться за жизненный цикл продукта. Но это далеко не весело анализировать специальный код (thunks) и методы доступа к памяти, с отрицательными смещениями (negative offsets). Чтобы ваш новый код подгрузился в движок игры, вам нужно создать "скриптовую" библиотеку, со следующем названием - /bin/scripts/Script_*.dll - посмотрите пример такого проекта в SDK - /source/Scripts/Script_Library (добавление новой консольной команды). 5. Окончание ~~~~~~~~~~ Шакал: Эй, смотри кого пытаешся обмануть! Возвращайся когда будет руда! Этот проект пока относительно слишком маленький и появился слишком поздно чтобы быть действительно полезным для Risen. Но если Piranha Bytes будут использовать части того-же движка Genome для следующего проекта, это значительно ускорит процесс разработки программ, утилит и плагинов от комюнити для Risen 2. Длинная история..., ну и Спасибо за Всю Рыбу ! Nico Bendlin <nicode@gmx.net>
@NicoDE - Thanks you very much for all what you are doing for supporting modding community
__
У нас сейчас существует несколько тем для обсуждения вопросов моддинга, но я думаю что все что связано с SDK - давайте оставлять/обсуждать именно в этой, отдельной теме .
Ergebnis 1 bis 20 von 36
-
#Stand With Ukraine
-
Это очень и очень авесомно!
Значит, пусть даже сейчас SDK и сырой, но всё таки есть шанс делать глобальные моды для Risen!
NicoDE, просто нет слов...
Трудился, не жалея клавы О_О.
Спасибо тебе!
-
Спасибо, Нико и поздравляю с релизом
Уже немного посмотрел исходники и появилось несколько вопросов:
1. По назначению импортируемых классов. Пытался понять назначение по набору предоставляемых методов.
Итак:
eCScriptProxy - класс менеджера для управления скриптами
gCScriptProxyAIFunction - класс менеджера для управления AI-скриптами
gCScriptProcessingUnit - класс функций для обработки кода скриптов.
Насколько верны мои предположения?
Еще бы несколько слов о принятой нотации в коде. То есть пояснения для некоторых префиксов. Читать код полегче бы было
2. Структура eSDocArchiveConfig служит для задания абсолютный путь до бинарного файла, названия бинарного файла, расширения бинарного файла и для задания пути для экспорта данных из бинарного файла.
Насколько верны эти мои предположения?
3. Вроде нашел фрагмент кода чтение бинарного файла и экспорта данных.
Spoiler:(zum lesen bitte Text markieren)Code://получаем файл бинарника по имени: путь_до_бинарного_файла + имя_бинарного_файла + расширение_бинарного_файла eCArchiveFile ArchiveFile = eCArchiveManager::GetInstance().GetFile( Config.m_strBinaryPath + Config.m_strBinaryName + Config.m_strBinaryExt ); if( ArchiveFile.Open( eCArchiveFile::bEArchiveFileAccessMode_Read, GETrue ) ) { GEU32 u32Token = 0; GEU8 u8Version = 0; GEU32 u32Count = 0; ArchiveFile >> u32Token; ArchiveFile >> u8Version; ArchiveFile >> u32Count; if( (0x31303056 == u32Token) && (0x01 == u8Version) && (arrDocuments.GetCount() == static_cast< GEInt >( u32Count )) ) { for( bTRefPropertyArray< eCDocObject * >::bCConstIterator pDocument = arrDocuments.Begin(); pDocument != arrDocuments.End(); ++pDocument ) { SFFFileTime FileTime; bCString strFileName; ArchiveFile >> FileTime.m_FileTime.dwHighDateTime; ArchiveFile >> FileTime.m_FileTime.dwLowDateTime; ArchiveFile >> strFileName; { bCString strRawFilePath = (*pDocument)->GetRawFilePath(); if( eCVirtualFileSystem::GetInstance().MakeAbsPhysicalPath(strRawFilePath ) && !strRawFilePath.IsEmpty() ) { FFLPVoid hFile = g_FFCreateFile( strRawFilePath, EFFFileCreate_OpenExisting, EFFFileAccess_Write, 0, 0, 0 ); if( g_FFIsValidFileHandle( hFile ) ) { g_FFSetFileTime( hFile, &FileTime, &FileTime, &FileTime ); g_FFCloseFile( hFile ); } } } } } }
Это весь код для чтения бинарного файла и экспорта данных?
4. Не понял, где именно регистрируется новая функция, чтобы в консоли появилась новая команда...
Я так понимаю новая функция добавляется вот этой строчкой:
Spoiler:(zum lesen bitte Text markieren)Code:s_ScriptFunctions.m_arrScripts.Add( gSScript( "CON_library", __FILE__, CON_library ) );
Geändert von Digan (02.10.2010 um 21:26 Uhr)
-
The purpose of a "proxy" is to resolve and/or encapsulate functionality, and sometimes to resolve (circular) references.
In this case Proxy classes resolve a name (string) to a script function and vis versa (e.g. to store script references in persistent data (content and savegame)).
The gCScriptProcessingUnit (short SPU) is something like the "script context" that is passed to the script functions (includes "self", "other", and many other script states, times, references, ...).
From my memory:
(<Prefix>|<Module>)<Type><Identifier>
Prefix: a_ = argument (parameter), m_ = member, ms_ = static member
Module: a = application, b = (shared)base, e = engine, g = game, i = importer | GE = Genome, FF = foundation, FX = framework, ...
Type: C = class, E = enumeration, S = structure, T = template | b = bool, i = int, pc = char pointer, str = bCString, u32 = unsigned long, ...
Yes, eSDocArchiveConfig is just a structure to configure/initialize an eCDocArchive class object.
This is just a workaround for a missing feature of eCDocArchive.ExportRaw(). The timestamps are not set by the engine code. But this results in rebuilding the bin (even if the content is identical, because the timestamps are checked). So I was forced to implement this feature - (like the eCDocArchive) I open the file with the help of the eCArchiveFile class, read the signature and the array with names and timestamps, and use them to fix the timestamps.
See this older documentation for file format details:
[spec][genomfle] Risen Archive file format
eCDocArchive::CHeader persistance
Yes and no. It just (manually) reads the bTObjArray<eCDocArchive::CHeader>. I could have implemented both streaming operators.
I mentioned the script library interface a while ago here: http://forum.worldofplayers.de/forum...3#post11426573
Console commands are "registered" with a naming convention CON_<command>. That is all you have to do (well, you should also write some code )."Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- ConnorGeändert von NicoDE (03.10.2010 um 21:16 Uhr)
-
Перевод ответа Нико:
Цель "прокси" состоит в том, чтобы разрешить и/или скрыть реализацию функциональности, и иногда разрешать ссылки.
В этом случае Прокси-классы разрешают имя (строку) к функции скрипта и наоборот (например, чтобы сохранить ссылки скрипта в персистентных данных (таких как контент и сохранения игр)). gCScriptProcessingUnit (сокращенно SPU) является чем-то вроде "контекста скрипта", который передается к функциям скрипта (включая "сам", "другой", и много других состояний скрипта, время, ссылки...).Насколько помню:
(<Префикс>|<Модуль>)<Тип><Идентификатор>
Префикс: a_ = аргумент (параметр), m_ = элемент, ms_ = статический элемент
Модуль: a = приложение, b = (общая)база, e = движок, g = игра, i = средство импорта | GE = Геном, FF = основа, FX = платформа, ...
Тип: C = класс, E = перечисление, S = структура, T = шаблон | b = логический тип данных, i = целый тип данных, pc = указатель на символьный тип данных, str = тип bCString, u32 = тип unsigned long, ...Да, eSDocArchiveConfig - только структура, чтобы конфигурировать/инициализировать объект класса eCDocArchive .Это - только обходное решение для недостающей возможности eCDocArchive. ExportRaw (). Метки времени не установлены кодом движка. Но это приводит к перестроению бинарных файлов (даже если контент идентичен, потому что метки времени проверены). Таким образом, я был вынужден реализовать эту возможность - (как eCDocArchive) я открываю файл с помощью класса eCArchiveFile, читаю подпись и массив с именами и метками времени, и использую их, чтобы фиксировать метки времени. Смотрите более старую документацию для подробностей о формате файла:
[spec][genomfle] Формат архивного файла Risen
eCDocArchive::CHeader persistanceДа и нет. Это только (вручную) читает bTObjArray <eCDocArchive:: CHeader>. Я, возможно, реализовал оба потоковых оператора.Я упоминал интерфейс библиотеки скриптов только что здесь: http://forum.worldofplayers.de/forum...3#post11426573
Консольные команды "регистрируются" согласно имени CON_<имя_команды>. Это - все, что Вы должны сделать (хорошо если напишите еще какой-нибудь код ).Geändert von Digan (25.10.2010 um 15:29 Uhr)
-
Hi, Nico
Almost all of the functions of Script_Game.dll have a parameter - a reference to gCScriptProcessingUnit.
This is similar to using Lua, where each function has a parameter - a reference to lua_State.
Can please you tell me - in which files there is Risen(game) -scripts?
Where remaining functions are called? (Except CON_* functions which are called from the console)
Script_Game.dll contains functions used by the game scripts?
For example lua link to library and uses its functions so:
Code:package.cpath = './MyScripts.dll' require 'MyScriptFunctions' MyScriptFunctions.run()
Geändert von Digan (24.10.2010 um 13:39 Uhr)
-
Due to very limited spare time, I did not any research for the "scripting" interface/logic. Therefore I cannot answer your questions, sorry.
There are several points in the game where script functions are called...
One of them are the quests. Searching for QuestScript="[^"] in all data\raw\quests\*.xqst you will find 56 non-empty SucceededQuestScript properties. E.g. in Alvaro_Cellar.xqst the script function OnQuestSuccess_ChangeRoutineAlvaro is referenced. The function gets the entity named "Alvaro", sets the routine "Nightwatch", and calls FullStop + ContinueRoutine.
Another source are the infos. Searching for Script" in all data\raw\infos\*.xinf you will find many gCInfoCommandAddInfoSystemEndScript, gCInfoCommandRunAIScript, gCInfoCommandRunScript, and gCInfoConditionScript entries."Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
-
Перевод:
Из-за очень ограниченного свободного времени, я не сделал никакого исследования интерфейса/логики "скриптов". Поэтому я не могу ответить на Ваши вопросы, извините.
Есть несколько точек в игре, где вызываются функции скриптов...
Одна из таких точек - квесты. Поискав строчки QuestScript = "[^"] во всех файлах data\raw\quests\*.xqst Вы найдете 56 непустых свойств SucceededQuestScript. Например, в файле Alvaro_Cellar.xqst это свойство имеет значение имени скриптовой функции OnQuestSuccess_ChangeRoutineAlvaro. Функция получает объект, который называется "Alvaro", устанавливает действие "Nightwatch", и вызывает функции FullStop + ContinueRoutine.
Другой источник - infos. Поискав строчки Script" во всех файлах data\raw\infos\*.xinf Вы найдете множество записей gCInfoCommandAddInfoSystemEndScript, gCInfoCommandRunAIScript, gCInfoCommandRunScript, and gCInfoConditionScript
Thanks, Nico
I have found some properties in xqst files.
For example in Alvaro_Cellar.xqst:
Code:CancelledQuestScript="" FailedQuestScript="" LostQuestScript="" ObsoleteQuestScript="" RunningQuestScript="" SucceededQuestScript="OnQuestSuccess_ChangeRoutineAlvaro"
Function OnQuestSuccess_ChangeRoutineAlvaro in Script_Game.dll looks so:
Code:OnQuestSuccess_ChangeRoutineAlvaro(gCScriptProcessingUnit *,void *,void *,int)
Geändert von Digan (26.10.2010 um 14:12 Uhr)
-
Yes, it will work.
Make sure you add it in the right (last) list.
I dumped the list of all Script_Game functions/callbacks and attached it to this posting:
http://forum.worldofplayers.de/forum...php?p=13509836"Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
-
Перевод:
Да, это будет работать.
Убедитесь, что вы добавляете это в правый (последний) список.
Я вывел список всех Script_Game функций/функций обратного вызова и присоединил к этому посту:
http://forum.worldofplayers.de/forum...php?p=13509836
Code:SelectWeapon (c:\Project\platform\pc\source\Scripts\Script_Game\Script\Ai\AI_Tasks\Reaction_Tasks\ZS_Attack.cpp)
I thought for scripts the high-level language was used more...
-
Yes, you got it right. There is no interpreted/intermediate scripting language. It’s native x86 assembly generated from C++ code. It is very likely that the "scripters" use macros and/or templates to write the "script" functions. That is the reason why the bin\Script.dll exists - it wraps the access to the engine/game classes in simple functions/classes.
"Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
-
I want to try to add a new item. Item is a copy of an existing Item (uses lrenter), but with a different content. How to generate a new GUID?
And how to use own tple file with this item?
Probably the name of a item (except lrent) needs to be added somewhere still...Geändert von Digan (30.10.2010 um 20:36 Uhr)
-
bCGuid::Generate() uses g_CoCreateGuid() and this one calls CoCreateGuid().
In short, it is random.
I cannot answer rest of the questions, because I do not care about the file format and game data logic (yet). My approach is very generic and it will take time to achieve practicable methods.
You should ask Shak-otay and/or Baltram. Their work is more practical."Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
-
There was still a question on project settings in Visual Studio.
Project Scripts_Library is building without problems.
In the same solution has added the new project and has adjusted properties as Scripts_Library.
Code:Output Directory: ..\..\..\bin\scripts Intermediate Directory: ..\..\..\build\$(ConfigurationName)\$(ProjectName) Configuration Type: Dinamic Library(.dll) Character Set: Use Multi-Byte Character Set Additional Include Directory: ..\..\ Preprocessor Definitions: WIN32;NDEBUG;_CONSOLE Calling Convention: __stdcall (/Gz) Ignore Import Library: Yes Additional Dependencies: kernel32.lib $(NoInherit) Generate Manifest: No
Compile: without problems.
Building:
Problem in ScriptInit() function.
Spoiler:(zum lesen bitte Text markieren)
extern "C" __declspec( dllexport )
gSScriptFunctions * GE_STDCALL ScriptInit( void )
{
#pragma warning( push )
#pragma warning( disable : 4640 ) // construction of local static object is not thread-safe
static gSScriptFunctions s_ScriptFunctions;
#pragma warning( pop )
s_ScriptFunctions.m_arrScriptAIStates.Clear();
s_ScriptFunctions.m_arrScriptAIFunction.Clear();
s_ScriptFunctions.m_arrScriptAICallbacks.Clear();
s_ScriptFunctions.m_arrScripts.Clear();
s_ScriptFunctions.m_arrScripts.Add( gSScript( "printMessage", __FILE__, printMessage ) );
return &s_ScriptFunctions;
}
So:
bCMemoryAdmin::Realloc()
bCMemoryAdmin:: GetInstance()
bCMemoryAdmin::Free()
bCString::~bCString()
bCString::bCString()
bTArrayBase<struct gSScript>::New()
But it is in SharedBase, which is in the solution...Geändert von Digan (08.11.2010 um 12:51 Uhr)
-
I assume you forgot to edit the Project Dependencies...
(else the SharedBase project and the included import library is not linked into your new project)
You could manually link the resulting SharedBase object/library into your project. But specifying the project dependencies also manages the build order."Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- ConnorGeändert von NicoDE (31.10.2010 um 15:51 Uhr)
-
-
Make sure all Root/NoXxx are set to false in the bin\mountlist_packed.ini.
Test:- add bin\mountlist_packed.ini and enable physical files
- install bin\scripts\Script_Library.dll
- create output directory for raw quests: data\raw\quests
- start Risen, enable devmode, open console, execute library export quests
- close Risen
- create output directory for compiled quests: data\compiled\library
- edit data\raw\quests\Player_LookForSurvivers.xqst and change ExperiencePoints to 50
- start Risen... the game will automatically detect the modification and will compile the quests into data\compiled\library\compiled_quests.bin
Make sure you do not have other modified files in any other mounted directory (e.g. %LocalAppData%\Risen)."Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- Connor
-
Thanks
I wrote some simple functions.
---
And tried to call them Neil_FindSword.xqst.
Spoiler:(zum lesen bitte Text markieren)Code:<Document ActivationTime_Day="0" ActivationTime_Hour="0" ActivationTime_Year="0" CancelledQuestScript="CancelledQuest" ClassName="gCQuest" DestinationEntity="Object_Interact_Animated_Chest_Poor_Neil" EndChapter="-1" ExperiencePoints="50" FailedQuestScript="FailedQuest" GuideWalkMode="gEWalkMode_Run" LocationInfo="gEInfoLocation_Main" LogTopic="QUEST_HOGEX2_2008-10-07_14-06-35_00" LostQuestScript="LostQuest" ObsoleteQuestScript="ObsoleteQuest" OverlayClient="map_overlay_client_default" RunningQuestScript="RunningQuest" RunningTimeDays="0" RunningTimeHours="0" RunningTimeYears="0" Silent="False" StartChapter="-1" Status="gEQuestStatus_Open" SucceededQuestScript="SucceededQuest" Type="gEQuestType_Plunder" WonQuestScript="WonQuest" OverlayTarget="map_overlay_target_default" > <FinishedQuests> </FinishedQuests> <LogText> </LogText> <ModifySkillsSuccess> </ModifySkillsSuccess> <DeliveryEntities> <Item> <Value Entity="It_1H_Sword" Amount="1" > </Value> </Item> </DeliveryEntities> <Actors> <Item> <Value Actor="Neil" ClassName="gCQuestActor" ActorType="gEQuestActor_Client" > </Value> </Item> <Item> <Value Actor="Object_Interact_Animated_Chest_Poor_Neil" ClassName="gCQuestActor" ActorType="gEQuestActor_Target" > </Value> </Item> </Actors> </Document>
It is still very simple, but it worksGeändert von Digan (07.11.2010 um 17:15 Uhr)
-
"Unter diesen schwierigen Umständen bin ich mir sicher, daß diese guten Menschen meinen augenblicklichen Bedarf an deren Gold verstehen werden." -- ConnorGeändert von NicoDE (04.11.2010 um 10:47 Uhr)
-
I wrapped several classes of script.dll.
For classes:
Spoiler:(zum lesen bitte Text markieren)
Achievement
Effect
EffectSystem
Entity
Focus
GUI2
InfComAttack
InfComHeal
InfComInfoWait
InfComPickPocket
InfComRunAIScript
InfComSay
InfComSayConfirm
InfComSayHoldingPosition
InfComSayKeepItUp
InfComSaySVM
InfComSaySound
InfComSetSectorStatus
InfComSleep
InfComThink
InfComUse
InfoSystem
Input
Music
ScriptActionTimer
ScriptCommentManager
ScriptDestinationCollector
Template
Tutorial
World
Also for several classes of Engine.dll
Spoiler:(zum lesen bitte Text markieren)
eCApplication
eCEntity
eCGeometryEntity
eCTemplateEntityProxy
And for several classes Game.dll
Spoiler:(zum lesen bitte Text markieren)
gCSession
http://upload.worldofplayers.de/files5/Script_.rar
Maybe will be useful
Remained PS classes.
Strange. PS classes not have a constructors / destructor ...
Also I tried to write a common part of all scripts.
Pseudocode from IDA:
Spoiler:(zum lesen bitte Text markieren)
Code:Entity__Entity(&v18); v4 = a_pSPU; if ( a_pSelfEntity ) { Entity__operator_(&v18, a_pSelfEntity); } else { v5 = gCScriptProcessingUnit__GetSelfEntity(a_pSPU); Entity__AttachTo(&v18, v5); } Entity__Entity(&v17); if ( a_pOtherEntity ) { Entity__operator_(&v17, a_pOtherEntity); } else { v6 = gCScriptProcessingUnit__GetOtherEntity(v4); Entity__AttachTo(&v17, v6); }
I tried this to rewrite on in C++:
Spoiler:(zum lesen bitte Text markieren)
Code:Entity* selfEntity = new Entity(); if(a_pSelfEntity) { selfEntity = (Entity *)a_pSelfEntity; } else { selfEntity->AttachTo(SPU->GetSelfEntity()); fprintf(selfEntityFile,"selfEntity: %s",selfEntity->GetName()); } Entity* otherEntity = new Entity(); if(a_pOtherEntity) { otherEntity = (Entity *)a_pOtherEntity; } else { otherEntity->AttachTo(SPU->GetOtherEntity()); fprintf(otherEntityFile,"otherEntity: %s",otherEntity->GetName()); }
After a text files contains:
selfEntity: <invalid>
otherEntity: <invalid>
Also I wrote own script function.
Code:GEInt GE_STDCALL SucceededQuest( gCScriptProcessingUnit * a_pSPU, GELPVoid a_pSelfEntity, GELPVoid a_pOtherEntity, GEInt a_iArgs ) { GUI2* gui = new GUI2(); gui->PlayVideo("Outro.bik",true); return 1; }
GUI2 it class from Script.dll.Geändert von Digan (07.11.2010 um 21:48 Uhr)