From 25286be72adbcb4cf171676b83478efae656ab99 Mon Sep 17 00:00:00 2001 From: Satya Ortiz-Gagne Date: Thu, 6 Jun 2019 12:34:33 -0400 Subject: Implemented a StringableCode class, and OrderResults as its child objects - OK, NO_CONVOY, BOUNCE, VOID, CUT, DISLODGED, DISRUPTED, DISBAND, MAYBE --- diplomacy/utils/common.py | 58 ++++++++++++++++++++++++++++++++++++++++ diplomacy/utils/order_results.py | 42 +++++++++++++++++++++++++++++ 2 files changed, 100 insertions(+) create mode 100644 diplomacy/utils/order_results.py (limited to 'diplomacy/utils') diff --git a/diplomacy/utils/common.py b/diplomacy/utils/common.py index df2897a..e8d49d6 100644 --- a/diplomacy/utils/common.py +++ b/diplomacy/utils/common.py @@ -188,6 +188,64 @@ def str_cmp_class(compare_function): StringComparator.__name__ = 'StringComparator%s' % (id(compare_function)) return StringComparator +class StringableCode(): + """ Represents a stringable version of a code (with an optional message) """ + def __init__(self, code, message=None): + """ Build a StringableCode + :param code: int - code + :param message: Optional. human readable string message associated to the cide + """ + if isinstance(code, str) or message is None: + message = code + code = None + + if code is None: + message_parts = message.split(':') + if message_parts and message_parts[0].isdigit(): + code = int(message_parts[0]) + message = ':'.join(message_parts[1:]) + elif len(message_parts) == 1: + message = message_parts[0] + + self._code = code + self._message = message + + def __eq__(self, other): + """ Define the equal """ + if isinstance(other, StringableCode): + return self._code == other.code + return self._message == str(other) + + def __hash__(self): + """ Define the hash """ + return hash(self._message) + + def __mod__(self, values): + """ Define the modulus. Apply the modulus on the message """ + return StringableCode(self._code, self._message % values) + + def __str__(self): + """ Defines the str representation """ + return str(self.message) + + def __repr__(self): + """ Define the string representation """ + return '{}:{}'.format(self._code, self._message) + + @property + def code(self): + """ Return the code of the result """ + return self._code + + @property + def message(self): + """ Return the message of the result """ + return self._message + + def format(self, *values): + """ Format the message of the result """ + return StringableCode(self._code, self._message.format(*values)) + class Tornado(): """ Utilities for Tornado. """ diff --git a/diplomacy/utils/order_results.py b/diplomacy/utils/order_results.py new file mode 100644 index 0000000..fea2773 --- /dev/null +++ b/diplomacy/utils/order_results.py @@ -0,0 +1,42 @@ +# ============================================================================== +# Copyright (C) 2019 - Philip Paquette +# +# This program is free software: you can redistribute it and/or modify it under +# the terms of the GNU Affero General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) any +# later version. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +# FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +# details. +# +# You should have received a copy of the GNU Affero General Public License along +# with this program. If not, see . +# ============================================================================== +""" Results + - Contains the results labels and code used by the engine +""" +from diplomacy.utils.common import StringableCode + +# Constants +ORDER_RESULT_OFFSET = 10000 + +class OrderResult(StringableCode): + """ Represents an order result """ + def __init__(self, code, message): + """ Build a Order Result + :param code: int code of the order result + :param message: human readable string message associated to the order result + """ + super(OrderResult, self).__init__(code, message) + +OK = OrderResult(0, '') +NO_CONVOY = OrderResult(ORDER_RESULT_OFFSET + 1, 'no convoy') +BOUNCE = OrderResult(ORDER_RESULT_OFFSET + 2, 'bounce') +VOID = OrderResult(ORDER_RESULT_OFFSET + 3, 'void') +CUT = OrderResult(ORDER_RESULT_OFFSET + 4, 'cut') +DISLODGED = OrderResult(ORDER_RESULT_OFFSET + 5, 'dislodged') +DISRUPTED = OrderResult(ORDER_RESULT_OFFSET + 6, 'disrupted') +DISBAND = OrderResult(ORDER_RESULT_OFFSET + 7, 'disband') +MAYBE = OrderResult(ORDER_RESULT_OFFSET + 8, 'maybe') -- cgit v1.2.3