RiotLtRandolph

RiotLtRandolph



01 Nov

Comment

I play with a Kinesis Advantage keyboard, so I keep my fingers on "home position". Any game that uses WASD, I remap to ESDF.

I came to League directly from WoW, so I mapped the camera to ESDF, and spells to 1234.

I'm the reason there's a separate slider for mouse scroll speed vs. keyboard scroll speed; I turn mouse scroll speed waaaaay down so if I hit the edge of the screen I don't get completely disoriented.

Oh, and my keyboard is actually a custom Dvorak layout based on "Programmer's Dvorak", so I just described to you the QWERTY positions of the keys. If I were to type those "ESDF" keys, it would actually type ">OEU".

Edit: You can reach Gold 2 like that. ;-)


15 Oct

Comment

Originally posted by Domasis

What led to the discovery of the Shurima Shuffle, was it intentionally made to exist or was it an accident? Were you guys considering ever fixing it if it wasnt?

How'd you code the tech for Azir and his soldiers?

Why did Children of The Grave bug out so much? Did you guys ever consider rescripting it before the gameplay team decided to VGU him?

What's the funniest bug you've seen?

What led to the discovery of the Shurima Shuffle, was it intentionally made to exist or was it an accident? Were you guys considering ever fixing it if it wasnt?

I'm not sure exactly, but I know that these sorts of subtle timing interactions happen all the time.

How'd you code the tech for Azir and his soldiers?

There's a script event call PreLaunchAttack that lets you do reactions to when an auto-attack is about to be fired. When that happens, Azir gets to check whether there are any soldiers nearby, and if so, switches to casting a spell that tells them to cast a spell, instead of doing his auto-attack. Some other examples that use that system include Graves, Rakan (to have different auto attacks at different ranges), and Kalista.

Why did Children of The Grave bug out so much? Did you guys ever consider rescripting it before the gameplay team decided to VGU him?

...

Read more
Comment

Originally posted by Shaqfuuuuu

1 - How does Morde ult work?

So the interactions layers, or Dimensions as we coin it, are a property that lives on each game object. A game Object is the base primitive that all minions, champions, Towers, Teemos, missiles, and basically everything else in league inherit from. The dimension property allows two game objects to ask the question "Hey are you in the same dimension as me, Yes cool we can Interact...or No nevermind on to the next". The vision system, Fog of War, also respects dimensions which makes it so you can only see game objects that are in the same dimension as you. With these two things combine we have Morde's death realm in all its glory.

(Making sure this post gets Riot flair. Shaqfuuuuu sits next to me, but apparently something happened to his reddit flair)

Comment

Originally posted by Ekanselttar

What exactly was going on under the hood in the "Xerath uses Q at a very specific spot and it hits the entire map" bug?

What exactly was going on under the hood in the "Xerath uses Q at a very specific spot and it hits the entire map" bug?

That's one of several bugs we've run into with skillshots going "up". We have a lot of scripting blocks that let you make sure you're only working in XZ, ignoring the Y component. But there are also things that operate in XYZ. If you do something like asking "how far away along this line is an enemy" and that line is pointing straight up, the answer will be "not very far away", since both units are standing on the ground.

That's a slight oversimplification of the exact math problem, but it's the basic idea.

We've hardened a bunch of code paths against using vectors that only have Y components to avoid bugs like this.

Comment

Originally posted by Cezaros

Where is pointy 0.0.0 in game? A mean the very base of on map going. Or is there nie such?

On Summoner's Rift, (0, 0, 0) is a little below the ground just off the map to the southwest. Anytime I see a bug with things heading down and to the left, the first thing I check is whether there's some vector that might have accidentally been set to the origin.

Comment

Originally posted by DeadNames

Can you explain "taunty"

It's pretty common to put "debug prints" in scripts to figure out what's going on. For example "I wonder whether we're actually executing this part of the script, so I'll make it say something if we do."

But sometimes you forget to remove those debug prints, once you're done fixing the bug or adding the feature.

We've made some changes in recent times to make it less likely that those debug prints actually do anything on Live builds, by making most versions of printing to chat only happen on internal builds. That said, things like Draven passive do want to have scripted printing to chat, so we can't turn off printing to chat entirely. We just need to make sure that creators easily get the behavior they want.

IIRC, the "taunty" debug print was in a "raw lua script" as opposed to a "blockbuilder script", which means it was in a less common type of script, and thus its behavior was less well understood.

Comment

Originally posted by FireWolf250

Thank you for responding and answering my questions :)

I think I was not as clear as should have been about my second question. Riven Q3 can go through walls, and E cannot, but E can clip you into a wall enough to allow you to hop it from inside of it. So certain walls are only hoppable if you use E, even if you had perfect positioning with Q3.

Ahhh. Subtle timing-based stuff like this definitely happens in a lot of places. For example Shen, Gragas, J4 having their CC interact with flash being cast in the middle of their dashes could be called a bug, but also leads to awesome plays.

So basically I'd say I'm not surprised that there are weird timing interactions with Riven's dashes.

Comment

Originally posted by Danmoreng

  1. What engine is League based on? 100% homebrew?

  2. Do you have level editors?

  3. Would it be possible to open League for modding by players like Warcraft 3 or Dota 2 does?

What engine is League based on? 100% homebrew?

League is built in the League engine, which is a custom engine built in C++.

Do you have level editors?

In the past few years we've built up a level editor, specifically aimed at making custom game modes easier to do. Back when we did the Summoner's Rift Update, there was a complicated process of black magic and Maya exporting that needed to be done to update the map. But now, with Maps Mountain, we can do relatively quick iterations on map things.

Would it be possible to open League for modding by players like Warcraft 3 or Dota 2 does?

Support for modding is a huge decision for a studio to undertake. It requires a lot of extra effort and support to make something that's stable enough for external creators to work. It's pretty easy, if you know what you're doing, to make League crash by doing bad stuff with data. An...

Read more
Comment

Originally posted by Emosaa

This is random, but I remember reading / hearing at some point in the past that Thresh Q was a combination of Blitz hook and Lee Sin Q. Any truth to that?!

I'm not sure exactly how much truth there is there. It is pretty common (in League development and software development in general) to copy/paste sections of code or script that do something similar to what you want to do. So I wouldn't be surprised if Thresh Q was built by copying some elements of each of those spells.

Comment

Originally posted by Poluact

Eh. I captured my screen with Overwolf and it shows buttons pressed on the screen. There is a clear disconnect between mouse position and button pressed. Here's some screenshots: 1 - cursor position before I pressed Q, 2 - I changed cursor position but still didn't press Q, 3 - I pressed Q here, 4 - Q flies in a wrong direction. Am I missing something? I mean, besides that Q. :)

Actually I'm not sure. I will say that this is the sort of bug we often spend a while digging into. Subtle timing issues and interactions between spells can be challenging to figure out.

I can say that Ahri Q uses an old pattern that we've been moving away from:

FaceDirection

GetPointByUnitFacing

This can misbehave if for any reason the champion refuses to face a given direction. For example, Yuumi is forced to face a given direction when casting R, and there was a bug where she would always flash in that direction, rather than where you tried to flash to. I rewrote Flash to not rely on setting the facing of the unit in order to choose a target position.

Comment

Originally posted by Godly_Sinner

if a computer science student wanted to work at riot in the future what are the key attributes he/she should improve ?

If you want to work as a game engineer, the most important things I would focus on are:

  1. Collaboration/communication, particularly with non-technical creators. We constantly work with designers and artists. It's not important that they know exactly what the computer is doing. But they need to know how the computer's behavior will affect their ability to make something awesome.
  2. Understanding of how game engines work, at a high level, across a lot of technology areas. For example, rendering, animation, scripting, networking, physics, sound, VFX, etc. I'm not saying that you need to know every detail about how all of these systems work. But having a reasonable understanding of the interactions between them can help you speak intelligently about how things are built.
  3. Some technology area that you specialize in. Choose one of those areas from Point 2, and make sure that you understand deeply what's going on. Let's say you want to specialize in VFX. A great...
Read more
Comment

Originally posted by FireWolf250

As a trashy Riven main, of course all of my questions are going to be about her :P.

  • How did Riot respond initially to the bugs on Riven that became features, like doublecasting and the fast q?
  • When Riven e's into a wall from a certain distance, she will briefly clip into the wall before being pushed out, but this small window allows her to jump some massive walls, such as raptors to midlane. Why/how does this occur?
  • Riven for a while now has had a bug where her q will go backwards when you lock-on q while close to someone, is Riot aware of this?

EDIT: Why does Nidalee Q convert sheen damage into magic?

How did Riot respond initially to the bugs on Riven that became features, like doublecasting and the fast q?

With any champion and any bug, we have to make decisions like that about whether to fix something, or whether to even think of it as a bug anymore. I can't speak to exactly how we make those design decisions. But I have seen "bugs" specifically on Riven that happened because we fixed things that we considered systemic bugs, but we then needed to reimplement the behavior that Riven relied on. Specifically around animation cancelling.

Riven is aimed at a very specific combo/animation cancelling gameplay fantasy that means she stresses our animation and spell casting flow a lot. As a game engineer, I love having a champion like that in the game to make sure we're questioning our assumptions and building with an open mind.

When Riven e's into a wall from a certain distance, she will briefly clip into the wall before...

Read more
Comment

Originally posted by LordCaelistis

If I understood correctly, the behavior described by LtRandolph is only used by Yuumi's Q. Other spells have absolutely no use for such a system since their direction / location / target etc. is determined upon casting (the calculation only happens once). So the issue you're raising may not be related, but it's a good question.

Correct, this mouse tracking was built specifically for Yuumi Q.

What you're describing sounds more to me like an issue somewhere between input latency and human perception. Any game engine needs to take into account delays between when a button is pressed and when it is reacted to. You can shift input samples around within a frame. Some games are drawing "last frame" while setting up "this frame", which leads to an extra frame of latency from your input. But also the human brain is bad at identifying exactly what's happening on extremely fast timelines, like the framerate of a video game. Sometimes the brain's prediction of "I'm going to do the thing" winds up dominating the perception of what's actually been done.

I'm guessing, Poluact, that you're experiencing a mix of both of these phenomena, making it so that if your mouse moved a lot in ~1/30 of a second or so, the game won't necessarily agree with you on exactly where it was when you pushed your key.

Comment

Originally posted by luk3d

What caused it to stutter when Yuumi was released?

When it first came out, there were some challenges with it deciding what height to draw at. Our game logic (almost) all takes place in 2D, but we then need to draw missiles at a height that makes them understandable, dodgeable, etc.

I added a new field to the "follow terrain height solver" that controls the maximum slope that a missile can follow. That prevented it from jumping up and down as it crossed over walls, down into the river, etc.

Comment

Originally posted by BruC0Ndr

What was the most difficult ability to make?

And how difficult is it to visualize and execute the champion designers concept into an ability?

Also super awesome ur doing an AMA! Love you guys! Never change swain anymore pls

What was the most difficult ability to make?

The hardest ones I've been around for have been Sylas ult, Neeko disguise passive, and Mordekaiser ult. All of them share one specific quality that makes them way harder to build than a typical spell. Each of them required special care to make sure that every other champion works with them.

For Sylas ult, we needed to get a much cleaner definition of "what is a spell?" It couldn't just be a miserable little pile of scripts.

For Neeko disguise, there were a ton of special cases for things like Aurelion Sol missiles, Graves auto attack, DJ Sona, etc. that required special handling to take the visuals and auto attacks without taking on the entire identity of the character.

For Mordekaiser, we specifically needed to think about what happens with every spell in the game when it's cast as you transition into/out of the death realm. We tried to come up with solutions that work correctly...

Read more
Comment

Originally posted by FrankTheBoxMonster

These are going to be kind of all over the place, apologies.

1 - How does Morde ult work? The video at his release talked about "different interaction layers", but what went into building that separation? Is "realm" now included in all position values? Does every ForEachUnitInXXX now have flags for which realm(s) to look in? Did you have to make a lot of changes to spell scripts to handle units being in different realms?

2 - How does Yuumi Q work with the cursor following?

3 - How did you get extra spell slots to work with Sylas ult? Just assigning each one before casting it?

4 - What was the removed "Baubles" spell slot supposed to be used for?

5 - What was the removed "Scriptable" missile type for?

6 - Why does Aurelion Sol passive have a different missile type than the other circle missiles?

7 - Why does Xayah passive have a unique missile type not found on anyone else?

8 - What are NextSpellVars for? Next cas...

Read more

3 - How did you get extra spell slots to work with Sylas ult? Just assigning each one before casting it?

For context, lots of "spells" that you would think of are actually made up of several spells, some of which are automatically cast by the game. For example, Lulu Whimsy has two different spells for whether you cast on an ally or enemy. Those extra spells are put into hidden "spell slots" that are kind of like the QWERDF slots, but players can't push a button to cast them.

Yeah, we've changed the best practice for "extra spell slots" for a number of reasons, and Sylas was a forcing function to clean up a bunch of cases that didn't handle it. Rather than just saying "Cast extra slot 4" in scripts, which requires you to go look somewhere else to figure out what spell that is, we expect scripts to say "Put LuluWhimsyEnemy in extra slot 4. Cast extra slot 4"

And Sylas was built to be very careful with his own use of extra slots to m...

Read more
Comment

Originally posted by FrankTheBoxMonster

These are going to be kind of all over the place, apologies.

1 - How does Morde ult work? The video at his release talked about "different interaction layers", but what went into building that separation? Is "realm" now included in all position values? Does every ForEachUnitInXXX now have flags for which realm(s) to look in? Did you have to make a lot of changes to spell scripts to handle units being in different realms?

2 - How does Yuumi Q work with the cursor following?

3 - How did you get extra spell slots to work with Sylas ult? Just assigning each one before casting it?

4 - What was the removed "Baubles" spell slot supposed to be used for?

5 - What was the removed "Scriptable" missile type for?

6 - Why does Aurelion Sol passive have a different missile type than the other circle missiles?

7 - Why does Xayah passive have a unique missile type not found on anyone else?

8 - What are NextSpellVars for? Next cas...

Read more

2 - How does Yuumi Q work with the cursor following?

We needed to make sure that it works well even with lag. Thus there's a delay between when the mouse is in a new position and when the missile starts chasing that position. Your game client sends up 3 recent mouse positions to the game server, and a timestamp for when they were sampled. Every 1/10th of a second or so it sends new positions.

The server then takes those 3 mouse positions and the time. It uses the most recent mouse sample that it has that is older than the lag-offset delay I mentioned above. So if it's been hearing quickly from the client, it will use a sample "from the right time". But if there's some lag, it will stick with whatever the most recent mouse sample that it's heard of.

The server then sends down to every game client the exact path that the missile follows, a little bit before the missile "actually moves", so everyone can draw it in the right place.

... Read more
Comment

Originally posted by AFKGecko

So, let's talk minion block. I get that it is supposed to exist, but right now it's incredibly frustrating and sometimes you just get stuck with no way out. Is there no way to lower the amount of body block in the game, because it's not really a fun mechanic?

edit: just gonna plug a #freehongkong here, stay woke guys

So, let's talk minion block. I get that it is supposed to exist, but right now it's incredibly frustrating and sometimes you just get stuck with no way out. Is there no way to lower the amount of body block in the game, because it's not really a fun mechanic?

The pathing system is one of the more challenging places to do engineering work. It's a complicated system, has the potential to be very expensive on both player machines and game servers, and has a direct impact on important feels. This makes it so we would need to be very confident that a change that we're considering would definitely be an improvement in order to put in the effort.

We can certainly all point to times where, as players, we've had a bad time with minion block. I know there have been some hacked together experiments like, for example, having different collision radii for allies vs. enemies. But none of those prototypes have "solved" the issues sufficiently for us to d...

Read more

Hi Reddit!

We’re game engineers working on League of Legends, and we’d love to chat with you about how the game works. If you have questions about how League works under the hood, send them our way. For example, we could talk about the Dimension tech of Mordekaiser’s ult, differences between TFT’s game loop and Summoner’s Rift’s, your favorite weird bug, or what it’s like to be a game engineer.

There are a few sensitive subjects we won’t talk about (anti-cheat, for example), but we’ll do our best to answer as many of your questions as we can! We'll start answering questions around 10:30.

Participants

RiotLtRandolph - Champions Team

Penrif - LoL Tech Lead

NoopMoney - Champions Team

RiotEntquine - Champions Team

RiotNullarbor - TFT Team

RiotTony - Core Tech Team (Aus time zone)

Spawndog - Gameplay Tech Lead

Riot_DarthBatman - Core Tech Team

ShaqFuuuuu - Champions Team

External link →

12 Sep

Comment

Originally posted by mornaq

you actually shouldn't even send data about stuff in fog of war (unless it's in buffer zone to prevent lag, but seeing particles on Baron while everyone sits on fountain is not this case)

Correct. But you should send e.g. that Zoe Q, Ezreal R, Ashe R that's heading towards you out of fog of war. And you should send that Nasus E that's mostly in fog, but you can see the edge of it.

Also, you should draw the turret that's in fog, but not the champion that is.

So those edge cases make it complicated to navigate.

The visibility system is one of those engine areas that we tend to tiptoe around because it needs to be fast, accurate, and fair. And any change you make could break a million things. That said, things like Mordekaiser's new R have had us moving more boldly in the space than we have before. The future is exciting.