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

#21
Code: ags
int DC_UP[33];
int DC_DOWN[33];
int DC_LEFT[33];
int DC_RIGHT[33];

DC_UP[0]=0;     <---ERROR
DC_DOWN[0]=1;


error: room41.asc(6): Error (line 6): Parse error: unexpected 'DC_UP'

:/
#22
Character has Loop as non-readonly, and also has FaceDirection(eDirectionXXX) - how do I do this with an Object?
#23
I want to check a collision (or overlap) between my character and the 'borders' of the maze (ie. the walls). I've run out of objects (40 used) so I must use the object that represents the maze 'board' - with transparencies to move through.
How is this possible?
My main character has hardly any transparency around edges, but obviously the maze image has lots through and around it.
Would I better of using and detecting walkable areas drawn where the 'solid' bits of the maze are?
#24
I've started a Pacman-like 'minigame' on an 'arcade machine' in whick a Tank (you) - using arrow keys to get around the maze - is following crowds (AI/enemies). Your mission - to crush the protesting crowds before a) the timer runs out and/or b) before they destroy your tank from behind with molatovs.

I've come up with I think a reasonable strategy or programming the crowds where to go; there are 10-15 types of hotspot, each with the directions a crowd can choose to go in (UpLeft, DownRight, UpLeftDown, etc.), pasted over all corners of the maze. They can then go in one of the directions, depending on which way the Tank is, and which direction he's going in (towards=fear, away=attack).

Only problem is:
-I don't know if this is actually a crap strategy
-and I don't know how you get anything but an object interacting with another object. You can get a character 'sandng on' a hotspot, but not an object.

There's a limit of 40 on-screen objects; yet if I put in 'decision cube' sprites with objects to replace the hotspots, there's waaaay more than 40 (about 75?).

Pls halp I don't know wha I'm doing :/
#25
Looking to automate my build process.

(You know - type less :)
#26
error:

__DialogScripts.asc(129): Error (line 129): incorrectly terminated character constant

There is no dialogue script (probably internal); there's no information on the error; altering the changed dialogs (like removing their contents and then recompiling) gives me nothing; what the hell does this error mean? How do I solve it without looking through every lines of every one of my 50 dialogues searching for a double " at the end of a line?
#27
I have blue, red, green and black.
If I pick eg. black for my first choice, my second colour must be any colour *but* black.
What's a nice algorithm that takes up five lines and doesn't involve a for loop? (which could, however unlikely, take an inordinate or infinite time to calculate)
#28
It's definitely not sierra - but that's all I remember.
What script file does it affect? Is it viewable, changeable?
#29
I have the following code:

Code: ags
function repeatedly_execute_always()
{
  mouse.Update(); //update the position of the mouse hopefully this tick
  ...


Code: ags
function UpdateMouseGraphic()
{
...
if (gInventory.Visible) {                                      //looking at an icon IN THE INVENTORY
      if (mouse.y >= 175 && (mouse.x <= 180 || mouse.x >= 1170) && !JustHitTabInv) {
        gInventory.Visible = false;
          if (player.ActiveInventory==null)
            mouse.Mode = PreviousMouseModeOutsideInventory;
        return;
      }
    ...


Code: ags
function on_key_press(eKeyCode keycode)
{
...
if (keycode == eKeyTab) {
    if (!gInventory.Visible) {
      mouse.SetPosition(400, 350);
      mouse.Update();          <--- plus there's this, still does nothing
      gInventory.Visible=true;
      PreviousMouseModeOutsideInventory=mouse.Mode;
      mouse.Mode=eModeLookat;
      JustHitTabInv=true;
    } else{
      gInventory.Visible=false;
    }
  }
...


When I hit TAB, the first function to run is on_key_press(). It correctly sets the position of my cursor; inventory comes up; since the mouse isn't now beyond the 'outside border' of the inventory, the inventory remains open.
The next functions to run are repeatedly_execute_always() and UpdateMouseGraphic(). mouse.update() get's run at least 40 times before any change to mouse position happens.

Then, I move the mouse slightly upward; it returns to it's original position down in the far-left -- having never updated the variables for mouse position I set 500 times in the last few seconds -- the cursor moves instantly outside the inventory GUI, and the GUI disappears.


...wtf?
How can I get the mouse to just update and remember it's position?
#30
eEventRestoreGame will trigger *after* the restore game function is finished - this is useful since normally you have to wait for the function containing the RestoreGameSlot() to finish, meaning you can't check the end result without a switch.
But why not eEventSavedGame? This would be perfect for a savegame rather than uses of switches and timers to generally guess when it's over.
#31
There’s a text list box with limited functionality, but I was wondering if there’s a scrollable canvas that I can put button and graphics on? For my graphical save games list.
#32
I had a tester tell me that you can only save 50 games - is this true?
I don't know why anyone would need more than.... 1 save game (for an adventure game)... but each to his own.
#33
I've got the following code:

Code: ags

function repeatedly_execute_always()
{  

...

  int gFloatingText_X=0;
  int gFloatingText_Y=0;
  
  // Position the floating text
  if (ConversationIsOn) {
    gFloatingText.X = 0;
    gFloatingText.Y = 120;
  } else {
    if (mouse.Mode==eModeInteract) {
      if ((gFloatingText.X+gFloatingText.Width)>SCREEN_WIDTH) {
        Display("changing x for interact...");
        gFloatingText_X = mouse.x - 64 - 5 - gFloatingText.Width;   //past right-hand edge
        Display("changed x for interact, it is now %d",gFloatingText_X);
        gFloatingText_Y = mouse.y-30;      
      } else {
        gFloatingText_X = mouse.x+17;   
        gFloatingText_Y = mouse.y-30;      
      }
    } else {
      if ((gFloatingText.X+gFloatingText.Width)>SCREEN_WIDTH) {       //<--THIS CODE BLOCK RUNS.....
        Display("changing x for any mode but interact...");
        gFloatingText_X = mouse.x - 64 - gFloatingText.Width;  //past right-hand edge
        Display("TEMP VAR changed x for any mode but interact, it is now %d",gFloatingText_X);
        Display("1 gfloatingtext x is %d",gFloatingText_X);
        gFloatingText_Y = mouse.y-18;
      } else {
        gFloatingText_X = mouse.x;
        gFloatingText_Y = mouse.y-18;
      }
    }
  }
  if ((gFloatingText.X+gFloatingText.Width)>SCREEN_WIDTH) Display("BEFORE ASSIGNMENT TO .X gfloatingtext x is %d from %d",gFloatingText_X,  gFloatingText.X);
  
  gFloatingText.X=gFloatingText_X;
  gFloatingText.Y=gFloatingText_Y;
  
  if ((gFloatingText.X+gFloatingText.Width)>SCREEN_WIDTH) Display("MIDDLE gfloatingtext x is %d from %d",gFloatingText_X, gFloatingText.X);

...


It's godawful, and part of positioning the gFloatingText window on the right or left side of mouse curspr depending on if it's off the right-edge of the screen; this window acts as vessel for some text that displays the Name/'Description' of what's at mouse.x,mouse.y
go here for more context and pictures: https://www.adventuregamestudio.co.uk/forums/index.php?topic=59107.0

The important point about this code is: the gFloatingText window doesn't have it's .X/.Y pos controlled by anything else; yet it keeps resetting, and seemingly setting things on the other side of assignment.

So:
I've searched the code; none of it has 'gFloatingText.X=' in it, except code which isn't run.
I've checked if it's some sort of scoping thing (ie. it will remember the value in an IF statement, but will lose it and go back to before once this branch ends), but it doesn't seem to be.

The Variables are:
gFloatingText_X is a temp int var, declared outside the major block of code, so to hold the new value until it's assigned to gFloatingText.X
gFloatingText.X, which is the top-left-corner 'x' coordinate of a GUI
SCREEN_WIDTH is a #define for the number 1366
ConversationIsOn which is always 'false' for this example

The example OUTPUT is:
changing x for any mode but interact...
TEMP VAR changed x for any mode but interact, it is now 1064.  <--- not yet, this is only for temp variable gFloatingText_X
1 gfloatingtext x is 1064.    <-- text has now flipped to left side of mouse, as it should, because there's no room left on the right
BEFORE ASSIGNMENT TO .X gfloatingtext x is 1064 from 1255   <-- temp variable is new 1064, the .X GUI coordinate is 1255
MIDDLE gfloating text is 1255 from 1255. <-- both .X and _X are now what .X was 1 line ago, even though it was on the left side of assignment....wtf

How it should go:
gFloatingText.X=5;
---> it's now equal to 5, for now and forever until it's assigned a new value.
Why is this happening?

Please feel free to throw any help at this, or choose from the following:
a) 'bx83, you've missed out a semi-colon/mistaken X for Y/have this line assigning the var incorrectly like *right there* on the screen! *rolls eyes*'
b) 'I recognise this from the SetFloatingText function https://www.adventuregamestudio.co.uk/forums/index.php?topic=59107.0, and it's all to do with a component I set up deep in the system to always have gFloatingText.X=mouse.x, or some clever binding you've never heard of'
c) 'I am fascinated by this bug and will add it to the engine 3.5.0.31' (unlikely)

I'm stumped.
#34
I wrote the below to test all my inventory objects combining with all other inventory objects. This is speed up testing.

Code: ags
  for (int i=1;i<=Game.InventoryItemCount;i++) {
    player.ActiveInventory=inventory[i];
    for (int j=1;j<=Game.InventoryItemCount;j++) {
      Display("combining object index %s (%d/%d) with %s (%d/%d)",inventory[i].Name, i, Game.InventoryItemCount, inventory[j].Name, j, Game.InventoryItemCount);
      Display("modeusinv interaction with %s is %d",inventory[j].Name, inventory[j].IsInteractionAvailable(eModeUseinv));
      inventory[j].RunInteraction(eModeUseinv);
    }
  }


Always comes up as 1/true interaction available, runs the interaction, nothing happens. Don't know if this is supposed to go to a pre-existing function (of which there are many), or something else, but no useinv ever works or responds. No 'I can't use these objects together' standard programmed response; nothing.
#35
I'm trying to add/remove ONLY items that a player starts with, however InvWindow, Inventory, Game, player.Inventory* etc. doesn't contain a function to check for this, or a property.
How do I do the following (pseudocode):

Code: ags
//add all 'starts game with' items back to empty inventory
for (int x=1; x<=Game.InventoryItemCount; x++) {
  if (player.InventoryItemStartsWith[x])
    player.InventoryQuantity=1;   
}
#36
This function currently takes the current location at mouse.x/mouse.y, and in repeatedly_execute_always(), put's the Game.GetLocationName (ie. the editor's 'Description') at a predetermined location on the screen.
This is the editor's 'Description' for Objects, Hotspots etc.
It almost works perfectly, but I can't get it to follow and constantly update it's position on mouse.x,mouse.y

GlobalScript.asc
Code: ags
function SetFloatingText(String floatingText)
{
	if (ConversationIsOn) {
			DrawingSurface* dsFloatingText_2 = sprtFloatingText.GetDrawingSurface();
			dsFloatingText_2.Clear(COLOR_TRANSPARENT);
			dsFloatingText_2.Release();
	} else {
		if (textContent == null)
			textContent = "";
		
		if(sprtFloatingText == null)
			sprtFloatingText = DynamicSprite.Create(FLOATING_TEXT_GUI.Width, FLOATING_TEXT_GUI.Height, true);
	
		if (floatingText != textContent) {
			textContent = floatingText;
			
			DrawingSurface* dsFloatingText = sprtFloatingText.GetDrawingSurface();
			dsFloatingText.Clear(COLOR_TRANSPARENT);
			
			if(!String.IsNullOrEmpty(textContent)) {
				dsFloatingText.DrawingColor = FLOATING_TEXT_COLOR;
				dsFloatingText.drawStringWrappedOutline(mouse.x,
											mouse.y
											FLOATING_TEXT_GUI.Width - 2*FLOATING_TEXT_OUTLINE_WIDTH,
											eTextOutlineRounded,																			
											FLOATING_TEXT_FONT,																				
											eAlignLeft,																							
											textContent,																							
											0,																												
											FLOATING_TEXT_OUTLINE_COLOR,														
											FLOATING_TEXT_OUTLINE_WIDTH);
			}
			
			dsFloatingText.Release();
			
			FLOATING_TEXT_GUI.BackgroundGraphic = sprtFloatingText.Graphic;
		}
	}
}

...

function repeatedly_execute_always()
{  
...	 
	if (Game.GetLocationName(mouse.x, mouse.y)!=null) {
		SetFloatingText(Game.GetLocationName(mouse.x, mouse.y));
	}
...
}



GlobalScript.ash
Code: ags
//for gFloatingText 'description of what mouse is over'
#define FLOATING_TEXT_GUI gFloatingText
#define FLOATING_TEXT_FONT eFontSpeech
#define FLOATING_TEXT_OUTLINE_WIDTH 2
#define FLOATING_TEXT_COLOR 2047
#define FLOATING_TEXT_OUTLINE_COLOR 0


gFloatingText:
Width: 1366 (game screen width)
Height: 768 (game screen height)
Left, Top: 0
Clickable: False
Visible: True
ZOrder: 999
no controls, thats it.

What's supposed to happen: Description/Name text is supposed to follow the mouse around over an area with a Description/Name (floatingText)
What actually happens: When the mouse enters a Named area, it displays the text at those coords, but doesn't follow the mouse around.

How do I make it float around at mouse.x,mouse.y, constantly updating as it changes location?

Bonus super-advanced question: How do I get the floatingText background to have a white rectangle on it - shaped on Description words width/height - rather than translucency?
#37
I have a console; what's entered into it is checked by a short list of words. If the word(s) are recognised (eg. "eat apple"), or in other words a specific command matching search criteria is run, I want the Parser to make a sound. This sound would probably be triggered by something like
Code: ags
if (Parser.LastRunCommandMatched) aSound.Play(....


Is anything like the above possible? Otherwise it'll become a case of repeating code:

Code: ags
if (Parser.Said("eat apple")) {
....
x=true;
}

if (Parser.Said("steal apple")) {
....
x=true;
}

if (Parser.Said("get,buy drink")) {
....
x=true;
}

if (Parser.Said("steal drink")) {
....
x=true;
}

if (x) aSound.Play(...);
x=false;


#38
In AGS, is it possible to use substitutions to write a variable name, and then keep it as a symbol?

I'm trying to write a for loop which goes numbers 1 to 4, and then changes properties of a GUI control with a set name 'Load4' or 'Load3' etc.

Can I write e.g. LoadX or String.Format("Load%d",x), etc?

Bit of a stretch but I thought someone might have a solution for runtime symbol names.
#39
I *have* gotten them working, but problems remain.
The two main ones are:

1. Savegame screenshots are slow by one; when you save the first screenshot it's blank; the second, it has the first one's screenshot; and so on.

2. I can't figure out how to close the gSaveLoad dialog when a save is restored. Despite the fact that the diaog is never visible when the game's doing it's saving, the dialog refuses to disappear when the game is restored.

code:

globalscript.asc:
Code: ags
DynamicSprite *buttonSavePic1;
DynamicSprite *buttonSavePic2;
DynamicSprite *buttonSavePic3;
DynamicSprite *buttonSavePic4;


function ShowSaveGUI() {
  
  buttonSavePic1 = DynamicSprite.CreateFromSaveGame(1, 171, 96);
  if (buttonSavePic1 != null) {
    buttonLoad1.Visible=true;
    //LabelLoad1.Visible=true;
    LabelDescr1.Text=Game.GetSaveSlotDescription(1);
    buttonSaveSlot1.NormalGraphic = buttonSavePic1.Graphic;
    buttonSaveSlot1.Visible=true;
  }  
  buttonSavePic2 = DynamicSprite.CreateFromSaveGame(2, 171, 96);
  if (buttonSavePic2 != null) {
    buttonLoad2.Visible=true;
    //LabelLoad2.Visible=true;
    LabelDescr2.Text=Game.GetSaveSlotDescription(2);
    buttonSaveSlot2.NormalGraphic = buttonSavePic2.Graphic;
    buttonSaveSlot2.Visible=true;
  }  
  buttonSavePic3 = DynamicSprite.CreateFromSaveGame(3, 171, 96);
  if (buttonSavePic3 != null) {
    buttonLoad3.Visible=true;
    //LabelLoad3.Visible=true;
    LabelDescr3.Text=Game.GetSaveSlotDescription(3);
    buttonSaveSlot3.NormalGraphic = buttonSavePic3.Graphic;
    buttonSaveSlot3.Visible=true;
  }  
  buttonSavePic4 = DynamicSprite.CreateFromSaveGame(4, 171, 96);
  if (buttonSavePic4 != null) {
    buttonLoad4.Visible=true;
    //LabelLoad4.Visible=true;
    LabelDescr4.Text=Game.GetSaveSlotDescription(4);
    buttonSaveSlot4.NormalGraphic = buttonSavePic4.Graphic;
    buttonSaveSlot4.Visible=true;
  }
  
  gSaveLoad.Visible = true;
}


// SAVE gSaveLoad save button functions

function buttonSave1_OnClick(GUIControl *control, MouseButton button)
{
  gSaveLoad.Visible=false;
  
  DateTime *dt = DateTime.Now;
  String SaveDesc=String.Format("SLOT #1 @%02d:%02d:%02d %02d:%02d:%04d",dt.Hour, dt.Minute, dt.Second, dt.DayOfMonth, dt.Month, dt.Year);
  SaveGameSlot(1, SaveDesc);
  
  aCameraSnap.Play(eAudioPriorityNormal, eOnce);
  buttonSavePic1 = DynamicSprite.CreateFromSaveGame(1, 171, 96);
  Wait(GetGameSpeed()*1);
  
  if (buttonSavePic1 != null) {
    buttonSaveSlot1.NormalGraphic = buttonSavePic1.Graphic;
    buttonSaveSlot1.Visible=true;
    buttonLoad1.Visible=true;
    //LabelLoad1.Visible=true;
    LabelDescr1.Text=Game.GetSaveSlotDescription(1);
  }
  
  gSaveLoad.Visible=true;
}
function buttonSave2_OnClick(GUIControl *control, MouseButton button)
{
  gSaveLoad.Visible=false;
  
  DateTime *dt = DateTime.Now;
  String SaveDesc=String.Format("SLOT #2 @%02d:%02d:%02d %02d:%02d:%04d",dt.Hour, dt.Minute, dt.Second, dt.DayOfMonth, dt.Month, dt.Year);
  SaveGameSlot(2, SaveDesc);
  
  aCameraSnap.Play(eAudioPriorityNormal, eOnce);
  buttonSavePic2 = DynamicSprite.CreateFromSaveGame(2, 171, 96);
  Wait(GetGameSpeed()*1);
  gSaveLoad.Visible=true;
  
  if (buttonSavePic2 != null) {
    buttonSaveSlot2.NormalGraphic = buttonSavePic2.Graphic;
    buttonSaveSlot2.Visible=true;
    buttonLoad2.Visible=true;
    //LabelLoad2.Visible=true;
    LabelDescr2.Text=Game.GetSaveSlotDescription(2);
  }
}
function buttonSave3_OnClick(GUIControl *control, MouseButton button)
{
  gSaveLoad.Visible=false;
  
  DateTime *dt = DateTime.Now;
  String SaveDesc=String.Format("SLOT #3 @%02d:%02d:%02d %02d:%02d:%04d",dt.Hour, dt.Minute, dt.Second, dt.DayOfMonth, dt.Month, dt.Year);
  SaveGameSlot(3, SaveDesc);
  
  aCameraSnap.Play(eAudioPriorityNormal, eOnce);
  buttonSavePic3 = DynamicSprite.CreateFromSaveGame(3, 171, 96);
  Wait(GetGameSpeed()*1);
  gSaveLoad.Visible=true;
  
  if (buttonSavePic3 != null) {
    buttonSaveSlot3.NormalGraphic = buttonSavePic3.Graphic;
    buttonSaveSlot3.Visible=true;
    buttonLoad3.Visible=true;
    //LabelLoad3.Visible=true;
    LabelDescr3.Text=Game.GetSaveSlotDescription(3);
  }

}
function buttonSave4_OnClick(GUIControl *control, MouseButton button)
{
  gSaveLoad.Visible=false;
  
  DateTime *dt = DateTime.Now;
  String SaveDesc=String.Format("SLOT #4 @%02d:%02d:%02d %02d:%02d:%04d",dt.Hour, dt.Minute, dt.Second, dt.DayOfMonth, dt.Month, dt.Year);
  SaveGameSlot(4, SaveDesc);
  
  aCameraSnap.Play(eAudioPriorityNormal, eOnce);
  buttonSavePic4 = DynamicSprite.CreateFromSaveGame(4, 171, 96);
  Wait(GetGameSpeed()*1);
  gSaveLoad.Visible=true;
  
  if (buttonSavePic4 != null) {
    buttonSaveSlot4.NormalGraphic = buttonSavePic4.Graphic;
    buttonSaveSlot4.Visible=true;
    buttonLoad4.Visible=true;
    //LabelLoad4.Visible=true;
    LabelDescr4.Text=Game.GetSaveSlotDescription(4);
  }

}



// LOAD  gSaveLoaad load button functions

function buttonLoad1_OnClick(GUIControl *control, MouseButton button)
{
  gSaveLoad.Visible=false;
  RestoreGameSlot(1);
  GameJustRestored=1;
}
function buttonLoad2_OnClick(GUIControl *control, MouseButton button)
{
  gSaveLoad.Visible=false;
  RestoreGameSlot(2);
  GameJustRestored=2;
}
function buttonLoad3_OnClick(GUIControl *control, MouseButton button)
{
  gSaveLoad.Visible=false;
  RestoreGameSlot(3);
  GameJustRestored=3;
}
function buttonLoad4_OnClick(GUIControl *control, MouseButton button)
{
  gSaveLoad.Visible=false;
  RestoreGameSlot(4);
  GameJustRestored=4;
}



// click save icon in giconbar
function btnIconSave_OnClick(GUIControl *control, MouseButton button)
{
  gPanel.Visible = false;
  gIconbar.Visible = false;
  mouse.UseModeGraphic(eModePointer);
  ShowSaveGUI();
}
// click load icon in gIconbar
function btnIconLoad_Click(GUIControl* control, MouseButton button) 
{
  gPanel.Visible=false;
  gIconbar.Visible=false;
  gSaveLoad.Visible=true;
  mouse.UseModeGraphic(eModePointer);
}


#40
I've included a bit of code in a room which manually animates an object, and plays 'linked' sounds for each frame; it then adjust the volume depending on the players position and closeness to the object.
The sounds are played at full volume for the first second; what should I do to keep the sound consistent?

Code: ags
function SoundDistDS(int x, int y, int radius, int minVolume)
{
  int Volume=0;
  int dx = 610 - x;   //hard coded in pos of darkseeds sign
  int dy = 515 - y;
  int d_squared = dx*dx + dy*dy;

  if(d_squared >= (radius * radius))
    Volume = minVolume;
  else
    Volume = FloatToInt(100.0 - (Maths.Sqrt(IntToFloat(d_squared))/IntToFloat(radius)) * (100.0 - IntToFloat(minVolume)));
    
  return Volume;
}


function PlaySoundDS(int animFrame)
{
  switch (animFrame) {
    case 0: ds_chan=aNeon_1.Play(eAudioPriorityNormal, eOnce);break;
    case 1: ds_chan=aNeon_2.Play(eAudioPriorityNormal, eOnce);break;
    case 2: ds_chan=aNeon_1.Play(eAudioPriorityNormal, eOnce);break;
    case 3: ds_chan=aNeon_2.Play(eAudioPriorityNormal, eOnce);break;
    case 4: ds_chan=aNeon_1.Play(eAudioPriorityNormal, eOnce);break;
    case 5: ds_chan=aNeon_2.Play(eAudioPriorityNormal, eOnce);break;
    case 6: ds_chan=aNeon_1.Play(eAudioPriorityNormal, eOnce);break;
    case 7: ds_chan=aNeon_2.Play(eAudioPriorityNormal, eOnce);break;
    case 8: ds_chan=aNeon_1.Play(eAudioPriorityNormal, eOnce);break;
    case 9: ds_chan=aNeon_2.Play(eAudioPriorityNormal, eOnce);break;
    case 10: ds_chan=aNeon_3.Play(eAudioPriorityNormal, eOnce);break;
    case 11: break;
    case 12: break;
    case 13: break;
  }

  ds_chan.Volume=SoundDistDS(cJulius.x, cJulius.y, 300, 3);
}

function late_repeatedly_execute_always()
{
  //Display("wa %d, yctr %d", wa, yctr);
  wa++;
  if (wa>20) {
    wa=0;
    yctr++;
    if (yctr>13)
      yctr=0;
   
    ViewFrame *vf;
    vf=Game.GetViewFrame(10, 0, yctr);
    oDarkSeedsSign.Graphic=vf.Graphic;
    PlaySoundDS(yctr);
  }
}


function room_Load()
{
  ...
  oDarkSeedsSign.SetView(10);

  wa=0;//global
  yctr=0;//global
...
}


SMF spam blocked by CleanTalk