void CStateParser::ParseStateDef(CTokenizer &tok,CStateManager &StateManager) { while( !tok.CheckToken("[",false) && !tok.AtEndOfFile() ) { //parse state type if( tok.CheckToken("type") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); //to get a single char char c=tok.GetToken()[0]; //make sure we use uperchars if(c >= 97) c-=32; switch(c) { case 'S': StateManager.SetStateDefType(stand); break; case 'C': StateManager.SetStateDefType(crouch); break; case 'A': StateManager.SetStateDefType(air); break; case 'L': StateManager.SetStateDefType(liedown); break; case 'U': StateManager.SetStateDefType(untouch); break; default: Error("Unknown statetype",tok); break; } } else if( tok.CheckToken("movetype") ) { if( !tok.CheckToken("=") ) Error("expected '=' in line ",tok); //to get a single char char c=tok.GetToken()[0]; //make sure we use uperchars if(c >= 97) c-=32; switch(c) { case 'A': StateManager.SetStateMoveType(attack); break; case 'I': StateManager.SetStateMoveType(idle); break; case 'H': StateManager.SetStateMoveType(hit); break; case 'U': StateManager.SetStateMoveType(untouch); break; default: Error("Unknown movetype",tok); break; } } else if( tok.CheckToken("physics") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); //to get a single char char c=tok.GetToken()[0]; //make sure we use uperchars if(c >= 97) c-=32; switch(c) { case 'S': StateManager.SetStatePhysicType(stand); break; case 'C': StateManager.SetStatePhysicType(crouch); break; case 'A': StateManager.SetStatePhysicType(air); break; case 'N': StateManager.SetStatePhysicType(none); break; case 'U': StateManager.SetStatePhysicType(untouch); break; default: Error("Unknown physic type",tok); break; } } else if( tok.CheckToken("anim") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); if(!tok.CheckTokenIsNumber()) Error("Expected a number for anim",tok); StateManager.SetStateAnim(tok.GetInt()); } else if( tok.CheckToken("velset") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); float x=tok.GetFloat(); if( !tok.CheckToken(",") ) Error("expected ,",tok); float y=tok.GetFloat(); StateManager.SetVelSet(x,y); } else if( tok.CheckToken("ctrl") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); if(!tok.CheckTokenIsNumber()) Error("Expected a number for ctrl",tok); StateManager.SetStateCtrl(tok.GetInt()); } else if( tok.CheckToken("poweradd") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); if(!tok.CheckTokenIsNumber()) Error("Expected a number for poweradd",tok); StateManager.SetStatePowerAdd(tok.GetInt()); } else if( tok.CheckToken("juggle") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); if(!tok.CheckTokenIsNumber()) Error("Expected a number for juggle",tok); StateManager.SetStateJuggle(tok.GetInt()); } else if( tok.CheckToken("facep2") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); if( !tok.CheckTokenIsNumber() ) Error("Expected a number for facep2",tok); StateManager.SetStateFaceP2(tok.GetInt()); } else if( tok.CheckToken("hitdefpersist") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); if( !tok.CheckTokenIsNumber() ) Error("Expected a number for hitdefpersist",tok); StateManager.SetStateHitDefPresit(tok.GetInt()); } else if( tok.CheckToken("movehitpersist") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); if( !tok.CheckTokenIsNumber() ) Error("Expected a number for movehitpersist",tok); StateManager.SetMoveHitPresit(tok.GetInt()); } else if( tok.CheckToken("hitcountpersist") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); if( !tok.CheckTokenIsNumber() ) Error("Expected a number for hitcountpersist",tok); StateManager.SetStateHitCounterPresit(tok.GetInt()); } else if( tok.CheckToken("sprpriority") ) { if( !tok.CheckToken("=") ) Error("expected =",tok); if( !tok.CheckTokenIsNumber() ) Error("Expected a number for sprpriority",tok); StateManager.SetSprPriority(tok.GetInt()); }else //faile in statedef { throw(CError("Unknown token at line %s",tok.GetToken())); break; } } }
//evaluates a primary void CStateParser::Primary(CTokenizer &tok,CStateManager &StateManager) { //a negate operator if( tok.CheckToken("-") ) { //EvaluateExpression(tok,StateManager); Primary(tok,StateManager); StateManager.AddInstruction(OP_NEG,0,"#"); }else if( tok.CheckTokenIsNumber() ) //we have a number { StateManager.AddInstruction(OP_PUSH,tok.GetFloat(),"#"); }else if( tok.CheckTokenIsQuotedString() ) //it is a "quitedstring" { StateManager.AddInstruction(OP_PUSH,0,tok.GetToken()); }else if( tok.CheckToken("(") ) //here we have to check a lot of possibilitys { EvaluateExpression(tok,StateManager); if( !tok.CheckToken(")") ) Error("Missing )",tok); }else if( tok.CheckToken("!") ) { Primary(tok,StateManager); StateManager.AddInstruction(OP_NOT,0,"#"); } else //check for a trigger name { std::string ret = tok.GetToken(); int i=GetTriggerType(ret.c_str(),tok); if ( i == OP_Vel - OP_Abs) { if (tok.CheckToken("x")) { StateManager.AddInstruction(OP_Vel,1.0,"#"); } else if (tok.CheckToken("y")) { StateManager.AddInstruction(OP_Vel,0.0,"#"); } }else if ( i == OP_Pos - OP_Abs) { if (tok.CheckToken("x")) { StateManager.AddInstruction(OP_Pos,1.0,"#"); } else if (tok.CheckToken("y")) { StateManager.AddInstruction(OP_Pos,0.0,"#"); } } else if ( i == OP_Const - OP_Abs) { if (!tok.CheckToken("(")) Error("Missing (",tok); StateManager.AddInstruction(OP_Const,0.0,tok.GetToken()); if (!tok.CheckToken(")")) Error("Missing )",tok); } else if ( i == OP_IfElse - OP_Abs) { if (!tok.CheckToken("(")) Error("Missing (",tok); EvaluateExpression(tok,StateManager); if (!tok.CheckToken(",")) Error("Missing ,",tok); Term(tok,StateManager); if (!tok.CheckToken(",")) Error("Missing ,",tok); Term(tok,StateManager); StateManager.AddInstruction(OP_IfElse,0,"#"); if (!tok.CheckToken(")")) Error("Missing )",tok); } else if (i == OP_StateType - OP_Abs) { if (tok.CheckToken("=")) { StateManager.AddInstruction(OP_StateType,0,"#"); StateManager.AddInstruction(OP_PUSH,0,tok.GetToken()); StateManager.AddInstruction(OP_EQUAL,0,"#"); }else if (tok.CheckToken("!=")) { StateManager.AddInstruction(OP_StateType,0,"#"); StateManager.AddInstruction(OP_PUSH,0,tok.GetToken()); StateManager.AddInstruction(OP_NOTEQUAL,0,"#"); } } else if (i == OP_P2StateType - OP_Abs) { if (tok.CheckToken("=")) { StateManager.AddInstruction(OP_P2StateType,0,"#"); StateManager.AddInstruction(OP_PUSH,0,tok.GetToken()); StateManager.AddInstruction(OP_EQUAL,0,"#"); }else if (tok.CheckToken("!=")) { StateManager.AddInstruction(OP_P2StateType,0,"#"); StateManager.AddInstruction(OP_PUSH,0,tok.GetToken()); StateManager.AddInstruction(OP_NOTEQUAL,0,"#"); } } else if (i == OP_P2MoveType - OP_Abs) { if (tok.CheckToken("=")) { StateManager.AddInstruction(OP_P2MoveType,0,"#"); StateManager.AddInstruction(OP_PUSH,0,tok.GetToken()); StateManager.AddInstruction(OP_EQUAL,0,"#"); }else if (tok.CheckToken("!=")) { StateManager.AddInstruction(OP_P2MoveType,0,"#"); StateManager.AddInstruction(OP_PUSH,0,tok.GetToken()); StateManager.AddInstruction(OP_NOTEQUAL,0,"#"); } } else if (i == OP_GetHitVar - OP_Abs) { if (!tok.CheckToken("(")) Error("Missing (",tok); StateManager.AddInstruction(OP_GetHitVar,0,tok.GetToken()); if (!tok.CheckToken(")")) Error("Missing )",tok); } else if (i == OP_HitDefAttr - OP_Abs) { while (!tok.AtEndOfLine()) tok.GetToken(); } else if (i == OP_P2BodyDist - OP_Abs) { while (!tok.AtEndOfLine()) tok.GetToken(); } else { StateManager.AddInstruction(i+OP_Abs,0,"#"); } } }
void CStateParser::ParseStateFile(const char* strFileName,CStateManager &StateManager,CAllocater *a) { //Set pointer to allocater m_pAlloc=a; CTokenizer tok; bool foundState=false; if( !tok.OpenFile(strFileName) ) throw(CError("CStateParser::ParseState: File %s not found",strFileName)); tok.SetIsCaseSensitive(false); tok.SetReturnNegativeSeperatelyFromNumber(false); while( !tok.AtEndOfFile() ) { foundState=false; if( tok.CheckToken("[") ) { if( tok.CheckToken("statedef") ) { foundState=true; if(!tok.CheckTokenIsNumber()) Error("Expected a number in statedef block",tok); StateManager.AddStateDef(tok.GetInt()); //Skip useless stuff while( !tok.AtEndOfLine() ) tok.GetToken(); //parse the state def ParseStateDef(tok,StateManager); } if( tok.CheckToken("state") ) { foundState=true; if(!tok.CheckTokenIsNumber()) Error("Expected a number in state block",tok); int stateno = tok.GetInt(); tok.CheckToken(","); // if(!tok.CheckTokenIsQuotedString() // && !tok.CheckTokenIsNumber()) // Error("Expected a number in state block",tok); std::string str = tok.GetToken(); StateManager.AddState(stateno, str.c_str()); while(!tok.AtEndOfLine()) tok.GetToken(); PareseState(tok,StateManager); } } //skip useless stuff if(!foundState) tok.GetToken(); } tok.CloseFile(); }
bool CCmdManager::LoadCMDFile( const char* file ) { int defaultCommandTime = 15; int defaultBufferTime = 1; m_CommandCount = 0; CTokenizer tok; //changed this to throw a exception if( !tok.OpenFile( file ) ) { throw(CError("CCmdManager::LoadCMDFile : Can't open %s",file)); return false; } // get count first to set up memory while( !tok.AtEndOfFile() ) { bool foundSomething = false; if( tok.CheckToken( "command.time" ) ) { foundSomething = true; if( !tok.CheckToken( "=" ) ) { } if( tok.CheckTokenIsNumber() ) { defaultCommandTime = tok.GetInt(); } } if( tok.CheckToken( "command.buffer.time" ) ) { foundSomething = true; if( !tok.CheckToken( "=" ) ) { } if( tok.CheckTokenIsNumber() ) { defaultBufferTime = tok.GetInt(); } } if( tok.CheckToken( "[" ) ) { foundSomething = true; if( tok.CheckToken( "Command" ) ) { if( tok.CheckToken( "]" ) ) { m_CommandCount++; } } } if( !foundSomething ) { tok.GetToken(); // skip it } } tok.CloseFile(); if( !tok.OpenFile( file ) ) return false; m_Commands = new PLCOMMAND[ m_CommandCount ]; PLCOMMAND* command = m_Commands; while( !tok.AtEndOfFile() ) { bool foundCommand = false; if( tok.CheckToken( "[" ) ) { if( tok.CheckToken( "Command" ) ) { if( !tok.CheckToken( "]" ) ) { } foundCommand = true; command->nCommandTime = defaultCommandTime; command->nBufferTime = defaultBufferTime; command->strCommand[0] = 0; command->nHowManyCommand = 0; while( command->nHowManyCommand < MAXCOMMAND && !tok.CheckToken( "[", false ) && !tok.AtEndOfFile() ) { if( tok.CheckToken( "name" ) ) { if( !tok.CheckToken( "=" ) ) { } strcpy( command->strCommand, tok.GetToken() ); } else if( tok.CheckToken( "command" ) ) { if( !tok.CheckToken( "=" ) ) { } while( !tok.AtEndOfLine() ) { const char* token = tok.GetToken(); if( !strcmp( token, "~" ) ) { command->nCommand[ command->nHowManyCommand ].keyModifier += PLC_KEYMOD_ON_RELEASE; if( tok.CheckTokenIsNumber() ) { command->nCommand[ command->nHowManyCommand ].gameTicksForHold = tok.GetInt(); } else { command->nCommand[ command->nHowManyCommand ].gameTicksForHold = 1; } } else if( !strcmp( token, "+" ) ) { } else if( !strcmp( token, "/" ) ) { command->nCommand[ command->nHowManyCommand ].keyModifier += PLC_KEYMOD_MUST_BE_HELD; } else if( !strcmp( token, "$" ) ) { command->nCommand[ command->nHowManyCommand ].keyModifier += PLC_KEYMOD_DETECT_AS_4WAY; } else if( !strcmp( token, ">" ) ) { command->nCommand[ command->nHowManyCommand ].keyModifier += PLC_KEYMOD_BAN_OTHER_INPUT; } else if( !strcmp( token, "," ) ) { command->nHowManyCommand++; } else if( !strcmp( token, "D" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_DOWN ); } else if( !strcmp( token, "U" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_UP ); } else if( !strcmp( token, "B" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_LEFT ); } else if( !strcmp( token, "F" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_RIGHT ); } else if( !strcmp( token, "DB" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_DOWN ) + PLC_KEYCODE( KEY_LEFT ); } else if( !strcmp( token, "DF" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_DOWN ) + PLC_KEYCODE( KEY_RIGHT ); } else if( !strcmp( token, "UF" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_UP ) + PLC_KEYCODE( KEY_LEFT ); } else if( !strcmp( token, "UB" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_UP ) + PLC_KEYCODE( KEY_LEFT ); } else if( !strcmp( token, "a" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_BUTTON_A ); } else if( !strcmp( token, "b" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_BUTTON_B ); } else if( !strcmp( token, "c" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_BUTTON_C ); } else if( !strcmp( token, "x" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_BUTTON_X ); } else if( !strcmp( token, "y" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_BUTTON_Y ); } else if( !strcmp( token, "z" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_BUTTON_Z ); } else if( !strcmp( token, "s" ) ) { command->nCommand[ command->nHowManyCommand ].keyCode += PLC_KEYCODE( KEY_BUTTON_START ); } } command->nHowManyCommand++; } else if( tok.CheckToken( "time" ) ) { if( !tok.CheckToken( "=" ) ) { } if( !tok.CheckTokenIsNumber() ) { } command->nCommandTime = tok.GetInt(); } else if( tok.CheckToken( "buffer.time" ) ) { if( !tok.CheckToken( "=" ) ) { } if( !tok.CheckTokenIsNumber() ) { } command->nBufferTime = tok.GetInt(); } } command++; } } if( !foundCommand ) tok.GetToken(); // skip it } tok.CloseFile(); return true; }