From cecbe84f7c61a26fa2285fc125839b2ff50a7f51 Mon Sep 17 00:00:00 2001 From: sparky4 Date: Wed, 12 Apr 2017 13:20:47 -0500 Subject: [PATCH] p16 is being worked on a bunch by me wwww [16_ca needs huge amounts of work and I should remember what needs to be done soon][OpenVGMFile needs to be ported to 16_snd.c]going to port rest of code to borland c some time so we can use the core components of id engine here [going to add 16_us.c eventually but the debug system and CA_ PM_ and MM_ usage is priority now]older zcroll renamed to xcroll][zcroll is now the pre menu game loop system with PROPER data usage with CAMMPM] MM_ShowMemory is quite buggy on real machines. i need to debug it and fix added a struct printer[gvar.mm is FUCKING HUGE 14402 bytes FAT\!]16_rf now compiles BT UNKNOWN ON WHAT IT DOSE\! text box done --- 1croll.exe | Bin 0 -> 48784 bytes data/G.PAL | Bin 768 -> 768 bytes makefile | 2 +- ptmp.pcx | Bin 0 -> 5047 bytes src/lib/16_tail.h | 7 +- src/lib/16_tail_.c | 1 + src/lib/16_tdef.h | 1 + src/lib/16_timer.c | 4 - src/lib/16_vl.c | 13 ++- src/lib/16_vl.h | 2 + src/lib/16_vl_2.c | 118 ++++++++++++++++++++ src/lib/scroll16.c | 271 ++++++++++++++++++++++++++++++++------------- src/lib/scroll16.h | 47 +------- src/xcroll.c | 3 +- 14 files changed, 335 insertions(+), 134 deletions(-) create mode 100755 1croll.exe create mode 100755 ptmp.pcx create mode 100755 src/lib/16_vl_2.c diff --git a/1croll.exe b/1croll.exe new file mode 100755 index 0000000000000000000000000000000000000000..beb750e10bff701c878770117947e1dcc1df9742 GIT binary patch literal 48784 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 literal 0 HcmV?d00001 diff --git a/data/G.PAL b/data/G.PAL index 8092380af954e11b165eae773d83f03429619756..eb359e82a594533d6532f55e134770124ae84393 100755 GIT binary patch literal 768 ccmZQzV6bNZ0(%eyArJv#je^k-7y%&w0JG@=^#A|> literal 768 zcmZQz00UMTMh;abZao=UHCcIkH8p*6HCZ5GuP>`_Zf zuz<7b?)lqa5=spb5R^DD1laldJGZ8HX6Z#1>fgAK zVyI%W_Kvi1y#r2_e6Gc)V(@*q%1v?CqQHnDG2n%@lkdW$3mdUgC5I&wL2d=~Vda+C zCY`)}z*purbPQzx)1FCD~G+Fv=oJiu7P5>Q?ul;aC} zew>|ySC_%%s!5EjHpEmgnU2wyDU?O>kwYzumZ9K>qFi!Hr3WtPc<#)l^K1i$h0i69 z0Q}17}A9$qt_-D6wVEM`p1|vX%$4N8UxN+Ecz7$)#*Oz>@gJH#D zbdk2i5S+La5NU^a5wy~7XTm4;%*V;^ELvN(UCXtPH++e*RMg6F>qf^<(&Hz`qg#v0 zF0O&h_N_}JZs>?_;cG&^9sS7P#wq-VzwcQ34?JB*^y^@V!uL*b%U0(ulhU$COZAm& zi9@k26)zcxlX`MRhoe-i)RUxV9h^eFHR^zBk9rO;Oj6CWtO?S=i)9=_8&?x4HKVtZ zlZ}{znb8TXT7)U}67%IUb=4Zt8a02e7UB1?dg#Nd9mfq0=aMHhA>NW?UP<~U%C%dI1N2rxqKQB#Z& z#-23{{<;D2H~vWWPs-M>4Lj_=X2FQ*Fj zRHnu3%1H+XNJllEmIc3tN>frXEslzDY_6eB%khyR3J>XvA-C=bUM#}tb#^f8h6{L< z3bWrj3-A+vgQ+x=;HYfnWmQyd;s>It?X)b;(n-M|md1j;MY6QA10wcA>c2SZ~L52()-KDlp6 zU4i9m_CDLBLu^c)t!M+0zzz{Y_v}<7?so6VyFyUdKvQw1U?UN^4(jpj^l4f=J$-h> zv3xW_$Fc44D>n|svw2#~pV6Qq1lzv@a|xkw8FODm;7CWi z+{_zu&x&Dn1XqVu4t0b8IYU&ohAnugB;t}Xc~?oaG^t;6DIuUiehFVL;-#B4vg{(d zuR5hKa${TdDypafFlp^(>(Bz#4_o^lXr|p^W75%biIrwEM+@srL2ld{osgPzY#N2a zit2v!%@T*|>Fz|xM)>Jgk;vYPFBBBGbDWJ41^1oVJW7=yL~JA{huA^h3;p0ZDx zGdNkvKY$&|&4p@Joj~z5$~a)XS2+NRc&NakhHAEel=z+U7ct>FN76Nrmu3T6z zk8L^Rz`v6|8v!lJ1T=suJ+d2Eaz#O9!7d1vdSrsO#Rw}$*jq;CrN^W0Dk^wlN)W@7 zTy~7ac94z6MT2VO*8-FS;n@3Y2GaQh0(@x(at4+90GY}D(m6eIK@{u>+*S0VVFGFa z%Kz~IX1a3WJ&a7u(!$;{s)l+lnt?}B)8g7SaZK?r^3dHIxd-khF!bU zK%syv-exPSD3(ynoXR88{)yfYNY>d@9IcqkpI8AwUiMXFD^*CGa0JMR!9*X$LcX13 zZhnnPQ4vUjN^=$4j+xhC4u>CA+?AysM%YN61oPTVl=EIf!}ykxL#1)_Dvfr4CYri@ zjH8J2RkN7uJx2w8QVGGp*UD1Od@Vjt|K(pVU%Iz{ICE!T|8Diy tuYZ&N_}dSE`~CU(`M2li|4D!T=k4v?hugcmyZ!%5{M`C^2mX(D;J@bqMKeyboard[sc_T]){ gvar.video.vga_state.rss=!gvar.video.vga_state.rss; IN_UserInput(1, &gvar); } \ if(gvar.in.inst->Keyboard[sc_P]){ modexpdump(&gvar.video.page[0]); IN_UserInput(1, &gvar); } \ if(gvar.in.inst->Keyboard[sc_Y]){ dbg_delayanimation=!dbg_delayanimation; IN_UserInput(1, &gvar); } \ + if(gvar.in.inst->Keyboard[sc_Q]){ VL_modexPrintTextBox(&gvar); IN_UserInput(1, &gvar); } \ RFDEBUGFUNCTIONS //FIZZLEFADEFUNCTION @@ -111,13 +112,13 @@ if(gvar.in.inst->Keyboard[sc_X]){ TESTBG12 } \ if(gvar.in.inst->Keyboard[sc_C]){ TESTBG34 } \ if(gvar.in.inst->Keyboard[sc_V]){ VL_PatternDraw(&gvar.video, 0, 1, 1); } \ - if(gvar.in.inst->Keyboard[sc_I]){ dbg_maptext=!dbg_maptext; IN_UserInput(1, &gvar); } -/* if(gvar.in.inst->Keyboard[sc_PgDn]){ \ + if(gvar.in.inst->Keyboard[sc_I]){ dbg_maptext=!dbg_maptext; IN_UserInput(1, &gvar); } \ + if(gvar.in.inst->Keyboard[sc_PgDn]){ \ rotateR(gvar.video.palette, sizeof(gvar.video.palette)/sizeof(gvar.video.palette[0])); \ VL_UpdatePaletteWrite(&gvar.video.palette, 0); IN_UserInput(1, &gvar); } \ if(gvar.in.inst->Keyboard[sc_PgUp]){ \ rotateL(gvar.video.palette, sizeof(gvar.video.palette)/sizeof(gvar.video.palette[0])); \ - VL_UpdatePaletteWrite(&gvar.video.palette, 0); IN_UserInput(1, &gvar); }*/ + VL_UpdatePaletteWrite(&gvar.video.palette, 0); IN_UserInput(1, &gvar); } #ifdef __BORLANDC__ #define PAL_WRITE_REG 0x03C8 /* Color register, write address */ #define PAL_DATA_REG 0x03C9 /* Color register, data port */ diff --git a/src/lib/16_tail_.c b/src/lib/16_tail_.c index 10ef7395..a21780c0 100755 --- a/src/lib/16_tail_.c +++ b/src/lib/16_tail_.c @@ -39,5 +39,6 @@ void TL_VidInit(global_game_variables_t *gvar) //in.h.ah = 0xf; //int86(0x10, &in, &out); if(!gvar->video.old_mode) gvar->video.old_mode = vgaGetMode();//out.h.al; + VL_LoadPalFileCore(gvar->video.palette); gvar->video.VL_Initiated = 1; } diff --git a/src/lib/16_tdef.h b/src/lib/16_tdef.h index 6321841d..341ada31 100755 --- a/src/lib/16_tdef.h +++ b/src/lib/16_tdef.h @@ -430,6 +430,7 @@ typedef struct int tx,ty; //appears to be the top left tile position on the viewable screen map word dxThresh,dyThresh; //Threshold for physical tile switch video_t *video; //pointer to game variables of the video + kurokku_t *kurokku; //pointer to game variables of the kurokku nibble __near *p; // pointer to video's render page num nibble __near *sp; // pointer to video's show page num int dx, dy; // draw row and col var diff --git a/src/lib/16_timer.c b/src/lib/16_timer.c index a9dba5d5..c5aae485 100755 --- a/src/lib/16_timer.c +++ b/src/lib/16_timer.c @@ -65,10 +65,6 @@ double time_in_seconds(global_game_variables_t *gv) return (gv->kurokku.t) / CLOCKS_PER_SEC; } -// big global status text buffer -char global_temp_status_text[512]; -char global_temp_status_text2[512]; - /*double time_in_seconds(time_t in_t) { return (in_t) / CLOCKS_PER_SEC; diff --git a/src/lib/16_vl.c b/src/lib/16_vl.c index 91776466..24e3342e 100755 --- a/src/lib/16_vl.c +++ b/src/lib/16_vl.c @@ -364,7 +364,8 @@ modexShowPage(page_t *page) { //args: page, vertical sync switch, screen resolution switch, page0 switch void -VL_ShowPage(page_t *page, boolean vsync, boolean sr) { +VL_ShowPage(page_t *page, boolean vsync, boolean sr) +{ word high_address, low_address, offset; byte crtcOffset; @@ -402,6 +403,7 @@ VL_ShowPage(page_t *page, boolean vsync, boolean sr) { outp(AC_INDEX, 0x33); outp(AC_INDEX, (page->dx & 0x03) << 1); vga_state.vga_graphics_ram = (VGA_RAM_PTR)page->data; + vga_state.vga_draw_stride_limit = vga_state.vga_draw_stride = page->stridew; } //============================================================================= @@ -694,10 +696,15 @@ modexLoadPalFile(byte *filename, byte *palette) { fclose(file); } - void VL_LoadPalFile(const char *filename, byte *palette) { - VL_LoadPalFilewithoffset(filename, palette, 0); + VL_LoadPalFilewithoffset(filename, palette, 8); + VL_LoadPalFileCore(palette); +} + +void VL_LoadPalFileCore(byte *palette) +{ + VL_LoadPalFilewithoffset("data/16.pal", palette, 0); } void VL_LoadPalFilewithoffset(const char *filename, byte *palette, word o) diff --git a/src/lib/16_vl.h b/src/lib/16_vl.h index 962593c7..3cfa4347 100755 --- a/src/lib/16_vl.h +++ b/src/lib/16_vl.h @@ -193,6 +193,7 @@ void modexPalSave(byte *palette); //byte *modexNewPal(); void modexLoadPalFile(char *filename, byte *palette); void VL_LoadPalFile(const char *filename, byte *palette); +void VL_LoadPalFileCore(byte *palette); void VL_LoadPalFilewithoffset(const char *filename, byte *palette, word o); void VL_UpdatePaletteWrite(byte *palette, word o); void modexSavePalFile(char *filename, byte *palette); @@ -242,6 +243,7 @@ static inline byte modexreadPixel(page_t *page, int x, int y, word addr) void modexDrawChar(page_t *page, int x/*for planar selection only*/, word t, word col, word bgcol, word addr); void modexprint(page_t *page, sword x, sword y, word t, boolean tlsw, word col, word bgcol, boolean sw, const byte *str); void modexprintbig(page_t *page, word x, word y, word t, word col, word bgcol, const byte *str); +void VL_modexPrintTextBox(global_game_variables_t *gvar); void modexpdump(page_t *pee); void modexcls(page_t *page, byte color, byte *Where); void VL_PatternDraw(video_t *video, word pn, boolean sw, boolean allsw); diff --git a/src/lib/16_vl_2.c b/src/lib/16_vl_2.c new file mode 100755 index 00000000..68bbe443 --- /dev/null +++ b/src/lib/16_vl_2.c @@ -0,0 +1,118 @@ +/* Project 16 Source Code~ + * Copyright (C) 2012-2017 sparky4 & pngwen & andrius4669 & joncampbell123 & yakui-lover + * + * 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 , or + * write to the Free Software Foundation, Inc., 51 Franklin Street, + * Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include +#include +#include +#include "src/lib/16_vl.h" + +// big global status text buffer +char global_temp_status_text[512]; +char global_temp_status_text2[512]; + +#define PRINTTEXTBOXSTABLE + +void VL_modexPrintTextBox(global_game_variables_t *gvar) +{ +#define PRINTTEXTBOXW gvar->video.page[0].width +#define PRINTTEXTBOXH 160 +#define PRINTTEXTBOXHLINE 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD//, 0xCD, 0xCD, 0xCD, 0xCD +#define PRINTTEXTBOXHLINETOP 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCB, 0xCD, PRINTTEXTBOXHLINE +#define PRINTTEXTBOXHLINEBOTTOM 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCD, 0xCA, 0xCD, PRINTTEXTBOXHLINE +#define PRINTTEXTBOXSLINE 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20//, 0x20, 0x20, 0x20, 0x20 +#define PRINTTEXTBOXSTRA2CHAR 0x20//07 +#define PRINTTEXTBOXSTRA2STR PRINTTEXTBOXSTRA2CHAR, PRINTTEXTBOXSTRA2CHAR, PRINTTEXTBOXSTRA2CHAR, PRINTTEXTBOXSTRA2CHAR, PRINTTEXTBOXSTRA2CHAR, PRINTTEXTBOXSTRA2CHAR, PRINTTEXTBOXSTRA2CHAR, PRINTTEXTBOXSTRA2CHAR + byte str1[41] = { 0xC9, PRINTTEXTBOXHLINETOP, 0xBB, 0x00 }; +#ifdef PRINTTEXTBOXSTABLE + byte str2[41] = { 0xBA, PRINTTEXTBOXSTRA2STR, 0xBA, PRINTTEXTBOXSLINE, 0xBA, 0x00 }; +#else + byte str2[2] = { 0xBA, 0x00 }, + stra2[7] = { PRINTTEXTBOXSTRA2STR, 0x00 }, + strb2[] = { 0xBA, PRINTTEXTBOXSLINE, 0xBA, 0x00 }; +#endif + byte str3[41] = { 0xC8, PRINTTEXTBOXHLINEBOTTOM, 0xBC, 0x00 }; + word x = gvar->video.page[/*!*/(gvar->video.p)].dx; //(gv->video.page[(gv->video.p)].tlx) - // follow the screen + word y = gvar->video.page[/*!*/(gvar->video.p)].dy; //(gv->video.page[(gv->video.p)].tly) - // follow the screen + word col = 3, bgcol = 0, type = 1;//w = 64, h = 8, + word v = gvar->video.page[0].height-PRINTTEXTBOXH; //vertical offset + nibble i; + boolean done; + ScanCode scan; +#ifndef PRINTTEXTBOXSTABLE + word q; +#endif + //backuppart + modexCopyPageRegion(&gvar->video.page[0], &gvar->video.page[2], + 0, + 0, + x, + PRINTTEXTBOXH, + PRINTTEXTBOXW, PRINTTEXTBOXH); +// mxOutText(xpos+1, ypos+gvar.video.page[0].height-40, "| |Chikyuu:$line1"); +// mxOutText(xpos+1, ypos+gvar.video.page[0].height-32, "| |$line2"); +// mxOutText(xpos+1, ypos+gvar.video.page[0].height-24, "| |$line3"); +// mxOutText(xpos+1, ypos+gvar.video.page[0].height-16, "| |$line4"); +// mxOutText(xpos+1, ypos+gvar.video.page[0].height-8, "========================================"); + + //modexprint(*page, x, y, type, tlsw, color, bgcolor, sw, *str) + sprintf(global_temp_status_text, "%s", str1); + modexprint(&(gvar->video.page[(gvar->video.p)]), x, y+gvar->video.page[0].height-v, type, 1, col, bgcol, 1, global_temp_status_text); v-=8; +#ifdef PRINTTEXTBOXSTABLE + sprintf(global_temp_status_text, "%s", str2); for(i=0;i<8;i++) +{ modexprint(&(gvar->video.page[(gvar->video.p)]), x, y+gvar->video.page[0].height-v, type, 1, col, bgcol, 1, global_temp_status_text); v-=8; } +#else + for(i=0;i<8;i++) + { + q=0; + sprintf(global_temp_status_text, "%s", str2); modexprint(&(gvar->video.page[(gvar->video.p)]), x, y+gvar->video.page[0].height-v, type, 1, col, bgcol, 1, global_temp_status_text); q+=8; + sprintf(global_temp_status_text, "%s", stra2); modexprint(&(gvar->video.page[(gvar->video.p)]), x+q, y+gvar->video.page[0].height-v, type, 1, col, 3, 1, global_temp_status_text); q+=40; + sprintf(global_temp_status_text, "%s", strb2); modexprint(&(gvar->video.page[(gvar->video.p)]), x+q-8, y+gvar->video.page[0].height-v, type, 1, col, bgcol, 1, global_temp_status_text); + v-=8; + } +#endif + sprintf(global_temp_status_text, "%s", str3); + modexprint(&(gvar->video.page[(gvar->video.p)]), x, y+gvar->video.page[0].height-v, type, 1, col, bgcol, 1, global_temp_status_text); + for (i = 0,done = false;!done;) + { + while (!(scan = gvar->in.inst->LastScan)) + {} +// SD_Poll(); + + IN_ClearKey(scan); + switch (scan) + { + default: + case sc_Escape: + done = true; + break; + case sc_Enter: + //PM_GetPage(i, gvar); + break; + } + } + modexCopyPageRegion(&gvar->video.page[2], &gvar->video.page[0], + x, + PRINTTEXTBOXH, + 0, + 0, + PRINTTEXTBOXW, PRINTTEXTBOXH); +} diff --git a/src/lib/scroll16.c b/src/lib/scroll16.c index 249d0b3d..94338ab7 100755 --- a/src/lib/scroll16.c +++ b/src/lib/scroll16.c @@ -24,7 +24,111 @@ */ #include "src/lib/scroll16.h" +//check map edge +boolean ZCL_mapEdgeChk(map_view_t *map_v, nibble dir, int tx, int ty, boolean pansw, boolean noscrollsw) +{ + int w,h; + + switch (pansw) + { + case 0: + w = map_v[0].map->width; + h = map_v[0].map->height; + break; + case 1: + w = map_v[0].page->ti.tilesw; + h = map_v[0].page->ti.tilesh; + break; + } + + switch(dir) + { + default://no direction + case 2: + //0000pip[0].video->startclk = (*clockw); + return false; + break; + //right movement + case 3: + if(noscrollsw) return tx < map_v[0].map->width; + else return (map_v[0].tx >= 0 && map_v[0].tx+map_v[0].page->ti.tw < w); + break; + //left movement + case 1: + if(noscrollsw) return tx > 1; + else return (map_v[0].tx > 0 && map_v[0].tx+map_v[0].page->ti.tw <= w); + break; + //down movement + case 4: + if(noscrollsw) return ty < map_v[0].map->height; + else return (map_v[0].ty >= 0 && map_v[0].ty+map_v[0].page->ti.th < h); + break; + //up movement + case 0: + if(noscrollsw) return ty > 1; + else return (map_v[0].ty > 0 && map_v[0].ty+map_v[0].page->ti.th <= h); + break; + } + return false; +} + +boolean ZCL_CollCheck(map_view_t *map_v, nibble dir, int tx, int ty) +{ + switch (dir) + { + default://no direction + case 2: + break; + case 3://right + return !(map_v[0].map->layerdata[0].data[(tx)+(map_v[0].map->width*(ty-1))] == 0); + break; + case 1://left + return !(map_v[0].map->layerdata[0].data[(tx-2)+(map_v[0].map->width*(ty-1))] == 0); + break; + case 4://down + return !(map_v[0].map->layerdata[0].data[(tx-1)+(map_v[0].map->width*(ty))] == 0); + break; + case 0://up + return !(map_v[0].map->layerdata[0].data[(tx-1)+(map_v[0].map->width*(ty-2))] == 0); + break; + } + return false; +} + +boolean ZCL_ScreenMidPosChk(map_view_t *map_v, nibble dir, int tx, int ty) +{ + if(ZCL_mapEdgeChk(map_v, dir, 0, 0, 0, 0)) + switch(dir) + { + default://no direction + case 2: + //0000map_v[0].video->startclk = (*clockw); + return false; + break; + //right movement + case 3: + return tx == map_v[0].tx+map_v[0].page->ti.tilemidposscreenx; + break; + //left movement + case 1: + return tx == map_v[0].tx+map_v[0].page->ti.tilemidposscreenx; + break; + //down movement + case 4: + return ty == map_v[0].ty+map_v[0].page->ti.tilemidposscreeny; + break; + //up movement + case 0: + return ty == map_v[0].ty+map_v[0].page->ti.tilemidposscreeny; + break; + } + return false; +} + //#define INC_PER_FRAME if(player[pn].enti.q&1) player[pn].enti.persist_aniframe++; if(player[pn].enti.persist_aniframe>4) player[pn].enti.persist_aniframe = 1; +#ifdef OLDWALKSHOWPAGESTUFF +#define SHOWMVFUN__ ZC_ShowMV(pip, 1, 0); +#endif void ZC_walk(map_view_t *pip, player_t *player, word pn) { @@ -36,8 +140,8 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) break; //right movement case 3: - if(ZC_mapEdgeChk(pip, player[pn].enti.d, 0) && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx && - !(pip[0].map->layerdata[0].data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY)) //collision detection! + if(ZCL_ScreenMidPosChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty) && + ZCL_CollCheck(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY)) //collision detection! { player[pn].walktype=2; if(player[pn].enti.q<=player[pn].enti.spt) @@ -46,9 +150,13 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) ZC_mapScroll(pip, player, pn); player[pn].enti.q++; //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; } } - else if(player[pn].enti.tx < pip[0].map->width && !(pip[0].map->layerdata[0].data[(player[pn].enti.tx)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY)) + else if(ZCL_mapEdgeChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty, 0, 1) && + ZCL_CollCheck(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty))//!(player[pn].enti.tx+1 == TRIGGX && player[pn].enti.ty == TRIGGY)) { player[pn].walktype=1; if(player[pn].enti.q<=player[pn].enti.spt) @@ -56,6 +164,9 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) player[pn].enti.x+=(player[pn].enti.speed); ZC_animatePlayer(pip, player, pn); player[pn].enti.q++; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx++; } } else @@ -63,14 +174,17 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) player[pn].walktype=0; ZC_animatePlayer(pip, player, pn); player[pn].enti.d = 2; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } player[pn].enti.triggerx = player[pn].enti.tx+1; player[pn].enti.triggery = player[pn].enti.ty; break; //left movement case 1: - if(ZC_mapEdgeChk(pip, player[pn].enti.d, 0) && player[pn].enti.tx == pip[0].tx+pip[0].page->ti.tilemidposscreenx && - !(pip[0].map->layerdata[0].data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY)) //collision detection! + if(ZCL_ScreenMidPosChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty) && + ZCL_CollCheck(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY)) //collision detection! { player[pn].walktype=2; if(player[pn].enti.q<=player[pn].enti.spt) @@ -79,9 +193,13 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) ZC_mapScroll(pip, player, pn); player[pn].enti.q++; //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; } } - else if(player[pn].enti.tx > 1 && !(pip[0].map->layerdata[0].data[(player[pn].enti.tx-2)+(pip[0].map->width*(player[pn].enti.ty-1))] == 0))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY)) + else if(ZCL_mapEdgeChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty, 0, 1) && + ZCL_CollCheck(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty))//!(player[pn].enti.tx-1 == TRIGGX && player[pn].enti.ty == TRIGGY)) { player[pn].walktype=1; if(player[pn].enti.q<=player[pn].enti.spt) @@ -89,6 +207,9 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) player[pn].enti.x-=(player[pn].enti.speed); ZC_animatePlayer(pip, player, pn); player[pn].enti.q++; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.tx--; } } else @@ -96,14 +217,17 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) player[pn].walktype=0; ZC_animatePlayer(pip, player, pn); player[pn].enti.d = 2; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } player[pn].enti.triggerx = player[pn].enti.tx-1; player[pn].enti.triggery = player[pn].enti.ty; break; //down movement case 4: - if(ZC_mapEdgeChk(pip, player[pn].enti.d, 0) && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny && - !(pip[0].map->layerdata[0].data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY)) //collision detection! + if(ZCL_ScreenMidPosChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty) && + ZCL_CollCheck(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY)) //collision detection! { player[pn].walktype=2; if(player[pn].enti.q<=player[pn].enti.spt) @@ -112,9 +236,13 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) ZC_mapScroll(pip, player, pn); player[pn].enti.q++; //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; } } - else if(player[pn].enti.ty < pip[0].map->height && !(pip[0].map->layerdata[0].data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY)) + else if(ZCL_mapEdgeChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty, 0, 1) && + ZCL_CollCheck(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty+1 == TRIGGY)) { player[pn].walktype=1; if(player[pn].enti.q<=player[pn].enti.spt) @@ -122,6 +250,9 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) player[pn].enti.y+=(player[pn].enti.speed); ZC_animatePlayer(pip, player, pn); player[pn].enti.q++; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty++; } } else @@ -129,14 +260,17 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) player[pn].walktype=0; ZC_animatePlayer(pip, player, pn); player[pn].enti.d = 2; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } player[pn].enti.triggerx = player[pn].enti.tx; player[pn].enti.triggery = player[pn].enti.ty+1; break; //up movement case 0: - if(ZC_mapEdgeChk(pip, player[pn].enti.d, 0) && player[pn].enti.ty == pip[0].ty+pip[0].page->ti.tilemidposscreeny && - !(pip[0].map->layerdata[0].data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY)) //collision detection! + if(ZCL_ScreenMidPosChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty) && + ZCL_CollCheck(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY)) //collision detection! { player[pn].walktype=2; if(player[pn].enti.q<=player[pn].enti.spt) @@ -145,9 +279,13 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) ZC_mapScroll(pip, player, pn); player[pn].enti.q++; //0000pip[0].video->clk = ((*clockw)-pip[0].video->startclk)/18.2; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; } } - else if(player[pn].enti.ty > 1 && !(pip[0].map->layerdata[0].data[(player[pn].enti.tx-1)+(pip[0].map->width*(player[pn].enti.ty-2))] == 0))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY)) + else if(ZCL_mapEdgeChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty, 0, 1) && + ZCL_CollCheck(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty))//!(player[pn].enti.tx == TRIGGX && player[pn].enti.ty-1 == TRIGGY)) { player[pn].walktype=1; if(player[pn].enti.q<=player[pn].enti.spt) @@ -155,6 +293,9 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) player[pn].enti.y-=(player[pn].enti.speed); ZC_animatePlayer(pip, player, pn); player[pn].enti.q++; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } else { player[pn].enti.q = 1; player[pn].enti.d = 2; player[pn].enti.ty--; } } else @@ -162,6 +303,9 @@ void ZC_walk(map_view_t *pip, player_t *player, word pn) player[pn].walktype=0; ZC_animatePlayer(pip, player, pn); player[pn].enti.d = 2; +#ifdef OLDWALKSHOWPAGESTUFF + SHOWMVFUN__ +#endif } player[pn].enti.triggerx = player[pn].enti.tx; player[pn].enti.triggery = player[pn].enti.ty-1; @@ -178,7 +322,7 @@ void ZC_panPageManual(map_view_t *pip, player_t *player, word pn) { //right movement case 3: - if(ZC_mapEdgeChk(pip, player[pn].enti.d, 1)) + if(ZCL_mapEdgeChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty, 1, 0)) { if(player[pn].enti.q<=player[pn].enti.spt) { @@ -191,7 +335,7 @@ void ZC_panPageManual(map_view_t *pip, player_t *player, word pn) //left movement case 1: - if(ZC_mapEdgeChk(pip, player[pn].enti.d, 1)) + if(ZCL_mapEdgeChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty, 1, 0)) { if(player[pn].enti.q<=player[pn].enti.spt) { @@ -204,7 +348,7 @@ void ZC_panPageManual(map_view_t *pip, player_t *player, word pn) //down movement case 4: - if(ZC_mapEdgeChk(pip, player[pn].enti.d, 1)) + if(ZCL_mapEdgeChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty, 1, 0)) { if(player[pn].enti.q<=player[pn].enti.spt) { @@ -217,7 +361,7 @@ void ZC_panPageManual(map_view_t *pip, player_t *player, word pn) //up movement case 0: - if(ZC_mapEdgeChk(pip, player[pn].enti.d, 1)) + if(ZCL_mapEdgeChk(pip, player[pn].enti.d, player[pn].enti.tx, player[pn].enti.ty, 1, 0)) { if(player[pn].enti.q<=player[pn].enti.spt) { @@ -238,11 +382,12 @@ void ZC_MVSetup(map_view_t *pip, map_t *map, global_game_variables_t *gv) #define ZC_MVI 1 nibble i; // 1st page - pip[0].page = &gv->video.page[0]; - pip[0].map = map; - pip[0].video = &gv->video; - pip[0].p = &gv->video.p; - pip[0].sp = &gv->video.sp; + pip[0].page = &gv->video.page[0]; + pip[0].map = map; + pip[0].video = &gv->video; + pip[0].kurokku = &gv->kurokku; + pip[0].p = &gv->video.p; + pip[0].sp = &gv->video.sp; ZC_MVInit(pip, 1, 1); for(i=ZC_MVI;ivideo.num_of_pages;i++) @@ -269,43 +414,7 @@ void ZC_MVInit(map_view_t *pip, int tx, int ty) void ZC_ShowMV(map_view_t *moo, boolean vsync, boolean sr) { - word high_address, low_address, offset; - byte crtcOffset; - - // calculate offset - offset = (word) moo[moo[0].video->sp].page->data; - offset += moo[0].page->dy * (moo[0].page->width >> 2 ); - offset += moo[0].page->dx >> 2; - - // calculate crtcOffset according to virtual width - switch(sr) - { - case 1: - crtcOffset = moo[moo[0].video->sp].page->sw >> 3; - break; - default: - case 0: - crtcOffset = moo[0].page->width >> 3; - break; - } - - high_address = HIGH_ADDRESS | (offset & 0xff00); - low_address = LOW_ADDRESS | (offset << 8); - - // wait for appropriate timing and then program CRTC - if(vsync) while ((inp(INPUT_STATUS_1) & DISPLAY_ENABLE)); - outpw(CRTC_INDEX, high_address); - outpw(CRTC_INDEX, low_address); - outp(CRTC_INDEX, 0x13); - outp(CRTC_DATA, crtcOffset); - - // wait for one retrace - if(vsync) while (!(inp(INPUT_STATUS_1) & VRETRACE)); - - // do PEL panning here - outp(AC_INDEX, 0x33); - outp(AC_INDEX, (moo[0].page->dx & 0x03) << 1); - vga_state.vga_draw_stride_limit = vga_state.vga_draw_stride = moo[0].page->stridew; + VL_ShowPage(moo[0].page, vsync, sr); } #if 0 @@ -384,7 +493,7 @@ void near mapScrollRight(map_view_t *mv, player_t *player, word id, word plid) /* draw the next column */ x= mv[0].page->sw + mv[0].map->tiles->tileWidth; - if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0)) + if(ZCL_mapEdgeChk(mv, player[plid].enti.d, player[plid].enti.tx, player[plid].enti.ty, 0, 0)) #ifndef FULLRCREND if(player[plid].enti.q%4) #else @@ -407,7 +516,7 @@ void near mapScrollLeft(map_view_t *mv, player_t *player, word id, word plid) /* draw the next column */ x= 0; - if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0)) + if(ZCL_mapEdgeChk(mv, player[plid].enti.d, player[plid].enti.tx, player[plid].enti.ty, 0, 0)) #ifndef FULLRCREND if(player[plid].enti.q%4) #else @@ -430,7 +539,7 @@ void near mapScrollUp(map_view_t *mv, player_t *player, word id, word plid) /* draw the next row */ y= 0; - if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0)) + if(ZCL_mapEdgeChk(mv, player[plid].enti.d, player[plid].enti.tx, player[plid].enti.ty, 0, 0)) #ifndef FULLRCREND if(player[plid].enti.q%3) #else @@ -453,7 +562,7 @@ void near mapScrollDown(map_view_t *mv, player_t *player, word id, word plid) /* draw the next row */ y= mv[0].page->sh + mv[0].map->tiles->tileHeight; - if(ZC_mapEdgeChk(mv, player[plid].enti.d, 0)) + if(ZCL_mapEdgeChk(mv, player[plid].enti.d, player[plid].enti.tx, player[plid].enti.ty, 0, 0)) #ifndef FULLRCREND if(player[plid].enti.q%3) #else @@ -776,22 +885,8 @@ void shinku(global_game_variables_t *gv) }else //copy dat sheet gv->kurokku.tiku++; - switch(gv->kurokku.fpscap) - { - case 0: //turn this off if XT - //modexprint(&(gv->video.page[0]), x, y+8, type, 1, col, bgcol, "sanic!"); - gv->kurokku.frames_per_second=1; - break; - case 1: - //modexWaitBorder(); - //modexWaitBorder_start(); - //vga_wait_for_vsync(); - vga_wait_for_vsync_end(); - gv->kurokku.frames_per_second=60; - break; - } //render!! - if(gv->video.dorender ) + if(gv->video.dorender) {//r=1 /*if(video->bgp s) { @@ -799,10 +894,30 @@ void shinku(global_game_variables_t *gv) }else{ //modexCopyPageRegion(&video->page[0], &video->page[1], enti->x, enti->y, 0, 0, 24, 32); }*/ +#ifndef OLDWALKSHOWPAGESTUFF VL_ShowPage(&(gv->video.page[gv->video.sp]), gv->kurokku.fpscap, 0); +#endif gv->video.dorender =!gv->video.dorender; //0000gv->video.tickclk = ((*clockw)-gv->video.startclk)/18.2; } + + switch(gv->kurokku.fpscap) + { + case 0: //turn this off if XT + //modexprint(&(gv->video.page[0]), x, y+8, type, 1, col, bgcol, "sanic!"); + gv->kurokku.frames_per_second=1; + break; + case 1: +#ifdef OLDWALKSHOWPAGESTUFF + //modexWaitBorder(); + //modexWaitBorder_start(); +#else + vga_wait_for_vsync(); + //vga_wait_for_vsync_end(); +#endif + gv->kurokku.frames_per_second=60; + break; + } PM_NextFrame(gv); } @@ -942,6 +1057,8 @@ void player_walk(player_t *player, map_view_t *map_v){ * end */ + + void mapScroll(map_view_t *mv, player_t *player) { //word x, y; /* coordinate for drawing */ diff --git a/src/lib/scroll16.h b/src/lib/scroll16.h index f7887686..546fbe29 100755 --- a/src/lib/scroll16.h +++ b/src/lib/scroll16.h @@ -42,6 +42,8 @@ #define SPRITE //#define TILERENDER +#define SHOWFPS +//#define OLDWALKSHOWPAGESTUFF #define PLAYERBMPDATAVAR gvar.player[pn].data #define PLAYERBMPDATA *PLAYERBMPDATAVAR @@ -204,51 +206,6 @@ boolean ZC_walk2(entity_t *ent, map_view_t *map_v); // Move gvar.player around and call map scrolling if required/possible void walk_player(player_t *player, map_view_t *map_v); -//check map edge -inline boolean ZC_mapEdgeChk(map_view_t *map_v, nibble dir, boolean pansw) -{ - int w,h; - - switch (pansw) - { - case 0: - w = map_v[0].map->width; - h = map_v[0].map->height; - break; - case 1: - w = map_v[0].page->ti.tilesw; - h = map_v[0].page->ti.tilesh; - break; - } - - switch(dir) - { - //no direction - default: - case 2: - //0000pip[0].video->startclk = (*clockw); - return false; - break; - //right movement - case 3: - if(map_v[0].tx >= 0 && map_v[0].tx+map_v[0].page->ti.tw < w) return true; - break; - //left movement - case 1: - if(map_v[0].tx > 0 && map_v[0].tx+map_v[0].page->ti.tw <= w) return true; - break; - //down movement - case 4: - if(map_v[0].ty >= 0 && map_v[0].ty+map_v[0].page->ti.th < h) return true; - break; - //up movement - case 0: - if(map_v[0].ty > 0 && map_v[0].ty+map_v[0].page->ti.th <= h) return true; - break; - } - return false; -} - // Scroll map in one direction (assumed from gvar.player's movement) void mapScroll(map_view_t *mv, player_t *player); diff --git a/src/xcroll.c b/src/xcroll.c index bbfe552d..2fd95869 100755 --- a/src/xcroll.c +++ b/src/xcroll.c @@ -26,7 +26,7 @@ #include "src/lib/16_dbg.h" #define FADE -#define NOMAPLOAD +//#define NOMAPLOAD //map_view_t mv[4]; static map_t map; @@ -161,6 +161,7 @@ void main(int argc, char *argv[]) { gvar.video.page[0].tlx=gvar.mv[0].tx*TILEWH; gvar.video.page[0].tly=gvar.mv[0].ty*TILEWH; + modexWaitBorder(); shinku(&gvar); //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 gvar.player position data move to the edge of the screen with respect to the direction -- 2.39.5