TGC Codebase Backup



Reading GBA Mappy data by OSX Using Happy Dude

18th Oct 2003 5:29
Summary

Allows access to Mappy data, which is stored in a DLL Been updated so you dont need Memory.DLL



Description

This allows GBA data (saved from Mappy) to be compiled into a Visual Studio C/C++/C .NET compile, which then, in turn can be used in DBPro. The main advantage to this is that it is harder for levels to be modified.



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                    Header:
#ifdef READGBAMAPPY_EXPORTS
#define READGBAMAPPY_API __declspec(dllexport)
#else
#define READGBAMAPPY_API __declspec(dllimport)
#endif

DWORD	READGBAMAPPY_API	readTileAtPosition(DWORD layer,DWORD x,DWORD y);
DWORD	READGBAMAPPY_API	writeTileAtPosition(DWORD layer,DWORD x,DWORD y,DWORD block);
void	READGBAMAPPY_API	readBlockData(DWORD ptr,DWORD block);
void	READGBAMAPPY_API	writeBlockData(DWORD ptr,DWORD block);
DWORD	READGBAMAPPY_API	getNumLayers(void);
DWORD	READGBAMAPPY_API	getWidth(void);
DWORD	READGBAMAPPY_API	getHeight(void);
DWORD	READGBAMAPPY_API	countNumberOfTiles(void);
DWORD	READGBAMAPPY_API	findTile(DWORD ptr,DWORD tile);
---
Code

// ReadGBAMappy.cpp : Defines the entry point for the DLL application.
//
// Written by Nicholas Kingsley ©2003.  All rights reserved
// You may alter this code (ney, you MUST alter it!)

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "stddef.h"
#include "ReadGBAMappy.h"
#include "F:\Mappy Graphics\TestMap.txt"
//#include "Test.txt"		// This is the file that contains all the data.  Put this in with the code
						// or rename it.
						// Note : CONST should NOT be used.

#define MAXLAYERS	8
#define WIDTH		100
#define HEIGHT		100

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
    return TRUE;
}

DWORD getNumLayers(void)
{
	return (MAXLAYERS);
}

DWORD getWidth(void)
{
	return (WIDTH);
}

DWORD getHeight(void)
{
	return (HEIGHT);
}

DWORD readTileAtPosition(DWORD layer,DWORD x,DWORD y)
{
	switch (layer) {
		case	0	:	return ((DWORD) maparray0[y][x]);
		case	1	:	return ((DWORD) maparray1[y][x]);
		case	2	:	return ((DWORD) maparray2[y][x]);
		case	3	:	return ((DWORD) maparray3[y][x]);
		case	4	:	return ((DWORD) maparray4[y][x]);
		case	5	:	return ((DWORD) maparray5[y][x]);
		case	6	:	return ((DWORD) maparray6[y][x]);
		case	7	:	return ((DWORD) maparray7[y][x]);
		default		:	return (0);
		};
}

DWORD writeTileAtPosition(DWORD layer,DWORD x,DWORD y,DWORD block)
{
DWORD value;

	value=readTileAtPosition(layer,x,y);						
	switch (layer) {
		case	0	:	maparray0[y][x]=(short) block;
						break;
		case	1	:	maparray1[y][x]=(short) block;
						break;
		case	2	:	maparray2[y][x]=(short) block;
						break;
		case	3	:	maparray3[y][x]=(short) block;
						break;
		case	4	:	maparray4[y][x]=(short) block;
						break;
		case	5	:	maparray5[y][x]=(short) block;
						break;
		case	6	:	maparray6[y][x]=(short) block;
						break;
		case	7	:	maparray7[y][x]=(short) block;
						break;
		default		:	break;
		};

	return (value);
}

void readBlockData(DWORD ptr,DWORD block)
{
	memcpy((LPSTR) ptr,(char *) &blockstr[block],sizeof(BLKSTR));
	//__pokeString(ptr,0,(char *) &blockstr[block],sizeof(BLKSTR),0);
}

void writeBlockData(DWORD ptr,DWORD block)
{
	memcpy((LPSTR) &blockstr[block],(LPSTR) ptr,sizeof(BLKSTR));
	//__pokeString((DWORD) &blockstr[block],0,(LPSTR) ptr,sizeof(BLKSTR),0);
}

DWORD countNumberOfTiles(void)
{
register int x,y,layer;
register DWORD count;

	count=0;
	for (layer=0; layer<MAXLAYERS-1; layer+=2)
	{
		for (y=0; y<HEIGHT; y++)
		{
			for (x=0; x<WIDTH; x++)
			{
				count+=(readTileAtPosition(layer,x,y)>0 ? 1 : 0)+
					(readTileAtPosition(layer+1,x,y)>0 ? 1 : 0);
				
			}
		}
	}

	return (count);
}

DWORD addTileToMemoryList(DWORD ptr,DWORD layer,DWORD x,DWORD y,DWORD index,DWORD *count)
{
struct {
	DWORD layer;
	DWORD x;
	DWORD y;
	} tile;

	tile.layer=layer;
	tile.x=x;
	tile.y=y;
	memcpy((LPSTR) ptr,(char *) &tile,sizeof(tile));
//	__pokeL(ptr,index,layer);
//	__pokeL(ptr,index+4,x);
//	__pokeL(ptr,index+8,y);
	*(count)=*(count)+1;
	return (index+12);
}

DWORD findTile(DWORD ptr,DWORD tile)
{
register int x,y,layer,index;
register DWORD count;

	count=0;
	index=0;

	for (layer=0; layer<MAXLAYERS-1; layer+=2)
	{
		for (y=0; y<HEIGHT; y++)
		{
			for (x=0; x<WIDTH; x++)
			{
				if (readTileAtPosition(layer,x,y)==tile)
				{
					index=addTileToMemoryList(ptr,layer,x,y,index,&count);
				}

				if (readTileAtPosition(layer+1,x,y)==tile)
				{
					index=addTileToMemoryList(ptr,layer+1,x,y,index,&count);
				}
			}
		}
	}

	return (count);
}