void tcCarGeneralOverhoul(Car car) { Person marc = dbGetObject(Person_Marc_Smith); LIST *bubble; ubyte choice; SetPictID(marc->PictID); bubble = txtGoKeyAndInsert(BUSINESS_TXT, "GENERAL_OVERHOUL", (U32) ((tcCostsPerTotalRepair(car) * 255) / 8), NULL); Bubble(bubble, 0, 0L, 0L); RemoveList(bubble); choice = Say(BUSINESS_TXT, 0, MATT_PICTID, "GENERAL_OVERHOUL_QUEST"); if (choice == 0) tcRepairCar(car, "TotalRepair"); }
void PhysUpdate ( void ) { int iObject = 1; // Render all the actors in the scene int nbActors = gScene->getNbActors(); NxActor** actors = gScene->getActors(); while (nbActors--) { NxActor* actor = *actors++; // Get an OpenGL transform (float[16]) from a Novodex shape’s global pose // (NxMat34) NxShape* shape = NULL; NxMat34 pose = actor->getGlobalPose(); NxMat33 orient = pose.M; NxVec3 pos = pose.t; float glmat[16]; // 4x4 column major OpenGL matrix orient.getColumnMajorStride4(&(glmat[0])); pos.get(&(glmat[12])); // clear the elements we don't need: glmat[3] = glmat[7] = glmat[11] = 0.0f; glmat[15] = 1.0f; { sPhysObject* pPhys = ( sPhysObject* ) actor->userData; if ( pPhys ) { SetWorldMatrix ( pPhys->iID, ( D3DXMATRIX* ) &glmat ); sObject* pObject = dbGetObject ( pPhys->iID ); pObject->position.vecPosition = D3DXVECTOR3 ( glmat [ 12 ], glmat [ 13 ], glmat [ 14 ] ); } } } }
ubyte plSay(char *msg, U32 persId) { register LIST *l = txtGoKey(PLAN_TXT, msg); register ubyte choice; SetPictID(((Person) dbGetObject(OL_NR(GetNthNode(PersonsList, persId))))-> PictID); inpTurnESC(0); inpTurnFunctionKey(0); choice = Bubble(l, 0, NULL, 200); inpTurnFunctionKey(1); inpTurnESC(1); RemoveList(l); plDisplayTimer(0, 1); plDisplayInfo(); return choice; }
static U32 tcATraitor(U32 traitorId) { char name[TXT_KEY_LENGTH], line[TXT_KEY_LENGTH]; LIST *bubble = txtGoKey(BUSINESS_TXT, "A_TRAITOR"); LIST *newList = CreateList(); Person john = dbGetObject(Person_John_Gludo); dbGetObjectName(traitorId, name); sprintf(line, NODE_NAME(LIST_HEAD(bubble)), name); CreateNode(newList, 0L, line); CreateNode(newList, 0L, NODE_NAME(GetNthNode(bubble, 1))); CreateNode(newList, 0L, NODE_NAME(GetNthNode(bubble, 2))); SetPictID(john->PictID); Bubble(newList, 0, 0L, 0L); RemoveList(bubble); RemoveList(newList); Say(BUSINESS_TXT, 0, john->PictID, "ARRESTED"); return 1; /* gefangen! */ }
void lsShowAllConnections(U32 areaID, NODE * node, ubyte perc) { NODE *n; LSObject lso1, lso2; U32 relID = 0, col, destX, destY, srcX, srcY; U32 rasterXSize, rasterYSize, rasterSize; static ubyte Alarm_Power; lso1 = OL_DATA(node); rasterXSize = lsGetRasterXSize(areaID); rasterYSize = lsGetRasterYSize(areaID); rasterSize = min(rasterXSize, rasterYSize); switch (lso1->Type) { case Item_Alarmanlage_Z3: case Item_Alarmanlage_X3: case Item_Alarmanlage_Top: relID = hasAlarmRelationID; if (Alarm_Power & 1) lsShowRaster(areaID, perc); Alarm_Power |= 1; break; case Item_Steuerkasten: relID = hasPowerRelationID; if (Alarm_Power & 2) lsShowRaster(areaID, perc); Alarm_Power |= 2; break; default: break; } if (relID) { col = ((Item) dbGetObject(lso1->Type))->ColorNr; SetObjectListAttr(OLF_NORMAL, Object_LSObject); AskAll(lso1, relID, BuildObjectList); srcX = lso1->us_DestX + lso1->uch_ExactX + (lso1->uch_ExactX1 - lso1->uch_ExactX) / 2; srcY = lso1->us_DestY + lso1->uch_ExactY + (lso1->uch_ExactY1 - lso1->uch_ExactY) / 2; srcX = (srcX * rasterSize) / LS_RASTER_X_SIZE; srcY = (srcY * rasterSize) / LS_RASTER_Y_SIZE; for (n = (NODE *) LIST_HEAD(ObjectList); NODE_SUCC(n); n = (NODE *) NODE_SUCC(n)) { uword x0, y0, x1, y1; gfxSetPens(l_gc, col, GFX_SAME_PEN, GFX_SAME_PEN); lso2 = OL_DATA(n); lsCalcExactSize(lso2, &x0, &y0, &x1, &y1); destX = x0 + (x1 - x0) / 2; destY = y0 + (y1 - y0) / 2; destX = (destX * rasterSize) / LS_RASTER_X_SIZE; destY = (destY * rasterSize) / LS_RASTER_Y_SIZE; gfxMoveCursor(l_gc, srcX, srcY); gfxDraw(l_gc, destX, srcY); gfxDraw(l_gc, destX, destY); gfxSetPens(l_gc, 0, 0, col); gfxRectFill(l_gc, destX - 1, destY - 1, destX + 2, destY + 2); } } }
void PhysCreateStaticRigidBodyMesh ( int iObject ) { sObject* pObject = dbGetObject ( iObject ); if ( !pObject ) return; int iCount = 0; for ( int iMesh = 0; iMesh < pObject->iMeshCount; iMesh++ ) { NxVec3* pVertices = new NxVec3 [ pObject->ppMeshList [ iMesh ]->dwVertexCount ]; int iVertexCount = pObject->ppMeshList [ iMesh ]->dwVertexCount; int* iTriangles = new int [ pObject->ppMeshList [ iMesh ]->dwIndexCount ]; int iTriangleCount = pObject->ppMeshList [ iMesh ]->dwIndexCount; sOffsetMap offsetMap; GetFVFOffsetMap ( pObject->ppMeshList [ iMesh ], &offsetMap ); for ( int i = 0; i < iVertexCount; i++ ) { pVertices [ i ].x = *( ( float* ) pObject->ppMeshList [ iMesh ]->pVertexData + offsetMap.dwX + ( offsetMap.dwSize * i ) ); pVertices [ i ].y = *( ( float* ) pObject->ppMeshList [ iMesh ]->pVertexData + offsetMap.dwY + ( offsetMap.dwSize * i ) ); pVertices [ i ].z = *( ( float* ) pObject->ppMeshList [ iMesh ]->pVertexData + offsetMap.dwZ + ( offsetMap.dwSize * i ) ); } for ( i = 0; i < iTriangleCount; i++ ) iTriangles [ i ] = pObject->ppMeshList [ iMesh ]->pIndices [ i ]; NxTriangleMeshDesc levelDesc; levelDesc.numVertices = iVertexCount; levelDesc.numTriangles = iTriangleCount / 3; levelDesc.pointStrideBytes = sizeof ( NxVec3 ); levelDesc.triangleStrideBytes = 3 * sizeof ( int ); levelDesc.points = pVertices; levelDesc.triangles = iTriangles; levelDesc.flags = NX_CF_COMPUTE_CONVEX; NxTriangleMeshShapeDesc levelShapeDesc; NxInitCooking ( ); MemoryWriteBuffer buf; bool status = NxCookTriangleMesh ( levelDesc, buf ); if ( status ) { levelShapeDesc.meshData = gPhysicsSDK->createTriangleMesh ( MemoryReadBuffer ( buf.data ) ); NxActor* actor = NULL; NxActorDesc actorDesc; actorDesc.shapes.pushBack ( &levelShapeDesc ); actor = gScene->createActor ( actorDesc ); sPhysObject* pPhys = new sPhysObject; pPhys->iID = iObject; actor->userData = ( void* )pPhys; SetActorCollisionGroup ( actor, GROUP_COLLIDABLE_NON_PUSHABLE ); } } }
void tcBuyCar(void) { LIST *bubble = NULL; ubyte choice = 0, choice1 = 0; Car matts_car; Person marc = (Person) dbGetObject(Person_Marc_Smith); while ((choice1 != 2) && (choice != GET_OUT)) { ObjectListSuccString = tcShowPriceOfCar; ObjectListWidth = 48; hasAll(Person_Marc_Smith, OLF_ALIGNED | OLF_PRIVATE_LIST | OLF_INCLUDE_NAME | OLF_INSERT_STAR | OLF_ADD_SUCC_STRING, Object_Car); bubble = ObjectListPrivate; ObjectListSuccString = NULL; ObjectListWidth = 0; if (!(LIST_EMPTY(bubble))) { char exp[TXT_KEY_LENGTH]; txtGetFirstLine(BUSINESS_TXT, "THANKS", exp); ExpandObjectList(bubble, exp); ShowMenuBackground(); if (ChoiceOk(choice = Bubble(bubble, 0, 0L, 0L), GET_OUT, bubble)) { matts_car = (Car) dbGetObject(((struct ObjectNode *) GetNthNode(bubble, (U32) choice))->nr); SetCarColors((ubyte) matts_car->ColorIndex); gfxShow((uword) matts_car->PictID, GFX_NO_REFRESH | GFX_OVERLAY, 0L, -1L, -1L); if (Present (((struct ObjectNode *) GetNthNode(bubble, (U32) choice))-> nr, "Car", InitCarPresent)) { choice1 = Say(BUSINESS_TXT, 0, MATT_PICTID, "AUTOKAUF"); AddVTime(7); if (choice1 == 1) { U32 price = tcGetCarPrice(matts_car); if (tcSpendMoney(price, 0)) { U32 carID = ((struct ObjectNode *) GetNthNode(bubble, (U32) choice))->nr; hasSet(Person_Matt_Stuvysunt, carID); hasUnSet(Person_Marc_Smith, carID); Say(BUSINESS_TXT, 0, marc->PictID, "GOOD CAR"); } if (Say(BUSINESS_TXT, 0, MATT_PICTID, "NACH_AUTOKAUF") == 1) choice1 = 2; } } gfxShow(27, GFX_NO_REFRESH | GFX_ONE_STEP, 0L, -1L, -1L); } else choice = GET_OUT; } else { Say(BUSINESS_TXT, 0, marc->PictID, "NO_CAR"); choice = GET_OUT; } RemoveList(bubble); } }
void tcRepairCar(Car car, char *repairWhat) { LIST *presentationData = CreateList(); LIST *list = NULL; ubyte *item = NULL, type = 7, ready = 0; bool enough = true; U32 costs = 0, choice = 0L, totalCosts = 0L; uword line = 0; Person marc = (Person) dbGetObject(Person_Marc_Smith); if (strcmp(repairWhat, "MotorRepair") == 0) { item = &car->MotorState; costs = tcCostsPerEngineRepair(car); type = 1; } else { if (strcmp(repairWhat, "BodyRepair") == 0) { item = &car->BodyWorkState; costs = tcCostsPerBodyRepair(car); type = 2; } else { if (strcmp(repairWhat, "TyreRepair") == 0) { item = &car->TyreState; costs = tcCostsPerTyreRepair(car); type = 4; } else costs = tcCostsPerTotalRepair(car); } } if (!(enough = tcSpendMoney(costs, 0))) return; list = txtGoKey(PRESENT_TXT, repairWhat); gfxPrepareRefresh(); gfxShow((uword) BIG_SHEET, GFX_NO_REFRESH | GFX_OVERLAY, 0L, -1L, -1L); inpSetWaitTicks(3L); PlayAnim("Reperatur", 30000, GFX_DONT_SHOW_FIRST_PIC); while (!(choice & INP_LBUTTONP) && enough && (!ready)) { line = 0; AddVTime(3); AddPresentTextLine(presentationData, NULL, 0L, list, line++); if (item) AddPresentLine(presentationData, PRESENT_AS_BAR, (U32) (*item), 255L, list, line++); AddPresentLine(presentationData, PRESENT_AS_BAR, (U32) (car->State), 255L, list, line++); AddPresentLine(presentationData, PRESENT_AS_NUMBER, totalCosts, 0L, list, line++); AddPresentLine(presentationData, PRESENT_AS_NUMBER, (U32) tcGetPlayerMoney, 0L, list, line++); DrawPresent(presentationData, 0, u_gc, (ubyte) GetNrOfNodes(presentationData)); RemoveNode(presentationData, NULL); choice = inpWaitFor(INP_LBUTTONP | INP_TIME); if (choice & INP_TIME) { if ((enough = tcSpendMoney(costs, 1))) { totalCosts += costs; if (type & 1) tcSetCarMotorState(car, 1); if (type & 2) tcSetCarBodyState(car, 1); if (type & 4) tcSetCarTyreState(car, 1); } } if (item) { if ((*item) == 255) { StopAnim(); gfxRefresh(); Say(BUSINESS_TXT, 0, marc->PictID, "REP_READY"); ready = 1; } } else { if (tcGetCarTotalState(car) > 253) { StopAnim(); gfxRefresh(); Say(BUSINESS_TXT, 0, marc->PictID, "REP_READY"); ready = 1; } } } if (!ready) { StopAnim(); gfxRefresh(); } inpSetWaitTicks(0L); /*gfxShow(26,GFX_NO_REFRESH|GFX_ONE_STEP,0L,-1L,-1L);*/ /*gfxShow((uword)car->PictID,GFX_NO_REFRESH|GFX_OVERLAY,1L,-1L,-1L);*/ RemoveList(presentationData); RemoveList(list); }
static void SetFullEnviroment(void) { hasSetP(Person_Matt_Stuvysunt, Ability_Elektronik, 251); hasSetP(Person_Matt_Stuvysunt, Ability_Schloesser, 210); hasSetP(Person_Matt_Stuvysunt, Ability_Aufpassen, 180); hasSetP(Person_Matt_Stuvysunt, Ability_Schloesser, 180); hasSetP(Person_Marc_Smith, Ability_Autos, 255); hasSetP(Person_Mohammed_Abdula, Ability_Kampf, 255); /* Matt has all cars */ hasSet(Person_Matt_Stuvysunt, Car_Triumph_Roadstar_1947); hasSet(Person_Matt_Stuvysunt, Car_Triumph_Roadstar_1949); hasSet(Person_Matt_Stuvysunt, Car_Cadillac_Club_1952); hasSet(Person_Matt_Stuvysunt, Car_Opel_Olympia_1953); hasSet(Person_Matt_Stuvysunt, Car_Standard_Vanguard_1950); hasSet(Person_Matt_Stuvysunt, Car_Standard_Vanguard_1951); hasSet(Person_Matt_Stuvysunt, Car_Standard_Vanguard_1953); hasSet(Person_Matt_Stuvysunt, Car_Jaguar_XK_1950); hasSet(Person_Matt_Stuvysunt, Car_Pontiac_Streamliner_1944); hasSet(Person_Matt_Stuvysunt, Car_Pontiac_Streamliner_1946); hasSet(Person_Matt_Stuvysunt, Car_Pontiac_Streamliner_1949); hasSet(Person_Matt_Stuvysunt, Car_Fiat_Topolino_1936); hasSet(Person_Matt_Stuvysunt, Car_Fiat_Topolino_1940); hasSet(Person_Matt_Stuvysunt, Car_Fiat_Topolino_1942); hasSet(Person_Matt_Stuvysunt, Car_Morris_Minor_1948); hasSet(Person_Matt_Stuvysunt, Car_Morris_Minor_1950); hasSet(Person_Matt_Stuvysunt, Car_Morris_Minor_1953); /* Matt has all tools Removed : Hand, Fuss, Stechkarte */ hasSet(Person_Matt_Stuvysunt, Tool_Dietrich); hasSet(Person_Matt_Stuvysunt, Tool_Hammer); hasSet(Person_Matt_Stuvysunt, Tool_Axt); hasSet(Person_Matt_Stuvysunt, Tool_Kernbohrer); hasSet(Person_Matt_Stuvysunt, Tool_Handschuhe); hasSet(Person_Matt_Stuvysunt, Tool_Schuhe); hasSet(Person_Matt_Stuvysunt, Tool_Maske); hasSet(Person_Matt_Stuvysunt, Tool_Chloroform); hasSet(Person_Matt_Stuvysunt, Tool_Brecheisen); hasSet(Person_Matt_Stuvysunt, Tool_Winkelschleifer); hasSet(Person_Matt_Stuvysunt, Tool_Bohrmaschine); hasSet(Person_Matt_Stuvysunt, Tool_Bohrwinde); hasSet(Person_Matt_Stuvysunt, Tool_Schloszstecher); hasSet(Person_Matt_Stuvysunt, Tool_Schneidbrenner); hasSet(Person_Matt_Stuvysunt, Tool_Sauerstofflanze); hasSet(Person_Matt_Stuvysunt, Tool_Stethoskop); hasSet(Person_Matt_Stuvysunt, Tool_Batterie); hasSet(Person_Matt_Stuvysunt, Tool_Stromgenerator); hasSet(Person_Matt_Stuvysunt, Tool_Elektroset); hasSet(Person_Matt_Stuvysunt, Tool_Schutzanzug); hasSet(Person_Matt_Stuvysunt, Tool_Dynamit); hasSet(Person_Matt_Stuvysunt, Tool_Elektrohammer); hasSet(Person_Matt_Stuvysunt, Tool_Glasschneider); hasSet(Person_Matt_Stuvysunt, Tool_Strickleiter); hasSet(Person_Matt_Stuvysunt, Tool_Funkgeraet); /* Matt has asked all Persons for a job Removed : Old Matt, Matt Stuvysunt, John Gludo, Miles Chickenwing, Sabien Pardo, Red Stanson */ joinSet(Person_Matt_Stuvysunt, Person_Paul_O_Conner); joinSet(Person_Matt_Stuvysunt, Person_Marc_Smith); joinSet(Person_Matt_Stuvysunt, Person_Frank_Meier); joinSet(Person_Matt_Stuvysunt, Person_Herbert_Briggs); joinSet(Person_Matt_Stuvysunt, Person_Tony_Allen); joinSet(Person_Matt_Stuvysunt, Person_Margret_Allen); joinSet(Person_Matt_Stuvysunt, Person_Mathew_Black); joinSet(Person_Matt_Stuvysunt, Person_Miguel_Garcia); joinSet(Person_Matt_Stuvysunt, Person_Mike_Seeger); joinSet(Person_Matt_Stuvysunt, Person_Albert_Liet); joinSet(Person_Matt_Stuvysunt, Person_Mohammed_Abdula); joinSet(Person_Matt_Stuvysunt, Person_Serge_Fontane); joinSet(Person_Matt_Stuvysunt, Person_Frank_Maloya); joinSet(Person_Matt_Stuvysunt, Person_Neil_Grey); joinSet(Person_Matt_Stuvysunt, Person_Mark_Hart); joinSet(Person_Matt_Stuvysunt, Person_Jim_Danner); joinSet(Person_Matt_Stuvysunt, Person_Robert_Bull); joinSet(Person_Matt_Stuvysunt, Person_Thomas_Groul); joinSet(Person_Matt_Stuvysunt, Person_Helen_Parker); joinSet(Person_Matt_Stuvysunt, Person_Dan_Stanford); joinSet(Person_Matt_Stuvysunt, Person_Mary_Bolton); joinSet(Person_Matt_Stuvysunt, Person_Eric_Pooly); joinSet(Person_Matt_Stuvysunt, Person_Prof_Emil_Schmitt); joinSet(Person_Matt_Stuvysunt, Person_Elisabeth_Schmitt); joinSet(Person_Matt_Stuvysunt, Person_Margrete_Briggs); joinSet(Person_Matt_Stuvysunt, Person_Peter_Brook); joinSet(Person_Matt_Stuvysunt, Person_Samuel_Rosenblatt); joinSet(Person_Matt_Stuvysunt, Person_Lucas_Grull); joinSet(Person_Matt_Stuvysunt, Person_Ken_Addison); joinSet(Person_Matt_Stuvysunt, Person_Jiri_Poulin); joinSet(Person_Matt_Stuvysunt, Person_Garry_Stevenson); joinSet(Person_Matt_Stuvysunt, Person_Al_Mel); joinSet(Person_Matt_Stuvysunt, Person_Jack_Motart); joinSet(Person_Matt_Stuvysunt, Person_Kevin_Smith); joinSet(Person_Matt_Stuvysunt, Person_Mike_Kahn); joinSet(Person_Matt_Stuvysunt, Person_Frank_De_Silva); joinSet(Person_Matt_Stuvysunt, Person_Justin_White); joinSet(Person_Matt_Stuvysunt, Person_John_O_Keef); joinSet(Person_Matt_Stuvysunt, Person_Luthmilla_Nervesaw); joinSet(Person_Matt_Stuvysunt, Person_Thomas_Smith); joinSet(Person_Matt_Stuvysunt, Person_Ben_Riggley); joinSet(Person_Matt_Stuvysunt, Person_Richard_Doil); joinSet(Person_Matt_Stuvysunt, Person_Pater_James); /* Matt has investigated all buildings */ hasSet(Person_Matt_Stuvysunt, Building_Kiosk); ((Building) dbGetObject(Building_Kiosk))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Tante_Emma_Laden); ((Building) dbGetObject(Building_Tante_Emma_Laden))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Juwelier); ((Building) dbGetObject(Building_Juwelier))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Old_Curiosity_Shop); ((Building) dbGetObject(Building_Old_Curiosity_Shop))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Pink_Villa); ((Building) dbGetObject(Building_Pink_Villa))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Seniorenheim); ((Building) dbGetObject(Building_Seniorenheim))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Grab_von_Karl_Marx); ((Building) dbGetObject(Building_Grab_von_Karl_Marx))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Villa); ((Building) dbGetObject(Building_Villa))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Kenwood_House); ((Building) dbGetObject(Building_Kenwood_House))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Ham_House); ((Building) dbGetObject(Building_Ham_House))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Osterly_Park_House); ((Building) dbGetObject(Building_Osterly_Park_House))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Chiswick_House); ((Building) dbGetObject(Building_Chiswick_House))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Suterbys); ((Building) dbGetObject(Building_Suterbys))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_British_Museum); ((Building) dbGetObject(Building_British_Museum))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Natural_Museum); ((Building) dbGetObject(Building_Natural_Museum))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_National_Galery); ((Building) dbGetObject(Building_National_Galery))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Victoria_und_Albert_Museum); ((Building) dbGetObject(Building_Victoria_und_Albert_Museum))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Bank_of_England); ((Building) dbGetObject(Building_Bank_of_England))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Tower_of_London); ((Building) dbGetObject(Building_Tower_of_London))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Starford_Kaserne); ((Building) dbGetObject(Building_Starford_Kaserne))->Exactlyness = 255; if (setup.Profidisk) { hasSet(Person_Matt_Stuvysunt, Car_Rover_75_1949); hasSet(Person_Matt_Stuvysunt, Car_Rover_75_1950); hasSet(Person_Matt_Stuvysunt, Car_Rover_75_1952); hasSet(Person_Matt_Stuvysunt, Car_Ford_Model_T__1926); hasSet(Person_Matt_Stuvysunt, Car_Bentley_Continental_Typ_R_1952); hasSet(Person_Matt_Stuvysunt, Car_Bentley_Continental_Typ_R_1953); hasSet(Person_Matt_Stuvysunt, Car_Fiat_634_N_1936); hasSet(Person_Matt_Stuvysunt, Car_Fiat_634_N_1943); joinSet(Person_Matt_Stuvysunt, Person_Tom_Cooler); joinSet(Person_Matt_Stuvysunt, Person_Sid_Palmer); joinSet(Person_Matt_Stuvysunt, Person_Dean_Esters); joinSet(Person_Matt_Stuvysunt, Person_Prof_Marcus_Green); joinSet(Person_Matt_Stuvysunt, Person_Melanie_Morgan); joinSet(Person_Matt_Stuvysunt, Person_Rosi_Lambert); joinSet(Person_Matt_Stuvysunt, Person_Rod_Masterson); joinSet(Person_Matt_Stuvysunt, Person_Tina_Olavson); joinSet(Person_Matt_Stuvysunt, Person_Phil_Ciggy); joinSet(Person_Matt_Stuvysunt, Person_Pere_Ubu); hasSet(Person_Matt_Stuvysunt, Building_Baker_Street); ((Building) dbGetObject(Building_Baker_Street))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Madame_Tussaud); ((Building) dbGetObject(Building_Madame_Tussaud))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Westminster_Abbey); ((Building) dbGetObject(Building_Westminster_Abbey))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Downing_Street_10); ((Building) dbGetObject(Building_Downing_Street_10))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Postzug); ((Building) dbGetObject(Building_Postzug))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Tate_Gallery); ((Building) dbGetObject(Building_Tate_Gallery))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Buckingham_Palace); ((Building) dbGetObject(Building_Buckingham_Palace))->Exactlyness = 255; hasSet(Person_Matt_Stuvysunt, Building_Bulstrode_Chemestry_Ltd); ((Building) dbGetObject(Building_Bulstrode_Chemestry_Ltd))->Exactlyness = 255; } }
S32 tcCalcCarEscape(S32 timeLeft) { ubyte kmhWeight[4] = { 32, 44, 60, 67 }; ubyte psWeight[4] = { 68, 56, 40, 33 }; ubyte driverWeight[4] = { 50, 40, 25, 20 }; ubyte policeSpeed[4] = { 90, 95, 103, 107 } , paint; char line[TXT_KEY_LENGTH]; S32 kmh, ps, i, j, YardsInFront, length, wayType, unrealSpeed, x, xOldMatt = -1, xOldPoli = -1; Car car = dbGetObject(Organisation.CarID); Building build = dbGetObject(Organisation.BuildingID); S32 result = FAHN_ESCAPED; U8 palette[GFX_PALETTE_SIZE]; if ((Organisation.BuildingID != Building_Tower_of_London) && (Organisation.BuildingID != Building_Starford_Kaserne)) { wayType = build->EscapeRoute; length = build->EscapeRouteLength; kmh = car->Speed; ps = car->PS; /* Motor : pro 10% Schaden -> 5% Leistung weniger */ kmh = CalcValue(kmh, 0, 65535L, (car->MotorState) / 2, 50); ps = CalcValue(ps, 0, 65535L, (car->MotorState) / 2, 50); /* pro Jahr 3% weniger */ i = (car->Speed * 3 * (tcRGetCarAge(car) + 1)) / 100; j = (car->PS * 3 * (tcRGetCarAge(car) + 1)) / 100; if (kmh >= i) kmh -= i; else kmh = 0; if (ps >= j) ps -= j; else ps = 0; /* Reifen pro 10% um 2% weniger */ i = (car->Speed * 2 * (255 - car->TyreState)) / 2500; j = (car->Speed * 2 * (255 - car->PS)) / 2500; if (kmh >= i) kmh -= i; else kmh = 0; if (ps >= j) ps -= j; else ps = 0; /* Fahrer */ /* kann aus einem Auto um ein Viertel mehr herausholen, als eigentlich */ /* drinnen ist! */ i = hasGet(Organisation.DriverID, Ability_Autos); kmh = CalcValue(kmh, 0, car->Speed + car->Speed / 4, i, driverWeight[wayType]); ps = CalcValue(ps, 0, car->PS + car->PS / 4, i, driverWeight[wayType]); /* Ma�zahl f�r Geschwindigkeit */ /* Einheit = m pro Schleifendurchlauf */ unrealSpeed = (kmh * kmhWeight[wayType] + ps * psWeight[wayType]) / 100; unrealSpeed = unrealSpeed + 5 - (S32) (CalcRandomNr(0, 10)); if (unrealSpeed <= 0) unrealSpeed = 5; policeSpeed[wayType] = policeSpeed[wayType] + 5 - CalcRandomNr(0, 10); policeSpeed[wayType] = CalcValue(policeSpeed[wayType], 0, 255, build->GRate, 25); /* Vorsprung berechnen */ /* Vorsprung ist maximal die halbe Strecke (length * 500 m) und */ /* mindestens 2000 Meter (damit man von der Fluct etwas sieht!) */ i = min(((unrealSpeed * timeLeft) / 5), length * 500); i = max(2000, i); /* mindestens 2000 Meter */ j = 0; length *= 1000; /* Fluchtweg in Meter */ /* Bildschirmdarstellung */ txtGetFirstLine(BUSINESS_TXT, "FLUCHT", line); ShowMenuBackground(); PrintStatus(line); gfxChangeColors(l_gc, 0, GFX_FADE_OUT, 0); gfxShow(car->PictID, GFX_NO_REFRESH | GFX_ONE_STEP, 0, -1, -1); gfxPrepareColl(GFX_COLL_PARKING); gfxGetPalette(GFX_COLL_PARKING, palette); gfxChangeColors(l_gc, 0, GFX_BLEND_UP, palette); SetCarColors(car->ColorIndex); gfxSetPens(l_gc, 20, GFX_SAME_PEN, 21); gfxRectFill(l_gc, 60, 40, 60 + 199, 40 + 19); i = max(i, 60); j = max(j, 5); sndPrepareFX("flucht.voc"); sndPlayFX(); do { i += unrealSpeed; /* KmH von Matt */ i = max(i, 0); paint = 0; if (Search.TimeOfAlarm) j += policeSpeed[wayType]; YardsInFront = i - j; /* zum Vorsprung addieren */ /* Berechnung der Darstellung */ x = (i * 190) / length; /* Matts Car */ if (x != xOldMatt) { if (xOldMatt != -1) { gfxSetPens(l_gc, 20, GFX_SAME_PEN, 20); if ((195 - x + 1) < (198 + 195 - xOldMatt)) gfxRectFill(l_gc, 60 + 195 - xOldMatt, 45, 60 + 198 - xOldMatt, 55); } gfxSetPens(l_gc, 11, GFX_SAME_PEN, 11); gfxRectFill(l_gc, 60 + 195 - x, 45, 60 + 198 - x, 55); xOldMatt = x; paint = 1; } if (Search.TimeOfAlarm) { /* Police Car */ x = (j * 190) / length; if (x != xOldPoli) { if (xOldPoli != -1) { gfxSetPens(l_gc, 20, GFX_SAME_PEN, 20); gfxRectFill(l_gc, 60 + 195 - xOldPoli, 45, 60 + 198 - xOldPoli, 55); } gfxSetPens(l_gc, 23, GFX_SAME_PEN, 23); gfxRectFill(l_gc, 60 + 195 - x, 45, 60 + 198 - x, 55); paint = 1; } xOldPoli = x; } if (paint) inpDelay(3); } while ((i < length) && (YardsInFront > 50)); if (YardsInFront > 50) result = FAHN_ESCAPED; else result = FAHN_NOT_ESCAPED; } return result; }
S32 tcEscapeByCar(U32 escBits, S32 timeLeft) { Person gludo = dbGetObject(Person_John_Gludo); Person miles = dbGetObject(Person_Miles_Chickenwing); ubyte escapeSucc; if (timeLeft > 0) escapeSucc = FAHN_ESCAPED; else escapeSucc = FAHN_NOT_ESCAPED; /* Flucht per Auto! */ if (escapeSucc == FAHN_ESCAPED) { if ((Search.BuildingId != Building_Tower_of_London) && (Search.BuildingId != Building_Starford_Kaserne)) escapeSucc = tcCalcCarEscape(timeLeft); } else tcMattGoesTo(7); /* Polizei */ /* Ausgabe : Flucht gelungen, Flucht nicht gelungen */ if (escapeSucc == FAHN_ESCAPED) { if ((escBits & FAHN_ALARM) || (escBits & FAHN_QUIET_ALARM)) { Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_0"); /* entkommen! */ Say(BUSINESS_TXT, 0, miles->PictID, "HINWEIS_2"); /* woher Hinweis? */ } else Say(BUSINESS_TXT, 0, OLD_MATT_PICTID, "I_ESCAPED"); /* no problems */ } else { Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_1"); /* geschnappt! */ Say(BUSINESS_TXT, 0, miles->PictID, "HINWEIS_2"); /* woher Hinweis? */ } /* Gludo erz�hlt woher Hinweise stammten (falls es welche gibt) */ if (escBits & FAHN_ALARM) { if (escBits & FAHN_ALARM_ALARM) Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_6"); /* Alarmanlage */ if (escBits & FAHN_ALARM_POWER) Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_8"); if (escBits & FAHN_ALARM_TIMER) Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_6"); /* Alarmanlage */ if (escBits & FAHN_ALARM_MICRO) Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_9"); if (escBits & FAHN_ALARM_TIMECLOCK) Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_7"); /* Alarmanlage */ if (escBits & FAHN_ALARM_GUARD) Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_10"); } else { if (escBits & FAHN_QUIET_ALARM) { if (escBits & FAHN_ALARM_RADIO) Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_5"); if (escBits & FAHN_ALARM_PATRO) Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_4"); if (escBits & FAHN_ALARM_LOUDN) Say(BUSINESS_TXT, 0, gludo->PictID, "HINWEIS_3"); } } if (escapeSucc != FAHN_ESCAPED) StopAnim(); return ((S32) escapeSucc); }
U32 tcStartEvidence(void) { S32 MyEvidence[4][7], guarded, radio; U32 totalEvidence[7], i, j, shownEvidence[4], Recognition[4], caught = 0; ubyte guyReady, guyNr, evidenceNr, guyCount, shown = 0; char line[TXT_KEY_LENGTH]; Person p[4]; Evidence evidence = dbGetObject(Evidence_Evidence_1); /* just for presentation */ struct ObjectNode *n; LIST *guys, *spuren; if ((!(Search.EscapeBits & FAHN_ALARM)) && (!(Search.EscapeBits & FAHN_QUIET_ALARM))) Say(BUSINESS_TXT, 0, ((Person) dbGetObject(Person_John_Gludo))->PictID, "A_BURGLARY_SIR"); Say(BUSINESS_TXT, 0, ((Person) dbGetObject(Person_Miles_Chickenwing))->PictID, "START_EVIDENCE"); joined_byAll(Person_Matt_Stuvysunt, OLF_PRIVATE_LIST, Object_Person); guys = ObjectListPrivate; dbSortObjectList(&guys, dbStdCompareObjects); guyCount = (ubyte) GetNrOfNodes(guys); spuren = txtGoKey(BUSINESS_TXT, "SPUREN"); p[0] = p[1] = p[2] = p[3] = NULL; guarded = ChangeAbs(((Building) dbGetObject(Search.BuildingId))->GRate, ((Building) dbGetObject(Search.BuildingId))->Strike / 7, 0, 255); radio = (S32) ((Building) dbGetObject(Search.BuildingId))->RadioGuarding; for (n = (struct ObjectNode *) LIST_HEAD(guys), i = 0; NODE_SUCC(n); n = (struct ObjectNode *) NODE_SUCC(n), i++) { S32 div = 380; p[i] = OL_DATA(n); /* alle folgenden Werte sind zwischen 0 und 255 */ /* statt durch 765 zu dividieren wurde urspr�nglich durch 255 dividiert -> */ /* viel zu gro�e Werte */ if (Search.SpotTouchCount[i]) div = 1; MyEvidence[i][0] = (((tcGetTrail(p[i], 0) * (S32) Search.WalkTime[i] * (max(1, 255 - guarded))) / ((S32) Search.TimeOfBurglary + 1))) / div; MyEvidence[i][1] = (((tcGetTrail(p[i], 1) * (S32) Search.WaitTime[i] * (max(1, 255 - guarded))) / ((S32) Search.TimeOfBurglary + 1))) / div; MyEvidence[i][2] = (((tcGetTrail(p[i], 2) * (S32) Search.WorkTime[i] * (max(1, 255 - guarded))) / ((S32) Search.TimeOfBurglary + 1))) / div; MyEvidence[i][3] = (((tcGetTrail(p[i], 3) * (S32) Search.KillTime[i] * (max(1, 255 - guarded))) / ((S32) Search.TimeOfBurglary + 1))); MyEvidence[i][4] = ChangeAbs(0, (S32) Search.CallCount * (S32) radio / 5, 0, 255); MyEvidence[i][5] = (p[i]->KnownToPolice * (max(1, guarded))) / (div * 3); MyEvidence[i][6] = ChangeAbs(0, (S32) CalcRandomNr(200, 255) * (S32) Search.SpotTouchCount[i], 0, 255); for (j = 0; j < 7; j++) /* jeden Betrag != 0 AUFRUNDEN auf 1% ! */ if (MyEvidence[i][j]) MyEvidence[i][j] = max(MyEvidence[i][j], 5); if (has(Person_Matt_Stuvysunt, Tool_Maske)) MyEvidence[i][6] = (MyEvidence[i][6] * 2) / 3; /* im Fluchtfall viele Gehspuren! */ if (Search.EscapeBits & FAHN_ESCAPE) MyEvidence[i][0] = CalcValue(MyEvidence[i][0], CalcRandomNr(80, 120), 255, 255, 50); totalEvidence[i] = MyEvidence[i][0] + MyEvidence[i][1] + MyEvidence[i][2] + MyEvidence[i][3] + MyEvidence[i][4] + MyEvidence[i][5] + MyEvidence[i][6]; shownEvidence[i] = Recognition[i] = 0; tcPersonLearns(OL_NR(n)); } prSetBarPrefs(m_gc, 300, 12, 1, 3, 0); guyReady = 0; txtGetFirstLine(BUSINESS_TXT, "FAHNDUNG", line); while (guyReady != ((1 << guyCount) - 1)) { if (shown) { ShowTime(0); inpDelay(35L); AddVTime(CalcRandomNr(1, 11)); shown = 0; } guyNr = CalcRandomNr(0, guyCount); /* wer ist den noch nicht fertig? */ while ((1 << guyNr) & guyReady) guyNr = (guyNr + 1) % guyCount; /* bei folgendem CalcRandomNr darf nicht 4 - guyCount stehe, sonst * Division durch 0! */ /* zuf�llig eine Spurenart ausw�hlen */ evidenceNr = CalcRandomNr(0, 7); /* wenn diese Spurenart schon angzeigt wurde, eine freie * Spur suchen */ j = 0; while (((1 << evidenceNr) & shownEvidence[guyNr]) && (j++ < 7)) evidenceNr = (evidenceNr + 1) % 7; if (j < 8) { /* 8 stimmt! -> ober wird anschlie�end noch erh�ht */ shownEvidence[guyNr] |= (1 << evidenceNr); if (MyEvidence[guyNr][evidenceNr] > 0) { ShowMenuBackground(); PrintStatus(NODE_NAME(GetNthNode(spuren, evidenceNr))); Recognition[guyNr] += MyEvidence[guyNr][evidenceNr]; evidence->Recognition = Recognition[guyNr] / 3; /* change also: totalEvidence /= 3.... */ evidence->pers = (U32) OL_NR(GetNthNode(guys, (U32) guyNr)); /* f�r alle "Evidences" - stimmt so, da f�r alle */ /* Personen die selbe Evidence Struct benutzt wird -> */ /* bestimmte Werte sind von vorher gesetzt und m�ssen gel�scht */ /* werden */ evidence->WalkTrail = 0; evidence->WaitTrail = 0; evidence->WorkTrail = 0; evidence->KillTrail = 0; evidence->CallTrail = 0; evidence->PaperTrail = 0; evidence->FotoTrail = 0; if (shownEvidence[guyNr] & 1) evidence->WalkTrail = MyEvidence[guyNr][0]; if (shownEvidence[guyNr] & 2) evidence->WaitTrail = MyEvidence[guyNr][1]; if (shownEvidence[guyNr] & 4) evidence->WorkTrail = MyEvidence[guyNr][2]; if (shownEvidence[guyNr] & 8) evidence->KillTrail = MyEvidence[guyNr][3]; if (shownEvidence[guyNr] & 16) evidence->CallTrail = MyEvidence[guyNr][4]; if (shownEvidence[guyNr] & 32) evidence->PaperTrail = MyEvidence[guyNr][5]; if (shownEvidence[guyNr] & 64) evidence->FotoTrail = MyEvidence[guyNr][6]; Present(Evidence_Evidence_1, "Fahndung", InitEvidencePresent); ShowMenuBackground(); PrintStatus(line); shown = 1; } } if (shownEvidence[guyNr] == ((1 << 7) - 1)) guyReady |= (1 << guyNr); } guyReady = 0; /* ein gewisses Restwissen bleibt der Polizei ! */ for (i = 0; i < guyCount; i++) { totalEvidence[i] /= 3; /* change als in recognition = ... */ if (p[i] != 0) { if (totalEvidence[i] > 255) totalEvidence[i] = 255; p[i]->KnownToPolice = (ubyte) (totalEvidence[i]); if (p[i]->KnownToPolice > tcPERSON_IS_ARRESTED) caught |= tcPersonWanted(OL_NR(GetNthNode(guys, i))); if (!caught) if (p[i] == dbGetObject(Person_Robert_Bull)) caught |= tcATraitor(Person_Robert_Bull); if (!caught) if (p[i] == dbGetObject(Person_Marc_Smith)) caught |= tcATraitor(Person_Marc_Smith); if (setup.Profidisk) { if (!caught) if (p[i] == dbGetObject(Person_Phil_Ciggy)) caught |= tcATraitor(Person_Phil_Ciggy); } } } caught |= tcIsThereATraitor(); if (! (tcCarFound ((Car) dbGetObject(Organisation.CarID), Search.TimeOfBurglary - Search.TimeOfAlarm))) { S32 newStrike; Car car = dbGetObject(Organisation.CarID); newStrike = CalcValue((S32) car->Strike, 0, 255, 255, 15); if (newStrike < (car->Strike + 40)) newStrike = ChangeAbs((S32) car->Strike, 40, 0, 255); car->Strike = newStrike; } ((Player) dbGetObject(Player_Player_1))->MattsPart = (ubyte) tcCalcMattsPart(); tcForgetGuys(); RemoveList(spuren); RemoveList(guys); return caught; }
U32 ShowTheClouRequester(S32 error_class) { LIST *menu; U32 answer = 0; ubyte choices; Player player = dbGetObject(Player_Player_1); inpTurnESC(0); ShowMenuBackground(); switch (error_class) { case No_Error: ShowMenuBackground(); menu = txtGoKey(MENU_TXT, "ESCMenu_STD"); inpTurnFunctionKey(0); if (GamePlayMode & GP_DEMO) choices = Menu(menu, 3, 0, NULL, 0); else choices = Menu(menu, 15, 0, NULL, 0); inpTurnFunctionKey(1); switch (choices) { case 0: /* continue playing */ player->CurrScene = 0; ShowMenuBackground(); tcRefreshLocationInTitle(GetLocation); break; case 1: player->CurrScene = SCENE_THE_END; ShowMenuBackground(); break; case 2: tcSaveTheClou(); player->CurrScene = 0; ShowMenuBackground(); tcRefreshLocationInTitle(GetLocation); break; case 3: /* load */ tcLoadTheClou(); ShowMenuBackground(); break; default: break; } RemoveList(menu); break; case Internal_Error: PrintStatus("Gravierender Fehler !"); inpWaitFor(INP_LBUTTONP); ShowMenuBackground(); break; case No_Mem: PrintStatus("Speichermangel !! - No Memory !!"); inpWaitFor(INP_LBUTTONP); ShowMenuBackground(); break; case Disk_Defect: PrintStatus("Disk Defekt !"); inpWaitFor(INP_LBUTTONP); ShowMenuBackground(); break; } inpTurnESC(1); return (answer); }
NxActor* CreateCar(const NxVec3& pos) { // Create body NxBodyDesc bodyDesc; NxBoxShapeDesc boxDesc; NxCapsuleShapeDesc capsuleDesc[4]; NxActorDesc actorDesc; bodyDesc.mass = carMass; const NxReal height = 0.3; const NxReal width = 2; const NxReal length = 4; //boxDesc.dimensions.set(length*0.65, height*0.85, width*0.65); //actorDesc.shapes.pushBack(&boxDesc); { sObject* pObject = dbGetObject ( 5 ); float fXPos = pObject->position.vecPosition.x; float fYPos = pObject->position.vecPosition.y; float fZPos = pObject->position.vecPosition.z; float fXSize = ( pObject->collision.vecMax.x - pObject->collision.vecMin.x ) * pObject->position.vecScale.x; float fYSize = ( pObject->collision.vecMax.y - pObject->collision.vecMin.y ) * pObject->position.vecScale.y; float fZSize = ( pObject->collision.vecMax.z - pObject->collision.vecMin.z ) * pObject->position.vecScale.z; boxDesc.dimensions.set ( fXSize / 2, fYSize / 2, fZSize / 2 ); boxDesc.localPose.t = NxVec3 ( pObject->collision.vecCentre.x, pObject->collision.vecCentre.y, pObject->collision.vecCentre.z ); //boxDesc.localPose. actorDesc.shapes.pushBack ( &boxDesc ); } capsuleDesc[0].radius = 0.1; capsuleDesc[0].height = 1; capsuleDesc[0].flags = NX_SWEPT_SHAPE; capsuleDesc[0].localPose.M.setColumn(1, NxVec3(0,-1, 0)); capsuleDesc[0].localPose.M.setColumn(2, NxVec3(0, 0,-1)); //rotate 180 degrees around x axis to cast downward! capsuleDesc[0].localPose.t.set(length*0.5, -height, width*0.5); capsuleDesc[0].materialIndex = raycastWheelMaterialIndex; capsuleDesc[0].userData = &(wheelUserDatas[0]); actorDesc.shapes.pushBack(&capsuleDesc[0]); wheelUserDatas[0].frontWheel = true; capsuleDesc[1].radius = capsuleDesc[0].radius; capsuleDesc[1].height = capsuleDesc[0].height; capsuleDesc[1].flags = capsuleDesc[0].flags; capsuleDesc[1].localPose.M = capsuleDesc[0].localPose.M; capsuleDesc[1].localPose.t.set(length*0.5, -height, -width*0.5); capsuleDesc[1].materialIndex = raycastWheelMaterialIndex; capsuleDesc[1].userData = &(wheelUserDatas[1]); actorDesc.shapes.pushBack(&capsuleDesc[1]); wheelUserDatas[1].frontWheel = true; capsuleDesc[2].radius = capsuleDesc[0].radius; capsuleDesc[2].height = capsuleDesc[0].height; capsuleDesc[2].flags = capsuleDesc[0].flags; capsuleDesc[2].localPose.M = capsuleDesc[0].localPose.M; capsuleDesc[2].localPose.t.set(-length*0.5, -height, -width*0.5); capsuleDesc[2].materialIndex = raycastWheelMaterialIndex; capsuleDesc[2].userData = &(wheelUserDatas[2]); actorDesc.shapes.pushBack(&capsuleDesc[2]); wheelUserDatas[2].frontWheel = false; capsuleDesc[3].radius = capsuleDesc[0].radius; capsuleDesc[3].height = capsuleDesc[0].height; capsuleDesc[3].flags = capsuleDesc[0].flags; capsuleDesc[3].localPose.M = capsuleDesc[0].localPose.M; capsuleDesc[3].localPose.t.set(-length*0.5, -height, width*0.5); capsuleDesc[3].materialIndex = raycastWheelMaterialIndex; capsuleDesc[3].userData = &(wheelUserDatas[3]); actorDesc.shapes.pushBack(&capsuleDesc[3]); wheelUserDatas[3].frontWheel = false; actorDesc.body = &bodyDesc; actorDesc.globalPose.t = pos; NxActor* a = gScene->createActor(actorDesc); //a->userData = &carData; //so we can recoginze it in the contact stream sPhysObject* pPhys = new sPhysObject; pPhys->iID = 5; a->userData = (void*)pPhys; //actorDesc.globalPose.t = NxVec3 ( fXPos, fYPos, fZPos ); NxMat33 mat; mat.rotY ( D3DXToRadian ( 90 ) ); a->setGlobalOrientation ( mat ); a->wakeUp(1e10); //don't go to sleep. return a; }
void TickCar ( void ) { g_iValue = 10; NxReal steeringAngle = gSteeringValue * gMaxSteeringAngle; NxArray<CarWheelContact>::iterator i = wheelContactPoints.begin(); while(i != wheelContactPoints.end()) { CarWheelContact& cwc = *i; WheelShapeUserData* wheelData = (WheelShapeUserData *)(cwc.wheel->userData); /* struct CarWheelContact { NxActor* car; NxShape* wheel; NxVec3 contactPoint; NxVec3 contactNormalForce; NxVec3 contactFrictionForce; }; */ { NxMat34 pose = cwc.wheel->getGlobalPose ( ); NxMat33 orient = pose.M; NxVec3 pos = pose.t; float glmat[16]; orient.getColumnMajorStride4(&(glmat[0])); pos.get(&(glmat[12])); glmat[3] = glmat[7] = glmat[11] = 0.0f; glmat[15] = 1.0f; SetWorldMatrix ( g_iValue, ( D3DXMATRIX* ) &glmat ); sObject* pObject = dbGetObject ( g_iValue ); pObject->position.vecPosition = D3DXVECTOR3 ( glmat [ 12 ], glmat [ 13 ], glmat [ 14 ] ); //dbPositionObject ( g_iValue, glmat [ 12 ], glmat [ 13 ], glmat [ 14 ] ); g_iValue++; } //apply to powered wheels only. if (wheelData->frontWheel) { //steering: NxMat33 wheelOrientation = cwc.wheel->getLocalOrientation(); wheelOrientation.setColumn(0, NxVec3(NxMath::cos(steeringAngle), 0, NxMath::sin(steeringAngle) )); wheelOrientation.setColumn(2, NxVec3(NxMath::sin(steeringAngle), 0, -NxMath::cos(steeringAngle) )); cwc.wheel->setLocalOrientation(wheelOrientation); if (frontWheelIsPowered) { //get the world space orientation: wheelOrientation = cwc.wheel->getGlobalOrientation(); NxVec3 steeringDirection; wheelOrientation.getColumn(0, steeringDirection); //the power direction of the front wheel is the wheel's axis as it is steered. if (gMotorForce) { cwc.car->addForceAtPos(steeringDirection * gMotorForce,cwc.contactPoint); } } } if (!wheelData->frontWheel && rearWheelIsPowered) { //get the orientation of this car: NxMat33 m = cwc.car->getGlobalOrientation(); NxVec3 carForwardAxis; m.getColumn(0, carForwardAxis); //the power direction of the rear wheel is always the car's length axis. cwc.car->addForceAtPos(carForwardAxis * gMotorForce,cwc.contactPoint); } i++; } wheelContactPoints.clear(); }