void cCombatManager::UnitDamaged(const int& unitID, UnitInfo* U, const int& attackerID, EnemyInfo* A, float3& dir) { ValidateEnemy(unitID,U,false); if( attackerID >= 0 && attackerID != U->enemyID ) { float3 Pos = cb->GetUnitPos(unitID); float3 APos = GetEnemyPosition(attackerID,A); if( U->enemyID == -1 || Pos.distance(APos) < Pos.distance(GetEnemyPosition(U->enemyID,U->E)) ) if( CanAttack(U, A, APos) != 0 && (U->group == 0 || U->group->Enemies.find(attackerID) != U->group->Enemies.end()) ) { U->enemyID=attackerID; U->E = A; U->enemyEff = CanAttack(U, A, APos); } } if( U->inCombat ) { if( U->ud->isCommander ) { if( int(cb->GetCurrentUnitCommands(unitID)->size()) == 0 ) UnitIdle(unitID,U); else if( cb->GetCurrentUnitCommands(unitID)->front().id != CMD_MOVE ) { if( cb->GetUnitHealth(unitID)/U->ud->health <= 0.66 || (cb->GetUnitHealth(unitID)/U->ud->health <= 0.9 && cb->GetCurrentUnitCommands(unitID)->front().id == CMD_CAPTURE) ) UnitIdle(unitID,U); } } return; } if( U->BuildQ != 0 && U->BuildQ->RS != 0 ) U->BuildQ->tryCount = 4; // If the project is destroyed too many times, give up on it U->inCombat=true; if( U->enemyID == -1 ) { if( attackerID >= 0 ) { float3 APos = GetEnemyPosition(attackerID,A); CommandRun(unitID,U,APos); } else { float3 EPos = cb->GetUnitPos(unitID); EPos.x += dir.x*700; EPos.z += dir.z*700; EPos.y = cb->GetElevation(EPos.x,EPos.z); CommandRun(unitID,U,EPos); } } else UnitIdle(unitID,U); }
bool cCombatManager::CommandDGun(const int& unitID, UnitInfo *U) { if( U->udr->DGun == 0 || cb->GetEnergy() < U->udr->DGun->energycost ) return false; float3 EPos = GetEnemyPosition(U->enemyID,U->E); float EDis = EPos.distance(cb->GetUnitPos(unitID)); if( EDis > 1.05*U->udr->DGun->range ) return false; if( U->ud->isCommander ) { if( U->E->ud != 0 && U->E->ud->isCommander ) { CommandRun(unitID,U,EPos); return true; } } Command c; c.id=CMD_DGUN; c.params.push_back(EPos.x); c.params.push_back(EPos.y); c.params.push_back(EPos.z); cb->GiveOrder(unitID, &c); G->UpdateEventAdd(1,cb->GetCurrentFrame()+5,unitID,U); return true; }
void cCombatManager::UnitIdle(const int& unit, UnitInfo *U) { //*l<<"(cui) -eID="<<U->enemyID; if( ValidateEnemy(unit,U) && CanAttack(U,U->E,GetEnemyPosition(U->enemyID,U->E)) == 0 ) U->enemyID=-1; float3 fPos=cb->GetUnitPos(unit); if( U->enemyID == -1 ) while( (U->enemyID=GetClosestEnemy(fPos,U)) > 0 && !ValidateEnemy(unit,U) ) {} float distance = -1; if( U->enemyID >= 0 ) { distance = fPos.distance(GetEnemyPosition(U->enemyID,U->E)); if( distance == 0 ) distance = 1; } if( U->enemyID == -1 || (U->udrBL->task != TASK_ASSAULT && distance > 2.5*8*U->ud->losRadius) ) { U->inCombat=false; G->UpdateEventAdd(1,0,unit,U); return; } else if( CommandDGun(unit,U) ) return; else if( U->enemyEff == 0 || (U->udrBL->task != TASK_ASSAULT && distance > 1.75*U->enemyEff->BestRange ) || (U->ud->isCommander && cb->GetUnitHealth(unit)/U->ud->health <= 0.66 ) ) // || G->Enemies.find(U->enemyID)->second.ud->kamikazeDist > distance { float3 EPos = GetEnemyPosition(U->enemyID,U->E); CommandRun(unit,U,EPos); return; } else if( CommandCapture(unit,U,distance) || CommandManeuver(unit,U,distance) ) return; else { float3 EPos = GetEnemyPosition(U->enemyID,U->E); Command c; if( U->ud->canAttack && (U->E->inLOS || U->E->inRadar) ) { c.id = CMD_ATTACK; c.params.push_back(U->enemyID); } else if( U->ud->canAttack && (U->udr->IsBomber && U->E->posLocked) ) { c.id = CMD_ATTACK; c.params.push_back(EPos.x); c.params.push_back(EPos.y); c.params.push_back(EPos.z); } else // cant see enemy or Mod Workaround: Combat Lords - cant be given attack orders { c.id = CMD_MOVE; c.params.push_back(EPos.x -100.0 +rand()%201 ); c.params.push_back(EPos.y); c.params.push_back(EPos.z -100.0 +rand()%201 ); } cb->GiveOrder(unit, &c); G->UpdateEventAdd(1,int(GetNextUpdate(distance,U)),unit,U); } }
bool CDebuggerWin::ExecCommand(char *linetext) { char emptystring[]=" "; char tmptext[MAX_LINE_SIZE+1]; char *arglist[MAX_COMMAND_ARGS+1]; int argcount=0,loop=0; bool cmd_ok=TRUE; enum { COMMAND_QUIT, COMMAND_RUN, COMMAND_STOP, COMMAND_STEP, COMMAND_BPOINT, COMMAND_BPOINTC, COMMAND_RESET, COMMAND_REGISTERS, COMMAND_MEM_SET, COMMAND_MEM_DUMP, COMMAND_MEM_LOAD, COMMAND_MEM_SAVE, COMMAND_CART_SET, COMMAND_CART_DUMP, COMMAND_CART_LOAD, COMMAND_CART_SAVE, COMMAND_HELP, COMMAND_SCRIPT, COMMAND_SEARCH, COMMAND_REM, COMMAND_EXECUTE, COMMAND_LOG, COMMAND_UNKNOWN }; const struct command_list commands[]= { { COMMAND_QUIT, "QUIT" ,"QUIT - Immediate exit from the emulator back to windows" ,"" }, { COMMAND_RUN, "RUN" ,"RUN [xxxx] - Run from xxxx (optional)" ,"Usage: RUN [addr]" }, { COMMAND_STOP, "STOP" ,"STOP - Halt CPU" ,"" }, { COMMAND_STEP, "STEP" ,"STEP [xxxx] - Single Step the CPU from addr xxxx (optional)" ,"" }, { COMMAND_SCRIPT, "SCRIPT","SCRIPT <file> - Run a script file" ,"Usage: SCRIPT <file>" }, { COMMAND_BPOINT, "BP" ,"BP [n] [xxxx]/CLR - Set/List/Clear breakpoint n to xxxx" ,"Usage: BP [n] [xxxx]/CLR" }, { COMMAND_RESET, "RESET" ,"RESET - Reset CPU, also halts" ,"" }, { COMMAND_REGISTERS, "REG" ,"REG [PC/SP/PS/X/Y/A] [Value] - Display/Set registers" ,"Usage: REG [PC/SP/PS/X/Y/A] [Value]" }, { COMMAND_MEM_SET, "MS" ,"MS <xxxx> <aa> [bb]..[ff] - Set RAM xxxx to aa.bb,cc,etc" ,"Usage: MS <xxxx> <aa> [bb]..[ff]" }, { COMMAND_MEM_DUMP, "MD" ,"MD [xxxx] [yyyy] - Dump RAM from xxxx to yyyy" ,"Usage: MD <xxxx> [yyyy]" }, { COMMAND_MEM_LOAD, "MLOAD" ,"MLOAD <xxxx> <file> - Load RAM from file starting at xxxx" ,"Usage: MLOAD <xxxx> <file>" }, { COMMAND_MEM_SAVE, "MSAVE" ,"MSAVE <xxxx> <yyyy> <file> - Save RAM to file from xxxx-yyyy" ,"Usage: MSAVE <xxxx> <yyyy> <file>" }, { COMMAND_SEARCH, "MSRCH" ,"MSRCH <xxxx> <yyyy> \"param\" - Search RAM for string" ,"Usage: MSRCH <xxxx> <yyyy> \"param\"\\<aa bb cc ...>" }, { COMMAND_SEARCH, "MSRCH" ,"MSRCH <xxxx> <yyyy> <aa bb ..> - Search RAM for bytes" ,"Usage: MSRCH <xxxx> <yyyy> \"param\"\\<aa bb cc ...>" }, { COMMAND_CART_SET, "CS" ,"CS <xxxx> <aa> [bb]..[ff] - Set cartridge memory xxxx to aa.bb,cc,etc" ,"Usage: CS <xxxx> <aa> [bb]..[ff]" }, { COMMAND_CART_DUMP, "CD" ,"CD [xxxxxx] [yyyyyy] - Dump cartridge memory from xxxxxx to yyyyyy" ,"Usage: CD <xxxxxx> [yyyyyy]" }, { COMMAND_CART_LOAD, "CLOAD" ,"CLOAD <xxxxxx> <file> - Load cartridge from file starting at xxxxxx" ,"Usage: CLOAD <xxxxxx> <file>" }, { COMMAND_CART_SAVE, "CSAVE" ,"CSAVE <xxxxxx> <yyyyyy> <file> - Save cartridge to file from xxxxxx-yyyyyy" ,"Usage: CSAVE <xxxxxx> <yyyyyy> <file>" }, { COMMAND_SEARCH, "CSRCH" ,"CSRCH <xxxx> <yyyy> \"param\" - Search cartridge for string" ,"Usage: CSRCH <xxxx> <yyyy> \"param\"\\<aa bb cc ...>" }, { COMMAND_SEARCH, "CSRCH" ,"CSRCH <xxxx> <yyyy> <aa bb ..> - Search cartridge for bytes" ,"Usage: CSRCH <xxxx> <yyyy> \"param\"\\<aa bb cc ...>" }, { COMMAND_REM, "REM" ,"REM - Some comments - Script Remark/Comments, will be ignored " ,"" }, { COMMAND_EXECUTE, "EXEC" ,"EXEC .... - Execute/Spawn external command" ,"Usage: EXEC (args....)" }, { COMMAND_LOG, "LOG" ,"LOG [filename] .... - Log all output to a file" ,"Usage: LOG [filename]" }, { COMMAND_HELP, "HELP" ,"HELP - Prints this text" ,"" }, { COMMAND_UNKNOWN, "" ,"" ,"" } }; // Dump back to the edit window strcpy(tmptext,">"); strncat(tmptext,linetext,MAX_LINE_SIZE-1); tmptext[MAX_LINE_SIZE]=0; LineOutput(tmptext); // Splat remaining arg array to null for(loop=0;loop<MAX_COMMAND_ARGS;loop++) arglist[loop]=&emptystring[0]; arglist[MAX_COMMAND_ARGS]=NULL; loop=0; // Put all to upper case while(linetext[loop]!=0x00) { linetext[loop]=toupper(linetext[loop]); loop++; } if((arglist[0]=Tokenize(linetext))!=NULL) { argcount++; while(argcount<MAX_COMMAND_ARGS) { if((arglist[argcount]=Tokenize(NULL))==NULL) { // Fix up the null string on the end arglist[argcount]=emptystring; break; } argcount++; } } // Process into argc/argv if(argcount) { loop=0; for(;;) { // Check for the end of the list if(strcmp(commands[loop].command,"")==0) break; // Check our command if(strcmp(commands[loop].command,arglist[0])==0) break; loop++; } switch(commands[loop].command_id) { case COMMAND_REM: cmd_ok=TRUE; break; case COMMAND_QUIT: cmd_ok=CommandQuit(argcount,arglist); break; case COMMAND_RUN: cmd_ok=CommandRun(argcount,arglist); break; case COMMAND_STOP: cmd_ok=CommandStop(argcount,arglist); break; case COMMAND_STEP: cmd_ok=CommandStep(argcount,arglist); break; case COMMAND_BPOINT: cmd_ok=CommandBpoint(argcount,arglist); break; case COMMAND_SCRIPT: cmd_ok=CommandScript(argcount,arglist); break; case COMMAND_SEARCH: cmd_ok=CommandSearch(argcount,arglist); break; case COMMAND_RESET: cmd_ok=CommandReset(argcount,arglist); break; case COMMAND_REGISTERS: cmd_ok=CommandRegisters(argcount,arglist); break; case COMMAND_MEM_SET: cmd_ok=CommandMemSet(argcount,arglist); break; case COMMAND_MEM_DUMP: cmd_ok=CommandMemDump(argcount,arglist); break; case COMMAND_MEM_LOAD: cmd_ok=CommandMemLoad(argcount,arglist); break; case COMMAND_MEM_SAVE: cmd_ok=CommandMemSave(argcount,arglist); break; case COMMAND_CART_SET: cmd_ok=CommandCartSet(argcount,arglist); break; case COMMAND_CART_DUMP: cmd_ok=CommandCartDump(argcount,arglist); break; case COMMAND_CART_LOAD: cmd_ok=CommandCartLoad(argcount,arglist); break; case COMMAND_CART_SAVE: cmd_ok=CommandCartSave(argcount,arglist); break; case COMMAND_EXECUTE: cmd_ok=CommandExecute(argcount,arglist); break; case COMMAND_LOG: cmd_ok=CommandLog(argcount,arglist); break; case COMMAND_HELP: { int loop=0; LineOutput("Supported Command Line Functions are:"); do { if(strcmp(commands[loop].help,"")!=0) LineOutput(commands[loop].help); loop++; } while(commands[loop].command_id!=COMMAND_UNKNOWN); LineOutput(" ( <xx> - Mandatory agrument, [xx] - Optional argument )"); LineOutput(""); cmd_ok=TRUE; } break; default: case COMMAND_UNKNOWN: cmd_ok=CommandNotFound(argcount,arglist); break; } // Redraw all debug windows incase global data change AfxGetMainWnd()->PostMessage(WM_COMMAND,IDM_DRAW_DEBUG_WINDOWS); if(cmd_ok) { // Clear the command line mpEditLine->SetWindowText(""); } else { // Provide usage text if available if(strcmp(commands[loop].help,"")!=0) LineOutput(commands[loop].usage); } } return cmd_ok; }