diff --git a/src/action/action_attack.cpp b/src/action/action_attack.cpp index a8837db4d..20b0a9717 100644 --- a/src/action/action_attack.cpp +++ b/src/action/action_attack.cpp @@ -191,12 +191,12 @@ local void MoveToTarget(Unit* unit) goal->Refs++; if( unit->SavedOrder.Action==UnitActionStill ) { // Save current command to come back. - unit->SavedOrder=unit->Command; + unit->SavedOrder=unit->Orders[0]; } unit->Orders[0].Goal=goal; ResetPath(unit->Orders[0]); - unit->Orders[0].X=goal->X; - unit->Orders[0].Y=goal->Y; + unit->Orders[0].X=-1; + unit->Orders[0].Y=-1; unit->SubAction|=2; // weak target DebugLevel3Fn("%Zd in react range %Zd\n" ,UnitNumber(unit),UnitNumber(goal)); @@ -235,6 +235,16 @@ local void MoveToTarget(Unit* unit) DebugCheck( !goal->Refs ); #endif temp->Refs++; +#ifdef NEW_ORDERS + if( unit->SavedOrder.Action==UnitActionStill ) { + // Save current command to come back. + unit->SavedOrder=unit->Orders[0]; + } + unit->Orders[0].Goal=goal=temp; + ResetPath(unit->Orders[0]); + unit->Orders[0].X=goal->X; + unit->Orders[0].Y=goal->Y; +#else if( unit->SavedCommand.Action==UnitActionStill ) { // Save current command to come back. unit->SavedCommand=unit->Command; @@ -243,6 +253,7 @@ local void MoveToTarget(Unit* unit) ResetPath(unit->Command); unit->Command.Data.Move.DX=goal->X; unit->Command.Data.Move.DY=goal->Y; +#endif } } @@ -256,6 +267,21 @@ local void MoveToTarget(Unit* unit) UnitHeadingFromDeltaXY(unit,goal->X-unit->X,goal->Y-unit->Y); } unit->SubAction++; +#ifdef NEW_ORDERS + } else if( (wall || unit->Orders[0].Action==UnitActionAttackGround) + && MapDistance(unit->X,unit->Y + ,unit->Orders[0].X,unit->Orders[0].Y) + <=unit->Stats->AttackRange ) { + DebugLevel3Fn("Attacking wall or ground\n"); + unit->State=0; + if( !unit->Type->Tower ) { + UnitHeadingFromDeltaXY(unit,unit->Orders[0].X-unit->X + ,unit->Orders[0].Y-unit->Y); + } + unit->SubAction=1; + return; + } else if( err<0 ) { +#else } else if( (wall || unit->Command.Action==UnitActionAttackGround) && MapDistance(unit->X,unit->Y ,unit->Command.Data.Move.DX,unit->Command.Data.Move.DY) @@ -269,18 +295,31 @@ local void MoveToTarget(Unit* unit) unit->SubAction=1; return; } else if( err<0 ) { +#endif unit->State=0; unit->SubAction=0; // Return to old task? +#ifdef NEW_ORDERS + if( unit->Orders[0].Action==UnitActionStill ) { + unit->Orders[0]=unit->SavedOrder; + // Must finish, if saved command finishes + unit->SavedOrder.Action=UnitActionStill; + } +#else if( unit->Command.Action==UnitActionStill ) { unit->Command=unit->SavedCommand; // Must finish if saved command finishes unit->SavedCommand.Action=UnitActionStill; } +#endif return; } DebugCheck( unit->Type->Vanishes || unit->Destroyed ); +#ifdef NEW_ORDERS + unit->Orders[0].Action=UnitActionAttack; +#else unit->Command.Action=UnitActionAttack; +#endif } } @@ -295,16 +334,28 @@ local void AttackTarget(Unit* unit) AnimateActionAttack(unit); if( unit->Reset ) { +#ifdef NEW_ORDERS + goal=unit->Orders[0].Goal; +#else goal=unit->Command.Data.Move.Goal; +#endif // // Goal is "weak" or a wall. // +#ifdef NEW_ORDERS + if( !goal && (WallOnMap(unit->Orders[0].X,unit->Orders[0].Y) + || unit->Orders[0].Action==UnitActionAttackGround) ) { + DebugLevel3Fn("attack a wall!!!!\n"); + return; + } +#else if( !goal && (WallOnMap(unit->Command.Data.Move.DX ,unit->Command.Data.Move.DY) || unit->Command.Action==UnitActionAttackGround) ) { DebugLevel3Fn("attack a wall!!!!\n"); return; } +#endif // // Target is dead, choose new one. @@ -318,14 +369,23 @@ local void AttackTarget(Unit* unit) if( !--goal->Refs ) { ReleaseUnit(goal); } +#ifdef NEW_ORDERS + unit->Orders[0].Goal=goal=NoUnitP; + } else if( !goal->HP || goal->Orders[0].Action==UnitActionDie ) { +#else unit->Command.Data.Move.Goal=goal=NoUnitP; } else if( !goal->HP || goal->Command.Action==UnitActionDie ) { +#endif // FIXME: goal->Removed??? --goal->Refs; #ifdef REFS_DEBUG DebugCheck( !goal->Refs ); #endif +#ifdef NEW_ORDERS + unit->Orders[0].Goal=goal=NoUnitP; +#else unit->Command.Data.Move.Goal=goal=NoUnitP; +#endif } } // @@ -334,24 +394,47 @@ local void AttackTarget(Unit* unit) if( !goal ) { unit->State=0; goal=AttackUnitsInReactRange(unit); +#ifdef NEW_ORDERS + if( !goal ) { + unit->SubAction=0; + // Return to old task! + unit->Orders[0]=unit->SavedOrder; + // Must finish, if saved command finishes + unit->SavedOrder.Action=UnitActionStill; + ResetPath(unit->Orders[0]); + return; + } + if( unit->SavedOrder.Action==UnitActionStill ) { + // Save current command to come back. + unit->SavedOrder=unit->Orders[0]; + } +#else if( !goal ) { unit->SubAction=0; // Return to old task! unit->Command=unit->SavedCommand; - // Must finish if saved command finishes + // Must finish, if saved command finishes unit->SavedCommand.Action=UnitActionStill; + ResetPath(unit->Command); return; } if( unit->SavedCommand.Action==UnitActionStill ) { // Save current command to come back. unit->SavedCommand=unit->Command; } +#endif goal->Refs++; DebugLevel3Fn("%Zd Unit in react range %Zd\n" ,UnitNumber(unit),UnitNumber(goal)); +#ifdef NEW_ORDERS + unit->Orders[0].Goal=goal; + unit->Orders[0].X=-1; + unit->Orders[0].Y=-1; +#else unit->Command.Data.Move.Goal=goal; unit->Command.Data.Move.DX=goal->X; unit->Command.Data.Move.DY=goal->Y; +#endif unit->SubAction|=2; } else