/*============================================================================ NuSYSTEM sample program SNAKE TAIL HACK map.c Copyright (C) 1997, NINTENDO Co,Ltd. ============================================================================*/ #include <assert.h> #include <nusys.h> #include "main.h" #include "graphic.h" #include "para.h" #include "./tuti.h" /*The texture for the map base*/ #include "./kabe.h" /*The object for the map base*/ #include "./saku.h" /*The object for the map base*/ /* 6:Once 7:Twice 8:Four times 9:Eight times 10:Sixteen times */ #define MAP_WRAP 9 #define MOV_WRAP 6 /*The position data of default of the map object*/ float ObjPosTbl[OBJ_MAX][3] = { { -BASE_MAX_SIZE/5*3, BASE_MAX_SIZE/5*3, 0.0 }, { 0.0, BASE_MAX_SIZE/5*3, 0.0 }, { BASE_MAX_SIZE/5*3, BASE_MAX_SIZE/5*3, 0.0 }, { -BASE_MAX_SIZE/5*3, 0.0, 0.0 }, { BASE_MAX_SIZE/5*3, 0.0, 0.0 }, { -BASE_MAX_SIZE/5*3, -BASE_MAX_SIZE/5*3, 0.0 }, { 0.0, -BASE_MAX_SIZE/5*3, 0.0 }, { BASE_MAX_SIZE/5*3, -BASE_MAX_SIZE/5*3, 0.0 }, { 0.0, 0.0, 10.0 } }; /*The vertex data of the game map*/ Vtx base_vtx[] = { { -BASE_MAX_SIZE,-BASE_MAX_SIZE, 0.0, 0, 31<<MAP_WRAP, 31<<MAP_WRAP, 0,0,127,0xff}, { BASE_MAX_SIZE,-BASE_MAX_SIZE, 0.0, 0, 00<<MAP_WRAP, 31<<MAP_WRAP, 0,0,127,0xff}, { BASE_MAX_SIZE, BASE_MAX_SIZE, 0.0, 0, 00<<MAP_WRAP, 00<<MAP_WRAP, 0,0,127,0xff}, { -BASE_MAX_SIZE, BASE_MAX_SIZE, 0.0, 0, 31<<MAP_WRAP, 00<<MAP_WRAP, 0,0,127,0xff}, }; void DrawMap( Dynamic* dynamicp ); void DrawMapSaku( Dynamic* dynamicp ); void DrawMapObj( Dynamic* ); void DrawMovie( Dynamic* dynamicp, unsigned short *); /*------------------------------*/ /* Draw the map base */ /* IN: dp The dynamic pointer */ /* RET:None */ /*------------------------------*/ void DrawMap( Dynamic* dp ) { /* The calculation of the model coordinate system */ guTranslate( &dp->base_trans, 0.0, 0.0, 0.0 ); guRotateRPY( &dp->base_rotate, 0.0, 0.0, 0.0 ); guScale( &dp->base_scale, 1.0, 1.0, 1.0 ); /* Setting of the model-matrix */ gSPMatrix(glistp++,OS_K0_TO_PHYSICAL(&(dp->base_trans)), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); gSPMatrix(glistp++,OS_K0_TO_PHYSICAL(&(dp->base_rotate)), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); gSPMatrix(glistp++,OS_K0_TO_PHYSICAL(&(dp->base_scale)), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); gDPSetCycleType(glistp++,G_CYC_1CYCLE); /* Clear and set up of geometry*/ gSPClearGeometryMode(glistp++,0xFFFFFFFF); gSPSetGeometryMode(glistp++, G_LIGHTING | G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH | G_CULL_BACK); gDPSetRenderMode(glistp++,G_RM_ZB_OPA_SURF, G_RM_ZB_OPA_SURF2); gDPSetColorDither(glistp++,G_CD_DISABLE); gDPSetCombineMode (glistp++,G_CC_DECALRGBA, G_CC_DECALRGBA); gDPSetTexturePersp (glistp++,G_TP_PERSP); gDPSetTextureLOD (glistp++,G_TL_TILE); gDPSetTextureFilter (glistp++,G_TF_POINT); gDPSetTextureConvert(glistp++,G_TC_FILT); gDPSetTextureLUT (glistp++,G_TT_NONE); gSPTexture(glistp++,0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON); /* Load the vertex */ gSPVertex(glistp++,&(base_vtx[0]), 4, 0); /* Read the texture*/ gDPLoadTextureBlock(glistp++, tuti, G_IM_FMT_RGBA, G_IM_SIZ_16b, 32, 32, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, 5, 5, G_TX_NOLOD, G_TX_NOLOD); /*Draw a quadrangle by two pieces of triangles */ gSP2Triangles(glistp++,0,1,2,0,0,2,3,0); gDPPipeSync(glistp++); } /*------------------------------*/ /* Draw the map fence */ /* IN: dp The dynamic pointer */ /* RET:None */ /*------------------------------*/ void DrawMapSaku( Dynamic* dp ) { /* The calculation of the model coordinate system */ guTranslate( &dp->saku_trans,0.0, -BASE_MAX_SIZE, 40.0); guRotateRPY( &dp->saku_rotate, 90.0, 0.0, 0.0 ); guScale( &dp->saku_scale, 0.33, 0.66, 0.33 ); /* Setting the model-matrix*/ gSPMatrix(glistp++,OS_K0_TO_PHYSICAL(&(dp->saku_trans)), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); gSPMatrix(glistp++,OS_K0_TO_PHYSICAL(&(dp->saku_rotate)), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); gSPMatrix(glistp++,OS_K0_TO_PHYSICAL(&(dp->saku_scale)), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); gDPSetRenderMode(glistp++,G_RM_AA_ZB_TEX_EDGE, G_RM_AA_ZB_TEX_EDGE2); gSPClearGeometryMode(glistp++,0xFFFFFFFF); gSPSetGeometryMode(glistp++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH | G_LIGHTING ); gDPSetCycleType(glistp++, G_CYC_1CYCLE); gDPSetCombineMode(glistp++,G_CC_DECALRGB, G_CC_DECALRGB); gSPDisplayList(glistp++,saku_mdl_model0); gDPPipeSync(glistp++); } /*--------------------------------------*/ /* Draw the object on the map */ /* IN: dp The dynamic pointer */ /* RET:None */ /*--------------------------------------*/ void DrawMapObj( Dynamic* dp ) { int idx; for(idx = 0; idx < 8; idx++){ /* The calculation of the model coordinate system */ guTranslate( &dp->obj_trans[idx], ObjPosTbl[idx][0], ObjPosTbl[idx][1], ObjPosTbl[idx][2]+120.0*OBJ_SCALE ); guScale( &dp->obj_scale[idx], OBJ_SCALE, OBJ_SCALE, OBJ_SCALE ); guRotateRPY( &dp->obj_rotate[idx], 0.0, 0.0, 0.0 ); /* Setting the model-matrix*/ gSPMatrix(glistp++,OS_K0_TO_PHYSICAL(&(dp->obj_trans[idx])), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); gSPMatrix(glistp++,OS_K0_TO_PHYSICAL(&(dp->obj_rotate[idx])), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); gSPMatrix(glistp++,OS_K0_TO_PHYSICAL(&(dp->obj_scale[idx])), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); gDPSetRenderMode(glistp++,G_RM_ZB_OPA_SURF, G_RM_ZB_OPA_SURF2); gSPClearGeometryMode(glistp++,0xFFFFFFFF); gSPSetGeometryMode(glistp++, G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH | G_LIGHTING | G_CULL_BACK); gDPSetCycleType(glistp++, G_CYC_1CYCLE); gDPSetCombineMode(glistp++,G_CC_DECALRGB, G_CC_DECALRGB); gSPDisplayList(glistp++,kabe_mdl_model0); gDPPipeSync(glistp++); } } Vtx movie_vtx[] = { { 0.0, MOVIE_SIZE, 0.0, 0, 31 << MOV_WRAP, 00 << MOV_WRAP, 0, 0, 127, 0xff}, { -MOVIE_SIZE, MOVIE_SIZE, 0.0, 0, 00 << MOV_WRAP, 00 << MOV_WRAP, 0, 0, 127, 0xff}, { -MOVIE_SIZE, 0.0, 0.0, 0, 00 << MOV_WRAP, 31 << MOV_WRAP, 0, 0, 127, 0xff}, { 0.0, 0.0, 0.0, 0, 31 << MOV_WRAP, 31 << MOV_WRAP, 0, 0, 127, 0xff}, { MOVIE_SIZE, MOVIE_SIZE, 0.0, 0, 63 << MOV_WRAP, 00 << MOV_WRAP, 0, 0, 127, 0xff}, { 0.0, MOVIE_SIZE, 0.0, 0, 32 << MOV_WRAP, 00 << MOV_WRAP, 0, 0, 127, 0xff}, { 0.0, 0.0, 0.0, 0, 32 << MOV_WRAP, 31 << MOV_WRAP, 0, 0, 127, 0xff}, { MOVIE_SIZE, 0.0, 0.0, 0, 63 << MOV_WRAP, 31 << MOV_WRAP, 0, 0, 127, 0xff}, { 0.0, 0.0, 0.0, 0, 31 << MOV_WRAP, 32 << MOV_WRAP, 0, 0, 127, 0xff}, { -MOVIE_SIZE, 0.0, 0.0, 0, 00 << MOV_WRAP, 32 << MOV_WRAP, 0, 0, 127, 0xff}, { -MOVIE_SIZE, -MOVIE_SIZE, 0.0, 0, 00 << MOV_WRAP, 63 << MOV_WRAP, 0, 0, 127, 0xff}, { 0.0, -MOVIE_SIZE, 0.0, 0, 31 << MOV_WRAP, 63 << MOV_WRAP, 0, 0, 127, 0xff}, { MOVIE_SIZE, 0.0, 0.0, 0, 63 << MOV_WRAP, 32 << MOV_WRAP, 0, 0, 127, 0xff}, { 0.0, 0.0, 0.0, 0, 32 << MOV_WRAP, 32 << MOV_WRAP, 0, 0, 127, 0xff}, { 0.0, -MOVIE_SIZE, 0.0, 0, 32 << MOV_WRAP, 63 << MOV_WRAP, 0, 0, 127, 0xff}, { MOVIE_SIZE, -MOVIE_SIZE, 0.0, 0, 63 << MOV_WRAP, 63 << MOV_WRAP, 0, 0, 127, 0xff}, }; /*--------------------------------------------------------------*/ /* Draw the movie part of the center of the map */ /* IN: dp The dynamic pointer *bmp The texture header address */ /* RET:None */ /*--------------------------------------------------------------*/ void DrawMovie( Dynamic* dp, unsigned short *bmp ) { /* The calculation of the model coordinate system */ guTranslate( &dp->obj_trans[8], 0.0, 0.0, 1.0 ); guRotateRPY( &dp->obj_rotate[8], 0.0, 0.0, 0.0 ); guScale( &dp->obj_scale[8], 1.0, 1.0, 1.0 ); /* Setting the model-matrix */ gSPMatrix(glistp++, OS_K0_TO_PHYSICAL(&(dp->obj_trans[8])), G_MTX_MODELVIEW | G_MTX_LOAD | G_MTX_NOPUSH); gSPMatrix(glistp++, OS_K0_TO_PHYSICAL(&(dp->obj_rotate[8])), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); gSPMatrix(glistp++, OS_K0_TO_PHYSICAL(&(dp->obj_scale[8])), G_MTX_MODELVIEW | G_MTX_MUL | G_MTX_NOPUSH); gDPSetCycleType(glistp++,G_CYC_1CYCLE); gSPClearGeometryMode(glistp++,0xFFFFFFFF); gSPSetGeometryMode(glistp++, G_LIGHTING | G_ZBUFFER | G_SHADE | G_SHADING_SMOOTH | G_CULL_BACK); /*Paste to the base by the decal mode*/ gDPSetRenderMode(glistp++,G_RM_AA_ZB_XLU_DECAL, G_RM_AA_ZB_XLU_DECAL2); gDPSetColorDither(glistp++,G_CD_DISABLE); gDPSetCombineMode (glistp++,G_CC_DECALRGBA, G_CC_DECALRGBA); gDPSetTexturePersp (glistp++,G_TP_PERSP); gDPSetTextureLOD (glistp++,G_TL_TILE); gDPSetTextureFilter (glistp++,G_TF_BILERP); gDPSetTextureConvert(glistp++,G_TC_FILT); gDPSetTextureLUT (glistp++,G_TT_NONE); gSPTexture(glistp++,0x8000, 0x8000, 0, G_TX_RENDERTILE, G_ON); /* Load vertex data */ gSPVertex(glistp++,&(movie_vtx[0]), 16, 0); /* Read the 64-dot X 64-dot texture by dividing into four */ /* In other words, read four pieces of 32-dot X 32-dot textures */ /* Read texture data (the upper-left part) */ gDPLoadTextureTile(glistp++, bmp, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 64, 0, 0, 31, 31, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_NOLOD, G_TX_NOLOD); gSP2Triangles(glistp++,0,1,2,0,0,2,3,0); /* Read texture data (the upper-right part) */ gDPLoadTextureTile(glistp++, bmp, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 64, 32, 0, 63, 31, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_NOLOD, G_TX_NOLOD); gSP2Triangles(glistp++,4,5,6,0,4,6,7,0); /* Read texture data (the bottom-left part) */ gDPLoadTextureTile(glistp++, bmp, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 64, 0, 32, 31, 63, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_NOLOD, G_TX_NOLOD); gSP2Triangles(glistp++,8,9,10,0,8,10,11,0); /* Read texture data (the bottom-right part) */ gDPLoadTextureTile(glistp++, bmp, G_IM_FMT_RGBA, G_IM_SIZ_16b, 64, 64, 32, 32, 63, 63, 0, G_TX_WRAP | G_TX_NOMIRROR, G_TX_WRAP | G_TX_NOMIRROR, 0, 0, G_TX_NOLOD, G_TX_NOLOD); gSP2Triangles(glistp++,12,13,14,0,12,14,15,0); gDPPipeSync(glistp++); }