Files
PuGa/tools/contd.py
T
dodoxandClaude Sonnet 5 e2a5149788 contd.py: fix condition direction, separate costs/rewards/freight legs
PAYMENT/REPUTATION always go to the player; PROVISION_SHIPMENT (a cost) and
PICKUP/DELIVERY_SHIPMENT (a freight leg the player may or may not fly) depend
on the condition's own Party field vs the contract's Party, not a flat
assumption that every material condition is something the player buys. Net
now correctly adds COMEX_PURCHASE_PICKUP rewards instead of only subtracting
provisioning costs.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-10-20 13:05:51 +02:00

54 lines
2.6 KiB
Python

#!/usr/bin/env python3
"""List this account's OPEN CONTD contract offers (the NPC logistics-officer pool shown in APEX's
CONTD panel - usually 3 at a time, only one acceptable) with payment, materials received/supplied,
freight legs the player must personally fly, and net (see puga/contd.py's docstring for exactly
which condition types are costs vs rewards vs the player's own job). Judging the actual best deal
is NOT this tool's job for anything it flags as unpriced (EXPLORATION, REPAIR_SHIP, etc.) or for
a freight leg's real fuel cost (flagged with weight/volume, price via puga.shipping yourself) - it
reports the breakdown, the caller reasons about context.
puga contd
puga contd --cx AI1
"""
import argparse, sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent.parent))
from puga import config, contd
def main():
ap = argparse.ArgumentParser()
ap.add_argument("--cx", default=config.DEFAULT_CX)
a = ap.parse_args()
contracts = contd.open_contracts()
if not contracts:
print("no OPEN contract offers right now")
return
for c in contracts:
r = contd.evaluate(c, a.cx)
print(f"\n{r['id']} partner={r['partner']} deadline {r['deadline_days']:.1f}d"
+ (" +reputation" if r["reputation"] else ""))
print(f" payment: {r['payment']:,.2f} AIC")
for rew in r["rewards"]:
print(f" receives: {rew['ticker']} x{rew['qty']:g} @ {rew['address']} market value {rew['value']:,.0f}")
for cost in r["costs"]:
flag = " SHORT: book can't fill this qty" if cost["short"] else ""
print(f" must supply: {cost['ticker']} x{cost['qty']:g} @ {cost['address']} buy-fresh cost {cost['value']:,.0f}{flag}")
for ltype, addr, wgt, vol in r["freight_legs"]:
print(f" YOUR FREIGHT LEG: {ltype} @ {addr} {wgt:g}t / {vol:g}m3 - price via puga.shipping, not included in net")
for ftype, addr in r["flags"]:
print(f" UNPRICED CONDITION: {ftype}" + (f" @ {addr}" if addr else "") + " - context-dependent, judge separately")
print(f" reward value: {r['reward_value']:,.0f} cost value: {r['cost_value']:,.0f} -> net (payment + reward - cost): {r['net']:,.0f}")
priceable = [c for c in contracts if not contd.evaluate(c, a.cx)["flags"]]
if len(priceable) == len(contracts):
best = max(contracts, key=lambda c: contd.evaluate(c, a.cx)["net"])
print(f"\nby payment+reward net alone, best priced: {best['ContractLocalId']}"
" - unpriced/flagged conditions (freight legs, exploration, etc.) still need judgment")
if __name__ == "__main__":
main()