Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /////////////////////////////// RESOURCES.RES ///////////////////////////////
- PALETTE pal0 "2.png"
- PALETTE pal1 "1.png"
- IMAGE ip1 "1.png" NONE ALL
- /////////////////////////////// LEVELSTRUCTS.H ///////////////////////////////
- #ifndef _H_LEVEL_STRUCTS
- #define _H_LEVEL_STRUCTS
- #include <genesis.h>
- typedef struct {
- int property;
- } objproperties;
- typedef struct {
- s16 x;
- s16 y;
- u16 type;
- objproperties * props;
- bool triggered;
- const Image * img;
- u16 tile_index;
- int tilesize;
- int id;
- } SpawnEvent;
- #endif
- /////////////////////////////// NEWLEVEL.H ///////////////////////////////
- // Script autogenerated code. Doublecheck it
- #ifndef _H_LEVEL_NEWLEVEL
- #define _H_LEVEL_NEWLEVEL
- #include <genesis.h>
- #include "resources.h"
- #include "levelstructs.h"
- #define NEWLEVEL_NUMSPR 17
- extern objproperties element1_props;
- extern SpawnEvent spawn_events[NEWLEVEL_NUMSPR];
- void init_level_test(void);
- #endif
- /////////////////////////////// NEWLEVEL.C ///////////////////////////////
- // Script autogenerated code. Doublecheck it
- #include <genesis.h>
- #include "resources.h"
- #include "newlevel.h"
- objproperties newlevel_element1_props = { 0 };
- SpawnEvent spawn_events[NEWLEVEL_NUMSPR];
- void init_level_test(void)
- {
- const Image * newlevel_i1 = &ip1;
- spawn_events[0] = (SpawnEvent){ 488, 12, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 0 };
- spawn_events[1] = (SpawnEvent){ 41, 13, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 1 };
- spawn_events[2] = (SpawnEvent){ 65, 13, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 2 };
- spawn_events[3] = (SpawnEvent){ 85, 13, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 3 };
- spawn_events[4] = (SpawnEvent){ 110, 13, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 4 };
- spawn_events[5] = (SpawnEvent){ 130, 13, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 5 };
- spawn_events[6] = (SpawnEvent){ 148, 13, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 6 };
- spawn_events[7] = (SpawnEvent){ 171, 13, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 7 };
- spawn_events[8] = (SpawnEvent){ 193, 13, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 8 };
- spawn_events[9] = (SpawnEvent){ 362, 13, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 9 };
- spawn_events[10] = (SpawnEvent){ 236, 14, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 10 };
- spawn_events[11] = (SpawnEvent){ 263, 14, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 11 };
- spawn_events[12] = (SpawnEvent){ 295, 14, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 12 };
- spawn_events[13] = (SpawnEvent){ 315, 14, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 13 };
- spawn_events[14] = (SpawnEvent){ 343, 14, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 14 };
- spawn_events[15] = (SpawnEvent){ 411, 14, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 15 };
- spawn_events[16] = (SpawnEvent){ 436, 14, 1, &newlevel_element1_props, FALSE, newlevel_i1, 0, newlevel_i1->tileset->numTile, 16 };
- };
- /////////////////////////////// MAIN.C ///////////////////////////////
- #include <genesis.h>
- #include "resources.h"
- #include "newlevel.h"
- #define LEVEL_SCROLL_SPEED 1
- #define LEVEL_WIDTH 2047
- #define SCREEN_W 332
- #define EXIT_SCREEN_MARGIN 129
- #define MAP_W 128
- #define MAP_H 64
- u16 last_tile_index = TILE_USER_INDEX;
- TileSet * tilesetloaded[NEWLEVEL_NUMSPR]; // max is numspr in case that all are different
- u16 tilesetloadedindex[NEWLEVEL_NUMSPR]; // max is numspr in case that all are different
- s16 logicToPlaneX(s16 logicX, s16 planeWidthTiles);
- s16 logicToSequence(s16 logicX, s16 planeWidthTiles);
- void spawn_entity(s16 x, s16 y, u16 type, s16 property, Image * img);
- void setObjectVisible(SpawnEvent * evt);
- u16 spawn_event_count = 0;
- s16 scroll_x;
- u16 pal[16];
- int cont = 1;
- int grad[12];
- int bl =0;
- int size=0;
- ///////////////////////////////////////////////////////////////////////////////
- u16 randomColor() {
- setRandomSeed(random());
- u16 r = 1 & 0x0F; // 4 bits RED
- u16 g =0& 0x0F; // 4 bits GREEN
- u16 b = 0 & 0x0F; // 4 bits BLUE
- return (b << 8) | (g << 4) | r;
- }
- ///////////////////////////////////////////////////////////////////////////////
- void initgradient() {
- for(int i=1; i<12; i++) {
- u16 r = 0 & 0x0F; // 4 bits rojo
- u16 g = 0 & 0x0F; // 4 bits verde
- u16 b = 0 & 0x0F; // 4 bits azul
- grad[i] = (b << 8) | (g << 4) | r;
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- void shadow(int cont) {
- // Yes, grad[i] and initgradient is useless but remains here if anyone wants to play
- for(int i=0; i<12; i++) {
- PAL_setColor(i+16, grad[i]);
- }
- u16 color = RGB24_TO_VDPCOLOR(0xFF0000);
- PAL_setColor(16, color);
- color = RGB24_TO_VDPCOLOR(0x550000);;
- PAL_setColor(cont+16, color);
- color = RGB24_TO_VDPCOLOR(0x330000);;
- PAL_setColor(cont+17, color);
- color = RGB24_TO_VDPCOLOR(0x220000);;
- PAL_setColor(cont+18, color);
- color = RGB24_TO_VDPCOLOR(0x110000);;
- PAL_setColor(cont+19, color);
- }
- ///////////////////////////////////////////////////////////////////////////////
- HINTERRUPT_CALLBACK * HIntHandler() {
- // whatever....
- return NULL;
- }
- ///////////////////////////////////////////////////////////////////////////////
- void VIntHandler() {
- VDP_setHInterrupt(FALSE);
- // whateverforever
- VDP_setHInterrupt(TRUE);
- }
- ///////////////////////////////////////////////////////////////////////////////
- void init_sysints() {
- SYS_disableInts();
- {
- SYS_setVIntCallback(VIntHandler);
- SYS_setHIntCallback(HIntHandler);
- VDP_setHIntCounter(2);
- }
- SYS_enableInts();
- }
- ///////////////////////////////////////////////////////////////////////////////
- void check_spawn_events(s16 scroll_x, SpawnEvent * spawn_events) {
- spawn_event_count = sizeof(spawn_events) / sizeof(SpawnEvent);
- for (int i = 0; i < NEWLEVEL_NUMSPR; i++)
- {
- SpawnEvent* evt = (SpawnEvent*)&spawn_events[i];
- s16 rel_x = (evt->x*8) - scroll_x;
- if (!evt->triggered && rel_x >= -EXIT_SCREEN_MARGIN && rel_x <= SCREEN_W) {
- evt->triggered = TRUE;
- setObjectVisible(evt);
- }else if (evt->triggered && rel_x < -EXIT_SCREEN_MARGIN) {
- evt->triggered = FALSE;
- setObjectVisible(evt);
- }
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- s16 logicToPlaneX(s16 logicX, s16 planeWidthTiles) {
- return logicX % 129;
- }
- ///////////////////////////////////////////////////////////////////////////////
- s16 logicToSequence(s16 logicX, s16 planeWidthTiles) {
- return logicX / planeWidthTiles;
- }
- ///////////////////////////////////////////////////////////////////////////////
- void setObjectVisible(SpawnEvent * evt) {
- TileSet * ts = evt->img->tileset;
- TileMap * tm = evt->img->tilemap;
- int w = tm->w;
- int h = tm->h;
- s16 plane_x = logicToPlaneX(evt->x, MAP_W); // en tiles
- s16 plane_y = evt->y;
- if (evt->triggered ){
- bool loadtile=FALSE;
- for (int i=0;i<NEWLEVEL_NUMSPR;i++){
- if (tilesetloaded[i] == ts) {
- loadtile=TRUE;
- evt->tile_index = (u16)tilesetloadedindex[i];
- break;
- }
- }
- if (!loadtile){
- if (size<NEWLEVEL_NUMSPR){
- tilesetloaded[size] = evt->img->tileset;
- evt->tile_index = last_tile_index;
- last_tile_index += evt->tilesize;
- u16 ind = evt->tile_index;
- tilesetloadedindex[size] = ind;
- size++;
- }
- VDP_loadTileSet(ts, evt->tile_index, DMA_QUEUE);
- }
- if (evt->type != 1)
- VDP_setTileMapEx(BG_A,tm, TILE_ATTR_FULL(PAL0, FALSE,FALSE,FALSE,evt->tile_index), plane_x, plane_y-5, 0, 0, w, h, DMA_QUEUE);
- else
- VDP_setTileMapEx(BG_A,tm, TILE_ATTR_FULL(PAL1, FALSE,FALSE,FALSE,evt->tile_index), plane_x, plane_y-5, 0, 0, w, h, DMA_QUEUE);
- VDP_waitDMACompletion();
- } else {
- if (plane_x < 1)
- plane_x = 0;
- if (plane_y < 1)
- plane_y = 0;
- if (plane_x > MAP_W)
- plane_x = MAP_W;
- if (plane_y >MAP_H)
- plane_y = MAP_H;
- VDP_clearTileMapRect(BG_A, plane_x, plane_y-5, tm->w+5, tm->h+1);
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- void initTileMem(){
- for (int i = 0; i<NEWLEVEL_NUMSPR; i++){
- tilesetloaded[i] = NULL;
- tilesetloadedindex[i] = NULL; // max is numspr in case that all are different
- }
- }
- ///////////////////////////////////////////////////////////////////////////////
- int main() {
- VDP_init();
- VDP_setPlaneSize(MAP_W, 64,TRUE);
- VDP_setScreenWidth320();
- VDP_setScrollingMode(HSCROLL_PLANE, VSCROLL_PLANE);
- //VDP_drawText("Level Example", 10, 2);
- PAL_setPalette(PAL0, pal0.data , DMA);
- PAL_setPalette(PAL1, pal1.data , DMA);
- initgradient();
- init_level_test();
- initTileMem();
- init_sysints();
- spawn_event_count = sizeof(spawn_events) / sizeof(SpawnEvent);
- scroll_x = 0;
- spawn_events[0].tile_index = last_tile_index;
- for (int i = 1; i<NEWLEVEL_NUMSPR; i++){
- spawn_events[i].tile_index = spawn_events[i-1].tile_index + spawn_events[i-1].img->tileset->numTile;
- //KLog_S1("ti: ", spawn_events[i].tile_index);
- }
- int bl = 0;
- while(1)
- {
- if (bl %2== 0){
- cont = (cont + 1) % 12;
- if (cont == 0)cont=1;
- shadow(cont);
- }
- bl = (bl + 1)%10;
- scroll_x = (scroll_x + LEVEL_SCROLL_SPEED) % LEVEL_WIDTH;
- check_spawn_events(scroll_x, (SpawnEvent*)&spawn_events);
- VDP_setHorizontalScroll(BG_A,-(scroll_x));
- KLog_S2("CPU: ", SYS_getCPULoad(), " FPS: ", SYS_getFPS());
- SYS_doVBlankProcess();
- }
- return 0;
- }
Advertisement
Comments
-
- The code is mine despite being labeled Guest as the uploader. Nothing changes anyway. Aging is becoming worse on keeping agile on multiple user accounts, designs, devices... or just being idiot.
Add Comment
Please, Sign In to add comment