int anim(int animNum, int arg_2, int arg_4) { if(animNum == currentProcessedActorPtr->ANIM) { if(!(currentProcessedActorPtr->flags & 1)) { if(currentProcessedActorPtr->flags & 8) { deleteSub(currentProcessedActorIdx); } currentProcessedActorPtr->flags |= 1; initAnimInBody(currentProcessedActorPtr->FRAME, listAnim->get(animNum), listBody->get(currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->field_40 = arg_2; currentProcessedActorPtr->field_42 = arg_4; } else { currentProcessedActorPtr->field_40 = arg_2; currentProcessedActorPtr->field_42 = arg_4; return(0); } } else { if(animNum == -1) { currentProcessedActorPtr->field_44 = -2; return(1); } if(!(currentProcessedActorPtr->flags & 1)) { if(currentProcessedActorPtr->flags & 8) { deleteSub(currentProcessedActorIdx); } currentProcessedActorPtr->flags |= 1; initAnimInBody(currentProcessedActorPtr->FRAME, listAnim->get(animNum), listBody->get(currentProcessedActorPtr->bodyNum)); currentProcessedActorPtr->field_40 = arg_2; currentProcessedActorPtr->field_42 = arg_4; } else { if((currentProcessedActorPtr->field_40 & 2) || (currentProcessedActorPtr->field_46 & 2)) return(0); } currentProcessedActorPtr->field_44 = animNum; currentProcessedActorPtr->field_46 = arg_2; currentProcessedActorPtr->field_48 = arg_4; } return(1); }
int copyObjectToActor(int flag2, int var1, int foundName, int16 flag, int x, int y, int z, int stage, int room, int alpha, int beta, int gamma, int var2, int var3, int var4, int var5) { int i; int j; actorStruct *actorPtr = actorTable; char *bodyPtr; ZVStruct *zvPtr; for(i = 0; i < NUM_MAX_ACTOR; i++) { if(actorPtr->field_0 == -1) break; actorPtr++; } if(i == NUM_MAX_ACTOR) return -1; currentProcessedActorPtr = actorPtr; currentProcessedActorIdx = i; actorPtr->bodyNum = flag2; actorPtr->flags = flag; actorPtr->stage = stage; actorPtr->room = room; actorPtr->worldX = actorPtr->roomX = x; actorPtr->worldY = actorPtr->roomY = y; actorPtr->worldZ = actorPtr->roomZ = z; if(room != currentDisplayedRoom) { actorPtr->worldX -= (int16)((roomDataTable[currentDisplayedRoom].worldX - roomDataTable[actorPtr->room].worldX) * 10); actorPtr->worldY += (int16)((roomDataTable[currentDisplayedRoom].worldY - roomDataTable[actorPtr->room].worldY) * 10); actorPtr->worldZ += (int16)((roomDataTable[currentDisplayedRoom].worldZ - roomDataTable[actorPtr->room].worldZ) * 10); } actorPtr->alpha = alpha; actorPtr->beta = beta; actorPtr->gamma = gamma; actorPtr->dynFlags = 1; actorPtr->ANIM = var2; actorPtr->FRAME = var3; actorPtr->field_40 = var4; actorPtr->field_42 = var5; actorPtr->END_FRAME = 1; actorPtr->END_ANIM = 1; actorPtr->field_44 = -1; actorPtr->field_46 = 0; actorPtr->field_48 = -1; actorPtr->modX = 0; actorPtr->modY = 0; actorPtr->modZ = 0; for(j = 0; j < 3; j++) { actorPtr->COL[j] = -1; } actorPtr->COL_BY = -1; actorPtr->HARD_DEC = -1; actorPtr->HARD_COL = -1; if(g_fitd->getGameType() != GType_AITD1) { actorPtr->hardMat = -1; } actorPtr->rotate.oldAngle = 0; actorPtr->rotate.newAngle = 0; actorPtr->rotate.param = 0; actorPtr->field_60.oldAngle = 0; actorPtr->field_60.newAngle = 0; actorPtr->field_60.param = 0; actorPtr->falling = 0; actorPtr->field_72 = 0; actorPtr->speed = 0; actorPtr->trackMode = 0; actorPtr->trackNumber = -1; actorPtr->animActionType = 0; actorPtr->HIT = -1; actorPtr->HIT_BY = -1; if(flag2 != -1) { bodyPtr = listBody->get(actorPtr->bodyNum); if(var2 != -1) { char *animPtr = listAnim->get(var2); initAnimInBody(var3, animPtr, bodyPtr); actorPtr->field_4C = getAnimParam(animPtr); actorPtr->END_ANIM = 0; actorPtr->flags |= 1; // computeScreenBox(actorPtr->field_22 + actorPtr->field_5A, actorPtr->field_24 + actorPtr->field_5C, actorPtr->anim + actorPtr->field_5E, actorPtr->alpha, actorPtr->beta, actorPtr->gamma, bodyPtr); if(BBox3D1 < 0) BBox3D1 = 0; if(BBox3D3 > 319) BBox3D3 = 319; if(BBox3D2 < 0) BBox3D2 = 0; if(BBox3D4 > 199) BBox3D4 = 199; actorPtr->field_14 = BBox3D1; actorPtr->field_16 = BBox3D2; actorPtr->field_18 = BBox3D3; actorPtr->field_1A = BBox3D4; } else { if(!(actorPtr->flags & 4)) { actorPtr->flags &= 0xFFFE; } } } startChrono(&actorPtr->ROOM_CHRONO); startChrono(&actorPtr->CHRONO); zvPtr = &actorPtr->zv; switch(var1) { case 0: { if(flag2 != -1) { getZvMax(bodyPtr, zvPtr); } else { makeDefaultZV(zvPtr); } break; } case 1: { if(flag2 != -1) { getZvNormal(bodyPtr, zvPtr); } else { makeDefaultZV(zvPtr); } break; } case 2: { if(flag2 != -1) { getZvCube(bodyPtr, zvPtr); } else { makeDefaultZV(zvPtr); } break; } case 3: { if(flag2 != -1) { getZvRot(bodyPtr, zvPtr, alpha, beta, gamma); } else { makeDefaultZV(zvPtr); } break; } case 4: { if(g_fitd->getGameType() < GType_AITD3) { char *roomDataPtr = (char *)getRoomData(room); int numElements; int j; roomDataPtr += *(int16 *)roomDataPtr; numElements = *(int16 *)roomDataPtr; roomDataPtr += 2; for(j = 0; j < numElements; j++) { if(*(int16 *)(roomDataPtr + 0xE) == 9) { if(*(int16 *)(roomDataPtr + 0xC) == foundName) { int tempX; int tempY; int tempZ; zvPtr->ZVX1 = (int16)READ_LE_UINT16(roomDataPtr + 0x00); zvPtr->ZVX2 = (int16)READ_LE_UINT16(roomDataPtr + 0x02); zvPtr->ZVY1 = (int16)READ_LE_UINT16(roomDataPtr + 0x04); zvPtr->ZVY2 = (int16)READ_LE_UINT16(roomDataPtr + 0x06); zvPtr->ZVZ1 = (int16)READ_LE_UINT16(roomDataPtr + 0x08); zvPtr->ZVZ2 = (int16)READ_LE_UINT16(roomDataPtr + 0x0A); x = 0; y = 0; z = 0; tempX = ((*(int16 *)roomDataPtr) + (*(int16 *)(roomDataPtr + 2))) / 2; actorPtr->worldX = tempX; actorPtr->roomX = tempX; tempY = ((*(int16 *)(roomDataPtr + 4)) + (*(int16 *)(roomDataPtr + 6))) / 2; actorPtr->worldY = tempY; actorPtr->roomY = tempY; tempZ = ((*(int16 *)(roomDataPtr + 8)) + (*(int16 *)(roomDataPtr + 0xA))) / 2; actorPtr->worldZ = tempZ; actorPtr->roomZ = tempZ; if(room != currentDisplayedRoom) { actorPtr->worldX = (roomDataTable[currentDisplayedRoom].worldX - roomDataTable[room].worldX) * 10; actorPtr->worldY = (roomDataTable[currentDisplayedRoom].worldY - roomDataTable[room].worldY) * 10; actorPtr->worldZ = (roomDataTable[currentDisplayedRoom].worldZ - roomDataTable[room].worldZ) * 10; } break; } } roomDataPtr += 0x10; } if(j == numElements) { makeDefaultZV(zvPtr); } } break; } default: { warning("Unsupported ZV type in copyObjectToActor\n"); error("var1: %d\n", var1); ASSERT(0); break; } } zvPtr->ZVX1 += x; zvPtr->ZVX2 += x; zvPtr->ZVY1 += y; zvPtr->ZVY2 += y; zvPtr->ZVZ1 += z; zvPtr->ZVZ2 += z; return(i); }