File size: 5,439 Bytes
c903325
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// ื ืชื•ื ื™ ื”ืžืฉื—ืง - ืื•ื‘ื™ื™ืงื˜ GAMEDATA (ื‘ืจื™ืจืช ืžื—ื“ืœ ื›ืืฉืจ ืื™ืŸ ื—ื™ื‘ื•ืจ ืœืฉืจืช)
const GAMEDATA = {
    // ืžืฉื•ืฉื™ื (19 ืžืฉื•ืฉื™ื ื‘ืจืžืช ืงื•ืฉื™ ืจื’ื™ืœื”)
    hexes: [
        // ืฉื•ืจื” ืขืœื™ื•ื ื” (3 ืžืฉื•ืฉื™ื)
        { id: 1, q: 0, r: -2, type: 'wood', number: 11, robber: false },
        { id: 2, q: 1, r: -2, type: 'sheep', number: 12, robber: false },
        { id: 3, q: 2, r: -2, type: 'wheat', number: 9, robber: false },
        
        // ืฉื•ืจื” ืฉื ื™ื™ื” (4 ืžืฉื•ืฉื™ื)
        { id: 4, q: -1, r: -1, type: 'brick', number: 4, robber: false },
        { id: 5, q: 0, r: -1, type: 'ore', number: 6, robber: false },
        { id: 6, q: 1, r: -1, type: 'sheep', number: 5, robber: false },
        { id: 7, q: 2, r: -1, type: 'wheat', number: 10, robber: false },
        
        // ืฉื•ืจื” ืืžืฆืขื™ืช (5 ืžืฉื•ืฉื™ื)
        { id: 8, q: -2, r: 0, type: 'wood', number: 3, robber: false },
        { id: 9, q: -1, r: 0, type: 'brick', number: 11, robber: false },
        { id: 10, q: 0, r: 0, type: 'desert', number: null, robber: true },
        { id: 11, q: 1, r: 0, type: 'wheat', number: 4, robber: false },
        { id: 12, q: 2, r: 0, type: 'ore', number: 8, robber: false },
        
        // ืฉื•ืจื” ืจื‘ื™ืขื™ืช (4 ืžืฉื•ืฉื™ื)
        { id: 13, q: -2, r: 1, type: 'ore', number: 8, robber: false },
        { id: 14, q: -1, r: 1, type: 'sheep', number: 10, robber: false },
        { id: 15, q: 0, r: 1, type: 'wood', number: 9, robber: false },
        { id: 16, q: 1, r: 1, type: 'brick', number: 3, robber: false },
        
        // ืฉื•ืจื” ืชื—ืชื•ื ื” (3 ืžืฉื•ืฉื™ื)
        { id: 17, q: -2, r: 2, type: 'wheat', number: 2, robber: false },
        { id: 18, q: -1, r: 2, type: 'sheep', number: 5, robber: false },
        { id: 19, q: 0, r: 2, type: 'ore', number: 6, robber: false }
    ],

    // ื™ื™ืฉื•ื‘ื™ื - ืžืชื—ื™ืœื™ื ืจื™ืงื™ื
    settlements: [],

    // ืขืจื™ื - ืžืชื—ื™ืœื™ื ืจื™ืงื•ืช  
    cities: [],

    // ื“ืจื›ื™ื - ืžืชื—ื™ืœื™ื ืจื™ืงื•ืช
    roads: [],

    // ืžื™ืงื•ื ื”ืฉื•ื“ื“ ื”ื ื•ื›ื—ื™
    robberPosition: 10,
    
    // ืฉื—ืงื ื™ื (ืชื•ืกืฃ ื—ื“ืฉ)
    players: [
        { id: 0, name: 'ืฉื—ืงืŸ 1', victory_points: 2, total_cards: 5 },
        { id: 1, name: 'ืฉื—ืงืŸ 2', victory_points: 3, total_cards: 7 },
        { id: 2, name: 'ืฉื—ืงืŸ 3', victory_points: 1, total_cards: 4 },
        { id: 3, name: 'ืฉื—ืงืŸ 4', victory_points: 2, total_cards: 6 }
    ],
    
    // ืžื™ื“ืข ื ื•ื›ื—ื™ ืขืœ ื”ืžืฉื—ืง
    current_player: 0,
    current_phase: 'ACTION',
    dice_result: [3, 4]
};

// ืžื™ืคื•ื™ ืกื•ื’ื™ ืžืฉืื‘ื™ื ืœืงื‘ืฆื™ ื”ืชืžื•ื ื•ืช
const RESOURCE_FILES = {
    'wood': 'Forest.png',
    'brick': 'Hills.png', 
    'sheep': 'Pasture.png',
    'wheat': 'Fields.png',
    'ore': 'Mountains.png',
    'desert': 'Desert.png'
};

// ืžื™ืคื•ื™ ืชื›ื•ื ื•ืช Tile ืœ-Hex ื‘ืคื•ืจืžื˜ ืฉืœื ื•
function tileToHex(tile) {
    const tileTypeMap = {
        'FOREST': 'wood',
        'HILLS': 'brick',
        'PASTURE': 'sheep', 
        'FIELDS': 'wheat',
        'MOUNTAINS': 'ore',
        'DESERT': 'desert'
    };
    
    return {
        id: tile.id || tile.position,
        q: tile.position ? tile.position[0] : 0,
        r: tile.position ? tile.position[1] : 0, 
        type: tileTypeMap[tile.type] || 'desert',
        number: tile.token,
        robber: tile.has_robber || false
    };
}

// ื”ืžืจืช GameState ืžPyCatan ืœืคื•ืจืžื˜ ืฉืœื ื•
function convertGameState(pyGameState) {
    const converted = {
        hexes: [],
        settlements: [],
        cities: [],
        roads: [],
        players: [],
        robberPosition: null,
        current_player: pyGameState.current_player || 0,
        current_phase: pyGameState.current_phase || 'ACTION',
        dice_result: pyGameState.dice_result || null
    };
    
    // ื”ืžืจ ืžืฉื•ืฉื™ื
    if (pyGameState.board && pyGameState.board.tiles) {
        converted.hexes = pyGameState.board.tiles.map((tile, index) => tileToHex({
            ...tile,
            id: index + 1
        }));
    }
    
    // ื”ืžืจ ืฉื—ืงื ื™ื
    if (pyGameState.players) {
        converted.players = pyGameState.players.map((player, index) => ({
            id: index,
            name: player.name || `ืฉื—ืงืŸ ${index + 1}`,
            victory_points: player.victory_points || 0,
            total_cards: (player.cards && player.cards.length) || 0
        }));
    }
    
    // ื”ืžืจ ืžื‘ื ื™ื
    if (pyGameState.buildings) {
        pyGameState.buildings.forEach(building => {
            if (building.type === 'settlement') {
                converted.settlements.push({
                    id: building.id,
                    vertex: building.point_id,
                    player: building.player + 1
                });
            } else if (building.type === 'city') {
                converted.cities.push({
                    id: building.id,
                    vertex: building.point_id,
                    player: building.player + 1
                });
            }
        });
    }
    
    // ื”ืžืจ ื“ืจื›ื™ื
    if (pyGameState.roads) {
        converted.roads = pyGameState.roads.map((road, index) => ({
            id: index + 1,
            from: road.start_point_id,
            to: road.end_point_id,
            player: road.player + 1
        }));
    }
    
    return converted;
}