Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.


Messages - Albeoris

Pages: [1] 2 3
1
Terrible character faces. Highly contrasting textures in the world. This gives me the same disgust as the remaster. But (!!!) apart from game design, a lot of work has been done. It seems to me that the author did the best that he could without ordering new graphics.

This is Squall:
https://i.imgur.com/IT9ukgK.png

Unfortunately, the mods feature a completely different character.

2
I have also previously just finished a project where I did the same with the PSX FMV's (https://youtu.be/RIAKC349ntU)

Sorry man but I don't like it.


But the screenshots you showed look pretty good.

3
DV, friends, if you notice any problem in the game engine (equipment is incorrectly displayed) or in the Memoria (music is not exported), do not hesitate to write about it:
https://github.com/Albeoris/Memoria/issues

In a few weeks, we fixed dozens of problems that I didn’t even know about (thanks to a detailed description from snouz).

If you already have a ready solution, share the pool requests:
https://github.com/Albeoris/Memoria/pulls

If you are not friends with Git, but found a solution and tested it through dnSpy, just describe it in the issue so that I can check it and quickly apply to the game.

4
EDIT: One last things. Albeoris also added a "Spell rate" feature: apart from the method "Perform" that you can find in the battle scripts, you sometimes have a method "RateTarget" that returns a Single (number) and is added when the class derivates from "IEstimateBattleScript". This method is meant to somehow measure the usefulness of an ability in a given situation. I am not sure if that feature is working (maybe it is used when the player turns Auto-battle on?) though, and you can ignore it if you don't care.

Code: [Select]
[Battle]
SelectBestTarget = 1 ; 0 - Original, 1 - Estimate the best target via IEstimateBattleScript

Hello! If you enable this option, the cursor will not point to the first goal in the list, but to the best one based on the total score.

For example, if two characters lack 1000 HP, and we select “Heal”, but one character has 20% HP and the other has 80% HP, then the cursor will point to a character with 20% HP, since he is the best target.

If you select "Golden Needle (Soft)" the battle with the gargoyle, then the cursor will point to it.

If you select "Eat", the cursor will be placed on a target whose skill has not yet been learned.

Also, in the latest version, you can replace Vivi's basic attack with basic spells. Which spell will be used is also determined by this rating. BUT (!) since I’m not sure that it’s a good idea to turn on automatic target selection for attacking skills, I excluded script No. 9 (Magic Attack) from the list used to select a target.

Code: [Select]
ViviAutoAttack = 0 ; 0 - Default attack, 1 - One of the basic spells (Fire, Blizzard, Thunder) cost-free MP
P.S. Thank you so much for adding support for CSV tables!

5
EDIT: now the Memoria patcher runs but the game won't launch.

Fixed. :3

6
If you'd like to discuss Memoria, the mods and stuff, we could talk through steam?
Sure. :)

7
Remaining problems: https://imgur.com/a/enhszeO (some are subtle)
I have not followed your work for a long time. You have a good progress! :)

Do you load these backs by importing from PSD to Memoria or using your own mechanism?

We fixed such problems. Black lines are corrected by padding. The width of the padding depends on the resolution of the texture (we tested on 8K textures, if I remember correctly).
At what the game not just doubling the extreme pixels, but uses a cunning borrowing of pixels from neighboring layers.

As far as I remember, we solved these problems, import from PSD should work correctly. But we checked only in Alexandria, perhaps. Other locations will have similar problems.

8
If I only install Moguri 7 there is pixelated font.
if I install Moguri 7 with Beta V2 font is standard-normal and pretty much cant change it, there is small spectrum like Comic Sans or whatever. Is it normal behaviour? First time playing.

Edit Memoria.ini and turn on/off Font.Enabled
Code: [Select]
[Font]
Enabled = 0
Names = "Arial", "Times Bold"

9
WIP / FF8: Concept of a new magic system
« on: 2020-01-07 15:16:32 »
Hey guys! :)

I am modifying the game engine. First of all, to translate the game into Russian. But I couldn't get past those aspects that I never liked in the game. One of them is magic. In the game you practically don't use magic, as this reduces your power. As a result, all battles take place on auto-attack. I want to return the magicians as a serious military unit.

Current plans:
  • Shared magic.
  • Magic is not wasted when using.
  • Its amount indicates the strength of the spell, the chance of effect.
  • No damage cap.
  • In battle, any spell can be casted N / 30 times (rounding down).
  • Mass spells - Ultima, Apocalypse, Meteor, cause damage to allies (Rinoa, Selphie, Edea have immunity).
  • From one monster, magic can only be drained once.
  • Draw points on the world map are disposable.

What do you think? I'm not sure that all this can be done before the release of OpenVIII (I'm changing the original Steam version), but so far everything seems pretty simple. If you have any tips, share your vision. There are also plans to revise the GF system, but about them another time.

10
General Discussion / Re: FFVIII Remastered
« on: 2019-09-08 14:59:51 »
I missed this. Blizzard lost the Starcraft souce code, but it was recovered shortly before/after the annoucement of Starcraft Remastered. It was literally in the news back in 2017.
They have debug symbols.

11
General Discussion / Re: FFVIII Remastered
« on: 2019-09-06 22:47:29 »
Hey Maki, look at this:
https://github.com/FFT-Hackers/FF7_OpenGL/blob/8df3a2f16d8269b4dca064b67235c1ac1760f2c0/src/ff8_opengl.c

Idk how far you have advanced in research. Perhaps these guys have decided more about rendering.

12
General Discussion / Re: FFVIII Remastered
« on: 2019-09-05 21:09:10 »
Albeoris- did you succeed on breaking any sub-routine with debugger? I tried IDA, IDA+scyllaHyde, OllyDgb and CE debugger- I'm getting 0x400000f1 (STATUS_WX86_BREAKPOINT) on all threads and the game is immidiately killed. Happens only for core game code
Nope, I saw the emulator and realized that this version was not interesting for me. :(
Only static analysis.

13
General Discussion / Re: FFVIII Remastered
« on: 2019-09-04 23:54:35 »
Awful version. It is not built for Windows, but is emulated. This is a closed WEEP emulator developed by SE to port games to consoles. It is terribly voracious and prevents the modification of the executable file (it is possible, but more difficult than with the original game).
The port contains the executable file of the original game, and hooks the rendering functions. Uses GL instead of DirectX.

15
As part of the OpenVIII project, I wrote a formatter for game scripts.

The idea of pseudo-code from Deling is taken as a basis.
Deling sample:
Spoiler: show
Code: [Select]
if 256_uword == 612 begin
ucoff()
rcanimekeep(5, 25, 1)
amesw(0, 42, 160, 8)
aask(0, 43, 0, 4, 0, 4, 160, 8)
animesync()
if temp_0 == 0 begin
rcanimekeep(5, 100, 72)
1027_ubyte = 0
squall.houkoku(5, EW)
animesync()
ranimekeep(4)
amesw(0, 45, 160, 8)
else if temp_0 == 1 begin
1027_ubyte = 1
squall.houkoku(5, EW)
animesync()
rcanimekeep(5, 72, 25)
amesw(0, 47, 160, 8)
animesync()
canimekeep(5, 100, 72)
ranimekeep(4)
amesw(0, 48, 160, 8)
1027_ubyte = 2
squall.houkoku(5, EW)
animesync()
rcanimekeep(6, 128, 1)
amesw(0, 50, 160, 8)
animesync()
rcanimekeep(6, 150, 128)
else if temp_0 == 2 begin
1027_ubyte = 3
squall.houkoku(5, EW)
animespeed(32)
rcanimekeep(7, 72, 24)
amesw(0, 53, 160, 8)
animesync()
animespeed(16)
rcanimekeep(5, 72, 20)
amesw(0, 54, 160, 8)
animesync()
canimekeep(5, 100, 72)
ranimekeep(4)
amesw(0, 55, 160, 8)
animesync()
rcanimekeep(6, 128, 1)
amesw(0, 56, 160, 8)
animesync()
canimekeep(6, 150, 128)
rcanimekeep(5, 72, 1)
amesw(0, 57, 160, 8)
animespeed(32)
animesync()
animespeed(16)
rcanimekeep(7, 50, 24)
amesw(0, 58, 160, 8)
animesync()
rcanimekeep(7, 100, 50)
else if temp_0 == 3 begin
1027_ubyte = 4
squall.houkoku(5, EW)
animesync()
canimekeep(5, 100, 72)
rcanimekeep(6, 20, 1)
amesw(0, 60, 160, 8)
animesync()
rcanimekeep(6, 105, 20)
amesw(0, 61, 160, 8)
animesync()
rcanimekeep(6, 128, 105)
amesw(0, 62, 160, 8)
animesync()
canimekeep(6, 150, 128)
rcanimekeep(5, 72, 1)
amesw(0, 64, 160, 8)
animespeed(32)
animesync()
animespeed(16)
rcanimekeep(7, 50, 24)
amesw(0, 65, 160, 8)
animesync()
animespeed(32)
canimekeep(7, 100, 50)
animespeed(16)
rcanimekeep(4, 80, 1)
amesw(0, 66, 160, 8)
animesync()
rcanimekeep(4, 105, 80)
else if temp_0 == 4 begin
1027_ubyte = 5
squall.houkoku(5, EW)
animesync()
rcanimekeep(5, 100, 72)
amesw(0, 68, 160, 8)
animesync()
ranimekeep(4)
amesw(0, 69, 160, 8)
else
end
ucon()
animesync()
end
ret(8)


My sample:
Spoiler: show
Code: [Select]
    public void Talk()
    {
        // ScriptId: 52
        if(((UInt16)G[256] == 612))
        {
            IGameplayService.IsUserControlEnabled = false; // UCOFF
            this.Animation.Play(animationId: 5, firstFrame: 1, lastFrame: 25); // RCANIMEKEEP

            // Headmaster Cid
            // “What shall we talk about?”
            await IMessageService.ShowDialog(channel: 0, messageId: 42, posX: 160, posY: 8); // AMESW

            //☞ (I want to make a report)
            //   (The real meaning of SeeD)
            //   (About Sorceress Edea)
            //   (About Master NORG)
            //☜ (About what to do next)
            await IMessageService.ShowDialog(channel: 0, messageId: 43, firstLine: 0, lastLine: 4, beginLine: 0, cancelLine: 4, posX: 160, posY: 8); // AASK
            await this.Animation.Wait(); // ANIMESYNC
            if((R0 == 0))
            {
                this.Animation.Play(animationId: 5, firstFrame: 72, lastFrame: 100); // RCANIMEKEEP
                G[1027] = (Byte)0;
                REQEW(priority: 5, GetObject<squall>().houkoku());
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 4); // RANIMEKEEP

                // Headmaster Cid
                // “No, no.
                //  It’s not necessary.”
                // “I can guess what must’ve
                //  happened.”
                await IMessageService.ShowDialog(channel: 0, messageId: 45, posX: 160, posY: 8); // AMESW
            }
            else if((R0 == 1))
            {
                G[1027] = (Byte)1;
                REQEW(priority: 5, GetObject<squall>().houkoku());
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 5, firstFrame: 25, lastFrame: 72); // RCANIMEKEEP

                // Headmaster Cid
                // “SeeD is SeeD.  The elite
                //  mercenary force of {Term Balamb} Garden.”
                await IMessageService.ShowDialog(channel: 0, messageId: 47, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                await this.Animation.Play(animationId: 5, firstFrame: 72, lastFrame: 100); // CANIMEKEEP
                this.Animation.Play(animationId: 4); // RANIMEKEEP

                // Headmaster Cid
                // “Hmmm, do you know
                //  something about SeeD?”
                await IMessageService.ShowDialog(channel: 0, messageId: 48, posX: 160, posY: 8); // AMESW
                G[1027] = (Byte)2;
                REQEW(priority: 5, GetObject<squall>().houkoku());
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 6, firstFrame: 1, lastFrame: 128); // RCANIMEKEEP

                // Headmaster Cid
                // “SeeD will defeat the sorceress.
                //  The Garden will train SeeD members.”
                // “The many missions around the world
                //  are only training for the final
                //  battle against the sorceress.”
                // “But now that the sorceress has become a
                //  major threat, our true mission
                //  has begun.”
                await IMessageService.ShowDialog(channel: 0, messageId: 50, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 6, firstFrame: 128, lastFrame: 150); // RCANIMEKEEP
            }
            else if((R0 == 2))
            {
                G[1027] = (Byte)3;
                REQEW(priority: 5, GetObject<squall>().houkoku());
                this.Animation.FPS = 64; // ANIMESPEED
                this.Animation.Play(animationId: 7, firstFrame: 24, lastFrame: 72); // RCANIMEKEEP

                // Headmaster Cid
                // “You’re quite right...”
                await IMessageService.ShowDialog(channel: 0, messageId: 53, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.FPS = 32; // ANIMESPEED
                this.Animation.Play(animationId: 5, firstFrame: 20, lastFrame: 72); // RCANIMEKEEP

                // Headmaster Cid
                // “She had been a sorceress since childhood.
                //  I married her, knowing that.”
                await IMessageService.ShowDialog(channel: 0, messageId: 54, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                await this.Animation.Play(animationId: 5, firstFrame: 72, lastFrame: 100); // CANIMEKEEP
                this.Animation.Play(animationId: 4); // RANIMEKEEP

                // Headmaster Cid
                // “We were happy.
                //  We worked together, the two of us.
                //  We were very happy.”
                await IMessageService.ShowDialog(channel: 0, messageId: 55, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 6, firstFrame: 1, lastFrame: 128); // RCANIMEKEEP

                // Headmaster Cid
                // “One day, Edea began talking about
                //  building the Garden and training SeeD.”
                // “I became obsessed with that plan.  But
                //  I was very concerned with SeeD’s goal,
                //  that one day SeeD might fight Edea...”
                await IMessageService.ShowDialog(channel: 0, messageId: 56, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                await this.Animation.Play(animationId: 6, firstFrame: 128, lastFrame: 150); // CANIMEKEEP
                this.Animation.Play(animationId: 5, firstFrame: 1, lastFrame: 72); // RCANIMEKEEP

                // Headmaster Cid
                // “She laughed and told me
                //  that would never happen.”
                await IMessageService.ShowDialog(channel: 0, messageId: 57, posX: 160, posY: 8); // AMESW
                this.Animation.FPS = 64; // ANIMESPEED
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.FPS = 32; // ANIMESPEED
                this.Animation.Play(animationId: 7, firstFrame: 24, lastFrame: 50); // RCANIMEKEEP

                // Headmaster Cid
                // “However...”
                await IMessageService.ShowDialog(channel: 0, messageId: 58, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 7, firstFrame: 50, lastFrame: 100); // RCANIMEKEEP
            }
            else if((R0 == 3))
            {
                G[1027] = (Byte)4;
                REQEW(priority: 5, GetObject<squall>().houkoku());
                await this.Animation.Wait(); // ANIMESYNC
                await this.Animation.Play(animationId: 5, firstFrame: 72, lastFrame: 100); // CANIMEKEEP
                this.Animation.Play(animationId: 6, firstFrame: 1, lastFrame: 20); // RCANIMEKEEP

                // Headmaster Cid
                // “He is from the Shumi tribe.
                //  A black sheep of the tribe, one might say.”
                await IMessageService.ShowDialog(channel: 0, messageId: 60, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 6, firstFrame: 20, lastFrame: 105); // RCANIMEKEEP

                // Headmaster Cid
                // “We met while I was running around
                //  trying to find funds to build the Garden.”
                // “He became interested in building
                //  the Garden, and we hit it off.
                //  Thanks to his funding, it was completed.”
                await IMessageService.ShowDialog(channel: 0, messageId: 61, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 6, firstFrame: 105, lastFrame: 128); // RCANIMEKEEP

                // Headmaster Cid
                // “However, we needed an enormous
                //  amount of funds to run the Garden.”
                // “So we began dispatching SeeDs
                //  around the world as a means
                //  of supporting the Garden.”
                await IMessageService.ShowDialog(channel: 0, messageId: 62, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                await this.Animation.Play(animationId: 6, firstFrame: 128, lastFrame: 150); // CANIMEKEEP
                this.Animation.Play(animationId: 5, firstFrame: 1, lastFrame: 72); // RCANIMEKEEP

                // Headmaster Cid
                // “NORG’s idea was
                //  right on the money.”
                // “An enormous amount of capital
                //  began flowing into the Garden.”
                await IMessageService.ShowDialog(channel: 0, messageId: 64, posX: 160, posY: 8); // AMESW
                this.Animation.FPS = 64; // ANIMESPEED
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.FPS = 32; // ANIMESPEED
                this.Animation.Play(animationId: 7, firstFrame: 24, lastFrame: 50); // RCANIMEKEEP

                // Headmaster Cid
                // “And the Garden began to change.”
                // “Lost sight of our high ideals,
                //  the truth was covered up...”
                await IMessageService.ShowDialog(channel: 0, messageId: 65, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.FPS = 64; // ANIMESPEED
                await this.Animation.Play(animationId: 7, firstFrame: 50, lastFrame: 100); // CANIMEKEEP
                this.Animation.FPS = 32; // ANIMESPEED
                this.Animation.Play(animationId: 4, firstFrame: 1, lastFrame: 80); // RCANIMEKEEP

                // Headmaster Cid
                // “That’s probably enough.”
                // “In the end, it was my fault,
                //  for giving up control.”
                await IMessageService.ShowDialog(channel: 0, messageId: 66, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 4, firstFrame: 80, lastFrame: 105); // RCANIMEKEEP
            }
            else if((R0 == 4))
            {
                G[1027] = (Byte)5;
                REQEW(priority: 5, GetObject<squall>().houkoku());
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 5, firstFrame: 72, lastFrame: 100); // RCANIMEKEEP

                // Headmaster Cid
                // “We must stop
                //  drifting around soon...”
                await IMessageService.ShowDialog(channel: 0, messageId: 68, posX: 160, posY: 8); // AMESW
                await this.Animation.Wait(); // ANIMESYNC
                this.Animation.Play(animationId: 4); // RANIMEKEEP

                // Headmaster Cid
                // “I only hope that we can get things
                //  back to the way they were.”
                await IMessageService.ShowDialog(channel: 0, messageId: 69, posX: 160, posY: 8); // AMESW
            }
            else if((R0 == 0))
            {
                // do nothing
            }
            IGameplayService.IsUserControlEnabled = true; // UCON
            await this.Animation.Wait(); // ANIMESYNC
        }
        return IRET(8);
    }


Just keep in mind that I didn't intend to write a replacement for Deling. We do different things. Deling allows you to edit game scripts, but my task is to make the code understandable for humans.
This formatting is done for only a third of instructions. Will we finalize it - I don't know yet. But it helped a lot in understanding the code in order to implement it in a new engine.

If it is useful to someone - use it. :)
For me it was an interesting experience. I plan to add support for normal scripts in FF9.

There is all of formatted field scripts:
https://yadi.sk/d/MMuojnn3VZoXDg

16
Done:
http://wiki2.ffrtt.ru

Will be merged soon.

17
Wow! Thank you!

18
it is in your PM.
 8)
Oh gods, share, please!
Many pages from the FFVIII section have disappeared, if they are preserved, it will help!

19
Albeoris, is that all you have, or are you still in process of restoring the data?
 8)
Some FF7 pages are still recovering.

P.S. Now the Wiki is served by two admins. Daily backups.

20
Hey guys!

We began to restore the data from the archive.
Unfortunately, a lot of information is lost irrevocably.
Section on Final Fantasy VIII is completed. You can assess the magnitude of the disaster.

http://wiki.ffrtt.ru/

21
Scripting and Reverse Engineering / Re: [FF9]2016 release
« on: 2017-12-16 15:50:37 »
Right now the Memoria is available on the Nexus Mods!
https://rd.nexusmods.com/finalfantasyix/mods/3

22
I made a new branch for the development of FF8.
https://github.com/Albeoris/Memoria/tree/ff8

To debug a walkmesh you can uncomment this line in the "FieldMap.cs":
// debugRender = true;


23
Sure! :)

Oh hi there! ;)
I wanted to code Snake in assembler working on VIII engine, but VIII working on IX engine? :D
FFIX engine you're talking about is in fact Unity, right? Silicon making FFIX on Unity with C# coding was the biggest gift they could do, with all the source human readable and IL recompiling. <3

Count me in! I'm a bit sick now but I will contact you on Skype ASAP (in 2-3 days I think)
Nice to hear! I look forward to!

The first try:


Need to correct neighbors of vertices and camera's settings. :)

24
I will try provide it ASAP.
Now I want to return the debugging information for displaying a walkmesh in the game.

25
Hello guys.

How some of you know I am working at modification of the FF IX game's engine.
Now I plan to start porting the FFVIII to the new engine. As result we will have a full modable game with engine what also combatible with FFVII.
It's a gigantic project and I cannot do that alone. If you want to help me - welcome! I teach you how to do that and will help if you will encount some problems.
We have a full described FFVIII resources and sources of FFIX. It's a hard task but not imposible.

The first target: render some location from the FFVIII on the FFIX engine (we need a field's mesh, textured overlays and camera's settings).
You can contact to me via PM or sykpe (albeoris).

Thank you for your attention.
Let make a seria great again.  :)

Pages: [1] 2 3