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

Topics - monkey0506

#101
You remember that one thing that RickJ said? Well I was thinking, and these are some of my thoughts on what a library module should be:

- Work directly and seamlessly with existing script file format
- Easy to mark a script as a library
- Easily removed from the collection of libraries
- Easily included or excluded from a single project
- Easy to update global library from local copy and vice versa

Well with the Libraries plugin you can do just that:


For those of you wondering, that's XP it's just highly skinned. :P

You can mark a script as a library by right-clicking on it and selecting "Add to libraries". Now any time you load a game project that script will be automatically included. If you don't want every library to be automatically included in every project, click on "Preferences" where there is an option to turn that behavior off.

NOTE: Due to a current limitation in the plugin API any newly created or recently deleted scripts will not be reflected in the project tree. The easiest way I have found to update the list of scripts so far is by renaming one of the other scripts. Closing and reloading the project will also refresh the list. CJ has said that he may be able to implement a way to force this to refresh from the plugin API, you can support that here.

And I guess I should probably maybe give you a download link as well. :P

If there's any other questions or comments feel free. Specifically I think people might like to see more options in the preferences but I wasn't sure what all to include there.

Anyway, hope you enjoy the plugin. Thanks again to Rick for the idea.

Oh, and speaking of Rick's idea...there's currently no "Sticky" functionality but that would be understandably beneficial. I suppose I could maybe do something using the MoveScriptAndHeaderUp method...but then again...I don't think there's currently any way to tell if a new script has been added or if the order has been changed...so maybe not. But I could look into it. :=
#102
So against my better judgment (:P) I've been teaching myself some C# in order to be able to write an editor plugin. It's actually quite nice...although I still hate that bloody name. :=

Anyway, I've searched through the AGS DLLs using both the Object Browser and a program called Reflector that lets me see more of the internals (actual function definitions and things beyond what the Object Browser shows) and I can't seem to find anything that will allow me to write to the AGS directory.

Simply omitting the file path put the files in the project folder, which presumably is by design. However, I am looking at implementing some global items that can't be placed in the game project folders. So far this is what I've come up with:

Code: ags
                RegistryKey key = Registry.ClassesRoot.OpenSubKey(@"agf_auto_file\shell\open\command");
                string dir = "";
                try
                {
                    // value will be in format of @""C:\Adventure Game Studio\AGSEditor.exe"" ""%1"""
                    dir = key.GetValue("").ToString().Substring(1); // trim leading quote
                    dir = dir.Substring(0, dir.LastIndexOf('\\') + 1); // get editor directory
                    dir += "PluginInfo\\"; // add the new directory
                    DirectoryInfo dirinfo = new DirectoryInfo(dir);
                    if (!dirinfo.Exists) dirinfo.Create();
                }
                catch (Exception e)
                {
                    editor.GUIController.ShowMessage("Error reading AGS directory from system registry." +
                    " You must have a valid file association for AGF files to use this plugin.", MessageBoxIconType.Error);
                    return;
                }
                string fileName = dir + name + extension;
                FileInfo info = new FileInfo(fileName);
                FileStream stream = info.OpenWrite();
                // write file
                stream.Close();


All of which is working perfectly. My only concern is that it's depending on a value in the system registry which is usually registered by the installer (by default) but the key may not exist. Is there any way to write to the AGS directory without relying on this registry key?
#103
As per the subject line, I know I'm beating a dead horse with this, but I've been putting a lot of serious thought into it and I'm thinking that perhaps the idea wouldn't necessarily be as difficult to implement now as it once was.

One of the biggest concerns in any scripting environment allowing pointers is garbage collection. AGS does not currently support dynamic memory management aside from dynamic arrays. Strictly speaking this isn't a problem. We don't need dynamic memory to provide pointers so long as we can point a pointer to a static object in memory.

The only concern with garbage collection then would be that of what happens when the object the pointer is pointing to gets destroyed. I'm not sure how other languages handle this (I actually think the pointer would remain valid while pointing to junk memory) but the simplest route for AGS to take here would be for the pointers to be set to null.

This could actually be managed by creating a collection of all the pointers that had been created and then simply updating each pointer. If the object the pointer was pointing to had been destroyed and was no longer valid the pointer could be set to null and then even removed from the collection since it was no longer pointing to anything.

Another issue that has been mentioned is that of persisting the data in save games. If the aforementioned collection of pointers was implemented it presumably would not be any different to save the collection than it is saving pointers to AGS's managed types. These pointers to the managed types are already saved and persisted across save games as would be expected. So saving the collection of custom pointers could be managed the same way. The actual data of the object the pointer is pointing to is already being saved.

The final major issue that has been raised is that of actually creating the pointers. However, as of AGS 3.0 it is possible to create a pointer to a custom type. Any extender method declared on a custom type creates a this pointer dynamically at the time the method is called on an instance of the struct. So at this point we can create a pointer to an instance of a custom struct type, the only thing we can't do is store it anywhere.

If we try to create a pointer to our custom type we get the following error message:

QuoteError (line ###): Cannot declare pointer to non-managed type

Well obviously that's not entirely true since we know that the extender methods are creating pointers. The creation is possible, the issue is falling back to that of garbage collection which is the reason for the managed types. Our custom type isn't defined as a managed type so that means the garbage collection isn't being managed. Well what if we try to make it a managed type:

Code: ags
managed struct Pointer {
  int A;
  float B;
  String C;
};


But now we can't create an instance of this struct or else we get the following error:

QuoteError (line ###): Cannot declare local instance of managed type

Okay, so what if we make a derived type with our "managed" type as the base?

Code: ags
struct Instance extends Pointer {
};


We can now create an instance of the Instance type and use it as expected:

Code: ags
Instance instance;
instance.A = 42;
instance.B = 42.0;
instance.C = "42";


All of which works perfectly. Okay, so now to create a pointer to our "managed" type we need a pointer to the derived type. Let's try an extender method:

Code: ags
Pointer* GetPointer(this Instance*) {
  return this; // valid cast to base type from Instance* to Pointer*
}

Pointer *pointer = instance.GetPointer();


It compiles fine. But...when we run the game, we get another error:

QuoteError: Pointer cast failure: the object being pointed to is not in the managed object pool

Which actually...unfortunately...makes sense. Our instance isn't in the pool of objects marked for managed garbage collection.

So the way I'm looking at this now is that the only real issue keeping us from having pointers to custom types is the garbage collection issue. Again, I'm not suggesting that we have full dynamic memory in AGS. That would be a huge endeavor.

Instead I'm suggesting that a collection could be added internally to track non-managed pointers. If a pointer is set to point to an object that isn't in the managed pool the pointer could then be added to the collection of non-managed pointers. If the object they are pointing to is destroyed the pointers could then be updated to null.

To simplify my suggestion as much as possible, I'm not even asking that any changes would have to be made to the way we define a custom type. We could use the existing managed keyword to define that we want to define a pointer type as I have done above.

Ultimately the reason I'm asking for this is because it would be simpler to be able to do a pointer-cast to a base type than have to perform data conversion. The matter is made exponentially more difficult if you need to use methods of the base type and store the result back into the instance of the derived type.

Of course this talk all only bears relevance in terms of polymorphism which isn't technically a supported feature of AGS though it is possible.

Basically, I want to be able to do this:

Code: ags
managed struct BasePointer {
  import function DoSomething();
};

struct Base extends BasePointer {
  import BasePointer* GetPointer();
};

managed struct DerivedPointer extends Base {
};

struct Derived extends DerivedPointer {
};

DerivedPointer* GetPointer(this Derived*) {
  return this;
}

function BasePointer::DoSomething() {
  return 42;
}

function DoSomething(this DerivedPointer*) {
  BasePointer *base = this;
  int result = base.DoSomething();
  return result * 2;
}

Derived instance;
Display("%d", instance.DoSomething()); // displays 84
BasePointer *pointer = instance.GetPointer();
Display("%d", pointer.DoSomething()); // displays 42


Which all compiles fine but crashes at BasePointer *base = this;.

So what do you think CJ? Managed collection of non-managed pointers possible? Eh? Please? Pretty please? :=
#104
Advanced Technical Forum / Interest in regex?
Wed 06/01/2010 21:55:46
I've asked this before (years ago) in the AGS IRC but I didn't get a very large response. I've been working with regex lately and although I don't have much experience, I definitely understand how powerful it is and how beneficial it can be if you're doing any type of text parsing.

For those of you who don't know what regex is, it means "Regular Expressions" and is a special language used for searching and parsing through text. Wikipedia and the PHP documentation both have information on regex if you're interested in learning more. The reason I link the PHP documentation is because it's the best information on regex I've found. ;)

Regex works basically like String.IndexOf, String.StartsWith, and String.EndsWith but allows you total control over defining what you're looking for.

Say for example you wanted to have the player enter a full name such as "John Q. Smith". You could use IndexOf to check for two spaces and the full-stop/period. But what if the player entered numbers? This might be a rather obtuse example (::)) but regex can make the process simpler. With regex you might use a pattern such as:

Code: ags
[A-Za-z]+ [A-Za-z]\. [A-Za-z]+


Which tells it you're looking for any number of alphabetic characters (but at least one) followed by a space character followed by exactly one alphabetic character followed by a full-stop, another space, and then any number of alphabetic characters (but at least one).

If there are any numbers or other characters then a regex match would fail. As I said, this example might be a bit obtuse, but it gets the point across as to how powerful regex matching is.

My question then is whether there would be a reasonable amount of interest in having regex functionality in AGS. I imagine that particularly for those who want are wanting to or are implementing text parsers in their game it could open up worlds of possibility.

When I asked before scotch told me that if I thought regex was needed it would probably be easier for CJ to implement than for me to script. But what self-respecting programmer would ask another programmer to do something they could program themselves? ;D

Actually I don't think there would be a wide-spread call for regex in an adventure game, but again, I can see possibilities where it would be useful. So I opened up my old script and realized, I got a lot further than I remembered. So I updated the code a bit and now I have the following example code for testing:

Code: ags
function game_start() {
  String p = "...thisw --is--\\text --is-- \"some\" \\text.\\..text!";
  // NOTE: all matches are considered caseless (right now)
  Display("match \"\\c\": %d", Regex.Match(p, "\\c")); // displays 0
  Display("match \"--is--\[^\\-a-zA-Z]\": %d", Regex.Match(p, "--is--[^\\-a-zA-Z]")); // displays 9
  Display("match \"text\\.\": %d", Regex.Match(p, "text\\.")); // displays 36
  Display("match \"text\[^.]\": %d", Regex.Match(p, "text[^.]")); // displays 16
  Display("match \"\[^\\\\]text\[^.]\": %d", Regex.Match(p, "[^\\\\]text[^.]")); // displays 43
  Display("match \"\[W-g]\": %d", Regex.Match(p, "[W-g]")); // displays 7
  Display("match \"\[!-\\]]\": %d", Regex.Match(p, "[!-\\]]")); // displays 0
  Display("match \"\\w\[^\\Wthisw]\": %d", Regex.Match(p, "\\w[^\\Wthisw]")); // displays 16
  Display("match \"\[^\\\\]text\": %d", Regex.Match(p, "[^\\\\]text")); // displays 43
  Display("match \"\[a-z]\[a-z]\": %d", Regex.Match(p, "[a-z][a-z]")); // displays 3
  // speed test
  Display("starting speed test!");
  DateTime *now = DateTime.Now;
  int rt = now.RawTime;
  int i = 0;
  i = Regex.Match(p, "\\c");
  i = Regex.Match(p, "--is--[^\\-a-zA-Z]");
  i = Regex.Match(p, "text\\.");
  i = Regex.Match(p, "text[^.]");
  i = Regex.Match(p, "[^\\\\]text[^.]");
  i = Regex.Match(p, "[W-g]");
  i = Regex.Match(p, "[!-\\]]");
  i = Regex.Match(p, "\\w[^\\Wthisw]");
  i = Regex.Match(p, "[^\\\\]text");
  i = Regex.Match(p, "[a-z][a-z]");
  now = DateTime.Now;
  Display("Raw time difference: %d", now.RawTime - rt); // displays 0 - execution of 10 regex matches in under a second
}


As you can see from the commentation after finding all the pattern matches where expected (if you're interested in what the patterns do or why they match where they do feel free to ask) I performed a speed test and matched all 10 patterns (again) in under a single second. So my current implementation is reasonably efficient (it seems).

I still have to implement quantifiers and the vertical bar for alternative pattern matching...but is anybody interested in using something like this? :=
#105
So I was recently looking on Yahoo!'s Hot Jobs for jobs in my area and I came across a company named LAN/WAN Professional (lanwanprofessional.com) which is currently seeking participants in a Cisco Certification/Internship program. There is no entry level requirements aside from a serious desire to pursue a career in technology information and fronting the cost of the preliminary certification tests (approx. $850, to be reimbursed).

It starts with a 2 week training program to determine eligibility for the internship as well as to get the Cisco Certification. Even if I am determined ineligible for the internship they will still help to place me (within 2-8 weeks of the training) into an entry level position starting at approximately $24,000 annually (more than I have to date ever made annually).

If I do qualify, the internship is paid and at the end of the 1 year internship I can expect to be placed in a job making between $72,000 and $90,000 annually. With 2 years further experience I can expect to make between $120,000 and $150,000 annually.

Somehow this doesn't sound too bad to me. :=

Now I just have to figure out where to come up with $850...
#106
In response to this long-standing thread regarding a countdown timer, I've decided to go ahead and simplify the process by modularizing the code. With the countdown module you can easily create countdown timers up to 99 hours, 59 minutes, and 59 seconds (though this isn't a technical limitation, I just put it there for fun I guess).

You can also easily display the countdown on a label by formatting it such as:
H hours, M minutes, S seconds remaining...
Or any other format you might like. Maybe you prefer:
HH:MM:SS
instead? Well the format is highly customizable with 7 different tags that can be used, and aside from those you can put whatever text you like!

To take it a step further there are also some "TimesUp" events that are automatically triggered. Currently you can have a character announce that the time has run out (optionally using Display instead of Character.Say) and you can move the character to a new room (optionally specifying new co-ordinates). Once set up these events will automatically be fired off when the countdown runs out completely. I'd actually be interested to see if anybody else has ideas about other events you might like to see automatically triggered, so if you think of something let me know! :)

03 September 2010
Uploaded v1.1 with a bug fix for TimesUpText and TimesUpNewRoom which weren't working because they can't be called from repeatedly_execute_always. Thanks to Buckethead for noticing this bug..due to my own lack of testing. ;D

Download (Mirror)
View the manual online (Thanks RickJ for the Modox module!*)

Let me know what you think!

*Just to clarify this, I did use the Modox module v1.0, but I also highly modified/edited the output by hand. No offense to Rick, but the module is still in early stages, and I wanted to tweak things a bit.
#107
I did some digging around and back in 2005 CJ said:

Quote from: Pumaman on Mon 07/03/2005 19:21:03I was thinking about some sort of on_event_always function, which could be called for events like StartDialog, ENdDialog, StartDisplaySpeech, EndDisplaySpeech, etc and let you handle these things better in the script. That might be the cleanest long-term solution to this sort of thing.

There's also a related tracker entry. However, I wasn't able to find a proper thread for this suggestion anywhere, so here it is! :D

Those who are using custom dialog rendering (like myself) can already use dialog_options_get_dimensions as a workaround for eEventStartDialog. Those who are just using the built-in system might find the same functionality useful though.

Particularly the reason I'm suggesting this is the same as those who requested it back in 2005, to be able to hide/restore GUIs during dialogs. Beyond that I would also find it useful to be able to track the currently running dialog. I could work around this by simply duplicating code for every single dialog, but that's exactly the type of thing I'm trying to avoid. :P
#108
Short of just reposting the entire GIP thread over here, let me just tell you all that it's now been released! :=

That's right people! The moment you've been waiting for since practically forever has finally come! IWWHIIWWHITOMIROTPG: The Game! is finally here![/b]

There are still some things that I'd like to be able to do to this game, so there's a good chance that this might still be updated with changes in the future, but you've all been asking for it, so here it is:

Download (full game) (35.43 MB)
Download (no speech) (1.47 MB)
Speech file download (33.96 MB)
Alternate Download README
Mirror on MegaUpload (Thanks [ Arj0n ]!)

I included the game without speech for those either without speakers or who just simply prefer the game that way or have slower connections. The speech file is also available as a standalone download in case you grabbed the wrong file. Just put it in the same folder as the game.

Controls are:

Arrow keys/Num Pad/WASD: Movement
Left click: Interact/talk to/look at (interacts wherever applicable)
Right click: Look at
Ctrl+Q/Ctrl+C/Alt+X: Quit game

There's also been some rumours circulating about some type of "cheat codes" so keep an eye out for those as well.

Enjoy the game folks!

-monkey

And here's that same screenshot. I'll replace it...eventually. :P



I'm in your Games Database, NOMin' all your bandwidth.
#109
I Wonder What Happens In I Wonder What Happens In Tales of Monkey Island: Rise of the Pirate God

WARNING: THIS THREAD MAY CONTAIN SPOILERS FOR THE TALES OF MONKEY ISLAND GAME SERIES BY TELLTALE GAMES.

For those who don't know a certain member of the TellTale Games forums named Majus has become somewhat of a celebrity due to his "I Wonder What Happens In..." videos in which he makes comical speculations about upcoming episodes of Tales of Monkey Island. Due to the popularity of these videos and the impending end of this "season" of Tales, people have begun to ask, "When will 'I wonder what happens... 105' be released?" Based on the discussions in that thread there's been a lot of hype over an "I Wonder What Happens..." for Majus' upcoming video. There's even a thread full of awesome people who are planning a project similar to this one.

I do stress similar due to the fact that unlike what most people would expect from an IWWH...this is not in fact a video project. No, once I realized that people were serious about IWWHIIWWHITOMIROTPG, I decided to take a different approach to it. Something a bit more interactive.

So I quickly commissioned Ben304 to help me with this "super quick miniproject". Of course both of us being absurd as we are decided to take the thing far more seriously than entirely necessary, and it wasn't long before Ben had produced these:




This is a super awesome fan game of a fan video of a licensed game series based on characters created in an original game series from the '90s. :D


Current project members include:

monkey_05_06 (T, A) - Project lead, scripting, design, dialogues
Ben304 (A) - Graphics, testing, puzzle design
Maxilyah (T) - Voice acting (Morgan), testing, puzzle design, dialogues
Icedhope (T) - Voice acting (LeChuck, ###), testing
puzzlebox (T) - Voice acting (Elaine)
Secret Fawful (T) - Voice acting (Guybrush), testing
Calin Leafshade (A) - Voice acting (Winslow)
m0ds (A) - Music
hplikelike (T) - Sound Effects
Sylvr (A) - Testing
tbm1986 (T) - Testing
[ Arj0n ] (A) - BETA tester
Silverwolfpet (T, A) - BETA tester
Skarnet (T) - BETA tester
Gadesa (T) - BETA tester
Edward VanHelgen (T) - BETA tester

T - TellTale forum member, A - AGS forum member
Unless otherwise noted "testing" indicates testing during alpha development stage.

Credit for the original plotline of this game goes to StLouisRibs (T) who came up with this script, which was the concept from which this game was built. Mad props to StLouisRibs for this.

Oh, also this, from a PM:

Quote from: MajusHey monkey!

You are a hero! I think it’s brilliant that you want to make IWWHIIWWHITOMIROTPG, and what a chatchy short name!

Oh and in accordance with the rules ::)...

General plotliney thing:

For those who haven't been playing/following the Tales storyline, spoilers ensue.

In Episode 4: The Trial and Execution of Guybrush Threepwood, Guybrush is put on trial for heinous acts of piracy as well as ultimately for releasing a foul voodoo pox upon the Caribbean. The now reformed LeChuck steps in however and saves the day just before Guybrush is about to be sent to the gallows. But what's this? Just after Guybrush goes to in turn save Elaine from the evil clutches of the Marquis de Singe, LeChuck shows up and kills him!

In Episode 5: The Rise of the Pirate God we understand that Guybrush, having been "executed" by LeChuck is now sent to the land of the undead. How will he escape? How will he get back to the land of the living and save Elaine from who we now know really was evil all along, his arch-nemesis LeChuck? Who is this "Pirate God" that the title of Episode 5 references? What zany antics will Majus and his crew come up with in order to answer these questions?

Well, I can't speak for Majus or his crew, but it might go something like this...

It is time.

That's right people! The moment you've been waiting for since practically forever has finally come! IWWHIIWWHITOMIROTPG: The Game! is finally here!


There are still some things that I'd like to be able to do to this game, so there's a good chance that this might still be updated with changes in the future, but you've all been asking for it, so here it is:

Download (full game) (35.43 MB)
Download (no speech) (1.47 MB)
Speech file download (33.96 MB)

I included the game without speech for those either without speakers or who just simply prefer the game that way or have slower connections. The speech file is also available as a standalone download in case you grabbed the wrong file. Just put it in the same folder as the game.

Controls are:

Arrow keys/Num Pad/WASD: Movement
Left click: Interact/talk to/look at (interacts wherever applicable)
Right click: Look at
Ctrl+Q/Ctrl+C/Alt+X: Quit game

There's also been some rumours circulating about some type of "cheat codes" so keep an eye out for those as well.

Enjoy the game folks!

-monkey
#110
Okay so I searched in the forums and found this thread which linked to this tracker entry both of which are old.

My question is, has this changed? Is there a way to enable AA on a TTF font with LA style speech short of completely rendering the text myself. I ask coz it seems a bit funny that when the dialog options are displayed it works but the actual speech doesn't. :D
#111
Spin me a yarn of a fantastic tale be it dragons or mermaids or wombats prevailing, but keep it good fun for I do like to laugh, and keep it in mind to not be too daft. In crafting your stories the limits are wide, and spread far apart like the stars in the skies. From this day henceforth the count is fourteen until such time comes that the voters will spring and bear their judgments upon you so keep this in mind. Now gather 'round children, it's story time!

Format: Any type of fantasy (adventure and comedy elements = bonus points!)
Duration: 19 October 2009 - 11:59 PM CST (GMT -6:00) 02 November 2009

Voting will last for one week following the close of the entries.

Feel free to say it's a lame theme. I couldn't think of anything and didn't want to keep holding it up.
#112
I've only just noticed on my system that certain keys don't register with IsKeyPressed...ever. I know key combinations like Ctrl and Alt codes aren't supposed to register, but I'm finding that none of these do either:
[ eKeyOpenBracket
] eKeyCloseBracket
\ eKeyBackSlash
; eKeySemiColon
' eKeySingleQuote
, eKeyComma
. eKeyPeriod
/ eKeyForwardSlash
Is there a reason these keys don't register with IsKeyPressed? If it's possibly related I have this Logitech keyboard, though I doubt that's the case since on_key_press is still called normally.

The reason (specifically) why I'm asking is because it seems that you can't type an opening bracket into a textbox. I want to be able to do this. So I tried doing it manually by checking the raw state of the key and then appending the escaped character to the text...but it doesn't work!

Is there any way I can possibly type this character into a textbox?

Quote from: LOLIf you ask when the next version is coming out, you will be slapped silly with a moist trout.

Also when is the next version of AGS coming out already? :=

Edit by strazer:

Quote from: Pumaman on Sun 03/05/2009 15:34:47
Changes in 3.2 RC 2:
* Fixed IsKeyPressed not working with the following keys: [ ] \ ; ' , . /
#113
General Discussion / Google Voice
Mon 12/10/2009 18:17:57
While we're all up in arms over Google Wave, I thought I'd open up discussion for Google Voice (seeing as I didn't find anything about it when I did a search here).

"What is Google Voice," you ask? Well essentially when you sign up you give Google your phone numbers. Yes, I hear you now all screaming conspiracy. What Google does is they in turn assign you a new phone number. You can set this new number to route to all of your phones, specific lines, even filter and route specific callers. There's automatic call screening on this Google number so if it's a number you don't recognize you can find out who's calling before taking the call.

You can also send/receive SMS text messages using this number, get a textual transcript of your voicemail messages, conference calls together, etc. all for free.

You have to have the existing phone line(s) and it won't change the services you have available to you directly. For example if you don't have long distance calling on your home phone, this won't give it to you. However, for example, the call conferencing is handled by Google's servers and won't register as a conference call with your mobile carrier.

Two features I'm particularly excited about are "call switching" and "GOOG-411". Call switching gives you the ability, at the touch of a button, to transfer an active call from one of your phone lines to another. Say for example you answer a call on your cell phone but then realize you're burning up minutes and want to take it on the home line. At the touch of a button your house phone will ring, you can answer it, and the call will be transferred over! GOOG-411 as the name implies is directory assistance. That's completely free. :D They'll even connect the call at no charge.

I hear all you Google-haters now, but I'm not bothered. I already requested an invite. My old roommate already got his number. We tried out the VM-to-text feature. I, being a prick, left the voicemail message "Dick in your mouth." Which roughly translates into text form (according to Google anyway) as, "please, give me a rough." :=

P.S. Apple/AT&T has/have implemented measures to prevent Google Voice from being used on an iPhone.
#114
I'm pretty notorious for having a whole slew of conceptual ideas (each with its own respective project) which never see the light of day out in the real world. It just recently occurred to me that despite very few of these ever dealing with save game files, AGS always creates the save directory (if it doesn't exist).

Wouldn't it make more sense if the folder was only created if there wasn't something in it? Is that feasible? Difficult to implement? It's not something I'm too worried about, but it's more of an aesthetic/organizational issue just having a ton of empty folders lying around.
#115
I've been adding some custom extender methods onto the GUIControl type (for all GUIControl types) and I've noticed something. It seems that autocomplete doesn't detect the inheritance of extender methods. I could use the extender methods just fine, but they refused to show up in autocomplete. I even tried the fake-import-in-a-comment trick to no avail.

What I've had to do is actually overload the extender functions for each of the inherited types like:

Code: ags
void SetProperty(this Button*, int value) {
  GUIControl *gc = this;
  gc.SetProperty(value);
}

int GetProperty(this Button*) {
  GUIControl *gc = this;
  return gc.GetProperty();
}


My tests proved that the overloaded versions of the functions were actually getting called as well (which is actually interesting...::)).

However I'm just saying it would be nice if autocomplete could be made to detect the inheritance of my extender methods? Nothing high priority by any means though.

Edit: I corrected the overloaded functions to reflect I am calling the GUIControl method not the overloaded methods recursively... ::)

Edit 2: Somehow I completely failed to recognize at first that the fact that the overloaded functions were getting called is polymorphism. Which is nice. Please don't fix that Chris. :P
#116
I was just playing around with an idea to try and validate sprite numbers being passed into my functions when I thought, "I know, I'll check the SpriteHeight and SpriteWidth!" The problem is that Game.SpriteHeight and Game.SpriteWidth return 1 for a non-existent sprite. This makes it impossible to distinguish between a non-existent sprite and a 1x1 pixel sprite.

So I thought, perhaps I can see if I can generate a null DynamicSprite...no, if I pass an invalid sprite slot to that function the game crashes.

The biggest thing I was curious about was why these properties return 1 for non-existent sprites instead of the more logical 0? If the user is passing invalid sprite slots that's their problem anyway (:P) I was just trying to see what options I had to check for the existence of a specific sprite slot...which is apparently none except crashing the game means it's not there. ::)

Edit: I've updated this to "bug" status because I have yet to see any further information on it...? :-\
#117
Okay, perhaps I'm being a bit silly here, but I just had 3.1.2 installed, and I upgraded it to the latest beta. Neither version of the editor is giving the expected response.

This is literally the code I am using:

Code: ags
function on_key_press(eKeyCode keycode) {
  if (keycode == 'C') player.Say("BLAH BLAH BLAH!");
}

function repeatedly_execute_always() {
  if (player.Speaking) AbortGame("player speaking.");
}


The problem of course being that the game runs fine, no matter how many times I press the letter C. The player speaks normally and the AbortGame call is ignored...the Character.Speaking property as far as I can tell never returns true. ???
#118
My friend took me to see this movie and as we were walking out of the theater he asked what I thought of it. "It was decent for a movie I didn't pay to see."

I can fully appreciate the movie for what it is. It's entertainment.

However, on several points this movie...was a let-down for me.

For example:

Spoiler
The nanomites...they eat/destroy everything they come in contact with...yet there's absolutely no remains. Shouldn't there be some type of dust coming from this? I can't conceive of any scenario under which the matter would just completely stop existing.

How about the agent who dies when they blow up the car and then they take a neural scan. He was injected with specially trained nanomites...but why would they wait so long, up to the point that the Joes were actually able to recover anything, before they terminated the agent's remains?

Why was it that the warheads had to go through such extreme measures to become weaponized? If MARS was selling them to so many different powers...how many of them would even have the technology to perform the weaponization. Even MARS apparently didn't have the technology or they wouldn't have had to go and kill all those scientists, right?
[close]

I grew up watching the G.I. Joe cartoons, playing with the toys....and like I said, I can appreciate it for what it is. However,

Spoiler
If you're looking for any ounce of realism...or something that won't just flat insult your intelligence...
[close]

I wouldn't recommend this movie.

I'd give it a 2/5.
#119
I am being slightly sarcastic in saying this, but I didn't really ever think that I would under any circumstances have to deal with a computer plagued by viruses. The computer I am currently using to post this however has made its sole goal in life to prove me wrong.

Last night, no more than 24 hours ago this computer was working fine. Then suddenly about 5 or 6 hours ago I tried to get online. There was a valid connection...but...somehow...any page I would go to...all the links were broken.

I first was trying to sign into MySpace and Internet Explorer crashed fatally about 3 times (and then immediately recovered the tab bringing me back to the MySpace main site (not logged in)) before I said, fine I'll go somewhere else for a bit. To my surprise when I got there every link on the page was pointing to some "googleredirect.com" which would search for the text of the link with the actual link appended (URL encoded) at the end of the link.

"So," I said to myself,  "Microsoft is really pushing IE 8 then" because as this isn't my computer, I was using Internet Explorer. I went through the grievous task of installing IE8 which is no small feat by any means...and the issue persisted. So I booted into Safe Mode. Everything seemed okay. I went ahead and took the opportunity then to install Firefox.

Rebooted back in normal mode and..."WTF!" The issue persists even in Firefox. That's about when "Security Center" pops up and tells me that the computer has 12 viruses ranging from simple key loggers to Trojans, Worms, Backdoors...I did find this a bit suspicious considering I had no idea what "Security Center" was, although it was skinned to look like Norton...it wasn't Norton.

That's when I saw where it was proposing one of the viruses to be at..."\windows\system32\rundll32.dll", recommended action DELETE? "Okay," I told my mom at this point, "that's NOT Norton. That's a virus."

This was the point at which the desktop background got replaced by the text that "SPYWARE HAS BEEN DETECTED!" and all sorts of propaganda along those lines...

So in Safe Mode I was able to get Norton to run a scan...but remarkably it didn't find anything. I never trusted Norton anyway. Personally I use avast! Home and it's never lead me astray. Oh look, avast! found no less than 7 viruses (although none in the locations proposed by "Security Center").

There's still one item that I can't seem to get rid of. The file doesn't exist. I've looked (including in hidden AND system files). avast! tells me if I try to move it to the "chest" (quarantine) that "the maximum number of secrets" (emphasis mine) has been exceeded...uh...WTF is a "secret" in terms of a computer? And what does it have to do with a virus in a non-existent location?

Anyway I know there've been threads like this...I just felt like venting a bit. Having never had to deal with viruses before I can now say to those who have, "I feel your pain." Luckily despite everything that was wrong the system is recoverable; but only because I have a fair bit of knowledge working with computers...

The one item I mentioned not being able to get rid of has been labeled as "Rootkit" malware. I'm not sure what a rootkit is, but I did message avast! support for further assistance.
#120
In my experience the Game.GetFrameCountForLoop function does not detect the "Run next" setting for the loop at all. Presumably this is desirable. However, I was just wondering if it would be difficult for this to be automatically detected, perhaps by an optional parameter to avoid having to check if the loop exists, check the run next setting, and then finally sum up the frames for each of the included loops. If this is the same process the engine would ultimately have to use, then I guess you can just ignore this! :=

Of course, this does also make me question whether or not it would be desirable for such functionality to check if the specified loop is a "run next" loop itself... :-\ ...in the words of the Lolcats..."Iz confus."
SMF spam blocked by CleanTalk