/* * Copyright (C) 1995-1997 Christopher D. Granz * * This header may not be removed. * * Refer to the file "License" included in this package for further * information and before using any of the following. */ #include <stdio.h> #include <stdlib.h> #include "sapphire.h" /* * Functions */ void game_update( void ) { register ROOM_INDEX_DATA *pRoom, *pRoom2; register CHAR_DATA *pChar; register OBJ_DATA *pObj; register SCRIPT_DATA *pScript; register TRIGGER_DATA *pTrigger; register RUNNING_SCRIPT_DATA *pRunning; RUNNING_SCRIPT_DATA *pRunningNext; register int ri; register int riDoor; static intt iWanderTimer; iWanderTimer++; for ( ri = 0; ri < iHashListSize; ri++ ) { for ( pChar = ppCharList[ri]; pChar; pChar = pChar->pNext ) { if ( pChar->iWaitTimer > 0 ) pChar->iWaitTimer--; if ( !IS_NPC( pChar ) || pChar->pTerm != NULL || ( pRoom = pChar->pInRoom ) == NULL ) continue; if ( pChar->pNPCData->pProgram != NULL ) { for ( pScript = pChar->pNPCData->pProgram->pScripts; pScript != NULL; pScript = pScript->pNext ) { if ( pScript->bDisabled != TRUE && pScript->bRunning != TRUE ) { for ( pTrigger = pScript->pTriggers; pTrigger; pTrigger = pTrigger->pNext ) { if ( pTrigger->iTrigger == NUMBER_NPC_TRIGGER_RANDOM && random_percent( ) < (intt) *pTrigger->pArgs->pArg ) { execute_npc_script( pChar->pNPCData->pProgram, pScript, NULL, pChar, NULL, NULL ); break; } } } } } if ( iWanderTimer < 5 ) continue; if ( pChar->pNPCData->iWander > 0 ) { riDoor = random_door( ); if ( random_percent( ) < pChar->pNPCData->iWander || ( pRoom2 = pRoom->eExits[riDoor].uRoom.pRoom ) == NULL || IS_SET( pRoom2->fRoomFlags, FLAG_ROOM_NO_NPCS ) || ( IS_SET( pChar->pNPCData->fNPCFlags, FLAG_NPC_STAY_INSIDE ) && pRoom2->iSectorType != NUMBER_SECTOR_UNDEFINED && pRoom2->iSectorType != NUMBER_SECTOR_UNDERGROUND && pRoom2->iSectorType != NUMBER_SECTOR_INSIDE ) || ( IS_SET( pChar->pNPCData->fNPCFlags, FLAG_NPC_STAY_OUTSIDE ) && pRoom2->iSectorType != NUMBER_SECTOR_UNDEFINED && pRoom2->iSectorType != NUMBER_SECTOR_VOID && pRoom2->iSectorType != NUMBER_SECTOR_WATER && pRoom2->iSectorType != NUMBER_SECTOR_WATER_NO_SWIM && pRoom2->iSectorType != NUMBER_SECTOR_CITY ) ) continue; move_char( pChar, riDoor ); } } } if ( iWanderTimer >= 5 ) iWanderTimer = 0; for ( ri = 0; ri < iHashListSize; ri++ ) { for ( pObj = ppObjList[ri]; pObj; pObj = pObj->pNext ) { if ( pObj->pProgram != NULL ) { for ( pScript = pObj->pProgram->pScripts; pScript != NULL; pScript = pScript->pNext ) { if ( pScript->bDisabled != TRUE && pScript->bRunning != TRUE ) { for ( pTrigger = pScript->pTriggers; pTrigger; pTrigger = pTrigger->pNext ) { if ( pTrigger->iTrigger == NUMBER_OBJ_TRIGGER_RANDOM && random_percent( ) < (intt) *pTrigger->pArgs->pArg ) { execute_obj_script( pObj->pProgram, pScript, pObj ); break; } } } } } } } for ( ri = 0; ri < iHashListSize; ri++ ) { for ( pRoom = ppRoomIndexList[ri]; pRoom; pRoom = pRoom->pNext ) { if ( pRoom->pProgram != NULL ) { for ( pScript = pRoom->pProgram->pScripts; pScript; pScript = pScript->pNext ) { if ( pScript->bDisabled != TRUE && pScript->bRunning != TRUE ) { for ( pTrigger = pScript->pTriggers; pTrigger; pTrigger = pTrigger->pNext ) { if ( pTrigger->iTrigger == NUMBER_ROOM_TRIGGER_RANDOM && random_percent( ) < (intt) *pTrigger->pArgs->pArg ) { execute_room_script( pRoom->pProgram, pScript, NULL, pRoom, NULL, NULL ); break; } } } } } } } for ( pRunning = pRunningScriptList; pRunning != NULL; pRunning = pRunningNext ) { pRunningNext = pRunning->pNext; switch ( pRunning->iThisType ) { case NUMBER_VAR_POINTER_CHAR: execute_npc_script( NULL, NULL, pRunning, NULL, NULL, NULL ); break; case NUMBER_VAR_POINTER_OBJ : execute_obj_script( NULL, NULL, NULL ); break; case NUMBER_VAR_POINTER_ROOM: execute_room_script( NULL, NULL, pRunning, NULL, NULL, NULL ); break; } } reset_rooms( ); } /* * Deals with setting up and timming all resets. */ void reset_rooms( void ) { register ROOM_INDEX_DATA *pRoom; register NPC_RESET_DATA *pNPCReset; register OBJ_RESET_DATA *pObjReset; register CHAR_DATA *pChar; register OBJ_DATA *pObj; register int ri; register intt ri2; register bool rbResetHappened; for ( ri = 0; ri < iHashListSize; ri++ ) { for ( pRoom = ppRoomIndexList[ri]; pRoom; pRoom = pRoom->pNext ) { rbResetHappened = FALSE; for ( ri2 = 0; ri2 < 10; ri2++ ) { if ( pRoom->eExits[ri2].uRoom.pRoom == NULL || pRoom->eExits[ri2].iResetTime < 0 ) continue; pRoom->eExits[ri2].iResetTimer++; if ( pRoom->eExits[ri2].iResetTimer >= pRoom->eExits[ri2].iResetTime ) { pRoom->eExits[ri2].fCurrFlags = pRoom->eExits[ri2].fOrigFlags; pRoom->eExits[ri2].iResetTimer = -1; rbResetHappened = TRUE; } } for ( pNPCReset = pRoom->pNPCResets; pNPCReset != NULL; pNPCReset = pNPCReset->pNext ) { if ( pNPCReset->iResetTime < 0 ) continue; if ( pNPCReset->bAlive != TRUE ) { pNPCReset->iResetTimer++; if ( pNPCReset->iResetTimer >= pNPCReset->iResetTime ) { pNPCReset->iResetTimer = -1; pNPCReset->bAlive = TRUE; pChar = new_npc( pNPCReset->u1.pNPCIndex, NULL ); pChar->pNPCData->pReset = pNPCReset; char_to_room( pChar, pRoom ); rbResetHappened = TRUE; } } } for ( pObjReset = pRoom->pObjResets; pObjReset != NULL; pObjReset = pObjReset->pNext ) { if ( pObjReset->iResetTime < 0 ) continue; if ( pObjReset->bAlive != TRUE ) { pObjReset->iResetTimer++; if ( pObjReset->iResetTimer >= pObjReset->iResetTime ) { pObjReset->iResetTimer = -1; pObjReset->bAlive = TRUE; pObj = new_object( pObjReset->u1.pObjIndex, NULL ); pObj->pReset = pObjReset; obj_to_room( pObj, pRoom ); rbResetHappened = TRUE; } } } #if 0 if ( rbResetHappened == TRUE ) send_game_message( "Time passes.", MESSAGE_DEST_ROOM, TRUE, NULL, NULL, pRoom, FALSE, NUMBER_POSITION_DYING ); #endif } } } /* * Creates a list of content objects from a list of object resets. */ OBJ_DATA *reset_objects( OBJ_RESET_DATA *pObjResets ) { return ( NULL ); /* Not finished. */ } /* * End of update.c */