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)26 void MessageHistory_Initialise(void)
27 {
28 	NumberOfEntriesInMessageHistory=0;
29 	EntryToNextShow=0;
30 	MessageHistoryAccessedTimer=0;
31 }
32 
MessageHistory_Add(enum TEXTSTRING_ID stringID)33 void 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)45 void 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)70 void 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)105 void 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()132 void 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