全てのテキストデータは改行コード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 : }
|
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 : } |