Also, its normal that when I play a map with small terrain areas, that there's still a little portion of terrain that didn't was on the map file?
No. Its not normal.
ЦитатаFuzzX ()
I'm actually looking for add maps without replacing on WUM, and with custom textures since I don't know how to.
With custom textures will hard... need write something like on NTX in W3D for this.... Here game not use Temp folder and all data in Bundl###.xom
So for add your map you need: 1. Add your new map to list Data\Tweak\SCRIPTS.XOM 2. Create Databank for map - example Data\MULTI_JOUSTABOUTIT.XOM 3. Add Map files: Data\Maps\my_map.hmp Data\Maps\my_map.txt Data\Maps\my_map.xan 4. Change CRC code for Scripts.xom in WormsMayhem.exe
When you add maps to Scripts.xom you need use option Insert Cntr for xomview. 1. you select any w3d map in list and press Export Cntr 2. you change names in this new Xom to your map 3. you insert your map Cntr to Scripts.xom
I attached files of this test, try change in exe crc for scripts.xom how writed in crc.txt
Код
Original SCRIPTS.XOM DE100F13 - 13 0F 10 DE New SCRIPTS.XOM 35592E89 - 89 2E 59 35
If should work.
Maybe this files help you understand how it work. If no, I will try make tutorial...
Модинг игры был запрещен Team17, для этого они специально создали проверку CRC кодов. Можно конечно заменять эти коды, при каждой правке, но зачем? =)
Итак тут я постараюсь показать как я ломал игру:
Для начала я открыл игру в IDA, нашел место где находятся CRC коды, это была таблица dword_95250C, я ее назвал crc_codes_table.
Перешел на функцию которая ее использует и изучил ее, обзывая все переменные, в итоге я получил следующий вид:
Как видно, человеку знающему логику c++, тут идет проверка кодов. Нам нужно ее убрать.
Для этого открываем схематичный вид дизассемблера:
На схеме после проверки идет две стрелки, запоминаем адрес второй стрелки и открываем программу в OllyDbg (для изменения ассемблерных кодов). Меняем условный переход jnz прямой переход JMP на адрес 063561A. В hex коде это будет 75 4D на EB 00.
Открываем Hex Редактор HxD. Переходим по адресу 00234A18
Меняем значения с 75 4D на EB 00. Сохраняем Exe файл.
В итоге получаем код, без функции проверки!!!
Как мы видим все что нужно это изменить код 75 4D на EB 00 находящийся по адресу 00234A18. И больше нет головной боли по поводу замены CRC!!! Теперь можно править что угодно!!!
С этим можно все существующие здесь моды адаптировать под W:UM?
По поводу всех не знаю. Но адаптация - это ручной ввод из xml файлов в xom... плюс замена ресурсов игры так же ручная... Мало кто этим будет заниматься. Да и сказать честно WUM - отстой полный, я в него больше минуты играть не могу, там физика игры ужаснейшая, графика отстойнешняя...
Вормус, потенциал имеется, фин c войтеком уже делают DM 21, у меня в планах сделать миссию с Боссом, но когда я до этого доберусь... может в следующем году =)
We have big problem. T17 used structures what have Array [64] so you cant change this value!!!
here it initialise:
Код
buildpt = a1->BuildsPoints; numBuilds = 64; do { if ( *buildpt ) (*(**buildpt + 8))(*buildpt); *buildpt = 0; buildpt += 4; --numBuilds; } while ( numBuilds );
a1->BuildsPoints; this Array [64] of objects... and this structure have many values. So you cant change size of structure... for this need recompile all EXE!!!
Решил я поиграться с IDA скриптингом, и вот что у меня получилось. Мой скрипт для IDA достает инфу из EXE файла. Вот пример на типе ParticleEmitterContainer, с комментами вшитыми в класс.
Код
== Reading XConteiner Info === <ParticleEmitterContainer> ParticleEmitterContainer.Comment <XString> // Description of the emitter. PLEASE FILL THIS IN! ParticleEmitterContainer.EmitterType <XEnum> // ParticleTypeEnum /* enum kNormal kSnow kRain kTrail */ ParticleEmitterContainer.SpriteSet <XString> // Resource ID of the sprite used to render the perticle ParticleEmitterContainer.MeshAnimNodeName <XString> // Animation frame(s) for XOM mesh particles. Syntax '[loop:]<NodeName1> [+|,[loop:]<NodeName2]...]. To Loop animation start with 'Loop:'. To play animations simultaneously use '+'. To play animations in sequence use ','. Any number of animations can be played ParticleEmitterContainer.EmitterAcceleration <XVector3f> // Accelaration of the EMITTER ParticleEmitterContainer.EmitterAccelerationRandomise <XVector3f> // Accelaration of the EMITTER ParticleEmitterContainer.EmitterIsAttachedToLand <XBool> // If set then the emmiter will die if the land directly below it disappears ParticleEmitterContainer.EmitterIsOfInterest <XBool> // If set then the current turn will not end until the emitter dies ParticleEmitterContainer.EmitterIsLaunchedFromWeapon <XBool> // If set then the emitter will come the end of the weapon ParticleEmitterContainer.EmitterLifeTime <XUint> // Lifetime of the emitter (in ms) ParticleEmitterContainer.EmitterLifeTimeRandomise <XUint> // Lifetime of the emitter (in ms) ParticleEmitterContainer.EmitterMaxParticles <XUint> // Maximum number of particles visible ParticleEmitterContainer.EmitterNumCollide <XUint> // How many of MaxParticles will collide with the ground. VERY EXPENSIVE so keep low! ParticleEmitterContainer.EmitterNumSpawn <XUint> // Number of particles the emitter will spawn at once ParticleEmitterContainer.EmitterNumSpawnRadnomise <XUint> // Number of particles the emitter will spawn at once ParticleEmitterContainer.EmitterOriginOffset <XVector3f> // Position of the emitter (relative to the emitter's origin) ParticleEmitterContainer.EmitterOriginRandomise <XVector3f> // Position of the emitter (relative to the emitter's origin) ParticleEmitterContainer.EmitterParticleExpireFX <XString> // Particle emitter to spawn when EACH particle expires - EXPENSIVE! ParticleEmitterContainer.EmitterParticleFX <XString> // Particle emitter effect to attatch to EACH particle - EXPENSIVE! ParticleEmitterContainer.EmitterSameDirectionAsWorm <XBool> // If set then particles will be emitted in the direction the worm is facing ParticleEmitterContainer.EmitterSoundFX <XString> // Sound effect to play when the emitter is created ParticleEmitterContainer.EmitterSoundFXVolume <XFloat> // Volume of the Sound effect ParticleEmitterContainer.EmitterSpawnFreq <XUint> // How frequently the emitter will spawn particles (in ms) ParticleEmitterContainer.EmitterSpawnFreqRansomise <XUint> // How frequently the emitter will spawn particles (in ms) ParticleEmitterContainer.EmitterSpawnSizeVelocity <XVector2f> ParticleEmitterContainer.EmitterStartDelay <XUint> // Delay before the emitter starts emitting prarticles (in ms) ParticleEmitterContainer.EmitterVelocity <XVector3f> // Velocity of the EMITTER ParticleEmitterContainer.EmitterVelocityRandomise <XVector3f> // Velocity of the EMITTER ParticleEmitterContainer.ParticleAcceleration <XVector3f> // Acceleration of the particles. (Set Y to a negative value for gravity) ParticleEmitterContainer.ParticleAccelerationRandomise <XVector3f> // Acceleration of the particles. (Set Y to a negative value for gravity) ParticleEmitterContainer.ParticleAlpha <XFloat> // Initial alpha of the particle ( Between 0 & 1) ParticleEmitterContainer.ParticleAlphaFadeIn <XUint> // Time until the alpha value reaches the value set in the ParticleAlpha files (i.e length of fade in ) ParticleEmitterContainer.ParticleAlphaVelocity <XFloat> // How the alpha changes over time. Set to -1 to fade out over lifetime ParticleEmitterContainer.ParticleAlphaVelocityDelay <XUint> // Delay before alpha velocity is applied (in ms) ParticleEmitterContainer.ParticleAlternateAccelerationN <XFloat> ParticleEmitterContainer.ParticleAlternateAccelerationS <XFloat> ParticleEmitterContainer.ParticleAnimationFrame <XUint8> // Inital Animation frame of the particle ParticleEmitterContainer.ParticleAnimationFrameRandomise <XUint8> // Inital Animation frame of the particle ParticleEmitterContainer.ParticleAnimationSpeed <XUint> // Speed to animate (in ms) ParticleEmitterContainer.ParticleAnimationSpeedRandomize <XUint> // Speed to animate (in ms) ParticleEmitterContainer.ParticleAttractor <XVector3f> // Position (relative to the emitter origin) that the particles attract towards ParticleEmitterContainer.ParticleAttractorRandomise <XVector3f> // Position (relative to the emitter origin) that the particles attract towards ParticleEmitterContainer.ParticleAttractorIsActive <XBool> // Enable attract to point mode ParticleEmitterContainer.ParticleCanEnterWater <XBool> // If set to false then particles will expire when they hit the water ParticleEmitterContainer.ParticleCollisionFreq <XUint> // Which particles collide with the worms ie Every n particle will do collision detection ParticleEmitterContainer.ParticleCollisionImmuneTime <XUint> // Time (in MS) until the particle can re-collide with a worm. ParticleEmitterContainer.ParticleCollisionMinAlpha <XFloat> // If the alpha of the particles is below this value then don't collide with a worm ParticleEmitterContainer.ParticleCollisonRadius <XFloat> // Size of the collision sphere of the particle ParticleEmitterContainer.ParticleCollisonRadiusOffset <XVector3f> ParticleEmitterContainer.ParticleCollisonRadiusVelocity <XFloat> // How the collision sphere radius changes over time ParticleEmitterContainer.ParticleCollisionShowDebug <XBool> ParticleEmitterContainer.ParticleCollisionWormDamageMagnitude <XUint8> ParticleEmitterContainer.ParticleCollisionWormImpulseMagnitude <XFloat> ParticleEmitterContainer.ParticleCollisionWormImpulseYMagnitude <XFloat> ParticleEmitterContainer.ParticleCollisionWormPoisonMagnitude <XUint8> ParticleEmitterContainer.ParticleCollisionWormType <XEnum> // WormCollideEnum /* enum kWC_Standard kWC_Expire kWC_Lightside kWC_Darkside */ ParticleEmitterContainer.ParticleExpireShake <XBool> // Shake the camera when EACH particle dies ParticleEmitterContainer.ParticleExpireShakeLength <XUint> // Length of the camera shake when EACH particle dies (in MS) ParticleEmitterContainer.ParticleExpireShakeMagnitude <XFloat> // Strength of the camera shake when EACH particle dies ParticleEmitterContainer.ParticleIsAlternateAcceleration <XBool> // If set then particles will come out fast & then quickly slow down ParticleEmitterContainer.ParticleIsEffectedByWind <XBool> // If set then particles will be blown by the wind ParticleEmitterContainer.ParticleIsSpiral <XBool> // If set then particles will spiral upwards ParticleEmitterContainer.ParticleIsUnderWaterEffect <XBool> // If set then particles will die when the reach the water level (from under the water ParticleEmitterContainer.ParticleLandCollideType <XEnum> // LandCollideEnum /* enum kLC_None kLC_Bounce kLC_Expire kLC_StopMoving kLC_StopMovingAndAttach */ // What to do when the particle collides with the land (NumCollide must be set too) ParticleEmitterContainer.ParticleLife <XUint> // Lifetime of each particle (in ms) ParticleEmitterContainer.ParticleLifeRandomise <XUint> // Lifetime of each particle (in ms) ParticleEmitterContainer.ParticleMass <XFloat> // Mass of the particles ParticleEmitterContainer.ParticleNumColors <XByte> // The number of colours in the particle effect ParticleEmitterContainer.ParticleNumFrames <XByte> // Number of animation frames ParticleEmitterContainer.ParticleOrientation <XVector3f> // Rotation of the particle (in degrees) ParticleEmitterContainer.ParticleOrientationRandomise <XVector3f> // Rotation of the particle (in degrees) ParticleEmitterContainer.ParticleOrientationVelocity <XVector3f> // How the rotation changes over time ParticleEmitterContainer.ParticleOrientationVelocityRandomise <XVector3f> // How the rotation changes over time ParticleEmitterContainer.ParticleSize <XVector2f> // Size of the particles ParticleEmitterContainer.ParticleSizeOriginIsCenterPoint <XBool> // If set then the particle will be sizes around it's center point, rather than the bottom left corner ParticleEmitterContainer.ParticleSizeRandomise <XFloat> // Size of the particles ParticleEmitterContainer.ParticleSizeVelocity <XVector2f> // How the size changes over time ParticleEmitterContainer.ParticleSizeVelocityRandomise <XVector2f> // How the size changes over time ParticleEmitterContainer.ParticleSizeVelocityDelay <XUint> // Delay until the particle starts resizing ParticleEmitterContainer.ParticleSizeVelocityDelayRandomise <XUint> ParticleEmitterContainer.ParticleFinalSizeScale <XVector2f> // The size of the particle when it's finshed (dies). This value is a scale factor. eg set to (0.25,0.25) to make it shrink to a quater of it's original size when by the time it dies ParticleEmitterContainer.ParticleFinalSizeScaleRandomise <XFloat> ParticleEmitterContainer.ParticleSizeFadeIn <XUint> // Time taken (in MS) to fade the size of the particles from zero to their actual size ParticleEmitterContainer.ParticleSizeFadeInRandomize <XUint> ParticleEmitterContainer.ParticleSizeFadeInDelay <XUint> // Don't start fading in the size of the particles until this time ParticleEmitterContainer.ParticleSizeFadeInDelayRandomize <XUint> ParticleEmitterContainer.ParticleRenderScene <XEnum> // ParticleSceneEnum /* enum kPS_Default kPS_Scene1 kPS_Scene2 kPS_Scene3 kPS_Scene4 kPS_Scene5 */ // Order in which to render the particles. Scene1 will always be rendered before Scene2 and so on ParticleEmitterContainer.ParticleSpiralRadius <XFloat> // Radius of the spiral effect ParticleEmitterContainer.ParticleSpiralRadiusRandomise <XFloat> ParticleEmitterContainer.ParticleSpiralRadiusVelocity <XFloat> // How fast the particles move around the spiral radius ParticleEmitterContainer.ParticleSpiralRadiusVelocityRandomise <XFloat> ParticleEmitterContainer.ParticleSpiralRadiusSizeVelocity <XFloat> // How the spiral radius changes over time ParticleEmitterContainer.ParticleVelocity <XVector3f> // Velocity of the particles ParticleEmitterContainer.ParticleVelocityRandomise <XVector3f> ParticleEmitterContainer.ParticleVelocityIsNormalised <XBool> == Reading XConteiner end ===
P.S. Знаю где-то это на форуме уже было, но тут более детальное описание некоторых Enum типов.
После просьбы моего друга фина, известного под ником GX, убрать ошибку в игре на загрузку HD HUD'а при больших картах, я начал копать Worms3D.exe. И добрался до интересной информации в Worms3D.Exe . Все ограничения на память загружаемых ресурсов являются текстовыми константами!!! И если поменять эти значения игра расширяет область памяти автоматически!!!
По ошибке которая возникала при нехватки видеопамяти я вышел на MField.ArenaSize = 32000000. В среднем это 32 Мегабайта. Я изменил этот размер до 96мб и о чудо!!! Карта загрузилась без ошибок!
Так же сегодня Woitek ругался на ограничения в Lua, якобы нельзя писать более 128 функций. И после моего совета он увеличил XLua.ArenaSize = 999999 ScriptArena.ArenaSize = 999999
После чего игра стала воспринимать большее количество функций!!!
Опытным путем я установил так же что большие карты вылетают по ограничению LandArena.ArenaSize. Но когда я увеличивал память игра попросту зависала. поэтому это не выход. Ну что может выход будет найден в будущем. Но то что мы уже можем использовать HD текстуры в W3D не боясь за вылеты это факт!!!