├── .gitignore ├── DirectXUTYs ├── D2_Polygon.CPP ├── D2_Polygon.H ├── D3_TEX.CPP ├── D3_TEX.H ├── DD_CLIP2D.CPP ├── DD_CLIP2D.H ├── DD_GRP2D.CPP ├── DD_GRP2D.H ├── DD_GRP3D.CPP ├── DD_GRP3D.H ├── DD_UTY.CPP ├── DD_UTY.H ├── DI_UTY.CPP ├── DI_UTY.H ├── DS_UTY.CPP ├── DS_UTY.H ├── DX_ERROR.C ├── DX_ERROR.H ├── DX_TYPE.H ├── PBGMIDI.C ├── PBGMIDI.H ├── PBGUTY_X.H ├── UT_MATH.C └── UT_MATH.H ├── ECLC ├── Calc.cpp ├── Calc.h ├── Eclc.cpp ├── Eclcdef.h └── converter.cpp ├── GIAN07 ├── BOMBEFC.CPP ├── BOMBEFC.H ├── BOSS.CPP ├── BOSS.H ├── DEMOPLAY.CPP ├── DEMOPLAY.H ├── ECL.H ├── ECL_LEN.H ├── EFFECT.CPP ├── EFFECT.H ├── EFFECT3D.CPP ├── EFFECT3D.H ├── ENDING.CPP ├── ENDING.H ├── ENEMY.CPP ├── ENEMY.H ├── EXDEF.H ├── EnemyExCtrl.cpp ├── EnemyExCtrl.h ├── FONTUTY.CPP ├── FONTUTY.H ├── FRAGMENT.CPP ├── FRAGMENT.H ├── GAMEMAIN.CPP ├── GAMEMAIN.H ├── GIAN.CPP ├── GIAN.H ├── HOMINGL.CPP ├── HOMINGL.H ├── ITEM.CPP ├── ITEM.H ├── LASER.CPP ├── LASER.H ├── LENS.CPP ├── LENS.H ├── LLASER.CPP ├── LLASER.H ├── LOADER.CPP ├── LOADER.H ├── MAID.CPP ├── MAID.H ├── MAIDTAMA.CPP ├── MAIDTAMA.H ├── PRankCtrl.cpp ├── PRankCtrl.h ├── PaletteEX.cpp ├── PaletteEx.h ├── SCL.H ├── SCORE.CPP ├── SCORE.H ├── SCROLL.CPP ├── SCROLL.H ├── TAMA.CPP ├── TAMA.H ├── WindowCtrl.cpp ├── WindowCtrl.h ├── WindowSys.cpp └── WindowSys.h ├── LICENSE ├── MAIN └── MAIN.CPP ├── MapEdit2 ├── GrpUty.cpp ├── GrpUty.h ├── Main.cpp ├── MapEdit.cpp └── MapEdit.h ├── README.md └── SCLC ├── Calc.cpp ├── Calc.h └── converter.cpp /.gitignore: -------------------------------------------------------------------------------- 1 | # Prerequisites 2 | *.d 3 | 4 | # Compiled Object files 5 | *.slo 6 | *.lo 7 | *.o 8 | *.obj 9 | 10 | # Precompiled Headers 11 | *.gch 12 | *.pch 13 | 14 | # Compiled Dynamic libraries 15 | *.so 16 | *.dylib 17 | *.dll 18 | 19 | # Fortran module files 20 | *.mod 21 | *.smod 22 | 23 | # Compiled Static libraries 24 | *.lai 25 | *.la 26 | *.a 27 | *.lib 28 | 29 | # Executables 30 | *.exe 31 | *.out 32 | *.app 33 | -------------------------------------------------------------------------------- /DirectXUTYs/D2_Polygon.CPP: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* D2_Polygon.cpp 8ビット時のポリゴン描画 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "D2_Polygon.h" 7 | #include "DD_CLIP2D.h" 8 | 9 | 10 | static LINE_WORK TZOID_A,TZOID_B; 11 | 12 | static FINT DrawTrapezoid(int y,int dy); // 台形の描画 13 | 14 | 15 | 16 | // ポリゴンの描画 // 17 | FVOID _2DPolygon(POINT *p,int n) 18 | { 19 | int i,j,dy; 20 | int nLeft,nRight; 21 | int TopY,BottomY; 22 | POINT temp[100]; 23 | 24 | switch(i=Grp_PClip(temp,p,n)){ 25 | case(0): // 完全に外側 26 | return; 27 | 28 | case(-1): // 完全に内側 29 | break; 30 | 31 | default: // クリッピングがかかった 32 | n = i; 33 | p = temp; 34 | break; 35 | } 36 | 37 | if(n<=2) return; 38 | 39 | 40 | // 頂点サーチ // 41 | TopY = BottomY = p[n-1]. y; 42 | nLeft = nRight = n-1; 43 | for(i=n-2; i>=0; i--){ 44 | if(p[i].y == TopY){ 45 | nLeft = i; 46 | } 47 | else if(p[i].y > TopY){ 48 | // 一番下にある点のY座標を更新 49 | if(BottomY < p[i].y) BottomY = p[i].y; 50 | } 51 | else{ 52 | // 一番上にある点のY座標を更新 53 | nRight = i; 54 | nLeft = i; 55 | TopY = p[i].y; 56 | } 57 | } 58 | 59 | if(nRight==0 && nLeft==n-1){ 60 | nLeft = 0; 61 | nRight = n-1; 62 | } 63 | 64 | //if(nLeft==nRight) n2 = n-1; 65 | //else n2 = n-2; 66 | 67 | i = (nLeft-1 < 0) ? (n-1) : nLeft-1; 68 | SetLineWork(&TZOID_A, p[nLeft ].x, p[i].x, p[i].y-p[nLeft ].y); 69 | j = (nRight+1 > n-1) ? 0 : nRight+1; 70 | SetLineWork(&TZOID_B, p[nRight].x, p[j].x, p[j].y-p[nRight].y); 71 | 72 | // 描画ループ // 73 | while(TopY0*/){ 74 | //i = (nLeft-1 < 0) ? (n-1) : nLeft-1; 75 | //j = (nRight+1 > n-1) ? 0 : nRight+1; 76 | 77 | if(p[i].y < p[j].y) dy = p[i].y-TopY; 78 | else dy = p[j].y-TopY; 79 | 80 | //Key_Read(); 81 | //if(Key_Data&KEY_TAMA) return; 82 | 83 | TopY = DrawTrapezoid(TopY,dy); 84 | 85 | 86 | if(p[i].y <= TopY){ 87 | // 左側(TZOID_A)を更新する必要がある場合 // 88 | nLeft = i;//(nLeft-1 < 0) ? (n-1) : nLeft-1; 89 | i = (nLeft-1 < 0) ? (n-1) : nLeft-1; 90 | SetLineWork(&TZOID_A, p[nLeft ].x, p[i].x, p[i].y-p[nLeft ].y); 91 | //n2--; 92 | } 93 | if(p[j].y <= TopY){ 94 | // 右側(TZOID_B)を更新する必要がある場合 // 95 | nRight = j;//(nRight+1 > n-1) ? 0 : nRight+1; 96 | j = (nRight+1 > n-1) ? 0 : nRight+1; 97 | SetLineWork(&TZOID_B, p[nRight].x, p[j].x, p[j].y-p[nRight].y); 98 | //n2--; 99 | } 100 | } 101 | } 102 | 103 | extern BYTE *Grp_Vram; // これは公開しない 104 | extern long Grp_Pitch; // これも公開しない 105 | extern DWORD Grp_AddrY[480]; // Y座標テーブル 106 | extern DWORD Col2D; 107 | 108 | 109 | // 横ラインを引く // 110 | static PVOID GrpHLineX(int x1,int x2,int y) 111 | { 112 | int temp; 113 | if(x1>x2) temp = x1,x1 = x2,x2 = temp; 114 | if(x1<0) x1 = 0; 115 | if(x2>639) x2 = 639; 116 | //if(y<0 || y>479) return; 117 | //if(y<0) y = 0; 118 | //if(y>479) y = 479; 119 | 120 | 121 | _asm{ 122 | PUSH EDI // EDI 保存 123 | 124 | MOV EDI,Grp_Vram 125 | JZ HL_END // NULL チェック(高速化のために外す?) 126 | 127 | LEA EBX,Grp_AddrY 128 | MOV EAX,y // EAX = y 129 | SHL EAX,2 // EAX = y*4 (DWORD) 130 | ADD EBX,EAX // EBX = Grp_AddrY+y(DD) 131 | MOV EAX,[EBX] // EAX = Grp_AddrY[y] 132 | 133 | ADD EDI,EAX // EDI := Vram + Grp_AddrY[y] 134 | MOV EBX,x1 // EBX := x1 135 | MOV ECX,x2 // ECX := x2 136 | SUB ECX,EBX // ECX := x2 - x1 137 | ADD EDI,EBX // EDI := Vram + Grp_AddrY[y] + x1(EBX) 138 | INC ECX // ECX := x2 - x1 + 1 (Length) 139 | MOV EBX,ECX // EBX := x2 - x1 + 1 140 | AND EBX,3 // EBX := (x2-x1 +1)%4 141 | SHR ECX,2 // ECX := (x2-x1 +1)/4 142 | 143 | MOV EAX,Col2D 144 | 145 | REP STOSD // DWORD 描画 (4の倍数で描ける範囲で) 146 | MOV ECX,EBX // ECX := (x2-x1 +1)%4 147 | REP STOSB // BYTE 描画 (残りを描き込む) 148 | 149 | HL_END: 150 | POP EDI // EDI 復元 151 | } 152 | } 153 | 154 | // 台形の描画 // 155 | FINT DrawTrapezoid(int y,int dy) 156 | { 157 | int left_x = TZOID_A.x; 158 | int det_x = TZOID_B.x;// - left_x; 159 | 160 | do{ 161 | GrpHLineX(left_x,det_x,y); 162 | 163 | _asm{ 164 | //MOV EAX,TZOID_B.dlx 165 | //ADD TZOID_B.s,EAX 166 | MOV EAX,TZOID_B.s 167 | ADD EAX,TZOID_B.dlx 168 | MOV TZOID_B.s,EAX 169 | 170 | MOV EAX,TZOID_B.x 171 | ADC EAX,TZOID_B.d 172 | MOV TZOID_B.x,EAX 173 | MOV det_x,EAX 174 | 175 | //MOV EAX,TZOID_A.dlx 176 | //ADD TZOID_A.s,EAX 177 | MOV EAX,TZOID_A.s 178 | ADD EAX,TZOID_A.dlx 179 | MOV TZOID_A.s,EAX 180 | 181 | MOV EAX,left_x 182 | ADC EAX,TZOID_A.d 183 | MOV left_x,EAX 184 | } 185 | 186 | //det_x -= left_x; 187 | y++; 188 | } 189 | while((--dy)>=0); 190 | 191 | TZOID_A.x = left_x; 192 | 193 | return y; 194 | } 195 | -------------------------------------------------------------------------------- /DirectXUTYs/D2_Polygon.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* D2_Polygon.h 8ビット時のポリゴン描画 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_D2_POLYGON_H 7 | #define PBGWIN_DX_POLYGON_H "D2_POLYGON : Version 0.01" 8 | 9 | 10 | //// [更新履歴] //// 11 | // 2000/05/15 : アセンブラ化で、かろうじてバグ排除 12 | 13 | 14 | 15 | //// [ヘッダファイル] //// 16 | #include "PBGUTY_X.h" 17 | 18 | 19 | //// [構造体] //// 20 | 21 | typedef struct tagLINE_WORK{ 22 | int x; // 開始x座標 23 | int dlx; // 誤差変数加算値 24 | int s; // 誤差変数 25 | int d; // 最小x移動量 26 | } LINE_WORK; 27 | 28 | 29 | 30 | //// [インライン関数] //// 31 | 32 | // DDA 構造体のセット // 33 | IVOID SetLineWork(LINE_WORK *w,int x1,int x2,int dy) 34 | { 35 | int x,dlx,s,d; 36 | 37 | _asm{ 38 | PUSH ESI 39 | 40 | MOV EDX,x1 41 | MOV EAX,x2 42 | MOV ECX,dy 43 | 44 | MOV x,EDX 45 | 46 | SUB EAX,EDX 47 | CMP ECX,1 48 | ADC ECX,0 49 | CDQ 50 | IDIV ECX 51 | CMP EDX,80000000H 52 | ADC EAX,-1 53 | MOV d,EAX 54 | CMP EDX,80000000H 55 | CMC 56 | SBB ESI,ESI 57 | ADD EDX,ESI 58 | XOR EDX,ESI 59 | XOR EAX,EAX 60 | DIV ECX 61 | ADD EAX,ESI 62 | XOR EAX,ESI 63 | MOV dlx,EAX 64 | MOV s,80000000H 65 | POP ESI 66 | } 67 | 68 | w->x = x; 69 | w->dlx = dlx; 70 | w->s = s; 71 | w->d = d; 72 | } 73 | 74 | 75 | 76 | //// [ 関数 ] //// 77 | FVOID DrawPolygon(POINT *p,int n); // ポリゴンの描画 78 | 79 | 80 | 81 | #endif 82 | -------------------------------------------------------------------------------- /DirectXUTYs/D3_TEX.CPP: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* D3_TEX.cpp テクスチャ管理用関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "DD_UTY.h" 7 | #include "D3_TEX.h" 8 | #pragma message(PBGWIN_D3_TEX_H) 9 | 10 | 11 | // 列挙用コールバック関数 // 12 | static HRESULT CALLBACK TextureEnum(DDSURFACEDESC *ddsd,VOID *param); 13 | 14 | static DWORD TexDepth(DWORD col); // ビット深度を調べる 15 | 16 | // テクスチャ用 Surface を作成する // 17 | static GRP CreateTexSurface(int width,int height,DWORD MemCaps); 18 | 19 | // システムメモリなテクスチャに画像イメージを転送 // 20 | static BOOL BMP2SysMem(GRP surf,BYTE *img); 21 | 22 | 23 | // ローカル変数 // 24 | static DDPIXELFORMAT TextureFormat; 25 | 26 | // グローバル変数 // 27 | DXTEXTURE DxTex[TEXTURE_MAX]; 28 | 29 | 30 | FBOOL TexInit(void) 31 | { 32 | HRESULT dxret; 33 | BOOL flag = FALSE; 34 | 35 | //DebugSetup("TexInfo.txt"); 36 | dxret = DxObj.D3Dev->EnumTextureFormats(TextureEnum,(LPVOID)&flag); 37 | if(dxret!=D3D_OK) return FALSE; 38 | //DebugCleanup(); 39 | 40 | memset(DxTex,0,TEXTURE_MAX*sizeof(DXTEXTURE)); 41 | 42 | return flag; 43 | } 44 | 45 | FBOOL TexCreateTexture(char *filename,DWORD txid) 46 | { 47 | HRESULT dxret; 48 | DXTEXTURE *p; 49 | GRP temp = NULL; 50 | FILE *fp = NULL; 51 | long size; 52 | int width,height; 53 | LPDIRECT3DTEXTURE2 DevTexture = NULL; 54 | LPDIRECT3DTEXTURE2 MemTexture = NULL; 55 | 56 | 57 | if(txid>=TEXTURE_MAX) return FALSE; 58 | 59 | try{ 60 | // すでに作成されている場合 // 61 | p = &DxTex[txid]; 62 | if(p->surf) throw("作成済み"); 63 | 64 | // BMPイメージをメモリに送る // 65 | fp = fopen(filename,"rb"); 66 | if(fp==NULL) throw("ファイルにゃい"); 67 | 68 | size = filelength(fileno(fp)); 69 | p->img = (BYTE *)LocalAlloc(LPTR,size); 70 | if(p->img==NULL) throw("メモリ足りん"); 71 | 72 | fread(p->img,1,size,fp); 73 | fclose(fp); 74 | 75 | width = TexGetWidth(p->img); 76 | height = TexGetHeight(p->img); 77 | 78 | // 作業用 Surface // 79 | temp = CreateTexSurface(width,height,DDSCAPS_SYSTEMMEMORY); 80 | if(temp==0) throw("CTexSurf"); 81 | if(!BMP2SysMem(temp,p->img)) throw("BMP->MEM"); 82 | 83 | // テクスチャ用 Surface // 84 | p->surf = CreateTexSurface(width,height,DDSCAPS_VIDEOMEMORY); 85 | if(p->surf==0) throw("CTexSurf(VRAM)"); 86 | 87 | dxret = temp->QueryInterface(IID_IDirect3DTexture2,(void **)&MemTexture); 88 | if(dxret!=DD_OK) throw("QI(Mem)"); 89 | 90 | dxret = p->surf->QueryInterface(IID_IDirect3DTexture2,(void **)&DevTexture); 91 | if(dxret!=DD_OK) throw("QI"); 92 | 93 | // VRAMのほうにLOADする // 94 | dxret = DevTexture->Load(MemTexture); 95 | if(dxret!=D3D_OK) throw("TexなLoad"); 96 | 97 | dxret = DevTexture->GetHandle(DxObj.D3Dev,&(p->hTexture)); 98 | if(dxret!=D3D_OK) throw("GetHandle"); 99 | 100 | RELEASE(MemTexture); 101 | RELEASE(DevTexture); 102 | RELEASE(temp); 103 | } 104 | catch(char *error){ 105 | RELEASE(MemTexture); 106 | RELEASE(DevTexture); 107 | RELEASE(temp); 108 | RELEASE(p->surf); 109 | if(p->img) LocalFree(p->img); 110 | if(fp) fclose(fp); 111 | 112 | ErrInsert(error); 113 | return FALSE; 114 | } 115 | 116 | return TRUE; 117 | } 118 | 119 | FVOID TexReleaseTexture(DWORD txid) 120 | { 121 | DXTEXTURE *p; 122 | 123 | p = &DxTex[txid]; 124 | 125 | LocalFree(p->img); // イメージ解放 126 | RELEASE(p->surf); // テクスチャ用Surface 解放 127 | p->hTexture = NULL; // ハンドルを使用不能にする(というか上の奴ですでに使用できない) 128 | } 129 | 130 | FVOID TexSetTexture(DWORD txid) 131 | { 132 | if(DxTex[txid].hTexture) 133 | DxObj.D3Dev->SetRenderState(D3DRENDERSTATE_TEXTUREHANDLE,DxTex[txid].hTexture); 134 | } 135 | 136 | static DWORD TexDepth(DWORD col) 137 | { 138 | DWORD temp = 0; 139 | 140 | if(!col) return 0; 141 | 142 | while((col & 0x01)==0) col>>=1; 143 | while((col & 0x01)==1) col>>=1,temp++; 144 | 145 | return temp; 146 | } 147 | 148 | static HRESULT CALLBACK TextureEnum(DDSURFACEDESC *ddsd,VOID *param) 149 | { 150 | DDPIXELFORMAT ddpf = ddsd->ddpfPixelFormat; 151 | DWORD r,g,b,a; 152 | 153 | if(!(ddpf.dwFlags&DDPF_RGB)) return DDENUMRET_OK; 154 | 155 | r = TexDepth(ddpf.dwRBitMask); 156 | g = TexDepth(ddpf.dwGBitMask); 157 | b = TexDepth(ddpf.dwBBitMask); 158 | a = TexDepth(ddpf.dwRGBAlphaBitMask); 159 | //char buf[1000]; 160 | //sprintf(buf,"R:%2d G:%2d B:%2d A:%2d",r,g,b,a); 161 | //DebugOut(buf); 162 | 163 | // 手抜き判定処理 // 164 | if(a==0 && ddpf.dwRGBBitCount>8){ 165 | TextureFormat = ddpf; 166 | *(BOOL *)param = TRUE; 167 | return DDENUMRET_CANCEL; 168 | } 169 | 170 | return DDENUMRET_OK; 171 | } 172 | 173 | static GRP CreateTexSurface(int width,int height,DWORD MemCaps) 174 | { 175 | DDSURFACEDESC ddsd; 176 | HRESULT dxret; 177 | GRP temp; 178 | 179 | ZEROMEM(ddsd); 180 | ddsd.dwSize = sizeof(ddsd); 181 | ddsd.dwFlags = DDSD_CAPS|DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT; 182 | 183 | // ハードウェアなら DDSCAPS_VIDEOMEMORY そうでなければ DDSCAPS_SYSTEMMEMORY を加える // 184 | ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE|DDSCAPS_ALLOCONLOAD|MemCaps; 185 | 186 | ddsd.ddpfPixelFormat = TextureFormat; 187 | ddsd.dwWidth = width; 188 | ddsd.dwHeight = height; 189 | 190 | dxret = DxObj.DD->CreateSurface(&ddsd,&temp,NULL); 191 | 192 | return (dxret==DD_OK) ? temp : NULL; 193 | } 194 | 195 | static BOOL BMP2SysMem(GRP surf,BYTE *img) 196 | { 197 | HRESULT ddrval; 198 | BITMAPFILEHEADER *BMP_file; 199 | BITMAPINFOHEADER *BMP_info; 200 | RGBQUAD *pal; 201 | //PALETTEENTRY pe[256]; 202 | int width,height; 203 | BYTE *image; 204 | HDC hdc,hdcmem; 205 | HBITMAP hbmp; 206 | 207 | 208 | BMP_file = (BITMAPFILEHEADER *)img; 209 | BMP_info = (BITMAPINFOHEADER *)((BMP_file) + 1); 210 | pal = (RGBQUAD *)((BMP_info) + 1); 211 | image = (BYTE *)((pal) + 256); 212 | 213 | // ヘッダチェッカ // 214 | if(BMP_file->bfType != MAKEWORD('B','M')) return FALSE; 215 | if(BMP_info->biBitCount != 8) return FALSE; 216 | 217 | width = (BMP_info->biWidth+3)&(~3); 218 | height = BMP_info->biHeight; 219 | 220 | // DIB から DC を作成 // 221 | ddrval = surf->GetDC(&hdc); 222 | if(ddrval!=DD_OK) return FALSE; 223 | hbmp = CreateDIBitmap(hdc,BMP_info,CBM_INIT,image,(BITMAPINFO *)BMP_info,DIB_RGB_COLORS); 224 | hdcmem = CreateCompatibleDC(hdc); 225 | SelectObject(hdcmem,hbmp); 226 | 227 | BitBlt(hdc,0,0,width,height,hdcmem,0,0,SRCCOPY); 228 | 229 | // 後始末 // 230 | surf->ReleaseDC(hdc); 231 | DeleteDC(hdcmem); 232 | DeleteObject(hbmp); 233 | /* 234 | // カラーキーをセットする // 235 | SetColorKey(surf); 236 | */ 237 | return TRUE; 238 | } 239 | -------------------------------------------------------------------------------- /DirectXUTYs/D3_TEX.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* D3_TEX.h テクスチャ管理用関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_D3_TEX_H 7 | #define PBGWIN_D3_TEX_H "D3_TEX : Version 0.02 : Update 1999/12/13" 8 | 9 | 10 | // 更新履歴 // 11 | 12 | 13 | 14 | // ヘッダファイル // 15 | #include "DX_TYPE.h" 16 | 17 | 18 | // 定数&マクロ // 19 | #define TEXTURE_MAX 20 // テクスチャの枚数(最大) 20 | 21 | 22 | // 構造体 // 23 | typedef struct tagDXTEXTURE{ 24 | D3DTEXTUREHANDLE hTexture; 25 | GRP surf; 26 | BYTE *img; 27 | } DXTEXTURE; 28 | 29 | 30 | // グローバル変数 // 31 | extern DXTEXTURE DxTex[TEXTURE_MAX]; 32 | 33 | 34 | // 関数 // 35 | FBOOL TexInit(void); // 最適なテクスチャフォーマットを検索する 36 | FBOOL TexCreateTexture(char *name,DWORD txid); // テクスチャをロードする 37 | FVOID TexReleaseTexture(DWORD txid); // テクスチャを解放する 38 | FVOID TexSetTexture(DWORD txid); // テクスチャハンドルをセットする 39 | 40 | 41 | IINT TexGetWidth(BYTE *img) 42 | { 43 | BITMAPFILEHEADER *BMP_file; 44 | BITMAPINFOHEADER *BMP_info; 45 | int width,temp; 46 | 47 | BMP_file = (BITMAPFILEHEADER *)img; 48 | BMP_info = (BITMAPINFOHEADER *)((BMP_file) + 1); 49 | 50 | width = (BMP_info->biWidth+3)&(~3); // DWORD に揃える(いらないか...) 51 | for(temp=1;tempbiHeight); 66 | for(temp=1;tempCLIP_Y_MAX) outcode = OUTCODE_BOTTOM; 69 | else return TRUE; 70 | } 71 | 72 | // y方向のクリッピングが必要な場合 // 73 | if(outcode&OUTCODE_Y){ 74 | temp = (outcode&OUTCODE_TOP) ? CLIP_Y_MIN : CLIP_Y_MAX; 75 | (*y1) -= (*y2); // dy 76 | if((*y1)==0) return FALSE; 77 | 78 | (*x1) -= (*x2); // dx 79 | 80 | (*x1) = ( (temp-(*y2))*(*x1) )/(*y1) + (*x2); 81 | (*y1) = temp; 82 | } 83 | 84 | if((*x1)>=CLIP_X_MIN && (*x1)<=CLIP_X_MAX) return TRUE; 85 | return FALSE; 86 | } 87 | 88 | // ReturnValue == TRUE : 完全に範囲内もしくはクリッピングが正常に行われた // 89 | // ReturnValue == FALSE : 完全に範囲外 90 | IBOOL GrpLineClip(int *x1,int *y1,int *x2,int *y2) 91 | { 92 | BYTE Outcode1,Outcode2; 93 | 94 | Outcode1 = GetLineOutcode(*x1,*y1); 95 | Outcode2 = GetLineOutcode(*x2,*y2); 96 | 97 | if((Outcode1 & Outcode2) != 0) return FALSE; 98 | if(Outcode1==0 && Outcode2==0) return TRUE; 99 | 100 | if(GrpLineCut(x1,y1,x2,y2,Outcode1)==TRUE && GrpLineCut(x2,y2,x1,y1,Outcode2)==TRUE) 101 | return TRUE; 102 | else 103 | return FALSE; 104 | } 105 | 106 | 107 | #endif 108 | -------------------------------------------------------------------------------- /DirectXUTYs/DD_GRP2D.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DD_GRP2D.h 2D&8Bit時の図形描画関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_DD_GRP2D_H 7 | #define PBGWIN_DD_GRP2D_H "DD_GRP2D : Version 0.03 : Update 1999/01/12" 8 | 9 | 10 | // 更新履歴 // 11 | 12 | // 2000/ 1/12 : α関連の関数を一部追加 13 | // 1999/12/03 : 2D図形描画作成(αをのぞく) 14 | 15 | 16 | // ヘッダファイル // 17 | #include "DX_TYPE.h" 18 | 19 | 20 | // 関数 // 21 | FVOID _2DSetup(void); // 描画系関数ポインタをセットする 22 | 23 | FVOID _2DLock(void); // 画面描画の準備をする 24 | FVOID _2DUnlock(void); // 画面描画を完了する 25 | 26 | FVOID _2DSetColor(BYTE r,BYTE g,BYTE b); // 色セット 27 | FVOID _2DSetAlpha(BYTE a,BYTE mode); // αセット 28 | 29 | FVOID _2DLine(int x1,int y1,int x2,int y2); // 直線 30 | FVOID _2DBox(int x1,int y1,int x2,int y2); // 長方形 31 | FVOID _2DCircle(int x,int y,int r); // 円 32 | FVOID _2DCircleF(int x,int y,int r); // 円塗りつぶし 33 | FVOID _2DPolygon(POINT *p,int n); // ポリゴン塗りつぶし 34 | 35 | FVOID _2DBoxA(int x1,int y1,int x2,int y2); // α長方形 36 | FVOID _2DCircleA(int x,int y,int r); // α円塗りつぶし 37 | FVOID _2DPolygonA(POINT *p,int n); // αポリゴン塗りつぶし 38 | 39 | FVOID _2DGamma(BYTE r,BYTE g,BYTE b,BYTE a); // ガンマコントロール 40 | 41 | FVOID DisableAlphaTable(void); 42 | 43 | 44 | 45 | // インライン関数 // 46 | IBOOL _2DChkPoint(int x,int y) 47 | { 48 | extern int CLIP_X_MIN,CLIP_X_MAX,CLIP_Y_MIN,CLIP_Y_MAX; 49 | 50 | if(x=CLIP_X_MAX||y=CLIP_Y_MAX) return FALSE; 51 | 52 | return TRUE; 53 | } 54 | 55 | IVOID _2DPset(int x,int y,BYTE c) 56 | { 57 | extern BYTE *Grp_Vram; 58 | extern DWORD Grp_AddrY[480]; 59 | 60 | if(_2DChkPoint(x,y)) 61 | *(Grp_Vram+x+Grp_AddrY[y]) = c; 62 | } 63 | 64 | // 正方形クリップ : ReturnValue TRUE:クリッピング成功 FALSE:完全に範囲外 65 | IBOOL _2DClipRect(int *x1,int *y1,int *x2,int *y2) 66 | { 67 | extern int CLIP_X_MIN,CLIP_X_MAX,CLIP_Y_MIN,CLIP_Y_MAX; 68 | 69 | // 完全判定 // 70 | if((*x1)>CLIP_X_MAX || (*x2)CLIP_Y_MAX || (*y2)CLIP_X_MAX) (*x2)=CLIP_X_MAX; 77 | if((*y2)>CLIP_Y_MAX) (*y2)=CLIP_Y_MAX; 78 | 79 | return TRUE; 80 | } 81 | 82 | #endif 83 | -------------------------------------------------------------------------------- /DirectXUTYs/DD_GRP3D.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DD_GRP3D.h 3D時の図形描画関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_DD_GRP3D_H 7 | #define PBGWIN_DD_GRP3D_H "DD_GRP3D : Version 0.03 : Update 2000/02/22" 8 | 9 | 10 | // 更新履歴 // 11 | 12 | // 2000/02/22 : GrpGrdPolygon() を追加 13 | // 1999/12/04 : レーザー用特殊α関数を追加 14 | // 1999/12/02 : やっと一部の関数が動作し始めた。16Bit-αはやっぱり綺麗だな... 15 | 16 | 17 | // ヘッダファイル // 18 | #include "DX_TYPE.h" 19 | 20 | 21 | // 関数 // 22 | FVOID _3DSetup(void); // 描画系関数ポインタをセットする 23 | 24 | FVOID _3DLock(void); // 画面描画の準備をする 25 | FVOID _3DUnlock(void); // 画面描画を完了する 26 | 27 | FVOID _3DSetColor(BYTE r,BYTE g,BYTE b); // 色セット 28 | FVOID _3DSetAlpha(BYTE a,BYTE mode); // αセット 29 | 30 | FVOID _3DLine(int x1,int y1,int x2,int y2); // 直線 31 | FVOID _3DBox(int x1,int y1,int x2,int y2); // 長方形 32 | FVOID _3DCircle(int x,int y,int r); // 円 33 | FVOID _3DCircleF(int x,int y,int r); // 円塗りつぶし 34 | FVOID _3DPolygon(POINT *p,int n); // ポリゴン塗りつぶし 35 | 36 | FVOID _3DBoxA(int x1,int y1,int x2,int y2); // α長方形 37 | FVOID _3DCircleA(int x,int y,int r); // α円塗りつぶし 38 | FVOID _3DPolygonA(POINT *p,int n); // αポリゴン塗りつぶし 39 | FVOID _3DFatCircleA(int x,int y,int r,int w); // 太い半透明円描画 40 | 41 | 42 | // 3D専用関数 // 43 | FVOID GrpGrdRect(POINT *p); // グラデーション付き長方形(ナナメ可) 44 | FVOID GrpGrdRectA(POINT *p); // グラデーション付き長方形(ナナメ可+α) 45 | FVOID GrpGrdPolygon(POINT *p,int n); // グラデーション付きポリゴン(レーザー用?) 46 | FVOID GrpGrdLineEx(int x,int y1,int y2); // スペアな用グラデーションライン 47 | 48 | 49 | // インライン関数 // 50 | IVOID Set2DPoint(D3DTLVERTEX *tlv,int x,int y) 51 | { 52 | extern BYTE Col3D_R,Col3D_G,Col3D_B,Col3D_A; 53 | 54 | memset(tlv,0,sizeof(D3DTLVERTEX)); 55 | 56 | tlv->sx = D3DVAL(x); 57 | tlv->sy = D3DVAL(y); 58 | tlv->sz = D3DVAL(0); 59 | tlv->rhw = D3DVAL(1); 60 | tlv->color = RGBA_MAKE(Col3D_R,Col3D_G,Col3D_B,Col3D_A); 61 | tlv->specular = RGB_MAKE(0,0,0); 62 | } 63 | 64 | IVOID Set2DPointC(D3DTLVERTEX *tlv,int x,int y,DWORD c) 65 | { 66 | memset(tlv,0,sizeof(D3DTLVERTEX)); 67 | 68 | tlv->sx = D3DVAL(x); 69 | tlv->sy = D3DVAL(y); 70 | tlv->sz = D3DVAL(0); 71 | tlv->rhw = D3DVAL(1); 72 | tlv->color = c; 73 | tlv->specular = RGB_MAKE(0,0,0); 74 | } 75 | 76 | IBOOL AlphaEnable(BOOL flag) 77 | { 78 | HRESULT dxret; 79 | 80 | dxret = DxObj.D3Dev->SetRenderState(D3DRENDERSTATE_ALPHABLENDENABLE,flag); 81 | if(dxret!=D3D_OK){ 82 | if(!GrpRestore()) return FALSE; 83 | } 84 | 85 | return TRUE; 86 | } 87 | 88 | 89 | #endif 90 | -------------------------------------------------------------------------------- /DirectXUTYs/DD_UTY.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DD_UTY.h 描画関連の関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_DD_UTY_H 7 | #define PBGWIN_DD_UTY_H "DD_UTY : Version 0.07 : Update 2000/02/03" 8 | 9 | 10 | // 更新履歴 // 11 | 12 | // 2000/08/21 : クリッピング関数を更新・追加 13 | 14 | // 2000/03/01 : GrpSetRestoreHook() を追加 15 | // 2000/02/28 : GrpFatCircleA() を追加。使い方次第では便利なのでは? 16 | 17 | // 1999/12/05 : クリッピング描画を追加(一通りの関数が揃う) 18 | // 1999/12/02 : 列挙系の関数がほぼ完成する。BMPローダも後少しで完成するはず 19 | // : 関数ポインタの追加 20 | // 1999/11/30 : D3D_IM を使用するように変更。それに伴い、全体的に大幅な変更あり 21 | // : また、D3DRM_UTY を削除した。 22 | 23 | 24 | // ヘッダファイル // 25 | #include "DX_TYPE.h" // 型&マクロ 26 | #include "DX_ERROR.h" // エラー処理用関数 27 | #include "LZ_UTY.h" // 圧縮管理用 28 | #include "D3_TEX.h" // テクスチャ管理 29 | #include "MtoB.h" // スクリーンキャプチャー 30 | 31 | 32 | // 定数&マクロ // 33 | #define SURFACE_MAX 10 // テクスチャ,Prim,BackをのぞくSurfaceの最大数 34 | #define XDDRAWENUM_MAX 4 // ビデオカード4枚差しをする人はいないと思うので... 35 | #define XD3DENUM_MAX 8 // DDrawデバイスに対する3Dデバイスの列挙最大数 36 | 37 | #define ALPHA_ONE 0x00 // 一種の加算α 38 | #define ALPHA_NORM 0x01 // ノーマルなSrc-α 39 | 40 | #define RGB256(r,g,b) ((r)+(g)*6+(b)*36+0x14) 41 | 42 | 43 | // 構造体 // 44 | typedef struct tagDXOBJECT{ 45 | LPDIRECTDRAW2 DD; // DirectDraw Object 46 | LPDIRECT3D2 D3; // Direct3D Object 47 | LPDIRECT3DDEVICE2 D3Dev; // Direct3D Device 48 | LPDIRECT3DVIEWPORT2 View; // Direct3D Viewport 49 | LPDIRECT3DMATERIAL2 Mat; // Direct3D Material 50 | 51 | LPDIRECTDRAWPALETTE Pal; // パレット(8Bitのときだけ) 52 | LPDIRECTDRAWCLIPPER Clip; // クリッパー(WindowModeのみ) 53 | 54 | GRP Prim; // 表画面 55 | GRP Back; // 裏画面 56 | GRP Zbuf; // Zバッファ 57 | 58 | PALETTEENTRY pe[256]; // パレットの初期値 59 | 60 | DWORD Bpp; // 色数(なぜ32ビット?) 61 | HWND hWnd; // ウィンドウハンドル 62 | BOOL bWndMode; // ウィンドウモードか? 63 | BOOL bNeedChgPal; // パレットを変更する必要があるか 64 | } DXOBJECT; 65 | 66 | typedef struct tagDXSURFACE{ 67 | GRP surf; // DirectDraw OffscreenSurface (NULLなら未使用) 68 | BYTE *img; // BMP イメージを一時的に保存 (NULL ならロードはまだ) 69 | int width; 70 | int height; 71 | } DXSURFACE; 72 | 73 | typedef struct tagD3DENUM{ 74 | LPGUID lpGuid; // GUID 75 | char *name; // お名前 76 | BOOL bIsHW; // ハードウェアか 77 | BOOL b8Bit; // この D3D_DEVICE が 8Bit に対応しているか 78 | BOOL b16Bit; // この D3D_DEVICE が 16Bit に対応しているか 79 | BOOL b24Bit; // この D3D_DEVICE が 24Bit に対応しているか 80 | BOOL b32Bit; // この D3D_DEVICE が 32Bit に対応しているか 81 | DWORD Zbuf; // サポートするZバッファの深度(0は多分無いのでしょう) 82 | } XD3DENUM; 83 | 84 | typedef struct tagDDRAWENUM{ 85 | LPGUID lpDDGuid; // あるドライバのGUID 86 | char *name; // お名前 87 | XD3DENUM D3D[XD3DENUM_MAX]; // D3D_DEVICE の GUID & ドライバ名 88 | DWORD D3DNow; // D3D_DEVICE の現在の数 89 | BOOL b8Bit; // この DD_DEVICE が 8Bit に対応しているか 90 | BOOL b16Bit; // この DD_DEVICE が 16Bit に対応しているか 91 | BOOL b24Bit; // この DD_DEVICE が 24Bit に対応しているか 92 | BOOL b32Bit; // この DD_DEVICE が 32Bit に対応しているか 93 | } XDDRAWENUM; 94 | 95 | 96 | // グローバル変数 // 97 | extern DXOBJECT DxObj; 98 | extern DXSURFACE DxSurf[SURFACE_MAX]; 99 | extern XDDRAWENUM DxEnum[XDDRAWENUM_MAX]; 100 | extern DWORD DxEnumNow; 101 | 102 | 103 | // 初期化など // 104 | FBOOL GrpEnum(HWND hWnd); // 使用できるデバイスを列挙する 105 | FBOOL GrpInit(LPGUID DDG,XD3DENUM *D3De,BYTE Bpp); 106 | FBOOL GrpInitEmu8(void); // 「えみゅ」で8ビット初期化 107 | FBOOL GrpInitW(LPGUID DDG,XD3DENUM *D3De,BYTE Bpp); 108 | FVOID GrpCleanup(void); // いつも通りに(ただし失敗したら異常終了) 109 | FVOID GrpSetClip(int sx,int sy,int ex,int ey); // 3DViewportが生きていたらそちらもセット 110 | FBOOL GrpRestore(void); // ロード済みのSurfaceを修復 111 | 112 | FVOID GrpGetPalette(PALETTEENTRY *pal); // 現在のパレットを取得する 113 | FVOID GrpSetPalette(PALETTEENTRY *pal); // 現在のパレットを変更する 114 | FVOID GrpSetRestoreHook(FBOOLFN(*func)(void)); // Restore の事後処理フック 115 | 116 | // オフスクリーン Surface 作成 // 117 | FGRP GrpCreateSurface(int width,int height,BYTE surf_id); // Surface の作成(BMPリロード有り) 118 | FBOOL GrpReleaseSurface(BYTE surf_id); // Surface の削除(BMPは変更せず) 119 | 120 | // BMPファイルロード // 121 | FBOOL GrpBMPLoad(char *filename,BYTE surf_id); // BMP->Surface 122 | FBOOL GrpBMPLoadP(BIT_DEVICE *in,DWORD n,BYTE surf_id); // (圧)BMP->Surface 123 | FBOOL GrpBMFree(BYTE surf_id); // SurfaceからBMPだけ切り離す 124 | 125 | extern BOOL GrpSetColorKey(LPDIRECTDRAWSURFACE lpds); // ビット深度によりカラーキーをセットする 126 | extern void GrpOffsClear(LPDIRECTDRAWSURFACE lpds); // ある Surface を初期化する 127 | 128 | 129 | // 図形描画関連関数Ptr(GrpInitにより初期化される) // 130 | FVOID GrpCls(void); // 指定色で塗りつぶしをかける(クリッピング無効) 131 | FVOID GrpClsEx(RECT *Target, DWORD col); // 直接番号指定で矩形内を塗りつぶす 132 | 133 | extern FVOIDFN(*GrpFlip)(void); // ウィンドウモード時の動作に注意 134 | extern FVOIDFN(*GrpLock)(void); // 図形描画の準備をする 135 | extern FVOIDFN(*GrpUnlock)(void); // 図形描画を完了する 136 | 137 | extern FVOIDFN(*GrpSetColor)(BYTE r,BYTE g,BYTE b); // 色セット 138 | extern FVOIDFN(*GrpSetAlpha)(BYTE a,BYTE mode); // αセット 139 | 140 | extern FVOIDFN(*GrpLine)(int x1,int y1,int x2,int y2); // 直線 141 | extern FVOIDFN(*GrpBox)(int x1,int y1,int x2,int y2); // 長方形 142 | extern FVOIDFN(*GrpCircle)(int x,int y,int r); // 円 143 | extern FVOIDFN(*GrpCircleF)(int x,int y,int r); // 円塗りつぶし 144 | extern FVOIDFN(*GrpPolygon)(POINT *p,int n); // ポリゴン塗りつぶし 145 | 146 | extern FVOIDFN(*GrpBoxA)(int x1,int y1,int x2,int y2); // α長方形 147 | extern FVOIDFN(*GrpCircleA)(int x,int y,int r); // α円塗りつぶし 148 | extern FVOIDFN(*GrpPolygonA)(POINT *p,int n); // αポリゴン塗りつぶし 149 | 150 | extern FVOIDFN(*GrpFatCircleA)(int x,int y,int r,int w); // 太い円を描く 151 | 152 | extern PVOIDFN(*GrpBlt)(RECT *src,int x,int y,GRP surf); // ビットマップ転送(WithClip) 153 | 154 | //extern FVOIDFN(*GrpSetGamma)(BYTE r,BYTE g,BYTE b,BYTE a); // ガンマコントロール 155 | 156 | extern FVOID GrpBltEnable(BOOL flag); // 描画を行うか? 157 | extern PBOOL GrpClip(RECT *src,int *x,int *y); // クリッピングをかける 158 | extern FVOID GrpGetClip(RECT *dest); // クリッピング枠を取得する 159 | 160 | 161 | // カラーキー付き転送(クリッピングはないので注意!!) // 162 | // src の値は変更されません // 163 | IVOID GrpBltX(RECT *src,int x,int y,GRP surf) 164 | { 165 | HRESULT ddrval; 166 | 167 | for(;;){ 168 | ddrval = DxObj.Back->BltFast(x,y,surf,src,DDBLTFAST_SRCCOLORKEY); 169 | if(ddrval == DD_OK){ 170 | break; 171 | } 172 | if(ddrval == DDERR_SURFACELOST){ 173 | if(!GrpRestore()) 174 | return; 175 | } 176 | if(ddrval != DDERR_WASSTILLDRAWING){ 177 | return; 178 | } 179 | } 180 | } 181 | 182 | 183 | // カラーキー無し転送(クリッピングはないので注意!!) // 184 | // src の値は変更されません // 185 | IVOID GrpBltXC(RECT *src,int x,int y,GRP surf) 186 | { 187 | HRESULT ddrval; 188 | 189 | for(;;){ 190 | ddrval = DxObj.Back->BltFast(x,y,surf,src,DDBLTFAST_NOCOLORKEY); 191 | if(ddrval == DD_OK){ 192 | break; 193 | } 194 | if(ddrval == DDERR_SURFACELOST){ 195 | if(!GrpRestore()) 196 | return; 197 | } 198 | if(ddrval != DDERR_WASSTILLDRAWING){ 199 | return; 200 | } 201 | } 202 | } 203 | 204 | #endif 205 | -------------------------------------------------------------------------------- /DirectXUTYs/DI_UTY.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DI_UTY.h Direct Input 関連の関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_DI_UTY_H 7 | #define PBGWIN_DI_UTY_H "DI_UTY : Ver 0.10" 8 | 9 | 10 | // 更新履歴 // 11 | 12 | // 2000/01/11 : .c->.cpp に変更、英語->日本語に変更。 13 | 14 | 15 | #include "DX_TYPE.h" 16 | #include "DX_ERROR.h" 17 | 18 | 19 | // キーボード定数 // 20 | #define KEY_UP 0x0001 21 | #define KEY_DOWN 0x0002 22 | #define KEY_LEFT 0x0004 23 | #define KEY_RIGHT 0x0008 24 | #define KEY_TAMA 0x0010 25 | #define KEY_BOMB 0x0020 26 | #define KEY_SHIFT 0x0040 27 | #define KEY_RETURN 0x0080 28 | #define KEY_ESC 0x0100 29 | 30 | #define KEY_ULEFT (KEY_UP|KEY_LEFT) 31 | #define KEY_URIGHT (KEY_UP|KEY_RIGHT) 32 | #define KEY_DLEFT (KEY_DOWN|KEY_LEFT) 33 | #define KEY_DRIGHT (KEY_DOWN|KEY_RIGHT) 34 | 35 | 36 | // キーボード定義用構造体 // 37 | typedef struct tagInputConfig{ 38 | BYTE KeyUp; // 上方向に移動 39 | BYTE KeyDown; // 下方向に移動 40 | BYTE KeyLeft; // 左方向に移動 41 | BYTE KeyRight; // 右方向に移動 42 | BYTE KeyTama; // 弾発射&決定 43 | BYTE KeyBomb; // ボム発動&キャンセル 44 | BYTE KeyShift; // 低速移動 45 | 46 | BYTE KeyULeft; // 左上 47 | BYTE KeyURight; // 右上 48 | BYTE KeyDLeft; // 左下 49 | BYTE KeyDRight; // 右下 50 | 51 | DWORD PadMask_Tama; // パッド用マスク 52 | DWORD PadMask_Bomb; // 53 | DWORD PadMask_Shift; // 54 | DWORD PadMask_Cancel; // 55 | 56 | BOOL bIsUsed[256]; // 多重定義防止用 57 | } InputConfig; 58 | 59 | typedef struct tagINPUT_OBJ{ 60 | LPDIRECTINPUT pdi; 61 | LPDIRECTINPUTDEVICE pdev; 62 | } INPUT_OBJ; 63 | 64 | 65 | // グローバル変数(Public) // 66 | extern WORD Key_Data; 67 | extern WORD Pad_Data; 68 | 69 | extern void (*Key_Read)(void); 70 | 71 | 72 | // 関数プロトタイプ宣言 // 73 | extern BOOL Key_Start(HINSTANCE hInst,HWND hWnd); // キー入力開始 74 | extern void Key_Config(WORD Key); // あるキーボード定数に対するコンフィグ 75 | extern void Key_End(void); // キー入力終了 76 | 77 | extern void Key_Read_STD(void); 78 | extern void Key_Read_DI(void); 79 | 80 | extern int Key_PadConfig(WORD Key); 81 | extern void Key_PadConfig2(BYTE PadID, WORD KeyData); 82 | 83 | #endif 84 | -------------------------------------------------------------------------------- /DirectXUTYs/DS_UTY.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DS_UTY.h 効果音関連の処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_DS_UTY_H 7 | #define PBGWIN_DS_UTY_H "DS_UTY : Version 0.03 : Update 2000/02/04" 8 | 9 | 10 | // 更新履歴 // 11 | 12 | 13 | // ヘッダファイル // 14 | #include "DX_TYPE.h" // 型&マクロ 15 | #include "DX_ERROR.h" // エラー処理用関数 16 | #include "LZ_UTY.h" // 圧縮管理用 17 | 18 | 19 | // 定数&マクロ // 20 | #define SND_OBJ_MAX 30 // 効果音の種類の最大数 21 | #define SND_XMID_DEFAULT (320*64) // X座標の中心のデフォルト値 22 | 23 | #ifndef DSBCAPS_CTRLDEFAULT 24 | #define DSBCAPS_CTRLDEFAULT \ 25 | (DSBCAPS_CTRLPAN|DSBCAPS_CTRLVOLUME|DSBCAPS_CTRLFREQUENCY) 26 | #endif 27 | 28 | 29 | // 構造体 // 30 | 31 | #pragma pack(push, PBG_WAVEHEAD_PACK) 32 | #pragma pack(2) 33 | 34 | typedef struct tagWAVEHEAD{ 35 | DWORD RIFF; // 36 | DWORD RiffLen; // 37 | DWORD WAVE; // 38 | DWORD FMT; // 39 | DWORD WaveLen; // 40 | 41 | WORD tag; // 42 | WORD ch; // 43 | DWORD SamplePerSec; // 44 | DWORD AvgBytePerSec; // 45 | WORD BlockAlign; // 46 | WORD BitPerSample; // 47 | 48 | DWORD DATA; // 49 | DWORD DataLen; // 50 | } WAVEHEAD; 51 | 52 | typedef struct tagWAVEHEAD_FACT{ 53 | DWORD RIFF; // 54 | DWORD RiffLen; // 55 | DWORD WAVE; // 56 | DWORD FMT; // 57 | DWORD WaveLen; // 58 | 59 | WORD tag; // 60 | WORD ch; // 61 | DWORD SamplePerSec; // 62 | DWORD AvgBytePerSec; // 63 | WORD BlockAlign; // 64 | WORD BitPerSample; // 65 | 66 | DWORD FACT; 67 | WORD Dummy_2; 68 | WORD Dummy_3; 69 | WORD Dummy_4; 70 | WORD Dummy_5; 71 | 72 | DWORD DATA; // 73 | DWORD DataLen; // 74 | } WAVEHEAD_FACT; 75 | 76 | #pragma pack(pop, PBG_WAVEHEAD_PACK) 77 | 78 | 79 | typedef struct tagSE_STRUCT{ 80 | BYTE *data; // 81 | DWORD size; // 82 | int max; // 83 | int now; // 84 | IDirectSoundBuffer *buf[1]; // 85 | } SE_STRUCT,*LPSE_STRUCT; 86 | 87 | 88 | // 初期化など // 89 | FBOOL SndInit(HWND hWnd,int x_mid=SND_XMID_DEFAULT); 90 | FVOID SndCleanup(void); 91 | 92 | // WAVファイルロード(ある制限があるが...) // 93 | FBOOL SndWAVLoad(char *filename,BYTE id,int max); // 後でエラーを吐くようにする 94 | FBOOL SndWAVLoadP(BIT_DEVICE *in,DWORD n,BYTE id,int max); 95 | 96 | // 再生&停止 // 97 | FVOID SndPlay(BYTE id); 98 | FVOID SndPlayEX(BYTE id,int x,DWORD flag); 99 | FVOID SndStop(BYTE id); 100 | FVOID SndStopAll(void); 101 | 102 | // 補助 // 103 | FBOOL SndFillBuffer(IDirectSoundBuffer *ds,BYTE *data,DWORD size); 104 | FVOID SndRelease(BYTE id); 105 | FBOOL SndRestore(void); 106 | 107 | 108 | // グローバル変数 // 109 | 110 | 111 | #endif 112 | -------------------------------------------------------------------------------- /DirectXUTYs/DX_ERROR.C: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DX_ERROR.c DirectX のエラー出力用関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "DX_ERROR.h" 7 | #include 8 | #pragma message(PBGWIN_DX_ERROR_H) 9 | 10 | 11 | // グローバル変数 // 12 | static ERROR_DATA ErrorBuf; 13 | static char ErrorOut[1000]; 14 | //static FILE *ErrorFP = NULL; 15 | 16 | 17 | // エラー用バッファの初期化 // 18 | extern void ErrSetup(void) 19 | { 20 | ErrorBuf.s = NULL; 21 | ErrorBuf.next = NULL; 22 | } 23 | 24 | // エラー文字列を追加 // 25 | extern void ErrInsert(char *s) 26 | { 27 | ERROR_DATA *temp; 28 | 29 | // 自己参照構造体を作成 // 30 | temp = (ERROR_DATA *)LocalAlloc(LPTR,sizeof(ERROR_DATA)); 31 | if(temp==NULL) return; 32 | 33 | // 文字列の追加 // 34 | temp->s = LocalAlloc(LPTR,sizeof(char)*(strlen(s)+2)); 35 | if(temp->s==NULL){ 36 | LocalFree(temp); 37 | return; 38 | } 39 | strcpy(temp->s,s); 40 | 41 | // ポインタ更新 // 42 | temp->next = ErrorBuf.next; 43 | ErrorBuf.next = temp; 44 | 45 | DebugOut(s); 46 | } 47 | 48 | // エラー文字列出力&メモリ解放 // 49 | extern void ErrCleanup(void) 50 | { 51 | ERROR_DATA *p = ErrorBuf.next,*temp; 52 | 53 | // 文字列を表示しながらメモリを解放 // 54 | while(p!=NULL){ 55 | //MessageBox(NULL,p->s,"DirectX 関連のエラー",MB_OK); 56 | temp = p->next; 57 | LocalFree(p->s); 58 | LocalFree(p); 59 | p = temp; 60 | } 61 | 62 | //if(ErrorFP!=NULL) fclose(ErrorFP); 63 | ErrSetup(); 64 | } 65 | 66 | extern void DebugSetup(char *filename) 67 | { 68 | char buf[1000]; 69 | FILE *fp; 70 | 71 | //if(ErrorFP) return; 72 | strcpy(ErrorOut,filename); 73 | 74 | fp = fopen(ErrorOut,"a"); 75 | if(fp==NULL) return; 76 | fseek(fp,0,SEEK_END); 77 | _strdate(buf); 78 | fprintf(fp,"[%s]",buf); 79 | _strtime(buf); 80 | fprintf(fp,"[%s]\n",buf); 81 | fclose(fp); 82 | } 83 | 84 | extern void DebugCleanup(void) 85 | { 86 | strcpy(ErrorOut,""); 87 | //if(ErrorFP!=NULL) fclose(ErrorFP); 88 | //ErrorFP=NULL; 89 | } 90 | 91 | extern void DebugOut(char *s) 92 | { 93 | FILE *fp; 94 | fp= fopen(ErrorOut,"a"); 95 | if(fp==NULL) return; 96 | fseek(fp,0,SEEK_END); 97 | fprintf(fp,"Error : %s\n",s); 98 | fclose(fp); 99 | } 100 | -------------------------------------------------------------------------------- /DirectXUTYs/DX_ERROR.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DX_ERROR.h DirectX のエラー出力用関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_DX_ERROR_H 7 | #define PBGWIN_DX_ERROR_H "DX_ERROR : Version 0.01 : Update 1999/11/20" 8 | 9 | 10 | // 更新履歴 // 11 | 12 | // 1999/12/10 : ファイルにエラー出力をする関数を追加 13 | // 1999/11/20 : 作成開始 14 | 15 | 16 | // C++ 対策 // 17 | #ifdef __cplusplus 18 | extern "C" { 19 | #endif 20 | 21 | 22 | // ヘッダファイル // 23 | #include "DX_TYPE.h" 24 | 25 | 26 | 27 | // 構造体&共用体 // 28 | typedef struct _error{ 29 | char *s; // エラー文字列 30 | struct _error *next; // 次のエラー 31 | } ERROR_DATA; 32 | 33 | 34 | // 関数プロトタイプ宣言 // 35 | extern void ErrSetup(void); // エラー用バッファの初期化 36 | extern void ErrInsert(char *s); // エラー文字列を追加 37 | extern void ErrCleanup(void); // エラー文字列出力&メモリ解放 38 | extern void DebugSetup(char *filename); // エラー出力準備(->LogFile) 39 | extern void DebugCleanup(void); // エラー吐き出し用ファイルを閉じる 40 | extern void DebugOut(char *s); // デバッグメッセージ吐き出し 41 | 42 | // C++ 対策 // 43 | #ifdef __cplusplus 44 | } 45 | #endif 46 | 47 | 48 | #endif 49 | -------------------------------------------------------------------------------- /DirectXUTYs/DX_TYPE.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DX_TYPE.h DX関連の定数とか */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_DX_TYPE_H 7 | #define PBGWIN_DX_TYPE_H "DX_TYPE : Version 0.02" 8 | 9 | 10 | // 更新履歴 // 11 | 12 | // 2000/05/15 : 関数呼び出し規約 FINT 等を追加 13 | // 2000/01/30 : バージョン文字列を出力するようにした 14 | // 1999/12/02 : DD_UTYから分離する 15 | 16 | 17 | // ヘッダファイル // 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | #include 24 | 25 | 26 | // 使用するライブラリ // 27 | #pragma comment(lib,"dxguid.lib") 28 | #pragma comment(lib,"ddraw.lib") 29 | #pragma comment(lib,"d3dim.lib") 30 | #pragma comment(lib,"dsound.lib") 31 | #pragma comment(lib,"dinput.lib") 32 | #pragma comment(lib,"winmm.lib") 33 | 34 | 35 | // ヘッダファイルのバージョンを表示する // 36 | #pragma message("-----["PBGWIN_DX_TYPE_H " / " __TIMESTAMP__ "]-----") 37 | 38 | #if DIRECTDRAW_VERSION == 0x0700 39 | #pragma message(" DirectDraw : Version 7.00") 40 | #elif DIRECTDRAW_VERSION == 0x0600 41 | #pragma message(" DirectDraw : Version 6.00") 42 | #elif DIRECTDRAW_VERSION == 0x0500 43 | #pragma message(" DirectDraw : Version 5.00") 44 | #elif DIRECTDRAW_VERSION == 0x0300 45 | #pragma message(" DirectDraw : Version 3.00") 46 | #endif 47 | 48 | #if DIRECTSOUND_VERSION == 0x0700 49 | #pragma message(" DirectSound : Version 7.00") 50 | #elif DIRECTSOUND_VERSION == 0x0600 51 | #pragma message(" DirectSound : Version 6.00") 52 | #elif DIRECTSOUND_VERSION == 0x0500 53 | #pragma message(" DirectSound : Version 5.00") 54 | #elif DIRECTSOUND_VERSION == 0x0300 55 | #pragma message(" DirectSound : Version 3.00") 56 | #else 57 | #pragma message(" DirectSound : Version <= 6.00???") 58 | #endif 59 | 60 | #if DIRECTINPUT_VERSION == 0x0700 61 | #pragma message(" DirectInput : Version 7.00") 62 | #elif DIRECTINPUT_VERSION == 0x0600 63 | #pragma message(" DirectInput : Version 6.00") 64 | #elif DIRECTINPUT_VERSION == 0x0500 65 | #pragma message(" DirectInput : Version 5.00") 66 | #elif DIRECTINPUT_VERSION == 0x0300 67 | #pragma message(" DirectInput : Version 3.00") 68 | #endif 69 | 70 | #pragma message("------------------------------") 71 | 72 | 73 | // マクロ // 74 | #define RELEASE(x) if((x)!=NULL){(x)->Release();x=NULL;} 75 | #define ZEROMEM(x) memset(&x,0,sizeof(x)) 76 | 77 | 78 | // 型 // 79 | typedef LPDIRECTDRAWSURFACE GRP; 80 | 81 | #define PVOID void pascal 82 | #define PBOOL BOOL pascal 83 | #define PGRP GRP pascal 84 | #define PINT int pascal 85 | 86 | #define PVOIDFN(fn) void (pascal fn) 87 | #define PBOOLFN(fn) BOOL (pascal fn) 88 | #define PGRPFN(fn) GRP (pascal fn) 89 | 90 | #define FVOID void __fastcall 91 | #define FBOOL BOOL __fastcall 92 | #define FGRP GRP __fastcall 93 | 94 | #define FCHAR char __fastcall 95 | #define FINT int __fastcall 96 | #define FSHORT short __fastcall 97 | 98 | #define FBYTE BYTE __fastcall 99 | #define FWORD WORD __fastcall 100 | #define FDWORD DWORD __fastcall 101 | 102 | #define FVOIDFN(fn) void (__fastcall fn) 103 | #define FBOOLFN(fn) BOOL (__fastcall fn) 104 | #define FGRPFN(fn) GRP (__fastcall fn) 105 | 106 | #define IVOID __inline void 107 | #define IBOOL __inline BOOL 108 | #define IGRP __inline GRP 109 | #define IINT __inline INT 110 | #define IBYTE __inline BYTE 111 | #define IWORD __inline WORD 112 | #define IDWORD __inline DWORD 113 | 114 | #define FIVOID __forceinline void 115 | #define FIBOOL __forceinline BOOL 116 | #define FIGRP __forceinline GRP 117 | 118 | #endif 119 | -------------------------------------------------------------------------------- /DirectXUTYs/PBGMIDI.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* PBGMIDI.h MIDI管理用関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_PBGMIDI_H 7 | #define PBGWIN_PBGMIDI_H "PBGMIDI : Version 0.31 : Update 2000/08/04" 8 | 9 | // 更新履歴 // 10 | // 2000/08/04 : Mid_Free() をグローバルにした。 11 | 12 | // 2000/03/22 : MIDI フェードアウト関数をマスターボリュームからCCのボリュームに変更 13 | // : 処理の追いつかない MIDI があった場合は、メッセージ送出に工夫が必要かも 14 | 15 | 16 | 17 | 18 | // C++ 対策 // 19 | #ifdef __cplusplus 20 | extern "C" { 21 | #endif 22 | 23 | 24 | #include 25 | #include 26 | //#pragma comment(lib,"winmm.lib") 27 | #include "LZ_UTY.h" 28 | 29 | 30 | #define MIDFN_NOPLAY 0x00 // 再生しない 31 | #define MIDFN_CALLBACK 0x01 // CALLBACK_FN を使用して再生 32 | #define MIDFN_MIDLOOP 0x02 // ゲーム等の一定スピードのループで再生 33 | #define MIDFN_STREAM 0x04 // MIDI_STREAM を使用して再生(予約のみ) 34 | 35 | #define MIDPL_NORM 0x00 // 曲の最後にきたら最初に戻って再生 36 | #define MIDPL_STOP 0x01 // 曲の最後にきたら停止 37 | 38 | #define MIDST_STOP 0x00 // 停止している 39 | #define MIDST_PLAY 0x01 // 再生中 40 | #define MIDST_PAUSE 0x02 // 一時停止 41 | 42 | #define MID_STDTEMPO (1<<7) // 標準のテンポ 43 | 44 | 45 | //// みでぃ用構造体 //// 46 | typedef struct{ 47 | HMIDIOUT mp; // 出力デバイスのハンドル 48 | WORD state; // 現在の状態 49 | WORD fnmode; // MIDI再生に使用する関数 50 | WORD plmode; // 曲の最後に達したときどうするか 51 | int nDevice; // デバイス数 52 | int NowID; // 現在のデバイスのID 53 | char **name; // デバイス名 54 | 55 | // 以下は外部から変更&参照しないこと // 56 | DWORD FadeCount; // フェードI/Oカウンタ 57 | char FadeFlag; // フェードI/Oフラグ(In or Out or 無し) 58 | int FadeWait; // フェードI/Oウェイト 59 | 60 | BYTE MaxVolume; // ボリュームの最大値(メッセージでも変化,0-127) 61 | BYTE NowVolume; // 現在のボリューム(0-127) 62 | } MID_DEVICE; 63 | 64 | typedef struct { 65 | DWORD MThd; 66 | DWORD size; 67 | } MID_FILEST; 68 | 69 | typedef struct { 70 | WORD format; 71 | WORD track; 72 | WORD timebase; 73 | } MID_MAINST; 74 | 75 | typedef struct { 76 | DWORD MTrk; 77 | DWORD size; 78 | } MID_TRACKST; 79 | 80 | typedef struct { 81 | BOOL play; 82 | int count; 83 | int size; 84 | BYTE status; 85 | LPBYTE data; 86 | LPBYTE work; 87 | } MID_TRACK; 88 | 89 | typedef struct { 90 | int format; 91 | int track; 92 | int timebase; 93 | int tempo; 94 | DWORDLONG playcount1; 95 | DWORDLONG playcount2; 96 | DWORDLONG fticks; 97 | DWORDLONG nticks; 98 | MID_TRACK *data; 99 | } MID_DATA; 100 | 101 | //// たいまー用構造体 //// 102 | typedef struct { 103 | UINT htimer; 104 | TIMECAPS caps; 105 | UINT delay; 106 | } TIME_DATA; 107 | 108 | 109 | //// 関数 //// 110 | BOOL Mid_Start(WORD fnmode,WORD plmode); // MIDI関連初期化 111 | void Mid_End(void); // MIDI関連おしまい 112 | void Mid_Play(void); // 再生する 113 | void Mid_Stop(void); // 停止する 114 | BOOL Mid_Free(void); // データ解放する 115 | void Mid_Volume(BYTE volume); // マスターボリュームを変更する 116 | void Mid_Tempo(char tempo); // テンポを変更する 117 | void Mid_FadeOut(BYTE speed); // フェードアウト(数字が大きいほど早い) 118 | void Mid_Pan(char pan); // 全てのチャンネルのパンを変更する(無駄関数) 119 | BOOL Mid_ChgDev(char pos); // 出力デバイスを変更する 120 | 121 | BOOL Mid_Load(char *filename); // 普通のMIDIファイルをロードする 122 | BOOL PMid_Load(BIT_DEVICE *in,DWORD n); // 圧縮MIDIファイルをロードする 123 | 124 | void Mid_LoopFunc(DWORD time); // 一定間隔ループを自前で生成して再生するとき使用 125 | char *Mid_GetTitle(void); // この曲のお名前は? 126 | 127 | void Mid_TableInit(void); // 各種テーブルの初期化 128 | 129 | DWORDLONG Mid_GetPlaycount1(void); // playcount1 の取得 130 | DWORDLONG Mid_GetPlaycount2(void); // playcount2 の取得 131 | DWORDLONG Mid_GetTicks(void); // tick の取得 132 | 133 | void Mid_GetData(MID_DATA *pData); // 全情報を取得 134 | 135 | 136 | 137 | //// グローバル変数 //// 138 | extern MID_DEVICE Mid_Dev; 139 | extern WORD Mid_PlayTable[16][128]; 140 | extern WORD Mid_PlayTable2[16][128]; // レベルメーター用 141 | extern BYTE Mid_NoteTable[16][128]; // ノート表示用 142 | extern BYTE Mid_NoteWTable[16][128]; // ノート表示用(2) 143 | extern BYTE Mid_PanpodTable[16]; // パンポット 144 | extern BYTE Mid_ExpressionTable[16]; // エクスプレッション 145 | extern BYTE Mid_VolumeTable[16]; // ボリューム 146 | extern DWORD Mid_PlayTime; 147 | 148 | 149 | // C++ 対策 // 150 | #ifdef __cplusplus 151 | } 152 | #endif 153 | 154 | 155 | #endif 156 | -------------------------------------------------------------------------------- /DirectXUTYs/PBGUTY_X.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* PBGUTY_X.h 各種汎用関数詰め合わせ */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_PBGUTY_X_H 7 | #define PBGWIN_PBGUTY_X_H 8 | /* 9 | #ifndef DIRECTDRAW_VERSION 10 | #define DIRECTDRAW_VERSION 0x0500 11 | #endif 12 | 13 | #ifndef DIRECTSOUND_VERSION 14 | #define DIRECTSOUND_VERSION 0x0500 15 | #endif 16 | 17 | #ifndef DIRECTINPUT_VERSION 18 | #define DIRECTINPUT_VERSION 0x0500 19 | #endif 20 | */ 21 | 22 | #include "DX_TYPE.h" // 型を定義 23 | #include "DD_UTY.h" // DDraw & D3D 24 | #include "DS_UTY.h" // DSound 25 | #include "DI_UTY.h" // DInput 26 | #include "UT_MATH.h" // 整数用数学関数 27 | #include "PBGMIDI.h" // MIDI 操作 28 | 29 | 30 | #ifdef _DEBUG 31 | #pragma message("PBGUTY_X(DEBUG)\n") 32 | #else 33 | #pragma message("PBGUTY_X(Release)\n") 34 | #endif 35 | 36 | 37 | #endif 38 | -------------------------------------------------------------------------------- /DirectXUTYs/UT_MATH.C: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* UT_MATH.c 整数限定の数学関数群 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "UT_MATH.h" 7 | #pragma message(PBGWIN_UT_MATH_H) 8 | 9 | 10 | #define RANDH 0x015a 11 | #define RANDL 0x4e35 12 | 13 | static DWORD random_seed; // 乱数のたね // 14 | //DWORD random_ref; 15 | 16 | 17 | ////sinテーブル(cosを含む)//// 18 | extern const signed int SIN256[256+64] = { 19 | 0,6,12,18,25,31,37,43,49,56,62,68,74,80,86,92,97,103,109,115,120,126,131,136, 20 | 142,147,152,157,162,167,171,176,181,185,189,193,197,201,205,209,212,216,219, 21 | 222,225,228,231,234,236,238,241,243,244,246,248,249,251,252,253,254,254,255, 22 | 255,255,256,255,255,255,254,254,253,252,251,249,248,246,244,243,241,238,236, 23 | 234,231,228,225,222,219,216,212,209,205,201,197,193,189,185,181,176,171,167, 24 | 162,157,152,147,142,136,131,126,120,115,109,103,97,92,86,80,74,68,62,56,49,43, 25 | 37,31,25,18,12,6,0,-6,-12,-18,-25,-31,-37,-43,-49,-56,-62,-68,-74,-80,-86,-92, 26 | -97,-103,-109,-115,-120,-126,-131,-136,-142,-147,-152,-157,-162,-167,-171, 27 | -176,-181,-185,-189,-193,-197,-201,-205,-209,-212,-216,-219,-222,-225,-228, 28 | -231,-234,-236,-238,-241,-243,-244,-246,-248,-249,-251,-252,-253,-254,-254, 29 | -255,-255,-255,-256,-255,-255,-255,-254,-254,-253,-252,-251,-249,-248,-246, 30 | -244,-243,-241,-238,-236,-234,-231,-228,-225,-222,-219,-216,-212,-209,-205, 31 | -201,-197,-193,-189,-185,-181,-176,-171,-167,-162,-157,-152,-147,-142,-136, 32 | -131,-126,-120,-115,-109,-103,-97,-92,-86,-80,-74,-68,-62,-56,-49,-43,-37,-31, 33 | -25,-18,-12,-6,0,6 ,12,18,25,31,37,43,49,56,62,68,74,80,86,92,97,103,109,115, 34 | 120,126,131,136,142,147,152,157,162,167,171,176,181,185,189,193,197,201,205, 35 | 209,212,216,219,222,225,228,231,234,236,238,241,243,244,246,248,249,251,252, 36 | 253,254,254,255,255,255 37 | }; 38 | 39 | ////cosテーブル、というのかな?//// 40 | extern const signed int *COS256 = &SIN256[64]; 41 | 42 | 43 | ////atanテーブル//// 44 | static const char ATAN256[]={ 45 | 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 46 | 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 5, 5, 5, 47 | 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 48 | 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9,10,10,10, 49 | 10,10,10,10,11,11,11,11, 11,11,11,12,12,12,12,12, 50 | 12,12,13,13,13,13,13,13, 13,14,14,14,14,14,14,14, 51 | 15,15,15,15,15,15,15,16, 16,16,16,16,16,16,17,17, 52 | 17,17,17,17,17,17,18,18, 18,18,18,18,18,19,19,19, 53 | 19,19,19,19,19,20,20,20, 20,20,20,20,20,21,21,21, 54 | 21,21,21,21,21,21,22,22, 22,22,22,22,22,22,23,23, 55 | 23,23,23,23,23,23,23,24, 24,24,24,24,24,24,24,24, 56 | 25,25,25,25,25,25,25,25, 25,25,26,26,26,26,26,26, 57 | 26,26,26,27,27,27,27,27, 27,27,27,27,27,28,28,28, 58 | 28,28,28,28,28,28,28,28, 29,29,29,29,29,29,29,29, 59 | 29,29,29,30,30,30,30,30, 30,30,30,30,30,30,31,31, 60 | 31,31,31,31,31,31,31,31, 31,31,32,32,32,32,32,32 61 | }; 62 | 63 | 64 | long __fastcall sinl(BYTE deg,int length) 65 | { 66 | //return ((long)sinm(deg)*length)/256; 67 | return ((long)sinm(deg)*length)>>8; 68 | } 69 | 70 | long __fastcall cosl(BYTE deg,int length) 71 | { 72 | //return ((long)cosm(deg)*length)/256; 73 | return ((long)cosm(deg)*length)>>8; 74 | } 75 | 76 | // length*256/(SIN(deg)>0 ? SIN(deg) : 256) // 77 | long __fastcall sinDiv(BYTE deg, int length) 78 | { 79 | register int sind = sinm(deg); 80 | return (length<<8) / (sind>0 ? sind : 256); 81 | } 82 | 83 | // length*256/(COS(deg)>0 ? COS(deg) : 256) // 84 | long __fastcall cosDiv(BYTE deg, int length) 85 | { 86 | register int cosd = cosm(deg); 87 | return (length<<8) / (cosd>0 ? cosd : 256); 88 | } 89 | 90 | BYTE pascal atan8(int x,int y) 91 | { 92 | _asm{ 93 | PUSH ESI 94 | 95 | MOV ECX,y ; ECX := y 96 | MOV ESI,x ; ESI := x 97 | MOV EAX,ECX 98 | OR EAX,ESI 99 | JZ FINISH 100 | 101 | MOV EAX,ECX 102 | CDQ 103 | XOR EAX,EDX 104 | SUB EAX,EDX 105 | MOV EBX,EAX ; EBX := ABS(y) 106 | 107 | MOV EAX,ESI 108 | CDQ 109 | XOR EAX,EDX 110 | SUB EAX,EDX 111 | MOV EDX,EAX ; EDX := ABS(x) 112 | 113 | CMP EDX,EBX 114 | JE JP_E 115 | JL JP_L 116 | 117 | XCHG EBX,EDX ; EBX := ABS(x) , EDX := ABS(y) 118 | MOV EAX,EDX 119 | SHR EDX,24 120 | SHL EAX,8 121 | DIV EBX 122 | MOV EBX,offset ATAN256 123 | XLATB 124 | JMP LAST_C0 125 | EVEN 126 | 127 | JP_E: 128 | MOV AL,32 129 | JMP LAST_C0 130 | EVEN 131 | 132 | JP_L: 133 | MOV EAX,EDX 134 | SHR EDX,24 135 | SHL EAX,8 136 | DIV EBX 137 | MOV EBX,offset ATAN256 138 | XLATB 139 | NEG AL 140 | ADD AL,64 141 | 142 | // EBP = x , ECX = y 143 | LAST_C0: 144 | XOR AH,AH 145 | OR ESI,ESI 146 | JGE LAST_C1 147 | NEG AX 148 | ADD AX,128 149 | 150 | LAST_C1: 151 | OR ECX,ECX 152 | JGE LAST_C2 153 | NEG AL 154 | 155 | LAST_C2: 156 | XOR AH,AH ; RETURN が BYTE だから必要ないのだが... 157 | 158 | FINISH: 159 | POP ESI 160 | } 161 | } 162 | 163 | void __fastcall rnd_seed_set(DWORD val) 164 | { 165 | random_seed = val; 166 | } 167 | 168 | int isqrt(int s) 169 | { 170 | _asm{ 171 | MOV ECX,s 172 | MOV EBX,ECX 173 | MOV EAX,1 174 | JMP SHORT CHK 175 | LP1: 176 | SUB ECX,EAX 177 | ADD EAX,2 178 | CHK: 179 | OR ECX,ECX 180 | JGE LP1 181 | SAR EAX,1 182 | MOV ECX,EAX 183 | IMUL ECX 184 | SUB EAX,ECX 185 | INC EAX 186 | CMP EAX,EBX 187 | JBE FIN 188 | DEC ECX 189 | FIN: 190 | MOV EAX,ECX 191 | } 192 | } 193 | 194 | WORD __fastcall rnd(void) 195 | { 196 | _asm{ 197 | MOV AX,RANDL 198 | MUL word ptr random_seed+2 199 | MOV CX,AX 200 | MOV AX,RANDH 201 | MUL word ptr random_seed 202 | ADD CX,AX 203 | MOV AX,RANDL 204 | MUL word ptr random_seed 205 | ADD AX,1 206 | ADC DX,CX 207 | MOV word ptr random_seed,AX 208 | MOV AX,DX 209 | MOV word ptr random_seed+2,AX 210 | AND AH,7fh 211 | 212 | //MOV result,AX 213 | } 214 | } 215 | -------------------------------------------------------------------------------- /DirectXUTYs/UT_MATH.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* UT_MATH.h 整数限定の数学関数群 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_UT_MATH_H 7 | #define PBGWIN_UT_MATH_H "UT_MATH : Version 0.01 : Update 1999/12/04" 8 | 9 | 10 | // 更新履歴 // 11 | 12 | // 1999/12/05 : PBG_MATH.c より移植開始 13 | 14 | 15 | // 使用禁止かな // 16 | #ifndef DISABLE_UT_MATH 17 | 18 | 19 | // C++ 対策 // 20 | #ifdef __cplusplus 21 | extern "C" { 22 | #endif 23 | 24 | 25 | // ヘッダファイル // 26 | #include 27 | 28 | 29 | // マクロ // 30 | #ifndef max 31 | #define max(a,b) ((a>b) ? (a) : (b)) 32 | #define min(a,b) ((a0 ? SIN(deg) : 256) 48 | long __fastcall cosDiv(BYTE deg, int length); // length*256/(COS(deg)>0 ? COS(deg) : 256) 49 | 50 | BYTE pascal atan8(int x,int y); // 32ビット版です 51 | 52 | 53 | // 平方根(整数版) // 54 | int isqrt(int s); 55 | 56 | 57 | // 乱数 // 58 | void __fastcall rnd_seed_set(DWORD val); 59 | WORD __fastcall rnd(void); 60 | 61 | 62 | // デバッグ用(後で消すこと) // 63 | //extern DWORD random_ref; 64 | 65 | 66 | // C++ 対策 // 67 | #ifdef __cplusplus 68 | } 69 | #endif 70 | 71 | 72 | // 使用禁止かな // 73 | #endif 74 | 75 | 76 | #endif 77 | -------------------------------------------------------------------------------- /ECLC/Calc.cpp: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* CALC.cpp 式の解析 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "CALC.h" 7 | 8 | /* 9 | * [新機能] 10 | * 11 | * 単項演算子 - を追加(二項演算子 + - * / よりも優先順位が高いことに注意) 12 | * 演算子の追加(^べき乗 |OR &AND <左シフト >右シフト) 13 | * 括弧に関するエラーチェックの強化 14 | * 演算用スタックのオーバー・アンダーフローのチェック 15 | * エラー出力関数を変更できるようにした 16 | */ 17 | 18 | 19 | ///// [ 変数 ] ///// 20 | static char ope_dat[CALC_DATA_MAX]; // 演算子用スタック 21 | static int val_dat[CALC_DATA_MAX]; // 数値保持用スタック 22 | static int ope_pow[256]; // 演算子の優先順位(名前が変だな) 23 | static int ope_sp; // 演算子用スタックポインタ 24 | static int val_sp; // 数値保持用スタックポインタ 25 | static void (*calc_err)(char *s); // エラー出力用関数 26 | 27 | 28 | ///// [ 関数 ] ///// 29 | static void calc_top(void); // 先頭で計算処理をして、spを更新する 30 | static void ope_push(char ope); // 演算子(ope)をPushする 31 | static void val_push(int val); // 数値(val)をPushする 32 | 33 | 34 | 35 | void CalcSetup(void (*func)(char *s)) 36 | { 37 | int i; 38 | 39 | // エラー出力用関数をセットする // 40 | calc_err = func; 41 | 42 | // 演算子の優先順位をセットする // 43 | for(i=0;i<256;i++) ope_pow[i]=0; 44 | ope_pow['(']=-1; 45 | ope_pow['+']=ope_pow['-']= 1; 46 | ope_pow['*']=ope_pow['/']= 2; 47 | ope_pow['^']=3; 48 | ope_pow['|']=ope_pow['&']=ope_pow['<']=ope_pow['>']=4; 49 | ope_pow[OPE1_MINUS]= 5; 50 | } 51 | 52 | int Calc(char *factor) 53 | { 54 | int value; 55 | int paren_count = 0; // 括弧の数カウンタ 56 | BOOL bMinusFlag = TRUE; // 単項演算子フラグ 57 | 58 | if(calc_err==(void *)0) return 0; 59 | 60 | ope_dat[0] = 0; 61 | ope_sp = 0; 62 | val_sp = -1; // いいのか? 63 | 64 | while(*factor!='\0'){ 65 | switch(*factor){ 66 | case('('): 67 | bMinusFlag = TRUE; // 単項演算子フラグの初期化 68 | ope_push(*factor); 69 | paren_count++;factor++; 70 | break; 71 | 72 | case(')'): 73 | if(--paren_count<0) 74 | calc_err("左かっこの数が少ないよ"); 75 | 76 | while(ope_dat[ope_sp]!='(') calc_top(); // 結果をこきだす 77 | ope_sp--;factor++; 78 | break; 79 | 80 | case('-'): 81 | if(bMinusFlag){ 82 | bMinusFlag = FALSE; 83 | ope_push(OPE1_MINUS); 84 | factor++; 85 | break; 86 | } 87 | case('+'):case('*'):case('/'):case('^'):case('|'):case('&'): 88 | case('>'):case('<'): 89 | if(ope_pow[ope_dat[ope_sp]]>=ope_pow[*factor]) calc_top(); 90 | ope_push(*factor); 91 | factor++; 92 | break; 93 | 94 | case('0'):case('1'):case('2'):case('3'):case('4'): 95 | case('5'):case('6'):case('7'):case('8'):case('9'): 96 | for(value=0;*factor>='0'&&*factor<='9';factor++){ 97 | value*=10; 98 | value+=(*factor)-'0'; 99 | } 100 | val_push(value); 101 | bMinusFlag = FALSE; // 代入されたらフラグは必ずオフにする 102 | break; 103 | 104 | default: 105 | calc_err("謎の演算子もしくは定義されていない定数がある"); 106 | break; 107 | } 108 | } 109 | 110 | if(paren_count>0) 111 | calc_err("右かっこの数が少ないよ"); 112 | 113 | while(ope_sp>0) calc_top(); // 結果をこきだす 114 | 115 | return val_dat[0]; 116 | } 117 | 118 | static void calc_top(void) 119 | { 120 | int i; 121 | 122 | switch(ope_dat[ope_sp]){ 123 | case(OPE1_MINUS): // 単項演算子 - 124 | val_dat[val_sp]*=(-1); 125 | if((--ope_sp)<0) 126 | calc_err("スタックアンダーフローです"); 127 | return; 128 | 129 | case('+'): // 加算(二項) 130 | val_dat[val_sp-1]+=val_dat[val_sp]; 131 | break; 132 | 133 | case('-'): // 減算(二項) 134 | val_dat[val_sp-1]-=val_dat[val_sp]; 135 | break; 136 | 137 | case('*'): // 乗算(二項) 138 | val_dat[val_sp-1]*=val_dat[val_sp]; 139 | break; 140 | 141 | case('/'): // 除算(二項) 142 | if(val_dat[val_sp]==0) 143 | calc_err("ゼロで除算しようとしている"); 144 | 145 | val_dat[val_sp-1]/=val_dat[val_sp]; 146 | break; 147 | 148 | case('^'): // べき乗 149 | if(val_dat[val_sp]==0){ // 0乗 150 | val_dat[val_sp-1]=1; 151 | break; 152 | } 153 | i=val_dat[val_sp-1]; 154 | while((--val_dat[val_sp])>0) 155 | val_dat[val_sp-1]*=i; 156 | break; 157 | 158 | case('&'): // 論理積 159 | val_dat[val_sp-1]&=val_dat[val_sp]; 160 | break; 161 | 162 | case('|'): // 論理和 163 | val_dat[val_sp-1]|=val_dat[val_sp]; 164 | break; 165 | 166 | case('<'): // 左シフト 167 | val_dat[val_sp-1]=val_dat[val_sp-1]<'): // 右シフト 171 | val_dat[val_sp-1]=val_dat[val_sp-1]>>val_dat[val_sp]; 172 | break; 173 | } 174 | 175 | // エラーの場合はデクリメントされなくても良いので... // 176 | if((--val_sp)<0 || (--ope_sp)<0) 177 | calc_err("スタックアンダーフローです"); 178 | } 179 | 180 | static void ope_push(char ope) 181 | { 182 | if(ope_sp+1>=CALC_DATA_MAX) 183 | calc_err("スタックオーバーフローです"); 184 | 185 | ope_dat[++ope_sp]=ope; 186 | } 187 | 188 | static void val_push(int value) 189 | { 190 | if(val_sp+1>=CALC_DATA_MAX) 191 | calc_err("スタックオーバーフローです"); 192 | 193 | val_dat[++val_sp]=value; 194 | } 195 | -------------------------------------------------------------------------------- /ECLC/Calc.h: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* CALC.h 式の解析 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_CALC_H 7 | #define PBGWIN_CALC_H "CALC : Version 0.02 : Update 2000/02/03" 8 | #pragma message(PBGWIN_CALC_H) 9 | 10 | #include 11 | 12 | 13 | 14 | ///// [ 定数 ] ///// 15 | #define CALC_DATA_MAX 100 // スタック領域の大きさ 16 | #define OPE1_MINUS '@' // 単項演算子 - に対する記号 17 | 18 | 19 | 20 | ///// [ 関数 ] ///// 21 | extern void CalcSetup(void (*func)(char *s)); // 計算の準備をする 22 | extern int Calc(char *factor); // 引数:空白の無い式 23 | 24 | 25 | 26 | #endif 27 | -------------------------------------------------------------------------------- /ECLC/Eclcdef.h: -------------------------------------------------------------------------------- 1 | /*************************************************************************************************/ 2 | /* ECLCDEF.H ECLC用のコンバート情報の定義など */ 3 | /* */ 4 | /*************************************************************************************************/ 5 | 6 | #include "..\\Gian07SrcFiles\\ECL.H" 7 | 8 | 9 | #define CMDLEN_MAX 20 10 | 11 | typedef enum{ 12 | DT_U1, // 1バイトデータ 13 | DT_U2, // 2バイトデータ 14 | DT_U4, // 4バイトデータ 15 | DT_S1, // 1バイト符号有りデータ 16 | DT_S2, // 2バイト符号有りデータ 17 | DT_S4, // 4バイト符号有りデータ 18 | DT_JMP, // ジャンプ命令のアドレス値 19 | DT_END // コマンド終了 20 | } ECLC_CMD; 21 | 22 | typedef struct{ 23 | char *name; // 置換前の文字列(コマンド) 24 | BYTE cmd_val; // コマンドの変換後の値 25 | ECLC_CMD cmd[CMDLEN_MAX]; // コマンドの並び 26 | } CONV_INFO; 27 | 28 | 29 | // 記述するときの注意 : 繰り返し命令は符号無し2バイトとする // 30 | CONV_INFO CMD_BUF[ECL_CMDMAX] = { 31 | {"SETUP",ECL_SETUP,DT_U4 ,DT_U4 ,DT_END}, // HP,SCORE 32 | {"END" ,ECL_END ,DT_END}, 33 | {"JMP" ,ECL_JMP ,DT_JMP,DT_END}, 34 | {"LOOP" ,ECL_LOOP ,DT_JMP,DT_U2 ,DT_END}, 35 | {"CALL" ,ECL_CALL ,DT_JMP,DT_END}, 36 | {"RET" ,ECL_RET ,DT_END}, 37 | {"JHPL" ,ECL_JHPL ,DT_JMP,DT_U4 ,DT_END}, 38 | {"JHPS" ,ECL_JHPS ,DT_JMP,DT_U4 ,DT_END}, 39 | {"JDIF" ,ECL_JDIF ,DT_JMP,DT_JMP,DT_JMP,DT_JMP,DT_END}, 40 | {"JDSB" ,ECL_JDSB ,DT_JMP,DT_END}, 41 | {"JFCL" ,ECL_JFCL ,DT_JMP,DT_U4 ,DT_END}, 42 | {"JFCS" ,ECL_JFCS ,DT_JMP,DT_U4 ,DT_END}, 43 | {"STI" ,ECL_STI ,DT_JMP,DT_U1 ,DT_U4 ,DT_END}, // Addr,Flags,CmpValue 44 | {"CLI" ,ECL_CLI ,DT_U1 ,DT_END}, // Flags 45 | 46 | {"NOP" ,ECL_NOP ,DT_U2 ,DT_END}, // turn 47 | {"NOPSC",ECL_NOPSC,DT_U2 ,DT_END}, // turn 48 | {"MOV" ,ECL_MOV ,DT_U2 ,DT_END}, // turn 49 | {"ROL" ,ECL_ROL ,DT_S1 ,DT_U2 ,DT_END}, // vd,turn 50 | {"LROL" ,ECL_LROL ,DT_S4 ,DT_S4 ,DT_S1 ,DT_U2 ,DT_END}, // vx,vy,vd,turn 51 | {"WAVX" ,ECL_WAVX ,DT_S4 ,DT_U1 ,DT_S1 ,DT_U2 ,DT_END}, // vx,amp,vd,turn 52 | {"WAVY" ,ECL_WAVY ,DT_S4 ,DT_U1 ,DT_S1 ,DT_U2 ,DT_END}, // vy,amp,vd,turn 53 | {"MXA" ,ECL_MXA ,DT_S2 ,DT_U2 ,DT_END}, // x(Grp),turn 54 | {"MYA" ,ECL_MYA ,DT_S2 ,DT_U2 ,DT_END}, // y(Grp),turn 55 | {"MXYA" ,ECL_MXYA ,DT_S2 ,DT_S2 ,DT_U2 ,DT_END}, // x(Grp),y(Grp),turn 56 | {"MXS" ,ECL_MXS ,DT_U2 ,DT_END}, // turn 57 | {"MYS" ,ECL_MYS ,DT_U2 ,DT_END}, // turn 58 | {"MXYS" ,ECL_MXYS ,DT_U2 ,DT_END}, // turn 59 | 60 | {"DEGA" ,ECL_DEGA ,DT_U1 ,DT_END}, 61 | {"DEGR" ,ECL_DEGR ,DT_S1 ,DT_END}, 62 | {"DEGX" ,ECL_DEGX ,DT_END}, 63 | {"DEGS" ,ECL_DEGS ,DT_END}, 64 | {"SPDA" ,ECL_SPDA ,DT_U4 ,DT_END}, 65 | {"SPDR" ,ECL_SPDR ,DT_S4 ,DT_END}, 66 | {"XYA" ,ECL_XYA ,DT_S2 ,DT_S2 ,DT_END}, 67 | {"XYR" ,ECL_XYR ,DT_S2 ,DT_S2 ,DT_END}, 68 | {"DEGXU",ECL_DEGXU,DT_END}, 69 | {"DEGXD",ECL_DEGXD,DT_END}, 70 | {"DEGEX",ECL_DEGEX,DT_END}, 71 | {"XYS" ,ECL_XYS ,DT_END}, 72 | 73 | {"TAMA" ,ECL_TAMA ,DT_END}, 74 | {"TAUTO",ECL_TAUTO,DT_U1 ,DT_END}, // rep 75 | {"TXYR" ,ECL_TXYR ,DT_S2 ,DT_S2 ,DT_END}, // x,y 76 | {"TCMD" ,ECL_TCMD ,DT_U1 ,DT_END}, // cmd 77 | {"TDEGA",ECL_TDEGA,DT_U1 ,DT_U1 ,DT_END}, // deg,deg_wid 78 | {"TDEGR",ECL_TDEGR,DT_S1 ,DT_S1 ,DT_END}, // deg,deg_wid 79 | {"TNUMA",ECL_TNUMA,DT_U1 ,DT_U1 ,DT_END}, // n,ns 80 | {"TNUMR",ECL_TNUMR,DT_S1 ,DT_S1 ,DT_END}, // n,ns 81 | {"TSPDA",ECL_TSPDA,DT_U1 ,DT_S1 ,DT_END}, // v,a 82 | {"TSPDR",ECL_TSPDR,DT_S1 ,DT_S1 ,DT_END}, // v,a (v はフラグ変化をしないものとする) 83 | {"TOPT" ,ECL_TOPT ,DT_U1 ,DT_END}, // option 84 | {"TTYPE",ECL_TTYPE,DT_U1 ,DT_END}, // type 85 | {"TCOL" ,ECL_TCOL ,DT_U1 ,DT_END}, // color 86 | {"TVDEG",ECL_TVDEG,DT_S1 ,DT_END}, // vd 87 | {"TREP" ,ECL_TREP ,DT_U1 ,DT_END}, // t_rep 88 | {"TDEGS",ECL_TDEGS,DT_END}, // 89 | {"TDEGE",ECL_TDEGE,DT_END}, // 90 | {"TAMA2",ECL_TAMA2,DT_END}, 91 | {"TCLR" ,ECL_TCLR ,DT_END}, 92 | 93 | {"LASER" ,ECL_LASER,DT_END}, 94 | {"LCMD" ,ECL_LCMD ,DT_U1 ,DT_END}, // cmd 95 | {"LLA" ,ECL_LLA ,DT_S4 ,DT_END}, // l 96 | {"LLR" ,ECL_LLR ,DT_S4 ,DT_END}, // l 97 | {"LL2" ,ECL_LL2 ,DT_S4 ,DT_END}, // l2 98 | {"LDEGA" ,ECL_LDEGA,DT_U1 ,DT_U1 ,DT_END}, // d,dw 99 | {"LDEGR" ,ECL_LDEGR,DT_S1 ,DT_S1 ,DT_END}, // d,dw 100 | {"LNUMA" ,ECL_LNUMA,DT_U1 ,DT_END}, // n(速射はないでしょ...) 101 | {"LNUMR" ,ECL_LNUMR,DT_S1 ,DT_END}, // n 102 | {"LSPDA" ,ECL_LSPDA,DT_S4 ,DT_END}, // v(加速はないでしょ...) 103 | {"LSPDR" ,ECL_LSPDR,DT_S4 ,DT_END}, // v 104 | {"LCOL" ,ECL_LCOL ,DT_U1 ,DT_END}, // color 105 | {"LTYPE" ,ECL_LTYPE,DT_U1 ,DT_END}, // type 106 | {"LWA" ,ECL_LWA ,DT_S4 ,DT_END}, // width 107 | {"LDEGS" ,ECL_LDEGS,DT_END}, // 108 | {"LDEGE" ,ECL_LDEGE,DT_END}, // 109 | {"LXY" ,ECL_LXY ,DT_S2 ,DT_S2 ,DT_END}, // x,y 110 | {"LASER2",ECL_LASER2,DT_END}, 111 | 112 | {"LLSET" ,ECL_LLSET ,DT_END}, 113 | {"LLOPEN" ,ECL_LLOPEN ,DT_U1,DT_END}, // LLaserID 114 | {"LLCLOSE" ,ECL_LLCLOSE ,DT_U1,DT_END}, // LLaserID 115 | {"LLCLOSEL" ,ECL_LLCLOSEL ,DT_U1,DT_END}, // LLaserID 116 | {"LLDEGR" ,ECL_LLDEGR ,DT_U1,DT_S1 ,DT_END}, // LLaserID,Degree(Rel) 117 | 118 | {"DRAW_ON" ,ECL_DRAW_ON ,DT_END}, 119 | {"DRAW_OFF" ,ECL_DRAW_OFF ,DT_END}, 120 | {"CLIP_ON" ,ECL_CLIP_ON ,DT_END}, 121 | {"CLIP_OFF" ,ECL_CLIP_OFF ,DT_END}, 122 | {"DAMAGE_ON" ,ECL_DAMAGE_ON ,DT_END}, 123 | {"DAMAGE_OFF",ECL_DAMAGE_OFF,DT_END}, 124 | {"HITSB_ON" ,ECL_HITSB_ON ,DT_END}, 125 | {"HITSB_OFF" ,ECL_HITSB_OFF ,DT_END}, 126 | {"RLCHG_ON" ,ECL_RLCHG_ON ,DT_END}, 127 | {"RLCHG_OFF" ,ECL_RLCHG_OFF ,DT_END}, 128 | 129 | {"ANM" ,ECL_ANM ,DT_U1 ,DT_S1 ,DT_END}, // ptn,spd 130 | {"PSE" ,ECL_PSE ,DT_U1 ,DT_END}, // sound_no 131 | {"INT" ,ECL_INT ,DT_U1 ,DT_END}, // 割り込み番号 132 | {"EXDEGD" ,ECL_EXDEGD ,DT_U1 ,DT_END}, // EXDEG 用の角度増分 133 | {"ENEMYSET",ECL_ENEMYSET,DT_S2 ,DT_S2 ,DT_S1 ,DT_END}, // dx,dy,EnemyID 134 | 135 | {"MOVR",ECL_MOVR,DT_U1 ,DT_U1 ,DT_END}, // Reg/StID , Reg/StID 136 | {"MOVC",ECL_MOVC,DT_U1 ,DT_S4 ,DT_END}, // Reg , Const(32Bit) 137 | {"ADD" ,ECL_ADD ,DT_U1 ,DT_U1 ,DT_END}, // Reg0,Reg1 : Reg0 = Reg0+Reg1 138 | {"SUB" ,ECL_SUB ,DT_U1 ,DT_U1 ,DT_END}, // Reg0,Reg1 : Reg0 = Reg0-Reg1 139 | {"SINL",ECL_SINL,DT_U1 ,DT_U1 ,DT_END}, // Reg0,Reg1 : Reg0 = Reg0*sin[Reg1%256] 140 | {"COSL",ECL_COSL,DT_U1 ,DT_U1 ,DT_END}, // Reg0,Reg1 : Reg0 = Reg0*cos[Reg1%256] 141 | {"MOD" ,ECL_MOD ,DT_U1 ,DT_U4 ,DT_END}, // Reg0,Const : Reg0 = Reg0%(Const) 142 | {"RND" ,ECL_RND ,DT_U1 ,DT_END}, // Reg0 : Reg0 = rnd() 143 | {"CMPR",ECL_CMPR,DT_U1 ,DT_U1 ,DT_END}, // Reg0,Reg1 : Signed Compare Reg0,Reg1 144 | {"CMPC",ECL_CMPC,DT_U1 ,DT_S4 ,DT_END}, // Reg,Const(32) : Signed Compare Reg,Const 145 | {"JL" ,ECL_JL ,DT_JMP,DT_END}, // JMP if CmpResult > 0 146 | {"JS" ,ECL_JS ,DT_JMP,DT_END}, // JMP if CmpResult < 0 147 | {"INC" ,ECL_INC ,DT_U1 ,DT_END}, // Reg : Reg++ 148 | {"DEC" ,ECL_DEC ,DT_U1 ,DT_END}, // Reg : Reg-- 149 | }; 150 | -------------------------------------------------------------------------------- /GIAN07/BOMBEFC.CPP: -------------------------------------------------------------------------------- 1 | /* 2 | * BombEfc.cpp : 爆発系エフェクト 3 | * 4 | */ 5 | 6 | #include "BombEfc.h" 7 | 8 | 9 | BombEfcCtrl BombEfc[EXBOMB_MAX]; 10 | 11 | // 秘密の関数 // 12 | FVOID _ExBombSTDInit(BombEfcCtrl *p); 13 | FVOID _ExBombSTDDraw(BombEfcCtrl *p); 14 | FVOID _ExBombSTDMove(BombEfcCtrl *p); 15 | 16 | 17 | 18 | // 爆発系エフェクトの初期化 // 19 | FVOID ExBombEfcInit(void) 20 | { 21 | int i; 22 | 23 | for(i=0; ix = x; 45 | p->y = y; 46 | p->type = type; 47 | p->count = 0; 48 | 49 | switch(type){ 50 | case EXBOMB_STD: _ExBombSTDInit(p); break; 51 | 52 | default: 53 | return; 54 | } 55 | 56 | // ここまできたら、無事にエフェクトがセットされた事になる // 57 | p->bIsUsed = TRUE; 58 | } 59 | 60 | 61 | // 爆発系エフェクトを描画する 62 | FVOID ExBombEfcDraw(void) 63 | { 64 | int i; 65 | 66 | for(i=0; i 64*3+32) BombEfc[i].bIsUsed = FALSE; 90 | break; 91 | 92 | default: 93 | return; 94 | } 95 | } 96 | } 97 | 98 | 99 | FVOID _ExBombSTDInit(BombEfcCtrl *p) 100 | { 101 | int i, x, y; 102 | SpObj *target; 103 | 104 | x = p->x; 105 | y = p->y; 106 | 107 | target = p->Obj; 108 | for(i=0; ix = x; 110 | target->y = y; 111 | target->d = i % (7*2); 112 | } 113 | } 114 | 115 | 116 | FVOID _ExBombSTDDraw(BombEfcCtrl *p) 117 | { 118 | int i, x, y, dx; 119 | SpObj *target; 120 | RECT src; 121 | 122 | // Graphic 48 * 48 // 123 | target = p->Obj; 124 | for(i=0; id <= 7*2){ 126 | x = (target->x >> 6) - 24; 127 | y = (target->y >> 6) - 24; 128 | dx = (target->d>>1) * 48; 129 | BltSetRect(&src, dx, 296, 48, 48); 130 | GrpBlt(&src, x, y, GrTama); 131 | } 132 | } 133 | } 134 | 135 | 136 | FVOID _ExBombSTDMove(BombEfcCtrl *p) 137 | { 138 | int i, j, x, y, v, rv; 139 | DWORD t; 140 | BYTE d, rd; 141 | SpObj *target; 142 | 143 | x = p->x; 144 | y = p->y; 145 | t = p->count; 146 | v = sinl(t/2-64, 200*64)+(200*64); 147 | 148 | target = p->Obj; 149 | for(i=j=0; id > 7*2){ 151 | if(t > 64*3) continue; 152 | rd = rnd(); 153 | rv = rnd()%256+128; 154 | target->vx = cosl(rd, rv); 155 | target->vy = sinl(rd, rv); 156 | 157 | d = t*2 + ((j%8)<<5);// + rnd()%8 - 4; 158 | //v = sinl(degx,64*90)+64*90; 159 | 160 | rv = v - rnd()%(v>>2); 161 | target->x = cosl(d,rv) + x; 162 | target->y = sinl(d,rv) + y; 163 | target->d = 0; 164 | 165 | j++; 166 | } 167 | else{ 168 | target->d = target->d + 1; 169 | target->x += target->vx; 170 | target->y += target->vy; 171 | target->vx -= (target->vx>>3); 172 | target->vy -= (target->vy>>3); 173 | } 174 | } 175 | } 176 | -------------------------------------------------------------------------------- /GIAN07/BOMBEFC.H: -------------------------------------------------------------------------------- 1 | /* 2 | * BombEfc.h : 爆発系エフェクト 3 | * 4 | */ 5 | 6 | #ifndef PBG_BOMBEFC_VERSION 7 | #define PBG_BOMBEFC_VERSION "爆発系エフェクト : Version 0.01 : Update 2000/11/21" 8 | 9 | #include "Gian.h" 10 | 11 | 12 | 13 | /***** [ 定数 ] *****/ 14 | #define EXBOMB_MAX 3 // エフェクトの同時発生数 15 | #define EXBOMB_STD 0 // よくあるタイプの爆発(??) 16 | #define EXBOMB_OBJMAX 200 // エフェクト補助用オブジェクトの個数 17 | 18 | 19 | 20 | /***** [構造体] *****/ 21 | typedef struct tagSpObj { 22 | int x,y; 23 | int vx,vy; 24 | BYTE d; 25 | } SpObj; 26 | 27 | typedef struct tagBombEfcCtrl { 28 | int x,y; // エフェクトの中心座標 29 | BOOL bIsUsed; // この構造体は使用中か 30 | DWORD count; // フレームカウンタ 31 | 32 | SpObj Obj[EXBOMB_OBJMAX]; // エフェクト補助用オブジェクト 33 | 34 | BYTE type; // エフェクトの種類 35 | } BombEfcCtrl; 36 | 37 | 38 | 39 | /***** [関数プロトタイプ] *****/ 40 | FVOID ExBombEfcInit(void); // 爆発系エフェクトの初期化 41 | FVOID ExBombEfcSet(int x, int y, BYTE type); // 爆発系エフェクトをセットする 42 | FVOID ExBombEfcDraw(void); // 爆発系エフェクトを描画する 43 | FVOID ExBombEfcMove(void); // 爆発系エフェクトを動作させる 44 | 45 | 46 | 47 | #endif 48 | -------------------------------------------------------------------------------- /GIAN07/BOSS.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* Boss.h ボスの処理(中ボス含む) */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_BOSS_H 7 | #define PBGWIN_BOSS_H "BOSS : Version 0.01 : Update 2000/02/27" 8 | //#pragma message(PBGWIN_BOSS_H) 9 | 10 | #include "Gian.h" 11 | //#include "Enemy.h" 12 | 13 | 14 | ///// [ 定数 ] ///// 15 | 16 | // 最大数 // 17 | #define BOSS_MAX 4 // ボスの最大出現数(二匹以上出るのか??) 18 | 19 | // ボスの状態 // 20 | #define BEXST_NORM 0x00 // 通常のECLで動作中 21 | #define BEXST_DEAD 0x01 // 死亡中<-こいつは多分使っていないぞ(2000/10/31) 22 | #define BEXST_WING01 0x02 // 蝶の羽 23 | #define BEXST_WING02 0x03 // 天使の羽 24 | #define BEXST_SHILD1 0x04 // シールド1 25 | #define BEXST_SHILD2 0x05 // シールド2 26 | 27 | // 体力ゲージ編 // 28 | #define BOSSHPG_WIDTH 256 // 体力ゲージの幅 29 | #define BOSSHPG_HEIGHT 24 // 体力ゲージの高さ 30 | #define BOSSHPG_START_X X_MAX // 体力ゲージの初期X 31 | #define BOSSHPG_END_X 260 // 体力ゲージの最終X 32 | 33 | #define BHPG_DEAD 0x00 // 体力ゲージは使用されていない 34 | #define BHPG_OPEN1 0x01 // 体力ゲージを開く(第一エフェクト中) 35 | #define BHPG_OPEN2 0x02 // 体力ゲージを開く(体力上昇中) 36 | #define BHPG_NORM 0x03 // 体力ゲージの準備ができている 37 | #define BHPG_CLOSE 0x04 // 体力ゲージを閉じる 38 | #define BHPG_OPEN3 0x05 // 体力ゲージを更新する 39 | 40 | 41 | 42 | ///// [構造体] ///// 43 | 44 | // 特殊当たり判定 // 45 | typedef struct tagEXHITCHK{ 46 | BYTE flags[60][60]; 47 | } EXHITCHK; 48 | 49 | // ボスデータ // 50 | typedef struct tagBOSS_DATA{ 51 | ENEMY_DATA Edat; // 標準の敵データ(実体であることに注意) 52 | EXHITCHK *Hit; // 特殊当たり判定(NULL なら使用しない) 53 | 54 | FVOIDFN(*ExMove)(tagBOSS_DATA *); // 特殊移動用関数 55 | 56 | DWORD ExCount; // ある状態におけるカウンタ(推移時にゼロ初期化) 57 | BYTE ExState; // 特殊状態 58 | BYTE IsUsed; // このデータは使用されているか(非ゼロなら使用されている) 59 | } BOSS_DATA; 60 | 61 | // ボスの体力ゲージ // 62 | typedef struct tagBOSSHPG_INFO{ 63 | DWORD Now,Max; // 体力の現在値&最大値 64 | DWORD Next; // 次の体力の値 65 | DWORD Update; // 更新用の値 66 | DWORD Count; // フレーム数保持 67 | 68 | WORD XTemp[BOSSHPG_HEIGHT]; // HPゲージの演出用 69 | BYTE State; // 状態 70 | } BOSSHPG_INFO; 71 | 72 | 73 | 74 | ///// [ 関数 ] ///// 75 | FVOID BossDataInit(void); // ボスデータ配列を初期化する(中断、ステージクリア時に使用) 76 | FVOID BossSet(int x,int y,DWORD BossID); // ボスをセットする(For SCL) 77 | FVOID BossSetEx(int x,int y,DWORD BossID); // ボスをセットする(For ECL) 78 | FVOID BossMove(void); // ボスを動かす 79 | FVOID BossDraw(void); // ボスを描画する 80 | 81 | FVOID BossClearCmd(void); // ボス用・敵弾クリアの前処理関数 82 | FINT BossGetBitLeft(void); // 残りビット数を返す 83 | 84 | FVOID BossKillAll(void); // 現在出現しているボス全てのHPを0にする 85 | FBOOL BossDamage(int x,int y,int damage); // ボスにダメージを与える 86 | FBOOL BossDamage2(int x,int y,int damage); // ボスにダメージを与える(y上方向無限Ver) 87 | FVOID BossDamage3(int x,int y,BYTE d); // ボスにダメージを与える(ナナメレーザー) 88 | FVOID BossDamage4(int damage); // ボスにダメージを与える(すべての敵) 89 | 90 | FVOID BossHPG_Draw(void); // ボスの体力ゲージを描画する 91 | 92 | FDWORD GetBossHPSum(void); // ボスの体力の総和を求める 93 | 94 | FVOID BossINT(ENEMY_DATA *e,BYTE IntID); // ボス用割り込み処理 95 | FVOID BossBitAttack(ENEMY_DATA *e, DWORD AtkID); // ビット攻撃アドレス指定 96 | FVOID BossBitLaser(ENEMY_DATA *e, BYTE LaserCmd); // ビットにレーザーコマンドセット 97 | FVOID BossBitCommand(ENEMY_DATA *e, BYTE Cmd, int Param); // ビット命令送信 98 | 99 | 100 | ///// [ 変数 ] ///// 101 | extern BOSS_DATA Boss[BOSS_MAX]; // ボスデータ格納用構造体 102 | extern WORD BossNow; // 現在のボスの数 103 | 104 | #endif 105 | -------------------------------------------------------------------------------- /GIAN07/DEMOPLAY.CPP: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DemoPlay.cpp デモプレイ処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "DemoPlay.h" 7 | 8 | 9 | BOOL DemoplaySaveEnable = FALSE; // デモプレイのセーブが動作しているか 10 | BOOL DemoplayLoadEnable = FALSE; // デモプレイのロードが動作しているか 11 | DEMOPLAY_INFO DemoInfo; // デモプレイ情報 12 | WORD DemoBuffer[DEMOBUF_MAX]; // デモプレイ用バッファ 13 | DWORD DemoBufPtr; // デモプレイ用バッファPtr(Cのそれではない) 14 | CONFIG_DATA ConfigTemp; // コンフィグのデータ一時保存用 15 | 16 | //DWORD RndBuf[RNDBUF_MAX]; 17 | 18 | 19 | 20 | // デモプレイデータの準備 // 21 | FVOID DemoplayInit(void) 22 | { 23 | // 乱数の準備 // 24 | DemoInfo.RndSeed = (DWORD)(rnd()+1)*(DWORD)(rnd()+1); 25 | rnd_seed_set(DemoInfo.RndSeed); 26 | 27 | DemoInfo.Exp = Viv.exp; 28 | DemoInfo.Weapon = Viv.weapon; 29 | DemoInfo.CfgDat = ConfigDat; 30 | 31 | DemoBufPtr = 0; 32 | DemoplaySaveEnable = TRUE; 33 | } 34 | 35 | 36 | // デモプレイデータを保存する // 37 | FVOID DemoplayRecord(WORD key) 38 | { 39 | if(!DemoplaySaveEnable) return; 40 | 41 | DemoBuffer[DemoBufPtr++] = key; 42 | 43 | // バッファが最後に来たか、ESCが押された場合 // 44 | if(DemoBufPtr==DEMOBUF_MAX || (key&KEY_ESC)){ 45 | DemoBufPtr--; 46 | DemoplaySave(); 47 | DemoplaySaveEnable = FALSE; 48 | } 49 | } 50 | 51 | 52 | // デモプレイデータをファイルに書き込む // 53 | FVOID DemoplaySave(void) 54 | { 55 | char buf[100]; 56 | FILE *fp; 57 | 58 | if(!DemoplaySaveEnable) return; 59 | 60 | DemoBuffer[DemoBufPtr] = KEY_ESC; 61 | DemoInfo.DataSize = DemoBufPtr+1; 62 | 63 | sprintf(buf,"STG%dDemo.DAT",GameStage); 64 | fp = fopen(buf,"wb"); 65 | if(fp==NULL) return; 66 | 67 | fwrite(&DemoInfo,sizeof(DEMOPLAY_INFO),1,fp); 68 | fwrite(DemoBuffer,sizeof(WORD)*(DemoBufPtr+1),1,fp); 69 | fclose(fp); 70 | 71 | DemoplaySaveEnable = FALSE; 72 | } 73 | 74 | 75 | // デモプレイデータをロードする // 76 | FBOOL DemoplayLoad(int stage) 77 | { 78 | BIT_DEVICE *in; 79 | BYTE *temp,*p; 80 | 81 | // ファイルを開く // 82 | in=FilStartR("ENEMY.DAT",BD_FILE_READ); 83 | if(in == NULL) return FALSE; 84 | 85 | // 展開 // 86 | temp = MemExpand(in,stage-1+18); 87 | if(temp == NULL) return FALSE; 88 | FilEnd(in); 89 | 90 | p = temp; 91 | memcpy(&DemoInfo,p,sizeof(DEMOPLAY_INFO)); 92 | 93 | p = temp + sizeof(DEMOPLAY_INFO); 94 | memcpy(DemoBuffer,p,sizeof(WORD)*DemoInfo.DataSize); 95 | 96 | LocalFree(temp); 97 | 98 | DemoBufPtr = 0; 99 | DemoplayLoadEnable = TRUE; 100 | 101 | // コンフィグの初期化 // 102 | ConfigTemp = ConfigDat; 103 | 104 | ConfigDat.BombStock = DemoInfo.CfgDat.BombStock; 105 | ConfigDat.GameLevel = DemoInfo.CfgDat.GameLevel; 106 | ConfigDat.PlayerStock = DemoInfo.CfgDat.PlayerStock; 107 | ConfigDat.InputFlags = DemoInfo.CfgDat.InputFlags; 108 | 109 | Viv.exp = DemoInfo.Exp; 110 | Viv.weapon = DemoInfo.Weapon; 111 | Viv.left = ConfigDat.PlayerStock; 112 | Viv.bomb = ConfigDat.BombStock; 113 | 114 | // 乱数の初期化 // 115 | rnd_seed_set(DemoInfo.RndSeed); 116 | 117 | return TRUE; 118 | } 119 | 120 | 121 | // Key_Data を返す // 122 | FWORD DemoplayMove(void) 123 | { 124 | DWORD ptr; 125 | 126 | if(!DemoplayLoadEnable) return KEY_ESC; 127 | 128 | ptr = DemoBufPtr; 129 | if(ptr>=DemoInfo.DataSize){ 130 | ptr = DemoBufPtr; 131 | DemoplayLoadEnable = FALSE; 132 | } 133 | else DemoBufPtr++; 134 | 135 | return DemoBuffer[ptr]; 136 | } 137 | 138 | 139 | // デモプレイロードの事後処理 // 140 | FVOID DemoplayLoadCleanup(void) 141 | { 142 | ConfigDat = ConfigTemp; 143 | DemoplayLoadEnable = FALSE; 144 | } 145 | 146 | 147 | // リプレイデータの準備 // 148 | FVOID ReplayInit(void) 149 | { 150 | // これは同じ // 151 | DemoplayInit(); 152 | } 153 | 154 | 155 | // リプレイデータを保存する // 156 | FVOID ReplayRecord(WORD key) 157 | { 158 | if(!DemoplaySaveEnable) return; 159 | 160 | DemoBuffer[DemoBufPtr++] = key; 161 | 162 | if(DemoBufPtr == DEMOBUF_MAX || (key&KEY_ESC)){ 163 | DemoBufPtr--; 164 | ReplaySave(); // 強制吐き出し 165 | DemoplaySaveEnable = FALSE; 166 | } 167 | } 168 | 169 | 170 | // リプレイデータをファイルに書き込む // 171 | FVOID ReplaySave(void) 172 | { 173 | BIT_DEVICE *in, *out; 174 | char buf[100]; 175 | 176 | if(!DemoplaySaveEnable) return; 177 | 178 | // すぐさま、無効化する // 179 | DemoplaySaveEnable = FALSE; 180 | 181 | DemoBuffer[DemoBufPtr] = KEY_ESC; 182 | DemoInfo.DataSize = DemoBufPtr+1; 183 | 184 | // ファイル名を確定 // 185 | if(GameStage == GRAPH_ID_EXSTAGE) strcpy(buf, "秋霜りぷEx.DAT"); 186 | else sprintf(buf, "秋霜りぷ%d.DAT", GameStage); 187 | 188 | // 仮ヘッダね // 189 | FileHead.name = PBG_HEADNAME; 190 | FileHead.n = 2; 191 | FileHead.sum = 0; 192 | 193 | out = FilStartW(buf, BD_FILE_WRITE, FileHead.n); 194 | if(NULL == out) return; 195 | 196 | fwrite(&FileHead,sizeof(PBG_FILEHEAD),1,out->p.file); 197 | fwrite(FileInfo,sizeof(PBG_FILEINFO),FileHead.n,out->p.file); 198 | 199 | in = BitMemCreate((BYTE *)&DemoInfo, BD_MEMORY_READ, sizeof(DEMOPLAY_INFO)); 200 | Compress(in, out, 0); 201 | BitDevRelease(in); 202 | 203 | in = BitMemCreate((BYTE *)DemoBuffer, BD_MEMORY_READ, sizeof(WORD) * DemoInfo.DataSize); 204 | Compress(in, out, 1); 205 | BitDevRelease(in); 206 | 207 | WriteHead(out); 208 | FilEnd(out); 209 | } 210 | 211 | 212 | // リプレイデータをロードする // 213 | FBOOL ReplayLoad(int stage) 214 | { 215 | BIT_DEVICE *in; 216 | BYTE *temp; 217 | char buf[100]; 218 | 219 | // ファイル名を確定 // 220 | if(GameStage == GRAPH_ID_EXSTAGE) strcpy(buf, "秋霜りぷEx.DAT"); 221 | else sprintf(buf, "秋霜りぷ%d.DAT", stage); 222 | 223 | in = FilStartR(buf, BD_FILE_READ); 224 | if(NULL == in) return FALSE; 225 | 226 | // ヘッダの格納先は0番である // 227 | temp = MemExpand(in, 0); 228 | if(NULL == temp){ 229 | FilEnd(in); 230 | return FALSE; 231 | } 232 | memcpy(&DemoInfo, temp, sizeof(DEMOPLAY_INFO)); 233 | LocalFree(temp); 234 | 235 | // データの格納先は1番ですね // 236 | temp = MemExpand(in, 1); 237 | if(NULL == temp){ 238 | FilEnd(in); 239 | return FALSE; 240 | } 241 | memcpy(DemoBuffer, temp, sizeof(WORD)*DemoInfo.DataSize); 242 | LocalFree(temp); 243 | 244 | FilEnd(in); 245 | 246 | DemoBufPtr = 0; 247 | DemoplayLoadEnable = TRUE; 248 | 249 | // 現在のコンフィグを保持する // 250 | ConfigTemp = ConfigDat; 251 | 252 | // そのときのコンフィグを転送 // 253 | ConfigDat.BombStock = DemoInfo.CfgDat.BombStock; 254 | ConfigDat.GameLevel = DemoInfo.CfgDat.GameLevel; 255 | ConfigDat.PlayerStock = DemoInfo.CfgDat.PlayerStock; 256 | ConfigDat.InputFlags = DemoInfo.CfgDat.InputFlags; 257 | 258 | // 本体の性能記述 // 259 | Viv.exp = DemoInfo.Exp; 260 | Viv.weapon = DemoInfo.Weapon; 261 | Viv.left = ConfigDat.PlayerStock; 262 | Viv.bomb = ConfigDat.BombStock; 263 | 264 | // 最後に乱数もそろえる // 265 | rnd_seed_set(DemoInfo.RndSeed); 266 | 267 | return TRUE; 268 | } 269 | 270 | 271 | // Key_Data を返す // 272 | FWORD ReplayMove(void) 273 | { 274 | DWORD ptr; 275 | 276 | if(!DemoplayLoadEnable) return KEY_ESC; 277 | 278 | ptr = DemoBufPtr; 279 | 280 | if(ptr >= DemoInfo.DataSize){ 281 | ptr = DemoBufPtr; 282 | DemoplayLoadEnable = FALSE; 283 | } 284 | else 285 | DemoBufPtr++; 286 | 287 | return DemoBuffer[ptr]; 288 | } 289 | 290 | 291 | // リプレイデータロードの事後処理 // 292 | FVOID ReplayLoadCleanup(void) 293 | { 294 | ConfigDat = ConfigTemp; 295 | DemoplayLoadEnable = FALSE; 296 | } 297 | -------------------------------------------------------------------------------- /GIAN07/DEMOPLAY.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* DemoPlay.h デモプレイ処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_DEMOPLAY_H 7 | #define PBGWIN_DEMOPLAY_H "DEMOPLAY : Version 0.02 : Update 2000/04/01" 8 | //#pragma message(PBGWIN_DEMOPLAY_H) 9 | 10 | #include "Gian.h" 11 | 12 | 13 | ///// [ 定数 ] ///// 14 | #define DEMOBUF_MAX (60*60*30) // 20分のデータ格納OK 15 | 16 | 17 | 18 | ///// [構造体] ///// 19 | typedef struct tagDEMOPLAY_INFO{ 20 | DWORD RndSeed; // 乱数のたね 21 | DWORD DataSize; // データ部のサイズ(デコード時に使用する) 22 | CONFIG_DATA CfgDat; // コンフィグの情報(Load時に一部を参照する) 23 | BYTE Exp; // 初期パワーアップ 24 | BYTE Weapon; // 初期装備 25 | } DEMOPLAY_INFO; 26 | 27 | 28 | ///// [ 関数 ] ///// 29 | FVOID DemoplayInit(void); // デモプレイデータの準備 30 | FVOID DemoplayRecord(WORD key); // デモプレイデータを保存する 31 | FVOID DemoplaySave(void); // デモプレイデータをファイルに書き込む 32 | 33 | FBOOL DemoplayLoad(int stage); // デモプレイデータをロードする 34 | FWORD DemoplayMove(void); // Key_Data を返す 35 | FVOID DemoplayLoadCleanup(void); // デモプレイロードの事後処理 36 | 37 | 38 | // 要望に付き、追加するのだ // 39 | FVOID ReplayInit(void); // リプレイデータの準備 40 | FVOID ReplayRecord(WORD key); // リプレイデータを保存する 41 | FVOID ReplaySave(void); // リプレイデータをファイルに書き込む 42 | 43 | FBOOL ReplayLoad(int stage); // リプレイデータをロードする 44 | FWORD ReplayMove(void); // Key_Data を返す 45 | FVOID ReplayLoadCleanup(void); // リプレイデータロードの事後処理 46 | 47 | 48 | 49 | ///// [ 変数 ] ///// 50 | extern BOOL DemoplaySaveEnable; // デモプレイのセーブが動作しているか 51 | extern BOOL DemoplayLoadEnable; // デモプレイのロードが動作しているか 52 | 53 | 54 | #endif 55 | -------------------------------------------------------------------------------- /GIAN07/ECL_LEN.H: -------------------------------------------------------------------------------- 1 | /* 2 | * 敵の命令長定義ファイル 3 | * 作成日時 01/31/01 01:34:57 4 | */ 5 | 6 | 7 | const BYTE ECL_CmdLen[256] = { 8 | 9, // SETUP 9 | 1, // END 10 | 5, // JMP 11 | 7, // LOOP 12 | 5, // CALL 13 | 1, // RET 14 | 9, // JHPL 15 | 9, // JHPS 16 | 17, // JDIF 17 | 5, // JDSB 18 | 9, // JFCL 19 | 9, // JFCS 20 | 10, // STI 21 | 2, // CLI 22 | 0, // 23 | 0, // 24 | 3, // NOP 25 | 3, // NOPSC 26 | 3, // MOV 27 | 4, // ROL 28 | 12, // LROL 29 | 9, // WAVX 30 | 9, // WAVY 31 | 5, // MXA 32 | 5, // MYA 33 | 7, // MXYA 34 | 3, // MXS 35 | 3, // MYS 36 | 3, // MXYS 37 | 4, // ACC 38 | 7, // ACCXYA 39 | 2, // GRAX 40 | 2, // DEGA 41 | 2, // DEGR 42 | 1, // DEGX 43 | 1, // DEGS 44 | 5, // SPDA 45 | 5, // SPDR 46 | 5, // XYA 47 | 5, // XYR 48 | 1, // DEGXU 49 | 1, // DEGXD 50 | 1, // DEGEX 51 | 1, // XYS 52 | 1, // DEGX2 53 | 1, // XYRND 54 | 3, // XYL 55 | 0, // 56 | 0, // 57 | 0, // 58 | 0, // 59 | 0, // 60 | 0, // 61 | 0, // 62 | 0, // 63 | 0, // 64 | 0, // 65 | 0, // 66 | 0, // 67 | 0, // 68 | 0, // 69 | 0, // 70 | 0, // 71 | 0, // 72 | 1, // TAMA 73 | 2, // TAUTO 74 | 5, // TXYR 75 | 2, // TCMD 76 | 3, // TDEGA 77 | 3, // TDEGR 78 | 3, // TNUMA 79 | 3, // TNUMR 80 | 3, // TSPDA 81 | 3, // TSPDR 82 | 2, // TOPT 83 | 2, // TTYPE 84 | 2, // TCOL 85 | 2, // TVDEG 86 | 2, // TREP 87 | 1, // TDEGS 88 | 1, // TDEGE 89 | 1, // TAMA2 90 | 1, // TCLR 91 | 1, // TAMAL 92 | 2, // T2ITEM 93 | 1, // TAMAEX 94 | 0, // 95 | 0, // 96 | 0, // 97 | 0, // 98 | 0, // 99 | 0, // 100 | 0, // 101 | 0, // 102 | 0, // 103 | 0, // 104 | 1, // LASER 105 | 2, // LCMD 106 | 5, // LLA 107 | 5, // LLR 108 | 5, // LL2 109 | 3, // LDEGA 110 | 3, // LDEGR 111 | 2, // LNUMA 112 | 2, // LNUMR 113 | 5, // LSPDA 114 | 5, // LSPDR 115 | 2, // LCOL 116 | 2, // LTYPE 117 | 5, // LWA 118 | 1, // LDEGS 119 | 1, // LDEGE 120 | 5, // LXY 121 | 1, // LASER2 122 | 0, // 123 | 0, // 124 | 0, // 125 | 0, // 126 | 0, // 127 | 0, // 128 | 0, // 129 | 0, // 130 | 0, // 131 | 0, // 132 | 0, // 133 | 0, // 134 | 0, // 135 | 0, // 136 | 1, // LLSET 137 | 2, // LLOPEN 138 | 2, // LLCLOSE 139 | 2, // LLCLOSEL 140 | 3, // LLDEGR 141 | 1, // HLASER 142 | 0, // 143 | 0, // 144 | 0, // 145 | 0, // 146 | 0, // 147 | 0, // 148 | 0, // 149 | 0, // 150 | 0, // 151 | 0, // 152 | 1, // DRAW_ON 153 | 1, // DRAW_OFF 154 | 1, // CLIP_ON 155 | 1, // CLIP_OFF 156 | 1, // DAMAGE_ON 157 | 1, // DAMAGE_OFF 158 | 1, // HITSB_ON 159 | 1, // HITSB_OFF 160 | 1, // RLCHG_ON 161 | 1, // RLCHG_OFF 162 | 0, // 163 | 0, // 164 | 0, // 165 | 0, // 166 | 0, // 167 | 0, // 168 | 3, // ANM 169 | 2, // PSE 170 | 2, // INT 171 | 2, // EXDEGD 172 | 6, // ENEMYSET 173 | 7, // ENEMYSETD 174 | 5, // HITXY 175 | 2, // ITEM 176 | 2, // STG4EFC 177 | 2, // ANMEX 178 | 2, // BITLASER 179 | 5, // BITATTACK 180 | 6, // BITCMD 181 | 2, // BOSSSET 182 | 6, // CEFC 183 | 1, // STG3EFC 184 | 3, // MOVR 185 | 6, // MOVC 186 | 3, // ADD 187 | 3, // SUB 188 | 3, // SINL 189 | 3, // COSL 190 | 6, // MOD 191 | 2, // RND 192 | 3, // CMPR 193 | 6, // CMPC 194 | 5, // JL 195 | 5, // JS 196 | 2, // INC 197 | 2, // DEC 198 | 5, // JEQ 199 | 0, // 200 | 0, // 201 | 0, // 202 | 0, // 203 | 0, // 204 | 0, // 205 | 0, // 206 | 0, // 207 | 0, // 208 | 0, // 209 | 0, // 210 | 0, // 211 | 0, // 212 | 0, // 213 | 0, // 214 | 0, // 215 | 0, // 216 | 0, // 217 | 0, // 218 | 0, // 219 | 0, // 220 | 0, // 221 | 0, // 222 | 0, // 223 | 0, // 224 | 0, // 225 | 0, // 226 | 0, // 227 | 0, // 228 | 0, // 229 | 0, // 230 | 0, // 231 | 0, // 232 | 0, // 233 | 0, // 234 | 0, // 235 | 0, // 236 | 0, // 237 | 0, // 238 | 0, // 239 | 0, // 240 | 0, // 241 | 0, // 242 | 0, // 243 | 0, // 244 | 0, // 245 | 0, // 246 | 0, // 247 | 0, // 248 | 0, // 249 | 0, // 250 | 0, // 251 | 0, // 252 | 0, // 253 | 0, // 254 | 0, // 255 | 0, // 256 | 0, // 257 | 0, // 258 | 0, // 259 | 0, // 260 | 0, // 261 | 0, // 262 | 0, // 263 | 0 // 264 | }; 265 | -------------------------------------------------------------------------------- /GIAN07/EFFECT.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* EFFECT.h エフェクト管理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_EFFECT_H 7 | #define PBGWIN_EFFECT_H "EFFECT : Version 0.20 : Update 2000/02/23" 8 | //#pragma message(PBGWIN_EFFECT_H) 9 | 10 | #include "Gian.h" 11 | 12 | 13 | 14 | ///// [更新履歴] ///// 15 | // 2000/04/28 : 円エフェクトを作成 16 | // 2000/04/15 : 円形フェード系関数の追加 17 | // 2000/02/23 : 開発開始(->Ver0.20) 18 | 19 | 20 | 21 | ///// [ 定数 ] ///// 22 | #define SEFFECT_MAX 1000 23 | #define LOCKON_MAX 2 // 最大ロック数 24 | #define CIRCLE_EFC_MAX 10 // 円エフェクト最大数 25 | 26 | #define CEFC_NONE 0x00 // CircleEffect未使用 27 | #define CEFC_STAR 0x01 // お星様系エフェクト 28 | #define CEFC_CIRCLE1 0x02 // 集まる円エフェクト 29 | #define CEFC_CIRCLE2 0x03 // 離れる円エフェクト 30 | 31 | #define SEFC_NONE 0x00 // 未使用 32 | #define SEFC_STR1 0x01 // 文字列エフェクト1 33 | #define SEFC_STR1_2 0x02 // 文字列一時停止 34 | #define SEFC_STR1_3 0x03 // 文字列爆発 35 | 36 | #define SEFC_MTITLE1 0x04 // 曲名表示エフェクト(出動) 37 | #define SEFC_MTITLE2 0x05 // 曲名表示エフェクト(停止) 38 | #define SEFC_MTITLE3 0x06 // 曲名表示エフェクト(退却) 39 | 40 | #define SEFC_GAMEOVER 0x07 // ワーニングの表示とか 41 | #define SEFC_GAMEOVER2 0x08 // ワーニングの表示とか 42 | #define SEFC_GAMEOVER3 0x09 // ワーニングの表示とか 43 | 44 | #define SEFC_STR2 0x10 // 得点アイテム用?エフェクト 45 | 46 | #define LOCKON_NONE 0x00 // ロックしていない 47 | #define LOCKON_01 0x01 // ロックオン開始 48 | #define LOCKON_02 0x02 // ロックオン停止 49 | #define LOCKON_03 0x03 // ロックオン解放? 50 | 51 | #define SCNEFC_NONE 0x00 // エフェクト無し 52 | #define SCNEFC_CFADEIN 0x01 // 円形フェードイン 53 | #define SCNEFC_CFADEOUT 0x02 // 円形フェードアウト 54 | #define SCNEFC_WHITEIN 0x03 // ホワイトイン 55 | #define SCNEFC_WHITEOUT 0x04 // ホワイトアウト 56 | 57 | 58 | 59 | ///// [構造体] ///// 60 | typedef struct _tagCIRCLE_EFC_DATA{ 61 | int x,y; // 中心座標 62 | int r,rmax; // 半径/最大半径 63 | DWORD count; // カウンタ 64 | BYTE type; // 円エフェクトの種類 65 | // BYTE Level; // 円エフェクトの段階 66 | BYTE d; // 円エフェクトの角度(謎) 67 | } CIRCLE_EFC_DATA; 68 | 69 | typedef struct _tagSEFFECT_DATA{ 70 | int x,y; 71 | int vx,vy; 72 | 73 | DWORD time; 74 | DWORD point; 75 | 76 | BYTE cmd; 77 | char c; 78 | } SEFFECT_DATA; 79 | 80 | typedef struct tagLOCKON_INFO{ 81 | int *x,*y; // ロック座標へのポインタ 82 | int width,height; // 幅&高さ 83 | int vx,vy; // 速度成分 84 | DWORD count; // カウンタ 85 | BYTE state; // 状態 86 | } LOCKON_INFO; 87 | 88 | typedef struct tagSCREENEFC_INFO{ 89 | BYTE cmd; // 発動中エフェクト 90 | DWORD count; // エフェクトに対するカウンタ 91 | } SCREENEFC_INFO; 92 | 93 | 94 | 95 | ///// [ 関数 ] ///// 96 | FVOID SEffectInit(void); // エフェクトの初期化を行う 97 | FVOID StringEffect(int x,int y,char *s); // 文字列系エフェクト(上に表示する奴) 98 | FVOID StringEffect2(int x,int y,DWORD point); // 得点表示エフェクト 99 | FVOID StringEffect3(void); // ゲームオーバーの表示 100 | FVOID SetMusicTitle(int y,char *s); // 曲名の表示 101 | 102 | FVOID SEffectMove(void); // エフェクトを動かす(仕様変更の可能性があります) 103 | FVOID SEffectDraw(void); // エフェクトを描画する(仕様変更の可能性があります) 104 | 105 | FVOID CEffectInit(void); // 円エフェクトの初期化 106 | FVOID CEffectMove(void); // 円エフェクトを動かす 107 | FVOID CEffectDraw(void); // 円エフェクトを描画する 108 | FVOID CEffectSet(int x,int y,BYTE type); // 円エフェクトをセットする 109 | 110 | FVOID ScreenEffectInit(void); // 画面全体に対するエフェクトの初期化 111 | FVOID ScreenEffectSet(BYTE cmd); // 画面全体に対するエフェクトをセットする 112 | FVOID ScreenEffectMove(void); // 画面全体に対するエフェクトを動かす 113 | FVOID ScreenEffectDraw(void); // 画面全体に対するエフェクトを描画する 114 | 115 | FVOID WarningEffectInit(void); // ワーニングの初期化 116 | FVOID WarningEffectSet(void); // ワーニング発動!! 117 | FVOID WarningEffectMove(void); // ワーニングの動作 118 | FVOID WarningEffectDraw(void); // ワーニングの描画 119 | 120 | FBOOL SEffectRestore(void); // エフェクト用 Restore 処理 121 | 122 | FVOID ObjectLockOnInit(void); // ロックオン配列を初期化 123 | FVOID ObjectLockOn(int *x,int *y,int wx64,int hx64); // 何かをロックオンする 124 | FVOID ObjectLockMove(void); // ロックオンアニメーション動作 125 | FVOID ObjectLockDraw(void); // ロックオン枠描画 126 | 127 | FVOID GrpDrawSpect(int x,int y); // スペアナ描画 128 | FVOID GrpDrawNote(void); // 押されているところを表示 129 | 130 | 131 | 132 | ///// [ 変数 ] ///// 133 | extern SEFFECT_DATA SEffect[SEFFECT_MAX]; 134 | extern CIRCLE_EFC_DATA CEffect[CIRCLE_EFC_MAX]; 135 | extern LOCKON_INFO LockInfo[LOCKON_MAX]; 136 | extern SCREENEFC_INFO ScreenInfo; 137 | 138 | 139 | #endif 140 | -------------------------------------------------------------------------------- /GIAN07/EFFECT3D.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* Effect3D.h 3Dエフェクトの処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_EFFECT3D_H 7 | #define PBGWIN_EFFECT3D_H "EFFECT3D : Ver 0.01 : Update 2000/05/31" 8 | //#pragma message(PBGWIN_EFFECT3D_H) 9 | 10 | 11 | 12 | ///// [更新履歴] ///// 13 | // 2000/05/31 : 開発開始 14 | 15 | 16 | 17 | ///// [ヘッダファイル] ///// 18 | #include "PBGUTY_X.h" 19 | #include "Gian.h" 20 | 21 | 22 | 23 | ///// [ 定数 ] ///// 24 | #define STG4ROCK_STDMOVE 0 // 普通のスクロールね 25 | #define STG4ROCK_ACCMOVE1 1 // 加速有りスクロール(1) 26 | #define STG4ROCK_ACCMOVE2 2 // 加速有りスクロール(2) 27 | #define STG4ROCK_3DMOVE 3 // 3D回転 28 | #define STG4ROCK_LEAVE 4 // 一時的に岩を消去する 29 | #define STG4ROCK_END 5 // エフェクト終了 30 | 31 | 32 | 33 | ///// [ 構造体 ] ///// 34 | typedef struct tagPoint3D{ 35 | int x,y,z; 36 | } Point3D; 37 | 38 | typedef struct tagLineList3D{ 39 | int ox,oy; /* 頂点の座標の補正用 */ 40 | POINT *p; /* 頂点の座標 */ 41 | int n; /* 頂点数 */ 42 | POINT *Work; /* ワークエリア */ 43 | 44 | BYTE DegX,DegY,DegZ; /* 各軸に対する回転角 */ 45 | } LineList3D; 46 | 47 | typedef struct tagWireFrame3D{ 48 | LineList3D *LList; 49 | int n; 50 | } WireFrame3D; 51 | 52 | typedef struct tagTriangle3D{ 53 | Point3D Current; 54 | Point3D Speed; 55 | 56 | POINT Grp[3]; 57 | 58 | BYTE deg_x,deg_y,deg_z; 59 | char roll_x,roll_y,roll_z; 60 | } Triangle3D; 61 | 62 | typedef struct tagCircle3D{ 63 | int ox,oy; 64 | int r; 65 | BYTE deg; 66 | BYTE n; 67 | } Circle3D; 68 | 69 | typedef struct tagDeg3D{ 70 | int dx; 71 | int dy; 72 | int dz; 73 | } Deg3D; 74 | 75 | typedef struct tagCube3D{ 76 | Point3D p; 77 | Deg3D d; 78 | int l; 79 | } Cube3D; 80 | 81 | typedef struct tagStar2D { 82 | int x,y; 83 | int vy; 84 | } Star2D; 85 | 86 | // 雲管理用構造体 // 87 | typedef struct tagCloud2D { 88 | int x, y; // x64座標 89 | int vy; // 速度のy成分(yしかないけど) 90 | BYTE type; // 雲の種類 91 | } Cloud2D; 92 | 93 | // 非・汎用2D正方形ワイヤーフレーム // 94 | typedef struct tagWFLine2D { 95 | int ox,oy; // 中心座標 96 | int w; // 正方形の一辺の長さ 97 | BYTE d; // 正方形の傾き角度 98 | } WFLine2D; 99 | 100 | // 偽ECL羅列管理用構造体 // 101 | typedef struct tagFakeECLString { 102 | int SrcX, SrcY; // 元画像の基準となるX&Y座標 103 | int x,y; // 現在の座標x64 104 | int vx,vy; // 現在の速度成分x64 105 | } FakeECLString; 106 | 107 | // 岩管理用構造体 // 108 | typedef struct tagRock3D { 109 | int x, y, z; // 現在の座標 110 | int vx, vy; // 速度XY成分(2D-平面上) 111 | 112 | DWORD count; // カウンタ 113 | int v; // 速度 114 | 115 | char a; // 加速度 116 | BYTE d; // 角度(2D-平面上) 117 | BYTE GrpID; // グラフィックID 118 | BYTE State; // 現在の状態 119 | } Rock3D; 120 | 121 | 122 | ///// [ 関数 ] ///// 123 | FVOID InitLineList3D(WireFrame3D *w); 124 | FVOID MoveLineList3D(WireFrame3D *w); 125 | FVOID DrawLineList3D(WireFrame3D *w); 126 | 127 | FVOID InitWarning(void); 128 | FVOID DrawWarning(void); 129 | FVOID MoveWarning(BYTE count); 130 | FVOID MoveWarningR(char count); 131 | 132 | FVOID Init3DCube(void); 133 | FVOID Draw3DCube(void); 134 | FVOID Move3DCube(void); 135 | 136 | FVOID InitTriangle(void); 137 | FVOID MoveTriangle(void); 138 | FVOID DrawTriangle(void); 139 | 140 | FVOID InitCircle(void); 141 | FVOID MoveCircle(void); 142 | FVOID DrawCircle(void); 143 | /* 144 | FVOID InitStg3Cloud(void); // 3面の雲の初期化を行う 145 | FVOID MoveStg3Cloud(void); // 3面の雲を動作させる 146 | FVOID DrawStg3Cloud(void); // 3面の雲を描画する 147 | */ 148 | FVOID InitEffectFakeECL(void); 149 | FVOID MoveEffectFakeECL(void); 150 | FVOID DrawEffectFakeECL(void); 151 | 152 | FVOID InitStg4Rock(void); // ステージ4の背景となる岩の集団 153 | FVOID MoveStg4Rock(void); // 154 | FVOID DrawStg4Rock(void); // 155 | FVOID SendCmdStg4Rock(BYTE Cmd, BYTE Param); // コマンド送信 156 | 157 | FVOID InitStg6Raster(); // 6面ラスター初期化 158 | FVOID MoveStg6Raster(); // 6面ラスター動作 159 | FVOID DrawStg6Raster(); // 6面ラスター描画 160 | 161 | FVOID InitStg3Star(); // 3面高速星初期化 162 | FVOID MoveStg3Star(); // 3面高速星動作 163 | FVOID DrawStg3Star(); // 3面高速星描画 164 | 165 | 166 | 167 | 168 | __inline void Transform3D(Point3D *p, BYTE dx, BYTE dy, BYTE dz) 169 | { 170 | static Point3D temp; 171 | 172 | temp.y = p->y; 173 | temp.z = p->z; 174 | p->y = cosl(dx,temp.y) - sinl(dx,temp.z); 175 | p->z = sinl(dx,temp.y) + cosl(dx,temp.z); 176 | 177 | temp.x = p->x; 178 | temp.z = p->z; 179 | p->x = cosl(dy,temp.x) + sinl(dy,temp.z); 180 | p->z = - sinl(dy,temp.x) + cosl(dy,temp.z); 181 | 182 | temp.x = p->x; 183 | temp.y = p->y; 184 | p->x = cosl(dz,temp.x) - sinl(dz,temp.y); 185 | p->y = sinl(dz,temp.x) + cosl(dz,temp.y); 186 | } 187 | 188 | __inline void ShiftRight6Bit(Point3D *o, Point3D *p) 189 | { 190 | p->x = ((p->x+o->x)>>6) + 320; 191 | p->y = ((p->y+o->y)>>6) + 240; 192 | } 193 | 194 | 195 | #endif 196 | -------------------------------------------------------------------------------- /GIAN07/ENDING.H: -------------------------------------------------------------------------------- 1 | /* 2 | * Ending.h : エンディングの処理 3 | * 4 | */ 5 | 6 | #ifndef PBG_ENDING_VERSION 7 | #define PBG_ENDING_VERSION "エンディングの処理 : Version 0.01 : Update 2000/12/20" 8 | 9 | /* [更新履歴] 10 | * Version 0.01 : 2000/12/20 : 11 | */ 12 | 13 | 14 | 15 | #include "Gian.h" 16 | 17 | 18 | 19 | /***** [クラス定義] *****/ 20 | 21 | 22 | 23 | /***** [関数プロトタイプ] *****/ 24 | FBOOL EndingInit(void); // エンディングまわりの初期化 25 | FVOID EndingProc(void); // エンディング状態推移用プロシージャ 26 | FVOID EndingDraw(void); // エンディング時の描画処理 27 | 28 | 29 | 30 | /***** [グローバル変数] *****/ 31 | 32 | 33 | 34 | #endif 35 | -------------------------------------------------------------------------------- /GIAN07/ENEMY.H: -------------------------------------------------------------------------------- 1 | /*************************************************************************************************/ 2 | /* ENEMY.H 敵の管理とか発生制御等 */ 3 | /* */ 4 | /*************************************************************************************************/ 5 | 6 | #ifndef PBGWIN_ENEMY_H 7 | #define PBGWIN_ENEMY_H "ENEMY : Ver 0.41 : Update 2000/02/22" 8 | //#pragma message(PBGWIN_ENEMY_H) 9 | 10 | ///// [ 更新履歴 ] ///// 11 | 12 | // 2000/10/17 : プレイランクの変数を参照するのを間違えていた(ConfigDat のほうを参照していた) 13 | // 2000/03/22 : LLaser の処理を追加(実際の発射は構造体そのものに直接代入する事で行う) 14 | // 2000/02/25 : 敵の当たり判定チェック用関数 enemy_damage() を追加 15 | // 2000/02/22 : 敵のクリッピング範囲を変更した。 16 | 17 | /* -> ここから下は古いよ 18 | * > 8/23 (20:56) : (ox,oy) は使用しないものとする 19 | * : ECL_Head から始まるデータ <敵の数><開始アドレスx敵の数> 20 | * 21 | */ 22 | 23 | #define WIN32_LEAN_AND_MEAN 24 | #include 25 | 26 | #include "ECL.H" 27 | #include "TAMA.H" 28 | #include "LASER.H" 29 | 30 | 31 | //// 敵定数 //// 32 | #define ENEMY_MAX 50 // 敵の最大発生数 33 | 34 | #define EF_DRAW 0x01 // 敵を描画するか 35 | #define EF_CLIP 0x02 // 敵が画面外に出たとき消去するか 36 | #define EF_DAMAGE 0x04 // 敵にダメージを与えられるか 37 | #define EF_HITSB 0x08 // 敵と自機は接触するか 38 | #define EF_RLCHG 0x10 // ECL左右反転を有効にするか 39 | #define EF_BOMB 0x20 // 敵が爆発中である 40 | #define EF_DELETE 0x40 // 敵をこのターン中に消去する 41 | 42 | #define ENEMY_BOMB_SPD 4 43 | 44 | //// ホーミング定数 //// 45 | #define HOMING_DUMMY (500*64) // 敵をホーミングしない場合のダミー値 46 | 47 | 48 | ////アニメーション定数//// 49 | #define ANIME_MAX 50 // アニメーションの種類 50 | #define ANIMEPTN_MAX 16 // アニメーションパターンの最大値 51 | #define ANM_NORM 0x00 // 普通のアニメーション 52 | #define ANM_DEG 0x01 // 角度でアニメーションする 53 | #define ANM_STOP 0x02 // 最終パターンで静止する 54 | 55 | 56 | //// 割り込みベクタ構造体 //// 57 | typedef struct{ 58 | DWORD vect; // 割り込みベクタ(0 なら無効) 59 | int value; // 比較値 60 | } INT_VECTOR; 61 | 62 | //// 敵データ構造体 //// 63 | typedef struct{ 64 | int x,y; // 表示座標 65 | int vx,vy; // 速度の(x,y)成分 x64系 66 | 67 | int v; // 速度成分 x64系 68 | 69 | DWORD hp; // 残り体力(大きすぎるか?) 70 | DWORD item; // アイテムその他に使用か? 71 | DWORD cmd; // ECLコマンドの絶対アドレス(DOS版との大きな変更点) 72 | DWORD count; // 多目的フレームカウンタ 73 | DWORD call_addr; // RET 実行後にジャンプするアドレス 74 | 75 | DWORD score; // 得点(時間による得点変動対応か?) 76 | DWORD evscore; // かすり得点用 77 | 78 | DWORD IntTimer; // 割り込みようタイマー 79 | 80 | DWORD GR[ECLREG_MAX]; // 変数用レジスタ 81 | INT_VECTOR Vect[ECLVECT_MAX]; // 割り込みベクタ 82 | 83 | WORD g_width; // グラフィックの幅 /2*64(当たり判定にも使用) 84 | WORD g_height; // グラフィックの高さ/2*64(上に同じ) 85 | WORD rep_c; // REP 命令用カウンタ 86 | WORD cmd_c; // 実行中コマンドの繰り返し回数 87 | WORD anm_c; // アニメーションカウンタ 88 | 89 | BYTE d; // 進行角 256 90 | char vd; // 角速度 128 91 | BYTE amp; // 振幅 256 92 | BYTE anm_ptn; // 使用しているアニメーションパターン 93 | BYTE anm_ptnEx; // ダメージ中のアニメーションパターン 94 | char anm_sp; // アニメーションスピード 95 | BYTE IsDamaged; // ダメージを受けたか 96 | 97 | BYTE flag; // 敵状態フラグ(状況によってサイズ変更のこと) 98 | BYTE tama_c; // 弾発射用カウンタ 99 | BYTE t_rep; // 弾発射間隔 100 | 101 | BYTE LLaserRef; // 太レーザーの参照カウント 102 | 103 | TAMA_CMD t_cmd; // 弾発射用コマンド 104 | LASER_CMD l_cmd; // レーザー発射用コマンド 105 | } ENEMY_DATA; 106 | 107 | typedef struct{ 108 | BYTE mode; // アニメーションモード 109 | BYTE n; // アニメーションパターン数 110 | int width; // 絵の幅 111 | int height; // 絵の高さ 112 | RECT ptn[ANIMEPTN_MAX]; // アニメーションの存在する矩形領域 113 | } ANIME_DATA; 114 | 115 | //// 敵変数 //// 116 | extern ENEMY_DATA Enemy[ENEMY_MAX]; 117 | extern BYTE *ECL_Head; 118 | extern BYTE *SCL_Head,*SCL_Now; 119 | extern WORD EnemyInd[ENEMY_MAX]; 120 | extern WORD EnemyNow; 121 | extern ANIME_DATA Anime[ANIME_MAX]; 122 | 123 | extern int HomingX; // ホーミング対象のX座標 124 | extern int HomingY; // ホーミング対象のY座標 125 | extern int HomingFlag; // 真ならホーミング実行 126 | 127 | 128 | //// 敵制御関数 //// 129 | extern void enemy_move(void); // 敵を動かす 130 | extern void enemy_draw(void); // 敵を描画する 131 | extern void enemyind_set(void); // 敵の順序設定用配列の初期化をする 132 | extern void enemy_clear(void); // 雑魚を消滅させる 133 | 134 | extern BOOL enemy_damage(int x,int y,int damage); // 敵にダメージを与える 135 | extern BOOL enemy_damage2(int x,int y,int damage); // y上方向無限Ver.敵にダメージを与える 136 | extern void enemy_damage3(int x,int y,BYTE d); // ナナメレーザーの当たり判定 137 | extern void enemy_damage4(int damage); // すべての敵にダメージを与える 138 | 139 | extern void SetAnime24(int x,int y,int id); 140 | extern void SetAnime32(int x,int y,int id,int n,BYTE mode); 141 | extern void SetAnime40(int x,int y,int id); 142 | extern void SetAnime48(int x,int y,int id); 143 | extern void SetAnime80(int x,int y,int id); 144 | extern RECT *Enemy_AnimeClip(int *x,int *y,ENEMY_DATA *e); 145 | extern RECT *Enemy_HitGrpClip(int *x, int *y, ENEMY_DATA *e); 146 | extern void EnemyAnimeMove(ENEMY_DATA *e); 147 | 148 | 149 | // 敵データを初期化する(x,y は x64 で指定のこと) // 150 | extern void InitEnemyDataX64(ENEMY_DATA *e,int x,int y,DWORD EclID); 151 | 152 | // 敵データを初期化する(x,y は非x64(ランダム可能) で指定のこと) // 153 | extern void InitEnemyDataSTD(ENEMY_DATA *e,short x,short y,DWORD EclID); 154 | 155 | // 強制的に ECL ブロック間を移動する // 156 | extern void EnemyECL_LongJump(ENEMY_DATA *e, DWORD EclID); 157 | 158 | extern void UpdateHoming(ENEMY_DATA *e); // ホーミング座標を更新する 159 | extern void parse_ECL(ENEMY_DATA *e); // 敵をECLに従って動かす 160 | extern void CheckECLInterrupt(ENEMY_DATA *e); // 割り込みジャンプを調べる 161 | extern void InitECLInterrupt(ENEMY_DATA *e); // 割り込みベクタの初期化 162 | 163 | 164 | // Vivit ナナメレーザーの当たり判定 // 165 | IBOOL LaserHITCHK(ENEMY_DATA *e, int ox, int oy, BYTE d) 166 | { 167 | int tx,ty,l,w; 168 | int chkw; 169 | 170 | chkw = min(e->g_height, e->g_width) + 3*64; 171 | 172 | tx = e->x - ox; 173 | ty = e->y - oy; 174 | 175 | l = cosl(d,tx) + sinl(d,ty); 176 | w = abs(-sinl(d,tx) + cosl(d,ty)); 177 | 178 | if(l>0 && wx, Parent->y) 75 | int v; // 加速度付き移動時の速度 76 | int a; // 加速度付き移動時の加速度 77 | 78 | BYTE d; // 加速度付き移動時の進行角度 79 | BYTE NumBits; // 初期ビット数 80 | 81 | //WORD DeltaAngle; // ビット間の差分角 82 | 83 | int Length; // ビットの回転半径 84 | int FinalLength; // 最終目標とする回転半径 85 | 86 | char BitSpeed; // ビットの基本回転速度 87 | BYTE State; // このビット集合の状態 88 | BYTE LaserState; // レーザーの状態 89 | //WORD ForceCount; // 反動の残り時間 90 | 91 | WORD BaseAngle; // ビットの回転基本角 92 | 93 | BOOL bIsLaserEnable; // レーザーが動作中かどうか 94 | } BIT_DATA; 95 | 96 | 97 | 98 | ///// [ 関数 ] ///// 99 | FVOID SnakyInit(void); // 蛇型の敵配列の初期化 100 | FVOID SnakySet(BOSS_DATA *b,int len,DWORD TailID); // 蛇型の敵をセットする 101 | FVOID SnakyMove(void); // 蛇型の敵の移動処理 102 | FVOID SnakyDelete(BOSS_DATA *b); // 蛇型の敵を殺す 103 | 104 | FVOID BitInit(void); // ビット配列の初期化 105 | FVOID BitSet(BOSS_DATA *b, BYTE NumBits, DWORD BitID); // ビットをセットする 106 | FVOID BitMove(void); // ビットを動作させる 107 | FVOID BitDelete(void); // ビットを消滅させる 108 | FVOID BitLineDraw(void); // ビット間のラインを描画する 109 | FVOID BitSelectAttack(DWORD BitID); // 攻撃パターンをセットor変更 110 | FVOID BitLaserCommand(BYTE Command); // レーザー系命令を発行 111 | FVOID BitSendCommand(BYTE Command, int Param); // ビット命令を送信 112 | FINT BitGetNum(void); // 現在のビット数を取得する 113 | 114 | 115 | 116 | ///// [ 変数 ] ///// 117 | extern SNAKYMOVE_DATA SnakeData[SNAKE_MAX]; 118 | 119 | 120 | 121 | #endif 122 | -------------------------------------------------------------------------------- /GIAN07/FONTUTY.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* FontUty.h フォントの処理いろいろ */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_FONTUTY_H 7 | #define PBGWIN_FONTUTY_H "FONTUTY : Version 0.02 : Update 2000/07/22" 8 | //#pragma message(PBGWIN_FONTUTY_H) 9 | 10 | 11 | 12 | ///// [更新履歴] ///// 13 | 14 | // 2000/07/22 : フォント追加に伴い、プログラムの一部を変更 15 | // 2000/02/19 : フォントに関する処理の開発を始める 16 | 17 | 18 | 19 | #include "GIAN.h" 20 | 21 | 22 | 23 | typedef union tagEXPIXEL { 24 | BYTE Byte; 25 | WORD Word; 26 | } EXPIXEL; 27 | 28 | typedef struct tagEXPOINT { 29 | int x, y; // 元座標(中心からの相対座標) 30 | int l; // 極座標における長さ 31 | BYTE d; // 極座標における角度 32 | 33 | EXPIXEL c; // 色情報 34 | } EXPOINT; 35 | 36 | typedef struct tagExtraFontInfo { 37 | int Width; // 元画像の幅 38 | int Height; // 元画像の高さ 39 | 40 | int DataSize; // 点の数 41 | 42 | EXPOINT *Data; // データ格納先 43 | } ExtraFontInfo; 44 | 45 | 46 | 47 | 48 | ///// [ 関数 ] ///// 49 | extern FVOID GrpPut16(int x,int y,char *s); // 16x16 透過フォントで文字列出力(高速) 50 | extern FVOID GrpPut16c(int x,int y,char *s); // 16x16 透過フォントで文字列出力(クリッピング有) 51 | extern FVOID GrpPut16c2(int x,int y,char *s); // 上と同じだが、x移動幅が16 52 | extern FVOID GrpPutc(int x,int y,char c); // 16x16 透過フォントで文字出力(クリッピング有) 53 | extern FVOID GrpPut57(int x,int y,char *s); // 05x07 べた貼りフォント 54 | extern FVOID GrpPut7B(int x,int y,char *s); // 07x11 音楽室用フォント 55 | extern FVOID GrpPutScore(int x,int y,char *s); // 得点アイテムのスコアを描画 56 | 57 | extern FVOID GrpPutMidNum(int x,int y,int n); // MIDI 用フォントを描画する 58 | 59 | extern FVOID InitFonts(void); // フォントをセットする 60 | extern FVOID CleanupFont(void); // フォントを解放する 61 | 62 | extern FVOID DrawGrdFont(GRP surf,char *s); // グラデーション付きフォントを描画する 63 | 64 | ExtraFontInfo *CreateExtraFont(GRP Surface, RECT *pSrc); // フォント生成 65 | void DeleteExtraFont(ExtraFontInfo *pFont); // フォント削除 66 | void DrawExtraFont(ExtraFontInfo *pFont, int ox, int oy, int t); // フォント描画 67 | void DrawExtraFont2(ExtraFontInfo *pFont, int ox, int oy, int t); // フォント描画 68 | 69 | 70 | #endif 71 | -------------------------------------------------------------------------------- /GIAN07/FRAGMENT.CPP: -------------------------------------------------------------------------------- 1 | /*************************************************************************************************/ 2 | /* FRAGMENT.C 破片処理関数群 */ 3 | /* */ 4 | /*************************************************************************************************/ 5 | 6 | #include "GIAN.H" 7 | 8 | 9 | FRAGMENT_DATA Fragment[FRAGMENT_MAX]; // 破片データ管理用構造体 10 | int FragmentPtr = 0; // 次に破片データを挿入する位置 11 | 12 | 13 | static void pascal _FDraw(FRAGMENT_DATA *f); 14 | 15 | 16 | void fragment_set(int x,int y,BYTE cmd) 17 | { 18 | int i; 19 | int l; 20 | BYTE d; 21 | FRAGMENT_DATA *f = Fragment+FragmentPtr; 22 | 23 | if(cmd==FRG_ESCAPE){ 24 | for(i=0;icount){ 27 | f->vx = (f->x-x)/16;f->count; 28 | f->vy = (f->y-y)/16;f->count; 29 | } 30 | } 31 | } 32 | else if(cmd==FRG_APPROACH){ 33 | for(i=0;icount){ 36 | f->vx = (x-f->x)/f->count; 37 | f->vy = (x-f->y)/f->count; 38 | } 39 | } 40 | } 41 | 42 | f->cmd = cmd; 43 | f->x = x; 44 | f->y = y; 45 | 46 | switch(cmd){ 47 | case(FRG_HIT): 48 | d = rnd()&0xff; 49 | l = 64 + rnd()%(64*3); 50 | f->count = 24; 51 | f->vx = cosl(d,l); 52 | f->vy = sinl(d,l); 53 | break; 54 | 55 | case(FRG_EVADE): 56 | d = rnd()&0xff; 57 | l = 64*4 + rnd()%(64*3); 58 | f->count = 24; 59 | f->vx = cosl(d,l); 60 | f->vy = sinl(d,l); 61 | break; 62 | 63 | case(FRG_SMOKE): 64 | f->count = 24; 65 | f->vx = 0;//cosl((BYTE)rnd(),rnd()&0xff);//cosl((BYTE)rnd()%256,64*6); 66 | f->vy = 0;//sinl((BYTE)rnd(),rnd()&0xff);//sinl((BYTE)rnd()%256,64*6); 67 | break; 68 | 69 | case(FRG_STAR1): 70 | f->count = 64; 71 | d = rnd()&0xff; 72 | l = 64*5 + rnd()%(64*3); 73 | f->vx = cosl(d,l); 74 | f->vy = sinl(d,l); 75 | break; 76 | 77 | case(FRG_STAR2): 78 | f->count = 64; 79 | d = rnd()&0xff; 80 | l = 64*4 + rnd()%(64*3); 81 | f->vx = cosl(d,l); 82 | f->vy = sinl(d,l); 83 | break; 84 | 85 | case(FRG_STAR3): 86 | f->count = 64; 87 | d = -64 - 48 + rnd()%96; 88 | l = 64*6 + rnd()%(64*4); 89 | f->vx = cosl(d,l); 90 | f->vy = sinl(d,l); 91 | break; 92 | 93 | case(FRG_HEART): 94 | f->count = 105; 95 | d = rnd()&0xff; 96 | l = 64*2 + rnd()%(64*5); 97 | f->vx = cosl(d,l); 98 | f->vy = sinl(d,l); 99 | break; 100 | 101 | case(FRG_FATCIRCLE): 102 | f->count = 60; 103 | f->vx = 0; 104 | f->vy = 0; 105 | break; 106 | 107 | default: 108 | // バグだけど... // 109 | break; 110 | } 111 | 112 | FragmentPtr = (FragmentPtr+1)%FRAGMENT_MAX; 113 | } 114 | 115 | void fragment_move(void) 116 | { 117 | int i; 118 | FRAGMENT_DATA *f = Fragment; 119 | 120 | for(i=0;icount){ 122 | f->x += f->vx; 123 | f->y += f->vy; 124 | f->count--; 125 | } 126 | f++; 127 | } 128 | } 129 | 130 | void fragment_draw(void) 131 | { 132 | int i; 133 | FRAGMENT_DATA *f = Fragment; 134 | 135 | for(i=0;icount) _FDraw(f); 137 | f++; 138 | } 139 | } 140 | 141 | void fragment_setup(void) 142 | { 143 | int i; 144 | 145 | for(i=0;icmd){ 159 | case(FRG_EVADE): 160 | x = (f->x>>6) - 4; 161 | y = (f->y>>6) - 4; 162 | BltSetRect(&src,592+(((24-f->count)>>2)<<3),8,8,8); 163 | GrpBlt(&src,x,y,GrTama); 164 | break; 165 | 166 | case(FRG_HIT): 167 | x = (f->x>>6) - 4; 168 | y = (f->y>>6) - 4; 169 | BltSetRect(&src,592+(((24-f->count)>>2)<<3),8+8,8,8); 170 | GrpBlt(&src,x,y,GrTama); 171 | break; 172 | 173 | case(FRG_SMOKE): 174 | x = (f->x>>6) - 4; 175 | y = (f->y>>6) - 4; 176 | BltSetRect(&src,592+(((24-f->count)>>2)<<3),0,8,8); 177 | GrpBlt(&src,x,y,GrTama); 178 | break; 179 | 180 | case(FRG_STAR1): 181 | x = (f->x>>6) - 8; 182 | y = (f->y>>6) - 8; 183 | BltSetRect(&src,624,432,16,16); 184 | GrpBlt(&src,x,y,GrTama); 185 | break; 186 | 187 | case(FRG_STAR2): 188 | x = (f->x>>6) - 16; 189 | y = (f->y>>6) - 16; 190 | BltSetRect(&src,608,448,32,32); 191 | GrpBlt(&src,x,y,GrTama); 192 | break; 193 | 194 | case(FRG_STAR3): 195 | x = (f->x>>6) - 16; 196 | y = (f->y>>6) - 16; 197 | BltSetRect(&src,608,448,32,32); 198 | GrpBlt(&src,x,y,GrTama); 199 | break; 200 | 201 | case(FRG_HEART): 202 | x = (f->x>>6) - 16; 203 | y = (f->y>>6) - 16; 204 | BltSetRect(&src,576,448,32,32); 205 | GrpBlt(&src,x,y,GrTama); 206 | break; 207 | 208 | case(FRG_FATCIRCLE): 209 | if(DxObj.Bpp==16){ 210 | GrpLock(); 211 | GrpSetColor(4,0,0); 212 | GrpSetAlpha(128,ALPHA_ONE); 213 | GrpFatCircleA(f->x>>6,f->y>>6,(60-f->count)*6,5); 214 | GrpUnlock(); 215 | } 216 | break; 217 | 218 | default: 219 | // ここには来ないはずだが ... // 220 | break; 221 | } 222 | } 223 | -------------------------------------------------------------------------------- /GIAN07/FRAGMENT.H: -------------------------------------------------------------------------------- 1 | /*************************************************************************************************/ 2 | /* FRAGMENT.H 破片処理関数群 */ 3 | /* */ 4 | /*************************************************************************************************/ 5 | 6 | #ifndef PBGWIN_FRAGMETN_H 7 | #define PBGWIN_FRAGMENT_H "FRAGMENT : Ver 0.10 : Update 99/10/31" 8 | //#pragma message(PBGWIN_FRAGMENT_H) 9 | 10 | 11 | //// 破片定数 //// 12 | #define FRAGMENT_MAX 1000 // 破片の最大数 13 | #define FRG_EVADE 0x00 // かすり(開発中) 14 | #define FRG_SMOKE 0x01 // 煙その1 15 | #define FRG_FATCIRCLE 0x02 // 赤丸... 16 | #define FRG_STAR1 0x03 // お星様1 17 | #define FRG_STAR2 0x04 // お星様2 18 | #define FRG_HIT 0x05 // ショットがヒットした 19 | #define FRG_STAR3 0x06 20 | #define FRG_HEART 0x07 // ハート型 21 | 22 | #define FRG_ESCAPE 0x10 // 指定座標から逃げる 23 | #define FRG_APPROACH 0x20 // 指定座標に近づく 24 | 25 | 26 | //// 破片構造体 //// 27 | typedef struct{ 28 | int x,y; // 現在の座標 29 | int vx,vy; // 速度成分 (x64) 30 | BYTE count; // フレームカウンタ(0の時は使用していないとする) 31 | BYTE cmd; // どんな破片? 32 | } FRAGMENT_DATA; 33 | 34 | 35 | //// 破片用変数 //// 36 | extern FRAGMENT_DATA Fragment[FRAGMENT_MAX]; 37 | 38 | 39 | //// 破片関数 //// 40 | void fragment_set(int x,int y,BYTE cmd); 41 | void fragment_move(void); 42 | void fragment_draw(void); 43 | void fragment_setup(void); 44 | 45 | 46 | #endif 47 | -------------------------------------------------------------------------------- /GIAN07/GAMEMAIN.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* GameMain.h ウィンドウシステム切り替えなどの処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_GAMEMAIN_H 7 | #define PBGWIN_GAMEMAIN_H "GAMEMAIN : Version 0.01 : Update 2000/02/23" 8 | //#pragma message(PBGWIN_GAMEMAIN_H) 9 | 10 | 11 | 12 | ///// [更新履歴] ///// 13 | 14 | // 2000/02/03 : 製作開始 15 | 16 | 17 | 18 | ///// [Include Files] ///// 19 | #include "Gian.h" 20 | #include "Ending.h" 21 | 22 | 23 | 24 | ///// [ 定数 ] ///// 25 | ///// [マクロ] ///// 26 | ///// [構造体] ///// 27 | 28 | ///// [グローバル変数] ///// 29 | extern BOOL IsDemoplay; 30 | 31 | 32 | 33 | ///// [関数] ///// 34 | extern FVOIDFN(*GameMain)(void); // ゲーム進行用関数ポインタ(WinMainからコールする) 35 | 36 | extern FBOOL GameInit(void); // ゲームの初期化をする 37 | extern FVOID GameRestart(void); // ゲームを再開する(ESC 抜けから) 38 | extern FBOOL GameExit(BOOL bNeedChgMusic = TRUE); // ゲームから抜ける 39 | extern FVOID GameOverInit(void); // ゲームオーバーの前処理 40 | extern FVOID GameContinue(void); // コンティニューを行う場合 41 | 42 | extern FBOOL GameReplayInit(int Stage); // リプレイ用の初期化を行う 43 | 44 | extern FBOOL SProjectInit(void); // 西方Project表示の初期化 45 | 46 | extern FBOOL GameExstgInit(void); // エキストラステージを始める 47 | 48 | extern FBOOL NameRegistInit(BOOL bNeedChgMusic); // お名前入力の初期化 49 | extern FBOOL ScoreNameInit(void); // お名前表示画面 50 | 51 | extern FBOOL GameNextStage(void); // 次のステージに移行する 52 | 53 | extern FBOOL MusicRoomInit(void); // 音楽室の初期化をする 54 | 55 | #endif 56 | -------------------------------------------------------------------------------- /GIAN07/GIAN.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* GIAN.h ゲーム全体の管理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_GIAN_H 7 | #define PBGWIN_GIAN_H "GIAN : Version 0.62 : Update 2000/02/23" 8 | //#pragma message(PBGWIN_GIAN_H) 9 | 10 | 11 | 12 | ///// [更新履歴] ///// 13 | 14 | // 2000/02/23 : GIAN06 同等の性能をもつようになった。 15 | // 2000/02/09 : 大幅な変更 16 | 17 | 18 | 19 | //#define PBG_DEBUG // デバッグモードを可能にする時に定義する 20 | 21 | 22 | 23 | ///// [Include Files] ///// 24 | #include "PBGUTY_X.h" // DirectX & その他の関数統合 25 | #include "ExDef.h" // 色々な定義 26 | #include "WINDOWSYS.h" // ウィンドウシステム本体 27 | #include "WINDOWCTRL.h" // ウィンドウ定義 28 | #include "FONTUTY.h" // フォント管理(GrpPut系,CrateFont系) 29 | 30 | #include "ECL.h" // ECL定義ファイル 31 | #include "SCL.h" // SCL定義ファイル 32 | #include "ENEMY.h" // 敵の移動処理など 33 | #include "BOSS.h" // ボスの定義&ボス用エフェクトなど 34 | //#include "EnemyExCtrl.h" // 特殊動作処理 35 | 36 | #include "PrankCtrl.h" // プレイランク管理 37 | #include "GAMEMAIN.h" // メインのルーチン切り替え処理 38 | #include "EFFECT.h" // 主にテキストベースのエフェクト処理 39 | #include "EFFECT3D.h" // 3Dエフェクト 40 | #include "FRAGMENT.h" // 破片系エフェクト処理 41 | #include "BOMBEFC.h" // 爆発エフェクト処理 42 | #include "TAMA.h" // 敵弾処理 43 | #include "LASER.h" // 短いレーザー&リフレクトレーザー処理 44 | #include "LLASER.h" // なが~いレーザーの処理 45 | #include "HOMINGL.h" // ホーミングレーザーの処理 46 | #include "MAIDTAMA.h" // 自機ショットの処理 47 | #include "MAID.h" // その名の通り 48 | #include "SCROLL.h" // 背景スクロール&SCL管理 49 | #include "LOADER.h" // 各種ローダー 50 | 51 | #include "Item.h" // アイテム処理 52 | 53 | #include "Score.h" 54 | 55 | 56 | ///// [ 定数 ] ///// 57 | 58 | // ステージ関連 // 59 | #define STAGE_MAX 6 // ステージ数 60 | 61 | 62 | 63 | // 座標関連 // 64 | #define X_MIN (128) // 表示X座標最小値 65 | #define X_MAX (511) // 表示X座標最大値 66 | #define X_MID ((X_MAX+X_MIN)/2) 67 | #define Y_MIN (0) // 表示Y座標最小値 68 | #define Y_MAX (479) // 表示Y座標最大値 69 | #define Y_MID ((Y_MAX+Y_MIN)/2) 70 | 71 | #define X_RNDV (-30000) // X座標のランダム指定用 72 | #define Y_RNDV (-30000) // Y座標のランダム指定用 73 | 74 | #define GX_MIN (X_MIN * 64) // ゲーム座標上におけるX座標最小値 75 | #define GX_MAX (X_MAX * 64) // ゲーム座標上におけるX座標最大値 76 | #define GX_MID ((GX_MAX+GX_MIN)/2) // ゲーム座標上におけるX座標中心値 77 | #define GY_MIN (Y_MIN * 64) // ゲーム座標上におけるY座標最小値 78 | #define GY_MAX (Y_MAX * 64) // ゲーム座標上におけるY座標最大値 79 | #define GY_MID ((GY_MAX+GY_MIN)/2) // ゲーム座標上におけるY座標中心値 80 | 81 | #define SX_WID (64*10) // サボテンのX幅? 82 | #define SY_WID (64*10) // サボテンのY幅? 83 | #define SX_MIN (GX_MIN + SX_WID) // サボテンのX座標最小値 84 | #define SX_MAX (GX_MAX - SX_WID) // サボテンのX座標最大値 85 | #define SY_MIN (GY_MIN + SY_WID + 30*64) // サボテンのY座標最小値 86 | #define SY_MAX (GY_MAX - SY_WID) // サボテンのY座標最大値 87 | #define SX_START (GX_MID) // サボテンの開始X座標 88 | #define SY_START (GY_MAX+180*64 /*- 50*64*/) // サボテンの開始Y座標 89 | 90 | #define RL_WIDX (32-4) // 反射レーザー用_X座標_補正値 91 | #define RL_WIDY 16 // 反射レーザー用_Y座標_補正値 92 | #define RLX_MIN (GX_MIN/64+RL_WIDX) // 反射レーザーの反射X座標最小値 93 | #define RLX_MAX (GX_MAX/64-RL_WIDX) // 反射レーザーの反射X座標最大値 94 | #define RLY_MIN (GY_MIN/64+RL_WIDY) // 反射レーザーの反射Y座標最小値 95 | #define RLY_MAX (GX_MAX/64-RL_WIDY) // 反射レーザーの反射Y座標最大値 96 | 97 | #define NREG_SX (X_MID-13*9) // ネームレジスト用ウィンドウの開始X 98 | #define NREG_SY (Y_MID+100) // ネームレジスト用ウィンドウの開始Y 99 | #define NREGI_X (X_MID-8*7) // ネームレジスト用ウィンドウ(名前表示部)の開始X 100 | #define NREGI_Y (Y_MID+60) // ネームレジスト用ウィンドウ(名前表示部)の開始Y 101 | 102 | #define STG_RNDXY 0 // 配置する座標がランダムの時の値...(なんだかよう分からん) 103 | 104 | 105 | // 難易度 & オプション設定 // 106 | #define GAME_EASY 0 // 難易度:Easy 107 | #define GAME_NORMAL 1 // 難易度:Normal 108 | #define GAME_HARD 2 // 難易度:Hard 109 | #define GAME_LUNATIC 3 // 難易度:Lunatic 110 | #define GAME_EXTRA 4 // Extra時... 111 | 112 | 113 | // スコア // 114 | #define SCORE_NAME 9 // スコア用の最大文字列長(NULL含む) 115 | 116 | 117 | // フラグ // 118 | #define GRPF_MASK (~0x07) 119 | #define GRPF_ALPHA_ENABLE 0x01 // 半透明が有効(無効時はメッシュ???) 120 | #define GRPF_WINDOW_UPPER 0x02 // メッセージウィンドウを上の方に表示する 121 | #define GRPF_MSG_DISABLE 0x04 // 会話シーンを省略 122 | 123 | #define SNDF_MASK (~0x03) 124 | #define SNDF_MIDI_ENABLE 0x01 // MIDIが有効 125 | #define SNDF_WAVE_ENABLE 0x02 // WAVEが有効 126 | 127 | #define INPF_MASK (~0x07) 128 | #define INPF_JOYPAD_ENABLE 0x01 // パッドが有効 129 | #define INPF_Z_MSKIP_ENABLE 0x02 // Zキーでメッセージを送れる 130 | #define INPF_Z_SPDDOWN_ENABLE 0x04 // 押しっぱなしでシフト移動 131 | 132 | #define DBGF_MASK (~0x03) 133 | #define DBGF_DISPLAYINFO 0x01 // デバッグ情報を出力する 134 | #define DBGF_HIT_ON 0x02 // 当たり判定が有効 135 | 136 | 137 | 138 | ///// [マクロ] ///// 139 | #define SPEEDM(v) ((short)(((v)&0x3f)<<4)) // 速度セット用まくろ(BYTE->int?) 140 | #define WAVESP(v) ((short)((v)<<4)) // WAVE?用の速度セット(まずいな) 141 | 142 | #define GX_RND ((X_MIN+rnd()%(X_MAX-X_MIN))<<6) // X座標ランダム 143 | #define GY_RND ((Y_MIN+rnd()%(Y_MAX-Y_MIN))<<6) // Y座標ランダム 144 | 145 | //#define HITCHK(a,b,h) ( ((DWORD)(a)-(b)+(h))right = (rc->left = x1) + x2; 235 | rc->bottom = (rc->top = y1) + y2; 236 | } 237 | 238 | 239 | //// 諸事情につき... //// 240 | #include "DemoPlay.h" // デモプレイ処理 241 | 242 | 243 | #endif 244 | -------------------------------------------------------------------------------- /GIAN07/HOMINGL.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* HomingL.h 長いレーザーの処理 */ 3 | /* */ 4 | /* */ 5 | 6 | 7 | #ifndef PBGWIN_HOMINGL_H 8 | #define PBGWIN_HOMINGL_H "HOMINGL : Ver 0.01 : Updata 2000/09/04" 9 | //#pragma message(PBGWIN_HOMINGL_H) 10 | 11 | #include "GIAN.h" 12 | 13 | 14 | 15 | ///// [ 定数 ] ///// 16 | #define HLASER_MAX 162 17 | #define HLASER_LEN 7 // 描画枚数.. 18 | #define HLASER_SECTION 4 // 読み込み幅 19 | 20 | 21 | #define HL_NONE 0 // ただ進むだけ 22 | #define HL_TYPE1 1 // その1 23 | 24 | #define HLS_NORM 0x00 // ホーミングレーザー通常 25 | #define HLS_CLEAR 0x01 // ホーミングレーザー消去中 26 | #define HLS_DEAD 0xff // ホーミングレーザー削除要請 27 | 28 | 29 | 30 | ///// [構造体] ///// 31 | 32 | // ホーミングレーザー // 33 | typedef struct tagHLaserData { 34 | int Current; // 現在の先頭 35 | int v; // 速度 36 | int a; // 加速度 37 | 38 | DWORD Count; // フレームカウンタ 39 | 40 | BYTE Type; // 種類(加速&ホーミングタイプ) 41 | BYTE State; // 状態 42 | BYTE c; // 色 43 | BYTE Left; // 残りホーミング回数 44 | 45 | struct tagHLaserData *Next; // 次のレーザーへのポインタ 46 | DegPoint p[HLASER_LEN*HLASER_SECTION]; // 頂点キュー(ExDef.h) 47 | } HLaserData; 48 | 49 | // ホーミングレーザーセット情報 // 50 | typedef struct tagHLaserInfo { 51 | int x,y; // 中心座標 52 | 53 | BYTE d; // 角度 54 | BYTE dw; // 角度の開き 55 | BYTE n; // 本数 56 | 57 | BYTE c; // 色 58 | BYTE type; // 種類 59 | } HLaserInfo; 60 | 61 | 62 | 63 | ///// [グローバル変数] ///// 64 | extern WORD HLaserNow; // ホーミングレーザーの本数 65 | extern HLaserInfo HLaserCmd; // ホーミングレーザーセット用データ 66 | 67 | 68 | ///// [関数プロトタイプ] ///// 69 | FVOID HLaserInit(void); // ホーミングレーザーの初期化を行う 70 | FVOID HLaserSet(HLaserInfo *hinfo); // ホーミングレーザーをセットする 71 | FVOID HLaserMove(void); // ホーミングレーザーを動作させる 72 | FVOID HLaserDraw(void); // ホーミングレーザーを描画する 73 | FVOID HLaserClear(void); // ホーミングレーザーに消去エフェクトをセット 74 | 75 | 76 | 77 | #endif 78 | -------------------------------------------------------------------------------- /GIAN07/ITEM.CPP: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* Item.cpp アイテムの処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "Item.h" 7 | 8 | 9 | 10 | ITEM_DATA Item[ITEM_MAX]; 11 | WORD ItemInd[ITEM_MAX]; 12 | WORD ItemNow; 13 | 14 | 15 | static void Indsort(WORD *ind,WORD *now); 16 | 17 | 18 | 19 | // アイテムを発生させる // 20 | FVOID ItemSet(int x,int y,BYTE type) 21 | { 22 | ITEM_DATA *ip; 23 | BYTE deg; 24 | 25 | if(ItemNow+1>=ITEM_MAX) return; 26 | 27 | ip = Item + ItemInd[ItemNow++]; 28 | 29 | deg = -64;//rnd()%(128-110)+128+55; 30 | 31 | ip->x = x; 32 | ip->y = y; 33 | ip->type = type; //ITEM_SCORE; 34 | ip->count = 0; 35 | 36 | switch(type){ 37 | case(ITEM_SCORE): 38 | ip->vx = cosl(deg,64*3); 39 | ip->vy = sinl(deg,64*3); 40 | break; 41 | 42 | case(ITEM_EXTEND): 43 | ip->vx = cosl(deg,64*2); 44 | ip->vy = sinl(deg,64*2); 45 | break; 46 | 47 | case(ITEM_BOMB): 48 | ip->vx = cosl(deg,64*2); 49 | ip->vy = sinl(deg,64*2); 50 | break; 51 | } 52 | } 53 | 54 | // アイテムを動かす // 55 | FVOID ItemMove(void) 56 | { 57 | ITEM_DATA *ip; 58 | int i,tx,ty,l; 59 | DWORD point; 60 | 61 | //point = 100+(Viv.evade)*100; 62 | point = (((SY_MAX-Viv.y)>>6)+Viv.evade*4)*160; 63 | 64 | for(i=0;ix += ip->vx; 68 | ip->y += ip->vy; 69 | } 70 | else{ 71 | tx = (Viv.x - ip->x); 72 | ty = (Viv.y - ip->y); 73 | l = 1 + (isqrt(tx*tx + ty*ty) / 700); // 512(3+6) 74 | ip->x += tx / l; 75 | ip->y += ty / l; 76 | } 77 | 78 | if(ip->vy<64*6) ip->vy += ITEM_GRAVITY; 79 | ip->count++; 80 | if(HITCHK(ip->x,Viv.x,ITEM_HITX) && HITCHK(ip->y,Viv.y,ITEM_HITY)){ 81 | switch(ip->type){ 82 | case(ITEM_SCORE): 83 | SndPlayEX(SOUND_ID_SELECT,ip->x,0); 84 | PlayRankAdd((SY_MAX-Viv.y)>>10); 85 | score_add(point); 86 | StringEffect2(ip->x,ip->y,point); 87 | if(Viv.evade){ 88 | fragment_set(ip->x, ip->y, FRG_STAR3); 89 | fragment_set(ip->x, ip->y, FRG_STAR3); 90 | } 91 | break; 92 | 93 | case(ITEM_EXTEND): 94 | SndPlayEX(SOUND_ID_SELECT,ip->x,0); 95 | StringEffect(180+64,80,"E x t e n d !"); 96 | Viv.left++; 97 | break; 98 | 99 | case(ITEM_BOMB): 100 | SndPlayEX(SOUND_ID_SELECT,ip->x,0); 101 | StringEffect(120+64,80,"B o m b E x t e n d !"); 102 | Viv.bomb++; 103 | break; 104 | } 105 | ip->type = ITEM_DELETE; 106 | } 107 | 108 | // 上方向では消去しない // 109 | if((ip->x)x)>GX_MAX+8*64||(ip->y)>GY_MAX+8*64) 110 | ip->type = ITEM_DELETE; 111 | } 112 | 113 | Indsort(ItemInd,&ItemNow); 114 | } 115 | 116 | // アイテムを描画する // 117 | FVOID ItemDraw(void) 118 | { 119 | ITEM_DATA *ip; 120 | int i,j,x,y; 121 | BYTE ptn; 122 | RECT src; 123 | static BYTE time; 124 | 125 | for(i=0;itype){ 128 | case(ITEM_SCORE): 129 | ptn = (BYTE)((ip->count>>2)&3); 130 | BltSetRect(&src,384+(ptn<<4),256+16,16,16); 131 | x = (ip->x>>6) - 8; 132 | y = (ip->y>>6) - 8; 133 | GrpBlt(&src,x,y,GrTama); 134 | break; 135 | 136 | case(ITEM_EXTEND): 137 | for(j=0; j<8; j++){ 138 | ptn = (BYTE)((ip->count>>2)&3); 139 | BltSetRect(&src,384+16*4+(ptn<<4),256+16,16,16); 140 | x = (ip->x>>6) - 8 + cosl(ip->count+j*256/8, 12); 141 | y = (ip->y>>6) - 8 + sinl(ip->count+j*256/8, 12); 142 | GrpBlt(&src,x,y,GrTama); 143 | } 144 | 145 | // ptn = (BYTE)((ip->count>>2)&3); 146 | // BltSetRect(&src,384+16*4+(ptn<<4),256+16,16,16); 147 | // x = (ip->x>>6) - 8; 148 | // y = (ip->y>>6) - 8; 149 | // GrpBlt(&src,x,y,GrTama); 150 | break; 151 | 152 | case(ITEM_BOMB): 153 | for(j=0; j<8; j++){ 154 | ptn = (BYTE)((ip->count>>2)&3); 155 | BltSetRect(&src,384+16*8+(ptn<<4),256+16,16,16); 156 | x = (ip->x>>6) - 8 + cosl(-2*ip->count+j*256/8, 12); 157 | y = (ip->y>>6) - 8 + sinl(-2*ip->count+j*256/8, 12); 158 | GrpBlt(&src,x,y,GrTama); 159 | } 160 | 161 | // ptn = (BYTE)((ip->count>>2)&3); 162 | // BltSetRect(&src,384+16*8+(ptn<<4),256+16,16,16); 163 | // x = (ip->x>>6) - 8; 164 | // y = (ip->y>>6) - 8; 165 | // GrpBlt(&src,x,y,GrTama); 166 | break; 167 | 168 | default: 169 | break; 170 | } 171 | } 172 | } 173 | 174 | // アイテム配列の初期化 // 175 | FVOID ItemIndSet(void) 176 | { 177 | int i; 178 | 179 | for(i=0;itype == ITEM_DELETE){ 194 | 195 | // フラグの立っていないアイテムを検索する // 196 | for(temp=i+1;temp<(*now);temp++){ 197 | if((Item+(*(ind+temp)))->type != ITEM_DELETE){ 198 | next++; 199 | goto SEARCH_END; 200 | } 201 | } 202 | 203 | SEARCH_END: 204 | swap16(ind+i,ind+temp); 205 | } 206 | else 207 | next++; 208 | } 209 | 210 | *now=next; 211 | } 212 | -------------------------------------------------------------------------------- /GIAN07/ITEM.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* Item.h アイテムの処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_ITEM_H 7 | #define PBGWIN_ITEM_H "ITEM : Version 0.01 : Update 2000/03/11" 8 | //#pragma message(PBGWIN_ITEM_H) 9 | 10 | #include "Gian.h" 11 | 12 | 13 | ///// [ 定数 ] ///// 14 | 15 | // 最大数 // 16 | #define ITEM_MAX 100 17 | 18 | // 種類もしくは状態 // 19 | #define ITEM_DELETE 0x00 // 消去要請 20 | #define ITEM_SCORE 0x01 // 得点アイテム 21 | #define ITEM_EXTEND 0x02 // 残りメイド数UP 22 | #define ITEM_BOMB 0x03 // ボム 23 | 24 | // その他 // 25 | #define ITEM_GRAVITY 3 // アイテムに対するy加速度 26 | #define ITEM_HITX (( 8+8)*64) // アイテムのX当たり判定 27 | #define ITEM_HITY ((16+8)*64) // アイテムのY当たり判定 28 | 29 | 30 | ///// [構造体] ///// 31 | typedef struct tagITEM_DATA{ 32 | int x,y; 33 | int vx,vy; 34 | DWORD count; 35 | BYTE type; 36 | } ITEM_DATA; 37 | 38 | 39 | 40 | ///// [ 関数 ] ///// 41 | FVOID ItemSet(int x,int y,BYTE type); // アイテムを発生させる 42 | FVOID ItemMove(void); // アイテムを動かす 43 | FVOID ItemDraw(void); // アイテムを描画する 44 | 45 | FVOID ItemIndSet(void); // アイテム配列の初期化 46 | 47 | 48 | 49 | ///// [ 変数 ] ///// 50 | extern ITEM_DATA Item[ITEM_MAX]; 51 | extern WORD ItemInd[ITEM_MAX]; 52 | extern WORD ItemNow; 53 | 54 | 55 | 56 | #endif 57 | -------------------------------------------------------------------------------- /GIAN07/LASER.H: -------------------------------------------------------------------------------- 1 | /*************************************************************************************************/ 2 | /* LASER.H レーザーに関する処理(反射,ショート) */ 3 | /* */ 4 | /*************************************************************************************************/ 5 | 6 | #ifndef PBGWIN_LASER_H 7 | #define PBGWIN_LASER_H "LASEER : Ver 0.51 : Update 2000/02/17" 8 | //#pragma message(PBGWIN_LASER_H) 9 | 10 | 11 | 12 | ///// [更新履歴] ///// 13 | 14 | // 2000/02/17 : 新しいシステムに移行開始。無限遠レーザーと完全に分離 15 | 16 | /*-> ここからはちょっと古いよ(1999..) 17 | * (4/3) 10:36 開発開始 18 | * (4/6) 12:00 ついにポリゴン&クリッピング関数が完成。描画はいつ出来るのか? 19 | * (4/7) 12:02 全てのレーザーを同じ構造体で扱う事にした 20 | * (4/8) 7:23 無限遠レーザーの制作 21 | * (4/9) 2:01 反射レーザーを一応打ち込み終わる 22 | * (4/9) 2:59 反射レーザー完成 23 | * (4/11) 14:05 ショート&反射レーザーの当たり判定完成 24 | * (4/11) 15:17 リフレクターのヒットチェックを強化(バグは消えたが遅くなった) 25 | * 26 | * (9/23) 16:18 ライン描画、ECL対応などが完了 27 | */ 28 | 29 | 30 | #include 31 | 32 | 33 | 34 | ////レーザー定数//// 35 | #define LASER_MAX 1000 // レーザーの最大発生本数 36 | #define RT_MAX 10 // 反射物の最大個数 37 | #define LS_ZSET 0x08 // レーザーのサボテン(自機)セット属性 38 | #define SLASER_EVADE 3 // ショートレーザーのかすりポイント 39 | #define LASER_EVADE_WIDTH (12*64) // レーザーのかすり許容範囲 40 | 41 | 42 | ////レーザーの種類定数//// 43 | #define LS_SHORT 0x00 // ショートレーザー 44 | #define LS_REF 0x01 // 反射レーザー 45 | #define LS_LONG 0x02 // 無限遠レーザー 46 | #define LS_LONGY 0x03 // 縦無限遠レーザー(角度指定は無効 64固定) 47 | 48 | 49 | ////レーザーコマンド定数//// 50 | #define LC_WAY 0x00 // 扇状発射 51 | #define LC_ALL 0x01 // 全方向発射 52 | #define LC_RND 0x02 // 基本角セット有りランダム 53 | #define LC_WAYZ 0x08 // 扇状発射&サボテンセット 54 | #define LC_ALLZ 0x09 // 全方向発射&サボテンセット 55 | #define LC_RNDZ 0x0a // 基本角サボテンセットランダム 56 | 57 | 58 | ////レーザーフラグ定数(一部レーザーの種類に依存します)//// 59 | #define LF_NONE 0x00 // フラグ無し状態 60 | #define LF_CLEAR 0x01 // レーザーが消滅中である 61 | 62 | #define LF_SHOT 0x02 // レーザー発射中 63 | #define LF_HIT 0x04 // レーザーヒット中(REF_OBJECTに対して) 64 | #define LF_NMOVE 0x06 // レーザーの長さ変わらず(LF_SHOT|LF_HIT) 65 | 66 | #define LF_DELETE 0x80 // レーザーを消去する(処理対象から外す) 67 | 68 | 69 | ////レーザー発動コマンド構造体//// 70 | typedef struct{ 71 | int x,y; // 始点の座標 72 | int v; // レーザーの初速度 73 | 74 | int w; // レーザーの太さ (x64座標を使用する) 75 | int l; // レーザーの長さ最終値 (x64座標を使用する) 76 | int l2; // レーザーの発射位置補正(x64...) 77 | 78 | BYTE d; // 発射角 79 | BYTE dw; // 発射幅 80 | 81 | BYTE n; // レーザーの本数 82 | BYTE c; // レーザーの色 83 | 84 | char a; // 加速度(つかうのかな???) 85 | BYTE cmd; // レーザー発動コマンド(ほとんど弾と同じかも) 86 | BYTE type; // ショート、無限遠など 87 | BYTE notr; // 反射しないリフレクターの番号 88 | } LASER_CMD; 89 | 90 | 91 | ////レーザー用構造体//// 92 | typedef struct{ 93 | int x,y; // 現在の始点 94 | int vx,vy; // 速度の(X,Y)成分 95 | int lx,ly; // 表示座標の加算値(長さ) 96 | int wx,wy; // 表示座標の加算値(太さ) 97 | int v; // 速度 98 | 99 | POINT p[4]; // 表示する座標 100 | 101 | char a; // 加速度(つかうのか??) 102 | BYTE d; // 進行方向 103 | 104 | int w,wmax; // 太さ 105 | int l,lmax; // 現在の長さ、長さの最終値 106 | int ltemp; // 反射レーザー専用変数(発射&ヒットの場合にのみ使用) 107 | 108 | WORD count; // フレームカウンタ 109 | BYTE c; // 色 110 | BYTE type; // 種類 111 | BYTE flag; // 消去要請フラグ等(エフェクト含む) 112 | BYTE notr; // 反射しないリフレクターの番号 113 | BYTE evade; // かすり用フラグ 114 | } LASER_DATA; 115 | 116 | /* 117 | ////反射物(鏡?) 構造体//// 118 | typedef struct{ 119 | int x,y; // 反射物の中心座標 120 | 121 | DWORD l; // リフレクターの長さ(中心から先端まで,つまり全体でl*2) 122 | BYTE d; // 反射物の角度(0 <= d < 128) 123 | } REFLECTOR; 124 | */ 125 | 126 | ////レーザー関数//// 127 | extern void laser_set(void); // レーザーをセットする(難易度変更"有り") 128 | extern void laser_setEX(void); // レーザーをセットする(難易度変更"無し") 129 | extern int llaser_set(WORD *ind); // 無限遠レーザーをセットする(セットできた数を返すのだ) 130 | extern void laser_move(void); // レーザーを動かす 131 | extern void laser_draw(void); // レーザーを描画する 132 | extern void laser_clear(void); // レーザー全てに消去エフェクトをかける 133 | extern void laserind_set(void); // レーザー順序用配列の初期化 134 | 135 | 136 | ////レーザーの各種変数たち//// 137 | extern LASER_CMD LaserCmd; // 標準レーザーコマンド構造体 138 | extern LASER_DATA Laser[LASER_MAX]; // レーザー格納用構造体 139 | extern WORD LaserInd[LASER_MAX]; // レーザー順番維持用配列 140 | extern WORD LaserNow; // レーザーの本数 141 | //extern REFLECTOR Reflector[RT_MAX]; // 反射物構造体 142 | //extern WORD ReflectorNow; // 反射物の個数 143 | 144 | #endif 145 | -------------------------------------------------------------------------------- /GIAN07/LENS.CPP: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* Lens.cpp レンズエフェクト */ 3 | /* */ 4 | /* */ 5 | 6 | #include "Lens.h" 7 | 8 | 9 | 10 | // 秘密の関数 // 11 | static FVOID __DrawLensBall_8(LensInfo *LInfo, int x, int y); 12 | static FVOID __DrawLensBall_16(LensInfo *LInfo, int x, int y); 13 | 14 | static BYTE *__LSurfLock(LensInfo *LInfo); 15 | static FVOID __LSurfUnlock(LensInfo *LInfo); 16 | 17 | static FBOOL __BackSurfLock(void); 18 | static FVOID __BackSurfUnlock(void); 19 | 20 | static BYTE *__GrpBack = NULL; 21 | static DWORD __GrpPitch = 0; 22 | 23 | 24 | 25 | // LInfo->gTemp に対して->Lock() を行う (return : 書き込み先) // 26 | static BYTE *__LSurfLock(LensInfo *LInfo) 27 | { 28 | DDSURFACEDESC ddsd; 29 | HRESULT ddret; 30 | 31 | memset(&ddsd,0,sizeof(DDSURFACEDESC)); 32 | ddsd.dwSize = sizeof(ddsd); 33 | ddret = LInfo->gTemp->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL); 34 | if(ddret != DD_OK) return NULL; 35 | 36 | LInfo->gPitch = ddsd.lPitch; 37 | 38 | return (BYTE *)ddsd.lpSurface; 39 | } 40 | 41 | 42 | // LInfo->gTemp に対して、->Unlock() を行う // 43 | static FVOID __LSurfUnlock(LensInfo *LInfo) 44 | { 45 | LInfo->gTemp->Unlock(NULL); 46 | } 47 | 48 | 49 | static FBOOL __BackSurfLock(void) 50 | { 51 | DDSURFACEDESC ddsd; 52 | HRESULT ddret; 53 | 54 | memset(&ddsd,0,sizeof(DDSURFACEDESC)); 55 | ddsd.dwSize = sizeof(ddsd); 56 | ddret = DxObj.Back->Lock(NULL,&ddsd,DDLOCK_WAIT,NULL); 57 | if(ddret != DD_OK) return FALSE; 58 | 59 | __GrpPitch = ddsd.lPitch; 60 | __GrpBack = (BYTE *)ddsd.lpSurface; 61 | 62 | return TRUE; 63 | } 64 | 65 | 66 | static FVOID __BackSurfUnlock(void) 67 | { 68 | DxObj.Back->Unlock(NULL); 69 | } 70 | 71 | 72 | // 半径:r 出っ張り:m のレンズを作成 // 73 | extern LensInfo *GrpCreateLensBall(int r, int m, GRP Surface) 74 | { 75 | LensInfo *NewLens; 76 | DWORD *Table; 77 | DWORD DataSize; 78 | DWORD Diameter; 79 | DWORD Pitch; 80 | BYTE BitWeight; 81 | int s,dx,z,r2,w; 82 | int i; 83 | 84 | if(DxObj.Bpp == 16) BitWeight = 2; 85 | else BitWeight = 1; 86 | 87 | if(r <= 0) return NULL; // 半径がおかしい 88 | if(r <= m) return NULL; // 出っ張りは半径より小さくせよ! 89 | 90 | NewLens = (LensInfo *)LocalAlloc(LPTR, sizeof(LensInfo)); 91 | if(NewLens == NULL){ 92 | return NULL; 93 | } 94 | 95 | Diameter = r * 2; 96 | DataSize = sizeof(DWORD) * Diameter * Diameter; 97 | NewLens->Data = (DWORD *)LocalAlloc(LPTR, DataSize); 98 | if(NewLens->Data == NULL){ 99 | LocalFree(NewLens); 100 | return NULL; 101 | } 102 | 103 | NewLens->gTemp = Surface; 104 | 105 | NewLens->r = r; 106 | NewLens->Height = Diameter; 107 | 108 | __LSurfLock(NewLens); 109 | __LSurfUnlock(NewLens); 110 | Pitch = NewLens->gPitch; 111 | 112 | Table = NewLens->Data; 113 | r2 = (r * r); 114 | s = isqrt(r2 - (m * m)); 115 | 116 | for(i=-r; i 0){ // 円の内部 121 | dx = isqrt(dx); 122 | *Table = w = dx*2; Table++; // Width 123 | *Table = (r-dx)*BitWeight; Table++; // Dx 124 | } 125 | else{ // 円の外部 126 | w = 0; 127 | *Table = 0; Table++; // Width 128 | *Table = 0; Table++; // Dx 129 | } 130 | 131 | while(w--){ 132 | z = (dx - w) * (dx - w); 133 | z = isqrt(r2 - z - (i*i)); 134 | 135 | *Table = (i * m)/z + r; // y座標 136 | *Table = (*Table) * Pitch; // 幅を掛ける 137 | *Table = (*Table) + (((dx-w) * m)/z + r)*BitWeight; // x座標 138 | 139 | Table++; 140 | } 141 | } 142 | 143 | return NewLens; 144 | } 145 | 146 | 147 | // GrpLock() 系関数 : レンズボールを描画する // 148 | static FVOID __DrawLensBall_8(LensInfo *LInfo, int x, int y) 149 | { 150 | DWORD Height,Width; 151 | DWORD *Table; // テーブル参照用 152 | 153 | BYTE *Src; // 8ビット用&16ビット用兼用 154 | BYTE *Dest; 155 | BYTE *p; // 上に同じ... 156 | 157 | HRESULT ddrval; 158 | RECT src; 159 | 160 | SetRect(&src, x-LInfo->r, y-LInfo->r, x+LInfo->r, y+LInfo->r); 161 | for(;;){ 162 | ddrval = LInfo->gTemp->BltFast(0, 0,DxObj.Back,&src,DDBLTFAST_NOCOLORKEY); 163 | if(ddrval == DD_OK){ 164 | break; 165 | } 166 | if(ddrval == DDERR_SURFACELOST){ 167 | if(!GrpRestore()) 168 | return; 169 | } 170 | if(ddrval != DDERR_WASSTILLDRAWING){ 171 | return; 172 | } 173 | } 174 | 175 | // (x,y) が中心になるように補正する // 176 | x -= LInfo->r; 177 | y -= LInfo->r; 178 | 179 | if(x<0 || y<0 || x+LInfo->Height>639 || y+LInfo->Height>479) return; 180 | 181 | if(!__BackSurfLock()) return; 182 | // GrpLock(); 183 | // if(Grp_Vram == NULL) return; 184 | 185 | Src = __LSurfLock(LInfo); 186 | if(Src == NULL){ 187 | __BackSurfUnlock(); 188 | return; 189 | } 190 | 191 | Table = LInfo->Data; 192 | Dest = (__GrpBack + x*sizeof(BYTE) + (y * __GrpPitch)); 193 | //Dest = Grp_Vram + x + Grp_AddrY[y]; 194 | 195 | for(Height=0; HeightHeight; Height++){ 196 | Width = *Table; Table++; // 幅 197 | p = (BYTE *)(Dest + (*Table)); Table++; // 初期シフト値 198 | 199 | while(Width--){ 200 | *p = *(BYTE *)(Src + (*Table)); 201 | p++; 202 | Table++; 203 | } 204 | 205 | Dest += __GrpPitch; 206 | } 207 | 208 | __LSurfUnlock(LInfo); 209 | __BackSurfUnlock(); 210 | //GrpUnlock(); 211 | } 212 | 213 | 214 | // GrpLock() 系関数 : レンズボールを描画する // 215 | static FVOID __DrawLensBall_16(LensInfo *LInfo, int x, int y) 216 | { 217 | DWORD Height,Width; 218 | DWORD *Table; // テーブル参照用 219 | 220 | BYTE *Src; // 8ビット用&16ビット用兼用 221 | BYTE *Dest; 222 | WORD *p; // 上に同じ... 223 | 224 | HRESULT ddrval; 225 | RECT src; 226 | 227 | SetRect(&src, x-LInfo->r, y-LInfo->r, x+LInfo->r, y+LInfo->r); 228 | for(;;){ 229 | ddrval = LInfo->gTemp->BltFast(0, 0,DxObj.Back,&src,DDBLTFAST_NOCOLORKEY); 230 | if(ddrval == DD_OK){ 231 | break; 232 | } 233 | if(ddrval == DDERR_SURFACELOST){ 234 | if(!GrpRestore()) 235 | return; 236 | } 237 | if(ddrval != DDERR_WASSTILLDRAWING){ 238 | return; 239 | } 240 | } 241 | 242 | // (x,y) が中心になるように補正する // 243 | x -= LInfo->r; 244 | y -= LInfo->r; 245 | 246 | if(x<0 || y<0 || x+LInfo->Height>639 || y+LInfo->Height>479) return; 247 | 248 | // 転送先はロックされているかな // 249 | if(!__BackSurfLock()) return; 250 | // GrpLock(); 251 | // if(Grp_Vram == NULL) return; 252 | 253 | Src = __LSurfLock(LInfo); 254 | if(Src == NULL){ 255 | __BackSurfUnlock(); 256 | return; 257 | } 258 | 259 | Table = LInfo->Data; 260 | Dest = (__GrpBack + x*sizeof(WORD) + (y * __GrpPitch)); 261 | //Dest = Grp_Vram + x + Grp_AddrY[y]; 262 | 263 | for(Height=0; HeightHeight; Height++){ 264 | Width = *Table; Table++; // 幅 265 | p = (WORD *)(Dest + (*Table)); Table++; // 初期シフト値 266 | 267 | while(Width--){ 268 | *p = *(WORD *)(Src + (*Table)); 269 | p++; 270 | Table++; 271 | } 272 | 273 | Dest += __GrpPitch; 274 | } 275 | 276 | __LSurfUnlock(LInfo); 277 | __BackSurfUnlock(); 278 | //GrpUnlock(); 279 | } 280 | 281 | 282 | // GrpLock() 系関数 : レンズボールを描画する // 283 | extern FVOID GrpDrawLensBall(LensInfo *LInfo, int x, int y) 284 | { 285 | if(DxObj.Bpp == 16) __DrawLensBall_16(LInfo, x, y); 286 | else __DrawLensBall_8(LInfo, x, y); 287 | } 288 | 289 | 290 | // レンズボール用データを破棄する // 291 | extern FVOID GrpReleaseLensBall(LensInfo *LInfo) 292 | { 293 | if(LInfo == NULL) return; 294 | 295 | if(LInfo->Data) LocalFree(LInfo->Data); 296 | 297 | LocalFree(LInfo); 298 | } 299 | -------------------------------------------------------------------------------- /GIAN07/LENS.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* Lens.h レンズエフェクト */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_LENS_H 7 | #define PBGWIN_LENS_H "LENS_EFC : Version 0.01 : Update 2000/09/18" 8 | #pragma message(PBGWIN_LENS_H) 9 | 10 | #include "PBGUTY_X.h" 11 | 12 | 13 | 14 | ///// [構造体] ///// 15 | 16 | // レンズデータ定義用構造体 // 17 | typedef struct tagLensInfo { 18 | DWORD r; // レンズの半径 19 | DWORD Height; // レンズの直径 20 | DWORD *Data; // レンズ置換テーブル 21 | 22 | GRP gTemp; // データ一時待避用Surface(できればSysMemory) 23 | DWORD gPitch; // Surface の横幅 24 | //BYTE gID; // SurfaceID (DD_UTY の関数に対する) 25 | } LensInfo; 26 | 27 | 28 | 29 | ///// [ 関数 ] ///// 30 | 31 | // 半径:r 出っ張り:m のレンズを作成 // 32 | extern LensInfo *GrpCreateLensBall(int r, int m, GRP id); 33 | 34 | // GrpLock() 系関数 : レンズボールを描画する // 35 | extern FVOID GrpDrawLensBall(LensInfo *LInfo, int x, int y); 36 | 37 | // レンズボール用データを破棄する // 38 | extern FVOID GrpReleaseLensBall(LensInfo *LInfo); 39 | 40 | 41 | 42 | #endif 43 | -------------------------------------------------------------------------------- /GIAN07/LLASER.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* LLaser.h 長いレーザーの処理 */ 3 | /* */ 4 | /* */ 5 | 6 | 7 | #ifndef PBGWIN_LLASER_H 8 | #define PBGWIN_LLASER_H "LLASER : Ver 0.03 : Updata 2000/02/07" 9 | //#pragma message(PBGWIN_LLASER_H) 10 | 11 | // 更新履歴 // 12 | // 2000/05/29 : 8ビットモード描画関連のBugFix 13 | // 2000/03/22 : レーザー関数のIDの意味がレーザー配列のIDからその敵が 14 | // : 発射しているレーザーの何番目か、に変更された 15 | 16 | 17 | #define WIN32_LEAN_AND_MEAN 18 | #include 19 | #include "ENEMY.h" 20 | 21 | 22 | 23 | //// レーザー用定数2 //// 24 | #define LLASER_MAX 20 25 | #define LLASER_EVADE 1 // レーザーのかすり値 26 | 27 | 28 | //// レーザーの種類定数2 29 | #define LLS_LONG 0x00 30 | #define LLS_LONGY 0x01 31 | #define LLS_SETDEG 0x02 32 | #define LLS_LONGZ 0x03 // 自機セット 33 | 34 | 35 | //// レーザーフラグ2 //// 36 | #define LLF_DISABLE 0x00 // レーザーが使用されていない 37 | #define LLF_NORM 0x01 // レーザーが完全に開ききった 38 | #define LLF_OPEN 0x02 // レーザを開いている 39 | #define LLF_CLOSE 0x04 // レーザーを閉じている 40 | #define LLF_CLOSEL 0x08 // レーザーをライン状態にする 41 | #define LLF_LINE 0x10 // レーザーはライン状態 42 | 43 | 44 | 45 | //// レーザー発動コマンド構造体2 //// 46 | typedef struct{ 47 | ENEMY_DATA *e; // 敵データへのポインタ 48 | 49 | int dx,dy; // レーザーの発射座標ずらし値 50 | int v; // レーザーの速度 51 | 52 | int w; // レーザーの太さ最終値 53 | 54 | BYTE d; // レーザー発射角 55 | 56 | BYTE c; // レーザーの色 57 | BYTE type; // レーザーの種類 58 | } LLASER_CMD; 59 | 60 | 61 | //// レーザー用構造体2 //// 62 | typedef struct{ 63 | ENEMY_DATA *e; // 敵データへのポインタ(ここら辺でボスでも雑魚でも発射できるように) 64 | 65 | int x,y; // 現在の表示座標 66 | int dx,dy; // 敵データからのずらし値(x64) 67 | int lx,ly; // レーザー円の中心座標までのベクトル(Grp) 68 | int infx,infy; // 仮の無限遠へのベクトル(Grp) 69 | int wx,wy; // レーザー幅(Grp) 70 | 71 | int w,wmax; // 幅、最大幅(x64) 72 | int v; 73 | 74 | DWORD count; // フレームカウンタ 75 | 76 | POINT p[4]; // 座標保持用のポインタ(Grp) 77 | 78 | BYTE d; // レーザーの発射角 79 | BYTE c; // レーザーの色 80 | 81 | BYTE flag; // レーザーの状態 82 | BYTE type; // レーザーの種類 83 | BYTE EnemyID; // 敵から見た番号 84 | } LLASER_DATA; 85 | 86 | 87 | 88 | //// レーザー関数2 //// 89 | extern BOOL LLaserSet(BYTE id); // レーザーをセットする 90 | extern void LLaserOpen(ENEMY_DATA *e,BYTE id); // レーザーを開く 91 | extern void LLaserClose(ENEMY_DATA *e,BYTE id); // レーザーを閉じる 92 | extern void LLaserLine(ENEMY_DATA *e,BYTE id); // レーザーをライン状態にする 93 | extern void LLaserDegA(ENEMY_DATA *e,BYTE d,BYTE id); // レーザーを角度絶対で回転 94 | extern void LLaserDegR(ENEMY_DATA *e,char d,BYTE id); // レーザーを角度相対で回転 95 | 96 | extern void LLaserForceClose(ENEMY_DATA *e); // 敵に関連づけられたレーザーを強制クローズ 97 | 98 | extern void LLaserMove(void); // レーザーを動かす 99 | extern void LLaserDraw(void); // レーザーを描画する 100 | extern void LLaserClear(void); // 無限遠レーザーを全クローズ 101 | 102 | extern void LLaserSetup(void); // レーザー配列の初期化をする 103 | 104 | 105 | 106 | //// レーザー変数2 //// 107 | extern LLASER_DATA LLaser[LLASER_MAX]; 108 | extern LLASER_CMD LLaserCmd; 109 | 110 | 111 | 112 | #endif 113 | -------------------------------------------------------------------------------- /GIAN07/LOADER.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* LOADER.h グラフィック、サウンド等のロード */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_LOADER_H 7 | #define PBGWIN_LOADER_H "LOADER : Version 0.10 : Update 2000/02/18" 8 | //#pragma message(PBGWIN_LOADER_H) 9 | 10 | #include "GIAN.h" 11 | #include "Lens.h" 12 | 13 | 14 | ///// [ 定数 ] ///// 15 | 16 | // Surface 関連 // 17 | #define SURFACE_ID_SYSTEM 0 // システム用 Surface のID 18 | #define SURFACE_ID_MAPCHIP 1 // マップチップ用 Surface のID 19 | #define SURFACE_ID_SPROJECT 1 // 西方Project表示用Surface のID 20 | #define SURFACE_ID_ENEMY 2 // 敵(雑魚&Boss)用 Surface のID 21 | #define SURFACE_ID_MUSIC 2 // 音楽室用 Surface のID(Enemyと共有) 22 | #define SURFACE_ID_TITLE 2 // たいとる用 Surface のID(上に同じ) 23 | #define SURFACE_ID_NAMEREG 2 // お名前登録用 Surface のID(上に同じ) 24 | #define SURFACE_ID_MTITLE 3 // 曲名加工用 Surface のID 25 | #define SURFACE_ID_BOMBER 7 // ボム画像用 Surface のID 26 | #define SURFACE_ID_LENS 8 // レンズ加工用 Surface のID 27 | 28 | #define FACE_MAX 3 // 同時にロード可能な人数... 29 | #define FACE_NUMX 6 // 顔グラの横の個数 30 | #define SURFACE_ID_FACE0 4 // 顔グラ用(0) Surface のID 31 | #define SURFACE_ID_FACE1 5 // 顔グラ用(1) Surface のID 32 | #define SURFACE_ID_FACE2 6 // 顔グラ用(2) Surface のID 33 | 34 | // 特殊グラフィックID (For LoadGraph() ) // 35 | #define GRAPH_ID_MUSICROOM (128) // 音楽室用BMPのID(数値は1-6 で無ければ良い) 36 | #define GRAPH_ID_TITLE (128+1) // タイトル画面のBMPのID 37 | #define GRAPH_ID_NAMEREGIST (128+2) // お名前登録画面のBMPのID 38 | #define GRAPH_ID_EXSTAGE (128+3) // エキストラステージ・システム 39 | #define GRAPH_ID_EXBOSS1 (128+4) // エキストラステージ・ボス1 40 | #define GRAPH_ID_EXBOSS2 (128+5) // エキストラステージ・ボス2 41 | #define GRAPH_ID_SPROJECT (128+6) // 西方Projectの表示 42 | #define GRAPH_ID_ENDING (128+7) // エンディングのロードを行う 43 | 44 | // サウンド(効果音番号) // 45 | #define SOUND_ID_KEBARI 0x00 46 | #define SOUND_ID_TAME 0x01 47 | #define SOUND_ID_LASER 0x02 48 | #define SOUND_ID_LASER2 0x03 49 | #define SOUND_ID_BOMB 0x04 50 | #define SOUND_ID_SELECT 0x05 51 | #define SOUND_ID_HIT 0x06 52 | #define SOUND_ID_CANCEL 0x07 53 | #define SOUND_ID_WARNING 0x08 54 | #define SOUND_ID_SBLASER 0x09 55 | #define SOUND_ID_BUZZ 0x0a 56 | #define SOUND_ID_MISSILE 0x0b 57 | #define SOUND_ID_JOINT 0x0c 58 | #define SOUND_ID_DEAD 0x0d 59 | #define SOUND_ID_SBBOMB 0x0e 60 | #define SOUND_ID_BOSSBOMB 0x0f 61 | #define SOUND_ID_ENEMYSHOT 0x10 62 | #define SOUND_ID_HLASER 0x11 63 | #define SOUND_ID_TAMEFAST 0x12 64 | #define SOUND_ID_WARP 0x13 65 | 66 | // サウンド(最大数) // 67 | #define SNDMAX_KEBARI 5 68 | #define SNDMAX_TAME 5 69 | #define SNDMAX_LASER 1 70 | #define SNDMAX_LASER2 1 71 | #define SNDMAX_BOMB 1 // 5 72 | #define SNDMAX_SELECT 1 73 | #define SNDMAX_HIT 1 // 5 74 | #define SNDMAX_CANCEL 1 75 | #define SNDMAX_WARNING 1 76 | #define SNDMAX_SBLASER 1 77 | #define SNDMAX_BUZZ 2 // 2 78 | #define SNDMAX_MISSILE 5 79 | #define SNDMAX_JOINT 1 80 | #define SNDMAX_DEAD 1 81 | #define SNDMAX_SBBOMB 1 82 | #define SNDMAX_BOSSBOMB 1 83 | #define SNDMAX_ENEMYSHOT 5 84 | #define SNDMAX_HLASER 1 85 | #define SNDMAX_TAMEFAST 5 86 | #define SNDMAX_WARP 1 87 | 88 | 89 | 90 | typedef struct tagFACE_DATA{ 91 | GRP GrSurf; // 顔グラ用 Surface へのポインタ 92 | PALETTEENTRY pal[256]; // 顔グラ用パレット 93 | } FACE_DATA; 94 | 95 | // エンディングのグラフィック管理用 // 96 | typedef struct tagENDING_GRP{ 97 | GRP GrSurf; // Surface 98 | RECT rcTarget; // 矩形の範囲 99 | PALETTEENTRY pal[256]; // パレット 100 | } ENDING_GRP; 101 | 102 | 103 | 104 | ///// [ 関数 ] ///// 105 | extern BOOL InitSurface(void); // Surface を作成する 106 | 107 | extern BOOL LoadStageData(BYTE stage); // ECL&SCLデータ列をメモリ上にロードする 108 | extern BOOL LoadGraph(int stage); // あるステージのグラフィックをロードする 109 | extern BOOL LoadFace(BYTE SurfaceID,BYTE FileNo); // 顔グラフィックをロードする 110 | extern BOOL LoadMusic(int no); // n番目の曲をロードする 111 | extern BOOL LoadSound(void); // 全ての Sound データをロードする 112 | extern BOOL LoadMusicRoomComment(int no); // MusicRoom のコメントをロードする 113 | 114 | extern void LoadPaletteFromMap(void); // 前後にある40色をマップパーツのパレットにする 115 | extern void LoadPaletteFromEnemy(void); // 敵のパレットにする 116 | extern void LoadPaletteFromMusic(void); 117 | 118 | extern void CleanupLens(void); // レンズを破棄する 119 | 120 | 121 | /* 122 | // 廃止:2000/12/01 // 123 | extern void EnterBombPalette(void); // ボム用パレット属性に変更する 124 | extern void LeaveBombPalette(void); // ボム用パレット属性を外す 125 | */ 126 | 127 | //// [ 変数 ] //// 128 | extern GRP GrTama; // システム用 129 | extern GRP GrEnemy; // 敵(雑魚&ボス)用 130 | extern GRP GrMap; // 背景用 131 | extern GRP GrMTitle; // 曲のタイトル加工用 132 | extern GRP GrBomber; // ボム用グラフィック用 133 | extern GRP GrLens; // レンズエフェクト用 134 | 135 | extern FACE_DATA FaceData[FACE_MAX]; // 顔グラ用 136 | 137 | extern DWORD MusicNum; // 曲数 138 | 139 | extern char MCommentBuffer[12][50]; 140 | extern char MTitleBuffer[50]; 141 | 142 | extern LensInfo *Lens; 143 | 144 | extern PALETTEENTRY SProjectPalette[256]; 145 | 146 | extern ENDING_GRP EndingGrp[6]; 147 | 148 | 149 | 150 | #endif 151 | -------------------------------------------------------------------------------- /GIAN07/MAID.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* Maid.h メイドさん関連の処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_MAID_H 7 | #define PBGWIN_MAID_H "めいど : Version 0.01 : Update 2000/02/17" 8 | //#pragma message(PBGWIN_MAID_H) 9 | 10 | #include "Gian.h" 11 | 12 | 13 | 14 | ///// [ 定数 ] ///// 15 | 16 | // サボテン定数 // 17 | #define VIVDEAD_VAL (300) // びびっとの死亡時間... 18 | #define VIVMUTEKI_VAL (180) // びびっとの無敵時間 19 | 20 | #define MAID_MOVE_DISABLE_TIME (250-100) // 行動不能な時間 21 | 22 | #define BOMBMUTEKI_VAL 60 // ボムの終端無敵時間 23 | #define SBOPT_DX 26 // オプションのずれ幅(x64ではない) 24 | //#define EVADE_X_START 150 // かすりカウンタの初期表示座標 25 | //#define EVADE_X_SPD 5 // かすりカウンタの移動速度 26 | //#define EVADE_TIME 60 // かすり許容フレーム数 27 | #define EVADETIME_MAX 256 // かすりマックス時の待ち時間 28 | 29 | #define SSP_WIDE (64*9) // 30 | #define SSP_HOMING (64*9) // 31 | #define SSP_LASER (64*13) // 32 | 33 | 34 | 35 | 36 | ///// [マクロ] ///// 37 | 38 | 39 | 40 | ///// [構造体] ///// 41 | 42 | typedef struct 43 | { 44 | int x,y; // 現在の<表示>座標 45 | 46 | int vx,vy; // オプションのズレ具合 47 | int opx,opy; // 現在のオプション基本座標 48 | 49 | __int64 score; // 得点カウンタ 50 | __int64 dscore; // 得点増加値 51 | 52 | DWORD evade_sum; // かすり合計 53 | int evadesc; // かすり得点 54 | WORD evade; // かすり回数 55 | WORD evade_c; // 連続「かすり」の残り許容時間 56 | 57 | char v; // サボテンの移動速度基本値(後で64~45倍にする) 58 | 59 | BYTE weapon; // "とげ" の種類 60 | BYTE exp; // サボテンの経験値? 61 | BYTE bomb; // ボムの数 62 | BYTE left; // 残りサボテン数 63 | BYTE credit; // のこりクレジット 64 | 65 | BYTE GrpID; // 表示すべきグラフィック 66 | 67 | WORD bomb_time; // ボムウェイト用 68 | WORD exp2; // 経験値増加抑制用 69 | WORD muteki; // 無敵フラグ(0:off !0:無敵時間カウンタ) 70 | WORD lay_time; // レーザーの発射タイミング用 71 | BYTE lay_grp; // レーザーのグラフィック用 72 | BYTE toge_time; // "とげ" の発射タイミング用 73 | BYTE toge_ex; // とげ発射用特殊変数 74 | BYTE ShiftCounter; // 押しっぱなし低速移動用 75 | 76 | BOOL bGameOver; // ゲームオーバー判定用フラグ 77 | BOOL BuzzSound; // かすった音を連続再生させないためのフラグ 78 | } MAID; 79 | 80 | 81 | 82 | ///// [ 関数 ] ///// 83 | extern void MaidDraw(void); 84 | extern void StateDraw(void); // 各種ステータスを描画する 85 | extern void MaidMove(void); 86 | extern void MaidSet(void); // 初期化 87 | extern void MaidNextStage(void); // 次のステージの準備 88 | extern void MaidDead(void); // 死す 89 | 90 | extern FVOID evade_add(BYTE n); // かすりゲージを上昇させる 91 | //extern FVOID evade_addEx(int x,int y,BYTE n); // かすりゲージを上昇させる 92 | 93 | extern void score_add(int sc); // スコアを上昇させる 94 | 95 | extern void WideBombDraw(void); // ワイドショット用のボム(やや例外処理) 96 | 97 | 98 | 99 | ///// [ 変数 ] ///// 100 | extern MAID Viv; // 麗しきメイドさん構造体 101 | extern DWORD EvadeRate[256]; // かすり得点レート 102 | 103 | 104 | 105 | IVOID PowerUp(BYTE damage) 106 | { 107 | // ダメージの分だけ加算する // 108 | Viv.exp2 += damage; 109 | 110 | // Viv.exp(8bit+1bit) ooo oooooo // 111 | switch(((WORD)Viv.exp+1)>>5){ 112 | case(0): if(Viv.exp2>5-3) Viv.exp++, Viv.exp2=0; return; 113 | case(1): if(Viv.exp2>25-15) Viv.exp++, Viv.exp2=0; return; 114 | case(2): if(Viv.exp2>50-20) Viv.exp++, Viv.exp2=0; return; 115 | case(3): if(Viv.exp2>80) Viv.exp++, Viv.exp2=0; return; 116 | case(4): if(Viv.exp2>120) Viv.exp++, Viv.exp2=0; return; 117 | case(5): if(Viv.exp2>140) Viv.exp++, Viv.exp2=0; return; 118 | case(6): if(Viv.exp2>160) Viv.exp++, Viv.exp2=0; return; 119 | case(7): if(Viv.exp2>180) Viv.exp++, Viv.exp2=0; return; 120 | case(8): return; // フルパワーアップ時 121 | } 122 | } 123 | 124 | IBYTE GetRightLaserDeg(BYTE LaserDeg, int i) 125 | { 126 | if(LaserDeg < 58) return 64+48 - LaserDeg*3 + i*(64-LaserDeg)/2; 127 | else return 64+48 - 58*3 + i*(64-min(62,LaserDeg))/2; 128 | } 129 | 130 | IBYTE GetLeftLaserDeg(BYTE LaserDeg, int i) 131 | { 132 | if(LaserDeg < 58) return 64-48 + LaserDeg*3 + i*(64-LaserDeg)/2; 133 | else return 64-48 + 58*3 + i*(64-min(62,LaserDeg))/2; 134 | } 135 | 136 | IBYTE GetLaserDeg(void) 137 | { 138 | return ((120-Viv.bomb_time)*3)/2; 139 | } 140 | 141 | 142 | #endif 143 | -------------------------------------------------------------------------------- /GIAN07/MAIDTAMA.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* MaidTama.h メイドさんなショットの処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_MAIDTAMA_H 7 | #define PBGWIN_MAIDTAMA_H "めいどたま : Version 0.01 : Update 2000/02/25" 8 | //#pragma message(PBGWIN_MAIDTAMA_H) 9 | 10 | #include "Gian.h" 11 | 12 | 13 | 14 | ///// [ 定数 ] ///// 15 | 16 | // 最大値 // 17 | #define MAIDTAMA_MAX 200 // 自機ショットの最大数 18 | 19 | #define TID_WIDE_MAIN 0x00 // ワイド・メインショットのID 20 | #define TID_WIDE_SUB 0x01 // ワイド・サブショットのID 21 | #define TID_HOMING_MAIN 0x02 // ホーミング・メインショットのID 22 | #define TID_HOMING_SUB 0x03 // ホーミング・サブショットのID 23 | #define TID_LASER_MAIN 0x04 // レーザー・メインショット??のID 24 | #define TID_LASER_SUB 0x05 // レーザー・サブショットのID 25 | 26 | #define TID_HOMING_BOMB_A 0x06 // ホーミング用ボム(移動中) 27 | #define TID_HOMING_BOMB_B 0x07 // ホーミング用ボム(誘爆中) 28 | 29 | #define TDM_WIDE_MAIN 6 // ワイド・メインショットのダメージ 30 | #define TDM_WIDE_SUB 4 // ワイド・サブショットのダメージ 31 | #define TDM_HOMING_MAIN 6 // ホーミング・メインショットのダメージ 32 | #define TDM_HOMING_SUB 7 // ホーミング・サブショットのダメージ 33 | #define TDM_LASER_MAIN 2 // レーザー・メインショットのダメージ 34 | #define TDM_LASER_SUB 5 // レーザー・サブショットのダメージ 35 | 36 | 37 | 38 | ///// [ 関数 ] ///// 39 | FVOID MaidTamaSet(void); // たま発射!! 40 | FVOID MaidTamaMove(void); // 弾移動&ヒットチェック 41 | FVOID MaidTamaDraw(void); // ナニな弾描画 42 | FVOID MaidTamaIndSet(void); // 弾ハッシュテーブル初期化 43 | 44 | 45 | 46 | ///// [ 変数 ] ///// 47 | extern TAMA_DATA MaidTama[MAIDTAMA_MAX]; // 自機ショットの格納用構造体 48 | extern WORD MaidTamaInd[MAIDTAMA_MAX]; // 弾の順番を維持するための配列(TAMA.CPP互換) 49 | extern WORD MaidTamaNow; // 現在の数 50 | 51 | 52 | 53 | #endif 54 | -------------------------------------------------------------------------------- /GIAN07/PRankCtrl.cpp: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* PRankCtrl.cpp プレイランク管理 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "PRankCtrl.h" 7 | 8 | PlayRankInfo PlayRank; 9 | 10 | 11 | 12 | // 難易度の許容範囲内でプレイランクを増減する 13 | FVOID PlayRankAdd(int n) 14 | { 15 | // イージー    0 ~ 24 16 | // ノーマル   16 ~ 40 17 | // ハード     32 ~ 48 18 | // ルナティック 40 ~ 64 19 | 20 | // 難易度を変化させる // 21 | if(GameStage == GRAPH_ID_EXSTAGE){ 22 | if(n){ 23 | if(n > 0) PlayRank.Rank += max(1, n/4); 24 | else PlayRank.Rank += min(-1, n/10); 25 | } 26 | } 27 | else{ 28 | PlayRank.Rank += n; 29 | } 30 | 31 | // この分岐に関しては、基本的にコンフィグの値に基づく // 32 | switch(ConfigDat.GameLevel){ 33 | case(GAME_EASY): 34 | if (PlayRank.Rank < 0) PlayRank.Rank = 0; 35 | else if(PlayRank.Rank > 24*256) PlayRank.Rank = 24*256; 36 | 37 | if(PlayRank.Rank < 20*256) PlayRank.GameLevel = GAME_EASY; 38 | else PlayRank.GameLevel = GAME_NORMAL; 39 | break; 40 | 41 | case(GAME_NORMAL): 42 | if (PlayRank.Rank < 16*256) PlayRank.Rank = 16*256; 43 | else if(PlayRank.Rank > 40*256) PlayRank.Rank = 40*256; 44 | 45 | if (PlayRank.Rank < 20*256) PlayRank.GameLevel = GAME_EASY; 46 | else if(PlayRank.Rank < 36*256) PlayRank.GameLevel = GAME_NORMAL; 47 | else PlayRank.GameLevel = GAME_HARD; 48 | break; 49 | 50 | case(GAME_HARD): 51 | if (PlayRank.Rank < 32*256) PlayRank.Rank = 32*256; 52 | else if(PlayRank.Rank > 48*256) PlayRank.Rank = 48*256; 53 | 54 | if (PlayRank.Rank < 36*256) PlayRank.GameLevel = GAME_NORMAL; 55 | else if(PlayRank.Rank < 44*256) PlayRank.GameLevel = GAME_HARD; 56 | else PlayRank.GameLevel = GAME_LUNATIC; 57 | break; 58 | 59 | case(GAME_LUNATIC): 60 | if (PlayRank.Rank < 40*256) PlayRank.Rank = 40*256; 61 | else if(PlayRank.Rank > 64*256) PlayRank.Rank = 64*256; 62 | 63 | if(PlayRank.Rank < 44*256) PlayRank.GameLevel = GAME_HARD; 64 | else PlayRank.GameLevel = GAME_LUNATIC; 65 | break; 66 | 67 | //case(GAME_EXTRA): 68 | //break; 69 | } 70 | } 71 | 72 | 73 | // 現在の難易度に応じてプレイランクを初期化 74 | FVOID PlayRankReset(void) 75 | { 76 | PlayRank.GameLevel = ConfigDat.GameLevel; 77 | 78 | switch(ConfigDat.GameLevel){ 79 | case(GAME_EASY): PlayRank.Rank = 12*256; break; 80 | case(GAME_NORMAL): PlayRank.Rank = 28*256; break; 81 | case(GAME_HARD): PlayRank.Rank = 40*256; break; 82 | case(GAME_LUNATIC): PlayRank.Rank = 52*256; break; 83 | //case(GAME_EXTRA): break; 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /GIAN07/PRankCtrl.h: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* PRankCtrl.h プレイランク管理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_PRANKCTRL_H 7 | #define PBGWIN_PRANKCTRL_H "PRANKCTRL : Version 0.01 : Update 2000/09/13" 8 | 9 | #include "GIAN.h" 10 | 11 | 12 | 13 | ///// [構造体] ///// 14 | typedef struct tagPlayRankInfo{ 15 | BYTE GameLevel; // 方向数も関係する難易度変化 16 | int Rank; // 弾の速度変化に関する値 17 | } PlayRankInfo; 18 | 19 | 20 | 21 | ///// [グローバル変数] ///// 22 | extern PlayRankInfo PlayRank; 23 | 24 | 25 | 26 | ///// [ 関数 ] ///// 27 | FVOID PlayRankAdd(int n); // 難易度の許容範囲内でプレイランクを増減する 28 | FVOID PlayRankReset(void); // 現在の難易度に応じてプレイランクを初期化 29 | 30 | 31 | 32 | #endif 33 | -------------------------------------------------------------------------------- /GIAN07/PaletteEX.cpp: -------------------------------------------------------------------------------- 1 | /* 2 | * PaletteEx.cpp : 特殊パレット処理 3 | * 4 | */ 5 | 6 | #include "PaletteEx.h" 7 | 8 | 9 | // パレットをuv固定で変換 // 10 | void ConvertPalette(PALETTEENTRY *pal, BYTE u, BYTE v) 11 | { 12 | double ty, tu, tv; 13 | double r, g, b; 14 | int i; 15 | 16 | tu = u; 17 | tv = v; 18 | 19 | // これもダメだね // 20 | for(i=0; i<256; i++, pal++){ 21 | ty = (double)(pal->peRed)*0.299 22 | + (double)(pal->peGreen)*0.587 23 | + (double)(pal->peBlue)*0.144; 24 | 25 | r = ty + tv * 1.4026; 26 | g = ty - tu * 0.3444 + tv * 0.7114; 27 | b = ty + tu * 1.733; 28 | 29 | if(r < 0) r = 0; 30 | else if(r > 255) r = 255; 31 | 32 | if(g < 0) g = 0; 33 | else if(g > 255) g = 255; 34 | 35 | if(b < 0) b = 0; 36 | else if(b > 255) b = 255; 37 | 38 | pal->peRed = r; 39 | pal->peGreen = g; 40 | pal->peBlue = b; 41 | } 42 | } 43 | 44 | 45 | // パレットをαで合成する(p1 = p1*a/255 + p2*(255-a)/255 // 46 | void BlendPalette(PALETTEENTRY *p1, PALETTEENTRY *p2, BYTE a) 47 | { 48 | int i; 49 | DWORD temp; 50 | 51 | // 時間がないから、今回はこれで我慢 // 52 | for(i=0; i<256; i++, p1++, p2++){ 53 | temp = (((DWORD)p1->peRed) * a + ((DWORD)p2->peRed) * (255-a)) / 255; 54 | p1->peRed = (temp > 255) ? 255 : temp; 55 | 56 | temp = (((DWORD)p1->peGreen) * a + ((DWORD)p2->peGreen) * (255-a)) / 255; 57 | p1->peGreen = (temp > 255) ? 255 : temp; 58 | 59 | temp = (((DWORD)p1->peBlue) * a + ((DWORD)p2->peBlue) * (255-a)) / 255; 60 | p1->peBlue = (temp > 255) ? 255 : temp; 61 | } 62 | } 63 | -------------------------------------------------------------------------------- /GIAN07/PaletteEx.h: -------------------------------------------------------------------------------- 1 | /* 2 | * PaletteEx.h : 特殊パレット処理 3 | * 4 | */ 5 | 6 | #ifndef PBG_PALETTEEX_VERSION 7 | #define PBG_PALETTEEX_VERSION "特殊パレット処理 : Version 0.01 : Update 2000/11/23" 8 | 9 | /* [更新履歴] 10 | * Version 0.01 : 2000/11/23 : 11 | */ 12 | 13 | 14 | 15 | #ifndef WIN32_LEAN_AND_MEAN 16 | #define WIN32_LEAN_AND_MEAN 17 | #include 18 | #endif 19 | 20 | 21 | 22 | /***** [関数プロトタイプ] *****/ 23 | 24 | // パレットをuv固定で変換 // 25 | void ConvertPalette(PALETTEENTRY *pal, BYTE u, BYTE v); 26 | 27 | // パレットをαで合成する(p1 = p1*a/255 + p2*(255-a)/255 // 28 | void BlendPalette(PALETTEENTRY *p1, PALETTEENTRY *p2, BYTE a); 29 | 30 | 31 | 32 | #endif 33 | -------------------------------------------------------------------------------- /GIAN07/SCL.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* SCL.h SCL用定義ファイル */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_SCL_H 7 | #define PBGWIN_SCL_H "SCL : Ver 0.11 : Update 2000/02/28" 8 | //#pragma message(PBGWIN_SCL_H) 9 | 10 | 11 | 12 | ///// [更新履歴] ///// 13 | 14 | // 2000/03/14 : WAITEX,STAGECLEAR 命令を追加 15 | // 2000/02/28 : BOSS命令を変更 16 | // 2000/02/24 : ミディ関連の関数を追加 17 | // 2000/02/18 : システムのアップデート開始 18 | 19 | 20 | ///// 特殊な命令の仕様について ///// 21 | 22 | // WAITEX <待ち条件(BYTE)>,<オプション(DWORD)> 23 | // 待ち条件の BOSSHP は、主に背景エフェクトチェンジ等に用いること(状態推移には使用しない) 24 | 25 | 26 | ///// [ 定数 ] ///// 27 | 28 | // SCL 命令 // 29 | #define SCL_TIME 0x00 // 次のイベントの発動時間 30 | #define SCL_ENEMY 0x01 // 敵イベント 31 | #define SCL_SSP 0x02 // スクロールスピードチェンジ 32 | #define SCL_EFC 0x03 // エフェクトセット 33 | #define SCL_END 0x04 // SCL終了 34 | #define SCL_BOSS 0x05 // ボス発生(引数は X(16),Y(16),BossID(8)) 35 | 36 | 37 | // SCL レベル2命令 // 38 | #define SCL_MWOPEN 0x06 // メッセージウィンドウを開く 39 | #define SCL_MWCLOSE 0x07 // メッセージウィンドウを閉じる 40 | #define SCL_MSG 0x08 // メッセージを出力する 41 | #define SCL_KEY 0x09 // キー入力待ち 42 | #define SCL_NPG 0x0a // 新しいページに変更する 43 | #define SCL_FACE 0x0b // 顔を表示する 44 | #define SCL_MUSIC 0x0c // 曲データをロードする 45 | #define SCL_BOSSDEAD 0x0d // ボス強制破壊(すなわち時間切れ) 46 | #define SCL_LOADFACE 0x0e // 顔グラをロードする(引数は、SurfaceID(BYTE),FileNo(BYTE)) 47 | #define SCL_WAITEX 0x0f // ある条件が起こるまでSCLをストップする 48 | #define SCL_STAGECLEAR 0x10 // そのステージが終了することを意味する。次のステージへGO! 49 | #define SCL_MAPPALETTE 0x11 // パレットをマップパーツ用のもので初期化する(For 8BitMode) 50 | #define SCL_GAMECLEAR 0x12 // タイトルに戻る(ネームレジスト有) 51 | #define SCL_DELENEMY 0x13 // 敵を強制消去(インデックス配列そのものを)する 52 | #define SCL_ENEMYPALETTE 0x14 // 敵のパレットにする 53 | #define SCL_STAFF 0x15 // スタッフIDセット 54 | #define SCL_EXTRACLEAR 0x16 // エキストラステージクリア 55 | 56 | 57 | // EFC 命令の引数 // 58 | #define SEFC_WARN 0x00 // ワーニング音・開始 59 | #define SEFC_WARNSTOP 0x01 // ワーニング音・停止 60 | #define SEFC_MUSICFADE 0x02 // 曲フェードアウト実行(Level2) 61 | #define SEFC_STG2BOSS 0x03 // ステージ2ボスのスクロール発動!! 62 | #define SEFC_RASTERON 0x04 // ラスタースクロール開始(砂漠とか海底都市とかに使えるかも) 63 | #define SEFC_RASTEROFF 0x05 // ラスタースクロール終了 64 | #define SEFC_CFADEIN 0x06 // 円形フェードイン 65 | #define SEFC_CFADEOUT 0x07 // 円形フェードアウト 66 | #define SEFC_STG3BOSS 0x08 // 3面ボス雲 67 | #define SEFC_STG3RESET 0x09 // 3面ボス雲リセット 68 | #define SEFC_STG6CUBE 0x0a // 6面ボス3Dキューヴ 69 | #define SEFC_STG6RNDECL 0x0b // 6面ボス偽ECL羅列 70 | #define SEFC_STG4ROCK 0x0c // 4面岩 71 | #define SEFC_STG4LEAVE 0x0d // 4面岩を画面外に吐き出す 72 | #define SEFC_WHITEIN 0x0e // ホワイトイン 73 | #define SEFC_WHITEOUT 0x0f // ホワイトアウト 74 | #define SEFC_LOADEX01 0x10 // エキストラボス1用画像をロード 75 | #define SEFC_LOADEX02 0x11 // エキストラボス2用画像をロード 76 | #define SEFC_STG6RASTER 0x12 // 6面ラスター 77 | 78 | 79 | // WAITEX 命令の引数(Level2) // 80 | #define SWAIT_BOSSLEFT 0x00 // ボスの残り数(OPT:ボスの数) 81 | #define SWAIT_BOSSHP 0x01 // ボスのHP総和が指定値より小さい(OPT:残りHP) 82 | 83 | 84 | 85 | #endif 86 | -------------------------------------------------------------------------------- /GIAN07/SCORE.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* Score.h スコア入出力関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_SCORE_H 7 | #define PBGWIN_SCORE_H "SCORE : Version 0.01 : Update 2000/07/29" 8 | //#pragma message(PBGWIN_SCORE_H) 9 | 10 | #include "Gian.h" 11 | 12 | 13 | 14 | ///// [ 定数 ] ///// 15 | #define NR_NAME_LEN 9 // ネームレジストの名前の長さ('\0' 含む) 16 | #define NR_RANK_MAX 5 // 順位付け(Save)される最大数 17 | 18 | 19 | 20 | ///// [構造体] ///// 21 | 22 | typedef struct tagNR_NAME_DATA{ 23 | char Name[NR_NAME_LEN]; // 名前 24 | __int64 Score; // スコア 25 | DWORD Evade; // かすり回数 26 | BYTE Stage; // ステージ 27 | BYTE Weapon; // 装備品 28 | } NR_NAME_DATA; 29 | 30 | typedef struct tagNR_SCORE_DATA{ 31 | NR_NAME_DATA Easy[NR_RANK_MAX]; // 難易度:Easy 32 | NR_NAME_DATA Normal[NR_RANK_MAX]; // 難易度:Normal 33 | NR_NAME_DATA Hard[NR_RANK_MAX]; // 難易度:Hard 34 | NR_NAME_DATA Lunatic[NR_RANK_MAX]; // 難易度:Lunatic 35 | NR_NAME_DATA Extra[NR_RANK_MAX]; // 難易度:Extra 36 | } NR_SCORE_DATA; 37 | 38 | typedef struct tagNR_SCORE_STRING{ 39 | BYTE Rank; // 実際の順位(ある順位が複数ある場合の対策) 40 | int x,y; // 描画用座標 41 | BOOL bMoveEnable; // 移動可能か? 42 | 43 | char Name[NR_NAME_LEN]; // 名前 44 | char Score[11+1]; // 得点 45 | char Evade[6+1]; // かすり 46 | char Stage[1+1]; // ステージ 47 | BYTE Weapon; // 装備 48 | } NR_SCORE_STRING; 49 | 50 | 51 | 52 | ///// [ 関数 ] ///// 53 | int SetScoreString(NR_NAME_DATA *NData, BYTE Dif); // 現在のスコア列を取得する(Ret:下と同じ) 54 | int IsHighScore(NR_NAME_DATA *NData, BYTE Dif); // 0:ハイスコアでない それ以外:順位 55 | BOOL SaveScoreData(NR_NAME_DATA *NData, BYTE Dif); // スコアデータを書き出す 56 | 57 | 58 | 59 | ///// [グローバル変数] ///// 60 | extern NR_SCORE_STRING ScoreString[NR_RANK_MAX]; // スコアデータ文字列格納先 61 | 62 | 63 | #endif 64 | -------------------------------------------------------------------------------- /GIAN07/SCROLL.H: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* SCROLL.h スクロール処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_SCROLL_H 7 | #define PBGWIN_SCROLL_H "SCROLL : Version 0.11 : Update 2000/02/28" 8 | //#pragma message(PBGWIN_SCROLL_H) 9 | 10 | #include "Gian.h" 11 | 12 | 13 | ///// [更新履歴] ///// 14 | // 2000/04/01 : スクロールコマンドを追加(STAGE2_BOSS) 15 | // 2000/02/28 : BOSS命令を Level2 に変更 16 | // 2000/02/24 : みぢ命令を追加 17 | // 2000/02/18 : 敵配置処理と結合する 18 | // 2000/02/01 : 開発開始 19 | // 20 | 21 | 22 | 23 | ///// [ 定数 ] ///// 24 | 25 | // マップエディタと共有する定数 // 26 | #define LAYER_MAX 5 // レイヤーの深さ 27 | #define TIME_PER_FRAME 20 // 1フレームでどれだけ時間が進むか 28 | #define MAP_WIDTH 24 // マップの横幅 29 | #define MAPDATA_NONE 0xffff // マップ上に何も置かれていない状態 30 | 31 | // スクロールステータス // 32 | #define SST_NORMAL 0x00 // 通常時 33 | #define SST_STOP 0x01 // 停止中 34 | 35 | // スクロールコマンド // 36 | #define SCMD_QUAKE 0x01 // 画面を振動させる 37 | #define SCMD_STG2BOSS 0x02 // 2面ボスの反転スクロール 38 | #define SCMD_RASTER_ON 0x03 // ラスタースクロール開始 39 | #define SCMD_RASTER_OFF 0x04 // ラスタースクロー終了 40 | #define SCMD_STG3BOSS 0x05 // 背景雲をゲイツモード(謎)に変更する 41 | #define SCMD_STG3RESET 0x06 // 3面の背景をノーマルモードに戻す 42 | #define SCMD_STG6CUBE 0x07 // 6面ボスの3Dキューブモード 43 | #define SCMD_STG6RNDECL 0x08 // 6面ボスのランダム偽ECL列配置 44 | #define SCMD_STG4ROCK 0x09 // 4面岩 45 | #define SCMD_STG4LEAVE 0x0a // 4面岩を画面外に吐き出す 46 | #define SCMD_STG6RASTER 0x0b // 6面ラスター 47 | #define SCMD_STG3STAR 0x0c // 3面高速星 48 | 49 | 50 | 51 | ///// [ 型 ] ///// 52 | typedef WORD PBGMAP; // マップパーツ格納用の型 53 | 54 | 55 | 56 | ///// [マクロ] ///// 57 | 58 | 59 | 60 | ///// [構造体] ///// 61 | 62 | // スクロール管理用構造体 // 63 | typedef struct tagScrollInfo{ 64 | // GRP lpMapOffs; // マップパーツデータ(Graphic)の格納先 65 | 66 | BYTE *DataHead; // マップデータのヘッダ 67 | 68 | PBGMAP *LayerHead[LAYER_MAX]; // 各レイヤーのヘッダ 69 | PBGMAP *LayerPtr[LAYER_MAX]; // 現在のレイヤーのポインタ 70 | DWORD LayerWait[LAYER_MAX]; // レイヤーの重み 71 | int LayerCount[LAYER_MAX]; // レイヤーごとのカウンタ 72 | BYTE LayerDy[LAYER_MAX]; // レイヤーの1Dot単位のズレ 73 | 74 | int NumLayer; // レイヤー数 75 | int ScrollSpeed; // スクロール速度 76 | DWORD Count; // 現在の時刻 77 | DWORD InfStart; // 無限ループの開始時刻(デフォルトは0) 78 | DWORD InfEnd; // 無限ループの終了時刻(デフォルトはマップの長さの最小値) 79 | 80 | BYTE State; // スクロールステータス 81 | BYTE IsQuake; // 振動中か? 82 | 83 | char RasterDx[31]; // ラスタースクロールによるX加算値 84 | BYTE RasterWidth; // ラスタースクロールにおける振幅 85 | BYTE RasterDeg; // ラスタースクロール用の角度 86 | 87 | FVOIDFN(*ExCmd)(void); // 特殊コマンド 88 | DWORD ExCount; // 特殊コマンド用カウンタ 89 | } SCROLL_INFO; 90 | 91 | // マップデータ保存用ヘッダ // 92 | typedef struct tagScrollSaveHeader{ 93 | DWORD Address; // このデータの開始アドレス 94 | DWORD ScrollWait; // このレイヤーのディレイ 95 | DWORD Length; // このレイヤーの長さ 96 | } ScrollSaveHeader; 97 | 98 | // SCL管理用構造体 // 99 | typedef struct tagSCL_INFO{ 100 | BOOL MsgFlag; // メッセージスキップ用フラグ 101 | BOOL ReturnFlag; // リターンキー用フラグ 102 | } SCL_INFO; 103 | 104 | 105 | ///// [ 関数 ] ///// 106 | FVOID ScrollMove(void); // 背景を動かす(1フレーム分) 107 | FVOID ScrollDraw(void); // 背景を描画する 108 | 109 | FVOID ScrollSpeed(int speed); // スクロールスピードを変更する(引数:(1)スクロール速度) 110 | FVOID ScrollCommand(BYTE cmd); // SCL用コマンド実行関数(引数:(1)スクロールコマンド) 111 | 112 | FBOOL ScrollInit(void); // マップデータを初期化する 113 | 114 | 115 | 116 | ///// [ 変数 ] ///// 117 | extern SCROLL_INFO ScrollInfo; // スクロールに関する情報 118 | extern SCL_INFO SclInfo; // SCLに関する情報 119 | 120 | 121 | 122 | #endif 123 | -------------------------------------------------------------------------------- /GIAN07/WindowCtrl.h: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* WINDOWCTRL.h ウィンドウの定義&管理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_WINDOWCTRL_H 7 | #define PBGWIN_WINDOWCTRL_H "WINDOWCTRL : Version 0.01 : Update 2000/02/12" 8 | //#pragma message(PBGWIN_WINDOWCTRL_H) 9 | 10 | 11 | 12 | ///// [更新履歴] ///// 13 | 14 | // 15 | 16 | 17 | 18 | ///// [Include Files] ///// 19 | #include "Gian.h" 20 | 21 | 22 | 23 | ///// [ 定数 ] ///// 24 | ///// [マクロ] ///// 25 | ///// [構造体] ///// 26 | 27 | ///// [グローバル変数] ///// 28 | extern struct tagWINDOW_SYSTEM MainWindow; 29 | extern struct tagWINDOW_SYSTEM ExitWindow; 30 | extern struct tagWINDOW_SYSTEM ContinueWindow; 31 | 32 | 33 | ///// [関数] ///// 34 | void InitMainWindow(void); // メインメニューの初期化 35 | void InitExitWindow(void); // 終了Y/Nウィンドウの初期化 36 | void InitContinueWindow(void); // コンティニューY/Nウィンドウの初期化 37 | 38 | 39 | 40 | #endif 41 | -------------------------------------------------------------------------------- /GIAN07/WindowSys.h: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* WINDOWSYS.h コマンドウィンドウ処理 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_WINDOWSYS_H 7 | #define PBGWIN_WINDOWSYS_H "WINDOWSYS : Version 0.24 : Update 2000/02/28" 8 | 9 | #include "GIAN.h" 10 | 11 | 12 | 13 | ///// [更新履歴] ///// 14 | /* 15 | * 2000/07/26 : 操作性を改善した 16 | * 17 | * 2000/02/28 : メッセージウィンドウの半透明部を高速化 18 | * 2000/02/10 : PWINDOW->WINDOWSYS 19 | * : WINDOWSYS において、コマンドウィンドウは、スタックで選択状態を保持する。 20 | * : ウィンドウを動かしたり枠を付けたりするのはあとでね... 21 | * 22 | * 2000/01/31 : 開発はじめ 23 | * 24 | */ 25 | 26 | 27 | 28 | // 最大数に関する定数 // 29 | #define WINITEM_MAX 20 // 項目の最大数 30 | #define WINDOW_DEPTH 10 // ウィンドウの深さ 31 | #define MESSAGE_MAX 100 // 一行に表示できる最大メッセージ長 32 | #define MSG_HEIGHT 5 // メッセージウィンドウの高さ 33 | 34 | // コマンドウィンドウの状態 // 35 | #define CWIN_DEAD 0x00 // 使用されていない 36 | #define CWIN_FREE 0x01 // 入力待ち状態 37 | #define CWIN_OPEN 0x02 // 項目移動中(進む) 38 | #define CWIN_CLOSE 0x03 // 項目移動中(戻る) 39 | #define CWIN_NEXT 0x04 // 次のウィンドウに移行中 40 | #define CWIN_BEFORE 0x05 // 前のウィンドウに移行中 41 | #define CWIN_INIT 0xff // 初期化処理中 42 | 43 | // メッセージウィンドウ・コマンド // 44 | #define MWCMD_SMALLFONT 0x00 // スモールフォントを使用する 45 | #define MWCMD_NORMALFONT 0x01 // ノーマルフォントを使用する 46 | #define MWCMD_LARGEFONT 0x02 // ラージフォントを使用する 47 | #define MWCMD_NEWPAGE 0x03 // 改ページする 48 | 49 | // メッセージウィンドウの状態 // 50 | #define MWIN_DEAD 0x00 // 使用されていない 51 | #define MWIN_OPEN 0x01 // オープン中 52 | #define MWIN_CLOSE 0x02 // クローズ中 53 | #define MWIN_FREE 0x03 // 待ち状態 54 | 55 | // メッセージウィンドウ(顔の状態) // 56 | #define MFACE_NONE 0x00 // 表示されていない 57 | #define MFACE_OPEN 0x01 // オープン中 58 | #define MFACE_CLOSE 0x02 // クローズ中 59 | #define MFACE_NEXT 0x03 // 次の顔へ 60 | #define MFACE_WAIT 0x04 // 待ち状態 61 | 62 | // その他の定数 // 63 | #define CWIN_KEYWAIT 8 64 | 65 | 66 | 67 | ///// [構造体] ///// 68 | 69 | // 子ウィンドウの情報 // 70 | typedef struct tagWINDOW_INFO{ 71 | char *Title; // タイトル文字列へのポインタ(実体ではない!) 72 | char *Help; // ヘルプ文字列へのポインタ(これも実体ではない) 73 | 74 | BOOL (*CallBackFn)(WORD); // 特殊処理用コールバック関数(未使用ならNULL) 75 | BYTE NumItems; // 項目数( 3 | 4 | extern const char *APP_CLASS = "GIAN07"; 5 | extern const char *APP_NAME = "秋霜玉"; 6 | 7 | 8 | // プロトタイプ宣言 // 9 | void XMain(void); 10 | BOOL XInit(void); 11 | void XCleanup(void); 12 | 13 | long FAR PASCAL WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); 14 | static BOOL AppInit(HINSTANCE hInstance,int nCmdShow); 15 | static void AppCleanup(void); 16 | 17 | //void SaveSnapshot(HWND hWnd); 18 | 19 | 20 | // グローバル変数 // 21 | HWND hWndMain; 22 | BOOL bIsActive; 23 | BOOL bMouseVisible; 24 | DWORD WaitTime; 25 | 26 | 27 | int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 28 | { 29 | MSG msg; 30 | HWND old_gian; 31 | DWORD tempdw; 32 | 33 | // 他のところで起動していたらそいつをRestoreする // 34 | if(old_gian=FindWindow(APP_CLASS,NULL)){ 35 | SetForegroundWindow(old_gian); 36 | SendMessage(old_gian,WM_SYSCOMMAND,SC_RESTORE,0); 37 | return FALSE; 38 | } 39 | 40 | // 引数があった場合、カレントディレクトリが変わってしまうので... // 41 | if(*lpCmdLine){ 42 | char temp[1000],*p; 43 | strcpy(temp,GetCommandLine()+1); 44 | if((p=strchr(temp,'\"')) && (strchr(temp,'\\'))){ 45 | while(*p!='\\') p--; 46 | *(p+1)='\0'; 47 | _chdir(temp); 48 | } 49 | else return FALSE; 50 | } 51 | 52 | if(!AppInit(hInstance,nShowCmd)){ 53 | return FALSE; 54 | } 55 | 56 | while(1){ 57 | if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){ 58 | if(!GetMessage(&msg,NULL,0,0)){ 59 | return msg.wParam; 60 | } 61 | TranslateMessage(&msg); 62 | DispatchMessage(&msg); 63 | } 64 | else if(bIsActive){ 65 | // 1フレーム進める // 66 | tempdw = timeGetTime(); 67 | if(tempdw-WaitTime>=16 || ConfigDat.DrawMode==0){ 68 | GameMain(); 69 | WaitTime = tempdw; 70 | } 71 | //else Sleep(1); 72 | } 73 | else{ 74 | WaitMessage(); 75 | } 76 | } 77 | } 78 | 79 | 80 | long FAR PASCAL WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) 81 | { 82 | PAINTSTRUCT ps; 83 | HDC hdc; 84 | static BOOL ExitFlag = FALSE; 85 | 86 | switch(message){ 87 | case WM_ACTIVATEAPP: 88 | bIsActive = (BOOL)wParam; 89 | if(bIsActive){ 90 | bMouseVisible = FALSE; 91 | Mid_Play(); 92 | } 93 | else{ 94 | bMouseVisible = TRUE; 95 | Mid_Stop(); 96 | } 97 | break; 98 | 99 | case WM_SETCURSOR: 100 | if(bMouseVisible) SetCursor(LoadCursor(NULL,IDC_ARROW)); 101 | else SetCursor(NULL),ShowCursor(TRUE); 102 | return 1; 103 | 104 | case WM_ERASEBKGND: 105 | return 1; 106 | 107 | case WM_PAINT: 108 | hdc = BeginPaint(hWnd,&ps); 109 | EndPaint(hWnd,&ps); 110 | return 1; 111 | 112 | // IME 関連のメッセージは無視 // 113 | case WM_IME_CHAR: case WM_IME_COMPOSITION: case WM_IME_COMPOSITIONFULL: 114 | case WM_IME_CONTROL: case WM_IME_ENDCOMPOSITION: case WM_IME_KEYDOWN: 115 | case WM_IME_KEYUP: case WM_IME_NOTIFY: case WM_IME_SELECT: 116 | case WM_IME_SETCONTEXT: case WM_IME_STARTCOMPOSITION: 117 | 118 | #if(WINVER >= 0x0500) 119 | case WM_IME_REQUEST: 120 | #endif 121 | 122 | return 1; 123 | 124 | case WM_DESTROY: 125 | PostQuitMessage(0); 126 | break; 127 | 128 | case WM_SYSCOMMAND: 129 | if(wParam == SC_CLOSE){ 130 | ExitFlag = TRUE; 131 | AppCleanup(); 132 | MoveWindow(hWndMain,0,0,0,0,TRUE); 133 | ShowWindow(hWndMain,SW_HIDE); 134 | DestroyWindow(hWndMain); 135 | break; 136 | } 137 | if(wParam == SC_RESTORE) break; 138 | return 1; 139 | 140 | case WM_SYSKEYDOWN: 141 | if(ExitFlag) return 0; 142 | break; 143 | 144 | case WM_KEYDOWN: 145 | /* switch(wParam){ 146 | case(VK_ESCAPE): 147 | DestroyWindow(hWnd); 148 | break; 149 | }*/ 150 | return 0; 151 | 152 | default: 153 | break; 154 | } 155 | 156 | return DefWindowProc(hWnd,message,wParam,lParam); 157 | } 158 | 159 | static BOOL AppInit(HINSTANCE hInstance,int nCmdShow) 160 | { 161 | WNDCLASS wc; 162 | HMENU hMenu; 163 | 164 | wc.style = CS_DBLCLKS; // 165 | wc.lpfnWndProc = WndProc; // 166 | wc.cbClsExtra = 0; // 167 | wc.cbWndExtra = 0; // 168 | wc.hInstance = hInstance; // 169 | wc.hIcon = (HICON)LoadIcon(hInstance,"NEO_TAMA_ICON"); // 170 | wc.hCursor = 0; // 後で変更 171 | wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // 172 | wc.lpszMenuName = 0; // 後で変更 173 | wc.lpszClassName = APP_CLASS; // 174 | 175 | if(!RegisterClass(&wc)){ 176 | return FALSE; 177 | } 178 | 179 | hWndMain = CreateWindowEx( 180 | 0, // 181 | APP_CLASS, // 182 | APP_NAME, // 183 | (WS_VISIBLE|WS_SYSMENU|WS_EX_TOPMOST|WS_POPUP), // 184 | 0, // 185 | 0, // 186 | GetSystemMetrics(SM_CXSCREEN), // 187 | GetSystemMetrics(SM_CYSCREEN), // 188 | NULL, // 189 | NULL, // 190 | hInstance, // 191 | NULL); // 192 | 193 | if(!hWndMain) return FALSE; 194 | 195 | //ShowWindow(hWndMain,nCmdShow); 196 | //UpdateWindow(hWndMain); 197 | ShowCursor(FALSE); 198 | 199 | hMenu = GetSystemMenu(hWndMain,FALSE); 200 | DeleteMenu(hMenu,SC_MAXIMIZE,MF_BYCOMMAND); 201 | DeleteMenu(hMenu,SC_MINIMIZE,MF_BYCOMMAND); 202 | DeleteMenu(hMenu,SC_MOVE ,MF_BYCOMMAND); 203 | DeleteMenu(hMenu,SC_SIZE ,MF_BYCOMMAND); 204 | 205 | 206 | DebugSetup("ErrLOG2.txt"); 207 | ErrSetup(); 208 | 209 | // キーボード(JoyPad)入力を受け付ける // 210 | Key_Start(hInstance,hWndMain); 211 | 212 | try{ 213 | if(!GrpEnum(hWndMain)) throw(FALSE); 214 | if(!XInit()) throw(FALSE); // コンフィグ依存の初期化処理 215 | } 216 | catch(BOOL flag){ 217 | DestroyWindow(hWndMain); 218 | return flag; 219 | } 220 | 221 | return TRUE; 222 | } 223 | 224 | static void AppCleanup(void) 225 | { 226 | XCleanup(); 227 | 228 | GrpCleanup(); 229 | SndCleanup(); 230 | Mid_Stop(); 231 | Mid_End(); 232 | Key_End(); 233 | 234 | ShowCursor(TRUE); 235 | ErrCleanup(); 236 | } 237 | 238 | BOOL XInit(void) 239 | { 240 | XDDRAWENUM *pXDD; 241 | 242 | // コンフィグをロードする // 243 | ConfigLoad(); 244 | 245 | Key_PadConfig2(ConfigDat.PadTama, KEY_TAMA); 246 | Key_PadConfig2(ConfigDat.PadBomb, KEY_BOMB); 247 | Key_PadConfig2(ConfigDat.PadShift, KEY_SHIFT); 248 | Key_PadConfig2(ConfigDat.PadCancel, KEY_ESC); 249 | 250 | // グラフィックの初期化 // 251 | pXDD = &DxEnum[ConfigDat.DeviceID]; 252 | if(!GrpInit(pXDD->lpDDGuid,pXDD->D3D,ConfigDat.BitDepth)) return FALSE; 253 | InitSurface(); 254 | InitFonts(); 255 | GrpSetRestoreHook(SEffectRestore); 256 | 257 | // サウンドの初期化 // 258 | if(ConfigDat.SoundFlags&SNDF_WAVE_ENABLE){ 259 | // 何らかの理由で使用できなければ、Disable とする // 260 | if(!SndInit(hWndMain)) ConfigDat.SoundFlags &= (~SNDF_WAVE_ENABLE); 261 | else if(!LoadSound()){ 262 | ConfigDat.SoundFlags &= (~SNDF_WAVE_ENABLE); 263 | SndCleanup(); 264 | } 265 | } 266 | 267 | // MIDIの初期化 // 268 | // MIDFN_MIDLOOP を使用すべきか // 269 | if(ConfigDat.SoundFlags&SNDF_MIDI_ENABLE){ 270 | if(!Mid_Start(MIDFN_CALLBACK,MIDPL_NORM)) 271 | ConfigDat.SoundFlags &= (~SNDF_MIDI_ENABLE); 272 | } 273 | 274 | if(!GameInit()) return FALSE; // 各種初期化 275 | //if(!GameExit()) return FALSE; // タイトルへ 276 | //if(!EndingInit()) return FALSE; 277 | if(!SProjectInit()) return FALSE; 278 | 279 | GrpSetCaptureFilename("秋霜"); 280 | 281 | return TRUE; 282 | } 283 | 284 | void XCleanup(void) 285 | { 286 | CleanupFont(); 287 | CleanupLens(); 288 | ConfigSave(); 289 | } 290 | -------------------------------------------------------------------------------- /MapEdit2/GrpUty.cpp: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* GrpUty.cpp グラフィック補助関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "MapEdit.h" 7 | #include "GrpUty.h" 8 | #include "DD_GRP3D.h" 9 | 10 | 11 | void GrpPuts(char *s,int x,int y) 12 | { 13 | RECT src; 14 | int sx; 15 | 16 | sx = x; 17 | 18 | for(;(*s)!='\0';s++,x+=9){ 19 | if((*s)>='a' && (*s)<='z'){ 20 | src.top = 40; 21 | src.bottom = src.top + 16; 22 | src.left = 256 + ((*s)-'a')*9; 23 | src.right = src.left + 9; 24 | } 25 | else if((*s)>='A' && (*s)<='Z'){ 26 | src.top = 40 + 16; 27 | src.bottom = src.top + 16; 28 | src.left = 256 + ((*s)-'A')*9; 29 | src.right = src.left + 9; 30 | } 31 | else if((*s)>='0' && (*s)<='9'){ 32 | src.top = 40 + 32; 33 | src.bottom = src.top + 16; 34 | src.left = 256 + ((*s)-'0')*9; 35 | src.right = src.left + 9; 36 | } 37 | else{ 38 | switch(*s){ 39 | case('+'): src.left = 256; break; 40 | case('-'): src.left = 256 + 9; break; 41 | case('*'): src.left = 256 + 18; break; 42 | case('/'): src.left = 256 + 27; break; 43 | case('('): src.left = 256 + 36; break; 44 | case(')'): src.left = 256 + 45; break; 45 | case(','): src.left = 256 + 54; break; 46 | case('.'): src.left = 256 + 63; break; 47 | case('!'): src.left = 256 + 72; break; 48 | case('?'): src.left = 256 + 81; break; 49 | case('\"'): src.left = 256 + 90; break; 50 | case('#'): src.left = 256 + 99; break; 51 | case('$'): src.left = 256 + 108; break; 52 | case('%'): src.left = 256 + 117; break; 53 | case('&'): src.left = 256 + 126; break; 54 | case('\''): src.left = 256 + 135; break; 55 | case('\\'): src.left = 256 + 144; break; 56 | 57 | case('='): src.left = 256 + 153; break; 58 | case(':'): src.left = 256 + 162; break; 59 | case(';'): src.left = 256 + 171; break; 60 | case('<'): src.left = 256 + 180; break; 61 | case('>'): src.left = 256 + 189; break; 62 | case('_'): src.left = 256 + 198; break; 63 | 64 | case('\n'): // 改行(x=sx-9,y=y+16とか) 65 | x = sx-9; 66 | y = y+16; 67 | default: 68 | continue; 69 | } 70 | src.top = 40 + 48; 71 | src.bottom = src.top + 16; 72 | src.right = src.left + 9; 73 | } 74 | 75 | GrpBltX(&src,x,y,GrTama); 76 | } 77 | } 78 | 79 | void GrpPut8(char *s,int x,int y) 80 | { 81 | RECT src; 82 | int sx,tx,ty; 83 | 84 | sx = x; 85 | 86 | for(;(*s)!='\0';s++,x+=8){ 87 | if((*s)>='A' && (*s)<='Z'){ 88 | BltSetRect(&src,256+(((*s)-'A')<<3),32,8,8); 89 | } 90 | else if((*s)>='a' && (*s)<='z'){ 91 | BltSetRect(&src,256+(((*s)-'a')<<3),32,8,8); 92 | } 93 | else if((*s)>='0' && (*s)<='9'){ 94 | BltSetRect(&src,640-17*8+20+(((*s)-'0')<<3),72+16+16,8,8); 95 | } 96 | else{ 97 | continue; 98 | } 99 | 100 | tx = x;ty = y; 101 | GrpBlt(&src,tx,ty,GrTama); 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /MapEdit2/GrpUty.h: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* GRPUTY.h グラフィック補助関数 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_GRPUTY_H 7 | #define PBGWIN_GRPUTY_H "GRPUTY : Version 0.01 : Update 1999/12/05" 8 | #pragma message(PBGWIN_GRPUTY_H) 9 | 10 | 11 | // 更新履歴 // 12 | 13 | 14 | // ヘッダファイル // 15 | #include "PBGUTY_X.h" 16 | 17 | 18 | // 関数 // 19 | void GrpPuts(char *s,int x,int y); 20 | void GrpPut8(char *s,int x,int y); 21 | 22 | /* 23 | _inline void BltSetRect(RECT *rc,int x1,int y1,int x2,int y2) 24 | { 25 | rc->right = (rc->left = x1) + x2; 26 | rc->bottom = (rc->top = y1) + y2; 27 | } 28 | */ 29 | 30 | #endif 31 | -------------------------------------------------------------------------------- /MapEdit2/Main.cpp: -------------------------------------------------------------------------------- 1 | #include "MapEdit.h" 2 | #include 3 | 4 | #define APP_CLASS "MAP_EDITOR" 5 | #define APP_NAME "MapEditor2" 6 | 7 | 8 | // プロトタイプ宣言 // 9 | long FAR PASCAL WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); 10 | static BOOL AppInit(HINSTANCE hInstance,int nCmdShow); 11 | static void AppCleanup(void); 12 | 13 | 14 | // グローバル変数 // 15 | HWND hWndMain; 16 | BOOL bIsActive; 17 | BOOL bMouseVisible; 18 | 19 | 20 | int PASCAL WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd) 21 | { 22 | MSG msg; 23 | HWND old_gian; 24 | 25 | 26 | if(old_gian=FindWindow(APP_CLASS,NULL)){ 27 | SetForegroundWindow(old_gian); 28 | SendMessage(old_gian,WM_SYSCOMMAND,SC_RESTORE,0); 29 | return FALSE; 30 | } 31 | 32 | if(*lpCmdLine){ 33 | char temp[1000],*p; 34 | strcpy(temp,GetCommandLine()+1); 35 | if((p=strchr(temp,'\"')) && (strchr(temp,'\\'))){ 36 | while(*p!='\\') p--; 37 | *(p+1)='\0'; 38 | _chdir(temp); 39 | } 40 | else return FALSE; 41 | } 42 | 43 | if(!AppInit(hInstance,nShowCmd)){ 44 | return FALSE; 45 | } 46 | 47 | while(1){ 48 | if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE)){ 49 | if(!GetMessage(&msg,NULL,0,0)){ 50 | return msg.wParam; 51 | } 52 | TranslateMessage(&msg); 53 | DispatchMessage(&msg); 54 | } 55 | else if(bIsActive){ 56 | // 1フレーム進める // 57 | EditorMain(); 58 | } 59 | else{ 60 | WaitMessage(); 61 | } 62 | } 63 | } 64 | 65 | 66 | long FAR PASCAL WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) 67 | { 68 | PAINTSTRUCT ps; 69 | HDC hdc; 70 | 71 | switch(message){ 72 | case WM_ACTIVATEAPP: 73 | bIsActive = (BOOL)wParam; 74 | if(bIsActive) bMouseVisible = FALSE; 75 | else{ 76 | bMouseVisible = TRUE; 77 | } 78 | break; 79 | 80 | case WM_SETCURSOR: 81 | if(bMouseVisible) SetCursor(LoadCursor(NULL,IDC_ARROW)); 82 | else SetCursor(NULL),ShowCursor(TRUE); 83 | return 1; 84 | 85 | case WM_ERASEBKGND: 86 | return 1; 87 | 88 | case WM_PAINT: 89 | hdc = BeginPaint(hWnd,&ps); 90 | EndPaint(hWnd,&ps); 91 | return 1; 92 | 93 | case WM_IME_CHAR: case WM_IME_COMPOSITION: case WM_IME_COMPOSITIONFULL: 94 | case WM_IME_CONTROL: case WM_IME_ENDCOMPOSITION: case WM_IME_KEYDOWN: 95 | case WM_IME_KEYUP: case WM_IME_NOTIFY: case WM_IME_SELECT: 96 | case WM_IME_SETCONTEXT: case WM_IME_STARTCOMPOSITION: 97 | 98 | #if(WINVER >= 0x0500) 99 | case WM_IME_REQUEST: 100 | #endif 101 | 102 | return 1; 103 | 104 | case WM_DESTROY: 105 | AppCleanup(); 106 | break; 107 | 108 | case WM_SYSCOMMAND: 109 | if(wParam == SC_CLOSE) break; 110 | if(wParam == SC_RESTORE){ 111 | break; 112 | } 113 | return 1; 114 | 115 | case WM_KEYDOWN: 116 | if(wParam == VK_ESCAPE){ 117 | DestroyWindow(hWnd); 118 | } 119 | return 0; 120 | 121 | default: 122 | break; 123 | } 124 | 125 | return DefWindowProc(hWnd,message,wParam,lParam); 126 | } 127 | 128 | static BOOL AppInit(HINSTANCE hInstance,int nCmdShow) 129 | { 130 | WNDCLASS wc; 131 | HMENU hMenu; 132 | 133 | wc.style = CS_DBLCLKS; // 134 | wc.lpfnWndProc = WndProc; // 135 | wc.cbClsExtra = 0; // 136 | wc.cbWndExtra = 0; // 137 | wc.hInstance = hInstance; // 138 | wc.hIcon = (HICON)LoadIcon(hInstance,"ICON_MAPEDIT2"); // 139 | wc.hCursor = 0; // 後で変更 140 | wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH); // 141 | wc.lpszMenuName = 0; // 後で変更 142 | wc.lpszClassName = APP_CLASS; // 143 | 144 | if(!RegisterClass(&wc)){ 145 | return FALSE; 146 | } 147 | 148 | hWndMain = CreateWindowEx( 149 | 0, // 150 | APP_CLASS, // 151 | APP_NAME, // 152 | (WS_VISIBLE|WS_SYSMENU|WS_EX_TOPMOST|WS_POPUP), // 153 | 0, // 154 | 0, // 155 | GetSystemMetrics(SM_CXSCREEN), // 156 | GetSystemMetrics(SM_CYSCREEN), // 157 | NULL, // 158 | NULL, // 159 | hInstance, // 160 | NULL); // 161 | 162 | if(!hWndMain) return FALSE; 163 | 164 | //ShowWindow(hWndMain,nCmdShow); 165 | //UpdateWindow(hWndMain); 166 | ShowCursor(FALSE); 167 | 168 | hMenu = GetSystemMenu(hWndMain,FALSE); 169 | DeleteMenu(hMenu,SC_MAXIMIZE,MF_BYCOMMAND); 170 | DeleteMenu(hMenu,SC_MINIMIZE,MF_BYCOMMAND); 171 | DeleteMenu(hMenu,SC_MOVE ,MF_BYCOMMAND); 172 | DeleteMenu(hMenu,SC_SIZE ,MF_BYCOMMAND); 173 | 174 | 175 | ErrSetup(); 176 | 177 | try{ 178 | if(!GrpEnum(hWndMain)) throw(FALSE); 179 | 180 | if(!GrpInit(DxEnum->lpDDGuid,DxEnum->D3D,16)) 181 | if(!GrpInit(DxEnum->lpDDGuid,DxEnum->D3D,8)) throw(FALSE); 182 | 183 | if(!EditorInit()) throw(FALSE); 184 | } 185 | catch(BOOL flag){ 186 | DestroyWindow(hWndMain); 187 | return flag; 188 | } 189 | 190 | return TRUE; 191 | } 192 | 193 | static void AppCleanup(void) 194 | { 195 | SaveMapData("MAPEDIT2.DAT"); 196 | 197 | GrpCleanup(); 198 | 199 | ShowCursor(TRUE); 200 | ErrCleanup(); 201 | 202 | PostQuitMessage(0); 203 | } 204 | -------------------------------------------------------------------------------- /MapEdit2/MapEdit.h: -------------------------------------------------------------------------------- 1 | /* 2 | * MapEdit.h 簡易マップエディタ 3 | * 4 | */ 5 | 6 | #ifndef PBGWIN_MAPEDIT_H 7 | 8 | #define MAPEDIT2_VERSION "Ver 0.72" 9 | #define PBGWIN_MAPEDIT_H "MapEdit : "MAPEDIT2_VERSION" Update 2000/02/01" 10 | #pragma message(PBGWIN_MAPEDIT_H) 11 | 12 | #include "PBGUTY_X.h" 13 | #include "..\\Gian07SrcFiles\\SCROLL.h" 14 | 15 | 16 | // グラフィック関連定数 // 17 | #define ID_MAP_CHIP 0 18 | #define ID_TAMA 1 19 | 20 | 21 | // マップ管理用定数 // 22 | #define UNDO_MAX 10 // 最大Undo回数 23 | 24 | #define KEY_WAITTIME 10 // キーボード用ウェイト 25 | 26 | 27 | #define RESERVED_WIDTH 2 // 予約済みの幅 28 | #define RESERVED_HEIGHT 1 // 予約済みの高さ 29 | 30 | #define SCROLLWAIT_DEFAULT 1 // スクロールの重みの初期値 31 | 32 | #define MAP_HEIGHT (30-RESERVED_HEIGHT) // マップの表示する縦幅 33 | #define MAP_LEN 1000 // マップの縦幅 34 | #define MAP_SIZE (MAP_WIDTH*MAP_LEN) // マップに必要なメモリ 35 | 36 | #define CHIP_WIDTH (40-RESERVED_WIDTH-MAP_WIDTH) 37 | 38 | #define BMP_CHIP_WIDTH 640 // マップチップの幅 39 | #define BMP_CHIP_HEIGHT 480 // マップチップの高さ 40 | 41 | 42 | 43 | // マップデータ管理用構造体 // 44 | typedef struct tagMapData{ 45 | BOOL bMask; // マスクがかかっているか 46 | PBGMAP DataID; // マップパーツ番号 47 | } MapData; 48 | 49 | 50 | // マップ全体のMapData // 51 | typedef struct tagMapInfo{ 52 | MapData Data[LAYER_MAX][MAP_SIZE]; // 全レイヤーを含むマップデータ 53 | WORD ScrollWait[LAYER_MAX]; // 1Dotスクロールに要するカウント数 54 | } MapInfo; 55 | 56 | 57 | // Undo用の環状スタック // 58 | typedef struct tagUndoStack{ 59 | int StackPtr; // スタックポインタ 60 | int UndoLeft; // 残りUndo回数 61 | int RedoLeft; // 残りRedo回数 62 | MapInfo Data[UNDO_MAX]; // マップデータ1個分 63 | } UndoStack; 64 | 65 | 66 | // マップパーツコピー用構造体 // 67 | typedef struct tagCopyData{ 68 | PBGMAP *Data; // コピーするデータ列 69 | int Width; // 幅 70 | int Height; // 高さ 71 | } CopyData; 72 | 73 | 74 | // マップエディタの状態 // 75 | typedef enum tagMeState{ 76 | ME_NONE, // 何もしない 77 | ME_MASK_ON, // マスク(描き込み不可)領域選択中 78 | ME_MASK_OFF, // マスク(描き込み 可 )領域選択中 79 | ME_GETRECTM, // パーツ選択中(Mapパーツから) 80 | ME_GETRECTE, // パーツ選択中(作業領域から) 81 | ME_PUTRECT, // パーツ貼り付け中 82 | ME_VIEW, // ビューモード 83 | ME_HELP, // ヘルプ表示 84 | } MeState; 85 | 86 | 87 | // マップエディタ管理用構造体 // 88 | typedef struct tagMapEditor{ 89 | POINT MouseInfo; // マウスの状態(座標) 90 | POINT MouseTemp; // PUT用マウス座標保持 91 | BYTE KeyInfo[256]; // キーボードの状態 92 | 93 | BOOL MouseR; // マウスの右ボタンが押されている 94 | BOOL MouseL; // マウスの左ボタンが押されている 95 | 96 | MeState State; // 現在の状態 97 | RECT Select; // 矩形領域選択用 98 | 99 | DWORD KeyCount; // リピート制御カウンタ 100 | DWORD ViewTime; // ビューモードの時間 101 | 102 | int Line; // 画面下は何行か? 103 | int Layer; // 作業中のレイヤー 104 | int ChipX; // マップチップの表示X 105 | 106 | MapInfo Data; // 現在のマップの状態 107 | } MapEditor; 108 | 109 | 110 | // ぐろーばる変数 // 111 | extern UndoStack Undo; 112 | extern MapEditor Map; 113 | extern CopyData Copy; 114 | extern GRP GrMapChip; 115 | extern GRP GrTama; 116 | 117 | 118 | BOOL EditorInit(void); // エディタの初期化 119 | void EditorMain(void); // エディタのメイン 120 | void EditorDraw(void); // 画面描画関連 121 | 122 | BOOL LoadMapData(char *filename); // マップチップの配置データをLoadする 123 | BOOL SaveMapData(char *filename); // マップチップの配置データをSaveする 124 | 125 | void ConvertRect(RECT *rc); // 小→大となる矩形を得る 126 | 127 | void StkRedo(void); // Undo スタックを用いて Redo を行う 128 | void StkPushUndo(void); // Undo スタックに挿入 129 | void StkPopUndo(void); // Undo スタックから取り出し 130 | 131 | void SetMask(void); // マスクをセットする 132 | void ResetMask(void); // マスクをリセットする 133 | 134 | void GetMapDataM(void); // マップデータの取得(マップパーツエリア) 135 | void GetMapDataE(void); // マップデータの取得(作業領域) 136 | void FreeMapData(void); // マップデータの解放 137 | void PutMapData(void); // マップデータの貼り付け 138 | 139 | 140 | #endif 141 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 秋霜玉 2 | 3 | ## これは何? 4 | * 西方プロジェクト第一弾 **秋霜玉** のソースコードです。 5 | * コンパイルできるかもしれませんが, すべてのソースコードが含まれているわけではないのでリンクはできません。 6 | * 画像、音楽、効果音、スクリプト等のリソースは含まれません。 7 | 8 | 9 | ## 参考までに 10 | * 基本、開発当時(2000年前後)のままですが、文字コードを utf-8 に変更し、一部コメント(黒歴史ポエム)は削除してあります。インデント等も当時のままなので、読みにくい箇所があるかもしれません。 11 | * 8bit/16bitカラーの混在、MIDI再生関連、浮動小数点数演算を避ける、あたりが懐かしポイントになるかと思います。 12 | * 8.3形式のファイル名が多いのは、PC-98 時代に書いたコードの一部を流用していたためです。 13 | * リソースのアーカイブ展開に関するコードはもろもろの影響を考え、このリポジトリには含めていません。 14 | 15 | 16 | ## ディレクトリ構成 17 | * /**MAIN** : 秋霜玉WinMainあたり 18 | * /**GIAN07** : 秋霜玉本体 19 | * /**DirectXUTYs** : DirectX, MIDI再生、数学関数等の共通処理 20 | * /**MapEdit2** : マップエディタ 21 | * /**ECLC** : ECL(敵制御用) スクリプトコンパイラ 22 | * /**SCLC** : SCL(敵配置用) スクリプトコンパイラ 23 | 24 | 25 | ## たぶん紛失してしまったソースコード 26 | 以下のコードについては、見つかり次第追加するかもしれません。 27 | * リソースのアーカイバ 28 | 29 | 30 | ## ライセンス 31 | * [MIT](LICENSE) 32 | -------------------------------------------------------------------------------- /SCLC/Calc.cpp: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* CALC.cpp 式の解析 */ 3 | /* */ 4 | /* */ 5 | 6 | #include "CALC.h" 7 | 8 | /* 9 | * [新機能] 10 | * 11 | * 単項演算子 - を追加(二項演算子 + - * / よりも優先順位が高いことに注意) 12 | * 演算子の追加(^べき乗 |OR &AND <左シフト >右シフト) 13 | * 括弧に関するエラーチェックの強化 14 | * 演算用スタックのオーバー・アンダーフローのチェック 15 | * エラー出力関数を変更できるようにした 16 | */ 17 | 18 | 19 | ///// [ 変数 ] ///// 20 | static char ope_dat[CALC_DATA_MAX]; // 演算子用スタック 21 | static int val_dat[CALC_DATA_MAX]; // 数値保持用スタック 22 | static int ope_pow[256]; // 演算子の優先順位(名前が変だな) 23 | static int ope_sp; // 演算子用スタックポインタ 24 | static int val_sp; // 数値保持用スタックポインタ 25 | static void (*calc_err)(char *s); // エラー出力用関数 26 | 27 | 28 | ///// [ 関数 ] ///// 29 | static void calc_top(void); // 先頭で計算処理をして、spを更新する 30 | static void ope_push(char ope); // 演算子(ope)をPushする 31 | static void val_push(int val); // 数値(val)をPushする 32 | 33 | 34 | 35 | void CalcSetup(void (*func)(char *s)) 36 | { 37 | int i; 38 | 39 | // エラー出力用関数をセットする // 40 | calc_err = func; 41 | 42 | // 演算子の優先順位をセットする // 43 | for(i=0;i<256;i++) ope_pow[i]=0; 44 | ope_pow['(']=-1; 45 | ope_pow['+']=ope_pow['-']= 1; 46 | ope_pow['*']=ope_pow['/']= 2; 47 | ope_pow['^']=3; 48 | ope_pow['|']=ope_pow['&']=ope_pow['<']=ope_pow['>']=4; 49 | ope_pow[OPE1_MINUS]= 5; 50 | } 51 | 52 | int Calc(char *factor) 53 | { 54 | int value; 55 | int paren_count = 0; // 括弧の数カウンタ 56 | BOOL bMinusFlag = TRUE; // 単項演算子フラグ 57 | 58 | if(calc_err==(void *)0) return 0; 59 | 60 | ope_dat[0] = 0; 61 | ope_sp = 0; 62 | val_sp = -1; // いいのか? 63 | 64 | while(*factor!='\0'){ 65 | switch(*factor){ 66 | case('('): 67 | bMinusFlag = TRUE; // 単項演算子フラグの初期化 68 | ope_push(*factor); 69 | paren_count++;factor++; 70 | break; 71 | 72 | case(')'): 73 | if(--paren_count<0) 74 | calc_err("左かっこの数が少ない"); 75 | 76 | while(ope_dat[ope_sp]!='(') calc_top(); // 結果をこきだす 77 | ope_sp--;factor++; 78 | break; 79 | 80 | case('-'): 81 | if(bMinusFlag){ 82 | bMinusFlag = FALSE; 83 | ope_push(OPE1_MINUS); 84 | factor++; 85 | break; 86 | } 87 | case('+'):case('*'):case('/'):case('^'):case('|'):case('&'): 88 | case('>'):case('<'): 89 | if(ope_pow[ope_dat[ope_sp]]>=ope_pow[*factor]) calc_top(); 90 | ope_push(*factor); 91 | factor++; 92 | break; 93 | 94 | case('0'):case('1'):case('2'):case('3'):case('4'): 95 | case('5'):case('6'):case('7'):case('8'):case('9'): 96 | for(value=0;*factor>='0'&&*factor<='9';factor++){ 97 | value*=10; 98 | value+=(*factor)-'0'; 99 | } 100 | val_push(value); 101 | bMinusFlag = FALSE; // 代入されたらフラグは必ずオフにする 102 | break; 103 | 104 | default: 105 | calc_err("謎の演算子もしくは定義されていない定数がある"); 106 | break; 107 | } 108 | } 109 | 110 | if(paren_count>0) 111 | calc_err("右かっこの数が少ない"); 112 | 113 | while(ope_sp>0) calc_top(); // 結果をこきだす 114 | 115 | return val_dat[0]; 116 | } 117 | 118 | static void calc_top(void) 119 | { 120 | int i; 121 | 122 | switch(ope_dat[ope_sp]){ 123 | case(OPE1_MINUS): // 単項演算子 - 124 | val_dat[val_sp]*=(-1); 125 | if((--ope_sp)<0) 126 | calc_err("スタックアンダーフローです"); 127 | return; 128 | 129 | case('+'): // 加算(二項) 130 | val_dat[val_sp-1]+=val_dat[val_sp]; 131 | break; 132 | 133 | case('-'): // 減算(二項) 134 | val_dat[val_sp-1]-=val_dat[val_sp]; 135 | break; 136 | 137 | case('*'): // 乗算(二項) 138 | val_dat[val_sp-1]*=val_dat[val_sp]; 139 | break; 140 | 141 | case('/'): // 除算(二項) 142 | if(val_dat[val_sp]==0) 143 | calc_err("ゼロで除算しようとしている"); 144 | 145 | val_dat[val_sp-1]/=val_dat[val_sp]; 146 | break; 147 | 148 | case('^'): // べき乗 149 | if(val_dat[val_sp]==0){ // 0乗 150 | val_dat[val_sp-1]=1; 151 | break; 152 | } 153 | i=val_dat[val_sp-1]; 154 | while((--val_dat[val_sp])>0) 155 | val_dat[val_sp-1]*=i; 156 | break; 157 | 158 | case('&'): // 論理積 159 | val_dat[val_sp-1]&=val_dat[val_sp]; 160 | break; 161 | 162 | case('|'): // 論理和 163 | val_dat[val_sp-1]|=val_dat[val_sp]; 164 | break; 165 | 166 | case('<'): // 左シフト 167 | val_dat[val_sp-1]=val_dat[val_sp-1]<'): // 右シフト 171 | val_dat[val_sp-1]=val_dat[val_sp-1]>>val_dat[val_sp]; 172 | break; 173 | } 174 | 175 | // エラーの場合はデクリメントされなくても良いので... // 176 | if((--val_sp)<0 || (--ope_sp)<0) 177 | calc_err("スタックアンダーフローです"); 178 | } 179 | 180 | static void ope_push(char ope) 181 | { 182 | if(ope_sp+1>=CALC_DATA_MAX) 183 | calc_err("スタックオーバーフローです"); 184 | 185 | ope_dat[++ope_sp]=ope; 186 | } 187 | 188 | static void val_push(int value) 189 | { 190 | if(val_sp+1>=CALC_DATA_MAX) 191 | calc_err("スタックオーバーフローです"); 192 | 193 | val_dat[++val_sp]=value; 194 | } 195 | -------------------------------------------------------------------------------- /SCLC/Calc.h: -------------------------------------------------------------------------------- 1 | /* */ 2 | /* CALC.h 式の解析 */ 3 | /* */ 4 | /* */ 5 | 6 | #ifndef PBGWIN_CALC_H 7 | #define PBGWIN_CALC_H "CALC : Version 0.02 : Update 2000/02/03" 8 | #pragma message(PBGWIN_CALC_H) 9 | 10 | #include 11 | 12 | 13 | 14 | ///// [ 定数 ] ///// 15 | #define CALC_DATA_MAX 100 // スタック領域の大きさ 16 | #define OPE1_MINUS '@' // 単項演算子 - に対する記号 17 | 18 | 19 | 20 | ///// [ 関数 ] ///// 21 | extern void CalcSetup(void (*func)(char *s)); // 計算の準備をする 22 | extern int Calc(char *factor); // 引数:空白の無い式 23 | 24 | 25 | 26 | #endif 27 | --------------------------------------------------------------------------------