]> git.pond.sub.org Git - empserver/blob - src/lib/subs/trechk.c
Update known contributors comment.
[empserver] / src / lib / subs / trechk.c
1 /*
2  *  Empire - A multi-player, client/server Internet based war game.
3  *  Copyright (C) 1986-2006, Dave Pare, Jeff Bailey, Thomas Ruschak,
4  *                           Ken Stevens, Steve McClure
5  *
6  *  This program is free software; you can redistribute it and/or modify
7  *  it under the terms of the GNU General Public License as published by
8  *  the Free Software Foundation; either version 2 of the License, or
9  *  (at your option) any later version.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  *  GNU General Public License for more details.
15  *
16  *  You should have received a copy of the GNU General Public License
17  *  along with this program; if not, write to the Free Software
18  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19  *
20  *  ---
21  *
22  *  See files README, COPYING and CREDITS in the root of the source
23  *  tree for related information and legal notices.  It is expected
24  *  that future projects/authors will amend these files as needed.
25  *
26  *  ---
27  *
28  *  trechk.c: Check to see if an actor has violated a treaty.
29  * 
30  *  Known contributors to this file: 
31  *      Steve McClure, 1998-1999
32  */
33
34 /*
35  * Check to see if an actor has a treaty forbidding a given action,
36  * and if so, see if the actor wishes to break the treaty.
37  * All applicable treaties are checked.  All treaties must be broken
38  * if the action is to be allowed.  Propsed treaties are warned about,
39  * but no mention of broken pending treaties are made in the news.
40  */
41
42 #include <config.h>
43
44 #include "misc.h"
45 #include "treaty.h"
46 #include "nat.h"
47 #include "news.h"
48 #include "file.h"
49 #include "xy.h"
50 #include "nsc.h"
51 #include "prototypes.h"
52 #include "optlist.h"
53
54 int
55 trechk(register natid actor, register natid victim, int provision)
56 {
57     register natid cn;
58     s_char buf[1024];
59     int news_verb;
60     int involved[MAXNOC];
61     struct trtstr treaty;
62     time_t now;
63     int conditions;
64     natid other;
65     int broken;
66     int applied;
67     struct nstr_item nstr;
68
69     if (!opt_TREATIES)
70         return 1;
71     (void)time(&now);
72     broken = 0;
73     applied = 0;
74     for (cn = 0; cn < MAXNOC; cn++)
75         involved[cn] = 0;
76     snxtitem_all(&nstr, EF_TREATY);
77     while (nxtitem(&nstr, &treaty)) {
78         if (treaty.trt_status == TS_FREE)
79             continue;
80         if (treaty.trt_exp < now)
81             continue;
82         if (actor == treaty.trt_cna) {
83             conditions = treaty.trt_acond;
84             other = treaty.trt_cnb;
85         } else if (actor == treaty.trt_cnb) {
86             conditions = treaty.trt_bcond;
87             other = treaty.trt_cna;
88         } else
89             continue;
90         if ((conditions & provision) == 0)
91             continue;
92         if (victim != other) {
93             switch (provision) {
94                 /* These are violations no matter who the victim is */
95             case NEWSHP:
96             case NEWLND:
97             case NEWNUK:
98             case NEWPLN:
99             case TRTENL:
100                 break;
101             default:
102                 /* The rest are only violations against the victim */
103                 continue;
104             }
105         }
106         /* treaty applies to actor */
107         applied++;
108         pr("This action is in contravention of ");
109         if (treaty.trt_status == TS_PROPOSED)
110             pr("pending ");
111         pr(" treaty #%d (with %s)\n", nstr.cur, cname(other));
112         getstring("Do you wish to go ahead anyway? [yn] ", buf);
113         if (*buf == 'n' || *buf == 'N')
114             broken = 0;
115         else
116             broken = 1;
117         if (treaty.trt_status == TS_SIGNED)
118             involved[other]++;
119     }
120     if (applied > 0) {
121         news_verb = N_HONOR_TRE;
122         if (broken > 0)
123             news_verb = N_VIOL_TRE;
124         for (cn = 0; cn < MAXNOC; cn++)
125             if (involved[cn] > 0)
126                 nreport(actor, news_verb, cn, 1);
127     }
128     if (applied && !broken) {
129         /*
130          * if any treaty applied, and none were broken
131          * the intended action is NOT performed.
132          */
133         return 0;
134     }
135     return 1;
136 }