#include #include #include "config.h" #include "SDL/SDL.h" #include "SDL/SDL_image.h" #include "SDL/SDL_ttf.h" #include "SDL/SDL_mixer.h" #include "enum.h" #include "Engine.h" #include "Player.h" #include "Room.h" #include "Kaos.h" #include "HyperKaos.h" #include "TextBox.h" #include "Scene.h" #include "Synergy.h" #include "WorldData.h" typedef struct timer Timer; #include "extern.h" void bufferData(enum dataChunks chunk) { hasMusic = 0; applySurface(8,8, loadingTxt, screen, NULL); frameAdvance(); printf("Loading map chunk\n"); if(worldBuilder(chunk) != 0) { quit = 1; playing = 0; printf("Fatal map error. Quitting\n"); }; printf("Loaded map chunk\n"); } int hashCmd(char* x) { int hash = 7951; int coef = 181; while (*x) { hash += coef*(*x); x++; } hash %= 256; return hash; } int worldBuilder(enum dataChunks chunk) { char datafile[256]; char lineBuffer[1024]; char objBuffer[24]; char cchunk[4]; char propsBuffer[998]; int savequery; int conditional = 0; FILE* worldInfo; sprintf(cchunk, "%d", chunk); strcpy(datafile, "mapdata/"); strcat(datafile, cchunk); strcat(datafile, ".txt"); worldInfo = fopen(datafile, "r"); if (!worldInfo) { printf("Couldn't read world data\n"); return 1; } while (fgets(lineBuffer, 1024, worldInfo)) { if (lineBuffer[0] == '#') continue; if (lineBuffer[0] == '<') { conditional = 0; continue; } if (!conditional) { if (sscanf(lineBuffer, "%[^:]: %[^\t\n]", objBuffer, propsBuffer) < 2) { printf("World data line malformed\n"); return 1; } else { switch (hashCmd(objBuffer)) { case 200: //mkRoom if (buildRoom(propsBuffer) != 0) return 1; break; case 45: //mkKaos // buildKaos(propsBuffer); break; case 109: //mkTextBox // buildTextbox(propsBuffer); break; case 181: //addText // modTextBox(propsBuffer); break; case 116: //SFX // buildSFX(propsBuffer); break; case 93: //BGM // buildBGM(propsBuffer); break; case 100: //addSigil // buildSynergy(propsBuffer); break; case 47: //addPerson // buildPerson(propsBuffer); break; case 88: //addObstruction // buildObstruction(propsBuffer); break; case 141: //addImg // buildFGImage(propsBuffer); break; case 240: //addTrigger // buildHyper(propsBuffer); break; case 238: //addWarp buildWarp(propsBuffer); break; } } }} fclose(worldInfo); return 0; } int buildRoom(char* props) { int slot; char filename[256]; int breathe; if (sscanf(props, "slot %d, sprite %[^,], spd %d", &slot, filename, &breathe) != 3) { return 1; } printf("Building room in map slot %d: bg = %s; spd = %d\n", slot, filename, breathe); mapBuffer[slot] = newRoom(filename, breathe); return 0; } int buildWarp(char* props) { int r, x, y, w, h, dC, dR, dX, dY; if (sscanf(props, "room %d, x %d, y %d, w %d, h %d, dest %d,%d, dX %d, dY %d", &r, &x, &y, &w, &h, &dC, &dR, &dX, &dY) != 9) { return 1; } addWarp(mapBuffer[r], x, y, w, h, dC, dR, dX, dY); return 0; } int countMapThings(char x, enum dataChunks chunk) { int count = 0; char datafile[256]; char lineBuffer[1024]; char cchunk[4]; FILE* worldInfo; sprintf(cchunk, "%d", chunk); strcpy(datafile, "mapdata/"); strcat(datafile, cchunk); strcat(datafile, ".txt"); worldInfo = fopen(datafile, "r"); while (fgets(lineBuffer, 1024, worldInfo)) { if (lineBuffer[0] == x) count++; } return count; } void dataPurge(int a, int b, int c, int d, int e) { int i; for (i = 0; i < a; i++) deleteRoom(mapData[i]); for (i = 0; i < b; i++) deleteTextBox(dialogueData[i]); for (i = 0; i < c; i++) kaosData[i]->destroy(kaosData[i]); #ifdef SOUND_ON for (i = 0; i < d; i++) Mix_FreeMusic(bgmData[i]); for (i = 0; i < e; i++) Mix_FreeChunk(sfxData[i]); #endif } void unloadData(enum dataChunks chunk) { int a, b, c, d, e; printf("Unloading old map chunk\n"); a = countMapThings('R', chunk); b = countMapThings('T', chunk); c = countMapThings('K', chunk); d = countMapThings('M', chunk); e = countMapThings('S', chunk); dataPurge(a,b,c,d,e); printf("Unloaded old map chunk\n"); } void pushBufferData() { printf("Pushing map buffer\n"); mapData = mapBuffer; mapBuffer = (Room**)malloc(64*sizeof(Room*)); #ifdef SOUND_ON if (hasMusic) Mix_PlayMusic(bgmData[0], -1); #endif printf("Map buffer clean\n"); } void pager() { if (thisChunk != nextChunk) { #ifdef SOUND_ON if (Mix_PlayingMusic()) { Mix_HaltMusic(); } #endif unloadData(thisChunk); pushBufferData(); thisChunk=nextChunk; } }