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

#21
I'm using SayAtBubble to position the bubble as I want. I've put two defines into the global.ash to  set x and y coordinates:

in global.ash:
Code: ags

#define hare_x					590
#define hare_y					12


in a conversation with the Hare character:
Code: ags

@6
  cJulius.SayAtBubble(hare_x,hare_y,"&615 How did you get invited to this animal party village green thing?");
  cHare.SayBubble("&16 How'd *you* get invited? You an animal?");
...


...BUT the X coordinate does nothing. It always positions the bubble in the centre of Julius head:



Here's the function code:

Code: ags

void realSayAtBubble(this Character*, int x, int y, String message, GUI* bubbleGui, DynamicSprite* bubbleSprite)
{
  // Render and display the speech bubble
  if(bubbleSprite == null)
    bubbleSprite = this.renderBubble32(message, true);
  Overlay* bubbleOverlay;
  if(bubbleGui == null && _defaultGui == null)
    bubbleOverlay = Overlay.CreateGraphical(x, y, bubbleSprite.Graphic, true);
  else
  {
    if(bubbleGui == null)
      bubbleGui = _defaultGui;
      
    bubbleGui.Clickable = false;
    bubbleGui.X = _clampInt(x, 0, System.ViewportWidth - bubbleSprite.Width);
    bubbleGui.Y = _clampInt(y, 0, System.ViewportHeight - bubbleSprite.Height);
    bubbleGui.Width = bubbleSprite.Width;
    bubbleGui.Height = bubbleSprite.Height;
    bubbleGui.BackgroundGraphic = bubbleSprite.Graphic;
    bubbleGui.Transparency = 0;
    bubbleGui.Visible = true;
  }
  SpeechBubble* bubble = SpeechBubble.Create(this, message, bubbleSprite, bubbleGui, bubbleOverlay);
  
  bubble.setX(x);
  bubble.setY(y);
  bubble.setBackgroundSpeech(false);
  bubble.setThinking(false);
  _addBubbleChar(this);
  
  // Play speech (this chunk blocks until speech is complete)

  String lineNumber = getLineNumber(message);
  // If we have set an invisible font, just call Say() - or whatever custom Say() implementation we have
  if(SpeechBubble.get_InvisibleFont() != -1)
  {
    FontType speechFont = Game.SpeechFont;
    Game.SpeechFont = _invisibleFont;
    this.SB_sayImpl(message);
    Game.SpeechFont = speechFont;
  }
  // Else if we're going to play a voice clip, call Say() with the clip number and a blank line of text
  // (takes care of animation and doesn't display any text). This doesn't work with text-based lip-sync,
  // so if you're using text-based lip-sync, you MUST set an invisible font to get lip-sync to work
  else if(lineNumber != null && Speech.VoiceMode != eSpeechTextOnly) // && !GetGameOption(OPT_LIPSYNCTEXT))
  {
    String s = lineNumber;
    while(s.Length < message.Length)
      s = s.AppendChar(' ');
    this.SB_sayImpl(s);
  }
  // Otherwise we have to do it manually...
  else
  {
    bubble.setAnimating(true);
    this.animateSpeech(message);
  }
  
  
  // Remove the bubble
  bubble.Remove();
}

...

void SayAtBubble(this Character*, int x, int y, String message, GUI* bubbleGui)
{
  if(message == null) return;
  if(!game.bgspeech_stay_on_display)
    _stopAllBackgroundBubbles();
  if((Speech.VoiceMode == eSpeechVoiceOnly && hasVoiceClip(message)) || message == "...") {
    this.SB_sayImpl(message);
  } else {
    DynamicSprite* bubbleSprite = this.renderBubble32(message, true);
    x = this.x - GetViewportX() - bubbleSprite.Width/2;
    x = _clampInt(x, 0, System.ViewportWidth - bubbleSprite.Width);
    
    this.realSayAtBubble(x, y, message, bubbleGui, null);
  }
}

...


// Draw a speech bubble in 32-bit (using transparency)
DynamicSprite* renderBubble32(this Character*, String message, bool talkTail)
{
  // Calculate text dimensions
  int textWidth = _maxTextWidth;
  if(textWidth <= 0)
    textWidth = calculateDefaultTextWidth(this);
  textWidth = _minInt(textWidth, System.ViewportWidth - _paddingLeft - _paddingRight);
  int textHeight = GetTextHeight(message, Game.SpeechFont, textWidth);
  
  textWidth = calculateExactTextWidth(message, Game.SpeechFont, textWidth, textHeight);
  
  // Calculate bubble dimensions
  int totalWidth = textWidth + _paddingLeft + _paddingRight;
  int bubbleHeight = textHeight + _paddingTop + _paddingBottom;
  int totalHeight;
  if(talkTail)
    totalHeight = bubbleHeight + _talkTailHeight;
  else
    totalHeight = bubbleHeight + _thinkTailHeight;
  
  SpeechBubbleHeight_blr=totalHeight;//BLR
  
  // Set up the canvases
  DynamicSprite* bubbleSprite = DynamicSprite.Create(totalWidth, totalHeight, true);
  DrawingSurface* bubbleSurface = bubbleSprite.GetDrawingSurface();
  //bubbleSurface.Clear();
  
  DynamicSprite* bgSprite; DrawingSurface* bgSurface;
  DynamicSprite* borderSprite; DrawingSurface* borderSurface;
  if(_backgroundTransparency == 0)
  {
    bgSprite = bubbleSprite;
    bgSurface = bubbleSurface;
  }
  else
  {
    bgSprite = DynamicSprite.Create(totalWidth, totalHeight, true);
    bgSurface = bgSprite.GetDrawingSurface();
  }
  if(_borderTransparency == 0)
  {
    borderSprite = bubbleSprite;
    borderSurface = bubbleSurface;
  }
  else
  {
    borderSprite = DynamicSprite.Create(totalWidth, totalHeight, true);
    borderSurface = borderSprite.GetDrawingSurface();
  }
  
  int bgColor = mixColors(this.SpeechColor, _backgroundColor, _backgroundSpeechTint);
  int borderColor = mixColors(this.SpeechColor, _borderColor, _borderSpeechTint);
  
  // Draw!
  bgSurface.DrawingColor = bgColor;
  bgSurface.DrawRectangle(1, 1, totalWidth-2, bubbleHeight-1);
  drawRoundedCorners32(bgSurface, borderSurface, borderColor, 0, bubbleHeight);
  String tail[]; int tailWidth; int tailHeight;
  if(talkTail)
  {
    tail = _talkTail; tailWidth = _talkTailWidth; tailHeight = _talkTailHeight;
  }
  else
  {
    tail = _thinkTail; tailWidth = _thinkTailWidth; tailHeight = _thinkTailHeight;
  }
  bgSurface.DrawingColor = bgColor;
  bgSurface.drawPixelArray(tail, totalWidth/2-tailWidth, bubbleHeight, tailWidth, tailHeight, 'O', false, false);
  borderSurface.DrawingColor = borderColor;
  borderSurface.drawPixelArray(tail, totalWidth/2-tailWidth, bubbleHeight, tailWidth, tailHeight, 'X', false, false);
  borderSurface.DrawLine(_cornerRoundingRadius, 0, totalWidth - _cornerRoundingRadius, 0);
  // Left Line
  borderSurface.DrawLine(0, _cornerRoundingRadius, 0, bubbleHeight - _cornerRoundingRadius);
  // Right Line
  borderSurface.DrawLine(totalWidth-1, _cornerRoundingRadius, totalWidth-1, bubbleHeight - _cornerRoundingRadius);
  // Bottom Lines
  borderSurface.DrawLine(_cornerRoundingRadius, bubbleHeight, totalWidth/2 - tailWidth, bubbleHeight);
  borderSurface.DrawLine(totalWidth/2, bubbleHeight, totalWidth - _cornerRoundingRadius, bubbleHeight);
  
  if(_backgroundTransparency != 0)
  {
    bgSurface.Release();
    bubbleSurface.DrawImage(0, 0, bgSprite.Graphic, _backgroundTransparency);
    bgSprite.Delete();
  }
  if(_borderTransparency != 0)
  {
    borderSurface.Release();
    bubbleSurface.DrawImage(0, 0, borderSprite.Graphic, _borderTransparency);
    borderSprite.Delete();
  }
  
  bubbleSurface.DrawingColor = this.SpeechColor;
  int outlineColor = mixColors(this.SpeechColor, _textOutlineColor, _textOutlineSpeechTint);
  if(_textOutlineWidth > 0)
    bubbleSurface.drawStringWrappedOutline(_paddingLeft, _paddingTop, textWidth, _textOutlineStyle, Game.SpeechFont, _textAlign, message, _textTransparency, outlineColor, _textOutlineWidth);
  else
    bubbleSurface.drawStringWrappedAA(_paddingLeft, _paddingTop, textWidth, Game.SpeechFont, _textAlign, message, _textTransparency);
  
  bubbleSurface.Release();
  return bubbleSprite;
}


I can include more functions; I've altered like 10 lines of code in this module, but the above *looks* okay...???
#22
SOLVED!

I didn't even know the order in the right-column for Scripts had a meaning - you learn something every day :D
#23
I am having a compile error on this line:

Code: ags
void SB_sayImpl(this Character*, String message)
{
	//BLR ADDED
  this.SaySync(message);
}


I'm getting the error:
Code: ags
SpeechBubble_0.8.0.asc(19): Error (line 19): '.SaySync' is not a public member of 'Character'. Are you sure you spelt it correctly (remember, capital letters are important)?


...but it is. SaySync is most definitely a member of characters.

However I think I've made a typo around this code, but I can't find it.
It's just shot this error now, after months of not updating it.

here's the scripts:
https://bluekeystudios.com/filez/speechbubble.zip
#24
Solved: made sound files shorter.
#25
What I want to happen:
1. Buddhist speaks, speech bubble appears
2. The sound sample 1 is over; delete this speech bubble, and create the second one; start the second bit of speech
3. When that's over, delete speechbubble, speech sample 2 has obviously stopped because it's non-blocking
4. Fade out screen

What *actually* happens:
1. Buddhist speaks speech sample 1, speech bubble appears
2. Speech bubble stops halfway through this first speech sample, second bubble appears
3. Speech sample 1 eventually ends, speech samples 2 starts
4. Speech sample 2 stops early, both speech sample and speech bubble disappear
5. Screen fades out

I'm using SpeechBubble8.0.

What's going on here? The speech bubbles are obviously ending early because they estimate a shorter amount of time to read the bubble than the speech sample has to end; but what is blocking/non-blocking?
Should I just write 'Wait(the length of time for the 2 speech samples)', and included it at the beginning/end of the block of code?

Also: I have chosen eSkipAnyKeyOrMouseClick for speech skipping

Code:
Code: ags
cBuddhistCow.SayBubble("63 At the dawn of time, the island - all it's crea.....e by the god of cows; Mooaclah.");
cBuddhistCow.SayBubble("64 Mooaclah was a bored creature, with many ......many cow-shaped vessels to store his power...");
FadeOut(10);


(Ampersands deleted because they're screwing up the text display of this post)
#26
Don't worry, I solved it with this dandy piece of code.... which is just part of speechbubble copied and hardcoded, because I can't figure out how to get access to it's function renderbubble32():

Code: ags


function cJulius_spk(String msg)
{
  // Calculate text dimensions
  int textWidth = -1;

  int w = System.ViewportWidth * 2/3;
  if(cJulius.x - GetViewportX() <= System.ViewportWidth/4 || cJulius.x - GetViewportX() >= System.ViewportWidth * 3/4) {
    w -= System.ViewportWidth/5;
  }
  textWidth=w;

  if(textWidth < (System.ViewportWidth - 40)) {
    textWidth=textWidth;
  } else {
    textWidth=System.ViewportWidth - 40;
  }
  
  int textHeight = GetTextHeight(msg, 1, textWidth);
  
  int cut = textWidth;
  int height = textHeight;
  while(cut>1) {
    cut = (cut+1) >> 1; // Subtract half as much as we tried last time, rounding up
    height = GetTextHeight(msg, 1, textWidth - cut);
    if(height == textHeight) {
      textWidth -= cut;
    }
  }
  height = GetTextHeight(msg, 1, textWidth-1);
  if(height == textHeight) {
    textWidth=textWidth-1;
  } else {
    textWidth=textWidth;
  }

  int totalWidth = textWidth + 20 + 20;
  int bubbleHeight = textHeight + 10 + 10;
  int totalHeight;
  totalHeight = bubbleHeight + 9;

  SpeechBubbleHeight_blr=totalHeight;//BLR

  int headHeight=355;     //constant
  int spaceAboveHead=15;  //constant

  float h=IntToFloat( SpeechBubbleHeight_blr ); //constant
  float f=( (IntToFloat(headHeight+spaceAboveHead)/100.0)*IntToFloat(cJulius.Scaling) ) + h;

  cJulius.SayAtBubble(cJulius.x, cJulius.y - FloatToInt(f), msg);
}
#27
I'm using speechbubble 0.8.0

I'm trying to work out an equation that will display the speech bubbles above my characters head for SayAtBubble(), changed for scaling of the area (for example, 40pixels at 100%, 20pixels at 50%)

x axis is already sorted.

But the y axis keeps being out a bit depending on scaling. Looks good for 50%, too low at 5%, too high at 100%, etc. even though it's altered for scaling. The 'scaling point' moves slightly, when it should be fixed for all scaling.

Here's my equation. What am I doing wrong?

Code: ags

function cJulius_spk(String msg)
{
  cJulius.SayAtBubble(cJulius.x, cJulius.y - (FloatToInt( (460.0/100.0)*IntToFloat(cJulius.Scaling) )), msg);
}


Where msg is the message eg. "&123 I am a characters."
The 460.0 is my constant distance above Julius's head. His frames very high, so unless I set it manually, it's way above his head all the time.
#28
Engine Development / Re: AGS engine iOS port
Wed 29/01/2020 22:33:20
Anyone know if the iOS engine is/will be upgraded to 3.5.0?
#29
Getting a Mac mini 2014 with high Sierra.
#30
Hi, just an update on my awful Mac skillz and perhaps someone can give me a few pointers.

I have a Mac Mini 2.5GHz i5, 16gb ram, MacMini5,2, running El Capitain v10.11.6.
I have Xcode - I think with command line utilities, but anyway I would be grateful if someone could tell me where I could get these.

I've tried running a copy of AGS 3.3.4, with the game files in Contents/Resources - it didn't work, unsurprisingly.

Three possible reasons:
The game was compiled with 3.5.0 b6
The game file is a .ags, not a .dat (don't know if this makes a difference, but the Data directory contained a .ags)
This version was compiled with MacOS 10.14

I couldn't find any log files, so either they're not there or it just crashed out of the gates.

Could anyone give me a definite answer of one of those three possibilities? Should I get a newer version of MacOS (new mac mini), a new version of the compiled (only up to b6), or....?

Basically I'm trying to run the compiled game in OS X.

Has anyone tried compiling/running the 3.5.0 engine yet?
#31
Turned the two variables to globals.
Thank you, it works :)
#32
Imported it all into global script/header. Set defines in header, put first 2 variables (line 3 and 4 in GlobalScript.asc) in function.
Works, compiles.

Does the GUI have an actual label control in it, or you're just referring to the whole thing as a label?

Also changed #define FLOATING_TEXT_FONT eFontfntSpeech from line 5 to eFontSpeech - this way it compiles. Correct usage? Otherwise it won't compile.

GetLocationName(mouse.x, mouse.y) gets a location's (Hotspot, Object, etc.) 'Description' (in the editor, in Properties window, under Appearance)?


Here's what I have:

GlobalScript.ash
Code: ags

//for gFloatingText 'description of what mouse is over'
...
//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 49664
#define FLOATING_TEXT_OUTLINE_COLOR 0
import function SetFloatingText(String floatingText);
import void drawStringWrappedOutline(this DrawingSurface*, int x, int y, int width, TextOutlineStyle outlineStyle, FontType font,  Alignment alignment, String message, int transparency, int outlineColor, int outlineWidth);
...


GlobalScript.asc
Code: ags

function SetFloatingText(String floatingText)
{
  String textContent;
  DynamicSprite* sprtFloatingText;
  
  if(textContent == null)
    textContent = "";
  if(floatingText != textContent)
  {
    textContent = floatingText;
    if(sprtFloatingText == null)
      sprtFloatingText = DynamicSprite.Create(FLOATING_TEXT_GUI.Width, FLOATING_TEXT_GUI.Height, true);
    DrawingSurface* dsFloatingText = sprtFloatingText.GetDrawingSurface();
    dsFloatingText.Clear(COLOR_TRANSPARENT);
    if(!String.IsNullOrEmpty(textContent))
    {
      dsFloatingText.DrawingColor = FLOATING_TEXT_COLOR;
      dsFloatingText.drawStringWrappedOutline(FLOATING_TEXT_OUTLINE_WIDTH,
                                              FLOATING_TEXT_OUTLINE_WIDTH,
                                              FLOATING_TEXT_GUI.Width - 2*FLOATING_TEXT_OUTLINE_WIDTH,
                                              eTextOutlineRounded,
                                              FLOATING_TEXT_FONT,
                                              eAlignCentre,
                                              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));
  }
}



Surprise, due to something in my implementation of your function in my own code, the floating text doesn't appear. Putting cursor over trees, cave, quicksand etc. doesn't come up with anything - but this Hotspots are supposed to have descriptive Descriptions.
BUT it does come up for object->lookat, and also for speech (so far) - just a copy of the speechbubble.

Video:
https://bluekeystudios.com/img/floatingtext1.mp4

Note: When I change the text of the function to THIS (lines 5 and 6):

Code: ags

...
    if(!String.IsNullOrEmpty(textContent))
    {
      dsFloatingText.DrawingColor = FLOATING_TEXT_COLOR;
      dsFloatingText.drawStringWrappedOutline(683,    //1366/2 pixels left - dead centre
                                              15,     //15 pixels down
                                              FLOATING_TEXT_GUI.Width - 2*FLOATING_TEXT_OUTLINE_WIDTH,
                                              eTextOutlineRounded,
                                              FLOATING_TEXT_FONT,
                                              eAlignCentre,
                                              textContent,
                                              0,
                                              FLOATING_TEXT_OUTLINE_COLOR,
                                              FLOATING_TEXT_OUTLINE_WIDTH);
    }
    dsFloatingText.Release();
...


to try and position the floating text in the dead centre, the first error is gone, though now it's copying part of the DyanmicSprite for the custom dialogue functions:

https://bluekeystudios.com/img/floatingtext2.mp4


....SO it's a bug in the dynamic sprite used in SetFloatingText(), OR I've just gone and ruined the implementation of your code :D
#33
Okay, I've attempted to copy this function (now called oulinedMessage) from speechbubble, and transplant my own outlineDrawStringWrappedAA into the function:

I've reduced the number of arguments, and supplanted default values hard-coded - these items will never change:

GlobalScript.asc
Code: ags

// Draw a string with outline (make sure the canvas has at least outlineWidth pixels on each side of the string)
function outlinedMessage(this DrawingSurface*, int x, int y, int width, String message)
{
  
  // This is what we draw on (because we might need to copy with transparency)
  DynamicSprite* outlineSprite = DynamicSprite.Create(this.Width, this.Height, true);
  DrawingSurface* outlineSurface = outlineSprite.GetDrawingSurface();
  
  // This holds multiple horizontal copies of the text
  // We copy it multiple times (shifted vertically) onto the outlineSprite to create the outline
  DynamicSprite* outlineStripSprite = DynamicSprite.Create(this.Width, this.Height, true);
  DrawingSurface* outlineStripSurface = outlineStripSprite.GetDrawingSurface();
  
  // This is our "text stamp" that we use to draw the outline, we copy it onto outlineStripSprite
  DynamicSprite* textSprite = DynamicSprite.Create(this.Width, this.Height, true);
  DrawingSurface* textSurface = textSprite.GetDrawingSurface();
  
  // Draw our text stamp
  textSurface.DrawingColor = 682;
  textSurface.DrawStringWrapped(x, y, width, 1, 2, message);
  textSurface.Release();
  
  // Draw Circular outline
  int maxSquare = 2*2+1; // Add 1 for rounding purposes, to avoid "pointy corners" 
  int maxWidth = 0;
  outlineStripSurface.DrawImage(0, 0, textSprite.Graphic);
  
  // We loop from top and bottom to the middle, making the outline wider and wider, to form circular outline
  for(int i = 2; i > 0; i--)
  {
    // Here's the circular calculation...
    while(i*i + maxWidth*maxWidth <= maxSquare)
    {
      // Increase width of the outline if necessary
      maxWidth++;
      outlineStripSurface.DrawImage(-maxWidth, 0, textSprite.Graphic);
      outlineStripSurface.DrawImage(maxWidth, 0, textSprite.Graphic);
      outlineStripSurface.Release();
      outlineStripSurface = outlineStripSprite.GetDrawingSurface();
    }
    // Draw outline strip above and below
    outlineSurface.DrawImage(0, -i, outlineStripSprite.Graphic);
    outlineSurface.DrawImage(0, i, outlineStripSprite.Graphic);
  }
  // Finally the middle strip
  outlineSurface.DrawImage(0, 0, outlineStripSprite.Graphic);
  
  textSprite.Delete();
  outlineStripSurface.Release();
  outlineStripSprite.Delete();
  
  /// Now draw the text itself on top of the outline
  outlineSurface.DrawingColor = this.DrawingColor;
  
  //BEGIN OUTLINE DRAW STRING WRAPPED AA
  
  DynamicSprite* atextSprite = DynamicSprite.Create(this.Width, this.Height, true);
  DrawingSurface* atextSurface = atextSprite.GetDrawingSurface();
  atextSurface.DrawingColor = this.DrawingColor;
  atextSurface.DrawStringWrapped(x, y, width, 1, 2, message);
  atextSurface.Release();
  this.DrawImage(0, 0, atextSprite.Graphic, 0);
  atextSprite.Delete();
  
  //END OUTLINE DRAW STRING WRAPPED AA
  
  outlineSurface.Release();
  // ... And copy it onto our canvas
  this.DrawImage(100, 100, outlineSprite.Graphic, 0);
  outlineSprite.Delete();
}


GlobalScript.ash:
Code: ags

import function outlinedMessage(this DrawingSurface*, int x, int y, int width, String message);


in room2.asc:
Code: ags

function room_AfterFadeIn()
{
  ...

  outlinedMessage(100, 100, 100, "checking this out");
}


But I get the error:
Failed to save room room2.crm; details below
room2.asc(5): Error (line 5): Undefined token 'outlinedMessage'

oulinedMessage() is at the top of GlobalScript.asc
The definition is at the top of the function definitions in GlobalScript.ash (after some #define's and enums)

...wtf has happened? It must be something incredibly obvious, but I can't see how room2 can't see GlobalScript.
#34
To be clear, I mean the black colour around the font (the Stroke, for any photoshop aficionados), that fits the front perfectly like tight fitting clothing, not the rounded square frame around the speech bubble. Does anyone know which functions constitute this in speechbubble?
#35
I'm hoping to do a MacOS port of my game, which is unfortunately designed in 3.5.0 in Windows.
Is MacOS a fairly up-to-date channel? Is it likely that 3.5.0 might be released for MacOS in the next 6mo?
#36
I see, thanks :)
#37
This is a extremely dumb question, but I can't get my head around it.

1. Change compile targets to Windows (and DataFile)
2. Compile the MacOS engine on a Mac
3. Take datafile...to Mac??
4. ???
5. Your game runs in MacOS

Could someone explain 3+4 to me? If there is no editor for Mac, and there is no compile target, how is the game running on Mac?
#38
Cool, got it, changed and works.

I have a question for Snarky (or anyone if they know the answer).
SpeechBubble has a border of custom thickness and colour to text in the speech bubble. How do I do this elsewhere in the game?
I have an item description as a GUI with a label containig '@OVERHOTSPOT@', positioned at the top-centre of screen. How can I make this text with a 2px thickness black border, just as text in SpeechBubble?
#39
Will this slow it down, have the old compiler etc. and basically be like using 3.4.1?
#40
Okay well I replaced everything it couldn't understand with Screen.Viewport.Width/Height/X/Y/etc. but now the speech bubbles just don't come up :/
SMF spam blocked by CleanTalk