-#include "src/lib/dos_kb.h"\r
-#include "src/lib/mapread.c"\r
-//#include "16\lib\x\modex.h"\r
-#include "src/lib/wtest/wtest.c"\r
-#include "src/lib/planar.c"\r
-//====#include "src\lib\ems.c"\r
-\r
-//word far *clock= (word far*) 0x046C; /* 18.2hz clock */\r
-\r
-/*typedef struct {\r
- bitmap_t *data;\r
- word tileHeight;\r
- word tileWidth;\r
- unsigned int rows;\r
- unsigned int cols;\r
-} tiles_t;\r
-\r
-\r
-typedef struct {\r
- byte *data;\r
- tiles_t *tiles;\r
- int width;\r
- int height;\r
-} map_t;*/\r
-\r
-\r
-typedef struct {\r
- map_t *map;\r
- page_t *page;\r
- int tx; //appears to be the top left tile position on the viewable screen map\r
- int ty; //appears to be the top left tile position on the viewable screen map\r
- word dxThresh; //????\r
- word dyThresh; //????\r
-} map_view_t;\r
-\r
-typedef struct {\r
- int x; //player exact position on the viewable map\r
- int y; //player exact position on the viewable map\r
- int tx; //player tile position on the viewable map\r
- int ty; //player tile position on the viewable map\r
- int triggerx; //player's trigger box tile position on the viewable map\r
- int triggery; //player's trigger box tile position on the viewable map\r
- int setx; //NOT USED YET! player sprite sheet set on the image x\r
- int sety; //NOT USED YET! player sprite sheet set on the image y\r
- word q; //loop variable\r
- word d; //direction\r
- bitmap_t data; //supposively the sprite sheet data\r
- int hp; //hitpoints of the player\r
-} actor_t;\r
-\r
-map_t allocMap(int w, int h);\r
-void initMap(map_t *map);\r
-void mapScrollRight(map_view_t *mv, byte offset);\r
-void mapScrollLeft(map_view_t *mv, byte offest);\r
-void mapScrollUp(map_view_t *mv, byte offset);\r
-void mapScrollDown(map_view_t *mv, byte offset);\r
-void mapGoTo(map_view_t *mv, int tx, int ty);\r
-void mapDrawTile(tiles_t *t, word i, page_t *page, word x, word y);\r
-void mapDrawRow(map_view_t *mv, int tx, int ty, word y);\r
-void mapDrawCol(map_view_t *mv, int tx, int ty, word x);\r
-void qclean();\r
-void pdump(map_view_t *pee);\r
-void animatePlayer(map_view_t *src, map_view_t *dest, /*map_view_t *top, */sword d, short scrolloffsetswitch, int x, int y, int ls, int lp, bitmap_t *bmp);\r
-\r
-#define TILEWH 16\r
-#define QUADWH TILEWH/2\r
-#define SPEED 4\r
-//#define LOOPMAX (TILEWH/SPEED)\r
-\r
-//place holder definitions\r
-//#define MAPX 200\r
-//#define MAPY 150\r
-#define TRIGGX 10\r
-#define TRIGGY 9\r
-\r
-void main() {\r
- size_t oldfreemem=GetFreeSize();\r
- long emmhandle;\r
- long emsavail;\r
- char teststr[80];
- word panswitch=0, panq=1, pand=0; //for panning!\r
- int i;\r
- static word paloffset=0;\r
- bitmap_t ptmp;//, npctmp; // player sprite\r
- planar_buf_t *p;\r
- const char *cpus;\r
- static int persist_aniframe = 0; /* gonna be increased to 1 before being used, so 0 is ok for default */\r
- page_t screen, screen2, screen3;\r
- map_t map;\r
- map_view_t mv, mv2, mv3;\r
- map_view_t *bg, *spri, *mask;//, *tmp;\r
- byte *dpal, *gpal;\r
- byte *ptr, *mappalptr;\r
- actor_t player;\r
- //actor_t npc0;\r
-\r
-// atexit(qclean());\r
- /*if(!emmtest())\r
- {\r
- printf("Expanded memory is not present\n");\r
- exit(0);\r
- }\r
- \r
- if(!emmok())\r
- {\r
- printf("Expanded memory manager is not present\n");\r
- exit(0);\r
- }\r
-\r
- emsavail = emmavail();\r
- if(emsavail == -1)\r
- {\r
- printf("Expanded memory manager error\n");\r
- exit(0);\r
- }\r
- printf("There are %ld pages available\n",emsavail);\r
-\r
- if((emmhandle = emmalloc(emsavail)) < 0)\r
- {\r
- printf("Insufficient pages available\n");\r
- exit(0);\r
- }*/\r
-\r
- /* create the map */\r
-//0000 printf("Total used @ before map load: %zu\n", oldfreemem-GetFreeSize());\r
- loadmap("data/test.map", &map);\r
-//---- map = allocMap(map.width,map.height); //20x15 is the resolution of the screen you can make maps smaller than 20x15 but the null space needs to be drawn properly\r
- //if(isEMS()) printf("%d tesuto\n", coretotalEMS());\r
-//---- initMap(&map);\r
- mv.map = ↦\r
- mv2.map = ↦\r
- mv3.map = ↦\r
-\r
- /* draw the tiles */\r
- ptr = map.data;\r
- mappalptr = map.tiles->data->palette;\r
- /* data */\r
-//0000 printf("Total used @ before image loading: %zu\n", oldfreemem-GetFreeSize());\r
- ptmp = bitmapLoadPcx("data/ptmp.pcx"); // load sprite\r
- //npctmp = bitmapLoadPcx("ptmp1.pcx"); // load sprite\r
- \r
- /* create the planar buffer */\r
-//0000 printf("Total used @ before planar buffer creation: %zu\n", oldfreemem-GetFreeSize());\r
- p = planar_buf_from_bitmap(&ptmp);\r
-//0000 printf("Total used @ after planar buffer creation: %zu\n", oldfreemem-GetFreeSize());\r
-\r
- /*if(isEMS())\r
- {\r
- XMOVE mm;\r
- mm.length=sizeof(map);\r
- mm.sourceH=0;\r
- mm.sourceOff=(long)↦\r
- mm.destH=emmhandle;\r
- mm.destOff=1;\r
- //halp!\r
- ist = move_emem(&mm);\r
- printf("%d\n", coretotalEMS());\r
- if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
- //printf("%d\n", emmhandle);\r
- }\r
-\r
- if(isEMS())\r
- {\r
- XMOVE mm;\r
- mm.length=emmhandle;\r
- mm.sourceH=0;\r
- mm.sourceOff=(long)&ptmp;\r
- mm.destH=emmhandle;\r
- mm.destOff=0;\r
- //halp!\r
- ist = move_emem(&mm);\r
- printf("%d\n", coretotalEMS());\r
- if(!ist){ dealloc_emem(emmhandle); exit(5); }\r
- //printf("%d\n", emmhandle);\r
- }\r
-*/\r
-\r
- /* save the palette */\r
- dpal = modexNewPal();\r
- modexPalSave(dpal);\r
- modexFadeOff(4, dpal);\r
-\r
- setkb(1);\r
- modexEnter();\r
- modexPalBlack(); //reset the palette~\r
-// printf("Total used @ before palette initiation: %zu\n", oldfreemem-GetFreeSize());\r
- ptmp.offset=(paloffset/3);\r
- modexPalUpdate(&ptmp, &paloffset, 0, 0);\r
- //printf(" %d\n", sizeof(ptmp.data));\r
- //printf("1: %d\n", paloffset);\r
- map.tiles->data->offset=(paloffset/3);\r
- modexPalUpdate(map.tiles->data, &paloffset, 0, 0);\r
- printf("\n====\n");\r
- printf("0 paloffset= %d\n", paloffset/3);\r
- printf("====\n\n");\r
- gpal = modexNewPal();\r
- modexPalSave(gpal);\r
- modexSavePalFile("data/g.pal", gpal);\r
- modexPalBlack(); //so player will not see loadings~\r
-\r
- /* setup camera and screen~ */\r
- screen = modexDefaultPage();\r
- screen.width += (TILEWH*2);\r
- screen.height += (TILEWH*2)+QUADWH;\r
- mv.page = &screen;\r
- screen2 = modexNextPage(mv.page);\r
- mv2.page = &screen2;\r
- screen3 = screen2;\r
- mv3.page = &screen3;\r
-\r
- /* set up paging */\r
- bg = &mv;\r
- spri = &mv2;\r
- mask = &mv3;\r
-\r
-//TODO: LOAD map data and position the map in the middle of the screen if smaller then screen\r
- mapGoTo(bg, 0, 0);\r
- mapGoTo(spri, 0, 0);\r
- //mapGoTo(mask, 0, 0);\r
-\r
- //TODO: put player in starting position of spot\r
- //default player position on the viewable map\r
- player.tx = bg->tx + 10;\r
- player.ty = bg->ty + 8;\r
- player.x = player.tx*TILEWH;\r
- player.y = player.ty*TILEWH;\r
- player.triggerx = player.tx;\r
- player.triggery = player.ty+1;\r
- player.q=1;\r
- player.d=0;\r
- player.hp=4;\r
- //npc\r
- /*npc0.tx = bg->tx + 1;\r
- npc0.ty = bg->ty + 1;\r
- npc0.x = npc0.tx*TILEWH;\r
- npc0.y = npc0.ty*TILEWH;\r
- npc0.triggerx = npc0.tx;\r
- npc0.triggery = npc0.ty+1;\r
- npc0.q=1;\r
- npc0.d=0;\r
- modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 64, 24, 32, &npctmp);*/\r
- modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 64, 24, 32, &ptmp);\r
-\r
- //----modexClearRegion(spri->page, player.triggerx*16, player.triggery*16, 16, 16, 1);\r
- //----modexClearRegion(bg->page, player.triggerx*16, player.triggery*16, 16, 16, 1);\r
-\r
- //----modexClearRegion(spri->page, 5*16, 5*16, 16, 16, 255);\r
- //----modexClearRegion(bg->page, 5*16, 5*16, 16, 16, 255);\r
- modexShowPage(spri->page);\r
-// printf("Total used @ before loop: %zu\n", oldfreemem-GetFreeSize());\r
- modexFadeOn(4, gpal);\r
- while(!keyp(1) && player.hp>0)\r
- {\r
- //top left corner & bottem right corner of map veiw be set as map edge trigger since maps are actually square\r
- //to stop scrolling and have the player position data move to the edge of the screen with respect to the direction\r
- //when player.tx or player.ty == 0 or player.tx == 20 or player.ty == 15 then stop because that is edge of map and you do not want to walk of the map\r
- #define INC_PER_FRAME if(player.q&1) persist_aniframe++; if(persist_aniframe>4) persist_aniframe = 1;\r
- /*#define INC_PER_FRAME_NPC if(npc0.q&1) persist_aniframe++; if(persist_aniframe>4) persist_aniframe = 1;\r
-\r
- if(npc0.d == 0 && npc0.q == 1) npc0.d =rand()%8;\r
- if(npc0.d>4)\r
- npc0.d=0;\r
-\r
- //right movement\r
- if(npc0.d == 2)\r
- {\r
- if(npc0.tx < map.width && !(npc0.tx+1 == TRIGGX && npc0.ty == TRIGGY) && !(npc0.tx+1 == player.tx && npc0.ty == player.ty))\r
- {\r
- if(npc0.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME_NPC;\r
- npc0.x+=SPEED;\r
- //animatePlayer(bg, spri, mask, 1, 0, npc0.x, npc0.y, persist_aniframe, q, &npctmp);\r
- animatePlayer(bg, spri, npc0.d-1, 0, npc0.x, npc0.y, persist_aniframe, npc0.q, &npctmp);\r
- modexShowPage(spri->page);\r
- npc0.q++;\r
- } else { npc0.q = 1; npc0.d = 0; npc0.tx++; }\r
- }\r
- else\r
- {\r
- modexCopyPageRegion(spri->page, bg->page, npc0.x-4, npc0.y-TILEWH, npc0.x-4, npc0.y-TILEWH, 24, 32);\r
- modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 32, 24, 32, &npctmp);\r
- modexShowPage(spri->page);\r
- npc0.d = 0;\r
- }\r
- npc0.triggerx = npc0.tx+1;\r
- npc0.triggery = npc0.ty;\r
- }\r
-\r
- //left movement\r
- if(npc0.d == 4)\r
- {\r
- if(npc0.tx > 1 && !(npc0.tx-1 == TRIGGX && npc0.ty == TRIGGY) && !(npc0.tx-1 == player.tx && npc0.ty == player.ty))\r
- {\r
- if(npc0.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME_NPC;\r
- npc0.x-=SPEED;\r
- //animatePlayer(bg, spri, mask, 3, 0, npc0.x, npc0.y, persist_aniframe, q, &npctmp);\r
- animatePlayer(bg, spri, npc0.d-1, 0, npc0.x, npc0.y, persist_aniframe, npc0.q, &npctmp);\r
- modexShowPage(spri->page);\r
- npc0.q++;\r
- } else { npc0.q = 1; npc0.d = 0; npc0.tx--; }\r
- }\r
- else\r
- {\r
- modexCopyPageRegion(spri->page, bg->page, npc0.x-4, npc0.y-TILEWH, npc0.x-4, npc0.y-TILEWH, 24, 32);\r
- modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 96, 24, 32, &npctmp);\r
- modexShowPage(spri->page);\r
- npc0.d = 0;\r
- }\r
- npc0.triggerx = npc0.tx-1;\r
- npc0.triggery = npc0.ty;\r
- }\r
-\r
- //down movement\r
- if(npc0.d == 3)\r
- {\r
- if(npc0.ty < map.height && !(npc0.tx == TRIGGX && npc0.ty+1 == TRIGGY) && !(npc0.tx == player.tx && npc0.ty == player.ty+1))\r
- {\r
- if(npc0.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME_NPC;\r
- npc0.y+=SPEED;\r
- //animatePlayer(bg, spri, mask, 2, 0, npc0.x, npc0.y, persist_aniframe, q, &npctmp);\r
- animatePlayer(bg, spri, npc0.d-1, 0, npc0.x, npc0.y, persist_aniframe, npc0.q, &npctmp);\r
- modexShowPage(spri->page);\r
- npc0.q++;\r
- } else { npc0.q = 1; npc0.d = 0; npc0.ty++; }\r
- }\r
- else\r
- {\r
- modexCopyPageRegion(spri->page, bg->page, npc0.x-4, npc0.y-TILEWH, npc0.x-4, npc0.y-TILEWH, 24, 32);\r
- modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 64, 24, 32, &npctmp);\r
- modexShowPage(spri->page);\r
- npc0.d = 0;\r
- }\r
- npc0.triggerx = npc0.tx;\r
- npc0.triggery = npc0.ty+1;\r
- }\r
-\r
- //up movement\r
- if(npc0.d == 1)\r
- {\r
- if(npc0.ty > 1 && !(npc0.tx == TRIGGX && npc0.ty-1 == TRIGGY) && !(npc0.tx+1 == player.tx && npc0.ty == player.ty-1))\r
- {\r
- if(npc0.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME_NPC;\r
- npc0.y-=SPEED;\r
- //animatePlayer(bg, spri, mask, 0, 0, npc0.x, npc0.y, persist_aniframe, q, &npctmp);\r
- modexShowPage(spri->page);\r
- animatePlayer(bg, spri, npc0.d-1, 0, npc0.x, npc0.y, persist_aniframe, npc0.q, &npctmp);\r
- npc0.q++;\r
- } else { npc0.q = 1; npc0.d = 0; npc0.ty--; }\r
- }\r
- else\r
- {\r
- modexCopyPageRegion(spri->page, bg->page, npc0.x-4, npc0.y-TILEWH, npc0.x-4, npc0.y-TILEWH, 24, 32);\r
- modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 0, 24, 32, &npctmp);\r
- modexShowPage(spri->page);\r
- npc0.d = 0;\r
- }\r
- npc0.triggerx = npc0.tx;\r
- npc0.triggery = npc0.ty-1;\r
- }\r
-\r
- if((npc0.triggery == player.ty && npc0.triggerx == player.tx) || (npc0.ty == player.ty && npc0.tx == player.tx)){ player.hp--; }\r
-*/\r
-\r
- //player movement\r
- //TODO: make movement into a function!
- if(!panswitch){\r
- //right movement\r
- if((keyp(77) && !keyp(75) && player.d == 0) || player.d == 2)\r
- {\r
- if(player.d == 0){ player.d = 2; }\r
- if(bg->tx >= 0 && bg->tx+20 < map.width && player.tx == bg->tx + 10 && !(player.tx+1 == TRIGGX && player.ty == TRIGGY))\r
- {\r
- if(player.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME;\r
- //animatePlayer(bg, spri, mask, 1, 1, player.x, player.y, persist_aniframe, q, &ptmp);\r
- animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
- mapScrollRight(bg, SPEED);\r
- mapScrollRight(spri, SPEED);\r
- //mapScrollRight(mask, SPEED);\r
- modexShowPage(spri->page);\r
- player.q++;\r
- } else { player.q = 1; player.d = 0; player.tx++; }\r
- }\r
- else if(player.tx < map.width && !(player.tx+1 == TRIGGX && player.ty == TRIGGY))\r
- {\r
- if(player.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME;\r
- player.x+=SPEED;\r
- //animatePlayer(bg, spri, mask, 1, 0, player.x, player.y, persist_aniframe, q, &ptmp);\r
- animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
- modexShowPage(spri->page);\r
- player.q++;\r
- } else { player.q = 1; player.d = 0; player.tx++; }\r
- }\r
- else\r
- {\r
- modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);\r
- modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 32, 24, 32, &ptmp);\r
- modexShowPage(spri->page);\r
- player.d = 0;\r
- }\r
- player.triggerx = player.tx+1;\r
- player.triggery = player.ty;\r
- }\r
-\r
- //left movement\r
- if((keyp(75) && !keyp(77) && player.d == 0) || player.d == 4)\r
- {\r
- if(player.d == 0){ player.d = 4; }\r
- if(bg->tx > 0 && bg->tx+20 <= map.width && player.tx == bg->tx + 10 && !(player.tx-1 == TRIGGX && player.ty == TRIGGY))\r
- {\r
- if(player.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME;\r
- //animatePlayer(bg, spri, mask, 3, 1, player.x, player.y, persist_aniframe, q, &ptmp);\r
- animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
- mapScrollLeft(bg, SPEED);\r
- mapScrollLeft(spri, SPEED);\r
- //mapScrollLeft(mask, SPEED);\r
- modexShowPage(spri->page);\r
- player.q++;\r
- } else { player.q = 1; player.d = 0; player.tx--; }\r
- }\r
- else if(player.tx > 1 && !(player.tx-1 == TRIGGX && player.ty == TRIGGY))\r
- {\r
- if(player.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME;\r
- player.x-=SPEED;\r
- //animatePlayer(bg, spri, mask, 3, 0, player.x, player.y, persist_aniframe, q, &ptmp);\r
- animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
- modexShowPage(spri->page);\r
- player.q++;\r
- } else { player.q = 1; player.d = 0; player.tx--; }\r
- }\r
- else\r
- {\r
- modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);\r
- modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 96, 24, 32, &ptmp);\r
- modexShowPage(spri->page);\r
- player.d = 0;\r
- }\r
- player.triggerx = player.tx-1;\r
- player.triggery = player.ty;\r
- }\r
-\r
- //down movement\r
- if((keyp(80) && !keyp(72) && player.d == 0) || player.d == 3)\r
- {\r
- if(player.d == 0){ player.d = 3; }\r
- if(bg->ty >= 0 && bg->ty+15 < map.height && player.ty == bg->ty + 8 && !(player.tx == TRIGGX && player.ty+1 == TRIGGY))\r
- {\r
- if(player.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME;\r
- //animatePlayer(bg, spri, mask, 2, 1, player.x, player.y, persist_aniframe, q, &ptmp);\r
- animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
- mapScrollDown(bg, SPEED);\r
- mapScrollDown(spri, SPEED);\r
- //mapScrollDown(mask, SPEED);\r
- modexShowPage(spri->page);\r
- player.q++;\r
- } else { player.q = 1; player.d = 0; player.ty++; }\r
- }\r
- else if(player.ty < map.height && !(player.tx == TRIGGX && player.ty+1 == TRIGGY))\r
- {\r
- if(player.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME;\r
- player.y+=SPEED;\r
- //animatePlayer(bg, spri, mask, 2, 0, player.x, player.y, persist_aniframe, q, &ptmp);\r
- animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
- modexShowPage(spri->page);\r
- player.q++;\r
- } else { player.q = 1; player.d = 0; player.ty++; }\r
- }\r
- else\r
- {\r
- modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);\r
- modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 64, 24, 32, &ptmp);\r
- modexShowPage(spri->page);\r
- player.d = 0;\r
- }\r
- player.triggerx = player.tx;\r
- player.triggery = player.ty+1;\r
- }\r
-\r
- //up movement\r
- if((keyp(72) && !keyp(80) && player.d == 0) || player.d == 1)\r
- {\r
- if(player.d == 0){ player.d = 1; }\r
- if(bg->ty > 0 && bg->ty+15 <= map.height && player.ty == bg->ty + 8 && !(player.tx == TRIGGX && player.ty-1 == TRIGGY))\r
- {\r
- if(player.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME;\r
- //animatePlayer(bg, spri, mask, 0, 1, player.x, player.y, persist_aniframe, q, &ptmp);\r
- animatePlayer(bg, spri, player.d-1, 1, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
- mapScrollUp(bg, SPEED);\r
- mapScrollUp(spri, SPEED);\r
- //mapScrollUp(mask, SPEED);\r
- modexShowPage(spri->page);\r
- player.q++;\r
- } else { player.q = 1; player.d = 0; player.ty--; }\r
- }\r
- else if(player.ty > 1 && !(player.tx == TRIGGX && player.ty-1 == TRIGGY))\r
- {\r
- if(player.q<=(TILEWH/SPEED))\r
- {\r
- INC_PER_FRAME;\r
- player.y-=SPEED;\r
- //animatePlayer(bg, spri, mask, 0, 0, player.x, player.y, persist_aniframe, q, &ptmp);\r
- modexShowPage(spri->page);\r
- animatePlayer(bg, spri, player.d-1, 0, player.x, player.y, persist_aniframe, player.q, &ptmp);\r
- player.q++;\r
- } else { player.q = 1; player.d = 0; player.ty--; }\r
- }\r
- else\r
- {\r
- modexCopyPageRegion(spri->page, bg->page, player.x-4, player.y-TILEWH, player.x-4, player.y-TILEWH, 24, 32);\r
- modexDrawSpriteRegion(spri->page, player.x-4, player.y-TILEWH, 24, 0, 24, 32, &ptmp);\r
- modexShowPage(spri->page);\r
- player.d = 0;\r
- }\r
- player.triggerx = player.tx;\r
- player.triggery = player.ty-1;\r
- }\r
- //modexClearRegion(mask->page, 66, 66, 2, 40, 0);\r
-}else{
+/* Project 16 Source Code~
+ * Copyright (C) 2012-2015 sparky4 & pngwen & andrius4669
+ *
+ * This file is part of Project 16.
+ *
+ * Project 16 is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * Project 16 is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>, or
+ * write to the Free Software Foundation, Inc., 51 Franklin Street,
+ * Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ */
+
+#include "src/lib/scroll16.h"
+#include "src/lib/timer.h"
+#include "src/lib/wcpu/wcpu.h"
+
+//#define FADE
+#define MODEX //this is for mode x initiating
+
+//word far *clock= (word far*) 0x046C; /* 18.2hz clock */
+
+global_game_variables_t gvar;
+static map_t map;
+player_t player[MaxPlayers];
+//page_t screen, gvar.video.page[1], gvar.video.page[2];
+map_view_t mv[3];
+map_view_t *bg, *spri, *mask;//, *tmp;
+planar_buf_t *p;
+float t;
+sword bakapee;
+
+void main(int argc, char *argv[])
+{
+// word panswitch=0, panq=1, pand=0;
+ word panpagenum=0; //for panning!
+ unsigned int i;
+ const char *cpus;
+ //static int persist_aniframe = 0; /* gonna be increased to 1 before being used, so 0 is ok for default */
+
+ //map_view_db_t pgid[4];
+ word pg;
+//#ifdef FADE
+ static word paloffset=0;
+ byte *dpal, *default_pal;
+//#endif
+ byte *gpal;
+ byte *ptr;
+ byte *mappalptr;
+ byte *mesg=malloc(sizeof(dword));
+
+
+ if(argv[1]) bakapee = atoi(argv[1]);
+ else bakapee = 1;
+
+ player[0].persist_aniframe=0;
+ player[0].speed=4;
+
+ printf("starting timer\n");
+ start_timer(&gvar);
+ printf("ok\n");
+ //extern struct inconfig inpu;
+
+// atexit(qclean());
+
+ /* create the map */
+ fprintf(stderr, "testing map load~\n");
+ loadmap("data/test.map", &map);
+//0000 map.width=0;
+//0000 map.height=0;
+ chkmap(&map, 0);
+ printf("chkmap ok\n");
+ fprintf(stderr, "yay map loaded~~\n");
+ mv[0].map = ↦
+ mv[1].map = ↦
+ mv[2].map = ↦
+
+ /* draw the tiles */
+#ifdef MODEX
+ ptr = map.data;
+ mappalptr = map.tiles->data->palette;
+
+ /* data */
+ player[0].data = bitmapLoadPcx("data/ptmp.pcx"); // load sprite
+ //npctmp = bitmapLoadPcx("ptmp1.pcx"); // load sprite
+
+ /* create the planar buffer */
+ p = planar_buf_from_bitmap(&player[0].data);
+//0000 printf("planar buffer ok\n");
+#endif
+ /* input! */
+ IN_Startup();
+ IN_Default(0,&player,ctrl_Joystick);
+
+ /* save the palette */
+#ifdef MODEX
+#ifdef FADE
+ dpal = modexNewPal();
+ default_pal = modexNewPal();
+ *default_pal = *dpal;
+ modexPalSave(dpal);
+ modexFadeOff(4, dpal);
+#endif
+
+ textInit();
+ VGAmodeX(bakapee, &gvar);
+ printf("%dx%d\n", gvar.video.page[0].sw, gvar.video.page[0].sh);
+#ifdef FADE
+ modexPalBlack(); //reset the palette~
+#endif
+#endif
+// printf("Total used @ before palette initiation: %zu\n", oldfreemem-GetFreeSize());
+//++++ player[0].data.offset=(paloffset/3);
+//++++ modexPalUpdate(&player[0].data, &paloffset, 0, 0);
+ //printf(" %d\n", sizeof(ptmp->data));
+ //printf("1: %d\n", paloffset);
+//++++ map.tiles->data->offset=(paloffset/3);
+ //XTmodexPalUpdate(map.tiles->data, &paloffset, 0, 0);
+// printf("\n====\n");
+// printf("0 paloffset= %d\n", paloffset/3);
+// printf("====\n\n");
+#ifdef MODEX
+#ifdef FADE
+ gpal = modexNewPal();
+ modexPalSave(gpal);
+ modexSavePalFile("data/g.pal", gpal);
+ modexPalBlack(); //so player will not see loadings~
+#endif
+#endif
+
+ /* setup camera and screen~ */
+ gvar.video.page[0] = modexDefaultPage(&gvar.video.page[0]);
+ gvar.video.page[0].width += (TILEWH*2);
+ gvar.video.page[0].height += (TILEWH*2);//+QUADWH;
+ mv[0].page = &gvar.video.page[0];
+ gvar.video.page[1] = modexNextPage(mv[0].page);
+ mv[1].page = &gvar.video.page[1];
+ gvar.video.page[2] = modexNextPageFlexibleSize(mv[1].page, gvar.video.page[0].sw, gvar.video.page[0].sh); //(352*176)+1024 is the remaining amount of memory left wwww
+ //gvar.video.page[2] = modexNextPage0(mv2.page, 320, 192); //(352*176)+1024 is the remaining amount of memory left wwww
+ mv[2].page = &gvar.video.page[2];
+
+ /* set up paging */
+ bg = &mv[0];
+ spri = &mv[1];
+ mask = &mv[2];
+
+//TODO: LOAD map data and position the map in the middle of the screen if smaller then screen
+ mapGoTo(bg, 0, 0);
+ mapGoTo(spri, 0, 0);
+ //mapGoTo(mask, 0, 0);
+
+ //TODO: put player in starting position of spot
+ //default player position on the viewable map
+ player[0].tx = bg->tx + bg->page->tilemidposscreenx;
+ player[0].ty = bg->ty + bg->page->tilemidposscreeny;
+ player[0].x = player[0].tx*TILEWH;
+ player[0].y = player[0].ty*TILEWH;
+ player[0].triggerx = player[0].tx;
+ player[0].triggery = player[0].ty+1;
+/* player[0].info.x = player[0].tx;
+ player[0].info.xaxis = player[0].tx*TILEWH;
+ player[0].info.y = player[0].ty;
+ player[0].info.yaxis = player[0].ty*TILEWH;*/
+ player[0].q=1;
+ player[0].d=2;
+ player[0].hp=4;
+// player[0].persist_aniframe=0;
+ //npc
+ /*npc0.tx = bg->tx + 1;
+ npc0.ty = bg->ty + 1;
+ npc0.x = npc0.tx*TILEWH;
+ npc0.y = npc0.ty*TILEWH;
+ npc0.triggerx = npc0.tx;
+ npc0.triggery = npc0.ty+1;
+ npc0.q=1;
+ npc0.d=0;
+ modexDrawSpriteRegion(spri->page, npc0.x-4, npc0.y-TILEWH, 24, 64, 24, 32, &npctmp);*/
+ modexCopyPageRegion(mv[1].page, mv[0].page, 0, 0, 0, 0, mv[0].page->width, mv[0].page->height);
+#ifdef SPRITE
+#ifdef BMPTYPE
+ oldDrawBmp(VGA, player[0].x-4, player[0].y-TILEWH, &player[0].data, 1);
+#else
+ modexDrawSpriteRegion(spri->page, player[0].x-4, player[0].y-TILEWH, 24, 64, 24, 32, &player[0].data);
+#endif
+#else
+ modexClearRegion(mv[1].page, player[0].x-4, player[0].y-TILEWH, 24, 32, 15);
+#endif
+
+ modexShowPage(spri->page);
+ modexClearRegion(mv[2].page, 0, 0, mv[2].page->width, mv[2].page->height, 1);
+#ifdef MODEX
+#ifdef FADE
+ modexFadeOn(4, gpal);
+#endif
+#endif
+ while(!IN_KeyDown(sc_Escape) && player[0].hp>0)
+ {
+ shinku(mv, &gvar);
+ IN_ReadControl(0,&player);
+ //top left corner & bottem right corner of map veiw be set as map edge trigger since maps are actually square
+ //to stop scrolling and have the player position data move to the edge of the screen with respect to the direction
+ //when player[0].tx or player[0].ty == 0 or player[0].tx == 20 or player[0].ty == 15 then stop because that is edge of map and you do not want to walk of the map
+
+ //player movement
+ //if(!panswitch){
+ walk(mv, player, 0);
+ /*}else{