empserver/include/file.h
Markus Armbruster a109de948b Remove option TREATIES
TREATIES has issues:

* Treaties can cover attack, assault, paradrop, board, lboard, fire,
  build (s|p|l|n) and enlist, but not bomb, launch, torpedo and
  enlistment centers.

* Usability is very poor.  While a treaty is in effect, every player
  action that violates a treaty condition triggers a prompt like this:

    This action is in contravention of  treaty #0 (with Curmudgeon)
    Do you wish to go ahead anyway? [yn]

  If you decline, the action is not executed.  If you accept, it is.
  In both cases, your decision is reported in the news.

  You cannot get rid of these prompts until the treaty expires.

* Virtually nobody uses them.

* Virtually unused code is buggy code.  There is at least one race
  condition: multifire() reads the firing sector, ship or land unit
  before the treaty prompt, and writes it back after, triggering a
  generation oops.  Any updates made by other threads while trechk()
  waits for input are wiped out, triggering a seqno mismatch oops.

* The treaty prompts could confuse smart clients that aren't prepared
  for them.  WinACE isn't, but is reported to work anyway at least
  common usage.  Ron Koenderink (the WinACE maintainer) suspects there
  could be a few situations where it will fail.

This feature is not earning its keep.  Remove it.  Drop command
treaty, consider treaty, offer treaty, xdump treaty, reject treaties.
Output of accept changed, obviously.

Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
2014-02-16 11:44:14 +01:00

236 lines
7.2 KiB
C

/*
* Empire - A multi-player, client/server Internet based war game.
* Copyright (C) 1986-2014, Dave Pare, Jeff Bailey, Thomas Ruschak,
* Ken Stevens, Steve McClure, Markus Armbruster
*
* Empire is free software: you can redistribute it and/or modify
* it under the terms of the GNU 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
* ---
*
* See files README, COPYING and CREDITS in the root of the source
* tree for related information and legal notices. It is expected
* that future projects/authors will amend these files as needed.
*
* ---
*
* file.h: Describes Empire tables (`files' for historical reasons)
*
* Known contributors to this file:
* Markus Armbruster, 2005-2012
*/
#ifndef FILE_H
#define FILE_H
#include <time.h>
struct empfile {
/* Members with immutable values */
int uid; /* Table ID */
char *name; /* Empire name (e.g., "land") */
char *pretty_name; /* prettier name, e.g. "land unit" */
char *file; /* file name, relative to gamedir for
game state, to builtindir for config */
struct castr *cadef; /* table column selectors (column meta-data) */
int base; /* view's base table, else EF_BAD */
int size; /* size of a table entry */
int nent; /* #table entries, -1 if variable */
int flags; /* only EFF_IMMUTABLE immutable, see below
for use of remaining bits */
/* Members whose values are fixed when the cache is mapped */
char *cache; /* pointer to cache */
int csize; /* cache size, in entries */
/* flags bits EFF_MEM, EFF_PRIVATE, EFF_NOTIME also fixed then */
/* Members whose values may vary throughout operation */
int baseid; /* id of first entry in cache */
int cids; /* # entries in cache */
int fids; /* # entries in table */
int fd; /* file descriptor, -1 if not open */
/* flags bit EFF_CUSTOM also varies */
/* User callbacks, may all be null */
/*
* Called after element initialization. ELT is the element.
* May modify the element.
*/
void (*oninit)(void *elt);
/*
* Called after read. ID is the element id, and ELT is the
* element read. May modify the element. Modifications are
* visible to caller of ef_read(), but have no effect on the file.
*/
void (*postread)(int id, void *elt);
/*
* Called before write. ID is the element id, OLD is the element
* being updated (null unless it is cached) and ELT is the element
* being written. May modify the element. Modifications will be
* visible to caller of ef_write() and are written to the file.
*/
void (*prewrite)(int id, void *old, void *elt);
/*
* Called after table size changed, with file type as argument.
*/
void (*onresize)(int type);
};
struct emptypedstr {
signed ef_type: 8;
unsigned seqno: 12;
unsigned generation: 12;
int uid;
time_t timestamp;
};
/*
* Flag bits for struct empfile member flags
* Immutable flags are properties of the table and thus cannot change.
* The remaining flags record how the table is being used.
*/
/* Immutable flags, fixed at compile-time */
/* Dereferencing entry address cast to struct emptypedstr * is safe */
#define EFF_TYPED bit(0)
/*
* EFF_XY / EFF_OWNER / EFF_GROUP assert that coordinates / owner /
* group of such a table's entries can be safely obtained by
* dereferencing the entry's address cast to struct empobj *.
*/
#define EFF_XY bit(1)
#define EFF_OWNER bit(2)
#define EFF_GROUP bit(3)
/* Table cache is allocated statically */
#define EFF_STATIC bit(4)
/* Table has a sentinel (all zero, not counted as elt), implies EFF_MEM */
#define EFF_SENTINEL bit(5)
/* All the immutable flags */
#define EFF_IMMUTABLE \
(EFF_TYPED | EFF_XY | EFF_OWNER | EFF_GROUP | EFF_STATIC | EFF_SENTINEL)
/* Flags set when table contents is mapped */
/* Table is entirely in memory */
#define EFF_MEM bit(8)
/* Table is privately mapped: changes don't affect the underlying file */
#define EFF_PRIVATE bit(9)
/* Table is customized (configuration tables only) */
#define EFF_CUSTOM bit(10)
/* Don't update timestamps */
#define EFF_NOTIME bit(11)
/* Transient flags, only occur in argument of ef_open() */
/* Create table file, clobbering any existing file */
#define EFF_CREATE bit(16)
/*
* Empire `file types'
* These are really table IDs. Some tables are backed by files, some
* are compiled into the server, some initialized from configuration
* files.
*/
enum {
/* Error value */
EF_BAD = -1,
/* Dynamic game data tables */
EF_SECTOR,
EF_SHIP,
EF_PLANE,
EF_LAND,
EF_NUKE,
EF_NEWS,
EF_TRADE,
EF_POWER,
EF_NATION,
EF_LOAN,
EF_MAP,
EF_BMAP,
EF_COMM,
EF_LOST,
EF_REALM,
EF_GAME,
EF_DYNMAX = EF_GAME,
/* Static game data (configuration) */
/* Order is relevant; see read_builtin_tables() */
EF_ITEM,
EF_PRODUCT,
EF_SECTOR_CHR,
EF_SHIP_CHR,
EF_PLANE_CHR,
EF_LAND_CHR,
EF_NUKE_CHR,
EF_NEWS_CHR,
EF_INFRASTRUCTURE,
EF_UPDATES, /* not actually static */
EF_TABLE,
EF_VERSION,
EF_META, /* not really configuration */
/* Symbol tables */
EF_AGREEMENT_STATUS,
EF_LAND_CHR_FLAGS,
EF_LEVEL,
EF_META_FLAGS,
EF_META_TYPE,
EF_MISSIONS,
EF_NATION_FLAGS,
EF_NATION_REJECTS,
EF_NATION_RELATIONS,
EF_NATION_STATUS,
EF_NUKE_CHR_FLAGS,
EF_PACKING,
EF_PAGE_HEADINGS,
EF_PLAGUE_STAGES,
EF_PLANE_CHR_FLAGS,
EF_PLANE_FLAGS,
EF_RESOURCES,
EF_RETREAT_FLAGS,
EF_SECTOR_NAVIGATION,
EF_SHIP_CHR_FLAGS,
/* Views */
EF_COUNTRY,
/* Number of types: */
EF_MAX
};
#define EF_IS_GAME_STATE(type) (EF_SECTOR <= (type) && (type) <= EF_DYNMAX)
#define EF_IS_VIEW(type) (empfile[(type)].base != EF_BAD)
extern struct castr *ef_cadef(int);
extern int ef_read(int, int, void *);
extern void ef_make_stale(void);
extern void ef_mark_fresh(int, void *);
extern void *ef_ptr(int, int);
extern char *ef_nameof(int);
extern char *ef_nameof_pretty(int);
extern time_t ef_mtime(int);
extern int ef_open(int, int);
extern int ef_open_view(int);
extern int ef_close(int);
extern int ef_flush(int);
extern void ef_blank(int, int, void *);
extern int ef_write(int, int, void *);
extern void ef_set_uid(int, void *, int);
extern int ef_extend(int, int);
extern int ef_ensure_space(int, int, int);
extern int ef_id_limit(int);
extern int ef_truncate(int, int);
extern int ef_nelem(int);
extern int ef_flags(int);
extern int ef_byname(char *);
extern int ef_byname_from(char *, int *);
extern int ef_verify_config(void);
extern int ef_verify_state(int);
extern int ef_elt_byname(int, char *);
extern struct empfile empfile[EF_MAX + 1];
extern void empfile_init(void);
extern void empfile_fixup(void);
#endif