Core.Object | +--Engine.Actor | +--Engine.Info | +--UnrealI.CodeMaster
int
ActualOrder[6]
name
MainEvent
MoverTags[6]
NumElements
NumTriggered
OrderCode[6]
TriggerFlags[6]
bool
bTriggeredAlready
void
BeginPlay()
CheckOrder()
NotifyTriggered(int TriggerCode)
00001 //============================================================================= 00002 // CodeMaster. 00003 //============================================================================= 00004 class CodeMaster extends Info; 00005 00006 // When a set of CodeTriggers are set up along with their corresponding 00007 // ElevatorMovers, the CodeMaster is notified by the CodeTriggers whenever 00008 // something encroaches upon them, and tries to match the order of trigger 00009 // activations to a preset pattern, and if the pattern is matched, the 00010 // main event is called, solving the "puzzle". M 00011 00012 var() int OrderCode[6]; 00013 var() name MoverTags[6]; 00014 var() int NumElements; 00015 var() name MainEvent; 00016 00017 var int ActualOrder[6]; 00018 var int TriggerFlags[6]; 00019 var int NumTriggered; 00020 var bool bTriggeredAlready; 00021 00022 function BeginPlay() 00023 { 00024 local int i; 00025 00026 bTriggeredAlready = false; 00027 for( i=0; i<NumElements; i++ ) TriggerFlags[i] = 0; 00028 NumTriggered = 0; 00029 } 00030 00031 function NotifyTriggered( int TriggerCode ) 00032 { 00033 // Don't continue if the main Event has already been successfully called 00034 if( bTriggeredAlready ) return; 00035 00036 // Don't add it to the order list if this trigger has been triggered already 00037 if( TriggerFlags[ TriggerCode ] == 1 ) return; 00038 00039 // Set the trigger flag for this code 00040 //log( "TriggerCode = " $ TriggerCode ); 00041 TriggerFlags[ TriggerCode ] = 1; 00042 00043 // Add this code to the sequence 00044 if( NumTriggered == NumElements ) NumTriggered = 0; 00045 ActualOrder[ NumTriggered ] = TriggerCode; 00046 NumTriggered++; 00047 00048 CheckOrder(); 00049 } 00050 00051 function CheckOrder() 00052 { 00053 local int i; 00054 local int bR; 00055 local ElevatorMover EM; 00056 local Actor tAct; 00057 00058 // Check if the order given matches what is required to cause the event 00059 00060 bR = 1; 00061 // First check if all the triggers were activated 00062 for( i=0; i<NumElements; i++ ) 00063 bR = bR * TriggerFlags[i]; 00064 00065 if( bR != 0 ) 00066 { 00067 //log("All triggers activated"); 00068 // All the triggers were activated 00069 // Now check if the order of activation was correct 00070 for( i=0; i<NumElements; i++ ) 00071 { 00072 if( OrderCode[i] == ActualOrder[i] ) 00073 { 00074 if( i == NumElements-1 ) 00075 { 00076 //log("Successful! Calling Main Event."); 00077 // successful match 00078 // Call the main Event 00079 if( MainEvent != '' ) 00080 foreach AllActors( class 'Actor', tAct, MainEvent ) 00081 tAct.Trigger( Self, Self.Instigator ); 00082 00083 // deactivate the CodeMaster 00084 bTriggeredAlready = true; 00085 return; 00086 } 00087 } 00088 else break; 00089 } 00090 00091 //log("Resetting puzzle"); 00092 00093 // If false then find all ElevatorMovers who have Tags which match 00094 // this CodeMaster's Event, and Move them to keyframe 0. 00095 for( i=0; i<NumElements; i++ ) 00096 { 00097 if( MoverTags[i] != '' ) 00098 foreach AllActors( class 'ElevatorMover', EM, MoverTags[i] ) 00099 EM.MoveKeyframe( 0, EM.MoveTime ); 00100 } 00101 00102 // Clear the TriggerFlags array, reset the puzzle 00103 for( i=0; i<NumElements; i++ ) TriggerFlags[i] = 0; 00104 NumTriggered = 0; 00105 } 00106 } 00107 00108 defaultproperties 00109 { 00110 }