| 1 | using System;
|
|---|
| 2 | using System.Collections.Generic;
|
|---|
| 3 |
|
|---|
| 4 | namespace CevoAILib
|
|---|
| 5 | {
|
|---|
| 6 | enum PlayError
|
|---|
| 7 | {
|
|---|
| 8 | None = -1,
|
|---|
| 9 |
|
|---|
| 10 | // internal, should not occur
|
|---|
| 11 | InternalError_UnknownCommand = 1,
|
|---|
| 12 | InternalError_InvalidData = 0,
|
|---|
| 13 |
|
|---|
| 14 | // general
|
|---|
| 15 | NoTurn = 2, // command only allowed during player's turn
|
|---|
| 16 | RulesViolation = 3, // general violation of game rules
|
|---|
| 17 | PrerequisitesMissed = 4, // the prerequisites for this command are not fully met
|
|---|
| 18 | InvalidLocation = 512, // location is not valid
|
|---|
| 19 |
|
|---|
| 20 | // unit movement
|
|---|
| 21 | NoTime_Move = 8, // normal unit move: too few movement points left
|
|---|
| 22 | NoTime_Load = 9, // load unit: too few movement points left
|
|---|
| 23 | DomainMismatch = 17, // move/attack: action not allowed for this unit domain
|
|---|
| 24 | NoNavigation = 25, // unit move: not possible, open sea without navigation
|
|---|
| 25 | NoRoad = 23, // unit move: not possible, no road
|
|---|
| 26 | NoCapturer = 18, // unit move: this type of unit is not allowed to capture a city
|
|---|
| 27 | ZoCViolation = 20, // unit move: not possible, ZoC violation
|
|---|
| 28 | TreatyViolation = 21, // move/attack: not possible, peace treaty violation
|
|---|
| 29 | SubmarineBlock = 19, // unit move: not possible, destination tile occupied by hidden foreign submarine
|
|---|
| 30 | StealthUnitBlock = 26, // unit move: not possible, destination tile occupied by foreign stealth unit
|
|---|
| 31 | NoLoadCapacity = 27, // load to transport: no more transport capacity
|
|---|
| 32 | NoWay = 513,
|
|---|
| 33 | RecoverFirst = 514,
|
|---|
| 34 | Incomplete = 515,
|
|---|
| 35 |
|
|---|
| 36 | // fighting
|
|---|
| 37 | NoTime_Attack = 10, // attack: no movement points left
|
|---|
| 38 | NoTime_Bombard = 11, // bombard city: too few movement points left
|
|---|
| 39 | NoTime_Expel = 12, // expel spy: too few movement points left
|
|---|
| 40 | NoBombarder = 28, // bombardment impossible because no attack power
|
|---|
| 41 |
|
|---|
| 42 | // settlers
|
|---|
| 43 | NoCityTerrain = 34, // found city: not possible in this terrain
|
|---|
| 44 | NoBridgeBuilding = 35,
|
|---|
| 45 | DeadLands = 22, // sStartJob: not possible, dead lands
|
|---|
| 46 | MaxSize = 32, // add to city: bigger size not allowed due to missing aqueduct/sewer
|
|---|
| 47 |
|
|---|
| 48 | // city
|
|---|
| 49 | RebuildSellOnlyOnce = 88, // sell/rebuild city improvement: only once per city and turn!
|
|---|
| 50 | UselessBuilding = 89, // city project: more advanced improvement already exists
|
|---|
| 51 | OutOfControl = 90, // buy/sell/rebuild improvement: not in anarchy, not in captured cities
|
|---|
| 52 | LocationNotAvailable = 80, // set exploited locations
|
|---|
| 53 | TooManyLocations = 81, // set exploited locations
|
|---|
| 54 |
|
|---|
| 55 | // model
|
|---|
| 56 | ResearchInProgress = 516, // blueprint can't be changed during military research
|
|---|
| 57 |
|
|---|
| 58 | // negotiation
|
|---|
| 59 | InvalidOffer = 48,
|
|---|
| 60 | OfferNotAcceptable = 49,
|
|---|
| 61 | CancelTreatyRush = 50,
|
|---|
| 62 | }
|
|---|
| 63 |
|
|---|
| 64 | struct PlayResult
|
|---|
| 65 | {
|
|---|
| 66 | readonly int code;
|
|---|
| 67 |
|
|---|
| 68 | public PlayResult(int code) { this.code = code; }
|
|---|
| 69 | public PlayResult(PlayError error) { this.code = (int)error & 0xFFFF; }
|
|---|
| 70 |
|
|---|
| 71 | public override string ToString()
|
|---|
| 72 | {
|
|---|
| 73 | if ((code & Protocol.rExecuted) != 0)
|
|---|
| 74 | return "OK";
|
|---|
| 75 | else
|
|---|
| 76 | return string.Format("{0}", Error);
|
|---|
| 77 | }
|
|---|
| 78 |
|
|---|
| 79 | public PlayError Error
|
|---|
| 80 | {
|
|---|
| 81 | get
|
|---|
| 82 | {
|
|---|
| 83 | if (OK)
|
|---|
| 84 | return PlayError.None;
|
|---|
| 85 | else
|
|---|
| 86 | return (PlayError)(code & 0xFFFF);
|
|---|
| 87 | }
|
|---|
| 88 | }
|
|---|
| 89 |
|
|---|
| 90 | public bool OK { get { return (code & Protocol.rExecuted) != 0; } }
|
|---|
| 91 | public bool Effective { get { return (code & Protocol.rEffective) != 0; } }
|
|---|
| 92 | public bool UnitRemoved { get { return (code & Protocol.rUnitRemoved) != 0; } }
|
|---|
| 93 | public bool EnemyDestroyed { get { return OK && (code & 0xFFFF) == Protocol.eEnemyDestroyed; } }
|
|---|
| 94 | public bool NewUnitOrCitySpotted { get { return (code & Protocol.rEnemySpotted) != 0; } }
|
|---|
| 95 |
|
|---|
| 96 | public static PlayResult Success { get { return new PlayResult(Protocol.rExecuted | Protocol.rEffective); } }
|
|---|
| 97 | public static PlayResult NoChange { get { return new PlayResult(Protocol.rExecuted); } }
|
|---|
| 98 | }
|
|---|
| 99 | }
|
|---|