Please login or register.

Login with username, password and session length
Advanced search  

News:

For WME related articles and tutorials visit WME Resource Center.

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

Pages: 1 [2] 3
16
General Discussion / Re: #600 - The unofficial introduce-yourself thread
« on: August 18, 2007, 07:13:49 AM »
My name is Clark Kromenaker, and I'm a student at the University of Southern California studying Computer Science and Game Design, though I am originally from Wisconsin.  I'm 18 years old, and am currently working on a Wintermute project, as well as a website which I hope, when launched, will be successful enough to become profitable.  Besides being a website for my "studio" projects, I also want it to contain extensive tutorials and free resources (models, graphics, sound, etc) for games, websites, and other tech-related items.

Favorite adventures:

Gabriel Knight (all three, but I like the 3rd the most)
Riven
Space Quest (couldn't name just one)

I found Wintermute when, after constantly nagging on the AGS forum for features such as usable video playback, subtitles, and better volume controls, someone finally mentioned WM.  When I looked it up and started messing with it, I was shocked that it isn't more widely used.  Not only does it seem to have everything you need for a truly professional game, but it also seems to be so abstractly constructed as to allow for some widely varying game styles.  Well done. :)


17
Hey, as long as you maintain perspective, I'm alright with it. 

I think you've got a good start; it's really all in the details now.  I'm not sure if you're going for realistic or cartoony or what (talking about coloring here), but if you plan on having some kind of realism, I'd suggest you decide where your light sources will be and plan on adding something like a light, a window, or maybe just the computer glow. 

And something that was pretty cool in some older games was the foreground items...like, maybe right near the bottom of the screen, you can put some large books with one or two leaning...just like if the camera was behind some books on a shelf looking out at the room.  You certainly don't have to do this, but Gabriel Knight, for example, used it well to add some extra details to the scene and let the player know that there is a wall there.

But these ideas really only apply if you plan on developing your graphics in certain ways.  If you're going for a simplistic, minimalism style, these suggestions might not work.

18
Technical forum / Re: Window's Order
« on: August 17, 2007, 05:47:14 AM »
Well, what I'd expect is happening, if this only happens when you call a SceneChange, there is something which is causing your windows to either be loaded in the wrong order, or is simply messing up the z-indexes of the windows.

From my rather limited experience with these things, I would suggest the following, none of which I am sure will work.  ;D

1) The window object has several methods for setting the z-index of a window (MoveAfter, MoveBefore, MoveToTop, MoveToBottom).  If you aren't familiar with z-index, the easiest way to imagine it is papers on a desk. 

If there were a stack of papers on a desk, the one at the bottom would have a z-index of 0, and anything above it would have increasing numbers.  Lower numbers are under the object, and larger numbers are above the object.  So, an object with z-index of 5, for example, would display over anything with a z-index less than 5, but under anything with a z-index greater than 5.

So, you could devise a function/method that checks the NextSibling and PrevSibling properties of a window, and moves them with MoveAfter or MoveBefore to the right spots.  Unfortunately, I can't find a function or property that allows you to simply say "Window.z = 4;" for example.

2) If that doesn't sound too great, I'd ask you: are you loading the windows into new variables every time you change a scene?  If so, that may be causing the z-indexes to screw up with a scene change (though I'm very unsure about that) because of reinstantiated data.  Personally, I keep global variables for the more vital parts of my interface, so that I only have one instance of them floating around...it makes it much easier to maintain the object's properties, such as z-index, I'd imagine.

Though I have no experience with WM's window order, and this is all speculation, I hope you'll find it helpful.

19
Technical forum / Re: Window Problem?
« on: August 13, 2007, 11:56:44 PM »
When I need to close a window, I usually follow this sort of idea:

Code: [Select]
on "Back"
{
    LoadWin.Visible = false;
    Game.UnloadObject(LoadWin);
}

This is assuming that when you create the window you do something like this:

Code: [Select]
global LoadWin = Game.LoadWindow("interface/load/load.window");
LoadWin.Visible = true;

AND assuming that this is a load game window that will be used often throughout the entire game, I might also suggest that you make a global variable "LoadWin" in the "base.inc" file so that you have a single variable you use to hold a reference to the load window.

At least, that's how I would do it.

20
Game design / Re: Time in adventure games
« on: July 13, 2007, 09:21:35 PM »
Well, this topics been dormant for awhile, but...

The passage of time is sort of difficult to define in games...for example, Grand Theft Auto has their time, but regardless of the time, the game world stays almost completely static; it's almost only there because there would be complaints if it was always daylight.

And when you have a system like Zelda: Majora's Mask, it can be extremely frustrating and daunting for a player.  To start off, you already aren't sure what to do, but then you also have to do it at a specific time (which you also don't know)?  It can be so overwhelming as to drive a player away from a game.

I think the best system, especially for adventure games, is a hybrid between timeblocks and real-time.  If you consider what "time" is, it's just a measurement between what was then, and what is now.  Timeblocks allow the user to keep up with the game, not feel overwhelmed, and explore the environment at their own pace.  However, the standard adventure NPC will stand in one area, not doing much; for example, in Gabriel Knight 3, during a timeblock, the world is static - characters stay where they are. 

The real-time element would be that in a timeblock, characters move between scenes, they interact, they have some sort of intelligence.  This could certainly add to puzzle-solving difficulty.  Rather than you obviously needing to do something at the Church because characters are standing around there, it would take some deduction to realize this, because the characters might not always be there.  You'd have to catch them while they're there and do what needs to be done. 

So, in a nutshell, the best time system, and one I don't believe I've seen used, is one where clock-time is static between timeblocks, but the world is not.

21
Game announcements / Science Fiction - Announcement
« on: July 11, 2007, 07:57:50 AM »
CMK Studios and Clark Kromenaker present...
SCIENCE FICTION

Setting: A scifi-noir version of the 1950's.  Or, how people in the 1950's might have expected the future to be.

I've been working on the design document for this bad boy for a year.  I'm working hard to keep the puzzles as original, fair, and interesting as possible.  I'm using Blender to render my backgrounds.  I hope to make this game FMV, but if that doesn't work out, given my current monetary situation, I will use 3d character models.

The game's webpage.

and

Some backgrounds.

Presented in CinemaScope with (hopefully) FMV cutscenes for your enjoyment.
Coming to a computer screen near you, probably in 2-3 years.  Let the countdown begin!


22
Wintermute supports the use of Ogg Theora video files, which are very well compressed without losing much quality.  The problem I had was that none of the methods outlined anywhere I could find for converting an AVI/MOV file to Ogg Theora was actually working on a level I'd call "professional" - very frustrating.

The problem seemed to be this (as far as I could tell): though many utilities could convert AVI to Theora, they were often buggy and had strict requirements for successful transfers, and the most stable utility I've found - "ffmpeg2theora" - requires that the AVI use specific codecs for sound and video for the conversion to be successful.  Unfortunately, AVI seems to act only as a container for multiple combinations of Audio/Video codecs, making it difficult to get a video that uses the right stuff for conversion.

So, I've taken it upon myself to make this small guide ::).  This is the method I use to get Theora files into the engine that are small (a 2-min video file is 3MB-8MB, depending on resolution) and that work, as a big plus, with optional subtitles. 

Tools you'll need:

Rad Video Tools
Virtual Dub
ffmpeg2theora
SubtitlesK5ky (Subtitle Software)

And at least 10GB of free hard drive space (some temporary space for LARGE uncompressed video files).

What you need to do:

1) Open RadVideo.exe and select the source file in the browser.  Click the button "Convert a File".

2) Make sure to check both "Convert Video" and "Convert Audio".  Set the output file to "AVI File" and click "Convert".

3) When a Video Compression dialog pops up, choose "Full Frames (Uncompressed)" and hit OK.  Note that this new file will be VERY LARGE, probably in the 2-5Gb range or higher.

4) Run VirtualDub.exe and open the Uncompressed AVI file.  Here, you can use the "Video->Filters..." menu to fix up the video if needs be (resizing, contrast, grayscale, etc).  VirtualDub's resizing utility is particularly nice because it doesn't limit resolutions to DVD and movie resolutions like a lot of editing software does.

4b) If you plan on using subtitles, it is vital that you know how many frames per second the video file is, or the subtitles will show up at the wrong time.  Use "Video->Frame Rate..." to find the current frame rate or to change the frame rate (25 is easy to remember, but I IMAGINE changing it could cause the audio and video to unsync in some situations...though I have no proof of this, change at own risk).  If nothing else, write down the current frame rate to use later.

5) Be sure that the "Video->Compression..." has the "Uncompressed RGB" option selected and use "Save as AVI..." from the file menu to save it.  You can't overwrite your other file because virtual dub is still using it :P.  Depending on what you did to the file, the new file may be even larger.

(This is why you need so much hard drive space.  ;D)

6) "ffmpeg2theora.exe" is a drag-and-drop utility, so drag you're Uncompressed, Resized AVI file onto the icon and wait for it to convert.  It will automatically save a .OGG file in the same directory as the original.  The .OGG file will be very small by comparison; for a test run, I used a 100MB file...it is now 300kb with no noticeable visual or audio loss.  Nice!

(NOTE: .OGG files do not save the FPS (frames per second) in the property dialog...this can be important to know, so it might be a good idea to put the FPS in the comments section of the property dialog for future use.)

(At this point, the video file is ready to be used in the engine using the PlayTheora command.  However, the subtitle stuff is pretty cool, and will make your game that much more professional.)

7) Run "SubtitlesK5ky.exe" - this program is pretty bizarre, but it works - and use "Player->Open File..." to select the ogg file.  You'll need to switch to "All Files" to see the ogg file, but as long as you have the ogg codec installed, it will work.  When it asks for the number of frames per second, USE THE RIGHT NUMBER.  If you don't, the subtitles will display at the wrong time when you run it.

8) Basically, the "Compendium" window shows the entire sequence.  When you play the movie, there is a box at the bottom of the main window marked "Actual Frame:" - this shows the frame the video is on at any given point.  You put the "Actual Frame" values into the "From" and "To" text boxes.  For example, if a person in the movie starts saying "Hello" at frame 34 and ends at frame 45, you'd put 34 and 45 in the "From" and "To" boxes respectively, and then "Hello" into the subtitle box.  There are a lot of buttons, but the ones that you'll use a lot are the ones with two rectangles in them in the main window; these insert a new subtitle.  After you've inserted a few of subtitles, you can play back the movie and the subtitle will light up when it will show up during the movie, so you can be sure it works.

(NOTE: You can also do SUB files with a simple text editor.  To do the above in a text editor, you'd insert "{34}{45}Hello")
(NOTE: It's also a good idea to fill the frames you don't have anything displaying with a space, so that you know nothing will show when it's not supposed to)

An example .SUB file is as simple as:
{1}{1} 25                        <--The program author suggests that FPS is first line of the SUB for reference.
{2}{35}
{36}{50} Who's there?
{51}{80}
{81}{96} Hmm...must have been nothing.

9) When you're done, use "File->Save" and save it as a .SUB file in the same directory as the video.  The program will give you a message that basically says "You can't save until you register, unless you really have to." (WTF?) and then you can save. 


And you are done!  Play the ogg file in game, watch the subtitles show up on cue (unless you have them turned off) and pat yourself on the back.  Since the subtitles are a separate file and not part of the movie, they can be turned off and also translated into different languages for localization.  Sure, you might get away with just using ffmpeg2theora on everything, but chances are you'll get garbage, it won't be the right size, the audio won't work, or everything will be out of sync.  This method ensures that the converted file IS the original taking up less space. 

NOTE: And remember to delete those Uncompressed AVI files after the conversion, or you will be using a good 10GB for every file.  Not good.

I hope this was helpful, and have fun!

23
Technical forum / Re: Scrollbar - Button Code Question
« on: February 20, 2007, 02:16:49 AM »
Alright, I discovered the problem...I'm feeling a little stupid right now, btw.  ;D

I had previously done some messing around with the "on LeftClick" function in game.script...it wasn't distributing certain mouse clicks correctly.  But I think I've fixed it and it seems to work now.

Thanks for the help, guys.

24
Technical forum / Re: Scrollbar - Button Code Question
« on: February 19, 2007, 07:15:58 PM »
I put Game.Msg("Clicked"); in "LeftClick" and Game.Msg("Released"); in "LeftRelease"

When I click the button, nothing happens, and when I release, "Released" displays in the corner.  I put all my code from "LeftClick" into "LeftRelease" to see if the code itself worked, and it did when I released the mouse button.

So, it seems that "LeftClick" and "MusicSlider" are not being recognized by the engine as the events to go along with pressing the mouse button down, for whatever reason.  I'm at a loss, really.  :)

Any other ideas??

25
Technical forum / Re: Scrollbar - Button Code Question
« on: February 18, 2007, 02:11:27 AM »
Thanks for the responses, but the problem is persisting.  I removed the PARENT_NOTIFY and I renamed the event "on MusicSlider", but there was no difference.  To be sure that it wasn't my code, I put the code I had in "MusicSlider" into "LeftRelease" and it definitely responds...not correctly, but the response is there.

I guess I'll leave my code, which is really McCoy's code for the most part:

Code: [Select]
#include "scripts\base.inc"


var sfxSlider; //just to hold some values
var MoveButton; //if true, the button updates its position with the mouse position

sfxSlider.DecimalVolume = (Game.GetGlobalSFXVolume() / 100); //get the sfx volume as a decimal for later (0 - 1)
sfxSlider.CurVolume = Game.GetGlobalSFXVolume(); //get the sfx volume for later (0 - 100)
sfxSlider.MaxXPos = 683; //screen position where slider is at maximum
sfxSlider.MinXPos = 252; //screen position where slider is at minimum

//set the slider's current position to a point on the slider bar that represents the current volume
self.X = sfxSlider.MinXPos + ((sfxSlider.MaxXPos - sfxSlider.MinXPos) * sfxSlider.DecimalVolume);

on "MusicSlider"
{
    var parent = self.Parent; //reference to the window that holds the button
    MoveButton = true; //the button must update it's position
    Game.MouseY = parent.Y + self.Y + (self.Height / 2); //place the cursor in the (vertical) middle of the volume button/ticker
    sfxSlider.MouseY = Game.MouseY; //update the mouse position info in the variable
Game.SetMousePos(0,0);

//play the test sound (it's good to hear something while you are increasing or decreasing the volume)
    Game.PlaySound("interface\system\sfx.ogg",true);

//loop that updates the mouse position and the volume value
    while (MoveButton)
    { 
  //This is needed because the button has relative coordinates (relative to the window) and the mouse
      // has absolute coordinates (relative to the screen).
      sfxSlider.AbsoluteX = parent.X + self.X; //the absolute Y in the screen of the button.
  sfxSlider.AbsoluteY = parent.Y + self.Y; //same for X
 
   //if the button is between the desired limits (in the slider area on the background image)
      if(self.X <= sfxSlider.MaxXPos && self.X >= sfxSlider.MinXPos)
      {
        sfxSlider.oldMouseX = sfxSlider.MouseX; //save the old mouse position to get the difference with the actual position later
        sfxSlider.MouseX = Game.MouseX;      //save the actual mouse position 

//get the difference between the old position and the actual positionand update the button pos. accordingly
        self.X = self.X + (sfxSlider.MouseX - sfxSlider.oldMouseX);
       
//same for the volume value                     
        sfxSlider.DecimalVolume = sfxSlider.DecimalVolume - (sfxSlider.MouseY - sfxSlider.oldMouseY);
      }
 
      if(self.X > sfxSlider.MaxXPos) //keep the mouse cursor and the button within limits (right limit)
      { 
        self.X = sfxSlider.MaxXPos;
        Game.MouseY = sfxSlider.oldMouseY;
        sfxSlider.MouseY = Game.MouseY;
        sfxSlider.DecimalVolume = 100;
      }
      if(self.X < sfxSlider.MinXPos) //same for the left limit
      {
        self.Y = sfxSlider.MinXPos;
        Game.MouseY = sfxSlider.oldMouseY;
        sfxSlider.MouseY = Game.MouseY;
        sfxSlider.DecimalVolume = 0;
      }

      //these two ifs keep the mouse cursor between the top and bottom sides of the button/slider
      if (Game.MouseY > sfxSlider.AbsoluteY + self.Height - 2)
  {
    Game.MouseY = sfxSlider.AbsoluteY + self.Height - 2;
  }
      if (Game.MouseY < sfxSlider.AbsoluteY + 2)
  {
    Game.MouseY = sfxSlider.AbsoluteX + 2;
      }
 
      if (Game.MouseY != sfxSlider.AbsoluteY + (self.Height / 2)) //and this one to keep it in the vertical middle
      {
        Game.MouseY = sfxSlider.AbsoluteY + (self.Height / 2);
        sfxSlider.MouseY = Game.MouseY;
      }   
      Game.SetGlobalSFXVolume(sfxSlider.CurVolume);
      Sleep(1); //yeah, maybe too short sleep time, but, hey, this one is the only script running,
    }
}

on "LeftRelease"
{   
  //when the mouse button is released, stop the sound and stop updating
  //the button position
  Game.StopSound();   
  MoveButton = false;
}

Any other possibilities?

26
Technical forum / Scrollbar - Button Code Question
« on: February 16, 2007, 01:34:37 AM »
So, I'm trying to implement a scroll bar for volume controls.  I used McCoy's example to create what I think is workable, but I'm having trouble understanding where to put the code to have it execute.

This may be completely wrong, but I've created a script in my OptionsDialog folder called MusicSlider.script.  In the definition file for the options GUI, I have:

Code: [Select]
BUTTON
  {
    NAME = "MusicSlider"
IMAGE = "interface\OptionsDialog\scrollTicker_n.png"
IMAGE_HOVER = "interface\OptionsDialog\scrollTicker_h.png"
IMAGE_PRESS = "interface\OptionsDialog\scrollTicker_h.png"
SCRIPT = "interface\OptionsDialog\MusicSlider.script"
X = 252
Y = 93
PARENT_NOTIFY = TRUE;
  }

in MusicSlider.script, I have my code.  The problem I'm having is that the initial code (outside all "on" statements) executes fine, and the code in "on LeftRelease" works fine, but any code I have in on "LeftClick" just doesn't seem to run; when I click on the button, it doesn't move (or perform anything I have in the event), but when I release the button, it does. 

Do I just have the code in the wrong place, or am I missing something?


27
Technical forum / Forbidding Certain Keys in EDIT Box
« on: January 30, 2007, 01:37:45 AM »
Hi everyone,

I'm tweaking the save dialog and I noticed that if I type the "|" character into the edit box, it ends up causing a line break in the text.  Therefore, I would like to stop this key (among others) from being entered into the edit box for the save name.  I couldn't find a keycode for "|" and I'm not quite sure how I would implement this even if I did.

Any suggestions?

28
Technical forum / Re: "next" & "prev" possible bug
« on: January 29, 2007, 12:59:31 AM »
Ah, yes.  That has to be it.

Thanks for the speedy replies!

29
Technical forum / Re: "next" & "prev" possible bug
« on: January 28, 2007, 07:10:11 PM »
Sure; I have this in inventory.def:

Code: [Select]
INVENTORY_BOX
{
  ITEM_WIDTH = 65
  ITEM_HEIGHT = 65
  SPACING = 10
  SCROLL_BY = 1
  HIDE_SELECTED = FALSE

  AREA { 252, 0, 755, 90 }

  WINDOW
  {
    NAME = "Inventory"
    X = 0
    Y = 510
    WIDTH = 799
    HEIGHT = 90
    IMAGE = "interface\InventoryDialog\inv_background.png"
    MENU = FALSE
 
    BUTTON
    {
      NAME = "interactInv"
      IMAGE = "interface\InventoryDialog\interact_n.png"
      IMAGE_HOVER = "interface\InventoryDialog\interact_h.png"
      IMAGE_PRESS = "interface\InventoryDialog\interact_d.png"
      X = 0
      Y = 0
      PARENT_NOTIFY = TRUE
    }

    BUTTON
    {
      NAME = "lookInv"
      IMAGE = "interface\InventoryDialog\look_n.png"
      IMAGE_HOVER = "interface\InventoryDialog\look_h.png"
      IMAGE_PRESS = "interface\InventoryDialog\look_d.png"
      X = 84
      Y = 0
      PARENT_NOTIFY = TRUE
    }

    BUTTON
    {
      NAME = "pointerInv"
      IMAGE = "interface\InventoryDialog\pointer_n.png"
      IMAGE_HOVER = "interface\InventoryDialog\pointer_h.png"
      IMAGE_PRESS = "interface\InventoryDialog\pointer_d.png"
      X = 168
      Y = 0
      PARENT_NOTIFY = TRUE
    }

    BUTTON
    {
      NAME = "prev"
      IMAGE = "interface\InventoryDialog\arru_n.png"
      IMAGE_PRESS = "interface\InventoryDialog\arru_d.png"
      X = 755
      Y = 0
      PARENT_NOTIFY = TRUE
    }

    BUTTON
    {
      NAME = "next"
      IMAGE = "interface\InventoryDialog\arrd_n.png"
      IMAGE_PRESS = "interface\InventoryDialog\arrd_d.png"
      X = 755
      Y = 45
      PARENT_NOTIFY = TRUE
    }
  }
}

And if I rename the prev and next buttons to anything else, the button animation works, but as-is, it doesn't seem to respond.  Any ideas?? 

If there is a manual command for scrolling through the inventory besides using "next" and "prev", it would be easy enough to name them something else and then script the action in an "on" event statement.

30
Technical forum / "next" & "prev" possible bug
« on: January 27, 2007, 10:42:28 PM »
Sorry for posting so much, but I've really been slaving away at transferring my project to Wintermute and I may have come upon a small bug.

For the inventory object, I have two button objects to scroll through the inventory and these buttons use the IMAGE_PRESS property.  When the buttons are not named "prev" and "next", they work fine, but when I name the buttons appropriately, the button no longer switches to a pressed state when clicked.  This seems to only happen when the buttons are named "next" and "prev" (possible "close" as well, but I haven't tried). 


-Clark

Pages: 1 [2] 3

Page created in 0.048 seconds with 22 queries.