$OpenBSD: patch-engines_simon_simon_cpp,v 1.1 2006/07/08 04:14:30 jsg Exp $
--- engines/simon/simon.cpp.orig	Thu Jun 22 07:14:03 2006
+++ engines/simon/simon.cpp	Fri Jul  7 18:55:58 2006
@@ -97,10 +97,6 @@ SimonEngine::SimonEngine(OSystem *syst)
 	_itemArraySize = 0;
 	_itemArrayInited = 0;
 
-	_itemHeapPtr = 0;
-	_itemHeapCurPos = 0;
-	_itemHeapSize = 0;
-
 	_iconFilePtr = 0;
 
 	_tblList = 0;
@@ -588,7 +584,12 @@ SimonEngine::~SimonEngine() {
 
 	midi.close();
 
-	free(_itemHeapPtr - _itemHeapCurPos);
+	for (uint i = 0; i < _itemHeap.size(); i++) {
+		delete [] _itemHeap[i];
+	}
+
+	_itemHeap.clear();
+
 	free(_tablesHeapPtr - _tablesHeapCurPos);
 
 	free(_gameOffsetsPtr);
@@ -654,16 +655,11 @@ void SimonEngine::paletteFadeOut(byte *p
 }
 
 byte *SimonEngine::allocateItem(uint size) {
-	byte *org = _itemHeapPtr;
-	size = (size + 3) & ~3;
+	byte *item = new byte[size];
 
-	_itemHeapPtr += size;
-	_itemHeapCurPos += size;
-
-	if (_itemHeapCurPos > _itemHeapSize)
-		error("Itemheap overflow");
-
-	return org;
+	memset(item, 0, size);
+	_itemHeap.push_back(item);
+	return item;
 }
 
 void SimonEngine::setUserFlag(Item *item, int a, int b) {
@@ -728,9 +724,7 @@ Child *SimonEngine::allocateChildBlock(I
 }
 
 void SimonEngine::allocItemHeap() {
-	_itemHeapSize = 10000;
-	_itemHeapCurPos = 0;
-	_itemHeapPtr = (byte *)calloc(10000, 1);
+	_itemHeap.clear();
 }
 
 void SimonEngine::allocTablesHeap() {
@@ -1961,8 +1955,13 @@ void SimonEngine::shutdown() {
 
 	free(_stringTabPtr);
 	free(_itemArrayPtr);
-	free(_itemHeapPtr - _itemHeapCurPos);
-	free(_tablesHeapPtr - _tablesHeapCurPos);
+
+	for (uint i = 0; i < _itemHeap.size(); i++) {
+		delete [] _itemHeap[i];
+	}
+
+	_itemHeap.clear();
+
 	free(_tblList);
 	free(_zoneBuffers);
 	free(_iconFilePtr);
