Show Posts

You can view here all posts made by this member. Note that you can only see posts made in areas to which you currently have access.

Messages - Snarky

Pages: [1] 2 3 ... 302
Yeah, sorry, I have no clue either.

The Rumpus Room / Re: What's on TV?
« on: Yesterday at 18:26 »
Finally found the time to take some screenshots. This is an underappreciated gem:

(Don't cheat by Googling the phrase, OK?)

Modules & Plugins / Re: MODULE: TotalLipSync v0.5
« on: Yesterday at 08:45 »
Two more things...

ATM I'm using 120fps ('GameSpeed'), so I can use a AnimationDelay=1, and not -7 as it was before (on 40fps). I was told using negatives for AnimationSpeed, WalkSpeed, etc. was bad and 'unknowns'.

Code: Adventure Game Studio
  1. cJulius.ChangeView(1);          //julius
  2. cJulius.SpeechView=2;           //julius speech
  3. cJulius.AnimationSpeed=1;       //normal animation speed
  4. cJulius.SetWalkSpeed(7, 6);     //normal walk speed

...though I still use some negatives - for an old man:
Code: Adventure Game Studio
  1. cJulius.AnimationSpeed=0;               //old animation speed
  2. cJulius.SetWalkSpeed(1, 1);     //old walk speed

A. 0 is not a negative number.
B. At 120 fps, a 30-frame walkcycle will run 4 times a second. Since a cycle includes two footsteps, that's 8 footsteps/second. That seems faster than necessary.

Modules & Plugins / Re: MODULE: TotalLipSync v0.5
« on: Yesterday at 07:04 »
Hi Snarky,

The speech animation delay seems to be too slow for TotalLipSync - no matter what I set a characrs to (1, 5, -25, 30), it doesn't make a difference.
What Speech Animation Delay does TLS use?

TotalLipSync doesn't use animation delay: it reads the timing data from the sync files and displays the corresponding frame.

Problems could potentially occur if the computer can't run the game at the game speed you've set. The animation might then fall behind the speech. So...

ATM I'm using 120fps ('GameSpeed')

Film runs at 24 fps. A lot of cheaper animation runs at 12 fps, literally one tenth of the framerate you have set: you're showing ten frames for each one of theirs! AGS by default runs at 40 fps, which is plenty for a point-and-click game, and twitch-based games like FPSs aim for 60 fps, which is also how fast most monitors refresh. Which is all to say that 120 fps is an insane framerate for an adventure game.

More significantly: with a high-res game like yours, many (most) computers won't be able to keep up, and this could affect lip sync (and other sync situations).

so I can use a AnimationDelay=1, and not -7 as it was before (on 40fps). I was told using negatives for AnimationSpeed, WalkSpeed, etc. was bad and 'unknowns'.

No negatives have caused problems, but still.
I have 30frames walking for all characters.

Well, the "cure" is worse than the disease in this case. A better question might be, do you really need 30-frame walkcycles? If you cut it to 15 (every second frame) or even 10 (every third), do you lose noticeable quality?

How does Rhubarb do it's timing,[/b] considering it's file is in tenths of a second:

Code: Adventure Game Studio
  1. 0.00    A
  2. 0.50    F
  3. 0.83    C
  4. 0.90    G
  5. 0.97    A
  6. 1.05    B
  7. 1.53    A
  8. 1.61    C
  9. 1.80    B
  10. 1.87    X
  11. 2.38    X

Those are hundredths.

Try this:

Code: Adventure Game Studio
  1. #define ROOM_LIGHT 169
  2. #define HIGHLIGHTER 1957
  5. #define OFFSET_X 65
  6. #define OFFSET_Y 65
  8. int oldMouseX;
  9. int oldMouseY;
  10. bool wasOn=false;
  11. DynamicSprite* plainRoom;
  13. int abs(int x)
  14. {
  15.   if(x<0) return -x;
  16.   return x;
  17. }
  18. int min(int a, int b)
  19. {
  20.   if(a<b) return a;
  21.   return b;
  22. }
  24. void CandleLight(this Object*, InventoryItem* item)
  25. {
  26.   this.Visible = !player.HasInventory(item);
  27.   if(this.Visible)
  28.   {
  29.     int t = (abs(this.X - mouse.x) + abs(this.Y - mouse.y))/2;
  30.     this.Transparency = min(t, 100);
  31.   }
  32. }
  34. function room_RepExec()
  35. {
  36.   if(plainRoom == null)
  37.     plainRoom = DynamicSprite.CreateFromBackground();
  38.   if(CandleLit)
  39.   {    
  40.     if(!wasOn || oldMouseX != mouse.x || oldMouseY != mouse.y)  // We need to redraw
  41.     {
  42.       oCoin1.Candlelight(iCoin1W);                //set translucency of objects based on closeness to mouse/candle
  43.       oGoldIngot.Candlelight(iGoldBrick);         //set translucency of objects based on closeness to mouse/candle
  44.       oGoldPen.Candlelight(iGoldPen);             //set translucency of objects based on closeness to mouse/candle
  46.       DrawingSurface* roomSurface = Room.GetDrawingSurfaceForBackground();
  48.       if(wasOn) // Erase the highlight from last frame
  49.       {
  50.         DynamicSprite* eraseSprite = DynamicSprite.CreateFromExistingSprite(HIGHLIGHTER, false);
  51.         DrawingSurface* eraseSurface = eraseSprite.GetDrawingSurface();
  52.         eraseSurface.DrawImage(OFFSET_X - oldMouseX, OFFSET_Y - oldMouseY, plainRoom.Graphic);
  53.         eraseSurface.Release();
  54.         roomSurface.DrawImage(oldMouseX-OFFSET_X, oldMouseY-OFFSET_Y, eraseSprite.Graphic);
  55.         eraseSprite.Delete();
  56.       }
  58.       // Draw this highlight
  59.       DynamicSprite* highlightSprite = DynamicSprite.CreateFromExistingSprite(HIGHLIGHTER, true);
  60.       DrawingSurface* highlightSurface = highlightSprite.GetDrawingSurface();
  61.       highlightSurface.DrawImage(OFFSET_X - mouse.x, OFFSET_Y - mouse.y, ROOM_LIGHT);
  62.       highlightSprite.CopyTransparencyMask(HIGHLIGHTER);
  63.       highlightSurface.Release();
  65.       roomSurface.DrawImage(mouse.x-OFFSET_X, mouse.y-OFFSET_Y, highlightSprite.Graphic, HIGHLIGHT_TRANSPARENCY);    //copy to background
  66.       roomSurface.Release();
  67.       highlightSprite.Delete();
  69.     }
  70.   }
  71.   else if(wasOn) // Erase the highlight from last frame
  72.   {
  73.     oCoin1.Visible = false;
  74.     oGoldIngot.Visible = false;
  75.     oGoldPen.Visible = false;
  77.     DrawingSurface* roomSurface = Room.GetDrawingSurfaceForBackground();
  78.     DynamicSprite* eraseSprite = DynamicSprite.CreateFromExistingSprite(HIGHLIGHTER, false);
  79.     DrawingSurface* eraseSurface = eraseSprite.GetDrawingSurface();
  80.     eraseSurface.DrawImage(OFFSET_X - oldMouseX, OFFSET_Y - oldMouseY, plainRoom.Graphic);
  81.     eraseSurface.Release();
  82.     roomSurface.DrawImage(oldMouseX-OFFSET_X, oldMouseY-OFFSET_Y, eraseSprite.Graphic);
  83.     roomSurface.Release();
  84.     eraseSprite.Delete();
  85.   }
  87.   oldMouseX = mouse.x;
  88.   oldMouseY = mouse.y;
  89.   wasOn = CandleLit;
  90. }

AGS doesn't seem to have a very good way of making a copy of a small part of a sprite efficiently: you have to first copy the whole thing and then crop it, which is likely slow. I tried an alternative approach (creating a small sprite and drawing the larger sprite to it with a negative offset) just to see if it would work – I have no evidence that it is actually any faster. But I have added a couple of optimizations to eliminate unnecessary redrawing.

It's possible that this code could have a bug where if you leave the room while the highlight is on, when you return that highlight will still be there as a permanent part of the background. If so, just make plainRoom a global variable.

Also, I used your distance formula for the objects (just the mean of delta x and y, or half the Manhattan distance), but the cartesian distance calculation Khris gives is certainly more accurate and can be slotted in instead.

The obvious questions are what MusicVol.Value is, where its value is set, and if you've checked that it has the value you assume when you use it to set the channelMusic volume.

I actually think the trail effect is kinda cool, but the fixes for these problems are pretty simple. I don't have time right now, but if no one else responds I'll have a crack at it later today.

Hey, I got one vote last time!

No worries, there were a lot of strong entries.

I've got quite a few things to say about what people have said about my pitch as well. Most notably about how it would be filled with dead-ends and random solutions. But I'm going to refrain from doing that. As far as I'm concerned, people are right that it wouldn't work, but for the wrong reasons. So it doesn't matter. :-D

You could of course filter out dead ends, but you did write that the randomizing would be "making some puzzles impossible and others possible." The pitch reminded me a bit of Indiana Jones and His Desktop Adventures, which I always thought was incredibly boring and repetitive (like most randomly generated games), so that didn't really win me over.

But it sounds like a lot of these ideas are going into your Private Detective game, so I guess we'll see. Good luck!

The Rumpus Room / Re: Happy Birthday Thread!
« on: 17 Jun 2018, 18:22 »
Happy b-day Disco!

Snarky I liked yours ideas on both competitions, before the results revealed. There is some chemistry here, maybe we should cooperate!! :P

Yeah, if I can make time I would be interested. I've been here 15 years and don't have a completed game to show for it, not counting the Awards Ceremonies. A MAGS might be worth a shot.

The Rumpus Room / Re: What's on TV?
« on: 17 Jun 2018, 06:23 »
I think that's  Michael Ontkean (from Twin Peaks), and if so it's got to be The Rookies.

As for what's wrong with the code provided, one mistake is at line 98 in Time.asc:

Code: Adventure Game Studio
  1.    d.Year = rawdays / 365;

By the year 3200 there have been 800 - 32 + 8 = 776 leap days, more than two years (so I'm surprised that subtracting 1 is enough to give the right year at all).

I'm also highly dubious of the logic in lines 112 and 115:

   if (d.IsLeap()) rawdays = (rawdays - howmanyleapyears) % 366;
   else rawdays = (rawdays - howmanyleapyears) % 365;

I think you always have to do mod 365 here, because the question isn't how many days are in this year, but how many days are in the years that have gone by. I think doing mod 365 on the raw day count and then subtracting the number of leap days (or vice versa, as in the code) is convoluted but correct, but the other variation is straight up wrong. You would then have to do another check to make sure you're not on day 366 of a non-leapyear.

What do you need the int representation for, anyway? If you just want to store it, you could trivially encode it as

Code: Adventure Game Studio
  1.  int dateCode = this.Day + this.Month * 100 + this.Year * 10000; // Gives YYYYMMDD

And decode it as:

Code: Adventure Game Studio
  1.   int day = dateCode % 100;
  2.   int month = (datecode / 100) % 100;
  3.   int year = datecode / 10000;

No, I didn't mean it would be an entirely linear "one tomb at a time" experience, although you would gradually work your way deeper into the necropolis (and further back in time), generally speaking.

In my mind, the whole point of the ghost roads (which are a real thing: I was inspired by the Seonjeongneung tombs in Seoul, where a "spirit path" connects the king's tomb to his wife's, and a sign warns tourists "This is a sacred path. Keep off the royal tomb's spirit walkway.") is that they allow the ghosts to move around and interact with each other; and this would be an element of the gameplay. Andail actually edited out a link I had embedded in the phrase "crumbling network of ghost roads", which was meant to hint at a puzzle I have in mind where you would need to divert some of the connections between tombs in order to arrange confrontations between certain ghosts (a little bit like the mix-and-match AI personality puzzles in Technobabylon), among other things.

Also, thanks for the detailed comment Snarky. (nod) I was starting to think it was just such a crappy idea.

Hey, you got two votes, which is better than I did!

And on that note:

Then I think yours is the high school monster hunter one.
Nope. (wrong)

Then yours must be the Maniac Mansion randomly generated one. I'm glad you didn't mind the feedback, as I was quite critical of that one! (And mine, by process of exclusion, was #1: Haunts.)

Man, getting 0 votes sucks. It's one thing for something like a Background Blitz where you can always see flaws and areas to improve your technique, but a pitch is an idea almost in its purest form, before you've had a chance to screw it up in practice. I feel a bit like Mitch Hedberg when one of his jokes bombed: "I hate it when a joke doesn’t kill, you know? I thought it would get big laughs. All these jokes have been pre-approved as funny by me!"

Unlike in the last round, where the concept was plainly too ambitious to be a realistic project, my entry this round is an idea I might actually attempt. It's been pre-approved as awesome by me!

Without delving into the code (and I see that you've got the calculation from Stackoverflow, which would require further study), I'm guessing it's very likely to do with starting the month and day counts at 1 instead of 0. It messes with any calculations that use division or modulo.

Then I think yours is the high school monster hunter one.

General Discussion / Re: Incredibly sad news
« on: 11 Jun 2018, 21:39 »
I'm very sorry to hear that. All my sympathy to those who knew him.

Suicides are such a terrible waste. We as a society need to do a better job with prevention and treatment.

It’s fun trying to guess which one of Snarky’s feedbacks is for his own pitch. I’m thinking number 7.

Now that the poll has closed: (wrong)

Congrats to #7 and #3! I voted for 7 and 3 was my runner-up, so I can't complain about the results on that score...

I'm gonna guess #7 is Blondbraid (or maybe Mouth for War), #2 is Jojo, #4 is Danvzare, and #9 Gurok. But that's based purely on degree of similarity to last round's pitch, which might not be a good guidance.

The Rumpus Room / Re: *Guess the Movie Title*
« on: 10 Jun 2018, 14:57 »
Oh. Oh. Is it Emily Browning in the new image? I know it's not from a movie I've seen...
Oh right! Recognize her from American Gods...

Pages: [1] 2 3 ... 302