diff --git a/src/action/actions.cpp b/src/action/actions.cpp index 6757eb674..d6eaeed0f 100644 --- a/src/action/actions.cpp +++ b/src/action/actions.cpp @@ -94,9 +94,13 @@ global int UnitShowAnimation(Unit* unit,const Animation* animation) */ local void HandleUnitAction(Unit* unit) { - if ( unit->Revealer ) - { - unit->Command.Action = UnitActionDie; + // FIXME: Johns: What should this do? + if ( unit->Revealer ) { +#ifdef NEW_ORDERS + unit->Orders[0].Action = UnitActionDie; +#else + unit->Command.Action = UnitActionDie; +#endif } // // If current action is breakable proceed with next one. @@ -104,6 +108,79 @@ local void HandleUnitAction(Unit* unit) if( unit->Reset ) { unit->Reset=0; +#ifdef NEW_ORDERS + + // + // o Look if we have a new order and old finished. + // o Or the order queue should be flushed. + // + if( unit->OrderCount>1 + && (unit->Orders[0].Action==UnitActionStill || unit->OrderFlush) + ) { + int z; + + if( unit->Removed ) { // FIXME: johns I see this as an error + DebugLevel0Fn("Flushing removed unit\n"); + } + + // + // Release pending references. + // + if( unit->Orders[0].Goal ) { +#ifdef REFS_DEBUG + DebugCheck( !unit->Orders[0].Goal->Refs ); +#endif + if( !--unit->Orders[0].Goal->Refs ) { + ReleaseUnit(unit->Orders[0].Goal); + } + IfDebug( unit->Orders[0].Goal=NoUnitP; ) + } + + // + // Old order has a saved order + // + if( unit->SavedOrder.Action!=UnitActionStill ) { + // + // Release pending references. + // + if( unit->SavedOrder.Goal ) { +#ifdef REFS_DEBUG + DebugCheck( !unit->SavedOrder.Goal->Refs ); +#endif + if( !--unit->SavedOrder.Goal->Refs ) { + ReleaseUnit(unit->SavedOrder.Goal); + } + } + unit->SavedOrder.Action=UnitActionStill; + unit->SavedOrder.Goal=NoUnitP; + } + + // + // Shift queue with structure assignment + // + unit->OrderCount--; + unit->OrderFlush=0; + for ( z = 0; z < unit->OrderCount; z++ ) { + unit->Orders[z] = unit->Orders[z+1]; + } + + // + // Must reset the new order. + // + // FIXME: ResetPath(&unit->Orders[0]); + + unit->SubAction=0; + unit->State=0; + unit->Wait=1; + + if( IsSelected(unit) ) { // update display for new action + UpdateButtonPanel(); + MustRedraw|=RedrawButtonPanel; + } + } + +#else + // // New command and forced or old ready (= still) // FIXME: how should we deal with saved commands? @@ -140,9 +217,10 @@ local void HandleUnitAction(Unit* unit) } unit->NextFlush=0; + + // Reset for new order unit->SubAction=0; unit->State=0; - unit->Wait=1; if( IsSelected(unit) ) { // update display for new action @@ -150,6 +228,7 @@ local void HandleUnitAction(Unit* unit) MustRedraw|=RedrawButtonPanel; } } +#endif } // FIXME: fire handling should be moved to here. @@ -157,7 +236,11 @@ local void HandleUnitAction(Unit* unit) // // Select action. // +#ifdef NEW_ORDERS + switch( unit->Orders[0].Action ) { +#else switch( unit->Command.Action ) { +#endif case UnitActionNone: DebugLevel1Fn("FIXME: Should not happen!\n"); break; @@ -248,7 +331,11 @@ local void HandleUnitAction(Unit* unit) break; default: +#ifdef NEW_ORDERS + DebugLevel1Fn("Unknown action %d\n",unit->Orders[0].Action); +#else DebugLevel1Fn("Unknown action %d\n",unit->Command.Action); +#endif break; } }