BOOLEAN CheckOnBoxers( void ) { UINT32 uiLoop; UINT8 ubID; // repick boxer IDs every time if ( gubBoxerID[0] == NOBODY ) { // get boxer soldier IDs! for( uiLoop = 0; uiLoop < NUM_BOXERS; uiLoop++ ) { ubID = WhoIsThere2( gsBoxerGridNo[ uiLoop ], 0 ); // WANNE: Safty check! if (ubID < TOTAL_SOLDIERS) { if ( FindObjClass( MercPtrs[ ubID ], IC_WEAPON ) == NO_SLOT && IS_MERC_BODY_TYPE( MercPtrs[ ubID ] ) ) { // no weapon and not a civilian so this guy is a boxer gubBoxerID[ uiLoop ] = ubID; } } } } if ( gubBoxerID[ 0 ] == NOBODY && gubBoxerID[ 1 ] == NOBODY && gubBoxerID[ 2 ] == NOBODY ) { return( FALSE ); } return( TRUE ); }
INT8 DecideAutoBandage( SOLDIERTYPE * pSoldier ) { INT8 bSlot; BOOLEAN fDoClimb; if (pSoldier->stats.bMedical == 0 || pSoldier->ubServicePartner != NOBODY) { // don't/can't make decision return( AI_ACTION_NONE ); } bSlot = FindObjClass( pSoldier, IC_MEDKIT ); if (bSlot == NO_SLOT) { // no medical kit! return( AI_ACTION_NONE ); } if (pSoldier->bBleeding) { // heal self first! pSoldier->aiData.usActionData = pSoldier->sGridNo; if (bSlot != HANDPOS) { pSoldier->bSlotItemTakenFrom = bSlot; SwapObjs( pSoldier, HANDPOS, bSlot, TRUE ); /* memset( &TempObj, 0, sizeof( OBJECTTYPE ) ); // move the med kit out to temp obj SwapObjs( &TempObj, &(pSoldier->inv[bSlot]) ); // swap the med kit with whatever was in the hand SwapObjs( &TempObj, &(pSoldier->inv[HANDPOS]) ); // replace whatever was in the hand somewhere in inventory AutoPlaceObject( pSoldier, &TempObj, FALSE ); */ } return( AI_ACTION_GIVE_AID ); } // pSoldier->aiData.usActionData = FindClosestPatient( pSoldier ); pSoldier->aiData.bAction = FindBestPatient( pSoldier, &fDoClimb ); if (pSoldier->aiData.bAction != AI_ACTION_NONE) { pSoldier->usUIMovementMode = RUNNING; if (bSlot != HANDPOS) { pSoldier->bSlotItemTakenFrom = bSlot; SwapObjs( pSoldier, HANDPOS, bSlot, TRUE ); } return( pSoldier->aiData.bAction ); } // do nothing return( AI_ACTION_NONE ); }
BOOLEAN RecruitRPC( UINT8 ubCharNum ) { SOLDIERTYPE *pSoldier, *pNewSoldier; // Get soldier pointer pSoldier = FindSoldierByProfileID( ubCharNum, FALSE ); if (!pSoldier) { return( FALSE ); } // OK, set recruit flag.. gMercProfiles[ ubCharNum ].ubMiscFlags |= PROFILE_MISC_FLAG_RECRUITED; // Add this guy to our team! pNewSoldier = ChangeSoldierTeam( pSoldier, gbPlayerNum ); // handle set up any RPC's that will leave us in time if ( ubCharNum == SLAY ) { // slay will leave in a week pNewSoldier->iEndofContractTime = GetWorldTotalMin() + ( 7 * 24 * 60 ); KickOutWheelchair( pNewSoldier ); } else if ( ubCharNum == DYNAMO && gubQuest[ QUEST_FREE_DYNAMO ] == QUESTINPROGRESS ) { EndQuest( QUEST_FREE_DYNAMO, pSoldier->sSectorX, pSoldier->sSectorY ); } // handle town loyalty adjustment HandleTownLoyaltyForNPCRecruitment( pNewSoldier ); // Try putting them into the current squad if ( AddCharacterToSquad( pNewSoldier, (INT8)CurrentSquad( ) ) == FALSE ) { AddCharacterToAnySquad( pNewSoldier ); } ResetDeadSquadMemberList( pNewSoldier->bAssignment ); DirtyMercPanelInterface( pNewSoldier, DIRTYLEVEL2 ); if ( pNewSoldier->inv[ HANDPOS ].usItem == NOTHING ) { // empty handed - swap in first available weapon INT8 bSlot; bSlot = FindObjClass( pNewSoldier, IC_WEAPON ); if ( bSlot != NO_SLOT ) { if ( Item[ pNewSoldier->inv[ bSlot ].usItem ].fFlags & ITEM_TWO_HANDED ) { if ( bSlot != SECONDHANDPOS && pNewSoldier->inv[ SECONDHANDPOS ].usItem != NOTHING ) { // need to move second hand item out first AutoPlaceObject( pNewSoldier, &(pNewSoldier->inv[ SECONDHANDPOS ]), FALSE ); } } // swap item to hand SwapObjs( &(pNewSoldier->inv[ bSlot ]), &(pNewSoldier->inv[ HANDPOS ]) ); } } #ifdef JA2DEMO HandleEndDemoInCreatureLevel( ); #endif if ( ubCharNum == IRA ) { // trigger 0th PCscript line TriggerNPCRecord( IRA, 0 ); } // Set whatkind of merc am i pNewSoldier->ubWhatKindOfMercAmI = MERC_TYPE__NPC; // //add a history log that tells the user that a npc has joined the team // // ( pass in pNewSoldier->sSectorX cause if its invalid, -1, n/a will appear as the sector in the history log ) AddHistoryToPlayersLog( HISTORY_RPC_JOINED_TEAM, pNewSoldier->ubProfile, GetWorldTotalMin(), pNewSoldier->sSectorX, pNewSoldier->sSectorY ); //remove the merc from the Personnel screens departed list ( if they have never been hired before, its ok to call it ) RemoveNewlyHiredMercFromPersonnelDepartedList( pSoldier->ubProfile ); return( TRUE ); }
BOOLEAN CanCharacterAutoBandageTeammate( SOLDIERTYPE *pSoldier ) // can this soldier autobandage others in sector { // if the soldier isn't active or in sector, we have problems..leave if ( !(pSoldier->bActive) || !(pSoldier->bInSector) || ( pSoldier->flags.uiStatusFlags & SOLDIER_VEHICLE ) || (pSoldier->bAssignment == VEHICLE ) ) { return( FALSE ); } // they must have oklife or more, not be collapsed, have some level of medical competence, and have a med kit of some sort if ( (pSoldier->stats.bLife >= OKLIFE) && !(pSoldier->bCollapsed) && (pSoldier->stats.bMedical > 0) && (FindObjClass( pSoldier, IC_MEDKIT ) != NO_SLOT) ) { return( TRUE ); } return( FALSE ); }