Pastebin
API
tools
faq
paste
Login
Sign up
Please fix the following errors:
New Paste
Syntax Highlighting
A couple of weeks ago, I had an email conversation with Matt Whiting, one of the programmers for the original Spyro trilogy. I've heavily paraphrased my emails and lightly paraphrased his so that it's not such an intimidating wall of text. I think most people are more interested in his answers than how I phrased or lead up to a question anyway, but, if you'd like more context for a specific question/answer, ask me about it and I'll read the unedited section and give my thoughts on that part of the conversation. You can access this document by typing "!mattwhiting" in my chat. ** Paraphrased Questions ** What was your individual role in the creation of Spyro? (Having seen the Any% run) What was most surprising to you? What was least surprising to you? ** Matt Whiting's Answers ** I was responsible for Spyro's controls and the camera. In addition to that, I programmed some of the levels of the game which typically meant programming the enemy behaviors and any custom stuff for the level. It also meant placing all the enemy triggers, gems, whirlwinds, treasure chests, and whatever else into the scene. I also ended up responsible for a bunch of the special effects. The portals that take you from the home worlds to the other levels was one of my creations. What was most surprising? Hmm... I'd have to say zombie mode. I programmed Spyro, and looking back, I can imagine that there must have been a single-frame glitch in the logic there, but I'm quite surprised that QA never caught that. What was least surprising? Some of that stuff I knew about, but it was amazing to see you exploit it so well. Charge-diving through the edges of water to leave yourself in permanent swim mode was caught by QA, and we tried to cover that over where we found it, but we knew it was still theoretically possible. Also (as Brian said in the video), we went around and removed collisions from places we thought you probably couldn't get to in order to save memory. We knew it was risky, and sometimes we even knew you could get there, but we didn't fully appreciate just how much you'd be able to exploit it. In short, we kind of knew there were exploits, but we were basically ok with that. It's a single-player game, so it's not like you can cheat anyone with these things. It was always my opinion that if you were willing to work that hard to find an exploit, we should let you play the game your way. As long as most players would never encounter these things during normal play, I'm ok with it. ** Paraphrased Questions ** If the speedway glitch hadn't existed, would there still have been a second release? Were most of the version changes discovered by QA or by players after release? Was anything changed/cut that was particularly memorable to you? What do you remember about the adaptive difficulty in the game? ** Matt Whiting's Answers ** Yes the speedway glitch was bad. There was another bug of a similar nature on that version but not nearly as bad. Those things are the reason for the 2nd release. I did not even remember any of those other fixes. As I said, I was pretty upset about the speedway glitch. Spyro 3 was my last game with Insomniac, so maybe they fixed those other things later on. QA was a major issue with Spyro 3. I don't recall them having caught most of these things. They did catch the thing where you can charge through the corner of some water to swim through the air. I think most of the rest was found post-release. As far as changing things during production, that was standard operating procedure. Each level started with some ideas, and very often we would do many iterations on them before we arrived on something good. The round skate rink thing was quite memorable. The idea started as a roller derby where the enemies would try to knock you off the track. It was no fun at all, and it eventually morphed into cat hockey. Total transformation. I don't remember all the details, but IIRC, there were 2 layers to the difficulty. There was an overall difficulty probably based on number of deaths and time played. But also many challenges had their own dynamic difficulty that usually triggered based on the number of tries or the amount of time spent trying. All the egg thieves work this way for example. They are programmed to start off very fast and slow down little by little over time until they become easier to catch. Each challenge was tuned individually. The overall thing that controlled which enemies spawned and which didn't was based on number of deaths I thought. ** Paraphrased Questions ** Was the other bug you mentioned the unreachable gem issue in Fireworks Factory? Did the additional playable characters go through the same iterative process as the other things in the game (if so, please elaborate)? What was the purpose of the unused room in Midday Gardens? What is fundamentally different about the thief egg in Bamboo Terrace and the thief egg in Midday Gardens (I contrasted their storage)? How were teams constructed for each level or was it a collective effort? What was your favorite level in the game? Any theories on the Bluto pause buffering glitch in Seashell Shore? ** Matt Whiting's Answers ** Yeah the fireworks factory was our other known "A+" bug. That one wasn't my fault. It was a combination of a programmer and a designer. The designer made some changes to the difficulty settings on some of the enemies, and didn't tell the programmer, so the programmer didn't know that it had to be accounted for. As far as I recall, the other playable characters came together pretty smoothly. I don't remember any major iterations on those amazingly. They were tuned of course, and expanded upon as we developed them. For example, the look-down targeting camera on Sgt. Byrd came out of testing and trial. Also the strafe mode when you hold both shoulder buttons was not part of the base design. The base design was for a hovering penguin who fired rockets from his shoulders. The rest would come out of trial and error. Agent 9 was designed to explore the typical shooter gameplay types, so that stuff was pretty straight-forward. I don't recall the specific room in Midday Gardens. I strongly suspect that you are correct about boss access. The entire development of the Spyro games was more iterative than is often understood. It seems likely that the artist who built Midday Gardens was operating under the expectation that bosses would be behind large doors like in Spyro 2, but at some point the vehicle design was solidified. The key difference added with the vehicles was that the avatars from each of the levels within that world are represented there. That created the rule of having to complete the baseline of each level in order to move forward, but it was incongruous with having the bosses behind big doors. The Bamboo Terrace question is closely related to the next one. Each level was assigned an artist, a designer, and a programmer. These were rotated through for different levels so that we each got to work with each other at various times. So the baseline was that a "team" was built for each level, but in Spyro 3, each level had multiple mini-games in it, so we would sometimes mix-n-match those. Also some concepts are shared between levels, so for those, we would share the results most of the time to avoid duplication of work. Something that is not often understood about these games is that everything was custom coded. For example, the thief you mention was an entirely different game object (called a Moby at Insomniac) from the others. His gameplay code likely borrowed from the others in a cut-n-paste style, but the means of hiding him was clearly different. It is likely that the programmers discussed how that was done, but ultimately each of us made our own decisions about how to handle it in each case. Uninterruptible cut-scenes are an example of that. That was ultimately up to the programmer doing it. Some of us (me) were hard-core about making cut-scenes skippable. Others were less bothered about it, and it was certainly extra work to make that happen, so some cut-scenes are skippable while others are not. My favorite level... I was very proud of the flying rounds in Spyro 3. I really liked Handel and Greta and the haiku swamp, but my favorite has got to be the one with the cows with laser guns. Ok.. the flickering thing. I don't specifically remember that, and I don't think QA ever caught it, but I'll give you a guess. What I'm seeing is that the display area is getting sized incorrectly showing some of the video ram beside the display buffer. And then things can get progressively worse after that and I think even sometimes crash right? I'd guess that was a buffer-overrun. Something used more memory than it was supposed to and overwrote something important with the graphic system. Hard to say what though. ** Paraphrased Questions ** I ask for clarification on how things are moved and activated in the game using the Bamboo Terrace thief egg and the Fireworks Factory cannons as examples. Are there any artists or designers that you particularly enjoyed being paired with (if so, why)? What did the term "Moby" mean? I ask for clarification on the effect of buffer overruns with a hypothetical example. Any theories on the gem targeting glitch in Molten Crater? Any theories on the broken thieves in Icy Peak? ** Matt Whiting's Answers ** I don't remember all the details. All objects were placed using a tool that was custom written for the job. We'd load up a wireframe of the level and place little markers where we wanted things to spawn. That tool would save out a file that the game would load in. So we'd choose the spot we wanted the thief to spawn and place his marker there. As you have guessed, the egg was a separate object. I expect it was also placed in the level, and the 2 objects were "linked" using the tool so that the thief could get the egg. The code that drove them would have mostly been in the thief - at least up until the moment the egg was caught. The cannons would be running a small piece of code that checked for their prerequisite in a pattern gameplay programmers refer to as "polling". We had a simple array of global flags that we could trigger things like this off of. The Greta conversation would set one of those flags, and the cannon would poll on that flag. When the flag was set, the cannon would activate itself. Everyone at Insomniac was great. Naturally I did have my favorites. I'll call out John Fiorito as a fantastic environment artist. I distinctly remember Craig Stitt's amazing work with the backgrounds (which we called cycloramas). The character art by Vanessa Jones and Oliver Wade was transformative as we went from Spyro to Spyro 2. Each of the designers was outstanding, if very different. Caroline Trujillo was a favorite, and I was always in awe of Mark Cerny's uncanny ability to make a map that worked on the first try every time. By way of a "story" for you, I often look back at how critical I was of everyone's work back then. It is a regret of mine that my obsession with making it perfect led to overly harsh criticism on my part that I would do very differently if I were more mature. The term "mob" was a pretty common term in the business and I believe it stood for "mobile object", although I've also heard "monster object". We just called them "moby" instead of "mob". When a buffer overrun occurs, it's very hard to predict what the result would be without sitting there with the debugger and checking exactly what was in the adjacent memory. Really anything could happen, but the most common result is a crash. Clearly I never debugged that one. My guess would be that Sparx is initialized incorrectly there. The logic that decides if there is a gem within reach seems to have been triggered for a gem impossibly far away. It could be that the position Sparx uses as the center for the search (which is supposed to be Spyro's position) was incorrect during that initialization. This could mean that Spyro was actually out of position for a frame or part of a frame, and he wasn't updated properly. I used to nag at the other programmers not to move Spyro directly but to use the function I provided for that purpose, but maybe someone didn't remember. Or perhaps it is related to the state transition that Sparx is going through as he hits the green gem and then goes up to the pause screen and then transitions to the main level from the minigame. That's a weird one. I'd have to look in the debugger to figure out what was happening. The thieves reset under certain circumstances. I have absolutely no idea why hitting the camera button would be related to that at all. ** Paraphrased Questions ** How close to the original concept was Spyro 1? What made you decide to change Spyro's movement so drastically between Spyro 1 and Spyro 2? What was your focus between games? Was anything changed/cut (in Spyro 1 or Spyro 2) that was particularly memorable to you? Was John's description of the unfinished area in Dino Mines (a quick draw challenge with Agent 9) similar to what you remember? Were there any debug features left in any of the three games? ** Matt Whiting's Answers ** I would describe the concept of Spyro as very emergent. It started as simply the idea that dragons are cool. As the team started, Mark Cerny identified that the Playstation was in need of games for a younger audience. So the dragon became a baby dragon. A green dragon didn't pop well against a grass background, so Spyro became purple. Charles Zembillas did some drawings of Spyro (he wasn't named that yet), and the team built him and started playing with him... giving him a personality and exploring his mechanics. That's when I joined the team. The main design focus was: a) Kid-friendly b) Anyone should be able to finish it, but there should be challenges for advanced players c) It was to be a 3D platformer d) It was going to focus on enemy interaction From what I remember, the change in Spyro's movement was that we felt Spyro 2 had to add something that Spyro 1 didn't already have. The team felt pretty strongly that we couldn't just make more levels of the exact same game. We had to add something to it. Also, many of us pushed for more challenge and more variety. For Spyro 3, we pushed it even farther. We had mostly run out of good ideas on how to expand on Spyro's move set at that point, so we added the extra playable characters. For Spyro 1, we had planned an entire extra hub world, and Gnasty's world was going to be a full-sized world. After E3, we had a meeting where we were all told about those cuts. Many of us were pretty upset at the loss, but it was the right call. We were only able to achieve the level of quality that we did because we didn't have to build all those levels. I don't think I remember any other cut content. You've actually pointed out some stuff I didn't even remember. :) I don't remember the unfinished area in Dino Mines even. That was a fantastic level, but it wasn't one of mine. I don't really recall a bunch of cut content from Spyro 2 & 3. Clearly it happened... the level designs were extremely fluid. We'd try things and see what worked and what didn't. If something wasn't working, we'd usually replace it. If time ran short for a level, we'd cut something. I don't remember much about what the cut stuff was, but I do remember some wild iterations to come up with something that worked. There were cheat codes. Some of these were in for debugging purposes, but some were just in there for players. Frankly, at the time there was a booming business in selling booklets with guides on how to beat a game. We worked directly with the company making those guides. We provided maps for them to include and gave them the location of every gem. We also generated some special content just for them (for example a cheat code to change Spyro's color). As far as I know, all cheat codes are known. It's been fun answering. I'll love Spyro and those days forever. Talk to you soon
Optional Paste Settings
Category:
None
Cryptocurrency
Cybersecurity
Fixit
Food
Gaming
Haiku
Help
History
Housing
Jokes
Legal
Money
Movies
Music
Pets
Photo
Science
Software
Source Code
Spirit
Sports
Travel
TV
Writing
Tags:
Syntax Highlighting:
None
Bash
C
C#
C++
CSS
HTML
JSON
Java
JavaScript
Lua
Markdown (PRO members only)
Objective C
PHP
Perl
Python
Ruby
Swift
4CS
6502 ACME Cross Assembler
6502 Kick Assembler
6502 TASM/64TASS
ABAP
AIMMS
ALGOL 68
APT Sources
ARM
ASM (NASM)
ASP
ActionScript
ActionScript 3
Ada
Apache Log
AppleScript
Arduino
Asymptote
AutoIt
Autohotkey
Avisynth
Awk
BASCOM AVR
BNF
BOO
Bash
Basic4GL
Batch
BibTeX
Blitz Basic
Blitz3D
BlitzMax
BrainFuck
C
C (WinAPI)
C Intermediate Language
C for Macs
C#
C++
C++ (WinAPI)
C++ (with Qt extensions)
C: Loadrunner
CAD DCL
CAD Lisp
CFDG
CMake
COBOL
CSS
Ceylon
ChaiScript
Chapel
Clojure
Clone C
Clone C++
CoffeeScript
ColdFusion
Cuesheet
D
DCL
DCPU-16
DCS
DIV
DOT
Dart
Delphi
Delphi Prism (Oxygene)
Diff
E
ECMAScript
EPC
Easytrieve
Eiffel
Email
Erlang
Euphoria
F#
FO Language
Falcon
Filemaker
Formula One
Fortran
FreeBasic
FreeSWITCH
GAMBAS
GDB
GDScript
Game Maker
Genero
Genie
GetText
Go
Godot GLSL
Groovy
GwBasic
HQ9 Plus
HTML
HTML 5
Haskell
Haxe
HicEst
IDL
INI file
INTERCAL
IO
ISPF Panel Definition
Icon
Inno Script
J
JCL
JSON
Java
Java 5
JavaScript
Julia
KSP (Kontakt Script)
KiXtart
Kotlin
LDIF
LLVM
LOL Code
LScript
Latex
Liberty BASIC
Linden Scripting
Lisp
Loco Basic
Logtalk
Lotus Formulas
Lotus Script
Lua
M68000 Assembler
MIX Assembler
MK-61/52
MPASM
MXML
MagikSF
Make
MapBasic
Markdown (PRO members only)
MatLab
Mercury
MetaPost
Modula 2
Modula 3
Motorola 68000 HiSoft Dev
MySQL
Nagios
NetRexx
Nginx
Nim
NullSoft Installer
OCaml
OCaml Brief
Oberon 2
Objeck Programming Langua
Objective C
Octave
Open Object Rexx
OpenBSD PACKET FILTER
OpenGL Shading
Openoffice BASIC
Oracle 11
Oracle 8
Oz
PARI/GP
PCRE
PHP
PHP Brief
PL/I
PL/SQL
POV-Ray
ParaSail
Pascal
Pawn
Per
Perl
Perl 6
Phix
Pic 16
Pike
Pixel Bender
PostScript
PostgreSQL
PowerBuilder
PowerShell
ProFTPd
Progress
Prolog
Properties
ProvideX
Puppet
PureBasic
PyCon
Python
Python for S60
QBasic
QML
R
RBScript
REBOL
REG
RPM Spec
Racket
Rails
Rexx
Robots
Roff Manpage
Ruby
Ruby Gnuplot
Rust
SAS
SCL
SPARK
SPARQL
SQF
SQL
SSH Config
Scala
Scheme
Scilab
SdlBasic
Smalltalk
Smarty
StandardML
StoneScript
SuperCollider
Swift
SystemVerilog
T-SQL
TCL
TeXgraph
Tera Term
TypeScript
TypoScript
UPC
Unicon
UnrealScript
Urbi
VB.NET
VBScript
VHDL
VIM
Vala
Vedit
VeriLog
Visual Pro Log
VisualBasic
VisualFoxPro
WHOIS
WhiteSpace
Winbatch
XBasic
XML
XPP
Xojo
Xorg Config
YAML
YARA
Z80 Assembler
ZXBasic
autoconf
jQuery
mIRC
newLISP
q/kdb+
thinBasic
Paste Expiration:
Never
Burn after read
10 Minutes
1 Hour
1 Day
1 Week
2 Weeks
1 Month
6 Months
1 Year
Paste Exposure:
Public
Unlisted
Private
Folder:
(members only)
Password
NEW
Enabled
Disabled
Burn after read
NEW
Paste Name / Title:
Create New Paste
Hello
Guest
Sign Up
or
Login
Sign in with Facebook
Sign in with Twitter
Sign in with Google
You are currently not logged in, this means you can not edit or delete anything you paste.
Sign Up
or
Login
Public Pastes
Crypto admin access
40 min ago | 0.43 KB
+12,000$ in 2 days
CSS | 41 min ago | 0.72 KB
Free Crypto Method
CSS | 41 min ago | 0.72 KB
Documents
41 min ago | 0.43 KB
Untitled
20 hours ago | 0.68 KB
The Road Not Taken
1 day ago | 0.79 KB
OG OLDHAM CODE
3 days ago | 27.75 KB
remove current bid and bid now button from au...
PHP | 4 days ago | 0.80 KB
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the
Cookies Policy
.
OK, I Understand
Not a member of Pastebin yet?
Sign Up
, it unlocks many cool features!