Wie man ein Buch erstellt, das die Eigenschaften eines Söldners verbessert Zuerst muss ein Item zu der Liste hinzugefügt werden, die kontrolliert, welche Items auf die Körperabbildung im Inventar anwendbar sind, im folgenden Beispiel wird der Walkman dafür benutzt. Tactical\Interface Items.c BOOLEAN CompatibleItemForApplyingOnMerc( OBJECTTYPE *pTestObject ) { UINT16 usItem = pTestObject->usItem; // ATE: If in mapscreen, return false always.... if( guiTacticalInterfaceFlags & INTERFACE_MAPSCREEN ) { return( FALSE ); } // ATE: Would be nice to have flag here to check for these types.... if ( usItem == CAMOUFLAGEKIT || usItem == ADRENALINE_BOOSTER || usItem == REGEN_BOOSTER || usItem == SYRINGE_3 || usItem == SYRINGE_4 || usItem == SYRINGE_5 || usItem == ALCOHOL || usItem == WINE || usItem == BEER || usItem == CANTEEN || usItem == JAR_ELIXIR || usItem == WALKMAN) { return( TRUE ); } else { return( FALSE ); } } Dann muss eine Routine hinzugefügt werden, die die Funktion aufruft, die die Aufgaben des Buches übernimmt. Tactical\Interface Panels.c else if ( ApplyDrugs( gpSMCurrentMerc, gpItemPointer ) ) { // Dirty fInterfacePanelDirty = DIRTYLEVEL2; // Check if it's the same now! if ( gpItemPointer->ubNumberOfObjects == 0 ) { gbCompatibleApplyItem = FALSE; EndItemPointer( ); } /* // COMMENTED OUT DUE TO POTENTIAL SERIOUS PROBLEMS WITH STRATEGIC EVENT SYSTEM if ( gpSMCurrentMerc->ubProfile == LARRY_NORMAL ) { // Larry's taken something! gpSMCurrentMerc = SwapLarrysProfiles( gpSMCurrentMerc ); } */ // Say OK acknowledge.... DoMercBattleSound( gpSMCurrentMerc, BATTLE_SOUND_COOL1 ); } else if ( ApplySkillBook( gpSMCurrentMerc, gpItemPointer, &fGoodAPs ) ) { if ( fGoodAPs ) { // Dirty fInterfacePanelDirty = DIRTYLEVEL2; // Check if it's the same now! if ( gpItemPointer->ubNumberOfObjects == 0 ) { gbCompatibleApplyItem = FALSE; EndItemPointer( ); } // Say OK acknowledge.... DoMercBattleSound( gpSMCurrentMerc, BATTLE_SOUND_COOL1 ); } } Die betreffende Funktion lautet hier also „ApplySkillBook“. Nun muss sie noch implementiert werden. Setzen wir zuerst die Signatur in die Headerdatei: Tactical\Items.h BOOLEAN ApplyCanteen( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAPs ); BOOLEAN ApplyElixir( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAPs ); BOOLEAN ApplySkillBook( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAPs ); Dann die eigentliche Funktion in der Quellcodedatei. Tactical\Items.c BOOLEAN ApplyElixir( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAPs ) { INT16 sPointsToUse; UINT16 usTotalKitPoints; (*pfGoodAPs) = TRUE; if (pObj->usItem != JAR_ELIXIR ) { return( FALSE ); } usTotalKitPoints = TotalPoints( pObj ); if (usTotalKitPoints == 0) { // HUH??? return( FALSE ); } if (!EnoughPoints( pSoldier, AP_CAMOFLAGE, 0, TRUE ) ) { (*pfGoodAPs) = FALSE; return( TRUE ); } DeductPoints( pSoldier, AP_CAMOFLAGE, 0 ); sPointsToUse = ( MAX_HUMAN_CREATURE_SMELL - pSoldier->bMonsterSmell ) * 2; sPointsToUse = __min( sPointsToUse, usTotalKitPoints ); UseKitPoints( pObj, sPointsToUse, pSoldier ); pSoldier->bMonsterSmell += sPointsToUse / 2; return( TRUE ); } BOOLEAN ApplySkillBook( SOLDIERTYPE * pSoldier, OBJECTTYPE * pObj, BOOLEAN *pfGoodAPs ) { INT16 sPointsToUse; UINT16 usTotalKitPoints; (*pfGoodAPs) = TRUE; if (pObj->usItem != WALKMAN ) { return( FALSE ); } usTotalKitPoints = TotalPoints( pObj ); if (usTotalKitPoints == 0) { // HUH??? return( FALSE ); } if (!EnoughPoints( pSoldier, 5, 0, TRUE ) ) { (*pfGoodAPs) = FALSE; return( TRUE ); } DeductPoints( pSoldier, 5, 0 ); sPointsToUse = usTotalKitPoints; UseKitPoints( pObj, sPointsToUse, pSoldier ); if (pSoldier->bMedical + 5 <= 99) { ChangeStat( &(gMercProfiles[pSoldier->ubProfile]), pSoldier, MEDICALAMT, 5 ); } else { pSoldier->bMedical = 99; } return( TRUE ); } Wie man sieht, wird zunächst bestätigt, dass es sich um den Walkman handelt. Nachdem ein paar Punkte (5 AP) fürs Anwenden abgezogen werden, werden alle Statuspunkte des Buches aufgebraucht. Es werden konstant 5 Punkte an Medizin gelernt. MEDICALAMT gibt jeweils den skill an der geändert wird. Alle weiteren skills + Eigenschaften sind in der entsprechenden Funktion void ChangeStat(...) in der tactical\campaign.c aufgeführt. Trotzdem hier eine Übersicht: HEALTHAMT -> GSH AGILAMT -> BEW DEXTAMT -> GES WISDOMAMT -> WSH MEDICALAMT -> MED EXPLODEAMT -> EXP MECHANAMT -> TEC MARKAMT -> TRF EXPERAMT -> LVL STRAMT -> STR LDRAMT -> FHR Eventuell muss man noch die Item-Liste in der Items.c anpassen und das betreffende Item mit IC_KIT deklarieren.