2016-01-27 00:51:34 chip
Page 1546
📢 PUBLIC
WinMain.c:
1/*************************************************************************/
2/** ItemList.cpp: Manages the list of game items. **/
3/** (C)2013 nlited systems, Chip Doran **/
4/*************************************************************************/
5#include <Windows.h>
6#include <d2d1.h>
7#include <math.h>
8#include "Util.h"
9#include "MyD2D.h"
10#include "Sprite.h"
11#include "Globals.h"
12
13
14#define ITEM_MAX 1000 //Limit the number of game items at any one time.
15
16using namespace D2D1; //Direct2D version 1
17
18class ItemList {
19 typedef int (ItemList::*LISTFUNC)(HITEM hItem);
20public:
21 static ItemList *Ptr(HITEMS hItems);
22 static int Create(HITEMS *phItems, HGAME hGame);
23 int Destroy(void);
24 int SetArena(const RECT *prArena);
25 int GetArena(RECT *prArena);
26 int GetControl(UINT PlayerID, UINT *pCtrlState);
27 int Add(HITEM hItem);
28 int Remove(HITEM hItem);
29 int GetNext(HITEM hItem, HITEM *phNext);
30 int Update(UINT Tick);
31 int Draw(HIMAGE hImg);
32 //Data
33 UINT32 Signature;
34private:
35 ItemList(void);
36 ~ItemList(void);
37 int Create2(HGAME hGame);
38 int Iterate(const char *Tag, LISTFUNC pFunc);
39 int IterateUpdate(HITEM hItem);
40 int IterateCollision(HITEM hItem);
41 int IterateDraw(HITEM hItem);
42 //Data
43 HGAME hGame;
44 HIMAGE hImg;
45 UINT Tick;
46 RECT rArena;
47 struct ItemLink_s *pListHead;
48 struct ItemLink_s *pListTail;
49};
50
51static struct ItemLink_s *ItemPtr(HITEM hItem) {
52 struct ItemLink_s *pItem= (struct ItemLink_s*)hItem;
53 if(!hItem || IsBadPtr(pItem,sizeof(*pItem),BADPTR_RW) || pItem->Signature!=SIGNATURE_ITEM)
54 pItem= 0;
55 return(pItem);
56}
57
58/*************************************************************************/
59/** Public interface **/
60/*************************************************************************/
61int ItemsCreate(HITEMS *phItems, HGAME hGame) {
62 if(IsBadPtr(phItems,sizeof(*phItems),BADPTR_WRITE))
63 return(ERR_BADPTR);
64 return(ItemList::Create(phItems,hGame));
65}
66
67int ItemsDestroy(HITEMS hItems) {
68 ItemList *pItems= ItemList::Ptr(hItems);
69 if(!pItems)
70 return(ERR_BADHANDLE);
71 return(pItems->Destroy());
72}
73
74int ItemsSetArena(HITEMS hItems, const RECT *prArena) {
75 ItemList *pItems= ItemList::Ptr(hItems);
76 if(!pItems)
77 return(ERR_BADHANDLE);
78 if(IsBadPtr(prArena,sizeof(*prArena),BADPTR_READ))
79 return(ERR_BADPTR);
80 return(pItems->SetArena(prArena));
81}
82
83int ItemsGetArena(HITEMS hItems, RECT *prArena) {
84 ItemList *pItems= ItemList::Ptr(hItems);
85 if(!pItems)
86 return(ERR_BADHANDLE);
87 if(IsBadPtr(prArena,sizeof(*prArena),BADPTR_WRITE))
88 return(ERR_BADPTR);
89 return(pItems->GetArena(prArena));
90}
91
92int ItemsGetControl(HITEMS hItems, UINT PlayerID, UINT *pCtrlState) {
93 ItemList *pItems= ItemList::Ptr(hItems);
94 if(!pItems)
95 return(ERR_BADHANDLE);
96 if(pCtrlState && IsBadPtr(pCtrlState,sizeof(*pCtrlState),BADPTR_WRITE))
97 return(ERR_BADPTR);
98 return(pItems->GetControl(PlayerID,pCtrlState));
99}
100
101int ItemsAdd(HITEMS hItems, HITEM hItem) {
102 ItemList *pItems= ItemList::Ptr(hItems);
103 if(!pItems)
104 return(ERR_BADHANDLE);
105 return(pItems->Add(hItem));
106}
107
108int ItemsRemove(HITEMS hItems, HITEM hItem) {
109 ItemList *pItems= ItemList::Ptr(hItems);
110 if(!pItems)
111 return(ERR_BADHANDLE);
112 return(pItems->Remove(hItem));
113}
114
115int ItemsGetNext(HITEMS hItems, HITEM hItem, HITEM *phNext) {
116 ItemList *pItems= ItemList::Ptr(hItems);
117 if(!pItems)
118 return(ERR_BADHANDLE);
119 if(IsBadPtr(phNext,sizeof(*phNext),BADPTR_WRITE))
120 return(ERR_BADPTR);
121 return(pItems->GetNext(hItem,phNext));
122}
123
124int ItemsUpdate(HITEMS hItems, UINT Tick) {
125 ItemList *pItems= ItemList::Ptr(hItems);
126 if(!pItems)
127 return(ERR_BADHANDLE);
128 return(pItems->Update(Tick));
129}
130
131int ItemsDraw(HITEMS hItems, HIMAGE hImg) {
132 ItemList *pItems= ItemList::Ptr(hItems);
133 if(!pItems)
134 return(ERR_BADHANDLE);
135 return(pItems->Draw(hImg));
136}
137
138/*************************************************************************/
139/** Public internals **/
140/*************************************************************************/
141ItemList *ItemList::Ptr(HITEMS hItems) {
142 ItemList *pItems= (ItemList*)hItems;
143 if(!hItems || IsBadPtr(pItems,sizeof(*pItems),BADPTR_RW) || pItems->Signature!=SIGNATURE_ITEMS)
144 pItems= 0;
145 return(pItems);
146}
147
148int ItemList::Create(HITEMS *phItems, HGAME hGame) {
149 int Err= ERR_OK;
150 ItemList *pItems= new ItemList;
151 if(!pItems) {
152 Err= Error(ERR_NOMEM,__FUNCTION__": Unable to alloc %d.",sizeof(*pItems));
153 } else if(IsErr(Err= pItems->Create2(hGame))) {
154 delete pItems;
155 } else {
156 *phItems= (HITEMS)pItems;
157 }
158 return(Err);
159}
160
161int ItemList::Destroy(void) {
162 int Err= ERR_OK;
163 delete this;
164 return(Err);
165}
166
167int ItemList::SetArena(const RECT *prArena) {
168 rArena= *prArena;
169 return(ERR_OK);
170}
171
172int ItemList::GetArena(RECT *prArena) {
173 *prArena= rArena;
174 return(ERR_OK);
175}
176
177int ItemList::GetControl(UINT PlayerID, UINT *pCtrlState) {
178 return(GameGetControl(hGame,PlayerID,pCtrlState));
179}
180
181int ItemList::Add(HITEM hItem) {
182 int Err= ERR_OK;
183 struct ItemLink_s *pLink= ItemGetLink(hItem);
184 if(!pLink) {
185 Err= Error(ERR_BADHANDLE,__FUNCTION__": Bad hItem[%X]",hItem);
186 } else {
187 if(!pListHead) {
188 pListHead= pListTail= pLink;
189 } else {
190 pLink->pPrev= pListTail;
191 pListTail->pNext= pLink;
192 pListTail= pLink;
193 }
194 }
195 return(Err);
196}
197
198int ItemList::Remove(HITEM hItem) {
199 int Err= ERR_OK;
200 struct ItemLink_s *pLink= ItemGetLink(hItem);
201 if(!pLink) {
202 Err= Error(ERR_BADHANDLE,__FUNCTION__": Bad hItem[%X]",hItem);
203 } else {
204 if(pLink==pListHead)
205 pListHead= pLink->pNext;
206 else
207 pLink->pPrev->pNext= pLink->pNext;
208 if(pLink==pListTail)
209 pListTail= pLink->pPrev;
210 else
211 pLink->pNext->pPrev= pLink->pPrev;
212 }
213 return(Err);
214}
215
216int ItemList::GetNext(HITEM hItem, HITEM *phNext) {
217 int Err= ERR_OK;
218 struct ItemLink_s *pLink= ItemGetLink(hItem);
219 if(!hItem) {
220 *phNext= pListHead ? pListHead->hItem:0;
221 } else if(!pLink) {
222 Err= Warn(ERR_BADHANDLE,__FUNCTION__": Bad hItem[%X]",hItem);
223 } else {
224 *phNext= pLink->pNext ? pLink->pNext->hItem:0;
225 }
226 return(Err);
227}
228
229int ItemList::Update(UINT Tick) {
230 int Err= ERR_OK;
231 this->Tick= Tick;
232 if(IsErr(Err= Iterate("Move",&ItemList::IterateUpdate)))
233 Err= Warn(Err,__FUNCTION__": ItemUpdate() failed.");
234 if(IsErr(Err= Iterate("Collision",&ItemList::IterateCollision)))
235 Err= Warn(Err,__FUNCTION__": ItemCollision() failed.");
236 return(Err);
237}
238
239int ItemList::Draw(HIMAGE hImg) {
240 int Err= ERR_OK;
241 LISTFUNC pDraw= &ItemList::IterateDraw;
242 this->hImg= hImg;
243 Err= Iterate("Draw",pDraw);
244 return(Err);
245}
246
247/*************************************************************************/
248/** Private internals **/
249/*************************************************************************/
250ItemList::ItemList(void) {
251 memset(this,0,sizeof(*this));
252 Signature= SIGNATURE_ITEMS;
253}
254
255ItemList::~ItemList(void) {
256 struct ItemLink_s *pItem,*pNext;
257 Signature|= SIGNATURE_INVALID;
258 for(pItem=pListHead;pItem;pItem=pNext) {
259 pNext= pItem->pNext;
260 MemFree(pItem);
261 }
262}
263
264int ItemList::Create2(HGAME hGame) {
265 int Err= ERR_OK;
266 this->hGame= hGame;
267 return(Err);
268}
269
270int ItemList::Iterate(const char *Tag, LISTFUNC pFunc) {
271 int Err2,Err= ERR_OK;
272 struct ItemLink_s *pItem,*pNext;
273 for(pItem=pListHead;pItem;pItem=pNext) {
274 pNext= pItem->pNext;
275 Err2= (this->*pFunc)(pItem->hItem); //Overly-clever C++ syntax
276 if(IsErr(Err2)) {
277 Err= Warn(Err2,__FUNCTION__": %s failed on item %X",Tag,pItem);
278 }
279 }
280 return(Err);
281}
282
283/*************************************************************************/
284/** Individual items **/
285/*************************************************************************/
286int ItemList::IterateUpdate(HITEM hItem) {
287 int Err= ERR_OK;
288 if(IsErr(Err= ItemUpdate(hItem,(HITEMS)this,Tick)))
289 Warn(Err,__FUNCTION__": Update on item [%X] failed.",hItem);
290 return(Err);
291}
292
293int ItemList::IterateCollision(HITEM hItem) {
294 int Err= ERR_OK;
295 if(IsErr(Err= ItemCollision(hItem,(HITEMS)this)))
296 Warn(Err,__FUNCTION__": Collision on item [%X] failed.",hItem);
297 return(Err);
298}
299
300int ItemList::IterateDraw(HITEM hItem) {
301 int Err= ERR_OK;
302 if(IsErr(Err= ItemDraw(hItem,hImg)))
303 Warn(Err,__FUNCTION__": Draw on item [%X] failed.",hItem);
304 return(Err);
305}
306
WebV7 (C)2018 nlited | Rendered by tikope in 57.440ms | 216.73.216.25