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

LEGO Racers 2 (Windows)

From The Cutting Room Floor
Jump to navigation Jump to search

Title Screen

LEGO Racers 2

Developer: Attention To Detail
Publisher: LEGO Software
Platform: Windows
Released in US: October 4, 2001
Released in EU: October 4, 2001


SourceIcon.png This game has uncompiled source code.
DevTextIcon.png This game has hidden development-related text.
TextIcon.png This game has unused text.


Hmmm...
To do:
Add unused sounds, and an image for Professor Voltage.
  • Some scripts in the game contain rather vulgar lines. By vulgar, it's NSFW

The sequel to a racing game with LEGO, and all you can build are cars. What's with LEGO games and limited/no building?

Various Script File Contents

In SCRIPTS/SANDY ISLAND/ANIMS.TXT, the following can be found, describing what each animation does:

some useful anims for general npcs, and example values

TALK_ARG_LEFT 1.5 1.0
TALK_ARG_RIGHT 1.5 1.0 - gesturing to left and right

TALK_SUPRISED 1.5 1.0 - arms kind of spread out. note the spelling

TALK_ANGRY 1.5 1.0 - kind of flapping arms about in a kind of angry way

TALK_NO_WAY 1.0 1.0 - waves one hand across, as if to say, er, 'no way'

LAUGH1 - loop, looks like he's being sick
LAUGH2 - loop, chuckles
LAUGH3 - loop, rocking to and fro but less violently than 1
MWUHAHAHA 3.0 1.0 - more of a belly laugh, waves hands like 'get outta here!'

I_AM_THE_BEST 1.5 1.0 - minifig points to his chest

TALK_EXCITED 0.75 1.0 - does a jump in the air

HEAD_IN_HANDS 1.5 1.0 - in one hand only actually, looks kind of confused

SHRUG 1.7 0.5 - 'what do you want from me?'

2ND_PLACE_CELEB 3.0 1.3 - looks to left and then shrugs

ANGRY 1.5 0.5 - sorta shaking his fist, but slowed down looks a bit like he's pointing

3RD_PLACE_CELEB 3.0 1.3 - looks to his right and then shakes his hand like, oh darn it

TALK_SAD - loop, head hung low

LOOK_AROUND 1.5 1.0 - hands on hips, looks left and right

In SCRIPTS/CARCRAZE some various text files can be found, all containing various messages commented out with pound-signs before what may have been code for cutscenes.

XALAXBONUS1.TXT:

Greetings, XXX. I am honoured to finally meet you
Thank you. Are you a racer here
"I certainly am. You are XXX, are you not? My fellow racers and I have been watching you very carefully. You are a formidable racer
Thank you. What do you do here
This is where we train. Rocket Racer himself has trained here. If you like, you may take part in one of our exercises. 
If you can complete it to our satisfaction, I will help you in your quest to become Galactic Racing Champion
can do that, no problem
The Ramas have explained the rules to me, XXX. You have to collect (x) drones from around the track, then return them to the Start line
Sounds pretty easy
It may be harder than you think, buddy. The drones move across the track, so collecting them is tricky. Plus, they're guarded by Ramas in cars. 
If one of them hits you, you'll drop all the drones you're carrying.
Got it

XALAXBONUS2.TXT:

Ah, XXX, you have returned
Yeah. I was wondering if you had any other exercises for me to try
If you wish, you may try a harder one. This one is generally only used by our better racers
That sounds good. Is it like the other one
It is similar, but you will need to collect even more drones in even less time. Again, if you win, I shall award you a CAR BONUS.
Then let's get to it
The Ramas have explained the rules to me, XXX. You have to collect (x) drones from around the track, then return them to the Start line
Sounds pretty easy
It may be harder than you think, buddy. The drones move across the track, so collecting them is tricky. Plus, they're guarded by Ramas in cars. 
If one of them hits you, you'll drop all the drones you're carrying.
Got it

XALAXBONUSWIN.TXT

That was impressive, XXX
Thanks. I really enjoyed it
Here, take this CAR BONUS. You have more than earned it
BONUS AWARD SCREEN

Uncompiled Source Code

In SCRIPTS/SCRIPT KEY VALUE PAIRS.TXT, the following can be found:

//-----------------------------------------------------------------------------
//
// Script Key Value Pairs.cpp
//
// Tables of key/value pairs for parsing the animation scripts
//
//-----------------------------------------------------------------------------


//----------------------------------------
// INFORMATION HEADER
//----------------------------------------

/*
	$Revision: 39 $
	$Author: Geoff-browitt $
	$Date: 26/04/01 17:49 $
*/

#include "..\..\Engine\Liquid Engine.h"
#include "..\LegoRacers2.h"
#include "..\Cinematics\Cinematic Includes.h"
#include "..\NPC\NPC Includes.h"
#include "..\Animation Scripting\Animation Scripting Includes.h"
#include "..\Game Control\Game Control Includes.h"
#include "..\Effects\Effects Includes.h"
#include <string.h> // strcmp

KeyValuePair NPCTokens[] = {

	{ "SPARKY",					tNPCSparky },

	{ "PROF_VOLTAGE",			tNPCProfVoltage },
	{ "POSTMAN",				tNPCPostman },
	{ "FIREMAN",				tNPCFireman },
	{ "DOCTOR",					tNPCDoctor },
	{ "POLICEMAN",				tNPCPoliceman },
	{ "NURSE",					tNPCNurse },
	{ "FISHERMAN",				tNPCFisherman },
	{ "WORKMAN1",				tNPCWorkman1 },
	{ "WORKMAN2",				tNPCWorkman2 },
	{ "WORKMAN3",				tNPCWorkman3 },
	{ "LIGHTHOUSE_KEEPER",		tNPCLighthouseKeeper },
	{ "BEACH_BABE1",			tNPCBeachBabe1 },
	{ "BEACH_BABE2",			tNPCBeachBabe2 },
	{ "BEACH_BABE3",			tNPCBeachBabe3 },
	{ "BEACH_DUDE",				tNPCBeachDude },
	{ "GENERIC_MALE1",			tNPCGenericMale1 },
	{ "GENERIC_MALE2",			tNPCGenericMale2 },
	{ "GENERIC_MALE3",			tNPCGenericMale3 },
	{ "GENERIC_FEMALE1",		tNPCGenericFemale1 },
	{ "GENERIC_FEMALE2",		tNPCGenericFemale2 },
	{ "GENERIC_FEMALE3",		tNPCGenericFemale3 },
	{ "COASTGUARD",				tNPCCoastGuard },
	{ "FOREMAN",				tNPCForeman },

	{ "BB",						tNPCBB },
	{ "DOC",					tNPCMarsDoc },
	{ "VEGA",					tNPCVega },
	{ "ALTAIR",					tNPCAltair },
	{ "RIGEL",					tNPCRigel },
	{ "SCIENTIST",				tNPCScientist },
	{ "ANTARIES",				tNPCAntaries },
	
	{ "SAM_SANISTER",			tNPCSamSanister },
	{ "SLYBOOTS",				tNPCSlyboots },
	{ "ACHU",					tNPCAchu },
	{ "MORAT",					tNPCMorat },
	{ "BUNGO",					tNPCBungo },
	{ "ALEXIS",					tNPCAlexisSanister },
	{ "MIKE",					tNPCMike },
	
	{ "BERG",					tNPCTheBerg },
	{ "FROSTY",					tNPCFrosty },
	{ "CHILLY",					tNPCChilly },
	{ "ROSS",					tNPCCaptainRoss },
	{ "CRYSTAL",				tNPCCrystal },
	{ "COSMO",					tNPCCosmo },
	{ "SCOOTER",				tNPCScooter },
	{ "ARCTIC_DOC",				tNPCArcticDoc },
	
	{ "ROCKET_RACER",			tNPCRocketRacer },
	{ "LIGHTOR",				tNPCLightor },
	{ "WARRIOR",				tNPCWarrior },
	{ "GHOST",					tNPCGhost },
	{ "CHILL",					tNPCChill },
	{ "DUSTER",					tNPCDuster },
	{ "FREEZE",					tNPCFreeze },
	{ "SNAKE",					tNPCSnake },
	{ NULL,           0               }

};

KeyValuePair PrimaryTokens[] = {

	{ "$global",		tKeywordGlobal },
	{ "$time",			tKeywordTime   },
	{ "$sound",			tKeywordSound  },
	{ "$subtitle",		tKeywordSubtitle },
	{ "$actor",			tKeywordActor },
	{ "$cinematic",		tKeywordCinematic },
	{ "$shot",			tKeywordShot },
	{ "$zoom",			tKeywordZoom },
	{ "$length",		tKeywordLength },
	{ "$startrelative", tKeywordStartRelative },
	{ "$endrelative",	tKeywordEndRelative },
	{ "$targetoffset",	tKeywordTargetOffset },
	{ "$carposition",	tKeywordCarPos },
	{ "$figposition",	tKeywordFigPos },
	{ "$trigger",		tKeywordTrigger },
	{ "DELAY",			tKeywordDelay },
	{ "ONCE",			tKeywordOnce },
	{ "$animation",		tKeywordAnimation },
	{ "$setactor",		tKeywordSetActor },
	{ "$setsound",		tKeywordSetSound },
	{ "$sample",		tKeywordSample },
	{ "$bindto",		tKeywordBindTo },
	{ "$expression",	tKeywordExpression },
	{ "$name",			tKeywordName },
	{ "$position",		tKeywordPosition },
	{ "$motion",		tKeywordMotion },
	{ "$yesno",			tKeywordYesNo },
	{ "$savepositions", tKeywordSavePositions },
	{ "$effect",		tKeywordEffect },
	{ "FADE",			tKeywordFade },
	{ "SHAKE",			tKeywordShake },
	{ "$story",			tKeywordStory },
	{ "$spinner",		tKeywordSpinner },
	{ "$tracking",		tKeywordTracking },
	{ "$linkto",		tKeywordLinkTo },
	{ "$mobile",		tKeywordMobile },
	{ "$dirlight",		tKeywordDirLight },
	{ "$pointlight",	tKeywordPointLight },
	{ NULL,				0 }

};

KeyValuePair ShotTokens[] = {

	{ "FIXED_TARGET",	tFixedStatic },
	{ "FIXED_OBJECT",	tFixedObject },
	{ "FIXED_PATH",		tFixedPath },
	{ "OBJECT_STATIC",	tObjectStatic },
	{ "OBJECT_OBJECT",  tObjectObject },
	{ "OBJECT_PATH",	tObjectPath },
	{ "PATH_TARGET",	tPathStatic },
	{ "PATH_OBJECT",	tPathObject },
	{ "PATH_PATH",		tPathPath },
	{ NULL,			    0 }

};

KeyValuePair ZoomTokens[] = {

	{ "DEFAULT_SIZE",		tDefaultSize },
	{ "CUSTOM_SIZE",		tCustomSize },
	{ "VALUE",				tZoomValue },
	{ "ZOOM_IN_HOLD",		tZoomInHold },
	{ "ZOOM_IN",			tZoomIn },
	{ "HOLD_ZOOM_OUT",		tHoldZoomOut },
	{ "ZOOM_OUT",			tZoomOut },
	{ NULL,				    0 }

};

KeyValuePair ActorTokens[] = {

	{ "PLAYER",			tActorPlayer },
	{ "SPARKY",			tActorSparky },
	{ "BOSS_ALIEN",  	tActorAlienQueen },
	{ "BOSS_MECH",		tActorBossMech },
	{ "BERG",			tActorBerg },
	{ "ROCKET_RACER",	tActorRocketRacer },
	{ NULL, 0 }

};

KeyValuePair ExpressionTokens[] = {

	{ "HAPPY1",			tExpressionHappy1 },
	{ "HAPPY2",			tExpressionHappy2 },
	{ "SAD1",			tExpressionSad1 },
	{ "SAD2",			tExpressionSad2 },
	{ "ANGRY1",			tExpressionAngry1 },
	{ "ANGRY2",			tExpressionAngry2 },
	{ "SURPRISED1",		tExpressionSurprised1 },
	{ "SURPRISED2",		tExpressionSurprised2 },
	{ "TALK",			tExpressionTalkHappy },
	{ "TALK_SAD",		tExpressionTalkSad },
	{ NULL,			    0 }

};

KeyValuePair StoryTokens[] = {

	{ "INTRO",					(SINT32) tStoryScriptSandyIntro },
	{ "PRE_TOWN_HALL",			(SINT32) tStoryScriptSandyPreTownHall },
	{ "TOWN_HALL",				(SINT32) tStoryScriptSandyTownHall },
	{ "WORKMAN_CHALLENGE",		(SINT32) tStoryScriptSandyWorkmanChallenge },
	{ "POSTMAN_CHALLENGE",		(SINT32) tStoryScriptSandyPostmanChallenge },
	{ "FIREMAN_CHALLENGE",		(SINT32) tStoryScriptSandyFiremanChallenge },
	{ "POLICEMAN_CHALLENGE",	(SINT32) tStoryScriptSandyPolicemanChallenge },
	{ NULL, 0 }

};

KeyValuePair EffectTokens[] = {

	{ "UP",		tSF_FadeUp },
	{ "DOWN",	tSF_FadeDown },
	{ "IDLE",	tSF_Idle },
	{ NULL, 0 }
};

SINT32 cEventList::ValueForKey( SINT32 token_type )
{
	KeyValuePair *pairs;

	switch ( token_type )
	{
	case NPC_TOKENS:
		pairs = NPCTokens;
		break;
	case SHOT_TOKENS:
		pairs = ShotTokens;
		break;
	case ZOOM_TOKENS:
		pairs = ZoomTokens;
		break;
	case EXPRESSION_TOKENS:
		pairs = ExpressionTokens;
		break;
	case ACTOR_TOKENS:
		pairs = ActorTokens;
		break;
	case STORY_TOKENS:
		pairs = StoryTokens;
		break;
	case EFFECT_TOKENS:
		pairs = EffectTokens;
		break;
	default:
		pairs = PrimaryTokens;
		break;
	}
	
	while ( pairs->Key )
	{
		if ( !strcmp( m_Keyword, pairs->Key ) )
			return pairs->Value;
		pairs++;
	}

	DBG( Barf() );
	return INVALID_KEY;
}