Spaces:
Sleeping
Sleeping
Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,140 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from flask import Flask, request
|
2 |
+
import random
|
3 |
+
|
4 |
+
app = Flask(__name__)
|
5 |
+
|
6 |
+
# In-memory storage for each player's game state.
|
7 |
+
game_states = {}
|
8 |
+
|
9 |
+
# Helper to ensure responses never exceed 400 characters.
|
10 |
+
def limit_response(text, limit=400):
|
11 |
+
return text if len(text) <= limit else text[:limit-3] + "..."
|
12 |
+
|
13 |
+
def init_game(username, loadout):
|
14 |
+
bonus = 1.0
|
15 |
+
if loadout:
|
16 |
+
for w in loadout.lower().split(","):
|
17 |
+
if w.strip() in ["ak-47", "m4", "mp5", "ar-15"]:
|
18 |
+
bonus += 0.2
|
19 |
+
return {
|
20 |
+
"players": 150,
|
21 |
+
"kills": 0,
|
22 |
+
"bonus": bonus,
|
23 |
+
"round": 0,
|
24 |
+
"status": "active", # active, gulag, eliminated, won
|
25 |
+
"revives": 0, # self-revives used
|
26 |
+
"ammo": 100,
|
27 |
+
"armor": 100,
|
28 |
+
"inventory": [],
|
29 |
+
"in_gulag": False
|
30 |
+
}
|
31 |
+
|
32 |
+
@app.route("/start", methods=["GET"])
|
33 |
+
def start():
|
34 |
+
user = request.args.get("user")
|
35 |
+
loadout = request.args.get("loadout", "")
|
36 |
+
if not user:
|
37 |
+
return limit_response("User required"), 400
|
38 |
+
game_states[user] = init_game(user, loadout)
|
39 |
+
resp = (f"Game started for {user}! Players:150, Bonus:{game_states[user]['bonus']:.1f}. "
|
40 |
+
"Use !fight to engage.")
|
41 |
+
return limit_response(resp)
|
42 |
+
|
43 |
+
@app.route("/fight", methods=["GET"])
|
44 |
+
def fight():
|
45 |
+
user = request.args.get("user")
|
46 |
+
if not user or user not in game_states:
|
47 |
+
return limit_response("Start game first with !start"), 400
|
48 |
+
state = game_states[user]
|
49 |
+
if state["status"] != "active":
|
50 |
+
return limit_response(f"Game over. Final Kills: {state['kills']}."), 400
|
51 |
+
state["round"] += 1
|
52 |
+
r = state["round"]
|
53 |
+
event = random.choice(["fight", "loot", "buy", "ambush"])
|
54 |
+
resp = f"R{r}: "
|
55 |
+
if event == "fight":
|
56 |
+
roll = random.random() * state["bonus"]
|
57 |
+
if roll > 0.7:
|
58 |
+
kills = random.randint(1, 3)
|
59 |
+
state["kills"] += kills
|
60 |
+
state["players"] = max(state["players"] - kills, 1)
|
61 |
+
state["ammo"] = max(state["ammo"] - random.randint(5,15), 0)
|
62 |
+
resp += f"Fought & got {kills} kill(s)! "
|
63 |
+
elif roll > 0.5:
|
64 |
+
resp += "Enemy fled! "
|
65 |
+
else:
|
66 |
+
if random.random() < 0.3 and state["revives"] < 1:
|
67 |
+
state["revives"] += 1
|
68 |
+
resp += "Downed but self-revived! "
|
69 |
+
else:
|
70 |
+
state["in_gulag"] = True
|
71 |
+
state["status"] = "gulag"
|
72 |
+
return limit_response(resp + "Downed! Now in Gulag. Use !gulag.")
|
73 |
+
elif event == "loot":
|
74 |
+
loot = random.choice(["weapon", "ammo", "armor"])
|
75 |
+
if loot == "weapon":
|
76 |
+
wpn = random.choice(["AK-47", "M4", "Shotgun", "Sniper"])
|
77 |
+
state["inventory"].append(wpn)
|
78 |
+
if wpn.lower() in ["ak-47", "m4", "mp5", "ar-15"]:
|
79 |
+
state["bonus"] += 0.2
|
80 |
+
resp += f"Found {wpn}. "
|
81 |
+
elif loot == "ammo":
|
82 |
+
add_ammo = random.randint(10,30)
|
83 |
+
state["ammo"] += add_ammo
|
84 |
+
resp += f"Found {add_ammo} ammo. "
|
85 |
+
else:
|
86 |
+
add_arm = random.randint(5,20)
|
87 |
+
state["armor"] += add_arm
|
88 |
+
resp += f"Found {add_arm} armor. "
|
89 |
+
elif event == "buy":
|
90 |
+
item = random.choice(["UAV", "Air Strike", "Cluster Strike", "Armor Box"])
|
91 |
+
if item == "Armor Box":
|
92 |
+
state["armor"] += 10
|
93 |
+
else:
|
94 |
+
state["bonus"] += 0.15
|
95 |
+
resp += f"Bought {item}. "
|
96 |
+
elif event == "ambush":
|
97 |
+
resp += "Ambushed! "
|
98 |
+
amb = random.choice(["escaped", "lost ammo", "got a kill"])
|
99 |
+
if amb == "escaped":
|
100 |
+
resp += "Escaped. "
|
101 |
+
elif amb == "lost ammo":
|
102 |
+
lost = random.randint(10,20)
|
103 |
+
state["ammo"] = max(state["ammo"] - lost, 0)
|
104 |
+
resp += f"Lost {lost} ammo. "
|
105 |
+
else:
|
106 |
+
kills = random.randint(1,2)
|
107 |
+
state["kills"] += kills
|
108 |
+
state["players"] = max(state["players"] - kills, 1)
|
109 |
+
resp += f"Got {kills} kill(s)! "
|
110 |
+
# Natural eliminations
|
111 |
+
nat = random.randint(5,15)
|
112 |
+
state["players"] = max(state["players"] - nat, 1)
|
113 |
+
resp += f"Nat:{nat}. "
|
114 |
+
if state["players"] <= 1:
|
115 |
+
state["status"] = "won"
|
116 |
+
resp += f"Victory! Final Kills: {state['kills']}."
|
117 |
+
else:
|
118 |
+
resp += f"Left:{state['players']}, Kills:{state['kills']}."
|
119 |
+
return limit_response(resp)
|
120 |
+
|
121 |
+
@app.route("/gulag", methods=["GET"])
|
122 |
+
def gulag():
|
123 |
+
user = request.args.get("user")
|
124 |
+
if not user or user not in game_states:
|
125 |
+
return limit_response("Start game first with !start"), 400
|
126 |
+
state = game_states[user]
|
127 |
+
if not state.get("in_gulag"):
|
128 |
+
return limit_response("Not in Gulag."), 400
|
129 |
+
if random.random() < (0.6 + state["bonus"] * 0.05):
|
130 |
+
state["status"] = "active"
|
131 |
+
state["in_gulag"] = False
|
132 |
+
state["players"] = max(state["players"] - 5, 1)
|
133 |
+
resp = "Won Gulag fight! Back in action. Use !fight next."
|
134 |
+
else:
|
135 |
+
state["status"] = "eliminated"
|
136 |
+
resp = f"Lost Gulag fight. Game over. Final Kills: {state['kills']}."
|
137 |
+
return limit_response(resp)
|
138 |
+
|
139 |
+
if __name__ == "__main__":
|
140 |
+
app.run(host="0.0.0.0", port=5000)
|