int FinishStates (FActorInfo *actor, AActor *defaults, Baggage &bag) { static int c=0; int count = StateArray.Size(); if (count > 0) { FState *realstates = new FState[count]; int i; int currange; memcpy(realstates, &StateArray[0], count*sizeof(FState)); actor->OwnedStates = realstates; actor->NumOwnedStates = count; // adjust the state pointers // In the case new states are added these must be adjusted, too! FixStatePointers (actor, StateLabels); for(i = currange = 0; i < count; i++) { // resolve labels and jumps switch((ptrdiff_t)realstates[i].NextState) { case 0: // next realstates[i].NextState = (i < count-1 ? &realstates[i+1] : &realstates[0]); break; case -1: // stop realstates[i].NextState = NULL; break; case -2: // wait realstates[i].NextState = &realstates[i]; break; default: // loop if ((size_t)realstates[i].NextState < 0x10000) { realstates[i].NextState = &realstates[(size_t)realstates[i].NextState-1]; } else // goto { realstates[i].NextState = ResolveGotoLabel (defaults, bag.Info->Class, (char *)realstates[i].NextState); } } } } StateArray.Clear (); // Fix state pointers that are gotos FixStatePointersAgain (actor, defaults, StateLabels); return count; }
int FStateDefinitions::FinishStates (FActorInfo *actor, AActor *defaults) { int count = StateArray.Size(); if (count > 0) { FState *realstates = new FState[count]; int i; memcpy(realstates, &StateArray[0], count*sizeof(FState)); actor->OwnedStates = realstates; actor->NumOwnedStates = count; // adjust the state pointers // In the case new states are added these must be adjusted, too! FixStatePointers(actor, StateLabels); // Fix state pointers that are gotos ResolveGotoLabels(actor, defaults, StateLabels); for (i = 0; i < count; i++) { // resolve labels and jumps switch (realstates[i].DefineFlags) { case SDF_STOP: // stop realstates[i].NextState = NULL; break; case SDF_WAIT: // wait realstates[i].NextState = &realstates[i]; break; case SDF_NEXT: // next realstates[i].NextState = (i < count-1 ? &realstates[i+1] : &realstates[0]); break; case SDF_INDEX: // loop realstates[i].NextState = &realstates[(size_t)realstates[i].NextState-1]; break; case SDF_LABEL: realstates[i].NextState = ResolveGotoLabel(defaults, actor->Class, (char *)realstates[i].NextState); break; } } } else { // Fix state pointers that are gotos ResolveGotoLabels(actor, defaults, StateLabels); } return count; }
static void FixStatePointers (FActorInfo *actor, TArray<FStateDefine> & list) { for(unsigned i=0;i<list.Size(); i++) { size_t v=(size_t)list[i].State; if (v >= 1 && v < 0x10000) { list[i].State = actor->OwnedStates + v - 1; } if (list[i].Children.Size() > 0) FixStatePointers(actor, list[i].Children); } }
void FStateDefinitions::FixStatePointers (FActorInfo *actor, TArray<FStateDefine> & list) { for(unsigned i=0;i<list.Size(); i++) { if (list[i].DefineFlags == SDF_INDEX) { size_t v=(size_t)list[i].State; list[i].State = actor->OwnedStates + v - 1; list[i].DefineFlags = SDF_STATE; } if (list[i].Children.Size() > 0) FixStatePointers(actor, list[i].Children); } }