File size: 2,186 Bytes
a78e101
 
 
 
6caeb35
a78e101
 
 
6caeb35
aa61a83
6caeb35
aa61a83
 
a78e101
 
 
 
 
 
 
 
 
 
b3f4a8c
a78e101
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6caeb35
 
ff67c59
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
from flask import Flask, render_template, session
from flask_socketio import SocketIO, emit
from game import Game
import uuid
import os

app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key'  # Replace with a secure key

# Configure SocketIO with CORS for all origins and threading mode
socketio = SocketIO(app, 
                    cors_allowed_origins="*",  # Allow all origins (or specify "https://broadfield-dev-dungeon-game.hf.space" for security)
                    async_mode='threading')    # Use threading instead of eventlet

# Store game instances per client session
games = {}

@app.route('/')
def index():
    session['sid'] = str(uuid.uuid4())  # Unique session ID for each client
    return render_template('index.html')

@socketio.on('connect')
def handle_connect(auth=None):  # Add auth parameter (can be None if not used)
    sid = session.get('sid')
    games[sid] = Game()  # Create a new game instance
    emit('update_game', games[sid].get_game_state())
    emit('message', 'Connected to the dungeon! Use arrow keys to move.')

@socketio.on('move')
def handle_move(direction):
    sid = session.get('sid')
    if sid in games:
        game = games[sid]
        game.move_player(direction)
        emit('update_game', game.get_game_state())
        # Combat or item messages are emitted within move_player if applicable

@socketio.on('use_item')
def handle_use_item(item_type):
    sid = session.get('sid')
    if sid in games:
        game = games[sid]
        if item_type == 'potion' and 'potion' in game.inventory:
            game.inventory.remove('potion')
            game.player_health = min(game.player_health + 5, 20)  # Max health 20
            emit('message', 'Used a health potion! Health restored.')
            emit('update_game', game.get_game_state())

@socketio.on('disconnect')
def handle_disconnect():
    sid = session.get('sid')
    if sid in games:
        del games[sid]  # Clean up game instance

if __name__ == '__main__':
    # Use port 7860 for Hugging Face Spaces or environment variable
    port = int(os.environ.get('PORT', 7860))
    socketio.run(app, debug=True, host='0.0.0.0', port=port, allow_unsafe_werkzeug=True)