If you appreciate the work done within the wiki, please consider supporting The Cutting Room Floor on Patreon. Thanks for all your support!

The Simpsons Game (PlayStation 3, Xbox 360)

From The Cutting Room Floor
Jump to navigation Jump to search

Title Screen

The Simpsons Game

Also known as:
(ES) Los Simpson: El Videoguego
(FI) The Simpsons Videopeli
(FR) Les Simpson, le jeu
(IT) I Simpson: Il Videogioco
Developer: EA Redwood Shores[1]
Publisher: Electronic Arts[1]
Platforms: PlayStation 3, Xbox 360
Released in US: October 30, 2007[1]
Released in EU: November 9, 2007[1]
Released in AU: November 15, 2007[1]


AreasIcon.png This game has unused areas.
SourceIcon.png This game has uncompiled source code.
CopyrightIcon.png This game has hidden developer credits.
DevTextIcon.png This game has hidden development-related text.
GraphicsIcon.png This game has unused graphics.
TextIcon.png This game has unused text.
DebugIcon.png This game has debugging material.
LevelSelectIcon.png This game has a hidden level select.
Carts.png This game has revisional differences.


ProtoIcon.png This game has a prototype article
PrereleaseIcon.png This game has a prerelease article

This cactus is UNDER CONSTRUCTION
This article is a work in progress.
...Well, all the articles here are, in a way. But this one moreso, and the article may contain incomplete information and editor's notes.

The Simpsons Game is what you get when you make a Simpsons game with every game genre.

Sub-Pages

Read about prototype versions of this game that have been released or dumped.
Prototype Info
Read about prerelease information and/or media for this game.
Prerelease Info
TheSimpsonsGame360-FIN frontend.str-frontend split5.itxd-10 languages start-CROP.png
Making-of Movie
Three parts of a Making-of movie were planned, none of which made the final cut.

Early Names

Level Names

At some point in development, the episode names were changed to what they are now. The old names still remain in the code and file/folder names.

Early Name Final Name
The Treehugger Lisa The Tree Hugger
Cheater Cheater Enter the Cheatrix
Day of the Dolphins Day of the Dolphin
The Day Springfield Stood Still Invasion of the Yokel-Snatchers
Gamehub Game Engine
Rhymes with Complaining Five Characters in Search of an Author
Meet Thy Player Game Over
SPR_HUB Springfield

Movie Names

simpsons_gameflow.lua has several NewMovie() function calls and the first argument it requires is movieName, which has early/placeholder movie names passed to it.

Early Name Final Name
Homer's Dream Chocolate, Half Price
Homer Explodes Damn You, Reality!
gam_igc01 The Game Manual
Principal Skinner confesses Skinner Confesses
80 Bites Intro The Eating Contest
Homer wins You Blew It Up!
Lisa decides to do something I Have Super Powers?
Factory is blown up Out of a Job
Mayor Quimby declares GTS day Gimme Your Ride, Jerk!
gam_igc02 Alien Invasion
Lisa and Bart find themselves in the Game Engine Professor Frink?
Frink helps Bart and Lisa exit back to Springfield Frink's Bride
Free McAllister Snouts and Blowholes
Snorky is defeated Eggrolls! Revenge!
Set up objective Lard Lad
Lard Lad is defeated Eat Fist, Lard Crotch!
Aliens attack citizens A Yokel Is Abducted
Sideshow Bob Sideshow Bob?!
Homer and Bart go back into the game engine Cheating
gam_igc05 Find the Key Cards
Intro to Hobbit town My Ears Are Pointy
Homer grabs the shards My Precious!
Marge and Lisa enter GTS Game Cats and Mice
Hot Coffee, Hillary Clinton Video Game Violence
Retrieval of shard key, Normandy Invasion Victory
Mr. Dirt Intro The Realm of Mr. Dirt
Giant washing machine cleans everything Mr. Sparkle Has Risen
Opening mansion gate The Mansion Gates
Confronting Groening So Long, Suckers!
Praying A Stairway To Heaven
gam_igc07 Confronting God

Debug Replay

Hmmm...
To do:
  • See if there's a way to add or bring back the Debug Replay button like in OldGen.
  • These codes are raw memory offsets as I currently have no knowledge on any potential PS3/X360 cheat device and how it may work! --Edness
Debug Replay menu on PlayStation 3
Debug Replay menu on Xbox 360

There is a hidden menu internally called DebugReplay. It can be accessed in both the Old Generation release as well as here.

All Regions
PS3 00AF65B3 E8
360 8239F71F A4
(Source: Edness)

One slight difference, however, is that currently there is no way to add the Debug Replay button on the main menu in this release. Instead, these codes will replace the regular Episodes & Challenges menu with Debug Replay.

Unused Text

Cutscene Names

These appear in the videos menu in the Old-gen release because they're pre-rendered, but not in this version.

String ID String Label String
4E9A8E14 FE_FMV_04 The Bullies Scheme
4E9B8E50 FE_FMV_11 Quimby Unbribed
4E9C8E93 FE_FMV_25 Take Zat, Frenchies!
4E9D8ECF FE_FMV_32 The Creator

Downloadable Content

String ID String Label String
77F646EC FE_dlc_unavailable The downloaded content is not available.
7FE0B00D TCR_DLC_CORRUPT The downloadable content %1 is corrupt and cannot be used. Re-download the downloadable content to re-enable %1.
A11CE082 TCR_DLC_INUSE An in-use Xbox 360 Memory Unit with The Simpsons¬ Game downloadable content was removed, the game is unable to continue.
44C8031C TCR_DLC_WARNING Removing an in-use Xbox 360 Memory Unit with The Simpsons¬ Game downloadable content can result in the loss of unsaved progress.
85EABA10 TCR_DLC_RESCAN A Xbox 360 Memory Unit has been inserted. Do you wish to scan for The Simpsons¬ Game downloadable content? This will result in the loss of unsaved progress.
9BAFF0EE TCR_LOAD_UNUSABLE %1 is missing dependent content package(s) and cannot be used.\nRe-download the content package(s) to re-enable %1

Demo Leftovers

Some of the strings have some changes between platforms.

String ID String Label String (PlayStation 3) String (Xbox 360)
D7F16CED Demo_burp As Homer, press [RDRight] to burp and stun enemies. Press and hold [RDRight] to perform a Power Burp. As Homer, press [RDRight] to burp and stun enemies. Hold [RDRight] to perform a Power Burp.
A32AFB60 DEMO_EXIT_GAME_QUERY Are you sure you want to quit the game? You will lose all game progress if you continue.
F1EB4116 Demo_homerball As Homer Ball, break objects with a Burst ([RDLeft]) or a Slam ([RDDown], [RDLeft]).
8B5F6856 demo_intohomerball As Homer, press [RSBottom] to become Homer Ball. As Homer, pull [RSBottom] to become Homer Ball.
33866729 Demo_power Some abilities cost power. Collect small items to fill the Simpsons' power meters.
EA65B9E1 demo_slam Jump ([RDDown]) and press [RDLeft] to do a Homer Ball Slam.
B8F63C07 Demo_slingshot As Bart, press [RDRight] to fire Bart's slingshot. Press and hold [RDRight] to perfom a Power Shot. As Bart, press [RDRight] to fire Bart's slingshot. Hold [RDRight] to perfom a Power Shot.
F318F9B0 Demo_switch Press [LDLeft] to switch characters (in single-player games).
2C4B0B0A Demo_updraft As Bart, press [RDDown] to jump and press and hold [RSBottom] to ride updrafts. As Bart, press [RDDown] to jump and pull and hold [RSBottom] to ride updrafts.
68318075 FE_Demo_1 Hey, Hey\n Kids!
68318076 FE_Demo_2 Is your body still all a-tingle from the demo? Think what the whole game will do for you! It's packed with all of these exciting features:\n\n
68318077 FE_Demo_3 16 parody-packed episodes that deliver the all-time greatest games and game moments ever.\n\n
68318078 FE_Demo_4 An original story crafted by the writers of the show and movie-trust me, these guys know funny!\n\n
68318079 FE_Demo_5 Explore Springfield to find hundreds of collectibles and interact with more than 170 characters - even the losers!\n\n
6831807A FE_Demo_6 Play as Homer, Bart, Lisa, Marge, and even Maggie, each with unique powers. Wait, no Krusty? Who do I have to bribe in this town to get some respect?!\n\n
6831807B FE_Demo_7 Ehhggh. Anyway, it still gets the Krusty Brand Seal of Approval. So go hit up your parents for some dough and buy a couple. Tell 'em Krusty said it's OK.
AEA3EF08 FE_DEMO_controller_01 Target Lock
AEA3EF09 FE_DEMO_controller_02 Attack
AEA3EF0A FE_DEMO_controller_03 Use
AEA3EF0B FE_DEMO_controller_04 Homer Ball
AEA3EF0C FE_DEMO_controller_05 Bart Cape
AEA3EF0D FE_DEMO_controller_06 Slingshot
AEA3EF0E FE_DEMO_controller_07 Burp
AEA3EF0F FE_DEMO_controller_08 Hold
AEA3EF10 FE_DEMO_controller_09 To Charge Up a Power Attack
AEA4EF46 FE_DEMO_controller_10 Jump / Double Jump
AEA4EF47 FE_DEMO_controller_11 Objectives
AEA4EF48 FE_DEMO_controller_12 Switch Character
AEA4EF49 FE_DEMO_controller_13 Press Tap
AEA4EF4A FE_DEMO_controller_14 Move
AEA4EF4B FE_DEMO_controller_15 Camera
D24F800E FE_Demo_legal_PS3 This demo is intended for promotional purposes only, and may not be sold or rented.
70C31874 FE_MenuText_ExitDemo Exit Demo
D0848649 FE_Title_DemoMenu Demo Menu

Unused Graphics

Downloadable Content

This game was planned to have DLC expansions. There is a button in the menu that would be used for DLC, but it never ended up being used. Frontend.str contains textures that were meant to be used for said DLC.

To get a better idea of where exactly these expansions were meant to take place in Springfield, this mockup image with all the textures combined to form a single image will help you out.

SimpsonsGamePS3-FIN episode download-combined.png

Movie Placeholders

The colloquially called Old Generation version has a few more movies available in the menu, those being In-Game Cutscenes that are pre-rendered there, but are played in real-time in the New Generation as they happen. Frontend.str still has placeholder textures for those unavailable movies.

And then there is one more blank movie placeholder icon with no text in it.

SimpsonsGamePS3-FIN Frontend-assets rws-135 fmv browser.png

The level Big Super Happy Fun Fun Game has an IGC placeholder of its own too.

SimpsonsGameNG-FIN bigsuperhappy.str-bsh igc01 shot01.itxd-placeholder.png

Shared

Frontend

Some Textures here appear to be present from The Godfather game released in 2006, also by EA Redwood Shores and also on the same game engine.

There are aso 10 language flags, even though there is no language selection menu even in multi-language releases. This game also doesn't have any released localization in Dutch, Polish, Portuguese, Swedish whose flags appear here; and the flags for Finnish and Norwegian, which did have a released localization don't appear here.

Oddities

In the cutscene where Kang and Kodos start attacking the whole town, you can see the Springfield General Hospital in the background which never shows up in game, but does show up in one of the unused minigames in the Wii prototype.


Unused Level Areas

Hmmm...
To do:
Get populated/textured renders. Right now these photos are just the plain level meshes with no props, enemies or lighting.

Springfield Hub

SimpsonsGameNG-Retirement1.png
SimpsonsGameNG-Retirement2.png
Retirement Home Interior

Underneath the retirement home, there is an unused interior. This seems to be very basic, with little furniture.

SimpsonsGameNG-House1.png
SimpsonsGameNG-House2.png
Unused house

Located underneath the Sleep Eazy Motel there is an interior for an unused house. The house contains detailed models for furniture. Strangely, there is more furniture located underneath the floor and outside the walls.

Enter the Cheatrix

SimpsonsGameNG-Zone3.png
Zone 3

Labeled as Zone 3 of Enter the Cheatrix. Only uses the simpsons_palette texture, and generally looks very unfinished. There is no ceiling mesh, so either there would have been a fixed camera angle or the mesh was never finished. From the fact that it uses no textures, we can assume that it was cut very early into Cheatrix's life, or was never intended for the final game at all.

SimpsonsGameNG-Zone4.png
Zone 4

Labeled as Zone 4 of Enter the Cheatrix. Only uses the simpsons_palette texture, bar from 3 pipes. At the top section, next to the green pipe, the wall covers a small corridor leading out, so this was presumably the exit to this zone. There is a movable bridge in the middle, leading to sign saying "POWER BOOST" and "OFF".

Five Characters in Search of an Author

SimpsonsGamePS3-FIN RWC-Zone2.png
Zone 2

Labelled as Zone 2 of Five Characters. This would have come right after the outside lawyer fight.

SimpsonsGamePS3-FIN RWC-Zone3.png
Zone 3

Labelled as Zone 3 of Five Characters. This would have come right after Zone 2. The design of this zone is very reminiscent of Old-Gen Five Characters. The player starts in the bottom left, somehow crosses a gap, makes their way across a bowling lane at the back (maybe there would have been bowling balls to dodge?), then back towards the camera. Then, there is a platforming section across floating notepads. The Homer and Bart statues are seemingly textureless, so either they were meant to look like that or the materials were cut.

Developer Credits/Text

In simpsons_gameflow.lua, simpsons_gameflow_helpers.lua and simpsons_scores.lua there are copyright, author and usage messages.

simpsons_gameflow.lua

--///////////////////////////////////////////////////////////////////////////////
--/// \file simpsons_gameflow_helpers.h
--/// \brief Simpsons Gameflow
--///
--///	Builds the Gameflow Structure for the Simpsons
--///
--/// \par Copyright:
--///   (c) 2006 - Electronic Arts Inc.
--/// \author 
--///   Kaye Mason
--/// \date 
--///   12/12/06
--///////////////////////////////////////////////////////////////////////////////

--Syntax notes:
--Create a Game First.
--Create Episodes.
--Create Movies for episodes.
--Create Maps for episodes.
--Create Game modes for Episodes.
--Attach Maps to Modes.
--Attach Movies to Modes.

--NB: Requires simpsons_gamelfow_helpers.lua to be loaded first.

simpsons_gameflow_helpers.lua

--///////////////////////////////////////////////////////////////////////////////
--/// \file simpsons_gameflow_helpers.h
--/// \brief Simpsons Gameflow Helpers
--///
--///	Contains Wrapper functions to assist in building the gameflow model
--///
--/// \par Copyright:
--///   (c) 2006 - Electronic Arts Inc.
--/// \author 
--///   Kaye Mason
--/// \date 
--///   12/12/06
--///////////////////////////////////////////////////////////////////////////////

simpsons_scores.lua

--About the ScoreKeeper: The Score Keeper system is a flexible and data driven way to store scores.
--It supports basic scores, which store values, as well as Score Events (collections of operations that
--may be issued as one) and Score Watchers (which trigger actions based on the values of scores).
--The syntax of this document is described in the function SetupTestScores.

--When using this document, please add your scores to the appropriate epsiode function. If you are unsure
--where to attach scores, please see Tom Wilson (tmwilson@ea.com) or Brad McKee (bmckee@ea.com). This will
--help keep the document readable and maintainable as the number of scores grows.

Lower down in "simpsons_scores.lua", there is a warning from a developer to the other developers :

-- DO NOT CHANGE BELOW HERE! (unless you know what you're doing and are willing to bear the consequences :-) )

Uncompiled Source

vsh_ff_all.hlsl

The Xbox 360 version's .XEX has an uncompiled source file, likely coming from an SDK.

/////////////////////////////////////////////////////////////////////
///	
/// vsh_ff_all.hlsl
///
/// Implements fixed function vertex processing for the Xenon
///	
/////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////
///	
/// D3D9 types for effect files
///	
/////////////////////////////////////////////////////////////////////

typedef float4 D3DCOLORVALUE;
typedef float3 D3DVECTOR;

typedef struct _D3DMATERIAL9
{
    D3DCOLORVALUE   Diffuse;
	D3DCOLORVALUE   Ambient;
	D3DCOLORVALUE   Specular;
	D3DCOLORVALUE   Emissive;
    float           Power;
} D3DMATERIAL9;

typedef int D3DLIGHTTYPE;
#define D3DLIGHT_POINT          1
#define D3DLIGHT_SPOT           2
#define D3DLIGHT_DIRECTIONAL    3

typedef struct _D3DLIGHT9
{
	D3DLIGHTTYPE    Type;
    D3DCOLORVALUE   Diffuse;
    D3DCOLORVALUE   Specular;
    D3DCOLORVALUE   Ambient;
    D3DVECTOR       Position;
    D3DVECTOR       Direction;
    float           Range;
    float           Falloff;
    float           Attenuation0;
    float           Attenuation1;
    float           Attenuation2;
    float           Theta;
    float           Phi;
} D3DLIGHT9;

typedef int D3DFOGMODE;
#define D3DFOG_NONE          0
#define D3DFOG_EXP           1
#define D3DFOG_EXP2          2
#define D3DFOG_LINEAR        3

typedef int D3DTRANSFORMSTATETYPE;
#define D3DTS_WORLD          0
#define D3DTS_VIEW           1
#define D3DTS_PROJECTION     2
#define D3DTS_TEXTURE0       3
#define D3DTS_TEXTURE1       4
#define D3DTS_TEXTURE2       5
#define D3DTS_TEXTURE3       6
#define D3DTS_TEXTURE4       7
#define D3DTS_TEXTURE5       8
#define D3DTS_TEXTURE6       9
#define D3DTS_TEXTURE7       10

#define D3DTSS_TCI_PASSTHRU                    0x00000000
#define D3DTSS_TCI_CAMERASPACENORMAL           0x00010000
#define D3DTSS_TCI_CAMERASPACEPOSITION         0x00020000
#define D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR 0x00030000
#define D3DTSS_TCI_SPHEREMAP                   0x00040000

typedef int D3DTEXTURETRANSFORMFLAGS;
#define D3DTTFF_DISABLE          0
#define D3DTTFF_COUNT1           1
#define D3DTTFF_COUNT2           2
#define D3DTTFF_COUNT3           3
#define D3DTTFF_COUNT4           4
#define D3DTTFF_PROJECTED        256

typedef int D3DMATERIALCOLORSOURCE;
#define D3DMCS_MATERIAL			 0
#define D3DMCS_COLOR1			 1
#define D3DMCS_COLOR2			 2

/////////////////////////////////////////////////////////////////////
///	
/// Defines
///	
/////////////////////////////////////////////////////////////////////
#ifndef K_NORMALIZENORMALS
#define K_NORMALIZENORMALS true
#endif
#ifndef K_TWEENENABLE
#define K_TWEENENABLE false
#endif
#ifndef K_TEXTURETRANSFORMFLAGS0
#define K_TEXTURETRANSFORMFLAGS0 D3DTTFF_DISABLE
#endif
#ifndef K_TEXTURETRANSFORMFLAGS1
#define K_TEXTURETRANSFORMFLAGS1 D3DTTFF_DISABLE
#endif
#ifndef K_FOGENABLE
#define K_FOGENABLE true
#endif
#ifndef K_RANGEFOGENABLE
#define K_RANGEFOGENABLE false
#endif
#ifndef K_FOGVERTEXMODE
#define K_FOGVERTEXMODE D3DFOG_LINEAR
#endif
#ifndef K_SPECULARENABLE
#define K_SPECULARENABLE false
#endif
#ifndef K_LIGHTING
#define K_LIGHTING true
#endif
#ifndef K_SCREENSPACEPOSITIONS
#define K_SCREENSPACEPOSITIONS false
#endif
#ifndef K_DIFFUSEMATERIALSOURCE
#define K_DIFFUSEMATERIALSOURCE D3DMCS_COLOR1
#endif
#ifndef K_SPECULARMATERIALSOURCE
#define K_SPECULARMATERIALSOURCE D3DMCS_COLOR2
#endif
#ifndef K_AMBIENTMATERIALSOURCE
#define K_AMBIENTMATERIALSOURCE D3DMCS_MATERIAL
#endif
#ifndef K_EMISSIVEMATERIALSOURCE
#define K_EMISSIVEMATERIALSOURCE D3DMCS_MATERIAL
#endif
#ifndef K_TEXCOORDINDEX0
#define K_TEXCOORDINDEX0 D3DTSS_TCI_PASSTHRU
#endif
#ifndef K_TEXCOORDINDEX0ENABLE
#define K_TEXCOORDINDEX0ENABLE false
#endif
#ifndef K_TEXCOORDINDEX1
#define K_TEXCOORDINDEX1 D3DTSS_TCI_PASSTHRU
#endif
#ifndef K_TEXCOORDINDEX1ENABLE
#define K_TEXCOORDINDEX1ENABLE false
#endif
#ifndef K_COLOR0ENABLE
#define K_COLOR0ENABLE false
#endif
#ifndef K_COLOR1ENABLE
#define K_COLOR1ENABLE false
#endif

/////////////////////////////////////////////////////////////////////
///	
/// Lighting state
///	
/////////////////////////////////////////////////////////////////////
D3DMATERIAL9			g_Material;
D3DLIGHT9				g_Lights[8];
bool					g_LightEnable[8];
float					g_SpotLightCosHalfTheta[8];
float					g_SpotLightCosHalfPhi[8];

/////////////////////////////////////////////////////////////////////
///
/// Renderstates
///
/////////////////////////////////////////////////////////////////////
D3DCOLORVALUE	g_Ambient;
float			g_TweenFactor;
D3DCOLORVALUE	g_FogColor;
float			g_FogStart;
float			g_FogEnd;
float			g_FogDensity;

/////////////////////////////////////////////////////////////////////
///
/// Transform state
///
/////////////////////////////////////////////////////////////////////
float4x4		g_Proj			 : PROJ;
float4x4		g_WorldViewProj  : WORLDVIEWPROJ;
float4x4		g_WorldView      : WORLDVIEW;
float4x4		g_World          : WORLD;
float4x4		g_WorldViewIT;
float4x4		g_ViewIT;
float4x4		g_TexTrans0;
float4x4		g_TexTrans1;
float			g_PosScaleX;
float			g_PosScaleY;


/////////////////////////////////////////////////////////////////////
///
/// Vertex shader output
///
/////////////////////////////////////////////////////////////////////
struct VS_OUTPUT
{
    float4 Pos           : POSITION;
	float4 Color0        : COLOR0;
	float4 Color1		: COLOR1;
	float4 Tex0         : TEXCOORD0;
	float4 Tex1			: TEXCOORD1;
	float  Fog           : FOG;
};

/////////////////////////////////////////////////////////////////////
///
/// Color pair for lighting computations
//
/////////////////////////////////////////////////////////////////////
struct COLOR_PAIR
{
	float4 Color0        : COLOR0;
	float4 Color1		: COLOR1;
};

/////////////////////////////////////////////////////////////////////
///
/// Compute the contribution from a directional light
///
/////////////////////////////////////////////////////////////////////
COLOR_PAIR																///< Returns diffuse/ambient and specular components
	DoDirLight			
	(			
		float3			viewSpaceNorm,									///< Normal in view space
		float3			viewSpaceViewVec,								///< View vector in view space
		int				i,												///< Light index
		uniform bool	k_SpecularEnable								///< Specular enabled?
	)																
{																	
   COLOR_PAIR ret;													
																	
   //
   // Ambient
   //
   ret.Color0 = g_Lights[i].Ambient;								
   ret.Color1 = 0;													
																	
   float3 L = mul((float3x3)g_ViewIT, -normalize(g_Lights[i].Direction));	
   float NdotL = dot(viewSpaceNorm, L);							
   if(NdotL > 0.f)													
   {																
      //compute diffuse color										
      ret.Color0 += NdotL * g_Lights[i].Diffuse;					
																	
      //add specular component										
      if(k_SpecularEnable)											
      {															
         float3 H = normalize(L + viewSpaceViewVec);   			
         ret.Color1 = pow(max(0, dot(H, viewSpaceNorm)), g_Material.Power) * g_Lights[i].Specular;	
      }															
   }																
   return ret;														
}																	
																	
/////////////////////////////////////////////////////////////////////
///
/// Compute the contribution from a directional light
///
/////////////////////////////////////////////////////////////////////
COLOR_PAIR																///< Returns diffuse/ambient and specular components
	DoPointLight													
	(																
		float4			vPosition,										///< Position in model space
		float3			viewSpaceNorm,									///< Normal in view space
		float3			viewSpaceViewVec,								///< View vector in view space
		int				i,												///< Light index
		uniform bool	k_SpecularEnable								///< Specular enabled?
	)																
{																	
   COLOR_PAIR ret;													
   ret.Color0 = g_Lights[i].Ambient;								
   ret.Color1 = 0;													
																	
   float3 L = mul((float3x3)g_ViewIT, normalize((g_Lights[i].Position-(float3)mul(g_World,vPosition))));	
   float NdotL = dot(viewSpaceNorm, L);							
   float fAtten = 1.f;												
   if(NdotL >= 0.f)												
   {																
      //compute diffuse color										
      ret.Color0 += NdotL * g_Lights[i].Diffuse;					
																	
      //add specular component										
      if(k_SpecularEnable)											
      {															
         float3 H = normalize(L + viewSpaceViewVec);   				//half vector
         ret.Color1 = pow(max(0, dot(H, viewSpaceNorm)), g_Material.Power) * g_Lights[i].Specular;	
      }															
																	
      float LD = length(g_Lights[i].Position-(float3)mul(g_World,vPosition));	
      if(LD > g_Lights[i].Range)									
      {															
         fAtten = 0.f;												
      }															
      else															
      {															
         fAtten *= 1.f/(g_Lights[i].Attenuation0 + g_Lights[i].Attenuation1*LD + g_Lights[i].Attenuation2*LD*LD);	
      }															
      ret.Color0 *= fAtten;										
      ret.Color1 *= fAtten;										
   }																
   return ret;														
}																	
																	
/////////////////////////////////////////////////////////////////////
///
/// Compute the contribution from a spot light
///
/////////////////////////////////////////////////////////////////////
COLOR_PAIR																///< Returns diffuse/ambient and specular components
	DoSpotLight														
	(																
		float4			vPosition,										///< Position in model space
		float3			viewSpaceNorm,									///< Normal in view space
		float3			viewSpaceViewVec,								///< View vector in view space
		int				i,												///< Light index
		uniform bool	k_SpecularEnable								///< Specular enabled?
	)																
{																	
	COLOR_PAIR ret;													
	ret.Color0 = g_Lights[i].Ambient;									
	ret.Color1 = 0;													
																	
	float3 L = mul((float3x3)g_ViewIT, normalize((g_Lights[i].Position-(float3)mul(g_World,vPosition))));	
	float NdotL = dot(viewSpaceNorm, L);							
	float fAttenSpot = 1.f;											
	if(NdotL >= 0.f)												
	{																
		//compute diffuse color										
		ret.Color0 += NdotL * g_Lights[i].Diffuse;					
																	
		//add specular component									
		if(k_SpecularEnable)										
		{															
			float3 H = normalize(L + viewSpaceViewVec);				
			ret.Color1 = pow(max(0, dot(H, viewSpaceNorm)), g_Material.Power) * g_Lights[i].Specular;	
		}															
																	
		float LD = length(g_Lights[i].Position-(float3)mul(g_World,vPosition));	
		if(LD > g_Lights[i].Range)									
		{															
			fAttenSpot = 0.f;										
		}															
		else														
		{															
			fAttenSpot *= 1.f/(g_Lights[i].Attenuation0 + g_Lights[i].Attenuation1*LD + g_Lights[i].Attenuation2*LD*LD);	
		}															
																	
		//spot cone computation
		float3 L2 = mul((float3x3)g_ViewIT, -normalize(g_Lights[i].Direction));	
		float rho = dot(L, L2);										
																	
		fAttenSpot *= pow(saturate((rho - g_SpotLightCosHalfPhi[i])/(g_SpotLightCosHalfTheta[i] - g_SpotLightCosHalfPhi[i])), g_Lights[i].Falloff);	
																	
		ret.Color0 *= fAttenSpot;									
		ret.Color1 *= fAttenSpot;									
	}																
	return ret;														
}																	
																	
/////////////////////////////////////////////////////////////////////
///
/// Compute lighting contributions
///
/////////////////////////////////////////////////////////////////////
COLOR_PAIR																///< Returns diffuse/ambient and specular components
	DoLighting														
	(																
		float4			vPosition,										///< Position in model space
		float4			ambientColor,									///< Ambient color to modulate lighting
		float4			diffuseColor,									///< Diffuse color to modulate lighting
		float4			specularColor,									///< Specular color to modulate lighting
		float3			viewSpaceNorm,									///< Normal in view space
		float3			viewSpaceViewVec,								///< View vector in view space
		uniform bool	k_SpecularEnable								///< Specular enabled?
	)																
{																	
	//
	// Initialize return value
	//
	COLOR_PAIR ret;													
	ret.Color0 = 0.f;												
	ret.Color1 = 0.f;												
	
	//
	// Ambient contribution
	//
	ret.Color0 = g_Ambient * ambientColor;
																	
	for (int i = 0; i < 8; i++)										
	{																
		if (g_LightEnable[i])										
		{															
			COLOR_PAIR thisLightContrib;							
			D3DLIGHTTYPE type = g_Lights[i].Type;					
			if (type == D3DLIGHT_DIRECTIONAL)						
			{														
				thisLightContrib = DoDirLight(viewSpaceNorm, viewSpaceViewVec, i, k_SpecularEnable);	
			}														
			else if (type == D3DLIGHT_POINT)						
			{														
				thisLightContrib = DoPointLight(vPosition, viewSpaceNorm, viewSpaceViewVec, i, k_SpecularEnable);	
			}														
			else if (type == D3DLIGHT_SPOT)							
			{														
				thisLightContrib = DoSpotLight(vPosition, viewSpaceNorm, viewSpaceViewVec, i, k_SpecularEnable);	
			}														
			else													
			{														
				thisLightContrib.Color0 = 0.f;						
				thisLightContrib.Color1 = 0.f;						
			}														
			thisLightContrib.Color0 *= diffuseColor;
			thisLightContrib.Color1 *= specularColor;
																	
			ret.Color0 += thisLightContrib.Color0;					
			ret.Color1 += thisLightContrib.Color1;					
		}															
	}																
																	
	return ret;														
}																	
																	
/////////////////////////////////////////////////////////////////////
///
/// Compute the fog value
///
/////////////////////////////////////////////////////////////////////
float4 DoFog(float3 viewSpacePos,									
			 uniform bool k_FogEnabled,								
			 uniform bool k_RangeFogEnable,							
			 uniform int k_FogVertexMode)									
{																	
	float4 ret = 1.f;												
																	
	if (k_FogEnabled)												
	{																
		float d;													
		if (k_RangeFogEnable)										
			d = length(viewSpacePos);								
		else														
			d = viewSpacePos.z;										
																	
		float4 ret = 1.f;											
		if (k_FogVertexMode == D3DFOG_EXP)								
		{															
			ret = 1.f / exp(d * g_FogDensity);						
																	
		}															
		else if (k_FogVertexMode == D3DFOG_EXP2)							
		{															
			ret = 1.f / exp(pow(d * g_FogDensity, 2));				
		}															
		else if (k_FogVertexMode == D3DFOG_LINEAR)						
		{															
			ret = saturate((g_FogEnd - d)/(g_FogEnd - g_FogStart));	
		}															
	}																
																	
	return ret;														
}																	
																	
/////////////////////////////////////////////////////////////////////
///
/// vertex shader
///
/////////////////////////////////////////////////////////////////////
VS_OUTPUT															
	vs_main															
	(																
		float4			vPosition					: POSITION0,	
		float4			vPosition2					: POSITION1,	
		float3			vNormal						: NORMAL0,		
		float3			vNormal2					: NORMAL1,		
		float2			vTexCoord0					: TEXCOORD0,	
		float2			vTexCoord1					: TEXCOORD1,	
		float4			vColor0						: COLOR0,
		float4			vColor1						: COLOR1,
		uniform bool	k_NormalizeNormals,							
		uniform bool	k_TweenEnable,								
		uniform int		k_TextureTransformFlags0,
		uniform int		k_TextureTransformFlags1,
		uniform int		k_TexCoordIndex0,
		uniform bool	k_TexCoordIndex0Enable,
		uniform int		k_TexCoordIndex1,
		uniform bool	k_TexCoordIndex1Enable,
		uniform bool    k_Color0Enable,
		uniform bool    k_Color1Enable,
		uniform bool	k_FogEnabled,								
		uniform bool	k_RangeFogEnable,							
		uniform int		k_FogVertexMode,									
		uniform bool	k_SpecularEnable,
		uniform bool	k_Lighting,
		uniform bool	k_ScreenSpacePositions,
		uniform D3DMATERIALCOLORSOURCE	k_DiffuseMaterialSource,
		uniform D3DMATERIALCOLORSOURCE	k_SpecularMaterialSource,
		uniform D3DMATERIALCOLORSOURCE	k_AmbientMaterialSource,
		uniform D3DMATERIALCOLORSOURCE	k_EmissiveMaterialSource
	)
{																	
	VS_OUTPUT ret = (VS_OUTPUT) 0;									
																	
	//
	// Normalize input normals
	//
	if (k_NormalizeNormals)											
	{																
		vNormal = normalize(vNormal);								
		if (k_TweenEnable)											
		{															
			vNormal2 = normalize(vNormal2);							
		}															
	}																
																	
	//
	// If tweening is enabled, blend the position and normal
	//
	if(k_TweenEnable)												
	{																
		vPosition = (1.f-g_TweenFactor) * vPosition + g_TweenFactor * vPosition2;	
		vNormal   = (1.f-g_TweenFactor) * vNormal + g_TweenFactor * vNormal2;		
	}																
	
	if (!k_ScreenSpacePositions)
	{
		//
		// Transform the position into homogeneous space
		//
		ret.Pos = mul(g_WorldViewProj, vPosition);
	}
	else
	{
		//
		// Screen space transform
		//
		ret.Pos.x  = ( (vPosition.x-0.5)*g_PosScaleX - 1.0 );
		ret.Pos.y  =-( (vPosition.y-0.5)*g_PosScaleY - 1.0 );
		ret.Pos.z  = vPosition.z;
		ret.Pos.w  = 1.f;
	}
										
	//
	// Calculate some vectors used in lighting and texture coordinate generation
	//
	float3 viewSpacePos = mul(g_WorldView, vPosition);					//position in view space
	float3 viewSpaceNorm = mul((float3x3)g_WorldViewIT, vNormal);		//normal in view space
	float3 viewSpaceViewVec = -normalize(viewSpacePos);             	//viewer
																	
	//
	// Texture coordinates
	//
	if (k_TexCoordIndex0Enable)
	{
		if (k_TexCoordIndex0 == D3DTSS_TCI_PASSTHRU)				
		{																
			ret.Tex0.xy = vTexCoord0;									
		}																
		else if (k_TexCoordIndex0 == D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR)	
		{																
			ret.Tex0 = float4((2.f * dot(viewSpaceViewVec, viewSpaceNorm) * viewSpaceNorm - viewSpaceViewVec), 0);	
		}																
		else if (k_TexCoordIndex0 == D3DTSS_TCI_CAMERASPACENORMAL)	
		{																
			ret.Tex0 = float4(viewSpaceNorm, 0);						
		}																
		else if (k_TexCoordIndex0 == D3DTSS_TCI_CAMERASPACEPOSITION)	
		{																
			ret.Tex0 = float4(viewSpacePos, 0);							
		}
	}
	if (k_TexCoordIndex1Enable)
	{
		if (k_TexCoordIndex1 == D3DTSS_TCI_PASSTHRU)				
		{																
			ret.Tex1.xy = vTexCoord1;									
		}																
		else if (k_TexCoordIndex1 == D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR)	
		{																
			ret.Tex1 = float4((2.f * dot(viewSpaceViewVec, viewSpaceNorm) * viewSpaceNorm - viewSpaceViewVec), 1);	
		}																
		else if (k_TexCoordIndex1 == D3DTSS_TCI_CAMERASPACENORMAL)	
		{																
			ret.Tex1 = float4(viewSpaceNorm, 1);						
		}																
		else if (k_TexCoordIndex1 == D3DTSS_TCI_CAMERASPACEPOSITION)	
		{																
			ret.Tex1 = float4(viewSpacePos, 1);							
		}
	}

	//
	// Apply texture transform if called for
	//
	if (k_TextureTransformFlags0 != D3DTTFF_DISABLE)
	{
		ret.Tex0 = mul(g_TexTrans0, ret.Tex0);
	}
	if (k_TextureTransformFlags1 != D3DTTFF_DISABLE)
	{
		ret.Tex1 = mul(g_TexTrans1, ret.Tex1);
	}
																	
	if (k_Lighting)													
	{																
		//
		// Do lighting
		//
		float4 ambientColor;
		float4 diffuseColor;
		float4 specularColor;
		if (k_DiffuseMaterialSource == D3DMCS_MATERIAL)
		{
			diffuseColor = g_Material.Diffuse;
		}
		else if (k_DiffuseMaterialSource == D3DMCS_COLOR1)
		{
			diffuseColor = vColor0;
		}
		else
		{
			diffuseColor = vColor1;
		}
		if (k_SpecularMaterialSource == D3DMCS_MATERIAL)
		{
			specularColor = g_Material.Specular;
		}
		else if (k_SpecularMaterialSource == D3DMCS_COLOR1)
		{
			specularColor = vColor0;
		}
		else
		{
			specularColor = vColor1;
		}
		if (k_AmbientMaterialSource == D3DMCS_MATERIAL)
		{
			ambientColor = g_Material.Ambient;
		}
		else if (k_AmbientMaterialSource == D3DMCS_COLOR1)
		{
			ambientColor = vColor0;
		}
		else
		{
			ambientColor = vColor1;
		}
		COLOR_PAIR lighting = DoLighting(vPosition, ambientColor, diffuseColor, specularColor, viewSpaceNorm, viewSpaceViewVec, k_SpecularEnable);
		if (k_Color0Enable)
		{
		    ret.Color0 = lighting.Color0;
		}
		if (k_Color1Enable)
		{
		    ret.Color1 = lighting.Color1;
		}
	}
	else
	{
		//
		// Use vertex colors
		//
		if (k_Color0Enable)
		{
		    ret.Color0 = vColor0;
	    }
	    if (k_Color1Enable)
	    {
		    ret.Color1 = vColor1;									
	    }
	}
																	
	//saturate
	if (k_Color0Enable)
	{
	    ret.Color0 = min(1.f, ret.Color0);								
	}
    if (k_Color1Enable)
    {
	    ret.Color1 = min(1.f, ret.Color1);
	}
																	
	//apply fog
	float4 fogColor = DoFog(viewSpacePos, k_FogEnabled, k_RangeFogEnable, k_FogVertexMode);	
	ret.Fog = fogColor.x;												
																	
	return ret;														
}																	

VS_OUTPUT
	main
	(
		float4			vPosition					: POSITION0,
		float4			vPosition2					: POSITION1,
		float3			vNormal						: NORMAL0,
		float3			vNormal2					: NORMAL1,
		float2			vTexCoord0					: TEXCOORD0,
		float2			vTexCoord1					: TEXCOORD1,
		float4			vColor0						: COLOR0,
		float4			vColor1						: COLOR1
	)
{
	return vs_main(vPosition, vPosition2, vNormal, vNormal2, vTexCoord0, vTexCoord1, vColor0, vColor1, 
		K_NORMALIZENORMALS,
		K_TWEENENABLE,
		K_TEXTURETRANSFORMFLAGS0,
		K_TEXTURETRANSFORMFLAGS1,
		K_TEXCOORDINDEX0,
		K_TEXCOORDINDEX0ENABLE,
		K_TEXCOORDINDEX1,
		K_TEXCOORDINDEX1ENABLE,
		K_COLOR0ENABLE,
		K_COLOR1ENABLE,
		K_FOGENABLE,
		K_RANGEFOGENABLE,
		K_FOGVERTEXMODE,
		K_SPECULARENABLE,
		K_LIGHTING,
		K_SCREENSPACEPOSITIONS,
		K_DIFFUSEMATERIALSOURCE,
		K_SPECULARMATERIALSOURCE,
		K_AMBIENTMATERIALSOURCE,
		K_EMISSIVEMATERIALSOURCE
		);
}

Version Differences

Enter the Cheatrix Time Challenge

The bridge in the blood room is damaged in the Xbox 360 version, but remains fully intact in the PlayStation 3 release.

PlayStation 3 Xbox 360
SimpsonsGamePS3-FIN CheatrixTimeTrialBridge.png SimpsonsGame360-FIN CheatrixTimeTrialBridge.png

Bonus Movies

The European PlayStation 3 releases have an additional Bonus Movies sub-menu, which has two somewhat generic videos available. This was originally meant to contain the cut Making-of movie for this game.

PlayStation 3 (Europe) PlayStation 3 (Rest of the World), Xbox 360
SimpsonsGamePS3-FIN MainMenu.png SimpsonsGame360-FIN MainMenu.png

Texture Resolution

Hmmm...
To do:
Some "generic" textures shared across many archives also have differing resolutions. Not to mention some others look quite different due to using other alpha masking types.

A couple textures have more visible compression artifacts in one version than the other, which isn't that noteworthy, however there are also several textures that are higher resolution, most of the higher resolution ones occurring in the PS3 release.

Bartman Begins

PlayStation 3 Xbox 360
brt\zone02.str\brt_entrytunnel_brck
SimpsonsGamePS3-FIN brt.str-zone02 split3.txd-brt entrytunnel brck.png SimpsonsGame360-FIN brt.str-zone02 split9.itxd-brt entrytunnel brck.png
brt\zone02.str\brt_grybrck
SimpsonsGamePS3-FIN brt.str-zone02 split9.txd-brt grybrck.png SimpsonsGame360-FIN brt.str-zone02 split9.itxd-brt grybrck.png
brt\zone01.str\brt_grybrck
SimpsonsGamePS3-FIN brt.str-zone01.txd-brt templecroft.png SimpsonsGame360-FIN brt.str-zone01 split3.itxd-brt templecroft.png
brt\zone02.str\brt_templecroft
SimpsonsGamePS3-FIN brt.str-zone02.txd-brt underwater mural.png SimpsonsGame360-FIN brt.str-zone02 split3.itxd-brt underwater mural.png
brt\zone01.str\brt_wallcrack1
SimpsonsGamePS3-FIN brt.str-zone01 split2.txd-brt wallcrack1.png SimpsonsGame360-FIN brt.str-zone01 split4.itxd-brt wallcrack1.png
brt\zone01.str\brt_wallcrack2
SimpsonsGamePS3-FIN brt.str-zone01 split2.txd-brt wallcrack2.png SimpsonsGame360-FIN brt.str-zone01 split4.itxd-brt wallcrack2.png
brt\zone01.str\stoneblock
SimpsonsGamePS3-FIN brt.str-zone01 split3.txd-stoneblock.png SimpsonsGame360-FIN brt.str-zone01 split4.itxd-stoneblock.png

Mob Rules

This texture exists in Bartman Begins, here, and in Springfield. Only in Bartman Begins the texture is identical on both platforms (both using the higher quality variant seen in the PS3 column.) Springfield's texture is the same as this one's.

PlayStation 3 Xbox 360
mob_rules\zone03.str\spr_museum02
SimpsonsGamePS3-FIN mob rules.str-zone03.txd-spr museum02.png SimpsonsGame360-FIN mob rules.str-zone03.itxd-spr museum02.png

Shadow of the Colossal Donut

PlayStation 3 Xbox 360
colossadonut\zone02.str\spr_museum05
SimpsonsGamePS3-FIN colossadonut.str-zone02.txd-spr museum05.png SimpsonsGame360-FIN colossadonut.str-zone02.itxd-spr museum05.png

Game Engine

The Five Characters in Search of an Author equivalent of this texture (rhymes\zone01.str\rwc_goldcoinramp2) is high resolution on both platforms.

PlayStation 3 Xbox 360
gamehub\zone01.str\gam_goldcoinramp2
SimpsonsGamePS3-FIN gamehub.str-zone01 split6.txd-gam goldcoinramp2.png SimpsonsGame360-FIN gamehub.str-zone01 split9.itxd-gam goldcoinramp2.png

Springfield

The cliff texture has two different (yet almost identical) variants, the first one is lower resolution on PS3, but the 2nd one is identical on both patforms

PlayStation 3 Xbox 360
spr_hub\zone*.str\cliff
SimpsonsGamePS3-FIN spr hub.str-cliff.png SimpsonsGame360-FIN spr hub.str-cliff.png
spr_hub\zone21.str\pol_floor1
SimpsonsGamePS3-FIN spr hub.str-zone21.txd-pol floor1.png SimpsonsGame360-FIN spr hub.str-zone21.itxd-pol floor1.png

References