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

#621
General Discussion / Re: Rotoscope
Mon 06/12/2010 12:43:19
I have a book called Eadweard Muybridge's Life in Motion (I think, I haven't looked at it in a while) which has a lot of good references for motion. There might be a CD version, I'm not sure where, though. Look up Muybridge sometime, you'll get lots of sequences.

I don't really like rotoscoping, though. I find it gives results that are less lively than the original footage in most cases, or footage that's really mushy and indistinct. You need some great theatre actors to pull off rotoing them.

It's less pressing in low-res when you rotoscope (as shown by King's Quest, I believe, which used rotoscoping for the motion of it's actors), since there's no room for subtlety in there.

But, it's good practice.

Take your pick.
#622
Quote from: Studio3 on Wed 01/12/2010 00:12:36
I am not really trying to make the best game ever. I am ambitious though. I know some stuff I cant add to the game alone like the TPC feature, To complicated but I just hope to get done with a small part of this then release it for a small amount of time until the real game is finished.

Remember, the essence of a good game is that you trim away all that's unnecessary first, build a solid foundation, and add the meat on later.

There are several things you don't need in your game. TCP/IP, sophisticated AI (a list of randoms with maybe a few "IF HP < 50% THEN do this" things.... at it's most complex. Enemies in an OSD game don't really need that much AI, and it's hard enough to balance an rpg.) can go right off the bat. Who the heck would want to chat to other people using an in game messenger in a single player joke rpg? They could just play it in a window and use an instant messenger. Think about what the player needs rather than what you want to put in for the sake of putting it in. Just implementing an IM system... would be an undertaking unto itself. Too huge and cumbersome for something like this.

Remember, Maniac Mansion was created with like, three people, and it was revolutionary. You don't need huge teams to make a good game. In fact, if you're trying to make a game with a huge team without the knowledge of all these things yourself, you're just going to make a huge mess because of lack of experience and leadership skills, since leading a project is a skill in itself. Just make a fun game. Then, when you know more about game design from experience (enough not to try and add TCP/IP to everything), you can do your ambitious project. Right now, you might be too green to realistically do this.
#623
Quote from: mkennedy on Fri 19/11/2010 21:52:54
So will the game have character portraits? That would be a cool addition.

Only when really necessary, if at all. I really don't like the Sierra style portraits for talking, they take up a huge amount of screen real estate. But if I was to include them, I'd probably do it when the characters can't move or emote properly on screen (like if their back is turned in a matte).

There are portraits in the bottom right hand corner of the new GUI, to act as the "Use on Player" button. It'll also probably act as the character's general mood (ala IHNMAIMS). But not for talking.
#624
Quote from: Studio3 on Wed 17/11/2010 11:09:10
                                                               

Um, kind of missing the point of OSD, here. The thing is about the games as made by one or two people (like RON but with less canon continuity). OSD really isn't epic game material for huge teams. It's fun little games. You could do all these jobs yourself, and it would be no hassle to you. Don't think about ICP/IP, AI, background animation, or anything like that.

Just make a freaking game by yourself.. No matter how unprofessional it is, so long as it shows you put effort into it it doesn't matter (trying to improve on a personal level is good, though). We aren't a huge game company, and OSD is not a franchise you can milk for anything but laughs, we're just AGSers having fun :P Just next time, don't put long unskippable credits crediting Square Enix. That is a big nono.
#625
This is what all true warriors strive for.

Surprisingly enjoyable take on the Oceanspirit Dennis tale, with a good helping of humor and cliches played so straight it's fantastic. It really captures the JRPG opening scenes we've all come to know, but doesn't feel stale. It adds a new dimension without detracting from the rest of the canon.

Spoiler
The milkmaid job is the BEST job. Wiped out that slime in one hit! I would liked to have had a little bit of explaination on how Dennis fell off a hill into Hell, and I originally had thought the Soul Limit was the enemy's attack bar, and you had to beat him before it filled. But that's the way OSD rolls. Inpenetrable JRPG mechanics are der rigour, and encouraged.
[close]

In conclusion, it left me wanting more of this OSD experience.
#626
OutRun seems within our grasp now! Seriously, I didn't expect this much of a response. The code people are coming up with is truly a marvel.

Quote from: abstauber on Tue 09/11/2010 08:53:02
The internet never forgets :D

http://web.archive.org/web/20071109204800/http://www.gorenfeld.net/lou/pseudo/


Lou's version has hills and the archive has the code :=

It also seems to have double roads! Awesome. Great for nonlinear paths. This should be an invaluable resource. I wonder why he removed the code, though.
#627
The plot thickens into a creamy paste! I enjoyed this installment of Oceanspirit Dennis, it really keeps with the tone of the series as a whole, while adding to the canon seamlessly.

Spoiler
The battle is really, really hard! On average you recover less health than the enemies dish out in the round you use for recovery. But I suppose that's in keeping with OSD as a whole. ;)

And the addition of the new character is priceless.
[close]
#628
Quote from: Sslaxx on Sun 07/11/2010 19:08:05
Where does it say it's 3.2 only?

Opening the demo in 3.1.2 says so. Since it was probably made in 3.2. The code could most probably work in 3.1.2 (I would install 3.2 but I physically cannot on the computer I'm using, since I don't have admin privileges), but I can't open the demo in 3.1.2 to test it out and I didn't want to manually rip the code.
#629
This is EXACTLY what I was imagining when designing this part of my game. Thanks again Steve! You're absolutely amazing at this. I can't wait to get stuck in modding it for my game. I have just the way to design triggers for when curves and hills appear, too! (by syncing it to the soundtrack)

Unfortunately the only AGS version I have on me is 3.1.2 (I haven't upgraded my game to 3.2 simply because I didn't need the new functions yet) and the studio computers I'm using don't allow me to use the 3.2 installer! Woe. So I'll have to wait until I get my laptop/PC back before I can mess around with this code!
#630
Quote from: GarageGothic on Wed 03/11/2010 09:32:02
I worked on a half-finished project with a similar effect and found some really good explanations of various pseudo-3D effects used in racing games on this website. Not sure it will help with your specific problem, but I found it very useful.

Man, this is exactly the kind of thing I was trying to emulate. I especially like the effect used in Street Fighter II, too. I'd love to use that effect. Very awesome.  It makes my head ache so badly, though. It's kind of like a simpler raycasted environment thingy - should be pretty fast on ags since it works on lines rather than pixels. (and the pre-rendered perspective texture is better than the forced-mode 7 I was using previously) I can visualise the effect in my head but I just can't program it. I've never been very good at 3D stuff. x3 But if I can make AGS render on the Z plane that would probably be enough. Perhaps the fault lay with me using a flat top down image and trying to stretch it out rather than an using an already rendered perspective image and narrowing it down/shifting it.


Quote from: abstauber on Wed 03/11/2010 10:00:02
I desperately hope, your minigame finds it's way back as a module after you've released Disk2 ;)
I plan to release all the non-game specific code alongside my game, so everyone can use the effects I used in my game. :)
Quote
Anyway, I did some research back then and here are the links.

RickJ started with something similar, called DemoCycle.
http://demo.agspace.ws/project/archive/DemoCycle-A0100.zip

Unfortunately it doesn't feature hills, curves or different roads.
I had a look at it. It's a really nice faked effect of a faked effect.  Had just about the gameplay I was looking for, but the road is a static animation. And the 2.72 code looks so clunky in comparison with 3.xes code now! I can't believe I held off learning 3.x so long.

Quote
For a nice mode7 effect, you should take a look at AGS3d, which does a beautiful job.

Unfortunately, that would require me to use a plugin, and as much as I'd like to put real 3D rendering in my game, I just don't feel like using a plugin for something like this is necessary. I want to tax AGS to it's limits using only the features presented in AGS.
#631
I've been working on another part of my game, and I want to create a Mode-7 type effect for a driving sequence in the game.

Unfortunately, I'm not actually that good at maths, so the render ends up looking like this:



My code is:
Code: ags
// room script file
DynamicSprite *roadspr;
DynamicSprite *camera;
DynamicSprite *tmpline;
int charposx = 149, charposy = 1382;
int viewwidth = 128;
int viewangle;

function room_Load()
{
  Mouse.SetBounds (131, 50, 165, 52);
SetViewport (0, 0);
}

function repeatedly_execute_always ()
{
SetViewport (0, 0);
charposx = mouse.x;
if (charposy > (viewwidth>>1) + 1) charposy-=2;
else charposy = 1400;
roadspr = DynamicSprite.CreateFromBackground ();
roadspr.Crop (charposx-viewwidth, charposy-viewwidth/2, viewwidth * 2, viewwidth);
int i;
camera = DynamicSprite.Create (320, viewwidth/2, false);
camera.ChangeCanvasSize (320, viewwidth, 0, 0);
DrawingSurface *surface = camera.GetDrawingSurface ();
while (i < viewwidth)
{
  tmpline = DynamicSprite.CreateFromExistingSprite (roadspr.Graphic, false);
  tmpline.Crop (i, i, (viewwidth * 2) - (i*2), 1);
  surface.DrawImage (0, i, tmpline.Graphic, 0, 320, 1);
  i++;
}
surface.Release ();
camera.Resize (320, 150);
oRoad.Graphic = camera.Graphic;



I know I'm probably supposed to put in a curve instead of a straight slope, but I can't for the life of me figure out how to do it. Can anyone lend a hand? I want to make the road much narrower when it goes away from the player, and the curve turn into a straight line.
#632
Quote from: SteveMcCrea on Sun 31/10/2010 23:14:25
Hooray, it worked! Looks good...

Presumably you're going to write the data in the CLUTs to a text file and just read that in on start up - although even that would take a second or two.

To avoid any kind of start up delay, the best way might be to draw each CLUT in a 256x256 dynamic sprite, then write them out and read them in on start up. Should be instantaneous. Instead of looking up clut.data[256*x + y] you'd get the DrawingSurface for the CLUT sprite and use ds.GetPixel(x, y).

Hey, that's a good idea. I was thinking about how to compress the CLUTs, since in all each room would take up 512k uncompressed (by having 9 levels of transparency). By making them sprites, it avoids this and stops me from having to litter the game folder with files. (I could probably just save them out and reimport them into AGS, with folders it should make everything much cleaner) I'll work out the logistics tomorrow.

Thanks again!
#633
Wow, that CLUT generation code is beautiful! It's even faster than the one I used, and it even works beautifully. It is a masterpiece.

There's no perceptable slowdown once the actual CLUT is generated (which takes about 5 minutes when you include Wait (1)s for realtime update, longer than the plugin, but more accurate and less green-biased.)

This is what I have so far:
http://img201.imageshack.us/img201/2451/transtest.png
Looks like I'll be adjusting the double buffer next :) The characters are being drawn too far up.

EDIT:



All done! Now everything is in readiness.
#634
I think he needs more ridiculous hair. AFAIK, Dennis has these huge bangs, and toning it down just makes him look less like OSD and more... generic? I do like how you turned his shorts into a low cut brazier, though. That really shone through for me as part of the design. His gloves don't really fit (OSD wears bracers, after all), and the suspenders could use a little more tension in them. Right now they look like they're stuck to his chest. I know it's your version, but it helps to keep the iconic bits of the original design to make it more recognisable, even if you spin them in a way that makes them different (like the shorts-brazier thing.)
#635
I have given up trying to use Towner's version, so I rewrote my own colour finder based on the euclidean distance between the two target colours.

Findbestcolour simply finds the total distance between the rgb values of the "ideal" blended value and the actual palette entries and seeks out the one with the lowest difference, and returns that palette index. For some reason it is always returning 0.



Code: ags
function noloopcheck GFX_FindBestColor(int R1, int G1, int B1)
{
int output [256];
int best = 0;
int i;
float prepf;
int prep;
	while (i < 255)
		{	
    prep = (R1-palette[i].r) * (R1-palette[i].r) + (B1-palette[i].b) * (B1-palette[i].b) + (G1-palette[i].g) * (G1-palette[i].g);
    prepf = Maths.Sqrt (IntToFloat (prep));
    output [i] = FloatToInt (prepf, eRoundNearest);
			i++;
		}
  i=0;
	while (i < 255)
		{
			if (output[i] < output [best])
			{
				best = i;
			}
			i++;
		}
	return best;
 }


Code: ags
function noloopcheck GFX_CreateTransTable(int alpha,  char clutnum)
{
  int index = 0, index2 = 0;
  int idealr;
  int idealb;
  int idealg;

  while (index<255) 
  {
       while (index2<255) {
            /* Mix the two colors together based on the alpha */
            idealr = FloatToInt (IntToFloat ((palette[index].r + palette[index2].r)) * (IntToFloat (alpha) / 100.0));

            idealb = FloatToInt (IntToFloat ((palette[index].b + palette[index2].b)) * (IntToFloat (alpha) / 100.0));
            
            idealg = FloatToInt (IntToFloat((palette[index].g + palette[index2].g)) * (IntToFloat (alpha) / 100.0));

            /* Store the blended color into the translucency clut */
            rgblbl.Text = String.Format ("%d %d %d",idealr, idealb, idealg);
            Wait (1);
            clut[clutnum].data[index * 256 + index2] = GFX_FindBestColor(idealr, idealg, idealb);
            index2++;
            lblGameTitle.Text = String.Format ("%d,%d : %d",index2, index, clut[clutnum].data[index * 256 + index2]);
            Wait (1);
       }
   index2=0;
   index++;
  }
}


But, again, it is only returning 0, after returning 64 for palette index 0 itself. I am not actually sure what's going wrong, since it all looks right to me.
(And strangely, it accepted and compiled the script when it had the wrong struct definition. GFXClut_t doesn't haveare b and g variables, but it still compiled.)
#636
Quote from: Ascovel on Sun 24/10/2010 21:39:25
All the improvements look great - remarkable attention to detail.

Just don't kill yourself with all that subtle animation work - I don't think even games like Day of The Tentacle or Full Throttle had walkcycles this carefully animated.

Well, these are walk cycles, they need lots of subtleties to make sure the player doesn't get bored of it. And I want to impress people, too. Just going through the motions (heh) isn't enough.

Talking of, here's an improvement on the worst animation that was in Disk 1, Jakob's forward walk!
#637
A lot of these suggestions are really cool. I can't wait to see what's gonna come out of this!

Personally, I would like to see:
- An improved palette editor, maybe room specific. I'd like to be able to view my palette from within AGS.
- More elegant sprite importing for 8-bit sprites. GIF animations never have a "don't remap colours" option, so importing a massive amount of sprites is arduous, especially if they're room specific.

And that's all I can think of for now. AGS is pretty elegant otherwise for me.
#638
Quote from: Gilbet V7000a on Wed 27/10/2010 14:04:18
I never tried to really read your codes in-depth, but one thing I've noticed is that:
Quote from: Scavenger on Wed 27/10/2010 01:12:20
Code: ags

          colorDifLut[128+i] = colorDifLut[128+128-i] = i2 * (30 * 30);

became:
Code: ags

          colorDifLut[127+i]     =  i2 * (30 * 30);
          colorDifLut[127+128-i] =  i2 * (30 * 30);

There're a number of instances where 128 in the original codes being changed to 127 (and 256 being changed to 255 too). Is that necessary?

That was a dirty, dirty hack because if they were the original values, I would get out of bounds errors, and since I don't understand exactly what's going on in the code, I just decremented every top value by 1. If I increased the size of the array from 354 to 355 instead, I don't get the anomalies, I simply get Index 0 all the way down the board.
#639
Quote from: Wyz on Wed 27/10/2010 01:42:37
The conversions look flawless; since the blue cup is incidentally sprite number 0 I guess somewhere in your code the target graphic gets set to 0. I had a look at it but that's a lot of code. Maybe you can recall what portions you edited the last, or you might ask yourself why it has the value 0. That kind of questions often help me debugging.

Thanks! With that in mind, I have progress! There is no longer a blitted blue cup, instead there is transparent space!

So, I dumped the contents of my CLUT for several levels of transparency, and it revealed it was a vast wasteland of Index 0 (with a couple of anomalies). Something has gone terribly wrong. It's not the blitting, but the CLUT generation itself. If it helps:
- The CLUT is generated Before Fade In. It works pretty well for the colourisation function, so I assumed the palette is untouched.
- There are eight levels of CLUT generated, with this algorithm:
Code: ags
    i = 1;
    int j;
    while (i < 8)
    {
      j = i+1 * 32;
      GFX_CreateTransTable (j,  i);
      i++;
    }


It's really frustrating, because it means I interpreted the CLUT generation code wrong. Does anyone have a working function that doesn't have arcane syntax like this one?
#640
So I've been trying to implement lots of fancy graphical functions into my game, while I wait for my team to get back to me on the game's plot.

I've implemented colourisation pretty easily, and it showed that in 8-bit graphics mode, Get/PutPixel is actually pretty fast. So I tried to make a translucency for objects and special effects, but it seems to have gone belly up. Any object that's blitted in this manner simply turns into a blue cup, and the output I get from ripping the end result is just palette index 0 all the time.

I think it might have been my shoddy attempt at converting this code to AGSScript.

Notably:

Code: ags
     for (i=0; i<64; i++) {
          int i2 = i * i;
          colorDifLut[0  +i] = colorDifLut[0  +128-i] = i2 * (59 * 59);
          colorDifLut[128+i] = colorDifLut[128+128-i] = i2 * (30 * 30);
          colorDifLut[256+i] = colorDifLut[256+128-i] = i2 * (11 * 11);
          }
     }

became:
Code: ags
while (i<64) 
     {
          i2 = i * i;
          colorDifLut[0  +i]     =  i2 * (59 * 59);
          colorDifLut[127+i]     =  i2 * (30 * 30);
          colorDifLut[255+i]     =  i2 * (11 * 11);
          colorDifLut[0  +128-i] =  i2 * (59 * 59);
          colorDifLut[127+128-i] =  i2 * (30 * 30);
          colorDifLut[255+128-i] =  i2 * (11 * 11);
          i++;
     }


and
Code: ags
 for (i=0; i<256; i++) {
     colorDif = colorDifLut[(pal[i].g - g) & 0x7F];
     if (colorDif < lowest) {
          colorDif += (colorDifLut+128)[(pal[i].r -are) & 0x7F];
          if (colorDif < lowest) {
               colorDif += (colorDifLut+256)[(pal[i].b - b) & 0x7F];
               if (colorDif < lowest) {
                    bestMatch = i;
                    if (colorDif == 0)
                         return bestMatch;
                    else
                         lowest = colorDif;
                    }
               }
          }
     }


became:

Code: ags
while (i<256) 
 {
     colorDif = colorDifLut[(palette[i].g - g) & 127];
     if (colorDif < lowest) {
          colorDif += colorDifLut[128+((palette[i].r -are) & 127)];
          if (colorDif < lowest) {
               colorDif += colorDifLut[256+((palette[i].b - b) & 127)];
               if (colorDif < lowest) {
                    bestMatch = i;
                    if (colorDif == 0)
                         return bestMatch;
                    else
                         lowest = colorDif;
                    }
               }
          }
          i++;
 }


I was simply guessing the syntax, since I have never seen syntax like that before in my life. If only I could get it to work, I am so close I can taste it.

If anyone wants to have a go at it, I uploaded the game here. I am way, way out of my league here. If it works correctly, the Zipdisk at the right of the room should render semitransparent. As it is now, it renders a blue cup.

Thanks guys. Sorry for always posting on this subject. x3 At least you get to see some other stuff I've been working on.
SMF spam blocked by CleanTalk