-
Notifications
You must be signed in to change notification settings - Fork 0
/
conquer.py
125 lines (101 loc) · 4.05 KB
/
conquer.py
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
from backend import (
get_values,
remove_from_user,
update_user_data,
)
from map import update_map_data, get_coords
import random
def attack_success(attacker, defender, building_level=0):
# Increase defender's strength by 100% for each building level
defender_strength = defender * (2 ** building_level)
total = attacker + defender_strength
if total == 0:
return {"success": True, "chance": 100}
chance = (attacker / total) * 100
roll = random.uniform(0, 100)
success = roll <= chance
return {"success": success, "chance": chance}
def is_user_tile_owner(entry, user):
return get_values(entry).get("control") == user
def can_acquire_tile(entry, target):
return get_values(entry).get("type") == target
def has_sufficient_action_points(user_data):
return user_data["action_points"] >= 10
def process_attack_failure(user, user_data, usersdb, chance):
update_user_data(
user=user,
updated_values={
"action_points": user_data["action_points"] - 10,
"hp": 1,
"army_free": 0,
},
user_data_dict=usersdb,
)
return f"Your army was crushed in battle, the chance of success was {chance}! You were seriously hurt."
def process_attack_success(
entry, user, usersdb, mapdb, user_data, enemy_army, your_army, chance
):
remaining_army = max(your_army - enemy_army, 0)
update_user_data(
user=user,
updated_values={"army_free": remaining_army,
"exp": user_data["exp"] + int(enemy_army / 10)},
user_data_dict=usersdb,
)
owner = get_values(entry).get("control")
type = get_values(entry).get("type")
if type == "house":
adjust_population_limit(owner, user, usersdb)
remove_entry_from_owner(owner, user_data, usersdb)
assign_entry_to_user(entry, user, user_data, mapdb, usersdb, remaining_army)
return f"Takeover successful. The chance was {chance}%."
def adjust_population_limit(owner, new_owner, usersdb):
pop_delta = 10
# Fetch user data directly from usersdb without default values
owner_data = usersdb[owner]
new_owner_data = usersdb[new_owner]
def remove_entry_from_owner(owner, user_data, usersdb):
coords = {"x_pos": user_data["x_pos"], "y_pos": user_data["y_pos"]}
remove_from_user(owner, coords, usersdb)
def assign_entry_to_user(entry, user, user_data, mapdb, usersdb, remaining_army):
key = get_coords(entry)
entry[key]["control"] = user
entry[key]["army"] = 0
update_map_data(entry, mapdb)
action_points = user_data.get("action_points", 0) # Provide a default value of 0 if the key doesn't exist
update_user_data(
user=user,
updated_values={
"construction": entry,
"action_points": action_points - 1,
"army_free": remaining_army,
},
user_data_dict=usersdb,
)
def attempt_conquer(user, target, on_tile_map, usersdb, mapdb, user_data):
if not on_tile_map:
return "Looks like an empty tile"
for entry in on_tile_map:
if is_user_tile_owner(entry, user):
return "You already own this tile"
if not can_acquire_tile(entry, target):
return "Cannot acquire this type of tile"
if not has_sufficient_action_points(user_data):
return "You need at least 10 action points to attack"
your_army = user_data.get("army_free", 0)
enemy_army = get_values(entry).get("army", 0)
building_level = get_values(entry).get("level", 0) # Get the building level, default to 0 if not present
conquered = attack_success(attacker=your_army, defender=enemy_army, building_level=building_level)
if not conquered["success"]:
return process_attack_failure(user, user_data, usersdb, conquered["chance"])
return process_attack_success(
entry,
user,
usersdb,
mapdb,
user_data,
enemy_army,
your_army,
conquered["chance"],
)
return "Something unexpected happened"