From 677385ffdd1e330cfba4dd712ca58595feeea41d Mon Sep 17 00:00:00 2001 From: schneefux Date: Mon, 7 Oct 2013 14:11:24 +0200 Subject: initial commit --- draw.c | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 299 insertions(+) create mode 100644 draw.c (limited to 'draw.c') diff --git a/draw.c b/draw.c new file mode 100644 index 0000000..0235165 --- /dev/null +++ b/draw.c @@ -0,0 +1,299 @@ +#include "global.h" +#include "draw.h" +#include "sprites.h" +#include "hardware.h" +#include "key.h" +#include "syscalls.h" + +int drawfloor = FALSE, drawheight = TRUE, drawtex = TRUE; + +void horizontal(int y, int x1, int x2) +{ + int checker, i; + if(y&~63 || (x1<0 && x2<0) || (x1>127 && x2>127)) return; + if(x1 < 0) x1 = 0; + if(x2 > 127) x2 = 127; + if(x1>>3 != x2>>3) + { + vram[(y<<4)+(x1>>3)] |= 255 >> (x1&7); + vram[(y<<4)+(x2>>3)] |= 255 << 7-(x2&7); + for(i=(x1>>3)+1 ; i>3 ; i++) + vram[(y<<4) + i] = 255; + } + else vram[(y<<4)+(x1>>3)] |= (255>>(x1%8 + 7-x2%8))<<(7-(x2&7)); +} + +void fillbox(int x1, int y1, int x2, int y2) +{ + int i; + if(x1 > x2) + { + i = x1; + x1 = x2; + x2 = i; + } + if(y1 > y2) + { + i = y1; + y1 = y2; + y2 = i; + } + for(i=y1 ; i<=y2 ; i++) + horizontal(i, x1, x2); +} + +void locatePrintMini(int x, int y, const uchar *text) +{ + PrintMini((x - 2) * 6, (y - 2) * 8, text, 0); +} + +void drawgenmap() +{ + int x, y; + + for(x = 0; x < MAPSIZE; x++) + { + for(y = 0; y < MAPSIZE; y++) + { + if(map[x][y] == WALL || map[x][y] == CHECKED) + { + fillbox(x * sizex, y * sizey, (x + 1) * sizex, (y + 1) * sizey); + } + } + } +} + +void showmap() +{ + int x, y, exit = FALSE; + int windowx = player.x, windowy = player.x, zoom = 8; + const char plsprite = 0xA9; + int lastkey, thiskey = 0; + do + { + int skew = 64 / zoom; + + while(windowx + zoom * 2 >= MAPSIZE) + { + windowx--; + } + + clear_vram(); + + for(x = windowx; x < windowx + zoom * 2; x++) + { + for(y = windowy; y < windowy + zoom; y++) + { + if(map[x][y] != SPACE) + { + fillbox((x - windowx) * skew, (y - windowy) * skew, (x + 1 - windowx) * skew, (y + 1 - windowy) * skew); + switch(map[x][y]) + { + case WALL: break; + case DOOR: + PrintMini((x - windowx) * skew, (y - windowy) * skew, "I", MINI_OVER); + break; + } + } + else if(x == (int)player.x && y == (int)player.y) + { + PrintMini((player.x - windowx) * skew + 1, (player.y - windowy) * skew, &plsprite, MINI_OVER); + } + } + } + + for(x = 0; x < spritecnt; x++) + { + if(sprites[x].x >= windowx && sprites[x].x < windowx + zoom * 2 && sprites[x].y >= windowy && sprites[x].y < windowy + zoom) + { + switch(sprites[x].type) + { + case TYPE_ENEMY: + PrintMini((sprites[x].x - windowx) * skew, (sprites[x].y - windowy) * skew, "!", MINI_OVER); + break; + case TYPE_PACK: + PrintMini((sprites[x].x - windowx) * skew, (sprites[x].y - windowy) * skew, "+", MINI_OVER); + break; + } + } + } + + display_vram(); + + keyupdate(); + + if(lastkey != thiskey) + { + Sleep(500); + } + else if(lastkey == thiskey) + { + Sleep(125); + } + + lastkey = thiskey; + + if(keydown(KEY_CTRL_EXIT))exit = TRUE; + if(keydown(KEY_CTRL_UP) && windowy > 0) + { + windowy--; + thiskey = KEY_CTRL_UP; + } + if(keydown(KEY_CTRL_DOWN) && windowy + zoom < MAPSIZE) + { + windowy++; + thiskey = KEY_CTRL_DOWN; + } + if(keydown(KEY_CTRL_LEFT) && windowx > 0) + { + windowx--; + thiskey = KEY_CTRL_LEFT; + } + if(keydown(KEY_CTRL_RIGHT) && windowx + zoom * 2 < MAPSIZE) + { + windowx++; + thiskey = KEY_CTRL_RIGHT; + } + if(keydown(KEY_CHAR_PLUS) && zoom > 1) + { + zoom--; + thiskey = KEY_CHAR_PLUS; + } + if(keydown(KEY_CHAR_MINUS) && zoom < MAPSIZE / 2) + { + zoom++; + thiskey = KEY_CHAR_MINUS; + } + }while(exit == FALSE); +} + +void drawgun() +{ + int i,u; + + const int y = 47 + player.gunpos; + + for(i = 0; i < 21; i++) + { + for(u = 0; u < 22; u++) + { + if(y + u <= 64) + { + switch(player.weapon) + { + case GUN: + if(gun[u][i] == 1) + { + (*(vram + ((y + u) << 4) + ((54 + i) >> 3))) |= (128 >> ((54 + i) & 7)); + } + else + { + if(gun[u][i] == 2) + { + (*(vram + ((y + u) << 4) + ((54 + i) >> 3))) &= ( ~ (128 >> ((54 + i) & 7))); + } + } + break; + + case KNIFE: + if(knife[u][i] == 1) + { + (*(vram + ((y + u) << 4) + ((54 + i) >> 3))) |= (128 >> ((54 + i) & 7)); + } + else + { + if(knife[u][i] == 2) + { + (*(vram + ((y + u) << 4) + ((54 + i) >> 3))) &= ( ~ (128 >> ((54 + i) & 7))); + } + } + break; + } + } + } + } +} + +void vertical(int x, int tex, int start, int end, int type, int color, float steps) +{ + int y = start; + int pos = 1 << 7, step; + + uchar xbyte = x & 7; + uchar shiftbyte = (128 >> xbyte); + uchar *buffpos = (unsigned char*)(vram + (x >> 3)); + + if(drawtex == FALSE && type == 1) + { + if(start > end) + { + int tmp = start; + start = end; + end = tmp; + } + if(start < 0) start = 0; + if(end > 63) end = 63; + + for(;start < end; start++) + pixel(x,start); + } + + if(start > end) + { + int tmp = start; + start = end; + end = tmp; + } + + switch(type) + { + case 1 : + if(steps == 0) + step = (16 << 8) / (end - start); + else + step = (16.0 / steps) * 128.0; + + for(; y < end;pos += step, y++) + { + if(wall[color][pos >> 8][(int)(tex >> 2)] == 1) + (*(buffpos + (y << 4))) |= ((1 << 7) >> xbyte); + /*else + (*(buffpos + (y << 4))) &= ~((1 << 7) >> xbyte);*/ + } + break; + + case 2 : + if(steps == 0) + step = (16 << 8) / (end - start); + else + step = (16.0 / steps) * 128.0; + + for(; y < end;pos += step, y ++) + { + (*(buffpos + (y << 4))) |= ((door[pos >> 8][(int)(tex >> 2)] << 7) >> xbyte); + } + break; + + case 3 : + if(steps == 0) + step = (8 << 8) / (end - start); + else + step = (8.0 / steps) * 128.0; + + for(; y < end;pos += step, y ++) + { + if(pack[pos >> 8][(int)(tex >> 3)] == 1) + { + (*(buffpos + (y << 4))) |= shiftbyte; + } + else + { + if(pack[pos >> 8][(int)(tex >> 3)] == 2) + { + (*(buffpos + (y << 4))) &= ( ~shiftbyte); + } + } + } + break; + } +} -- cgit v1.3.1