1 #include "3dc.h" 2 #include "module.h" 3 #include "inline.h" 4 #include "stratdef.h" 5 #include "gamedef.h" 6 #include "language.h" 7 #include "messagehistory.h" 8 9 #define MAX_NO_OF_MESSAGES_IN_HISTORY 64 10 11 extern void NewOnScreenMessage(unsigned char *messagePtr); 12 13 struct MessageHistory 14 { 15 enum TEXTSTRING_ID StringID; 16 int Hours; 17 int Minutes; 18 int Seconds; 19 }; 20 21 static struct MessageHistory MessageHistoryStore[MAX_NO_OF_MESSAGES_IN_HISTORY]; 22 static int NumberOfEntriesInMessageHistory; 23 static int EntryToNextShow; 24 static int MessageHistoryAccessedTimer; 25 MessageHistory_Initialise(void)26void MessageHistory_Initialise(void) 27 { 28 NumberOfEntriesInMessageHistory=0; 29 EntryToNextShow=0; 30 MessageHistoryAccessedTimer=0; 31 } 32 MessageHistory_Add(enum TEXTSTRING_ID stringID)33void MessageHistory_Add(enum TEXTSTRING_ID stringID) 34 { 35 if (NumberOfEntriesInMessageHistory<MAX_NO_OF_MESSAGES_IN_HISTORY) 36 { 37 MessageHistoryStore[NumberOfEntriesInMessageHistory].StringID = stringID; 38 MessageHistoryStore[NumberOfEntriesInMessageHistory].Hours = AvP.ElapsedHours; 39 MessageHistoryStore[NumberOfEntriesInMessageHistory].Minutes = AvP.ElapsedMinutes; 40 MessageHistoryStore[NumberOfEntriesInMessageHistory].Seconds = AvP.ElapsedSeconds/65536; 41 NumberOfEntriesInMessageHistory++; 42 } 43 } 44 MessageHistory_DisplayPrevious(void)45void MessageHistory_DisplayPrevious(void) 46 { 47 if (EntryToNextShow) 48 { 49 unsigned char buffer[1024]; 50 51 EntryToNextShow--; 52 sprintf 53 ( 54 buffer, 55 "%s %d (%02dh%02dm%02ds) \n \n%s", 56 GetTextString(TEXTSTRING_INGAME_MESSAGENUMBER), 57 EntryToNextShow+1, 58 MessageHistoryStore[EntryToNextShow].Hours, 59 MessageHistoryStore[EntryToNextShow].Minutes, 60 MessageHistoryStore[EntryToNextShow].Seconds, 61 GetTextString(MessageHistoryStore[EntryToNextShow].StringID) 62 ); 63 NewOnScreenMessage(buffer); 64 MessageHistoryAccessedTimer = 65536*4; 65 66 if (!EntryToNextShow && NumberOfEntriesInMessageHistory) EntryToNextShow = NumberOfEntriesInMessageHistory; 67 } 68 } 69 MessageHistory_Maintain(void)70void MessageHistory_Maintain(void) 71 { 72 if (MessageHistoryAccessedTimer) 73 { 74 extern int NormalFrameTime; 75 MessageHistoryAccessedTimer -= NormalFrameTime; 76 77 if (MessageHistoryAccessedTimer<0) 78 { 79 MessageHistoryAccessedTimer=0; 80 } 81 } 82 else 83 { 84 EntryToNextShow = NumberOfEntriesInMessageHistory; 85 } 86 } 87 88 89 /*---------------------------** 90 ** Load/Save message history ** 91 **---------------------------*/ 92 #include "savegame.h" 93 94 typedef struct message_history_save_block 95 { 96 SAVE_BLOCK_HEADER header; 97 98 int NumberOfEntriesInMessageHistory; 99 int EntryToNextShow; 100 int MessageHistoryAccessedTimer; 101 //follow by message history array 102 }MESSAGE_HISTORY_SAVE_BLOCK; 103 104 Load_MessageHistory(SAVE_BLOCK_HEADER * header)105void Load_MessageHistory(SAVE_BLOCK_HEADER* header) 106 { 107 int i; 108 MESSAGE_HISTORY_SAVE_BLOCK* block = (MESSAGE_HISTORY_SAVE_BLOCK*) header; 109 struct MessageHistory* saved_message = (struct MessageHistory*) (block+1); 110 111 int expected_size; 112 113 //make sure the block is the correct size 114 expected_size = sizeof(*block); 115 expected_size += sizeof(struct MessageHistory) * block->NumberOfEntriesInMessageHistory; 116 if(header->size != expected_size) return; 117 118 //load the stuff then 119 NumberOfEntriesInMessageHistory = block->NumberOfEntriesInMessageHistory; 120 EntryToNextShow = block->EntryToNextShow; 121 MessageHistoryAccessedTimer = block->MessageHistoryAccessedTimer; 122 123 //load the message history 124 for(i=0;i<block->NumberOfEntriesInMessageHistory;i++) 125 { 126 MessageHistoryStore[i] = *saved_message++; 127 } 128 129 130 } 131 Save_MessageHistory()132void Save_MessageHistory() 133 { 134 MESSAGE_HISTORY_SAVE_BLOCK* block; 135 int i; 136 137 //get memory for header 138 GET_SAVE_BLOCK_POINTER(block); 139 140 //fill in header 141 block->header.type = SaveBlock_MessageHistory; 142 block->header.size = sizeof(*block) + NumberOfEntriesInMessageHistory * sizeof(struct MessageHistory); 143 144 block->NumberOfEntriesInMessageHistory = NumberOfEntriesInMessageHistory; 145 block->EntryToNextShow = EntryToNextShow; 146 block->MessageHistoryAccessedTimer = MessageHistoryAccessedTimer; 147 148 for(i=0;i<NumberOfEntriesInMessageHistory;i++) 149 { 150 struct MessageHistory* message = GET_SAVE_BLOCK_POINTER(message); 151 *message = MessageHistoryStore[i]; 152 } 153 154 } 155 156 157