Menu

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.

Show posts Menu

Messages - Gal Shemesh

#61
I'm not sure if I understood correctly what you mean. The Sprites editor lets me select multiple selection and I use this to assigning the selection to a view. It gives options such as overwriting or adding the frames to an existing loop, and also to set all frames as flipped or to add them in reverse order. I only find that it missing one option which is to set a certain delay for all the frames in this process.

EDIT:
Sorry, I mistook the Sprite and the View editor when I read your reply. I originally talked about the Sprite editor so the delay could be set at the same time when assigning the frames to a View. But if as you said the View editor will allow selecting of multiple frames that could do the trick as well, in addition to also allow deleting / flipping of multiple frames.
#62
The ability to grab a bulk of sprites in the Sprite editor and to assign them to a View is a very neat feature. Though, it lacks the ability to set a 'delay' to all of the frames if you need it.

In the game I'm working on, I need the walk animation of my character to run in an 'in-between' delay speed, which I can achieve only by setting a delay value for every frame of its walking animations. But since every of the 8 direction of my characters contains 18 walking frames, this is quite tedious to have to click on each and every frame in every loop for adding the delay value. So it could be nice if it could be added for all frames at the same process of assigning them to a view.

Thanks
#63
Thanks, @Snarky.

Quote(I'm almost tempted to suggest you try upscaling the graphics for an HD remake.)
In general that's a great idea. Though, due to some visual problems with the graphics that you can rip for the original game files, apart from the 'walk' and maybe 'talk' animations I base most of what's going on upon captured cropped moments from while playing the game in an emulator. So if I'll try to upscale the background for example and then to upscale a cropped area of it with some animations, it might not look right. It's a very neat process that requires positioning of every object at the exact pixel spot it should be.

QuoteI would have thought the best way to achieve that would be through a ScummVM port (as they did for KQ7), but it looks like attempts to add the engine to ScummVM were abandoned, so for a non-engine-coder I guess a remake is the last resort. Good luck!
Exactly - our local Hebrew Adventure group in which I'm one of the admins mostly use ScummVM when we translate games, as it gives more freedome and flexibility to add captions and to translate games that the original engine of the game could ever have. But yes, 'Master Lu' isn't supported to run in it, and even if it could I don't think that adding captions to it could be done, giving the fact that it doesn't have any code of captions to relay on.
#64
*** PROJECT DISCONTINUED - See latest update at the end of this post ***



Ripley's Believe It or Not!: The Riddle of Master Lu is a point-and-click adventure game based on Robert Ripley, the creator of Ripley's Believe It or Not!, which was developed and published by Sanctuary Woods in 1995. -Wikipedia.

I really liked this game back in the day, the same as I like it today, and found myself keep returning to playing it every few years from beginning to end. Though, the one thing that bothered me most is the fact that it lacks of any text captions; making it unplayable for players who cannot hear. The second thing that bothered me is that there is no way to skip scenes or dialogues; which makes it quite bothersome.

The main issue made me want to try and add captions to the game, however this task was found impossible, giving the fact that there is no access to the source-code of the game nor to the engine it was built upon. And as hard as I found, I wasn't managed (so far) to reach any of the original game developers or owners of the out-of-business Sanctuary Woods - which I'm still trying.

That is when I came up with an idea to actually re-create the game in AGS. I began the process to first test how it looks, and after days and nights of tedious work and completing its long introduction scenes, I can say that it turns out really good and truly looks and feels as if it was developed by the out-of-business Sanctuary Woods themselves! And at this point I think that it deserves a thread in the AGS Games in Production forum. So here it is!

* Please note that I'm still trying to reach and get approval to releasing this game – hopefully that it will be allowed to be shared for free, or at least that GOG could add it to their library and so I could offer them this captions version when its ready as a free-extra download for whomever purchase the game from them.

I currently work on re-creating the 'shareware' version of the game – as this can be shared for free like the original shareware is – and will update here once I have more to update. So keep tuned on this thread if this project interests you.

How does the Redux version is built?
I used some ripping tools that someone once wrote for ripping the game's assets, and also purchased Game Extractor which in the background use some of the mentioned ripping tools. The ripped assets include many BMP index files, which I converted into PNGs to save space, though many of them (especially animations) were not ripped correctly and have 'pixel-holes' in them. So whatever's not good enough I basically capture while playing the game in an emulator (without any compression). Then I crop the areas of action and make them GIF animation files. And finally, I import these GIFs into AGS and arrange them in Views.

The thing that did ripped correctly is the locations background (index BMPs) and the RAW audio (which is basically a WAV format) that I converted into OGGs to save space as well.

I've arranged all the audio files in an Excel sheet, and then listen and categorize them on-the-fly with filters, while also typing the caption of everything that is said in them; this process involves the listening feature of google translate for listening to the spoken audio – as not everything is cleared – and of course my own judgment checking if whatever was translated is actually correct, where if not I use other online dictionaries for checking and comparison, and then fix the necessary things that google translate got wrong. At the same time, I'm also translating the game to Hebrew (my mother tongue) as it would be a waste not doing so if I'm already going over 4K+ audio files.

All these 'pieces' become into a 'puzzle' of over 50,500 graphic files, and an addition 4,247 audio files. And I build this puzzle together in AGS and make all the necessary scripting from a complete scratch to make the game look and feel as close as possible to the original – only with the addition of text captions and skipping cut-scenes/dialogues possibility, which are the main reasons of why I've began working on this project in the first place.

Any comments and suggestions would be most welcome! And if someone has any relation or way to communicate with the original owners of the game and its intellectual proprietary, I'd very appreciate to know so I could begin working with them to get the necessary approval to releasing this re-release in the end.

* A side note – I'm not doing this for money and make this project voluntarily and completely for free, to bringing this masterpiece first for those who couldn't play it because they can't hear, and for returning adventurers who'd appreciate to re-play this game with captions – while making the captions, I myself now get many things that I didn't hear or understand correctly when I originally played it . So I suppose others would too.

Attached some screenshots from the process.





And here's a short video demonstrating how I prepare the animations for AGS:

10/09/2023 UPDATE:
Dealing with a huge amount of sprites can be a tedious task - but it can be a breeze with the help of some automatic scripting. I've made a short video demonstrating a recent discovery of mine about the ImageMagicK tool, and how I use it to prepare the sprites for importing into AGS. This tool includes so many features that I really got lost and it took me quite some time to find the appropriate functions that I needed to make it work for my needs.

12/09/2023 UPDATE:
A package from over seas has just arrived - it's the official player's guide of the game; read in some FAQ walkthrough that someone wrote that back in the day - before the commonly internet access in every house - you had to buy one of these if you got stuck in games. When I found this one on eBay right afterwards I immediately grabbed it. I expect that it would probably be a good reference book when re-creating this game.


In addition, I've capture today the full introduction from the re-built game which shows how the English captions look like. You may find it here (game resolution is 640x480 - it was sharply upscaled x3 for best viewing experience on YouTube):

For those of you who speak Hebrew, this is the same intro with Hebrew subtitles (Hebrew font by me):

14/09/2023 UPDATE:
In this video I describe the making process of the captions along with translating them - this is a technique I developed myself which helped me a lot when translating other games:

02/10/2023 UPDATE:
It appears that my good will to reproduce this game had encountered with some problems that I thought I could overcome, though eventually found they're just too much to handle. And so instead of having a good time re-producing this game, it turned into something un-pleasant and very exahusting - the good thing is that I'm only at the very beginning on the game. There are 2 main problems:

1. The ripped sprites have an index color 0 (pure black) as the background, while the same color is used in the actual sprites of the characters and objects - meaning that when the sprites are imported and this index color is considered as transparency, it also makes 'pixel-holes' within the actual sprites, which requires manually painting them over.

2. Each of the animation sprites has its own dimentional size, which requires manually aligning each and every sprite when re-building the animations.

These two main issues might not have been a problem on a regular 2D game where there are only a few sprites to handle. Though in this particular game there are dozens and hundreds of sprites in almost every animation sequence, which makes it a tedious process to re-create.

Sorry if this last update is such a disappointment - I'm disappointed by this as well. However, there is a bright side for everything. The first one is that I learned new scripting methods in AGS, which I'm surely going to use when working on my
next project. The second thing is that during the re-creation of what I did so far, I found and reported about bugs and new feature requests for the AGS editor, which mostly (if not all) were fixed and implemented in the coming 3.6.1 update by @Crimson Wizard. In addition, I managed to reproduce and release a nice grayscale pause module - very similar to the one that exists in 'The Riddle of Master Lu' when taking / viewing inventory items! This couldn't be done without the help of @Nahuel and @Crimson Wizard too. You can find it here.
#65
Not on the same matter I originally posted, but someone may reach this post when searching for SayBackground along with X and Y coordinates. Which I was looking for on another game that I'm working on where I wanted to position the speech text at the bottom center of the screen. So if anyone is interested, here's the details and the solution:

My game has live footage cut-scenes animations, which I imported into AGS as sprites, set them in Views and then in room objects. I'm using if statements to check for specific frames in the animations where I wish to play speech sound and to present the text at the bottom center of the screen.

Originally, I tried using .SayAt function for positioning the text where I want it to be, but it's a blocking function which sometimes caused another message that coded very close to the previous one to not appear. So I moved to use the .SayBackground function instead. But this one doesn't have the 'At' property like '.Say' has, and also requires to play the speech file separately. Besides, it also required to place the characters at the bottom center of the screen where I wanted the text to be shown and to make their transparancy 100. This had its own issues, such as frequently line breaks that looks wrong for bottom-center text, and also that sometimes the text was disappeared before the speech voice is finished playing, since as mentioned above the SayBackground is purely for showing text and you have to play the audio separately.

Eventually, I ended up using a custom .Say function which plays the speech clip, and also pass the text string to a GUI label, which I positioned exactly where I want it to be. So if anyone is interesed, here's how it works:

1. I made a GUI with a label that I positioned where I want the speech text to appear, and set it with the appropriate Speech font.

2. I made a custom 'say' function in my Global Script header (can't thank enough for @Khris for helping me with this one) called '.SayBottom', which goes like this:

Code: ags
void SayBottom(this Character*, int cue, String text)
{
  Game.PlayVoiceClip(this, cue);
  lblSpeech.TextColor = this.SpeechColor;
  lblSpeech.Text = text;
}

* I use this mainly in live-acting cut-scenes where the actual character are not present in the room. So I don't need any speech animation.

And under 'repeatedly_execute_always()' in the Global Script I wrote this to actually draw the text on the screen:

Code: ags
if (System.AudioChannels[0].IsPlaying) { // speech is playing on channel[0] by default
  if (lblSpeech.Text.Length < 500) // 500 is the Width of my label in pixels
  {
    lblSpeech.Y = 376; // this is the position I like the text to show for 2 lines of text
  }
  else
  {
    lblSpeech.Y = 356; // this is the position I like the text to show for 1 line of text
  }
}
else if (!System.AudioChannels[0].IsPlaying) { // this wipes any text from the label if no speech is playing on channel[0]
  lblSpeech.Text = "";
  }
}

By using this method in an actual playable room, this can be used for making the character speak (where the speech animation is not required) while the character does other stuff, or even walk around, as this is a none-blocking function.

Of course, this is for a case where you have speech in your game - if you're only making your game and don't have speech yet then this should be modified accordingly.
#66
Thanks for the quick testing. Appreciate it. That's really odd - I'm using July's 3.6.0 and on my end although the font is set up with outline and showing correctly for speech during runtime, when I passed a Character* .Say string into it the text shows only with the the character's speech color, but no outline... I will re-check this shortly this evening and update here.

EDIT:
Checked and confirm that it works - it appears that I probably changed the label's font unintendedly to Font0 which is the very same font as the speech font. Hence it didn't show the outline.

As for the label text alignment, such as aligning to bottom center, until such feature is implemented (or not), I made a simple code for changing the label's Y position, based on whether the its length is less than its Width or above it.
#67
Thanks CW. I actually have set my speech to use Font1 and it has its outline settings applied and showing correctly during runtime. But the labels that I set to use this Font1 only get the 'naked' font without any outline applied to it during runtime...
#68
Just found that GUI labels text can only be aligned to either left, center or right, while buttons text on the other hand has the flexibility of aligning their text to every edge and corner of its boundaries. I think that it would be nice if labels could have the same flexibility.

Besides, I think that labels and any other element that can utilize text should also have the properties that Fonts have, such as OutlineStyle, AutoOutlineStyle, AutoOutlineThickness, LineSpacing, and SizeMultiplier... I found this missing when I tried to use a text label as a static speech text location, which works quite nice yet missing these features to look better.

Thanks
#69
Hi everyone,

Just encountered this one and found that it actually hangs the editor on that dialogue until all messages are accepted (the only option in the dialogue to click upon).

When trying to delete frames in the Sprite editor, AGS reports you about frames that are in used in 'Views' and that they cannot be deleted - which is all fine and dandy when you're  trying to delete a single or about just a few frames. However, if you try to do so for a bunch of frames (say 100+), the editor will prompt you the 'Cannot delete sprite because it is in use' dialogue for each and every frame, where only an 'OK' button and an 'X' which does the same thing are available for you to closing the dialogue window that is related to a specific sprite. So basically, you're getting stuck in a situation where you have to accept each and every dialogue to get it out of the way and to get back to the editor.

I think that a 'Cancel operation' button should be integrated in this dialogue for stopping the deletion process from memory and closing the dialogue in a single click.

Thanks
#70
Quote from: Crimson Wizard on Sun 03/09/2023 18:21:38By the way, I think you also need to test if PlayingClip is not null in the above code, in case the channel was assigned, but it does not play anything at the moment.
Correct, thanks! I just came to update my previous post to mention this in case someone else wishes to do the same, as my previous code will cause the game to crash if there's no sound playing, due to the null pointer. So one can just check for 'Game.IsAudioPlaying' instead of checking if the Audiochannel is not null, as you previously suggested me to check instead of checking the Audiochannel type.

Code: ags
if (Game.IsAudioPlaying(eAudioTypeMusic))
{
  lblMus1Vol.Text = String.Format("Music clip: %s[Vol: %d", 
  globalChannelMusic1.PlayingClip.ScriptName, globalChannelMusic1.Volume);
}
else
{
 lblMus1Vol.Text = String.Format("Music clip:[Vol: 0");
}

This works great and does not crash when there's no sound playing, but for my scenario with the different 'audio channels logic' using global variables, I should fix it according to what you just added. Many thanks! :)
#71
QuoteIf you want to access particular clip's property, you need to also add this property to command, like "channel.PlayingClip.ScriptName".
Awesome!!!  8-)  8-)  8-)  Thank you so much! This works flawlessly.

EDIT:
See @Crimson Wizard's clarification below; an additional check is required to prevent null pointer crash.
#72
QuoteYes, you can access a played clip properties through channel.PlayingClip.
Mm... I tried pulling the name as a string this way but it doesn't work... I guess my code is incorrect.
Code: ags
if (globalChannelMusic1 != null)
{
  lblMus1Vol.Text = String.Format("Music (Ch1): %s[Vol: %d", globalChannelMusic1.PlayingClip, 
  globalChannelMusic1.Volume);
}
else
 {
   lblMus1Vol.Text = String.Format("Music (Ch1): [Vol: 0");
 }
#73
Awesome, @Crimson Wizard! :) I'm always using the latest stable release, currently Build 3.6.0.50, v3.6.0, July 2023. But I do look forward for the official release of 3.6.1 with all the new added features - especially the fully supported right-to-left Hebrew fix for GUI buttons.

I have downloaded the 3.6.1 version from your link for a test run and monitored this function in the new Log Panel when the game starts - this is really awesome! I see that it prints all the imported sounds in an array and that each can be retrieved by its number from the log.

Can the retrieval be dynamic? I mean, if a global variable is set as an Audiochannel* and I dynamically change it to other sounds, can the name of the actual sound that plays be retrived? I have this label in my debbuger GUI and I'm currently running this in the 'repeatedly_execute_always()' function in the Global Script for monitoring the sound volume, but I wish to add the sound name as well:

Code: ags
if (globalChannelMusic1 != null)
{
  lblMus1Vol.Text = String.Format("Music (Ch1) Vol: %d", globalChannelMusic1.Volume);
}
else
{
  lblMus1Vol.Text = String.Format("Music (Ch1) Vol: 0");
}

Thanks
#74
Thanks @Cassiebsg - but doesn't AGS calculate and position according to the 'bottom-center' of the sprites boundaris (its feet)? I mean, if it calculates from the center as you say, wouldn't the center point change if the overall boundaries size of the character changes? See picture below.



I'm aware of problems like this from other game engines, where if you change the boundaries of a sprite from the Left or Top then it affects its 'hotspot' - causing its center point to change and the character to jump around when its now 'non-gap' sprite that you changed plays in a sequence with other animations that still have a gap in them. While if you change its boundaries from the Right or Bottom then the hotspot remains in place; a trick I used back when I was working on other game engines that gives you control over the hotspot position in a given sprite/frame, was to flip the image to the other side than the side I wish to change the boundaries from, to make the size change, and then to re-flip the sprite back, which kept its hotspot in place. But I didn't see a way to manually modify sprites/frames hotspot in AGS...

Anyway, I've successfully finished working on this game I was working on by now, along with successfully fixing all its scripting issues coming from the old AGS 2.72 - it was a 'making captions' project for a game that didn't had captions in the first place, only speech. But this note of yours is something to take into account if I encounter with such thing while working on other AGS projects that aren't mine in the future.
#75
Thank you so much @Crimson Wizard for the detailed information! I will take your example and spend some good time studying it, as there are many aspects in it that I wasn't aware about or ever used yet.
#76
I know the last reply on this thread is from a few years ago, but just wondered if we can easily grab the name of audio clips for debugging by now?

Like @Laura Hunt, I also built a custom 'audio channels logic' where I have global variables for either Music, Ambiance and SFX, where each is set as Audiochannel*, and I play music for example like so:

Code: ags
globalChannelMusic1 = aMain_Menu.PlayOnChannel(1, eAudioPriorityNormal, eRepeat);

I'm already debugging the 'Volume' of my 'globalChannel' variables, but I'm also interesting in seeing the actual name of the audioclips in a label on my debugging GUI.

Thanks
#77
Quote from: Crimson Wizard on Tue 22/08/2023 14:43:10In case of SayBackground, it returns an Overlay pointer, which you may store in a variable and test for Overlay.Valid to know when it's removed, so that you could continue with the next SayBackground.
That's an interesting one - can you kindly explain how do I save the Overlay pointer of SayBackground and check for it using the Overlay.Valid for triggering the next speech line?

I saw in the manual the 'Overlay.CreateTextual' example, though it doesn't speak on the specific SayBackground function. I made a custom SayBackground function called 'SayBackgroundNew' and it looks like this:

Code: ags
void SayBackgroundNew(this Character*, int cue, String text)
{
  String cueString = String.Format("&%d", cue);
  {
    if (Speech.VoiceMode == eSpeechVoiceAndText && IsSpeechVoxAvailable())
    {
      Game.PlayVoiceClip(this, cue);
      this.SayBackground(text);
    }
    else if (Speech.VoiceMode == eSpeechVoiceOnly && IsSpeechVoxAvailable())
    {
      this.Say(cueString);
    }      
    else if (Speech.VoiceMode == eSpeechTextOnly)
    {
      this.SayBackground(text);
    }
  }
}

And I call for it in the 'room_RepExec()' like this:

Code: ags
player.SayBackgroundNew(1, "first speech cue text");
player.SayBackgroundNew(2, "second speech cue text");

Thanks
#78
Completed Game Announcements / Re: Going Home
Fri 25/08/2023 14:20:59
Thanks a lot, @heltenjon! Very pleased to hear that you liked it and that it works flawlessly - I really tried my best to make it covered from every direction to provide the best playing experience. Glad to receive such feedback and that all my hard work is appreciated.

Will very appreciate the votes on the game's page from whomever played it.

Thanks everyone. :)
#79
Thanks for the explanation. I actually did set all my audio types in the editor to 1, to make sure that new sounds that I play on a given 'globalChannel' variable will play on the same channel as the previous. But, does it means that there will be 1 channel preserved for each type, meaning a total of 3 (Ambient, Music, SFX)? Or that there will be 1 channel in general for everything?

EDIT:
Ended up making 3 silent audio files of 1 second each (empty audio file makes AGS crash). I then set them as follows when the game starts:
Code: ags
function game_start()
{
 globalChannelAmbiance = aSilent_Ambiance.Play(eAudioPriorityNormal, eOnce);
 globalChannelMusic = aSilent_Music.Play(eAudioPriorityNormal, eOnce);
 globalChannelSFX = aSilent_SFX.Play(eAudioPriorityNormal, eOnce);
}
Now each 'globalChannel' variable is preserved for sound assets of its type.
#80
QuoteDo you assign globalChannelSFX  to something in the main menu room script perhaps?
Yes, just edited my previous post. There was a click of a button that is set using the globalChannelSFX. Thanks!!

I've just set a sound asset to play on all the globalChannel variables that I made when the game starts, which changes them all from being 'null'. Now at least the game doesn't crash on me. So I'll probably make a short silent sound file for this purpose. Thing is, when a SFX is playing the labels of both the SFX and Ambience go to 100% from some reason, while only the SFX label should do so.

My current code state is after following your suggestion above, set to check for my 'global channel' variables instead of the 'Game.IsAudioPlaying'. I'm not sure why, but when I change it back to check for the 'Game.IsAudioPlaying' of each type, each label now works for what it meant to check. Though, I'm trying to figure out why the labels of both Ambience and SFX are affected when only a SFX is playing when the checks are set to check the 'global channel' variables, as you recommend to do it this way.

SMF spam blocked by CleanTalk