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 - mitlark

#1
Well, I must say, right now all I have in Steam is from bundles. Humble Bundle, to be specific. And that gives me the power to be accepted within Steam "exclusive" greenlighting. I feel so privileged... And be able to vote, something I just did.

But whatever. Cheers to you, Ali. And to everyone else working on a fine adventure, or any other kind of game! Or not doing any at all right now whatever the reason is (?). Dear lord why I deviate so much? Keep straigh head!
#2
Dark Souls. Has anyone here played that bastard? It's a non-linear game. When you start the game, you can go to pretty much anywhere, except for some places that need some kind of key, heh (plot). You can kill any NPC. You can customize your character to your liking and equip anything (this of course resulting in experienced people sticking to the "best method", like when in an RPG you have like 30 magics and you select the best one over and over -Meteor!-). And they try to hold your hand as LITTLE as possible, ending in you inevitably dying over and over.

Thing with non-linearity is that it doesn't has anything to do with the impact and extra endings. It's about breaking the "A to B" paradigm, making it instead A to either B, C, D, E, F... then at some point Z. Or finally end up with W, X, Y as possible endings.
Then the games that just throw a different cinematic depending on your variable values. Bools and integers determining what ending sequence plays (?).

Now let's think about linear vs. non-linear. Which is easier to develop? Which pleases most audiences without that much hazzle? Linear games. A lot of people are just caring for a story and blah. I'm not in that boat because I like a little more of non-linearity, but if I can please people with the easiest path, then it's a good thing to consider. Nowadays is pretty hard to achieve a good replay value if your game's main aspect is story.

If you go for a non-linear approach, there is this thing that involves branching. Let's say you make a branching, you have two results. Each of these branches then break again in two separate branches each. Now we have 4 paths. Let's say this happens over and over. With 7 levels of branching, you have 2^7=128 different paths. So you pretty much have to make 128 games in one.
Of course, I'm not taking into account that some branches start at mid of game, neither am I considering that some branches can join at some point, which is the key for branching stories, because neither you or your players will follow up with that gigantic schema where they are.
#3
Maybe make it in a way that choices really matter, and add some real interaction. Also I don't like the Sound system, where all I can do is listen. No choices or ways to influence there, not really a system, just a nice demonstration.

(?).

Nice podcast. I had a lot of laughs, and made my day a better one. Good for listening while you're doing AGS things.
#4
I think that if you can't pass an object as a value, you pass a pointer instead. Much better than duplicate the entire object in memory.
#5
Does your magnifier sprite have alpha channel? If it does, then it should work. It it doesn't, by using an image editor make it have alpha, then make the center part semitransparent, AND make sure your background has alpha channel too.

If it throws an error saying something about color depth, modify your background, adding an alpha channel to it and making sure it is in 24bpp (or 32bpp if we count alpha). Then reimport the background.

Also, if it mentions something about sprites not being the same size (at least it threw me an error like that), add this line just before the one that the error remarks (possibly line 108):
Code: ags
sprite.ChangeCanvasSize(this.BackgroundSprite.Width, this.BackgroundSprite.Height, 0, 0);


I hope it works for you. I'm not going to use it, but this thing is pretty rad. Here a screenie:
Spoiler
[close]
#6
Editor Development / Re: Bug report
Fri 28/02/2014 16:50:45
Whoops, sorry about the wrong section thing.

But, YEAH! Now it works! I actually tried installing a VCRedist I had somewhere in my PC, but it was for the 2010 binaries. Didn't wanted to start trying every distro because there are hundreds. Actually, not even 10, but... anyway.

So yeah! Now I can use the 3.3.0, and try the AGS3.4.0 too =D!. Thanks a bunch!
#7
Editor Development / Bug report
Fri 28/02/2014 02:38:35
This is not a bug, but here it comes.

This is an error I've found a lot in the forum this day, as I was trying to resolve it. I'm pretty sure you've heard of it in German, and other languages that aren't English (that sole fact led me to some conclusions, but sadly I didn't got to a solution).
Quote---------------------------
Error
---------------------------
An unexpected error occurred trying to start up the AGS Editor. Please consult the details below and post the error to the AGS Technical Forum.

System.IO.FileLoadException: No se puede cargar el archivo o ensamblado 'AGS.Native, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' ni una de sus dependencias. No se pudo iniciar la aplicación porque su configuración es incorrecta. Reinstalar la aplicación puede solucionar el problema. (Excepción de HRESULT: 0x800736B1)

Nombre de archivo: 'AGS.Native, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' ---> System.Runtime.InteropServices.COMException (0x800736B1): No se pudo iniciar la aplicación porque su configuración es incorrecta. Reinstalar la aplicación puede solucionar el problema. (Excepción de HRESULT: 0x800736B1)

   en AGS.Editor.NativeProxy..ctor()
   en AGS.Editor.ApplicationController..ctor()
   en AGS.Editor.Program.startupTimer_Tick(Object sender, EventArgs e)
   en System.Windows.Forms.Timer.OnTick(EventArgs e)
   en System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
   en System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
---------------------------
Aceptar   
---------------------------
The solutions I've heard are that maybe the editor is missing some files, however that doesn't seems to be the case, or not in the regular way. AGS.Native.dll is there, and I actually made AGS3.3.0 run by changing the Native dll by the one from AGS3.2.1 (obviously it "exploded" when I tried to compile a game but I knew it was going to).

Yesterday it was working fine, but today I had an issue and had to reinstall WindowsXP (it needed some cleaning after all, it was such a mess ahahaha!).
I have .NET from 1.0 to 4.0 installed (both 4.0 to be precise). But it seems that there is something I'm missing at my system. So, my question is, if there is other dependency the editor uses. Something like Microsoft VisualC/++ libraries (2008, 2010...).

By now, I've taken my game back to 3.2.1, because it works fine (with some effort I've manually managed to migrate). I can't stand a day without AGS <3. But if anyone knows something of this issue, please share your thoughts.

Thanks.
#8
General Discussion / Re: flat vs. realism
Thu 27/02/2014 16:15:52
It's just a trend. Today is flat design, some time in the future will be other thing. Designers are like that, they have their own trends, and they rotate each certain amount of time.

And is "realism" just using some little shadowing and little textures? I think that's bad usage of the term.
#9
General Discussion / Re: flat vs. realism
Thu 27/02/2014 09:49:59
Quote from: Grim on Thu 27/02/2014 08:20:14
Bastard crashed my Firefox just when some boss fight was about to start...

I guess I'll never know, 'cos I'm not watching the whole thing again.
Jesus wins.
#10
Quote from: Calin Leafshade on Thu 27/02/2014 09:32:17
I know I speak for everyone when I say that I hope CW would consider being a part of that.
I give you my mouth in case you want to make it speak, because I'm with you.
#11
AuxiliaryFunctions
Supported AGS Version: 3.3

Introduction:
A very small contribution to the site, mostly to try out sharing something. It also is a learning experience, since I'm a VERY BAD programmer. VERY. VERY. BAD. And evil.

This little module encapsulates some functions that I've made that I think can be useful for some people.
These functions cover audio playback, scripted colour "picking" and character's screen position instead of room position.

Code Preview:
If anything happens to the download, you can grab the code from here. It's pretty short.

HEADER
Spoiler
Code: ags
// Mit's Auxiliary Functions (MitAF for short)
//============================================
//A bunch of things I found useful to have, and may be useful for others. Or may not.
//This work is done with the hope of giving something to the community. Either as some
//example code or... anything.

/*
DOCUMENTATION
	Usage: Open your project and import this module. Yeah.
	
	Available functions on this module.
	'''''''''''''''''''''''''''''''''''	
	MitAF.rgbToCol(int r, int g, int b)
		Returns a colour number as an integer, based on numerical values given for 
		red (r), green (g) and blue (b).
		Red goes from 0 to 31. Green from 0 to 63. Blue from 0 to 31.
		
	MitAF.playAudio(AudioClip *audio, int repeat)
		  Plays an audio clip. Difference between this and the regular AudioClip.Play() 
		is that this one is meant for more control under channel volume by audio type.
		  It also makes sure replaying a music/ambient sound type doesn't restarts the 
		audio file.
		
	MitAF.playerScreenX()
		Returns the player screen X co-ordinate based on its room X co-ordinate.
		
	MitAF.playerScreenY()
		Returns the player screen Y co-ordinate based on its room Y co-ordinate.
		
	MitAF.characterScreenX (Character *source)
		Returns any character screen X co-ordinate.
		Returns MitAF.playerScreenX() if source character is same as the player.
		
	MitAF.characterScreenY (Character *source)
		Returns source character screen Y co-ordinate.
		Returns MitAF.playerScreenY() if source character is same as the player.
	MitAF.updateAudioChannelVol()
		Updates all channels volume accordingly to their playing audio type.
		You can call this function after changing a volume value (options panel, etc),
		so all playing audio clips reflect the change.
	
	Available static properties (no need of instantiation).
	'''''''''''''''''''''''''''''''''''''''''''''''''''''''
	Mit_ambientChannel
		Pointer to a channel playing ambient sounds. If there has not been played any
		ambient sound at all, it returns null.
	Mit_musicChannel
		Pointer to a channel playing music. If there has not been played any music at 
		all, it returns null.
	Mit_AmbientVolume
		Volume value for Ambient Type audio clips. You can change it at your options panel.
	Mit_MusicVolume
		Volume value for Music Type audio clips. You can change it at your options panel.
	Mit_SFXVolume
		Volume value for SFX Type audio clips. You can change it at your options panel.
*/

// MIT License
// ===========
// (This license it's not mine).

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

#define MitAF_VERSION 100 // current version

//For saving channel references.
import AudioChannel *Mit_ambientChannel;
import AudioChannel *Mit_musicChannel;
//Channel volume.
import int Mit_AmbientVolume;
import int Mit_MusicVolume;
import int Mit_SFXVolume;

//Channel volume.
struct MitAF {
	//Available functions.
	import static int rgbToCol(int r, int g, int b);
	import static function playAudio(AudioClip *audio, int repeat);
	import static int playerScreenX();
	import static int playerScreenY();
	import static int characterScreenX (Character *source);
	import static int characterScreenY (Character *source);
	import static function updateAudioChannelVol();
};
[close]
SCRIPT
Spoiler
Code: ags
// Mit's Auxiliary Functions (MitAF for short)
//============================================
//A bunch of things I found useful to have, and may be useful for others. Or may not.
//This work is done with the hope of giving something to the community. Either as some
//example code or... anything.

// MIT License
// ===========
// (This license it's not mine).

// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to
// deal in the Software without restriction, including without limitation the
// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.

// Available static properties (no need of instantiation).
// '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
// Mit_ambientChannel
// 	Pointer to a channel playing ambient sounds. If there has not been played any
// 	ambient sound at all, it returns null.
AudioChannel *Mit_ambientChannel;
// Mit_musicChannel
// 	Pointer to a channel playing music. If there has not been played any music at 
// 	all, it returns null.
AudioChannel *Mit_musicChannel;

// Mit_AmbientVolume
// 	Volume value for Ambient Type audio clips. You can change it at your options panel.
int Mit_AmbientVolume;
// Mit_MusicVolume
// 	Volume value for Music Type audio clips. You can change it at your options panel.
int Mit_MusicVolume;
// Mit_SFXVolume
// 	Volume value for SFX Type audio clips. You can change it at your options panel.
int Mit_SFXVolume;

//Exports.
export Mit_ambientChannel;
export Mit_musicChannel;
export Mit_AmbientVolume;
export Mit_MusicVolume;
export Mit_SFXVolume;

// MitAF.rgbToCol(int r, int g, int b)
// 		Returns a colour number as an integer, based on numerical values given for 
// 		red (r), green (g) and blue (b).
// 		Red goes from 0 to 31. Green from 0 to 63. Blue from 0 to 31.
static int MitAF::rgbToCol(int r, int g, int b){
	return ( (r*2048)+(g*32)+(b) );
}

// MitAF.playAudio(AudioClip *audio, int repeat)
// 		  Plays an audio clip. Difference between this and the regular AudioClip.Play() 
// 		is that this one is meant for more control under channel volume by audio type.
// 		  It also makes sure replaying a music/ambient sound type doesn't restarts the 
// 		audio file.
static function MitAF::playAudio(AudioClip *audio, int repeat){
	int vol=100;
	AudioChannel *channel;
	if (audio.Type == eAudioTypeAmbientSound) {
		if (Mit_ambientChannel != null){
			if (Mit_ambientChannel.PlayingClip != null) {
				if (Mit_ambientChannel.PlayingClip == audio) return;
			}
		}
		vol = Mit_AmbientVolume;
	}
	else if (audio.Type == eAudioTypeMusic) {
		if (Mit_musicChannel != null){
			if (Mit_musicChannel.PlayingClip != null) {
				if (Mit_musicChannel.PlayingClip == audio) return;
			}
		}
		vol = Mit_MusicVolume;
	}
	else if (audio.Type == eAudioTypeSound) vol = Mit_SFXVolume;
	channel = audio.Play(eAudioPriorityNormal, repeat);
	channel.Volume = vol;
	if (audio.Type == eAudioTypeAmbientSound) Mit_ambientChannel = channel;
	if (audio.Type == eAudioTypeMusic) Mit_musicChannel = channel;
}

// MitAF.playerScreenX()
// 		Returns the player screen X co-ordinate based on its room X co-ordinate.
static int MitAF::playerScreenX(){
	int sHalf = (System.ScreenWidth/2);
	int rX = Room.Width - sHalf;
	if (player.x <= sHalf) return player.x;
	if (player.x > rX) return (player.x - (rX-sHalf));
	return sHalf;
}

// MitAF.playerScreenY()
// 		Returns the player screen Y co-ordinate based on its room Y co-ordinate.
static int MitAF::playerScreenY(){
	int sHalf = (System.ScreenHeight/2);
	int rY = Room.Height - sHalf;
	if (player.y <= sHalf) return player.y;
	if (player.y > rY) return (player.y - (rY-sHalf));
	return sHalf;
}

// MitAF.characterScreenX (Character *source)
// 		Returns any character screen X co-ordinate.
// 		Returns MitAF.playerScreenX() if source character is same as the player.
static int MitAF::characterScreenX (Character *source){
	int pSX = MitAF.playerScreenX();
	if (source.ID==player.ID) return pSX;
	return ( (source.x - player.x) + pSX );
}

// MitAF.characterScreenY (Character *source)
// 		Returns any character screen Y co-ordinate.
// 		Returns MitAF.playerScreenY() if source character is same as the player.
static int MitAF::characterScreenY (Character *source){
	int pSY = MitAF.playerScreenY();
	if (source.ID==player.ID) return pSY;
	return ( (source.y - player.y) + pSY );
}

// MitAF.updateAudioChannelVol()
// 		Updates all channels volume accordingly to their playing audio type.
// 		You can call this function after changing a volume value (options panel, etc),
// 		so all playing audio clips reflect the change.
static function MitAF::updateAudioChannelVol(){
	int i=0;
	int vol=100;
	AudioClip *audio;
	AudioChannel *channel;
	
	while (i<System.AudioChannelCount){
		channel = System.AudioChannels[i];
		audio = channel.PlayingClip;
		if (audio != null) {
			if (audio.Type==eAudioTypeAmbientSound) vol=Mit_AmbientVolume;
			else if (audio.Type==eAudioTypeMusic) vol=Mit_MusicVolume;
			else if (audio.Type==eAudioTypeSound) vol=Mit_SFXVolume;
			channel.Volume = vol;
		}
		i++;
	}
}
[close]

Module download:
- Download link -

SPECIAL THANKS
To whoever wrote the manual <3. And to the community, for this extensive experience database known as forum.
#12
Meanwhile, in Enterbrain headquarters...
"What can we do for the next RPG Maker? Oh, now I know! Grab the previous one, add some text boxes here and there, stick Ace at the end and profit!".

The first time I read this post I didn't really understand you. I mean, I knew you had reasons, but I have no knowledge about the engine development and stuff. All I have seen this time I've been using it is a cute face and a nice body *rawrrrrr*. But after reading a little of more involved people now I think I understand a little better.

If anything, I think that starting again from scratch could be considered. Not as AGS, but as its... child?
#13
Hello! This is not a ground breaking issue, but more of an inquirity with a thing that I've observed.

Thing is like this. I wanted to control separately volume for SFX (normal sounds), ambient sounds and music. So I did this little audio playing helper
Code: ags
int playAudio(AudioClip *audio, int repeat){
	int vol=100;
	AudioChannel *channel;
	if (audio.Type == eAudioTypeAmbientSound) vol = AmbientVolume;
	else if (audio.Type == eAudioTypeMusic) vol = MusicVolume;
	else if (audio.Type == eAudioTypeSound) vol = SFXVolume;
	channel = audio.Play(eAudioPriorityNormal, repeat);
	channel.Volume = vol;
}
It adjusts volume to the resulting channel depending on the audio type. That works fine.

But crossfading screws it up completely. Let's say, music crossfades, it automatically resets volume and crossfades from 0 to 100, so changing volume before playing the audio file is pretty much worthless.

Question is, is there a workaround for this? Ideas?
There is the option to define an auxiliary Audio Type named "crossfading music" and do the crossfade manually when needed, but I assume it should be more costy for the engine. And nasty (?).

Anyway, I'm not in a hurry, by now crossfade is off, but I really like the effect. So for that, I just ask in case someone here knows something I don't. Because "communityKnowledge > me".

Thanks for reading.
#14
Seems to be real: http://wiki.scummvm.org/index.php/GSoC_Ideas#AGS

Well, that could be one of the most awesome things in the world to happen. Because... you know of any system that doesn't supports ScummVM? NES... and MSX... and...
I hope it gets done. It would be great to play AGS games on mobile phones and virtually anything else compatible with SDL.
#15
I've tested it, and here is the deal. game.dialog_options_x and game.dialog_options_y are offsets for the options positioning. When "print dialog options upwards" is true, giving 114 as the Y, the resulting Y will be whatever Y position the dialog options gets by default PLUS 114. Meaning that in most cases the options will be offscreen.

I gave game.dialog_options_y a value of -114, and the options appeared somewhere near to the middle of the screen.

So I suggest you try out repositioning your dialog options by using negative numbers.
#16
General Discussion / Re: flat vs. realism
Wed 26/02/2014 17:13:48
Yeah, because "flat design" was "invented" on 2013.
#17
Quote from: LimpingFish on Sun 23/02/2014 23:45:11
Wait...AGS is easy?!
Comparatively speaking (? if that's a correct sentence/word), yes. From all things I've tried, AGS is easier to learn than most of them. The only thing easier than AGS I can remember right now are the RPG Makers, and that's only if you don't make your own scripts (XP and onwards).

Obviously, I say all of this based on personal opinion and experiences.
#18
I think we tried to start remarking the manual descriptions as a starting point, so if there was something you didn't understand from the manual, you were able to ask with that in hand. Don't feel guilty of asking, as I think forums are meant for that.

cEgo: Oh yeah, I'm such a nice guy.
cSelf: Shuddup Ego!!!
#19
You probably would like to add a max amount of characters. Normally any TextBox limits the max amount of characters by itself, but when done by scripting (aka manually overwritting the value), it has no character limit.
Adding an if statement before appending a character probably will do the trick:
Code: ags
if (TextBox1.Text.Length < 5) TextBox1.Text.AppendChar('2'); //For a max size of 5


My two cents.

PD.: The AGS manual/helpfile is our best friend <3.
#20
Yeah, maybe Wintermute, though I don't think it's easy to use, I think you should consider either getting a programmer/scripter or learn by yourself. If you continue being limited by an engine's features you will have short space to work on.
SMF spam blocked by CleanTalk