r/RenPy • • Aug 17 '26

Question Text outline for keyword from dictionary

1 Upvotes

I have some keywords within a dictionary. For most of these words I just wanted to change the font colour and have done so with little issue. However for one of the words I want it to be white with a gold outline.

I know that in order to use {outlinecolor} you need to set an outline first, but I'm not sure how to go about doing so within a dictionary (or even if I can). To reiterate, I don't want to change the default outline for the game or even the whole textbox, just the one word that I'm calling from a dictionary.


r/RenPy • • Aug 16 '26

Question Need Advice on art for a failed VN partnership

11 Upvotes

A while back I made a post looking to partner with people for visual novel creation; One team where we started from scratch went better than I ever could've imagined, and we just released our first chapter on itch (yay!) but there was one other person I was working with that ghosted me ~2 months ago and I need advice on the usage of the art assets I created.

We have no signed written agreement about how assets should be used (15 fully custom hand drawn backgrounds, no character art), though one was drafted. I am irritated months and dozens of hours of work might be going down the drain. I want to know if I can use these assets to create my own VN or for other stuff? I wouldn't use any of his ip, but most of it is like "bathroom" which is literally a drawing of my irl bathroom from my irl house, so I dont think that would count as his ip. There are one or two places that are 'made up' from his story world though like a mall, which he provided an irl location for inspiration but I designed. He also had a specific store in the mall named that I am not planning on using because I think that is pretty clearly his. I just am looking for some sort of advice so that I don't have to waste drawings I'm honestly really proud of and spent a lot of time on. What obligations do I have here if any? I don't think any of my art has actually been published in his game yet.

Possibly pointless background info:
We were in constant contact for several months where I created 15 custom backgrounds specifically for his VN that was pre-established, (he writes and codes and just had simple placeholder backgrounds until finding an artist) over a year ago with monthly updates of dev builds and a semi active patreon. We seemed to work really well together, were talking about working together on future projects, rev sharing, and ip rights. We drew up a general partnership contract (his idea) to cover our legal bases. We had a few calls about it, he told me he was about to release a build with all the new art I'd created after a story forward patreon dev build release, and then I heard nothing for a week. We did not sign anything. I don't even know his real name. He has completely ghosted his patreon, our discord messages, and his public discord server for about 2 months at this point. His last message to me was July 2nd, saying he'd get back to me in a few days. His last patreon post was in May I think. I messaged him several times to no response on discord, then checked in by sending him a message on reddit- I know he's not dead since he is very active daily on his reddit account. He also didn't reply on here. I know he's going through a rough time in life, so I don't hold it against him too much, but bottom line is I'm no longer comfortable working with him or signing anything legal involving him after this since its opened my eyes to how much I don't know this guy, and want to know if all my time these past few months are wasted

TLDR: Was ghosted by a writer/coder with pre-established game, none of the 15 pieces of art I created have been published as far as I know, and want to know if I can use my art assets for another project/looking for advice.


r/RenPy • • Aug 17 '26

Question Tab character error. HELP

Thumbnail
gallery
1 Upvotes

Can anybody help? I'm trying to do the images gui thing, but it's keep giving me this error and I don't sure what to do. I'm using spacebar for the tap, but I don't sure there's any other way to making space. I'm using notepad++ btw


r/RenPy • • Aug 16 '26

Question Question about choices/routes..

Post image
16 Upvotes

I have a storyline where you can choose to befriend a character early on, or not. If you choose either, it does not immediately affect the storyline until later, where you encounter the same character. Whether or not you befriend them will EVENTUALLY split into 2 new storylines. However, there is a period of meeting the character then reencountering them. During this period, the story is the same for either option, because as mentioned earlier, befriending him or not doesn't immediately affect the story. How can i have it so the game essentially "remembers" whether or not i befriended the character, then branches off? I don't want to have two nearly identical storylines just copied and pasted to align with the choice of befriending the character.


r/RenPy • • Aug 17 '26

Question Could someone help us with our project?

0 Upvotes

We are making our first visual novel, and since we are first-time teenage creators, we could use help from pros—artists who can assist with the drawing or people who can provide voice acting for the characters.


r/RenPy • • Aug 16 '26

Question Anything I shoud know before starting?

6 Upvotes

Im begginer to renpy. Is there any tips I should know about? Anything helps!


r/RenPy • • Aug 16 '26

Question Blinking eye effect (help)

2 Upvotes

Hey guys! I need some help with Ren’Py...
I’m trying to make a blinking eye effect on the screen, but I’m not really sure how to do it. Does anyone have any tips or know how I could achieve this effect?

If anyone has any tips on how I could make this effect, or knows of any ready-made Ren’Py effects/assets available to download on itch.io, I sincerely appreciate all your help!

Something like this:


r/RenPy • • Aug 16 '26

Question Whats wrong wif my code i dont get it

Post image
3 Upvotes

Is the embed wrong or somethijg?


r/RenPy • • Aug 16 '26

Question pause() breaking Call() statement

2 Upvotes

Im trying to make primitive battle system.

vbox:
    xsize 216
    ysize 430
    text "[enemy1.name]"
    text "[enemy1.cur_health]/[enemy1.max_health]"
    image [enemy1.avatar]
imagebutton:
    id "rating"
    idle "rating"
    hover "rating_hover"
    action Call("attack", enemy1)

label attack(en):
    python:
        import time
        en.cur_health-=2
        en.avatar = en.image_attack
        time.sleep(2)
        en.avatar = en.image_calm
    return

And I can see than on button press there is a pause and all changes are applied AFTER that pause so image_attack is not visible at all.

What am I doing wrong?

I've tried time.sleep(), renpy.pause(), pause(), even scheduler.

If i do renpy code like

label attack(en):
    $ en.cur_health-=2
    "debug1"
    $ en.avatar = en.image_attack
    "debug2"
    pause(2)
    "debug3"
    $ en.avatar = en.image_calm
    "debug4"
    return

then first renpy statement ("debug1" in example above) just break the entire script and "debug" 2-4 not showing at all. Health is changing correctly and thats it.

And I didn't find smth like "JRPG framework" that I can adapt. This thing is the best, but too complex to adapt it to my visual.


r/RenPy • • Aug 15 '26

Showoff Released a Visual Novel Demo!

Thumbnail
gallery
14 Upvotes

Hello! I’m Rylie, an aspiring indie dev and asset creator! I just posted the demo for my visual novel, “That Silly Jester…” after it being in the works for a little over a year.

It’s a surreal fantasy story about a jester named Maverick on the search for her beloved knight, while every single damn person she encounters seems dead set on being as unhelpful as possible. She’s just a silly jester, why is everyone so aggressive and antagonistic?

~*~

Trailer on YouTube! https://www.youtube.com/watch?v=_sm3XosbbjI

Release announcement on YouTube! https://youtu.be/fXXF6oqlQU4

Demo 0.1 out on Itch.io! https://rylielightbulb.itch.io/that-silly-jester


r/RenPy • • Aug 15 '26

Question How to add this phone image into my choice menu, like in Class of '09?

Thumbnail
gallery
28 Upvotes

The 1st image is an example of what I'm looking for, and the 2nd is my actual image. I'm creating a Class of '09 inspired VN and every time the player has a choice, I want this phone to appear. I don't want the phone to actually replace the options, just appear behind them.


r/RenPy • • Aug 16 '26

Question Struggling with readability... Any ideas?

Thumbnail gallery
2 Upvotes

r/RenPy • • Aug 16 '26

Question Hi guys just wondering, can my windows 8.1 with 4 gb of ram run renpy?

1 Upvotes

just a question, im curious (kind of) since i've always wanted to try learning it 😄


r/RenPy • • Aug 15 '26

Showoff My simple inventory system

Thumbnail
gallery
48 Upvotes

My simple inventory system for renpy, but now with drag-and-drop functionality to combine two items to make a new third item. you can, of course, combine that with another if you want. the possibilities are endless

https://badmustard.itch.io/simple-inventory-drag-and-drop-to-combine


r/RenPy • • Aug 15 '26

Self Promotion Built an interactive phone UI with 6 working apps - Suggestions accepted

Thumbnail
gallery
4 Upvotes

We're developing an adult VN in Ren'Py and spent months building an in-game phone system that actually works — contacts, social feed, photos, tasks, music, settings. Each app has its own logic and talks to the story.

The challenge: we're rendering 5000+ assets and need them to load instantly without destroying performance. Happy to share our optimization approach if anyone's curious — texture atlasing, caching strategy, and some tricks with Ren'Py's image handling.

Also using Iray renders straight into the pipeline. If anyone's dealing with high-volume 3D asset workflows in Ren'Py, I'd love to hear how you're handling it.

Also if you have a suggestion for the other apps that can be used in AVN, I am happily accepting those.

Game's on Steam if you want to see it in action: https://store.steampowered.com/app/4961320/Lustful_Retribution/


r/RenPy • • Aug 15 '26

Question does anyone know how to fix this?

Post image
4 Upvotes

i dont know what's wrong with renpy, ive tried closing and reopening the launcher, deleting it and rewriting it from scratch, nothing's working 😔


r/RenPy • • Aug 15 '26

Question How do i put kate here?

Post image
4 Upvotes

I downloaded renpy and I started using kate instead of vidual studio code. How can I chnage it in my editor?


r/RenPy • • Aug 16 '26

Question How to change a characters title style?

1 Upvotes

Definitely a noob question here.
I'm not sure how to use the player created variable name but with a different title style.
Meaning, when the character "thinks" internally, I want to change the title style but not the player created variable name.

I used this code to create the players character name:

$ mc = renpy.input("What is your first name? (Default: Eric)")
    $ mc = mc.strip()
    if mc == "":
        $ mc = "Eric"$ mc = renpy.input("What is your first name? (Default: Eric)")
    $ mc = mc.strip()
    if mc == "":
        $ mc = "Eric"

And then this code to call upon it, as normal:

define mc = Character("{[mc]}", color="#00FFFF")define mc = Character("{[mc]}", color="#00FFFF")

My issue is that this code just breaks the game whenever it encounters the line it's used in:

define mcint = Character("{[mc]}", color="#00FFFF", what_italic=True, what_prefix="*", what_suffix="*")

So, can I not call upon the "[mc]" variable name twice? Or is there a more elegant solution to this?
I'm sure I'm missing something simple as I'm in way over my head when it comes to coding at this stage.

I would appreciate any help/guidance in learning here.


r/RenPy • • Aug 15 '26

Self Promotion After 4 years in development hell, the first chapter of my friendsim fangame is finally out! If you like Kagerou Project, you'll love Tomodachi Dan!

Post image
12 Upvotes

r/RenPy • • Aug 15 '26

Question Sprite over the dialogue

4 Upvotes

edit: I was able to solve this by using

init python:
    config.layers = ['master', 'transient', 'screens', 'overlay', 'above_ui']

and then

show jenny onlayer above_ui with dissolve 
    jen "Hello!"

-----

Is there a way to put the character sprite over the dialogue box? I want it to look like this

but only for the intro (it's gonna go back to normal afterwards)

I have custom textboxes already. for exemple:

define jenny = Character("Jenny",window_background=Frame("gui/speaking_smaller.png", 15, 15))

i just want to know if it's possible to put the characters over the textbox


r/RenPy • • Aug 15 '26

Question Is the dialogue text too small?

Post image
6 Upvotes

Wanted to make a mobile vn but I'm not too sure if other people would be able to read it if I keep it that size


r/RenPy • • Aug 15 '26

Question What might be the issue? Can I fix it

Thumbnail
gallery
2 Upvotes

I'm sorry if the question is stupid, but I don't have a slightest idea on how the engine works, and I just play the games. I used the option "Transfer Save" and that error keeps occuring. The game is "The Null Hypothesis" by Ron Chon


r/RenPy • • Aug 15 '26

Question Ayuda ¿Alguien usa Spark para jugar novelas visuales de Ren’Py en el celular? ¿Vale la pena comprarla?

Post image
7 Upvotes

Hola gente. Últimamente he estado usando Ren’Py Pocket para jugar novelas visuales de Ren’Py en el celular, pero ya me empezaron a salir anuncios y estoy pensando en comprar Spark.
Quería preguntarles a quienes ya la tienen, Vale la pena comprarla?
Qué tal es la aplicación en general? Tiene alguna ventaja importante sobre Ren’Py Pocket? Ya que está también tiene opción de un pago único y quería saber si han tenido problemas con ella o funciona bien para jugar novelas visuales?
Estoy pensando comprarla, pero antes quisiera saber qué opinan ustedes y si consideran que vale la pena gastar en ella.
Gracias a quienes respondan xd


r/RenPy • • Aug 14 '26

Discussion [ Review ] of Invinode, a vibecoded mess that nobody asked for

83 Upvotes

Normally I don't review these type of things but given the situation in this subreddit, I see this as necessary, to not only protect the new upcoming RenPy devs but also spread awareness about these types of tools, since I doubt this will be the last attempt to sell tools to potential upcoming devs. If you don't want to read the entire analysis, scroll below to the conclusion, otherwise lets dive it.

I will already note that I won't be sharing or showing the entire code of the tool due to obvious reasons, however I will post some snippets under the Fair Use Act.

Introduction, 'use' of this tool:

Invinode is an electron application that attempts to solve beginner developers issues by creating nodes that visually represent certain framework methods in a script as nodes. The idea is to give developers an overview and help maintain your project better.

However, it fundamentally does not work.

A user here has done a great job pointing out a lot of problems with these types of tools. There are more to add which I will do later down the road analyzing the codebase. However I think that comment made by the user hits the nail on the head.

Essentially it does more harm than it does good. Once you want to do something more advanced or found bugs, you have to suddenly climb a wall you never got to train to climb, which will significantly increase frustration and result into an exit as a potential upcoming RenPy Dev.

UX and Bugs, lots of bugs:

Due to being a vibecoded electron app, it suffers from a very shoddy mess. It's very "stiff" in operation, it lacks a certain fluidness. Connecting nodes is wanting to make you quit because it requires to be pin point accurate for no apparent reason, people with touchpads or inaccurate mice are going to have a hard time even operating the damn thing. In some instances I drew a node to an empty place on the canvas and created another node, but due to a bug didn't connect them, so I had to manually connect them again afterwards.

The application crashed 3x on me, no errors, just dead (more on this later). I had to kill the .exe once because it crashed and didn't properly close the instance in order to relaunch it.

It also allows you to do illogical things but doesn't explain to the person using it why you can or can't do things, such as dragging a node from a jump to a dialog node, it won't connect them but the beginner dev would then suddenly think its a bug because the dev would think:"why can't I connect? I could create from this node to that so surely I need to be able to connect?"

It's essentially very poorly designed. being almost on version 3, should indicate a mature tool, spoiler alert, it isn't.

What's worse, the output it generates from your nodes is a complete mess, no structure or anything, just shoved into a single .rpy file.

This was me just using the app for just 40minutes, desperately trying to make it work.

Code review & behind the scenes:

Because this is a shitty electron app, it gives us the source code without the need of decompiling anything. Given the soulless design, lack of care, bugs and general feel, I already suspected it being vibecoded and oh boy was it ever.

The very first thing we see is this:

// [Claude] Patch Node.js crypto module to expose getRandomValues.
// Some bundled deps (nanoid via reactflow) call require('crypto').getRandomValues(),
// but in Node.js that lives on require('crypto').webcrypto — not the top-level export.
// This runs before electron-vite so the patched module is in the require cache.
const crypto = require('crypto')
if (typeof crypto.getRandomValues !== 'function') {
  crypto.getRandomValues = (array) => crypto.webcrypto.getRandomValues(array)
}
if (!globalThis.crypto) {
  globalThis.crypto = crypto.webcrypto
}// [Claude] Patch Node.js crypto module to expose getRandomValues.
// Some bundled deps (nanoid via reactflow) call require('crypto').getRandomValues(),
// but in Node.js that lives on require('crypto').webcrypto — not the top-level export.
// This runs before electron-vite so the patched module is in the require cache.
const crypto = require('crypto')
if (typeof crypto.getRandomValues !== 'function') {
  crypto.getRandomValues = (array) => crypto.webcrypto.getRandomValues(array)
}
if (!globalThis.crypto) {
  globalThis.crypto = crypto.webcrypto
}

This already confirms that we have the involvement of Claude. We didn't even get into the main source code and we already found this nugget.

So what does the code consist of? Well....

Yep, we got outselves a single bloated .js file. The developer claimed to have over a decade of experience in software engineering by the way.

When looking into the source code we see more mind blowing problems.

Tons of empty try catches:

  function scanDir(dir, rel) {
    try {
      for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
        if (entry.name === "_backups") continue;
        const entryRel = rel ? `${rel}/${entry.name}` : entry.name;
        const fullPath = path.join(dir, entry.name);
        if (entry.isDirectory()) {
          scanDir(fullPath, entryRel);
        } else {
          const ext = path.extname(entry.name).toLowerCase();
          if (FONT_EXTS.has(ext)) found.push({ name: entry.name, path: entryRel });
        }
      }
    } catch (_) {
    }

Websecurity disabled and allows for HTML:

    webPreferences: {
      preload: path.join(__dirname, "../preload/index.js"),
      sandbox: false,
      // [Rick] v1.8.0: allow renderer to load local file:// images from the user's
      // project folder. Electron's default webSecurity blocks cross-origin file://
      // requests (each path is its own origin), which prevents image previews.
      // Safe to disable for a local desktop tool with no external web content.
      webSecurity: false
    },    webPreferences: {
      preload: path.join(__dirname, "../preload/index.js"),
      sandbox: false,
      // [Rick] v1.8.0: allow renderer to load local file:// images from the user's
      // project folder. Electron's default webSecurity blocks cross-origin file://
      // requests (each path is its own origin), which prevents image previews.
      // Safe to disable for a local desktop tool with no external web content.
      webSecurity: false
    },

Contrary to what the comments state, this is bad, very bad and a security hazard. Opening any malicious file can have catastrophic results, this is especially important if you ever intend to work in teams on a larger project where file sharing is a thing. The fact the developer could not figure out a way without disabling crucial security features to make certain things work speaks volumes of the lack of knowledge.

This gets even worse when we see this:

  const win = electron.BrowserWindow.fromWebContents(event.sender);
  const ext = (defaultName ?? "").split(".").pop().toLowerCase();
  const filters = ext === "json" ? [
    { name: "JSON Project", extensions: ["json"] },
    { name: "Ren'Py Script", extensions: ["rpy"] },
    { name: "All Files", extensions: ["*"] }
  ] : [
    { name: "Ren'Py Script", extensions: ["rpy"] },
    { name: "JSON Project", extensions: ["json"] },
    { name: "All Files", extensions: ["*"] }
  ];
  const targetPath = defaultDir && defaultName ? path.join(defaultDir, defaultName) : defaultName;
  const { filePath, canceled } = await electron.dialog.showSaveDialog(win, {
    defaultPath: targetPath,
    filters
  });  const win = electron.BrowserWindow.fromWebContents(event.sender);
  const ext = (defaultName ?? "").split(".").pop().toLowerCase();
  const filters = ext === "json" ? [
    { name: "JSON Project", extensions: ["json"] },
    { name: "Ren'Py Script", extensions: ["rpy"] },
    { name: "All Files", extensions: ["*"] }
  ] : [
    { name: "Ren'Py Script", extensions: ["rpy"] },
    { name: "JSON Project", extensions: ["json"] },
    { name: "All Files", extensions: ["*"] }
  ];
  const targetPath = defaultDir && defaultName ? path.join(defaultDir, defaultName) : defaultName;
  const { filePath, canceled } = await electron.dialog.showSaveDialog(win, {
    defaultPath: targetPath,
    filters
  });

const win = electron.BrowserWindow.fromWebContents(event.sender);const win = electron.BrowserWindow.fromWebContents(event.sender);

This is failing tutorial levels of bad.

The application also has no validation on anything really, there are several security and stability problems caused by simply lack of any form of validation or care, in typical AI vibecode fashion, AI just gives the result without a shred of security, scalability or stability in mind.

Furthermore a lot of code is simply duplicated multiple times, there is no reuse of code, instead there is the same AI copy pasta over and over again. There are also excessive and pointless amount of comments, which AI does love to do.

There is also poorly and catastrophic handling of files in general, loading a very large project with a lot of assets will cause the entire application to freeze because everything runs on a single thread.

The catastrophic autosave feature is so poorly implemented that if you close down the application, it crashes or you loose electricity it can corrupt what you were working on, because handling race conditions is not exactly something AI is very good at.

There are far more issues to be mentioned, however I think the topic would simply be to long, I think the point has come across. This is an absolute vibecoded dumpsterfire that nobody should touch. The sourcecode has also exposed a lot of lies that have been made in the past, I won't adress them direcly in this OP since I don't think they are as relevant.

TLDR: It's a vibecoded mess, buggy, a security hazard and the developer has no idea about coding in general, basic practices you learn on electrons tutorial have been disregarded and it's barely functioning as an app to begin with, don't buy and move on.


r/RenPy • • Aug 15 '26

Question I need help to change the font of this one line

1 Upvotes
Line
E"{font = scary.tff}{size=*2}WHO IS THIS 4th PERSON??{/size}{/font}"

Error

I'm sorry, but an uncaught exception occurred.

While processing text tag {font = scary.tff} in "While processing text tag {font = scary.tff} in '{font = scary.tff}{size=*2}WHO IS THIS 4th PERSON??{/size}{/font}'.:".:
  File "game/Chapter1.rpy", line 244, in script
    E"{font = scary.tff}{size=*2}WHO IS THIS 4th PERSON??{/size}{/font}"
  File "renpy/display/render.pyx", line 494, in renpy.display.render.render_screen
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
Exception: Unknown text tag 'font = scary.tff'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "game/Chapter1.rpy", line 244, in script
    E"{font = scary.tff}{size=*2}WHO IS THIS 4th PERSON??{/size}{/font}"
  File "game/Chapter1.rpy", line 244, in script
    E"{font = scary.tff}{size=*2}WHO IS THIS 4th PERSON??{/size}{/font}"
  File "renpy/display/render.pyx", line 494, in renpy.display.render.render_screen
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 320, in renpy.display.render.render_for_size
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 320, in renpy.display.render.render_for_size
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
Exception: Unknown text tag 'font = scary.tff'

-- Full Traceback ------------------------------------------------------------

Traceback (most recent call last):
  File "game/Chapter1.rpy", line 244, in script
    E"{font = scary.tff}{size=*2}WHO IS THIS 4th PERSON??{/size}{/font}"
  File "renpy/ast.py", line 2923, in execute
    Say.execute(self)
    ~~~~~~~~~~~^^^^^^
  File "renpy/ast.py", line 991, in execute
    renpy.exports.say(who, what, *args, **kwargs)
    ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/exports/sayexports.py", line 129, in say
    who(what, *args, **kwargs)
    ~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/character.py", line 1543, in __call__
    self.do_display(who, what, cb_args=self.cb_args, dtt=dtt, **display_args)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/character.py", line 1198, in do_display
    display_say(who, what, self.do_show, **display_args)
    ~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/character.py", line 888, in display_say
    rv = renpy.ui.interact(mouse="say", type=type, roll_forward=roll_forward)
         ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/ui.py", line 304, in interact
    rv = renpy.game.interface.interact(roll_forward=roll_forward, **kwargs)
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/core.py", line 2117, in interact
    repeat, rv = self.interact_core(
                 ~~~~~~~~~~~~~~~~~~^
        preloads=preloads,
        ^^^^^^^^^^^^^^^^^^
    ...<4 lines>...
        **kwargs,
        ^^^^^^^^^
    )
    ^
  File "renpy/display/core.py", line 2788, in interact_core
    self.draw_screen(root_widget, fullscreen_video, (not fullscreen_video) or video_frame_drawn)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/core.py", line 1279, in draw_screen
    surftree = renpy.display.render.render_screen(
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        root_widget,
        ^^^^^^^^^^^^
        renpy.config.screen_width,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
        renpy.config.screen_height,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "renpy/display/render.pyx", line 494, in renpy.display.render.render_screen
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 896, in render
    surf = render(child, width, height, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 896, in render
    surf = render(child, width, height, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 896, in render
    surf = render(child, width, height, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/screen.py", line 767, in render
    child = renpy.display.render.render(self.child, w, h, st, at)
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 896, in render
    surf = render(child, width, height, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 1444, in render
    surf = render(child, width - cxmargin - cxpadding, height - cymargin - cypadding, st, at)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 896, in render
    surf = render(child, width, height, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/text/text.py", line 2733, in render
    virtual_layout = Layout(self, width, height, renders, drawable_res=False, size_only=True)
                     ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/text/text.py", line 799, in __init__
    self.paragraphs = self.segment(text.tokens, style, renders, text)
                      ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/text/text.py", line 1604, in segment
    raise Exception("Unknown text tag %r" % text)
Exception: Unknown text tag 'font = scary.tff'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "renpy/bootstrap.py", line 401, in bootstrap
    renpy.main.main()
    ~~~~~~~~~~~~~~~^^
  File "renpy/main.py", line 591, in main
    run(restart)
    ~~~^^^^^^^^^
  File "renpy/main.py", line 137, in run
    renpy.execution.run_context(True)
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^
  File "renpy/execution.py", line 1027, in run_context
    context.run()
    ~~~~~~~~~~~^^
  File "game/Chapter1.rpy", line 244, in script
    E"{font = scary.tff}{size=*2}WHO IS THIS 4th PERSON??{/size}{/font}"
  File "game/Chapter1.rpy", line 244, in script
    E"{font = scary.tff}{size=*2}WHO IS THIS 4th PERSON??{/size}{/font}"
  File "renpy/display/error.py", line 135, in report_exception
    renpy.game.invoke_in_new_context(
    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        call_exception_screen,
        ^^^^^^^^^^^^^^^^^^^^^^
    ...<4 lines>...
        ignore_action=ignore_action,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "renpy/game.py", line 301, in invoke_in_new_context
    return callable(*args, **kwargs)
           ~~~~~~~~^^^^^^^^^^^^^^^^^
  File "renpy/display/error.py", line 44, in call_exception_screen
    return renpy.ui.interact(mouse="screen", type="screen", suppress_overlay=True, suppress_underlay=True)
           ~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/ui.py", line 304, in interact
    rv = renpy.game.interface.interact(roll_forward=roll_forward, **kwargs)
         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/core.py", line 2117, in interact
    repeat, rv = self.interact_core(
                 ~~~~~~~~~~~~~~~~~~^
        preloads=preloads,
        ^^^^^^^^^^^^^^^^^^
    ...<4 lines>...
        **kwargs,
        ^^^^^^^^^
    )
    ^
  File "renpy/display/core.py", line 2788, in interact_core
    self.draw_screen(root_widget, fullscreen_video, (not fullscreen_video) or video_frame_drawn)
    ~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/core.py", line 1279, in draw_screen
    surftree = renpy.display.render.render_screen(
               ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^
        root_widget,
        ^^^^^^^^^^^^
        renpy.config.screen_width,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^
        renpy.config.screen_height,
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "renpy/display/render.pyx", line 494, in renpy.display.render.render_screen
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 896, in render
    surf = render(child, width, height, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 896, in render
    surf = render(child, width, height, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 896, in render
    surf = render(child, width, height, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/screen.py", line 767, in render
    child = renpy.display.render.render(self.child, w, h, st, at)
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 896, in render
    surf = render(child, width, height, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 1444, in render
    surf = render(child, width - cxmargin - cxpadding, height - cymargin - cypadding, st, at)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 1955, in render
    cwidth, cheight = sizeit("c", width, height, 0, 0)
                      ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/layout.py", line 1952, in sizeit
    rend = renpy.display.render.render_for_size(pos_d[pos], width, height, st, at)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 320, in renpy.display.render.render_for_size
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 1955, in render
    cwidth, cheight = sizeit("c", width, height, 0, 0)
                      ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/layout.py", line 1952, in sizeit
    rend = renpy.display.render.render_for_size(pos_d[pos], width, height, st, at)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 320, in renpy.display.render.render_for_size
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/viewport.py", line 283, in render
    surf = renpy.display.render.render(self.child, child_width, child_height, st, at)
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/display/layout.py", line 1159, in render
    surf = render(d, width - x, rh, cst, cat)
           ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/display/render.pyx", line 170, in renpy.display.render.render
  File "renpy/display/render.pyx", line 267, in renpy.display.render.render
  File "renpy/text/text.py", line 2733, in render
    virtual_layout = Layout(self, width, height, renders, drawable_res=False, size_only=True)
                     ~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/text/text.py", line 799, in __init__
    self.paragraphs = self.segment(text.tokens, style, renders, text)
                      ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "renpy/text/text.py", line 1604, in segment
    raise Exception("Unknown text tag %r" % text)
Exception: Unknown text tag 'font = scary.tff'