仕様


全てのテキストデータは改行コードCRLF

ディレクトリ構造
	./+ABCDディレクトリ
	 |-プログラムとか
	 |-Config.ini (ゲーム設定保存ファイル)
	 |+dataディレクトリ (ゲームのデータディレクトリ)
	 |+Deckディレクトリ (ゲーム中に認識するデッキディレクトリ。Config.iniで設定変更可能)
	  |-デッキファイル (複数個存在する。拡張子は.ini)
	 |+CardDefineディレクトリ (カード定義ディレクトリ)
	  |-CreatureType.ini (クリーチャータイプ名設定ファイル)
	  |-SkillList.ini (スキル名設定ファイル)
	  |+エキスパンションディレクトリ (ディレクトリ名はエキスパンション名)
	   |-カード定義ファイル (エキスパンション略称_エキスパンションID_カードID.txt)
	   |-カードイラストファイル (エキスパンション略称_エキスパンションID_カードID.bmp)

config.ini
	ゲームの設定を保存するファイル
	一部設定は直接編集しないと変更出来ないようになっている。
	
	----書式----
	[Config]
	WindowMode =0:フルスクリーンモード、1:ウィンドウモード
	FPS = 描画FPS数(有効値 10 , 20 , 30 , 40 , 50 , 60)
	ShowFPS =0:FPS非表示、1:FPS表示

	UserName=ユーザー名
	DeckDir=デッキディレクトリ名(相対パスで記述)
	DefaultPort=ポート番号
	DefaultIP=IPアドレス
	DefaultDeck=初期選択デッキ
	CGI_URL=対戦マッチングCGIのアドレス 
	Auto_Crystal=0:クリスタルカード自動配置OFF、1:クリスタルカード自動配置ON
	Auto_Creature=0:クリーチャーカード自動配置OFF、1:クリーチャーカード自動配置ON
	Auto_LandSpell=0:ランドスペルカード自動配置OFF、1:ランドスペルカード自動配置ON
	Auto_SkipKill=0:自動スキップ解除OFF、1:自動スキップ解除ON
	CGI_METHOD_POST=0:CGIアクセスにGETメソッドを使用、1:CGIアクセスにPOSTメソッドを使用
	DefaultLang =-1:カードの設定を反映、0:全てのカードを日本語で表示、1:全てのカードを英語で表示

	[Sound]
	BGM = BGMのON,OFF
	BGMVolume = BGMのボリューム0〜1000
	SE = SEのON,OFF
	SEVolume = SEのボリューム

	[Skin]
	Skin0 = スキンファイル0
	Skin1 = スキンファイル1
	Skin2 = スキンファイル2
	Skin3 = スキンファイル3
	Skin4 = スキンファイル4
	Skin5 = スキンファイル5
	Skin6 = スキンファイル6
	Skin7 = スキンファイル7
	Skin8 = スキンファイル8
	Skin9 = スキンファイル9
	※最大Skin99まで

カード定義
CreatureType.ini
	クリーチャータイプ名を記述
	----書式----
	[CreatureTypeXXX] ←XXXはクリーチャータイプ番号
	Japanese = 日本語クリーチャータイプ名
	English = 英語クリーチャータイプ名
	
	上記書式を存在するクリーチャータイプの数だけ繰り返す。

SkillList.ini
	スキル名を記述
	----書式----
	[SkillXXX] ←XXXはスキル番号
	Japanese = 日本語スキル名
	English = 英語スキル名
	
	上記書式を存在するスキルの数だけ繰り返す。

カード定義ファイル
	カードの名前とテキストを定義するファイル
	エキスパンションディレクトリの下にカードの数だけ存在する。
	(Basic Testエキスパンションのカード定義ファイルは ./CardDefine/BasicTest/ に存在する。)
	
	ファイル名
	EE_EID_CID.txt
	 EE:エキスパンションごとに決められるアルファベット2文字の略称
	 EID:エキスパンションID
	 CID:カードID
	
	----書式----
	[Card]
	Expansion = エキスパンションID
	ID = カードID

	[Japanese]
	Name = 日本語カード名
	Text = 日本語カードテキスト
	Artist = 日本語イラスト作者名

	[English]
	Name = 英語カード名
	Text = 英語テキスト
	Artist = 英語イラスト作者名

カードイラストファイル
	カードのイラストのビットマップファイル
	ファイルを置くディレクトリとファイル名の規則はカード定義ファイルと同様
	ただしファイル名は拡張子が.bmpになる。
	
	----フォーマット----
	ファイル形式:Windows形式のビットマップ
	横:110ピクセル
	縦:128ピクセル
	色数:256色(8bit)
	カラーキー:真緑=RGB(0,255,0)

デッキファイル
	デッキのデータを保存するファイル
	デッキディレクトリに存在しないとゲーム開始時に選択できない。
	
	----書式----
	[Deck]
	Version=最終編集バージョン情報
	Name=デッキ名
	Comment=デッキコメント
	Author=デッキ著作者名

	CardXXX=BT_YYY_ZZZ_L ←デッキに含まれるカードのデータの個数だけ繰り返す
		XXX:デッキに含まれるカードの番号(1から始まり、重複が無く連続していること)
		BT:エキスパンションの略称
		YYY:エキスパンションID
		ZZZ:カードID
		L:言語[0 = 日本語 , 1 = 英語]
	
	※データ読み込み時に無効なカード
	 (存在しないカード、4枚以上入っているカード、スーパーレアのカード)は無視します。

デッキCRCを求めるサンプルプログラム(crc.c)
     1 :	#include <stdio.h>
     2 :	#include <malloc.h>
     3 :	
     4 :	/* カードデータ構造体 */
     5 :	typedef struct cardtag
     6 :	{
     7 :	    unsigned int ExpansionID ;    /* エキスパンションID */
     8 :	    unsigned int CardID ;        /* カードID */
     9 :	} Card ;
    10 :	
    11 :	/**
    12 :	 * カード配列の並び替え用比較関数 for qsort
    13 :	 *
    14 :	 * エキスパンションIDとカードID順に並べる
    15 :	 */
    16 :	int compare( const void *arg1, const void *arg2 )
    17 :	{
    18 :	    Card *pc1 , *pc2 ;
    19 :	    int a1 , a2 ;
    20 :	    
    21 :	    pc1 = (Card *)arg1 ;
    22 :	    pc2 = (Card *)arg2 ;
    23 :	    a1 = pc1->ExpansionID * 1000 + pc1->CardID ;
    24 :	    a2 = pc2->ExpansionID * 1000 + pc2->CardID ;
    25 :	    
    26 :	    return a1 - a2 ;
    27 :	}
    28 :	
    29 :	/**
    30 :	 * CRC計算
    31 :	 *
    32 :	 * IN buf : CRC計算するバッファ
    33 :	 * IN size : バッファのサイズ
    34 :	 *
    35 :	 * OUT : CRC
    36 :	 */
    37 :	unsigned int calcCRC(const char *buf, unsigned int size)
    38 :	{
    39 :	    unsigned int i, c, n = 0;
    40 :	    for (i = 0; i < size; i++)
    41 :	    {
    42 :	        n ^= (buf[i]<<8);
    43 :	        for (c = 0; c < 8; c++)
    44 :	        {
    45 :	            if (n & 0x8000){
    46 :	                n = (n << 1) ^ 4129;
    47 :	            }else{
    48 :	                n = (n << 1);
    49 :	            }
    50 :	        }
    51 :	    }
    52 :	    return n & 0xffff;
    53 :	}
    54 :	
    55 :	/**
    56 :	 * カード配列ののCRCを取得
    57 :	 *
    58 :	 * IN Cardz[] : カード配列
    59 :	 * IN num : カード配列の個数
    60 :	 *
    61 :	 * OUT : CRC
    62 :	 */
    63 :	unsigned int GetCRC(Card Cardz[] , unsigned int num)
    64 :	{
    65 :	    unsigned int *pdwBuff = malloc(sizeof(unsigned int)*num) ;
    66 :	    unsigned int i , crc1 , crc2 , crcRes ;
    67 :	    unsigned int *pdw = &pdwBuff[0] ;
    68 :	
    69 :	    /* ID順番に並び替え */
    70 :	    qsort((void *)Cardz, (size_t)num, sizeof(Card), compare);
    71 :	
    72 :	    /* カードの分だけバッファを作成 */
    73 :	    for(i=0 ; i<num ; i++)
    74 :	    {
    75 :	        *pdw = Cardz[i].ExpansionID * 1000 + Cardz[i].CardID ;
    76 :	        pdw++ ;
    77 :	    }
    78 :	    
    79 :	    /* CRC計算 */
    80 :	    crc1 = calcCRC((const char *)pdwBuff , sizeof(unsigned int)*num) ;
    81 :	    
    82 :	    /* CRCのCRCを計算 */
    83 :	    crc2 = calcCRC((const char *)&crc1 , sizeof(unsigned int) ) ;
    84 :	    
    85 :	    /* CRC結合 */
    86 :	    crcRes = crc1 * 0x10000 + crc2 ;
    87 :	    
    88 :	    free(pdwBuff) ;
    89 :	    return crcRes ;
    90 :	}
    91 :	
    92 :	
    93 :	int main()
    94 :	{
    95 :	    int Num = 40 , i ;
    96 :	    Card CardList[40] ;
    97 :	    unsigned int crc ;
    98 :	    char szCRC[256] ;
    99 :	    
   100 :	    /* 適当にデータ入れるぜ! */
   101 :	    for(i=0 ; i<10 ; i++){    /* 炎クリ×10枚 */
   102 :	        CardList[i].ExpansionID = 0x00 ;    /* Basic Test */
   103 :	        CardList[i].CardID = 1 ;    /* 炎クリ */
   104 :	    }
   105 :	
   106 :	    for(i=0 ; i<10 ; i++){    /* 水クリ×10枚 */
   107 :	        CardList[i+10].ExpansionID = 0x00 ;    /* Basic Test */
   108 :	        CardList[i+10].CardID = 2 ;    /* 水クリ */
   109 :	    }
   110 :	    
   111 :	    for(i=0 ; i<10 ; i++){    /* 風クリ×10枚 */
   112 :	        CardList[i+20].ExpansionID = 0x00 ;    /* Basic Test */
   113 :	        CardList[i+20].CardID = 3 ;    /* 風クリ */
   114 :	    }
   115 :	
   116 :	    for(i=0 ; i<10 ; i++){    /* 光クリ×10枚 */
   117 :	        CardList[i+30].ExpansionID = 0x00 ;    /* Basic Test */
   118 :	        CardList[i+30].CardID = 4 ;    /* 光クリ */
   119 :	    }
   120 :	    
   121 :	    /* CRC取得 */
   122 :	    crc = GetCRC(CardList , Num) ;
   123 :	    sprintf(szCRC , "CRC : %08X" , crc) ;
   124 :	    printf(szCRC) ;
   125 :	    
   126 :	    printf("\n%d" , sizeof(unsigned int) ) ;
   127 :	    
   128 :	    return 0 ;
   129 :	}
カードデータファイル(INI形式) エキスパンションに含まれるカードのデータを保持するファイル エキスパンション事に一つのファイルとして出力される。 ----書式---- [Expansion] ExID=エキスパンション番号 Name=エキスパンション名 MaxID=エキスパンション内に存在するカードの最大ID ExHead=エキスパンションヘッダ(アルファベット2文字) ExDir=エキスパンションデータ格納ディレクトリ。 カード定義ファイルは ./CardDefine/ExID/ExHead_ExID_CardID.txt [CardXXX] ← XXXは3桁のカードIDで001から始まってMaxIDまで Type=カードタイプ Rarity=レアリティ CastTime=詠唱時間 CastCost=詠唱コスト(MP) Fire=必要属性値(炎) Water=必要属性値(水) Wind=必要属性値(風) Light=必要属性値(光) Dark=必要属性値(闇) NameJ=日本語カード名 HeadTextJ=カード名等のテキスト(日本語) 例:●[炎のクリスタル]\nCrystal\n0(-) / 0f EffectTextJ=カード効果(日本語) TextJ=テキスト(日本語) ArtistJ=アーティスト(日本語) NameE=英語カード名 HeadTextE=カード名等のテキスト(英語) 例:●[Fire Crystal]\nCrystal\n0(-) / 0f EffectTextE=カード効果(英語) TextE=テキスト(英語) ArtistE=アーティスト(英語) そのうちクリーチャーのパラメータとか出力するデータ増やすかも カードデータ表示サンプルプログラム(CheckCard.c)
     1 :	#include <stdio.h>
     2 :	#include <windows.h>
     3 :	
     4 :	/* エキスパンションセクション */
     5 :	#define SECTION_EXPANSION    "Expansion"
     6 :	#define KEY_EXID    "ExID"
     7 :	#define KEY_EXNAME    "Name"
     8 :	#define KEY_EXMAX    "MaxID"
     9 :	
    10 :	/* カードセクション */
    11 :	#define SECTION_CARD_HEAD    "Card"
    12 :	#define KEY_HEADJ    "HeadTextJ"
    13 :	#define KEY_EFFECTJ    "EffectTextJ"
    14 :	#define KEY_TEXTJ    "TextJ"
    15 :	
    16 :	/* "\n"を改行に変換する */
    17 :	void DecodeCRLF(char szString[])
    18 :	{
    19 :	    char *pc = szString ;
    20 :	    while(pc != NULL){
    21 :	        pc = strstr(pc , "\\n") ;
    22 :	        if(pc){    /* "\n" をCRLFに変換 */
    23 :	            pc[0] = '\r' ;
    24 :	            pc[1] = '\n' ;
    25 :	        }
    26 :	    }
    27 :	}
    28 :	
    29 :	/* エキスパンションデータを読み込む */
    30 :	int ReadExpansion(char szFile[])
    31 :	{
    32 :	    char szName[256] ;
    33 :	    int ExID , MaxID ;
    34 :	    ExID = GetPrivateProfileInt(SECTION_EXPANSION , KEY_EXID , -1 , szFile) ;
    35 :	    if(ExID < 0){    /* 正常なファイルでない */
    36 :	        return -1 ;
    37 :	    }
    38 :	    
    39 :	    MaxID = GetPrivateProfileInt(SECTION_EXPANSION , KEY_EXMAX , -1 , szFile) ;
    40 :	    GetPrivateProfileString(SECTION_EXPANSION , KEY_EXNAME , "Error" , szName , 256 , szFile) ;
    41 :	
    42 :	    printf("%02d : %s\nMaxID = %d\n" , ExID , szName , MaxID) ;
    43 :	
    44 :	    return MaxID ;    /* 最大IDを返す */
    45 :	}
    46 :	
    47 :	/* カードデータを読み込む */
    48 :	int ReadCard(char szFile[] , int CardID)
    49 :	{
    50 :	    char szSection[64] , szHead[1024] , szEffect[1024] , szText[1024] ;
    51 :	
    52 :	    /* セクション名作成 */
    53 :	    sprintf(szSection , "%s%03d" , SECTION_CARD_HEAD , CardID) ;
    54 :	
    55 :	    GetPrivateProfileString(szSection , KEY_HEADJ , "Error" , szHead , 1024 , szFile) ;
    56 :	    if(0 == strcmp(szHead , "Error"))
    57 :	    {    /* 上手く読めなかった */
    58 :	        return -1 ;
    59 :	    }
    60 :	    GetPrivateProfileString(szSection , KEY_EFFECTJ , "Error" , szEffect , 1024 , szFile) ;
    61 :	    GetPrivateProfileString(szSection , KEY_TEXTJ , "Error" , szText , 1024 , szFile) ;
    62 :	
    63 :	    /* 改行コードを変換 */
    64 :	    DecodeCRLF(szHead) ;
    65 :	    DecodeCRLF(szEffect) ;
    66 :	    DecodeCRLF(szText) ;
    67 :	
    68 :	    /* 出力 */
    69 :	    printf(szHead) ;
    70 :	    printf("\n-------------------\n") ;
    71 :	    printf(szEffect) ;
    72 :	    printf("\n-------------------\n") ;
    73 :	    printf("Text : %s\n" , szText) ;
    74 :	    return CardID ;
    75 :	}
    76 :	
    77 :	int main()
    78 :	{
    79 :	    int MaxID , n , m ;
    80 :	    char szFile[256] ;
    81 :	
    82 :	    /* カレントディレクトリ取得 */
    83 :	    if(0 == GetCurrentDirectory(256 , szFile))
    84 :	    {    /* 取得失敗 */
    85 :	        printf("カレントディレクトリの取得に失敗しました。\n") ;
    86 :	    }
    87 :	    strcat(szFile , "\\CardList.ini") ;    /* CardList.iniから読み込む */
    88 :	
    89 :	    /* エキスパンションデータを読み込む */
    90 :	    MaxID = ReadExpansion(szFile) ;
    91 :	    if(0 > MaxID )
    92 :	    {    /* 読み込み失敗 */
    93 :	        printf("\"%s\"の読み込みに失敗しました。\n" , szFile) ;
    94 :	        return -1 ;
    95 :	    }
    96 :	
    97 :	    n = 1 ;
    98 :	    while(n>0){
    99 :	        printf("カード番号を入力して下さい(0で終了)") ;
   100 :	        scanf("%d" , &n) ;    /* チェックしたいカード番号を入力 */
   101 :	        if(n <= 0){    /* 0以下なら終了 */
   102 :	            break ;
   103 :	        }
   104 :	        
   105 :	        /* カードデータ表示 */
   106 :	        m = ReadCard(szFile , n) ;
   107 :	
   108 :	        if(m < 0){    /* カードデータの読み込みに失敗してたら終了 */
   109 :	            break ;
   110 :	        }
   111 :	    }
   112 :	    
   113 :	    return 0 ;
   114 :	}
スキンファイル 以前の内容はスキンファイルへ移動しました。