blueprint function
This commit is contained in:
114
blueprint_engine.py
Normal file
114
blueprint_engine.py
Normal file
@@ -0,0 +1,114 @@
|
||||
import json
|
||||
|
||||
STANDARD_BLUEPRINT = [
|
||||
{"barracks": 1, "farm": 3, "lumber": 2, "stoner": 2, "ironer": 2, "storage": 2, "main": 2, "temple": 1},
|
||||
{"barracks": 1, "farm": 3, "lumber": 3, "stoner": 3, "ironer": 3, "storage": 6, "main": 8},
|
||||
{"farm": 8, "lumber": 8, "ironer": 8, "stoner": 8, "market": 5, "temple": 5, "barracks": 5},
|
||||
{"academy": 13},
|
||||
{"storage": 12, "farm": 12},
|
||||
{"main": 25},
|
||||
{"storage": 21, "farm": 15},
|
||||
{"lumber": 15, "stoner": 10, "ironer": 12},
|
||||
{"docks": 10},
|
||||
{"academy": 30},
|
||||
{"farm": 20, "storage": 25},
|
||||
{"market": 15, "trade_office": 1, "hide": 10},
|
||||
{"market": 30, "farm": 35, "thermal": 1, "academy": 36},
|
||||
{"farm": 45, "storage": 35, "lumber": 40, "ironer": 40, "stoner": 40},
|
||||
{"temple": 30}
|
||||
]
|
||||
|
||||
RESEARCH_LIST = [
|
||||
"booty", "pottery", "architecture", "building_crane",
|
||||
"shipwright", "plow", "mathematics", "combat_experience",
|
||||
"strong_wine", "take_over", "colonize_ship"
|
||||
]
|
||||
|
||||
RESEARCH_LEVELS = {
|
||||
"booty": 7,
|
||||
"pottery": 7,
|
||||
"architecture": 10,
|
||||
"building_crane": 13,
|
||||
"shipwright": 13,
|
||||
"plow": 22,
|
||||
"mathematics": 25,
|
||||
"combat_experience": 34,
|
||||
"strong_wine": 34,
|
||||
"take_over": 28,
|
||||
"colonize_ship": 13
|
||||
}
|
||||
|
||||
def evaluate_blueprints(conn):
|
||||
blueprints = conn.execute('SELECT town_id, blueprint_name FROM town_blueprints WHERE is_active = 1').fetchall()
|
||||
if not blueprints:
|
||||
return
|
||||
|
||||
for row in blueprints:
|
||||
town_id = str(row['town_id'])
|
||||
town_row = conn.execute('SELECT data FROM town_state WHERE town_id = ?', (town_id,)).fetchone()
|
||||
if not town_row:
|
||||
continue
|
||||
|
||||
try:
|
||||
town = json.loads(town_row['data'])
|
||||
except Exception:
|
||||
continue
|
||||
|
||||
build_queue = town.get('build_queue', [])
|
||||
buildings = town.get('buildings', {})
|
||||
build_data = town.get('build_data', {})
|
||||
|
||||
# Don't queue anything if there's already a pending/executing command in DB
|
||||
db_pending = conn.execute("SELECT id FROM commands WHERE town_id = ? AND type IN ('build', 'research') AND status IN ('pending', 'executing')", (town_id,)).fetchall()
|
||||
if db_pending:
|
||||
continue
|
||||
|
||||
# Calculate Future Levels based on current + game queue
|
||||
future_levels = {k: v for k, v in buildings.items()}
|
||||
for q_item in build_queue:
|
||||
b_type = q_item.get('building_type') or q_item.get('name')
|
||||
if b_type:
|
||||
future_levels[b_type] = future_levels.get(b_type, 0) + 1
|
||||
|
||||
# Find next required building
|
||||
target_building = None
|
||||
for phase in STANDARD_BLUEPRINT:
|
||||
incomplete = False
|
||||
for b_name, req_level in phase.items():
|
||||
if future_levels.get(b_name, 0) < req_level:
|
||||
incomplete = True
|
||||
b_info = build_data.get(b_name)
|
||||
if b_info and not b_info.get('has_max_level'):
|
||||
if b_info.get('enough_resources') != False:
|
||||
target_building = b_name
|
||||
break
|
||||
if incomplete:
|
||||
break
|
||||
|
||||
# Handle Academy Tech Research if no building was prioritized
|
||||
target_research = None
|
||||
if not target_building:
|
||||
academy_level = future_levels.get('academy', 0)
|
||||
researched = town.get('researches', {})
|
||||
research_queue = town.get('research_queue', [])
|
||||
|
||||
for r_name in RESEARCH_LIST:
|
||||
if not researched.get(r_name) and r_name not in [q.get('type') for q in research_queue]:
|
||||
# Check if academy level is high enough
|
||||
req_level = RESEARCH_LEVELS.get(r_name, 99)
|
||||
if academy_level >= req_level:
|
||||
target_research = r_name
|
||||
break
|
||||
|
||||
if target_building:
|
||||
payload_str = json.dumps({"building_id": target_building})
|
||||
conn.execute('''
|
||||
INSERT INTO commands (town_id, town_name, type, payload, status, player_id)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
''', (town_id, town.get('town_name'), 'build', payload_str, 'pending', town.get('player_id')))
|
||||
elif target_research:
|
||||
payload_str = json.dumps({"research_id": target_research})
|
||||
conn.execute('''
|
||||
INSERT INTO commands (town_id, town_name, type, payload, status, player_id)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
''', (town_id, town.get('town_name'), 'research', payload_str, 'pending', town.get('player_id')))
|
||||
Reference in New Issue
Block a user