home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1994 March / Source_Code_CD-ROM_Walnut_Creek_March_1994.iso / compsrcs / games / volume13 / dominion / part18 < prev    next >
Encoding:
Internet Message Format  |  1992-02-10  |  60.4 KB

  1. Path: uunet!zephyr.ens.tek.com!master!saab!billr
  2. From: billr@saab.CNA.TEK.COM (Bill Randle)
  3. Newsgroups: comp.sources.games
  4. Subject: v13i054:  dominion - a multi-player world simulation game, Part18/28
  5. Message-ID: <2457@masterCNA.TEK.COM>
  6. Date: 11 Feb 92 18:26:04 GMT
  7. Sender: news@masterCNA.TEK.COM
  8. Lines: 2341
  9. Approved: billr@saab.CNA.TEK.COM
  10.  
  11. Submitted-by: rosalia@dirac.physics.sunysb.edu (Mark Galassi)
  12. Posting-number: Volume 13, Issue 54
  13. Archive-name: dominion/Part18
  14. Environment: Unix, curses
  15.  
  16.  
  17.  
  18. #! /bin/sh
  19. # This is a shell archive.  Remove anything before this line, then unpack
  20. # it by saving it into a file and typing "sh file".  To overwrite existing
  21. # files, type "sh file -c".  You can also feed this as standard input via
  22. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  23. # will see the following message at the end:
  24. #        "End of archive 18 (of 28)."
  25. # Contents:  mag_Master nation.c transport.c
  26. # Wrapped by billr@saab on Tue Feb 11 10:14:56 1992
  27. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  28. if test -f 'mag_Master' -a "${1}" != "-c" ; then 
  29.   echo shar: Will not clobber existing file \"'mag_Master'\"
  30. else
  31. echo shar: Extracting \"'mag_Master'\" \(715 characters\)
  32. sed "s/^X//" >'mag_Master' <<'END_OF_FILE'
  33. X# this file describes magic powers available to magical order of Master,
  34. X# which has all magic available at no cost.
  35. X#
  36. X# the format is:
  37. X# name level cost        (for spirits)
  38. X# name level cost duration    (for spells)
  39. X#
  40. X# where `level' is the magical skill level at which you get the power,
  41. X# and `cost' is the cost in spell points to use the power.
  42. X#
  43. Xsummon_gargoyle 0 0
  44. Xsummon_giant_mole 0 0
  45. Xsummon_umber_hulk 0 0
  46. Xhide_army 0 0 -1
  47. Xhide_sector 0 0 -1
  48. Xcmetal 0 0 -1
  49. Xcjewels 0 0 -1
  50. Xmag_bonus 0 0 -1
  51. Xfly_army 0 0 -1
  52. Xcaltitude 0 0 -1
  53. Xsummon_stone_giant 0 0
  54. Xsummon_earth_elemental 0 0
  55. Xsummon_mountain 0 0
  56. Xsummon_roc 0 0
  57. Xsummon_eagle 0 0
  58. Xsummon_cloud_giant 0 0
  59. Xsummon_wyvern 0 0
  60. Xsummon_areal_serpent 0 0
  61. Xsummon_air_elemental 0 0
  62. END_OF_FILE
  63. if test 715 -ne `wc -c <'mag_Master'`; then
  64.     echo shar: \"'mag_Master'\" unpacked with wrong size!
  65. fi
  66. # end of 'mag_Master'
  67. fi
  68. if test -f 'nation.c' -a "${1}" != "-c" ; then 
  69.   echo shar: Will not clobber existing file \"'nation.c'\"
  70. else
  71. echo shar: Extracting \"'nation.c'\" \(28685 characters\)
  72. sed "s/^X//" >'nation.c' <<'END_OF_FILE'
  73. X/* nation.c -- commands needed to remember changes to a nation;
  74. X               basically a lot of routines to parse the exec file
  75. X */
  76. X
  77. X/*
  78. X * Copyright (C) 1990 Free Software Foundation, Inc.
  79. X * Written by the dominion project.
  80. X *
  81. X * This file is part of dominion.
  82. X *
  83. X * dominion is free software; you can redistribute it and/or
  84. X * modify it under the terms of the GNU General Public License as published
  85. X * by the Free Software Foundation; either version 1, or (at your option)
  86. X * any later version.
  87. X *
  88. X * This software is distributed in the hope that it will be useful,
  89. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  90. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  91. X * GNU General Public License for more details.
  92. X *
  93. X * You should have received a copy of the GNU General Public License
  94. X * along with this software; see the file COPYING.  If not, write to
  95. X * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  96. X */
  97. X
  98. X#include "dominion.h"
  99. X#include "misc.h"
  100. X#include "army.h"
  101. Xextern Sworld world;
  102. Xextern int debug;
  103. X#include <stdio.h>
  104. X#include <ctype.h>
  105. X
  106. Xstruct exec_cmd { char name[NAMELEN]; int (*func)(); };
  107. X
  108. Xint cmd_amove(), cmd_astat(), cmd_aflag_set(), cmd_aflag_clear(),
  109. X  cmd_flag_set_sector(), cmd_flag_clear_sector(),
  110. X  cmd_acargo(), cmd_sname(),  cmd_aname(), cmd_charity(),
  111. X  cmd_taxrate(), cmd_desig_sector(), cmd_amake(),
  112. X  cmd_cpeople_sector(), cmd_cowner_sector(), cmd_csoil_sector(),
  113. X  cmd_cmetal_sector(), cmd_cjewels_sector(), cmd_caltitude_sector(),
  114. X  cmd_cmoney(), cmd_cmetal(), cmd_cjewels(),
  115. X  cmd_cur_tech_money (), cmd_cur_mag_money (), cmd_cur_mag_jewels (),
  116. X  cmd_cur_tech_metal (),
  117. X  cmd_cur_spy_money (),
  118. X  cmd_cspell_pts(), cmd_ctech_skill(), cmd_cmag_skill(),
  119. X  cmd_cfood(), cmd_tech_money(), cmd_tech_metal(),
  120. X  cmd_spy_money(),
  121. X  cmd_mag_money(), cmd_mag_jewels(), cmd_cmine(), cmd_cfarm(),
  122. X  cmd_cspeed(), cmd_nation_name(), cmd_nation_leader(), cmd_nation_order(),
  123. X  cmd_nation_mark(), cmd_set_npc(), cmd_clear_npc(), cmd_npc_param(),
  124. X  cmd_ccombat(), cmd_cattack(), cmd_cdefense(), cmd_crepro(), cmd_cmortality(),
  125. X  cmd_cintel(), cmd_cmag_apt(), cmd_cstrength(),
  126. X  cmd_new_army_type(), cmd_aincrease(), cmd_amerge(), cmd_asplit(),
  127. X  cmd_adisband(),
  128. X  cmd_cabonus(), cmd_cfort_sector(), cmd_croads_sector(), cmd_cpass(),
  129. X  cmd_destroy(), cmd_acastle ();
  130. X
  131. Xstatic struct exec_cmd commands[] = {
  132. X  {"AMOVE", cmd_amove} , {"ASTAT", cmd_astat} , {"AMAKE", cmd_amake} ,
  133. X  {"AFLAG_SET", cmd_aflag_set} , {"AFLAG_CLEAR", cmd_aflag_clear} ,
  134. X  {"FLAG_SET_SECTOR", cmd_flag_set_sector} ,
  135. X  {"FLAG_CLEAR_SECTOR", cmd_flag_clear_sector} ,
  136. X  {"ACARGO", cmd_acargo} ,
  137. X  {"SNAME", cmd_sname} , {"ANAME", cmd_aname},
  138. X  {"DESIG_SECTOR", cmd_desig_sector} ,
  139. X  {"CHARITY", cmd_charity} , {"TAXRATE", cmd_taxrate},
  140. X  {"CMONEY", cmd_cmoney} , {"CJEWELS", cmd_cjewels}, {"CMETAL", cmd_cmetal},
  141. X  {"CUR_MAGR&Dmoney", cmd_cur_mag_money},
  142. X  {"CUR_TECHR&Dmoney", cmd_cur_tech_money},
  143. X  {"CUR_TECHR&Dmetal", cmd_cur_tech_metal},
  144. X  {"CUR_MAGR&Djewels", cmd_cur_mag_jewels},
  145. X  {"CUR_SPYR&Dmoney", cmd_cur_spy_money},
  146. X  {"CSPELL_PTS", cmd_cspell_pts}, {"CTECH_SKILL", cmd_ctech_skill} ,
  147. X  {"CMAG_SKILL", cmd_cmag_skill} ,
  148. X  {"CFOOD", cmd_cfood} , {"TECHR&Dmoney", cmd_tech_money} ,
  149. X  {"TECHR&Dmetal", cmd_tech_metal} , {"SPYR&Dmoney", cmd_spy_money} ,
  150. X  {"MAGR&Dmoney" , cmd_mag_money} , {"MAGR&Djewels" , cmd_mag_jewels} ,
  151. X  {"CMINE" , cmd_cmine} , {"CFARM" , cmd_cfarm} , {"CSPEED", cmd_cspeed} ,
  152. X  {"NATION_NAME", cmd_nation_name} , {"NATION_LEADER", cmd_nation_leader} ,
  153. X  {"NATION_ORDER", cmd_nation_order} , {"NATION_MARK", cmd_nation_mark} ,
  154. X  {"SET_NPC", cmd_set_npc} , {"CLEAR_NPC", cmd_clear_npc} ,
  155. X  {"NPC_PARAM", cmd_npc_param} ,
  156. X  {"CATTACK" , cmd_cattack} , {"CDEFENSE" , cmd_cdefense} , {"CCOMBAT" , cmd_ccombat} ,
  157. X  {"CREPRO" , cmd_crepro} , {"CINTEL", cmd_cintel} ,
  158. X  {"CMAG_APT", cmd_cmag_apt} , {"CSTRENGTH", cmd_cstrength} ,
  159. X  {"CMORTALITY" , cmd_cmortality} , {"CPEOPLE_SECTOR" , cmd_cpeople_sector} ,
  160. X  {"COWNER_SECTOR" , cmd_cowner_sector} , {"CSOIL_SECTOR", cmd_csoil_sector} ,
  161. X  {"CMETAL_SECTOR", cmd_cmetal_sector} ,
  162. X  {"CJEWELS_SECTOR", cmd_cjewels_sector} ,
  163. X  {"CALTITUDE_SECTOR", cmd_caltitude_sector} ,
  164. X  {"NEW_ARMY_TYPE", cmd_new_army_type} , {"AMERGE", cmd_amerge} ,
  165. X  {"AINCREASE", cmd_aincrease},
  166. X  {"ASPLIT", cmd_asplit} , {"ADISBAND", cmd_adisband} ,
  167. X  {"CABONUS", cmd_cabonus} ,
  168. X  {"CFORT_SECTOR", cmd_cfort_sector} , {"CROADS_SECTOR", cmd_croads_sector} ,
  169. X  {"CPASS", cmd_cpass} , {"DESTROY", cmd_destroy},
  170. X  {"ACASTLE", cmd_acastle}
  171. X};
  172. X
  173. X
  174. X/*******************************************************/
  175. X/* gets nation data for nation 'id', put it into '*np' */
  176. X/* takes in an integer nation id, and a pointer to a   */
  177. X/* nation structure.                                   */
  178. X/*******************************************************/
  179. Xload_nation(id, np)
  180. X     int id;
  181. X     Snation *np;
  182. X{
  183. X  FILE *exec_file;
  184. X  struct argument args[N_EXEC_ARGS];
  185. X  char filename[NAMELEN];
  186. X  int argc, i;
  187. X  extern Suser user;
  188. X
  189. X  *np = world.nations[id];
  190. X  user.np = np;        /* hmm.. must cleanup use of "Suser" in update */
  191. X    /* remember what the initial values were, before reading the exec file */
  192. X  user.init_money = user.np->money;
  193. X  user.init_metal = user.np->metal;
  194. X  user.init_jewels = user.np->jewels;
  195. X  user.init_food = user.np->food;
  196. X  user.id = np->id;
  197. X  load_options(np);
  198. X
  199. X  sprintf(filename, "exec/exec%d", np->id);
  200. X  exec_file = fopen(filename, "r");
  201. X  if (!exec_file && np->npc_flag == 0) {
  202. X    fprintf(stderr, "Nation %d (%s) did not move this turn.\n", np->id, np->name); }
  203. X  else {
  204. X    while (argc = getexec(exec_file, args) != -1) {
  205. X      run_exec_line(np, args);
  206. X    }
  207. X    if (exec_file != NULL) { fclose(exec_file); }
  208. X  }
  209. X}
  210. X
  211. X/****************************************************************/
  212. X/* this takes a pointer to the exec file and a pointer to an    */
  213. X/* array of argument structures.  The structures are filled in  */
  214. X/* with the arguments of the next line of the file.  The        */
  215. X/* function returns an integer which is the number of arguments */
  216. X/****************************************************************/
  217. Xint getexec(fp, args)
  218. XFILE *fp;
  219. Xstruct argument args[];
  220. X{
  221. X  char buff[EXECLEN];
  222. X  if (fp == NULL) {
  223. X    return (-1);
  224. X  }
  225. X  if (fgets(buff, EXECLEN, fp) != NULL) {
  226. X    parse_exec_line(buff, args);
  227. X  }
  228. X  else return(-1);
  229. X}
  230. X
  231. X
  232. X
  233. X  /* this takes the exec line args (already parsed) and runs it */
  234. Xrun_exec_line(np, args)
  235. X     Snation *np;
  236. X     struct argument args[];
  237. X{
  238. X  int i, found = 0;
  239. X
  240. X  for (i=0; i < sizeof(commands)/sizeof(struct exec_cmd); i++) {
  241. X    if (!(strcmp(commands[i].name, args[0].data.str))) {
  242. X      found = 1;
  243. X      (*commands[i].func)(np, args);
  244. X    }
  245. X  }
  246. X  if (!found) {
  247. X    printf("Error: exec command <%s> not implemented\n", args[0].data.str);
  248. X  }
  249. X}
  250. X
  251. X#ifdef AMIGA
  252. X#define sscanf sscanf2
  253. Xsscanf2(data, terminate, result)
  254. X     char *data, *terminate, *result;
  255. X{
  256. X  int i;
  257. X  
  258. X  terminate += 3;
  259. X  for (;;) {
  260. X    for (i=0; i<strlen(terminate); i++)
  261. X      if (*data == terminate[i]) return;
  262. X    *result = *data;
  263. X    data++;
  264. X    result++;
  265. X    *result = '\0';
  266. X  }
  267. X}
  268. X#endif
  269. X
  270. X
  271. X  /* this parses a single exec line */
  272. Xparse_exec_line(line, args)
  273. X     char line[];
  274. X     struct argument args[];
  275. X{
  276. X  char cmd_str[NAMELEN], arg_tmp[NAMELEN];
  277. X  int count = 0, place;
  278. X
  279. X    /* make sure there is a newline at the end of this line */
  280. X  if (line[strlen(line)-1] != '\n') {
  281. X    line[strlen(line)+1] = '\0'; /* extend the string */
  282. X    line[strlen(line)] = '\n'; /* put the newline in */
  283. X  }
  284. X  sscanf(line, "%[^:]", args[0].data.str);
  285. X  place = strlen(args[0].data.str)+1;
  286. X  args[0].type = TXT;
  287. X  do {
  288. X    sscanf(&line[place], "%[^:\n]", arg_tmp);
  289. X    place += strlen(arg_tmp)+1;
  290. X    count++;
  291. X    if (isdigit(arg_tmp[0]) || (arg_tmp[0] == '-')) {
  292. X      args[count].type = NUM;
  293. X      args[count].data.num = atoi(arg_tmp);
  294. X    }
  295. X    else {
  296. X      args[count].type = TXT;
  297. X      strcpy(args[count].data.str, arg_tmp);
  298. X    }
  299. X  } while (place+1 < strlen(line));
  300. X  return(count);
  301. X}
  302. X
  303. X
  304. X
  305. X/******************************************************************/
  306. X/* this takes the name of a nation (a pointer to an array of      */
  307. X/* characters) and returns the id number of that nation.          */
  308. X/******************************************************************/
  309. Xint get_nation_id(name)        /* finds id, given name */
  310. X     char name[];
  311. X{
  312. X  int i;
  313. X
  314. X  for (i = 0; i < world.n_nations; ++i) {
  315. X    if (!strcmp(world.nations[i].name, name)) {
  316. X      return i;        /* found it! */
  317. X    }
  318. X  }
  319. X  return -1;            /* it's not there */
  320. X}
  321. X
  322. X  /* rename a sector */
  323. Xcmd_sname(np, args)
  324. X     Snation *np;
  325. X     struct argument args[];
  326. X{
  327. X  int x, y;
  328. X  char name[NAMELEN];
  329. X
  330. X  x = args[1].data.num;
  331. X  y = args[2].data.num;
  332. X  strcpy (name, args[3].data.str);
  333. X  
  334. X  if (debug) printf ("Naming sector %d,%d as %s.\n", x, y, name); 
  335. X  strcpy(world.map[x][y].name, name);
  336. X}
  337. X
  338. X  /* rename an army */
  339. Xcmd_aname(np, args)
  340. X     Snation *np;
  341. X     struct argument args[];
  342. X{
  343. X  int id;
  344. X  char *name;
  345. X  Sarmy *ap, *get_army();
  346. X
  347. X  id = args[1].data.num;
  348. X  name = args[2].data.str;
  349. X  
  350. X  if (ap = get_army(np, id)) {
  351. X    if (debug) printf ("Naming army %d as %s.\n", id, name);
  352. X    strcpy(ap->name, name);
  353. X  } else {
  354. X    printf("funny:  cannot find army %d\n", id);
  355. X  }
  356. X}
  357. X
  358. X
  359. X/* Move an army... change it's move points to the move points left, which
  360. X   is given in the exec string. */
  361. Xcmd_amove(np, args)
  362. X     Snation *np;
  363. X     struct argument args[];
  364. X{
  365. X  Sarmy *armypt;
  366. X  Ssector *sp;
  367. X  int a, x, y, fm;
  368. X  
  369. X  a = args[1].data.num;        /* army number */
  370. X  x = args[2].data.num;        /* new x coordinate */
  371. X  y = args[3].data.num;        /* new y coordinate */
  372. X  fm = args[4].data.num;    /* final moves */
  373. X  armypt = np->armies;
  374. X  while (armypt->id != a && armypt->next != NULL) armypt = armypt->next;
  375. X  if (armypt->id == a) {
  376. X    if (debug) {
  377. X      printf ("Moving army %d from %d,%d to %d,%d\n", a, armypt->pos.x,
  378. X        armypt->pos.y, x, y);
  379. X    }
  380. X    sp = &(world.map[armypt->pos.x][armypt->pos.y]);
  381. X    delete_army_sector(sp, armypt);
  382. X
  383. X    armypt->pos.x = x;
  384. X    armypt->pos.y = y;
  385. X    armypt->mvpts = fm;
  386. X    sp = &(world.map[x][y]);
  387. X    insert_army_sector(sp, armypt);
  388. X  }
  389. X  else printf ("Error! Could not find army!\n"); 
  390. X}
  391. X
  392. X
  393. X/* Change status of an army... if the army is being changed to OCCUPY mode,
  394. X   and it is _already_ in occupy mode, DO NOT change it's move ratio!
  395. X   Otherwise set the move ratio, change the moves left to zero, and
  396. X   change the status. */
  397. Xcmd_astat(np, args)
  398. X     Snation *np;
  399. X     struct argument args[];
  400. X{
  401. X  int a, s;
  402. X  Sarmy *armypt, *get_army();
  403. X  
  404. X  a = args[1].data.num;
  405. X  s = args[2].data.num;
  406. X  if (debug) printf ("Changing status of army %d to %d\n", a, s);
  407. X  armypt = get_army(np, a);
  408. X  if (armypt) {
  409. X    if (s == A_OCCUPY && armypt->status != A_OCCUPY) {
  410. X      armypt->mvratio =
  411. X    (int)(100 * (float)(armypt->mvpts) / basic_move_rate(np) );
  412. X      armypt->mvpts = 0;
  413. X    }
  414. X    armypt->status = s;
  415. X  } else {
  416. X    printf("Trying to change status on army %d which does not exist\n", a);
  417. X  }
  418. X}
  419. X
  420. X  /* Set/clear a flag of an army, such as AF_HIDDEN, AF_FLIGHT and so on... */
  421. Xcmd_aflag_set(np, args)
  422. X     Snation *np;
  423. X     struct argument args[];
  424. X{
  425. X  int id, flag;
  426. X  Sarmy *armypt, *get_army();
  427. X  
  428. X  id = args[1].data.num;
  429. X  flag = args[2].data.num;
  430. X  if (debug) printf ("Setting bit %x of army %d\n", flag, id);
  431. X  if (armypt = get_army(np, id)) {
  432. X    armypt->flags |= flag;
  433. X  }
  434. X}
  435. X
  436. Xcmd_aflag_clear(np, args)
  437. X     Snation *np;
  438. X     struct argument args[];
  439. X{
  440. X  int id, flag;
  441. X  Sarmy *armypt, *get_army();
  442. X  
  443. X  id = args[1].data.num;
  444. X  flag = args[2].data.num;
  445. X  if (debug) printf ("Clearing bit %x of army %d\n", flag, id);
  446. X  if (armypt = get_army(np, id)) {
  447. X    armypt->flags &= ~flag;
  448. X  }
  449. X}
  450. X
  451. X  /* Set/clear a flag of a sector, such as SF_HIDDEN, SF_BUBBLE and so on... */
  452. Xcmd_flag_set_sector(np, args)
  453. X     Snation *np;
  454. X     struct argument args[];
  455. X{
  456. X  int x, y, flag;
  457. X  Ssector *sp;
  458. X  
  459. X  x = args[1].data.num;
  460. X  y = args[2].data.num;
  461. X  flag = args[3].data.num;
  462. X  sp = &world.map[x][y];
  463. X  sp->flags |= flag;
  464. X}
  465. X
  466. Xcmd_flag_clear_sector(np, args)
  467. X     Snation *np;
  468. X     struct argument args[];
  469. X{
  470. X  int x, y, flag;
  471. X  Ssector *sp;
  472. X  
  473. X  x = args[1].data.num;
  474. X  y = args[2].data.num;
  475. X  flag = args[3].data.num;
  476. X  sp = &world.map[x][y];
  477. X  sp->flags &= ~flag;
  478. X}
  479. X
  480. X  /* Change cargo of an army */
  481. Xcmd_acargo(np, args)
  482. X     Snation *np;
  483. X     struct argument args[];
  484. X{
  485. X  int id;
  486. X  Sarmy *armypt, *get_army();
  487. X  
  488. X  id = args[1].data.num;
  489. X
  490. X  if (debug) printf ("Changing cargo of army %d\n", id);
  491. X  if ((armypt = get_army(np, id)) != NULL) {
  492. X    armypt->cargo.money = args[2].data.num;
  493. X    armypt->cargo.metal = args[3].data.num;
  494. X    armypt->cargo.jewels = args[4].data.num;
  495. X    armypt->cargo.food = args[5].data.num;
  496. X    armypt->cargo.people = args[6].data.num;
  497. X    armypt->cargo.army = args[7].data.num;
  498. X    armypt->cargo.title.x = args[8].data.num;
  499. X    armypt->cargo.title.y = args[9].data.num;
  500. X  } else {
  501. X    printf("[%s] Could not find army %d, nation %d\n", args[0].data.str,
  502. X       id, np->id);
  503. X  }
  504. X}
  505. X
  506. Xcmd_taxrate(np, args)
  507. X     struct argument args[];
  508. X     Snation *np;
  509. X{
  510. X  int t;
  511. X
  512. X  t = args[1].data.num;  
  513. X  if (debug) printf ("Taxes changed from %d to %d.\n", np->taxes, t);
  514. X  np->taxes = t;
  515. X}
  516. X
  517. X
  518. X
  519. Xcmd_charity(np, args)
  520. X     Snation *np;
  521. X     struct argument args[];
  522. X{
  523. X  int c;
  524. X  
  525. X  c = args[1].data.num;
  526. X  if (debug) printf ("Charity changed from %d to %d.\n", np->charity, c);
  527. X  np->charity = c;
  528. X}
  529. X
  530. X
  531. Xcmd_desig_sector(np, args)
  532. X     Snation *np;
  533. X     struct argument args[];
  534. X{
  535. X  int x, y, d;
  536. X  Snation *owner_np;
  537. X
  538. X  x = args[1].data.num;
  539. X  y = args[2].data.num;
  540. X  d = args[3].data.num;        /* the new designation */
  541. X  owner_np = &world.nations[world.map[x][y].owner];
  542. X  if (debug) printf ("Redesignating %d,%d to %d.\n", x, y, d);
  543. X  world.map[x][y].designation = d;
  544. X    /* special case for capital: */
  545. X  if (d == D_CAPITAL) {
  546. X    owner_np->capital.x = x;    /* make sure Gamemaster does not get it */
  547. X    owner_np->capital.y = y;
  548. X  }
  549. X}
  550. X
  551. X
  552. Xcmd_amake(np, args)
  553. X     Snation *np;
  554. X     struct argument args[];
  555. X{
  556. X  Sarmy army, make_army();
  557. X  Ssector *sp;
  558. X  int a, no_sold, x, y;
  559. X  char *type, *name;
  560. X  
  561. X  a = args[1].data.num;        /* army number */
  562. X  no_sold = args[2].data.num;    /* number of soldiers drafted */
  563. X  x = args[3].data.num;        /* x coordinate where army is drafted */
  564. X  y = args[4].data.num;        /* y coordinate where army is drafted */
  565. X  type = args[5].data.str;    /* army type */
  566. X  name = args[6].data.str;    /* army name */
  567. X
  568. X  sp = &(world.map[x][y]);
  569. X  army = make_army(type,name,no_sold,A_DEFEND,np->id,sp->loc);
  570. X/*  army.id  = free_army_id(np); */
  571. X  army.id = a;
  572. X  army.next = NULL;
  573. X
  574. X  if (debug) printf("Permanently drafting army #%d\n",army.id);
  575. X  if (np->armies == NULL) {
  576. X    np->armies = (Sarmy *) malloc(sizeof(Sarmy));
  577. X    *(np->armies) = army;
  578. X  } else {
  579. X    insert_army_nation(np, &army, a);
  580. X  }
  581. X  insert_army_sector(sp, &army);
  582. X  ++np->n_armies;
  583. X}
  584. X
  585. Xcmd_cmoney(np, args)
  586. X     Snation *np;
  587. X     struct argument args[];
  588. X{
  589. X  int change, nat_id;
  590. X
  591. X  nat_id = args[1].data.num;
  592. X  change = args[2].data.num;    /* changed money */
  593. X  np = &world.nations[nat_id];
  594. X     
  595. X  np->money = np->money + change;
  596. X  if (debug) printf("New nation money (after difference of %d) = %d\n",
  597. X     change,np->money);
  598. X}
  599. X
  600. Xcmd_cmetal(np, args)
  601. X     Snation *np;
  602. X     struct argument args[];
  603. X{
  604. X  int change, nat_id;
  605. X
  606. X  nat_id = args[1].data.num;
  607. X  change = args[2].data.num;   /* changed money */
  608. X  np = &world.nations[nat_id];
  609. X  
  610. X  np->metal = np->metal + change;
  611. X  if (debug) printf("New nation metal (after difference %d) = %d\n",
  612. X     change,np->metal);
  613. X}
  614. X
  615. Xcmd_cjewels(np, args)
  616. X     Snation *np;
  617. X     struct argument args[];
  618. X{
  619. X  int change, nat_id;
  620. X
  621. X  nat_id = args[1].data.num;
  622. X  change = args[2].data.num;   /* changed money */
  623. X  np = &world.nations[nat_id];
  624. X  
  625. X  np->jewels = np->jewels + change;
  626. X  if (debug) printf("New nation jewel (after difference %d) = %d\n",
  627. X     change,np->jewels);
  628. X}
  629. X
  630. Xcmd_cspell_pts(np, args)
  631. X     Snation *np;
  632. X     struct argument args[];
  633. X{
  634. X  int change, nat_id;
  635. X
  636. X  nat_id = args[1].data.num;
  637. X  change = args[2].data.num;   /* changed money */
  638. X  np = &world.nations[nat_id];
  639. X  
  640. X  np->spell_pts = np->spell_pts + change;
  641. X  if (debug) printf("New nation spell pts (after difference %d) = %d\n",
  642. X            change, np->spell_pts);
  643. X}
  644. X
  645. Xcmd_ctech_skill(np, args)
  646. X     Snation *np;
  647. X     struct argument args[];
  648. X{
  649. X  int change, nat_id;
  650. X
  651. X  nat_id = args[1].data.num;
  652. X  change = args[2].data.num;   /* changed money */
  653. X  np = &world.nations[nat_id];
  654. X  
  655. X  np->tech_skill = np->tech_skill + change;
  656. X}
  657. X
  658. Xcmd_cmag_skill(np, args)
  659. X     Snation *np;
  660. X     struct argument args[];
  661. X{
  662. X  int change, nat_id;
  663. X
  664. X  nat_id = args[1].data.num;
  665. X  change = args[2].data.num;   /* changed money */
  666. X  np = &world.nations[nat_id];
  667. X  
  668. X  np->mag_skill = np->mag_skill + change;
  669. X}
  670. X
  671. Xcmd_cfood(np, args)
  672. X     Snation *np;
  673. X     struct argument args[];
  674. X{
  675. X  int change, nat_id;
  676. X
  677. X  nat_id = args[1].data.num;
  678. X  change = args[2].data.num;   /* changed money */
  679. X  np = &world.nations[nat_id];
  680. X  
  681. X  np->food = np->food + change;
  682. X  if (debug) printf("New nation food (after difference %d) = %d\n",
  683. X     change,np->food);
  684. X}
  685. X
  686. Xcmd_tech_money(np,args)
  687. X     Snation *np;
  688. X     struct argument args[];
  689. X{
  690. X  np->tech_r_d = args[1].data.num;
  691. X  if (debug) printf("Tech R&D money changed to %d\n",np->tech_r_d);
  692. X}
  693. X
  694. X
  695. Xcmd_tech_metal(np,args)
  696. X     Snation *np;
  697. X     struct argument args[];
  698. X{
  699. X  np->tech_r_d_metal = args[1].data.num;
  700. X  if (debug) printf("Tech R&D metal changed to %d\n",np->tech_r_d_metal);
  701. X}
  702. X
  703. X
  704. Xcmd_spy_money(np,args)
  705. X     Snation *np;
  706. X     struct argument args[];
  707. X{
  708. X     np->spy_r_d = args[1].data.num;
  709. X   }
  710. X
  711. X
  712. Xcmd_mag_money(np,args)
  713. X     Snation *np;
  714. X     struct argument args[];
  715. X{
  716. X  np->mag_r_d = args[1].data.num;
  717. X  if (debug) printf("Magic money changed to %d\n",np->mag_r_d);
  718. X}
  719. X
  720. Xcmd_mag_jewels(np,args)
  721. X     Snation *np;
  722. X     struct argument args[];
  723. X{
  724. X  np->mag_r_d_jewels = args[1].data.num;
  725. X  if (debug) printf("Magic jewels changed to %d\n",np->mag_r_d_jewels);
  726. X}
  727. X
  728. Xcmd_cmine(np, args)
  729. X     Snation *np;
  730. X     struct argument args[];
  731. X{
  732. X  np->mine_skill += args[1].data.num;
  733. X}
  734. Xcmd_cfarm(np, args)
  735. X     Snation *np;
  736. X     struct argument args[];
  737. X{
  738. X  np->farm_skill += args[1].data.num;
  739. X}
  740. Xcmd_cspeed(np, args)
  741. X     Snation *np;
  742. X     struct argument args[];
  743. X{
  744. X  np->race.speed += args[1].data.num;
  745. X}
  746. X
  747. Xcmd_nation_name(np, args)
  748. X     Snation *np;
  749. X     struct argument args[];
  750. X{
  751. X  Snation *changed_np = &world.nations[args[1].data.num];
  752. X  strcpy(changed_np->name, args[2].data.str);
  753. X}
  754. X
  755. Xcmd_nation_leader(np, args)
  756. X     Snation *np;
  757. X     struct argument args[];
  758. X{
  759. X  Snation *changed_np = &world.nations[args[1].data.num];
  760. X  strcpy(changed_np->leader, args[2].data.str);
  761. X}
  762. X
  763. Xcmd_nation_order(np, args)    /* change magic order */
  764. X     Snation *np;
  765. X     struct argument args[];
  766. X{
  767. X  Snation *changed_np = &world.nations[args[1].data.num];
  768. X  strcpy(changed_np->mag_order, args[2].data.str);
  769. X}
  770. X
  771. Xcmd_nation_mark(np, args)    /* change a nation's mark */
  772. X     Snation *np;
  773. X     struct argument args[];
  774. X{
  775. X  Snation *changed_np = &world.nations[args[1].data.num];
  776. X  changed_np->mark = args[2].data.str[0];
  777. X}
  778. X
  779. X  /* set and clear the npc flag on a nation */
  780. Xcmd_set_npc(np, args)
  781. X     Snation *np;
  782. X     struct argument args[];
  783. X{
  784. X  Snation *changed_nation = &world.nations[args[1].data.num];
  785. X
  786. X  changed_nation->npc_flag = 1;
  787. X}
  788. X
  789. Xcmd_clear_npc(np, args)
  790. X     Snation *np;
  791. X     struct argument args[];
  792. X{
  793. X  Snation *changed_nation = &world.nations[args[1].data.num];
  794. X
  795. X  changed_nation->npc_flag = 0;
  796. X}
  797. X
  798. Xcmd_npc_param(np, args)
  799. X     Snation *np;
  800. X     struct argument args[];
  801. X{
  802. X  Snation *changed_nation = &world.nations[args[1].data.num];
  803. X
  804. X  changed_nation->npc_agg = args[2].data.num;
  805. X  changed_nation->npc_exp = args[3].data.num;
  806. X  changed_nation->npc_iso = args[4].data.num;
  807. X}
  808. X
  809. X  /* change in a nation's fight bonus */
  810. Xcmd_cattack(np, args)
  811. X     Snation *np;
  812. X     struct argument args[];
  813. X{
  814. X  np->attack += args[1].data.num;
  815. X}
  816. X
  817. Xcmd_cdefense(np, args)
  818. X     Snation *np;
  819. X     struct argument args[];
  820. X{
  821. X  np->defense += args[1].data.num;
  822. X}
  823. X
  824. Xcmd_ccombat(np, args)
  825. X     Snation *np;
  826. X     struct argument args[];
  827. X{
  828. X  np->attack += args[1].data.num;
  829. X  np->defense += args[1].data.num;
  830. X}
  831. X
  832. Xcmd_crepro(np, args)
  833. X     Snation *np;
  834. X     struct argument args[];
  835. X{
  836. X  np->race.repro += args[1].data.num;
  837. X}
  838. X
  839. Xcmd_cmortality(np, args)
  840. X     Snation *np;
  841. X     struct argument args[];
  842. X{
  843. X  if ((np->race.mortality += args[1].data.num) < 1) {
  844. X    np->race.mortality = 1;
  845. X  }
  846. X}
  847. X
  848. Xcmd_cintel(np, args)
  849. X     Snation *np;
  850. X     struct argument args[];
  851. X{
  852. X  if ((np->race.intel += args[1].data.num) < 1) {
  853. X    np->race.intel = 1;
  854. X  }
  855. X}
  856. X
  857. Xcmd_cmag_apt(np, args)
  858. X     Snation *np;
  859. X     struct argument args[];
  860. X{
  861. X  if ((np->race.mag_apt += args[1].data.num) < 1) {
  862. X    np->race.mag_apt = 1;
  863. X  }
  864. X}
  865. X
  866. Xcmd_cstrength(np, args)
  867. X     Snation *np;
  868. X     struct argument args[];
  869. X{
  870. X  if ((np->race.strength += args[1].data.num) < 1) {
  871. X    np->race.strength = 1;
  872. X  }
  873. X}
  874. X
  875. X  /* change the number of people in that sector */
  876. Xcmd_cpeople_sector(np, args)
  877. X     Snation *np;
  878. X     struct argument args[];
  879. X{
  880. X  Ssector *sp;
  881. X  int x, y;
  882. X
  883. X  x = args[1].data.num;
  884. X  y = args[2].data.num;
  885. X  sp = &world.map[x][y];
  886. X  sp->n_people += args[3].data.num;
  887. X}
  888. X  /* change the owner in that sector */
  889. Xcmd_cowner_sector(np, args)
  890. X     Snation *np;
  891. X     struct argument args[];
  892. X{
  893. X  Ssector *sp;
  894. X  int x, y;
  895. X
  896. X  x = args[1].data.num;
  897. X  y = args[2].data.num;
  898. X  sp = &world.map[x][y];
  899. X  sp->owner = args[3].data.num;
  900. X  addsector(&world.nations[sp->owner], x, y);
  901. X  if (debug)
  902. X    printf("sector (%d,%d) owned by %s\n", x, y,
  903. X       world.nations[sp->owner].name);
  904. X}
  905. X
  906. X  /* change the soil in that sector */
  907. Xcmd_csoil_sector(np, args)
  908. X     Snation *np;
  909. X     struct argument args[];
  910. X{
  911. X  Ssector *sp;
  912. X  int x, y;
  913. X
  914. X  x = args[1].data.num;
  915. X  y = args[2].data.num;
  916. X  sp = &world.map[x][y];
  917. X  sp->soil += args[3].data.num;
  918. X}
  919. X
  920. X  /* change the metal in that sector */
  921. Xcmd_cmetal_sector(np, args)
  922. X     Snation *np;
  923. X     struct argument args[];
  924. X{
  925. X  Ssector *sp;
  926. X  int x, y;
  927. X
  928. X  x = args[1].data.num;
  929. X  y = args[2].data.num;
  930. X  sp = &world.map[x][y];
  931. X  sp->metal += args[3].data.num;
  932. X}
  933. X  /* change the jewels in that sector */
  934. Xcmd_cjewels_sector(np, args)
  935. X     Snation *np;
  936. X     struct argument args[];
  937. X{
  938. X  Ssector *sp;
  939. X  int x, y;
  940. X
  941. X  x = args[1].data.num;
  942. X  y = args[2].data.num;
  943. X  sp = &world.map[x][y];
  944. X  sp->jewels += args[3].data.num;
  945. X}
  946. X
  947. X  /* change the altitude in that sector */
  948. Xcmd_caltitude_sector(np, args)
  949. X     Snation *np;
  950. X     struct argument args[];
  951. X{
  952. X  Ssector *sp;
  953. X  int x, y;
  954. X
  955. X  x = args[1].data.num;
  956. X  y = args[2].data.num;
  957. X  sp = &world.map[x][y];
  958. X  sp->altitude += args[3].data.num;
  959. X}
  960. X
  961. X/* adds a new type of army to the nation's list of available army types */
  962. Xcmd_new_army_type(np, args)
  963. X     Snation *np;
  964. X     struct argument args[];
  965. X{
  966. X  Savail_army *aa;
  967. X  extern Suser user;
  968. X  int falready=0;
  969. X
  970. X  /* Check to see that they don't already have the army type */
  971. X  aa = user.avail_armies;
  972. X  if (aa != NULL) {
  973. X    do {
  974. X      if (!strcmp (aa->type, args[1].data.str)) {
  975. X    falready = 1;
  976. X    break;
  977. X      }
  978. X    } while (aa->next && (aa=aa->next));
  979. X  }
  980. X  if (aa == NULL) {
  981. X    aa = (Savail_army *) malloc (sizeof(Savail_army));
  982. X    strcpy (aa->type, args[1].data.str);
  983. X  } else if (!falready) {
  984. X    do { ; } while (aa->next && (aa = aa->next));
  985. X    aa->next = (Savail_army *) malloc (sizeof (Savail_army));
  986. X    aa->next->next = NULL;
  987. X    strcpy(aa->next->type, args[1].data.str);
  988. X  }
  989. X  user.n_army_types++;
  990. X}
  991. X
  992. X/* allows nation to construct a new type of object, such
  993. X   as increasing roads in a sector, or making land into water
  994. X   or vice-versa, or ships, or caravans.
  995. X*/
  996. Xcmd_new_construct(np, args)
  997. X     Snation *np;
  998. X     struct argument args[];
  999. X{
  1000. X}
  1001. X
  1002. X  /* adds the first army to the second.  Requires the two army ids. */
  1003. Xcmd_amerge(np, args)
  1004. X     Snation *np;
  1005. X     struct argument args[];
  1006. X{
  1007. X  Sarmy *ap, *ap2;
  1008. X  Ssector *sp;
  1009. X  ap = get_army(np, args[1].data.num);
  1010. X  ap2 = get_army(np, args[2].data.num);
  1011. X  sp = &world.map[ap->pos.x][ap->pos.y];
  1012. X  ap2->n_soldiers += ap->n_soldiers;
  1013. X  ap2->sp_bonus = min(ap->sp_bonus, ap2->sp_bonus);
  1014. X  ap2->mvpts = min(ap->mvpts, ap2->mvpts);
  1015. X  ap2->mvratio = min(ap->mvratio, ap2->mvratio);
  1016. X  delete_army_sector(sp, ap);
  1017. X  delete_army_nation(np, ap);
  1018. X}
  1019. X
  1020. X  /* increases the army (of given id) by the given number of people */
  1021. Xcmd_aincrease(np, args)
  1022. X     Snation *np;
  1023. X     struct argument args[];
  1024. X{
  1025. X  Sarmy *ap;
  1026. X
  1027. X  ap = get_army(np, args[1].data.num);
  1028. X  ap->n_soldiers += args[2].data.num;
  1029. X  ap->mvpts = 0;
  1030. X  ap->mvratio = 0;
  1031. X}
  1032. X
  1033. X  /* splits an army up.  requires armyid and number of men to split */
  1034. Xcmd_asplit(np, args)
  1035. X     Snation *np;
  1036. X     struct argument args[];
  1037. X{
  1038. X  Sarmy *ap, army2, make_army(), *get_army();
  1039. X
  1040. X  ap = get_army(np,args[1].data.num);
  1041. X  army2 = make_army(ap->type, "", args[2].data.num, ap->status,
  1042. X            ap->owner, ap->pos);
  1043. X  ap->n_soldiers -= args[2].data.num;
  1044. X  army2.mvpts = ap->mvpts;
  1045. X  army2.mvratio = ap->mvratio;
  1046. X  army2.flags = ap->flags;
  1047. X  army2.sp_bonus = ap->sp_bonus;
  1048. X  army2.money_maint = ap->money_maint;
  1049. X  army2.metal_maint = ap->metal_maint;
  1050. X  army2.jewel_maint = ap->jewel_maint;
  1051. X  army2.spell_pts_maint = ap->spell_pts_maint;
  1052. X  sprintf(army2.name, "%s", army2.type, army2.id);
  1053. X  np->n_armies++;
  1054. X  insert_army_nation(np, &army2, -1);
  1055. X  insert_army_sector(&world.map[army2.pos.x][army2.pos.y], &army2);
  1056. X    /* to give them a name, we must know their id *after* they are inserted */
  1057. X  ap = get_army(np, army2.id);
  1058. X  sprintf(ap->name, "%s", army2.type, army2.id);
  1059. X}
  1060. X
  1061. Xcmd_adisband(np,args)
  1062. X     Snation *np;
  1063. X     struct argument args[];
  1064. X{
  1065. X  Sarmy *ap;
  1066. X  Ssector *sp;
  1067. X  ap = get_army(np,args[1].data.num);
  1068. X  sp = &world.map[ap->pos.x][ap->pos.y];
  1069. X    /* you don't get the population back from a spirit */
  1070. X  if (!is_spirit(ap) && !is_in_transport(ap)) {
  1071. X    sp->n_people += ap->n_soldiers;
  1072. X  }
  1073. X  delete_army_sector(sp, ap);
  1074. X  delete_army_nation(np, ap);
  1075. X}
  1076. X
  1077. Xcmd_cabonus(np,args)        /* give an army more/less special bonus */
  1078. X     Snation *np;
  1079. X     struct argument args[];
  1080. X{
  1081. X  Sarmy *ap;
  1082. X  int bonus_change;
  1083. X
  1084. X  bonus_change = args[2].data.num;
  1085. X  if (ap = get_army(np,args[1].data.num)) {
  1086. X    ap->sp_bonus += bonus_change;
  1087. X  }
  1088. X}
  1089. X
  1090. X  /* change fortification level of a sector */
  1091. Xcmd_cfort_sector(np, args)
  1092. X     Snation *np;
  1093. X     struct argument args[];
  1094. X{
  1095. X  Ssector *sp;
  1096. X  int x, y;
  1097. X
  1098. X  x = args[1].data.num;
  1099. X  y = args[2].data.num;
  1100. X  sp = &world.map[x][y];
  1101. X  sp->defense += args[3].data.num;
  1102. X}
  1103. X
  1104. X  /* change number of roads in a sector */
  1105. Xcmd_croads_sector(np, args)
  1106. X     Snation *np;
  1107. X     struct argument args[];
  1108. X{
  1109. X  Ssector *sp;
  1110. X  int x, y;
  1111. X
  1112. X  x = args[1].data.num;
  1113. X  y = args[2].data.num;
  1114. X  sp = &world.map[x][y];
  1115. X  sp->roads += args[3].data.num;
  1116. X}
  1117. X
  1118. Xcmd_cpass(np, args)
  1119. X     Snation *np;
  1120. X     struct argument args[];
  1121. X{
  1122. X  Snation *dest_np;
  1123. X  int id;
  1124. X  char *new_pass;
  1125. X
  1126. X  id = args[1].data.num;
  1127. X  new_pass = args[2].data.str;
  1128. X  dest_np = &world.nations[id];
  1129. X  strcpy(dest_np->passwd, new_pass);
  1130. X}
  1131. X
  1132. Xcmd_cur_mag_money (np, args)
  1133. X
  1134. XSnation * np;
  1135. Xstruct argument args [];
  1136. X{
  1137. X  np->cur_mag_r_d = args[1].data.num;
  1138. X}
  1139. X
  1140. Xcmd_cur_tech_money (np, args)
  1141. X
  1142. XSnation * np;
  1143. Xstruct argument args [];
  1144. X{
  1145. X  np->cur_tech_r_d = args[1].data.num;
  1146. X}
  1147. X
  1148. Xcmd_cur_mag_jewels (np, args)
  1149. X
  1150. XSnation * np;
  1151. Xstruct argument args [];
  1152. X{
  1153. X  np->cur_mag_r_d_jewels = args[1].data.num;
  1154. X}
  1155. X
  1156. Xcmd_cur_tech_metal (np, args)
  1157. X
  1158. XSnation * np;
  1159. Xstruct argument args [];
  1160. X{
  1161. X  np->cur_tech_r_d_metal = args[1].data.num;
  1162. X}
  1163. X
  1164. Xcmd_cur_spy_money (np, args)
  1165. X
  1166. XSnation * np;
  1167. Xstruct argument args [];
  1168. X{
  1169. X  np->cur_spy_r_d = args[1].data.num;
  1170. X}
  1171. X
  1172. Xcmd_destroy(np, args)
  1173. X     Snation *np;
  1174. X     struct argument args[];
  1175. X{
  1176. X  int id;
  1177. X
  1178. X  id = args[1].data.num;
  1179. X  destroy_nation(id);
  1180. X}
  1181. X
  1182. Xcmd_acastle (np, args)
  1183. X     
  1184. XSnation * np;
  1185. Xstruct argument args [];
  1186. X{
  1187. X  int army_id;
  1188. X  Ssector * sp;
  1189. X  Ssector * capital = &world.map [np->capital.x][np->capital.y];
  1190. X  Sarmy * ap;
  1191. X
  1192. X  army_id = args[1].data.num;
  1193. X  if ((ap = get_army (np, army_id)) == NULL) {
  1194. X    printf ("funny, can't find army %d\n", army_id);
  1195. X  }
  1196. X  sp = &world.map [ap->pos.x][ap->pos.y];
  1197. X
  1198. X  delete_army_sector (sp, ap);
  1199. X
  1200. X  ap->pos.x = capital->loc.x;
  1201. X  ap->pos.y = capital->loc.y;
  1202. X  
  1203. X  insert_army_sector (capital, ap);
  1204. X}
  1205. X
  1206. X  /* read in the exec file for the master nation; this is done by all
  1207. X     users, in case the master has changed things for them.  It is not
  1208. X     done by the master nation, since that happens automaticaly.
  1209. X   */
  1210. Xload_master_execs()
  1211. X{
  1212. X  int argc;
  1213. X  Snation *np = &world.nations[0];
  1214. X  FILE *exec_file, *fopen();
  1215. X  struct argument args[N_EXEC_ARGS];
  1216. X  char filename[NAMELEN];
  1217. X
  1218. X  sprintf(filename, "exec/exec%d", np->id);
  1219. X  exec_file = fopen(filename, "r");
  1220. X  if (!exec_file && np->npc_flag == 0) {
  1221. X    /* printf("Nation %d (%s) did not move this turn.\n", np->id, np->name); */
  1222. X  } else {
  1223. X    while (argc = getexec(exec_file, args) != -1) {
  1224. X      run_exec_line(np, args);
  1225. X    }
  1226. X    if (exec_file != NULL) { fclose(exec_file); }
  1227. X  }
  1228. X}
  1229. X
  1230. END_OF_FILE
  1231. if test 28685 -ne `wc -c <'nation.c'`; then
  1232.     echo shar: \"'nation.c'\" unpacked with wrong size!
  1233. fi
  1234. # end of 'nation.c'
  1235. fi
  1236. if test -f 'transport.c' -a "${1}" != "-c" ; then 
  1237.   echo shar: Will not clobber existing file \"'transport.c'\"
  1238. else
  1239. echo shar: Extracting \"'transport.c'\" \(27480 characters\)
  1240. sed "s/^X//" >'transport.c' <<'END_OF_FILE'
  1241. X/* transport.c -- routines dealing with transportation */
  1242. X
  1243. X/*
  1244. X * Copyright (C) 1990 Free Software Foundation, Inc.
  1245. X * Written by the dominion project.
  1246. X *
  1247. X * This file is part of dominion.
  1248. X *
  1249. X * dominion is free software; you can redistribute it and/or
  1250. X * modify it under the terms of the GNU General Public License as published
  1251. X * by the Free Software Foundation; either version 1, or (at your option)
  1252. X * any later version.
  1253. X *
  1254. X * This software is distributed in the hope that it will be useful,
  1255. X * but WITHOUT ANY WARRANTY; without even the implied warranty of
  1256. X * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  1257. X * GNU General Public License for more details.
  1258. X *
  1259. X * You should have received a copy of the GNU General Public License
  1260. X * along with this software; see the file COPYING.  If not, write to
  1261. X * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  1262. X */
  1263. X
  1264. X#include "dominion.h"
  1265. X#include "misc.h"
  1266. X#include "army.h"
  1267. X#include "costs.h"
  1268. X#include "cur_stuff.h"
  1269. X
  1270. X#include <stdio.h>
  1271. X#include <math.h>
  1272. X
  1273. Xextern Suser user;
  1274. Xextern Sworld world;
  1275. Xextern char help_tag[];
  1276. Xextern WINDOW * sectw;
  1277. Xextern struct army_type * army_types;
  1278. X
  1279. X
  1280. X/* Main transport functions */
  1281. X/* int transport ();  /* Coordinates everything (top level) */
  1282. X/* int transport_load (Sarmy *, WINDOW *); /* Actually loads stuff */
  1283. X/* int transport_unload (Sarmy *, WINDOW *); /* Unloads stuff */
  1284. X/* int transport_transfer (Sarmy *, WINDOW *); /* Transfers stuff */
  1285. X
  1286. X/* Cargo weight functions */
  1287. X/* int army_weight (Sarmy *); /* Figures out an army's manweight */ 
  1288. X/* int caravan_weight (Sarmy *); /* Figures out a caravan's manweight */
  1289. X/* int cargo_weight (Scargo *); /* Figures out a cargo's manweight */
  1290. X/* char * make_cargo_statline (Scargo *); /* Makes a cargo statline */
  1291. X
  1292. X  /* allows you to load/unload cargo from a caravan */
  1293. Xint transport()
  1294. X{
  1295. X  WINDOW *tw;
  1296. X  char type[NAMELEN];
  1297. X  int ret, size;
  1298. X  Snation *np = user.np;
  1299. X  Ssector *sp =  &world.map[user.cursor.x][user.cursor.y];
  1300. X  Sarmy *ap, *get_army();
  1301. X  char s[EXECLEN];
  1302. X  int done = 0;
  1303. X
  1304. X    /* before I make the new window, I should check if the user
  1305. X       is transporting on a caravan or ship, or if they are transporting
  1306. X       on something else (like an army or a spirit)
  1307. X     */
  1308. X  ap = get_army(np, user.current_army);
  1309. X  if ( (ap == NULL) || !is_cargo(ap) ) {
  1310. X    statline2_err ("hit space", "must select a caravan or navy");
  1311. X    return -1;
  1312. X  }
  1313. X  if (user.xmode) {
  1314. X    tw = NULL;
  1315. X  } else {
  1316. X    statline("hit space to exit", "transportation");
  1317. X    tw = newwin(7, COLS/2+28, LINES-10, COLS/4-14);
  1318. X  }
  1319. X
  1320. X  while (!done) {
  1321. X    if (tw != NULL) {
  1322. X      mvwprintw(tw, 1, 1, "Do you wish to [l]oad, [u]nload or [t]ransfer? ");
  1323. X      wclrtobot(tw);
  1324. X      box(tw, '|', '-');
  1325. X      wrefresh(tw);
  1326. X    }
  1327. X    cargo_statline(user.xmode ? NULL : tw, &user);
  1328. X
  1329. X    strcpy(help_tag, "Transportation");
  1330. X    switch (mygetch()) {
  1331. X    case 'l':
  1332. X      if (ap->flags & AF_IN_TRANSPORT) {
  1333. X    statline2_err ("hit space", "cannot load a caravan in transit");
  1334. X      }
  1335. X      else transport_load(ap, user.xmode ? NULL : tw);
  1336. X      statline2("", "");
  1337. X      break;
  1338. X    case 'u':
  1339. X      if (!cargo_not_empty (&ap->cargo)) {
  1340. X    statline2_err ("hit space", "cannot unload an empty caravan"); 
  1341. X      }
  1342. X      else transport_unload(ap, user.xmode ? NULL : tw);
  1343. X      statline2("", "");
  1344. X      break;
  1345. X    case 't':
  1346. X      if (!cargo_not_empty (&ap->cargo)) {
  1347. X    statline2_err ("hit space", "nothing to transfer");
  1348. X      }
  1349. X      else transport_transfer(ap, user.xmode ? NULL : tw);
  1350. X      statline2("", "");
  1351. X      break;
  1352. X    case ' ':
  1353. X      done = 1;
  1354. X      break;
  1355. X    default:
  1356. X      break;
  1357. X    }
  1358. X  }
  1359. X
  1360. X  if (tw != NULL) {
  1361. X    delwin(tw);
  1362. X    wrefresh (sectw);
  1363. X    touchwin(stdscr);
  1364. X  }
  1365. X  just_moved ();
  1366. X  return 1;
  1367. X}
  1368. X
  1369. X  /* load onto a caravan or ship */
  1370. Xtransport_load (ap, tw)
  1371. X     Sarmy *ap;
  1372. X     WINDOW *tw;
  1373. X{
  1374. X  Snation *np = user.np;
  1375. X  Ssector *sp = &world.map[ap->pos.x][ap->pos.y];
  1376. X  Sarmy *loaded_army;
  1377. X  int quantity, done = 0, ret; 
  1378. X  int doit;
  1379. X  char c;
  1380. X  char s[100];
  1381. X
  1382. X  strcpy(help_tag, "Transportation");
  1383. X
  1384. X  while (!done) {
  1385. X    if (tw != NULL) {
  1386. X      wmove(tw, 4, 1);
  1387. X      wclrtobot(tw);
  1388. X    }
  1389. X    cargo_statline(tw, &user);
  1390. X    if (tw != NULL) {
  1391. X      box(tw, '|', '-');
  1392. X    }
  1393. X    if (user.xmode) {
  1394. X      statline2("  [s,m,j,f,a,p,t]", "load");
  1395. X    } else {
  1396. X      wmove (tw, 1, 0);
  1397. X      wclrtoeol (tw);
  1398. X      box (tw, '|', '-');
  1399. X      mvwprintw(tw, 2, 2, "What do you want to load? ");
  1400. X      mvwprintw(tw, 3, 2,
  1401. X        " [s]hekels, [m]etal, [j]ewels, [f]ood, [a]rmy, [p]eople, [t]itle ");
  1402. X      wrefresh(tw);
  1403. X    }
  1404. X    do { c = mygetch(); } while (strchr (" smjfapt", c) == NULL);
  1405. X
  1406. X    doit = 1;
  1407. X    
  1408. X    /* If anything besides a title or an exit, prompt */
  1409. X    if (c != ' ' && c != 't') {
  1410. X      sprintf (s, (c == 'a') ? "(%c) Which army? " : "(%c) Quantity? ", c);
  1411. X      if (user.xmode) {
  1412. X    statline2(s, "");
  1413. X    move(LINES-2, strlen(s));
  1414. X      } else {
  1415. X    mvwprintw(tw, 4, 5, s);
  1416. X      }
  1417. X      ret = wget_number(user.xmode ? stdscr : tw, &quantity);
  1418. X      if (ret <= 0) {
  1419. X    doit = 0;
  1420. X      }
  1421. X    }
  1422. X
  1423. X    strcpy (s, "");
  1424. X
  1425. X    if (!good_loading_place (np, sp, c, quantity)) {
  1426. X      statline2_err ("Can't load that here", "load");
  1427. X    } else if (load_too_big (np, ap, c, quantity)) {
  1428. X      statline2_err ("Too much (space)", "load");
  1429. X    } else if (quantity >= 0 && doit) {
  1430. X      switch (c) {
  1431. X      case ' ':
  1432. X    done = 1;
  1433. X    break;
  1434. X      case 's':
  1435. X    if (quantity <= np->money) {
  1436. X      ap->cargo.money += quantity;
  1437. X      np->money -= quantity;
  1438. X      cmoney (np, -quantity);
  1439. X    }
  1440. X    else sprintf (s, "Sorry, not enough in storage (space)");
  1441. X    break;
  1442. X      case 'j':
  1443. X    if (quantity <= np->jewels) {
  1444. X      ap->cargo.jewels += quantity;
  1445. X      np->jewels -= quantity;
  1446. X      cjewels (np, -quantity);
  1447. X    }
  1448. X    else sprintf (s, "Sorry, not enough in storage (space)");
  1449. X    break;
  1450. X      case 'm':
  1451. X    if (quantity <= np->metal) {
  1452. X      ap->cargo.metal += quantity;
  1453. X      np->metal -= quantity;
  1454. X      cmetal (np, -quantity);
  1455. X    }
  1456. X    else sprintf (s, "Sorry, not enough in storage (space)");
  1457. X    break;
  1458. X      case 'f':
  1459. X    if (quantity <= np->food) {
  1460. X      ap->cargo.food += quantity;
  1461. X      np->food -= quantity;
  1462. X      cfood (np, -quantity);
  1463. X    }
  1464. X    else sprintf (s, "Sorry, not enough in storage (space)");
  1465. X    break;
  1466. X      case 'a':
  1467. X    if (ap->cargo.army == -1) {
  1468. X      if (army_is_in_sector(sp, ap->owner, quantity)) {
  1469. X        if (ap->id != quantity) {
  1470. X          ap->cargo.army = quantity;
  1471. X          loaded_army = get_army (np, quantity);
  1472. X          loaded_army->flags |= AF_IN_TRANSPORT;
  1473. X          aflag_set (loaded_army, AF_IN_TRANSPORT);
  1474. X          show_armies (sp);
  1475. X        }
  1476. X        else sprintf(s,"That would be an interesting topological exercise!");      }
  1477. X      else sprintf (s, "Sorry, can't load across sectors!");
  1478. X    }
  1479. X    else sprintf (s, "Sorry, can only transport one army at a time.");
  1480. X    break;
  1481. X      case 'p':
  1482. X    if (quantity <= sp->n_people) {
  1483. X      ap->cargo.people += quantity;
  1484. X      sp->n_people -= quantity;
  1485. X      cpeople_sector (sp, -quantity);
  1486. X      if (user.xmode) {
  1487. X        just_moved ();
  1488. X        show_sector (user.cursor.x, user.cursor.y);
  1489. X      }
  1490. X    }
  1491. X    else sprintf (s, "Sorry, too large a number (space)");
  1492. X    break;
  1493. X      case 't':
  1494. X    if (!has_traded (sp)) {
  1495. X      if (sp->designation != D_CAPITAL) {
  1496. X        if (ap->cargo.title.x == -1) {
  1497. X          sp->flags |= SF_TRADED;
  1498. X          sprintf (s, "FLAG_SET_SECTOR:%d:%d:%d\n", sp->loc.x, sp->loc.y,
  1499. X               SF_TRADED);
  1500. X          gen_exec (s);
  1501. X          sprintf (s, "");
  1502. X          ap->cargo.title = sp->loc;
  1503. X        }
  1504. X        else sprintf (s, "Sorry, can only load one title per caravan");
  1505. X      }
  1506. X      else sprintf (s, "Sorry, but you can't give away your nation...");
  1507. X    }
  1508. X    else sprintf (s, "Sector is already traded");
  1509. X    break;
  1510. X      }
  1511. X      if (strlen (s) > 0) {
  1512. X    statline2_err (s, "load");
  1513. X      }
  1514. X      else { adjust_cargo (ap); }
  1515. X    }
  1516. X  }
  1517. X}
  1518. X
  1519. X/* unload from a caravan */
  1520. Xtransport_unload(ap, tw)
  1521. X     Sarmy *ap;
  1522. X     WINDOW *tw;
  1523. X{
  1524. X  Snation *np = user.np;
  1525. X  Ssector *sp = &world.map[ap->pos.x][ap->pos.y];
  1526. X  int recip_id;            /* the guy you to whom give the cargo */
  1527. X  Scargo dropped_cargo;        /* how much you drop */
  1528. X  char c;
  1529. X  char s[100];
  1530. X  int done = 0, ret, quantity, bad_load = 0;
  1531. X  Sarmy *trans_ap;
  1532. X
  1533. X  /* initialize that nothing is traded */
  1534. X  dropped_cargo.money = 0;
  1535. X  dropped_cargo.metal = 0;
  1536. X  dropped_cargo.jewels = 0;
  1537. X  dropped_cargo.food = 0;
  1538. X  dropped_cargo.people = 0;
  1539. X  dropped_cargo.army = -1;
  1540. X  dropped_cargo.title.x = -1;
  1541. X  dropped_cargo.title.y = -1;
  1542. X
  1543. X  trans_ap = get_army(np, ap->cargo.army);
  1544. X  recip_id = sp->owner;
  1545. X
  1546. X  while (!done) {
  1547. X    cargo_statline(tw, &user);
  1548. X    if (tw != NULL) {
  1549. X      box(tw, '|', '-');
  1550. X      wrefresh(tw);
  1551. X    }
  1552. X    if (tw == NULL) {
  1553. X      statline2("  [s,m,j,f,p,a,t,*]", "unload");
  1554. X    } else {
  1555. X      wmove (tw, 1, 0);
  1556. X      wclrtoeol (tw);
  1557. X      box (tw, '|', '-');
  1558. X      mvwprintw(tw, 2, 2, "What do you want to unload? ");
  1559. X      mvwprintw(tw, 3, 2,
  1560. X        "[s]hekels/[m]etal/[j]ewels/[f]ood/[p]eople/[a]rmy/[t]itle/[*]");
  1561. X      wrefresh (tw);
  1562. X    }
  1563. X    do { c = mygetch (); } while (strchr ("*smjaftp ", c) == NULL);
  1564. X    
  1565. X    if (!good_unloading_place(np, sp, c, ap->cargo.army)) {
  1566. X      statline2_err("Cannot unload that here (space)", "");
  1567. X    }
  1568. X    else {
  1569. X      if (c != ' ' && c != 'a' && c != 't' && c != '*') {
  1570. X    sprintf (s, "(%c) Quantity? ", c);
  1571. X    if (tw == NULL) {
  1572. X      statline2 (s, "unload");
  1573. X      move (LINES-2, strlen(s));
  1574. X    } else {
  1575. X      mvwprintw (tw, 4, 7, s);
  1576. X    }
  1577. X    ret = wget_number(user.xmode ? stdscr : tw, &quantity);
  1578. X      }
  1579. X
  1580. X      strcpy (s, "");
  1581. X
  1582. X      /* Actually unload the stuff */
  1583. X      if (strchr (" at*", c) != NULL || (ret >= 0) ) {
  1584. X    switch (c) {
  1585. X    case 's':
  1586. X      if (quantity <= ap->cargo.money && quantity > 0) {
  1587. X        ap->cargo.money -= quantity;
  1588. X        dropped_cargo.money += quantity;
  1589. X      }
  1590. X      else sprintf (s, "Invalid number (space)");
  1591. X      break;
  1592. X    case 'm':
  1593. X      if (quantity <= ap->cargo.metal && quantity > 0) {
  1594. X        ap->cargo.metal -= quantity;
  1595. X        dropped_cargo.metal += quantity;
  1596. X      }
  1597. X      else sprintf (s, "Invalid number (space)");
  1598. X      break;
  1599. X    case 'j':
  1600. X      if (quantity <= ap->cargo.jewels && quantity > 0) {
  1601. X        ap->cargo.jewels -= quantity;
  1602. X        dropped_cargo.jewels += quantity;
  1603. X      }
  1604. X      else sprintf (s, "Invalid number (space)");
  1605. X      break;
  1606. X    case 'f':
  1607. X      if (quantity <= ap->cargo.food && quantity > 0) {
  1608. X        ap->cargo.food -= quantity;
  1609. X        dropped_cargo.food += quantity;
  1610. X      }
  1611. X      else sprintf (s, "Invalid number (space)");
  1612. X      break;
  1613. X    case 'p':
  1614. X      if (quantity <= ap->cargo.people && quantity > 0) {
  1615. X        ap->cargo.people -= quantity;
  1616. X        dropped_cargo.people += quantity;
  1617. X      }
  1618. X      else sprintf (s, "Invalid number (space)");
  1619. X      break;
  1620. X    case 't':        /* drop a title to land */
  1621. X      if (ap->cargo.title.x != -1) {
  1622. X        dropped_cargo.title = ap->cargo.title;
  1623. X        ap->cargo.title.x = -1;
  1624. X        ap->cargo.title.y = -1;
  1625. X      }
  1626. X      else sprintf (s, "No sector title loaded (space)");
  1627. X      break;
  1628. X    case 'a':
  1629. X      if (ap->cargo.army >= 0) {
  1630. X        dropped_cargo.army = ap->cargo.army;
  1631. X        ap->cargo.army = -1;
  1632. X      }
  1633. X      else sprintf (s, "No army loaded (space)");
  1634. X      break;
  1635. X    case '*':
  1636. X      if (ap->cargo.army >= 0) {
  1637. X        dropped_cargo.army = ap->cargo.army;
  1638. X        ap->cargo.army = -1;
  1639. X      }
  1640. X      dropped_cargo.people = ap->cargo.people;
  1641. X      ap->cargo.people = 0;
  1642. X      dropped_cargo.jewels = ap->cargo.jewels;
  1643. X      ap->cargo.jewels = 0;
  1644. X      dropped_cargo.metal = ap->cargo.metal;
  1645. X      ap->cargo.metal = 0;
  1646. X      dropped_cargo.food = ap->cargo.food;
  1647. X      ap->cargo.food = 0;
  1648. X      dropped_cargo.money = ap->cargo.money;
  1649. X      ap->cargo.money = 0;
  1650. X      if (ap->cargo.title.x != -1) {
  1651. X        dropped_cargo.title = ap->cargo.title;
  1652. X        ap->cargo.title.x = -1;
  1653. X        ap->cargo.title.y = -1;
  1654. X      }
  1655. X      done = 1;
  1656. X      break;
  1657. X    case ' ':
  1658. X      done = 1;
  1659. X      break;
  1660. X    default:
  1661. X      break;
  1662. X    }
  1663. X    if (strlen (s) > 0) {
  1664. X      statline2_err (s, "");
  1665. X      bad_load = 1;
  1666. X    }
  1667. X      }
  1668. X    }
  1669. X  }
  1670. X  if (bad_load == 1) { ; }
  1671. X  else if (recip_id == user.id) { /* on your land, just put the stuff down */
  1672. X    np->money += dropped_cargo.money;
  1673. X    np->metal += dropped_cargo.metal;
  1674. X    np->jewels += dropped_cargo.jewels;
  1675. X    np->food += dropped_cargo.food;
  1676. X    sp->n_people += dropped_cargo.people;
  1677. X    if (dropped_cargo.title.x != -1) {
  1678. X      Ssector *traded_sp;
  1679. X      traded_sp = &world.map[dropped_cargo.title.x][dropped_cargo.title.y];
  1680. X      traded_sp->flags &= ~SF_TRADED;
  1681. X        /* now prepare the exec string */
  1682. X      sprintf(s, "FLAG_CLEAR_SECTOR:%d:%d:%d\n", traded_sp->loc.x,
  1683. X          traded_sp->loc.y, SF_TRADED);
  1684. X      gen_exec(s);
  1685. X    }
  1686. X    cmoney(np, dropped_cargo.money);
  1687. X    cmetal(np, dropped_cargo.metal);
  1688. X    cjewels(np, dropped_cargo.jewels);
  1689. X    cfood(np, dropped_cargo.food);
  1690. X    cpeople_sector(sp, dropped_cargo.people);
  1691. X      /* just drop your army on your own land */
  1692. X    if (dropped_cargo.army != -1) {
  1693. X      trans_ap->flags &= ~AF_IN_TRANSPORT;
  1694. X      aflag_clear(trans_ap, AF_IN_TRANSPORT);
  1695. X      dropped_cargo.army = -1;
  1696. X    }
  1697. X  } 
  1698. X  else { /* Not in your land */
  1699. X    if (dropped_cargo.army != -1) { /* Clear army transport flags */
  1700. X      if (is_front_line (trans_ap) || !(trans_ap->status == A_TRADED)) {
  1701. X    dropped_cargo.army = -1;    /* don't donate it!! */
  1702. X      }
  1703. X      trans_ap->flags &= ~AF_IN_TRANSPORT;
  1704. X      aflag_clear(trans_ap, AF_IN_TRANSPORT);
  1705. X    }
  1706. X    if (cargo_not_empty(&dropped_cargo)) {
  1707. X      donate_cargo(sp->loc.x, sp->loc.y, user.id, recip_id, &dropped_cargo);
  1708. X    }
  1709. X  } 
  1710. X  adjust_cargo(ap);        /* tell the exec file that cargo is changed */
  1711. X  if (tw == NULL) { /* Update the sector window */
  1712. X    just_moved ();
  1713. X    show_sector (user.cursor.x, user.cursor.y);
  1714. X  }
  1715. X  show_armies(sp);
  1716. X}
  1717. X
  1718. Xtransport_transfer (ap, tw)
  1719. XSarmy * ap;
  1720. XWINDOW * tw;
  1721. X{
  1722. X  Snation *np = user.np;
  1723. X  Ssector *sp = &world.map [ap->pos.x][ap->pos.y];
  1724. X  Sarmy * recip;
  1725. X  int recip_num;
  1726. X  char c;
  1727. X  char s [EXECLEN];
  1728. X  int ret, quantity;
  1729. X
  1730. X  if (tw == NULL) {
  1731. X    statline2("  [s,m,j,f,p,a,t,*]", "transfer");
  1732. X  } else {
  1733. X    wmove (tw, 1, 0);
  1734. X    wclrtoeol (tw);
  1735. X    box (tw, '|', '-');
  1736. X    mvwprintw(tw, 2, 2, "What do you want to transfer? ");
  1737. X    mvwprintw(tw, 3, 2,
  1738. X          "[s]hekels/[m]etal/[j]ewels/[f]ood/[p]eople/[a]rmy/[t]itle/[*]");
  1739. X    wrefresh (tw);
  1740. X  }
  1741. X
  1742. X  do { c = mygetch (); } while (strchr ("*smjaftp ", c) == NULL);
  1743. X
  1744. X  if (c == ' ') {
  1745. X    statline2 ("", "");
  1746. X    return 0; 
  1747. X  }
  1748. X
  1749. X  if (c != 'a' && c != 't' && c != '*') {
  1750. X    sprintf (s, "(%c) Quantity? ", c);
  1751. X    if (tw == NULL) {
  1752. X      statline2 (s, "transfer");
  1753. X      move (LINES-2, strlen(s));
  1754. X    } else {
  1755. X      mvwprintw (tw, 4, 7, s);
  1756. X      wrefresh (tw);
  1757. X    }
  1758. X    ret = wget_number(user.xmode ? stdscr : tw, &quantity);
  1759. X    if (ret <= 0 || c == ' ') {
  1760. X      statline2 ("", "");
  1761. X      return 0;
  1762. X    }
  1763. X  }
  1764. X
  1765. X  sprintf (s, "Transfer to army #? ");
  1766. X  if (tw == NULL) {
  1767. X    statline2 (s, "transfer");
  1768. X    move (LINES-2, strlen (s));
  1769. X  } else {
  1770. X    mvwprintw (tw, 4, 7, "Transfer to army #? ");
  1771. X    wrefresh (tw);
  1772. X   }
  1773. X  ret = wget_number(user.xmode ? stdscr : tw, &recip_num);
  1774. X
  1775. X  if (ap->id == recip_num || (recip = get_army (user.np, recip_num)) == NULL) {
  1776. X    statline2 ("", "");
  1777. X    return 0;
  1778. X  }
  1779. X
  1780. X  /* Actually transfer */
  1781. X  if (strchr ("at*", c) != NULL) {
  1782. X    if (c == '*') {
  1783. X      int capacity;
  1784. X
  1785. X      if (ap->cargo.army != -1 && recip->cargo.army != -1) {
  1786. X    statline2_err ("hit space", "only one army allowed per caravan");
  1787. X    return 0;
  1788. X      }
  1789. X      if (recip->cargo.title.x != -1 && ap->cargo.title.x != -1) {
  1790. X    statline2_err ("hit space", "only one title allowed per caravan");
  1791. X    return 0;
  1792. X      }
  1793. X      if (is_cargo (recip)) {
  1794. X    capacity = recip->n_soldiers * CARAVAN_CAPACITY;
  1795. X      } else capacity = 0;   /* Someone made a booboo */
  1796. X
  1797. X      if ((capacity - cargo_weight (&recip->cargo))
  1798. X      >= cargo_weight (&ap->cargo)) {
  1799. X    recip->cargo.money += ap->cargo.money;
  1800. X    ap->cargo.money = 0;
  1801. X    recip->cargo.jewels += ap->cargo.jewels;
  1802. X    ap->cargo.jewels = 0;
  1803. X    recip->cargo.metal += ap->cargo.metal;
  1804. X    ap->cargo.metal = 0;
  1805. X    recip->cargo.food += ap->cargo.food;
  1806. X    ap->cargo.food = 0;
  1807. X    recip->cargo.people += ap->cargo.people;
  1808. X    ap->cargo.people = 0;
  1809. X    recip->cargo.army = ap->cargo.army;
  1810. X    ap->cargo.army = -1;
  1811. X    recip->cargo.title.x = ap->cargo.title.x;
  1812. X    recip->cargo.title.y = ap->cargo.title.y;
  1813. X    ap->cargo.title.x = -1;
  1814. X    ap->cargo.title.y = -1;
  1815. X      }
  1816. X      else {
  1817. X    statline2_err ("hit space", "cargo too big to transfer");
  1818. X    return 0;
  1819. X      }
  1820. X    }
  1821. X    else {
  1822. X      if (load_too_big (np, recip, c, quantity)) {
  1823. X    statline2_err ("hit space", "load too big");
  1824. X    return (0);
  1825. X      }
  1826. X      switch (c) {
  1827. X      case 'a':
  1828. X    if (recip->cargo.army != -1) {
  1829. X      statline2_err ("hit space", "army already loaded");
  1830. X      return 0;
  1831. X    }
  1832. X    recip->cargo.army = ap->cargo.army;
  1833. X    ap->cargo.army = -1;
  1834. X    break;
  1835. X      case 't':
  1836. X    if (recip->cargo.title.x != -1) {
  1837. X      statline2_err ("hit space", "title already loaded");
  1838. X      return 0;
  1839. X    }
  1840. X    recip->cargo.title.x = ap->cargo.title.x;
  1841. X    recip->cargo.title.y = ap->cargo.title.y;
  1842. X    ap->cargo.title.x = -1;
  1843. X    ap->cargo.title.y = -1;
  1844. X    break;
  1845. X      default:
  1846. X    break;
  1847. X      }
  1848. X    }
  1849. X  }
  1850. X  else {
  1851. X    if (load_too_big (np, recip, c, quantity)) {
  1852. X      statline2_err("hit space", "load too big");
  1853. X      return (0);
  1854. X    }
  1855. X    switch (c) {
  1856. X    case 's':
  1857. X      if (quantity <= ap->cargo.money && quantity > 0) {
  1858. X    ap->cargo.money -=quantity;
  1859. X    recip->cargo.money += quantity;
  1860. X      }
  1861. X      else statline2_err ("hit space", "Invalid quantity");
  1862. X      break;
  1863. X    case 'm':
  1864. X      if (quantity <= ap->cargo.metal && quantity > 0) {
  1865. X    ap->cargo.metal -=quantity;
  1866. X    recip->cargo.metal += quantity;
  1867. X      }
  1868. X      else statline2_err ("hit space", "Invalid quantity");
  1869. X      break;
  1870. X    case 'j':
  1871. X      if (quantity <= ap->cargo.jewels && quantity > 0) {
  1872. X    ap->cargo.jewels -=quantity;
  1873. X    recip->cargo.jewels += quantity;
  1874. X      }
  1875. X      else statline2_err ("hit space", "Invalid quantity");
  1876. X      break;
  1877. X    case 'f':
  1878. X      if (quantity <= ap->cargo.food && quantity > 0) {
  1879. X    ap->cargo.food -=quantity;
  1880. X    recip->cargo.food += quantity;
  1881. X      }
  1882. X      else statline2_err ("hit space", "Invalid quantity");
  1883. X      break;
  1884. X    case 'p':
  1885. X      if (quantity <= ap->cargo.people && quantity > 0) {
  1886. X    ap->cargo.people -=quantity;
  1887. X    recip->cargo.people += quantity;
  1888. X      }
  1889. X      else statline2_err ("hit space", "Invalid quantity");
  1890. X      break;
  1891. X    default:
  1892. X      break;
  1893. X    }
  1894. X  }
  1895. X  adjust_cargo (ap);
  1896. X  adjust_cargo (recip);
  1897. X  statline2 ("", "");
  1898. X}
  1899. X
  1900. X#define is_city(sp) (sp->designation == D_CITY || sp->designation == D_CAPITAL)
  1901. X
  1902. X/* you can only load a caravan in certain places */
  1903. Xgood_loading_place(np, sp, type, quantity)
  1904. X     Snation *np;
  1905. X     Ssector *sp;
  1906. X     char type;            /* type of cargo */
  1907. X     int quantity;        /* amount, or army id */
  1908. X{
  1909. X  Sarmy *ap, *get_army();
  1910. X
  1911. X  switch (type) {
  1912. X  case 's':
  1913. X    if (!(sp->owner == np->id) || !is_city(sp)) {
  1914. X      return 0;
  1915. X    }
  1916. X    break;
  1917. X  case 'm':
  1918. X    if (!(sp->owner == np->id) || !(is_city(sp) ||
  1919. X                 sp->designation == D_METAL_MINE)) {
  1920. X      return 0;
  1921. X    }
  1922. X    break;
  1923. X  case 'j':
  1924. X    if (!(sp->owner == np->id) || !(is_city(sp) ||
  1925. X                    sp->designation == D_JEWEL_MINE)) {
  1926. X      return 0;
  1927. X    }
  1928. X    break;
  1929. X  case 'f':
  1930. X    if (!(sp->owner == np->id) || (!(is_city(sp) ||
  1931. X                    sp->designation == D_FARM))) {
  1932. X      return 0;
  1933. X    }
  1934. X    break;
  1935. X  case 'p':
  1936. X     /* you can only load people in your own non-hostile sectors */
  1937. X    if (!(sp->owner == np->id)|| !(good_altitude(sp, np))||(has_hostile(sp))) {
  1938. X      return 0;
  1939. X    }
  1940. X    break;
  1941. X  case 't':
  1942. X      /* you can only load a title in your own land, 
  1943. X         and if the sector is not traded. */
  1944. X    if ((sp->owner != np->id) || !(good_altitude(sp, np))) {
  1945. X      return 0;
  1946. X    }
  1947. X    break;
  1948. X  case 'a':
  1949. X    if (!(ap = get_army(np, quantity))
  1950. X    || !(army_is_in_sector(sp, np->id, quantity))
  1951. X    || ((sp->owner != np->id) && !is_front_line (ap) &&
  1952. X    sp->designation != D_TRADE_POST)) { 
  1953. X      return 0;
  1954. X    }
  1955. X    break;
  1956. X  case ' ':            /* this means we don't really load */
  1957. X    break;
  1958. X  default:            /* bad type (someone screwed up) */
  1959. X    return 0;
  1960. X  }
  1961. X  return 1;
  1962. X}
  1963. X
  1964. X/* you can only unload a caravan in certain places */
  1965. Xgood_unloading_place(np, sp, type, quantity)
  1966. X     Snation *np;
  1967. X     Ssector *sp;
  1968. X     char type;            /* type of thing being unloaded */
  1969. X     int quantity;        /* how much, or army id */
  1970. X{
  1971. X  Sarmy *ap, *get_army();
  1972. X
  1973. X  switch (type) {
  1974. X  case 's':
  1975. X  case 'm':
  1976. X  case 'j':
  1977. X  case 'f':
  1978. X  case 't':
  1979. X    if ((np->id == sp->owner) || (is_trade_place(sp))) {
  1980. X      return 1;
  1981. X    }
  1982. X    return 0;
  1983. X  case '*':
  1984. X    return 1;
  1985. X  case 'p':
  1986. X    if ((sp->designation == D_TRADE_POST || sp->owner == np->id)
  1987. X    && good_altitude(sp, np)) {
  1988. X      return 1;
  1989. X    }
  1990. X    return 0;
  1991. X  case 'a':
  1992. X    if (!(ap = get_army(np, quantity))) {
  1993. X      return 0;
  1994. X    }
  1995. X    if (!good_army_altitude(np, sp, ap)) {
  1996. X      return 0;
  1997. X    }
  1998. X    if (sp->owner == np->id) {
  1999. X      return 1;
  2000. X    }
  2001. X    if (is_front_line(ap)) {
  2002. X      return 1;
  2003. X    }
  2004. X    if (sp->designation == D_TRADE_POST) {
  2005. X      return 1;
  2006. X    }
  2007. X    return 0;
  2008. X  case ' ':
  2009. X    return 1;
  2010. X  default:
  2011. X    return 0;
  2012. X  }
  2013. X/*
  2014. X  if (np->id == 0) {
  2015. X    return 0;
  2016. X  }
  2017. X  if (np->id == sp->owner) {
  2018. X    return 1;
  2019. X  }
  2020. X  if ( (np->id != sp->owner) && (sp->designation == D_TRADE_POST) ) {
  2021. X    return 1;
  2022. X  }
  2023. X  return 0;
  2024. X*/
  2025. X}
  2026. X
  2027. X
  2028. X/* keeps a status line on the transportation window which
  2029. X   which shows you the cargo on the currently selected army */
  2030. Xcargo_statline(w, up)
  2031. X     WINDOW *w;
  2032. X     Suser *up;
  2033. X{
  2034. X  char * s;
  2035. X  Sarmy *ap, *get_army();
  2036. X  char * make_cargo_statline ();
  2037. X
  2038. X  if ((ap = get_army(up->np, up->current_army)) == NULL) {
  2039. X    return;
  2040. X  }
  2041. X  
  2042. X  s = make_cargo_statline (&ap->cargo);
  2043. X
  2044. X  if (w) {
  2045. X    mvwaddstr(w, 5, 2, s);
  2046. X    wclrtoeol(w);
  2047. X    box (w, '|', '-');
  2048. X    wrefresh(w);
  2049. X  } else {            /* if w is NULL, we are in xmode */
  2050. X    statline(s, "transp[l,u,t]");
  2051. X  }
  2052. X}
  2053. X
  2054. X/* gives cargo from one nation to another */
  2055. Xdonate_cargo(x, y, from_id, to_id, cargo)
  2056. X     int from_id, to_id;
  2057. X     Scargo *cargo;
  2058. X{
  2059. X  Sarmy *ap, *get_army();
  2060. X  Ssector *sp;
  2061. X  FILE *fp, *fopen();
  2062. X  struct argument args[N_EXEC_ARGS];
  2063. X  char s[NAMELEN];
  2064. X  int n_people;
  2065. X
  2066. X  while (cargo_is_locked()) {
  2067. X    sleep(1);
  2068. X  }
  2069. X  critical();
  2070. X  lock_cargo();
  2071. X  if ((fp = fopen(CARGO_FILE, "a")) == NULL) {
  2072. X    statline("hit space", "serious error:  cannot append to trade file");
  2073. X    get_space();
  2074. X    return;
  2075. X  }
  2076. X    /* coordinates of where the trade happened */
  2077. X  fwrite(&x, sizeof(int), 1, fp);
  2078. X  fwrite(&y, sizeof(int), 1, fp);
  2079. X  fwrite(&from_id, sizeof(int), 1, fp);
  2080. X  fwrite(&to_id, sizeof(int), 1, fp);
  2081. X  fwrite(cargo, sizeof(Scargo), 1, fp);
  2082. X    /* handle the donation of an army */
  2083. X  if ((ap = get_army(user.np, cargo->army)) != NULL) {
  2084. X    fwrite(ap, sizeof(Sarmy), 1, fp);
  2085. X    if (!is_spirit (ap)) {
  2086. X      n_people = ap->n_soldiers;
  2087. X    }
  2088. X    else n_people = 0;
  2089. X    sprintf(s, "ADISBAND:%d\n", ap->id);
  2090. X    gen_exec(s);
  2091. X    parse_exec_line(s,args);
  2092. X    run_exec_line(user.np,args);
  2093. X    /* Unfortunately, ADISBAND puts the people from the disbanding
  2094. X       onto the trade sector, thus furnishing some free people ... */
  2095. X    sp = &world.map[ap->pos.x][ap->pos.y];
  2096. X    cpeople_sector (sp, -n_people);
  2097. X    sp->n_people -= n_people;
  2098. X    delete_army_sector(sp, ap);
  2099. X    delete_army_nation(user.np, ap);
  2100. X  }
  2101. X    /* now handle the donation of a land title */
  2102. X  sp = &world.map[cargo->title.x][cargo->title.y];
  2103. X
  2104. X  fclose(fp);
  2105. X  unlock_cargo();
  2106. X  noncritical();
  2107. X}
  2108. X
  2109. X/* lock and unlock the cargo data file */
  2110. Xlock_cargo()
  2111. X{
  2112. X  FILE *fp, *fopen();
  2113. X  char fname[NAMELEN];
  2114. X
  2115. X  strcpy(fname, CARGO_FILE);
  2116. X  strcat(fname, ".LOCK");
  2117. X
  2118. X  if ((fp = fopen(fname, "w")) == NULL)
  2119. X  {
  2120. X    fprintf(stderr,"Error: Cannot open lockfile %s\n",CARGO_FILE);
  2121. X    clean_exit();
  2122. X    exit(1);
  2123. X  }
  2124. X}
  2125. X
  2126. Xunlock_cargo()
  2127. X{
  2128. X  char fname[NAMELEN];
  2129. X
  2130. X  strcpy(fname, CARGO_FILE);
  2131. X  strcat(fname, ".LOCK");
  2132. X
  2133. X  unlink(fname);
  2134. X}
  2135. X
  2136. X/* check if the cargo data file is locked */
  2137. Xcargo_is_locked()
  2138. X{
  2139. X  FILE *fp, *fopen();
  2140. X  char fname[NAMELEN];
  2141. X
  2142. X  strcpy(fname, CARGO_FILE);
  2143. X  strcat(fname, ".LOCK");
  2144. X
  2145. X  if ((fp = fopen(fname, "r")) == NULL) {
  2146. X    return 0;
  2147. X  }
  2148. X  fclose(fp);
  2149. X  return 1;
  2150. X}
  2151. X
  2152. X/* valid trading places are cities, capitals and trade posts */
  2153. Xis_trade_place(sp)
  2154. X     Ssector *sp;
  2155. X{
  2156. X  switch (sp->designation) {
  2157. X  case D_CAPITAL:
  2158. X  case D_CITY:
  2159. X  case D_TRADE_POST:
  2160. X    return 1;
  2161. X  default:
  2162. X    return 0;
  2163. X  }
  2164. X}
  2165. X
  2166. X/* returns true if there is a cargo */
  2167. X
  2168. Xcargo_not_empty(cargop)
  2169. X     Scargo *cargop;
  2170. X{
  2171. X  if (cargop->money > 0 || cargop->metal > 0 || cargop->jewels > 0
  2172. X      || cargop->food > 0 || cargop->people > 0 || cargop->army != -1
  2173. X      || cargop->title.x != -1 || cargop->title.y != -1) {
  2174. X    return 1;
  2175. X  }
  2176. X  return 0;
  2177. X}
  2178. X
  2179. X/* returns true if we cannot fit this additional load
  2180. X   onto the ship or caravan. */
  2181. Xload_too_big(np, ap, c, quantity)
  2182. X     Snation *np;
  2183. X     Sarmy *ap;            /* the carrier */
  2184. X     char c;            /* the type of load */
  2185. X     int quantity;        /* how much */
  2186. X{
  2187. X  Sarmy *cargo_ap;
  2188. X  float capacity, quantity_weight;
  2189. X
  2190. X  if (is_cargo (ap)) {
  2191. X    capacity = ap->n_soldiers * CARAVAN_CAPACITY;
  2192. X  } else capacity = 0;   /* Someone made a booboo */
  2193. X
  2194. X  switch (c) {
  2195. X  case 's':            /* money and other things */
  2196. X    quantity_weight = quantity * MONEY_WEIGHT;
  2197. X    break;
  2198. X  case 'm':
  2199. X    quantity_weight = quantity * METAL_WEIGHT;
  2200. X    break;
  2201. X  case 'j':
  2202. X    quantity_weight = quantity * JEWEL_WEIGHT;
  2203. X    break;
  2204. X  case 'f':
  2205. X    quantity_weight = quantity * FOOD_WEIGHT;
  2206. X    break;
  2207. X  case 'p':
  2208. X    quantity_weight = quantity;
  2209. X    break;
  2210. X  case 'a':
  2211. X    if (cargo_ap = get_army(np, quantity)) {
  2212. X      quantity_weight = army_weight (cargo_ap);
  2213. X    }
  2214. X    else { quantity_weight = 0; }  /* no army ?!? */
  2215. X    break;
  2216. X  case 't':
  2217. X    quantity_weight = 0;
  2218. X    break;
  2219. X  default: /* Someone made a booboo */
  2220. X    return 0;
  2221. X  }
  2222. X  quantity_weight += cargo_weight (&ap->cargo);
  2223. X
  2224. X  if (quantity_weight > capacity) { 
  2225. X    return 1;
  2226. X  }
  2227. X  
  2228. X  return 0;
  2229. X}
  2230. X
  2231. X/* Returns the weight of an army, whether normal or a caravan/navy */
  2232. X
  2233. Xint army_weight (ap)
  2234. X
  2235. XSarmy * ap;
  2236. X{
  2237. X  int weight, index;
  2238. X  float weight_per;
  2239. X
  2240. X  index = army_type_index (ap->type);
  2241. X
  2242. X  if (is_cargo(ap)) {
  2243. X    weight = caravan_weight (ap);
  2244. X  }
  2245. X  else if (is_spirit (ap)) {
  2246. X    weight = ap->n_soldiers;
  2247. X  }
  2248. X  else {
  2249. X    weight_per = ((float) army_types [index].metal_draft / 100.0) + 
  2250. X      ((float) army_types [index].metal_maint / 100) + 1.0;
  2251. X    weight = weight_per * ap->n_soldiers;
  2252. X  }
  2253. X  return weight;
  2254. X}
  2255. X
  2256. X/* Returns the weight of a caravan, plus any subsidiary cargo */
  2257. X
  2258. Xint caravan_weight (ap)
  2259. X
  2260. XSarmy * ap;
  2261. X{
  2262. X  int weight = 0, caravan_index;
  2263. X
  2264. X  caravan_index = army_type_index (ap->type);
  2265. X
  2266. X  /* Get the weight of the cargo */
  2267. X  weight += cargo_weight (&ap->cargo);
  2268. X  /* Caravans have 1000 weight (when empty :-) */
  2269. X  weight += army_types [caravan_index].metal_draft * ap->n_soldiers;
  2270. X
  2271. X  return weight;
  2272. X}
  2273. X
  2274. X/* Returns the weight of a cargo */
  2275. X
  2276. Xint cargo_weight (cargo)
  2277. X
  2278. XScargo * cargo;
  2279. X{
  2280. X  int weight = 0;
  2281. X
  2282. X  if (cargo->army >= 0) {
  2283. X    weight += army_weight (get_army (user.np, cargo->army));
  2284. X  }
  2285. X  weight += cargo->people;
  2286. X  weight += cargo->jewels * JEWEL_WEIGHT;
  2287. X  weight += cargo->metal * METAL_WEIGHT;
  2288. X  weight += cargo->food * FOOD_WEIGHT;
  2289. X  weight += cargo->money * MONEY_WEIGHT;
  2290. X
  2291. X  return weight;
  2292. X}
  2293. X
  2294. X/* Builds cargo statline out of the cargo struct */
  2295. X
  2296. Xchar * make_cargo_statline (cargo)
  2297. X
  2298. XScargo * cargo;
  2299. X{
  2300. X  char * rstatline;
  2301. X  char tmps [60];
  2302. X
  2303. X  if ((rstatline = (char *)malloc (sizeof (char) * 100)) == NULL) {
  2304. X    clean_exit();
  2305. X    exit (-1);
  2306. X  }
  2307. X
  2308. X  sprintf (rstatline, "(%d mw)", cargo_weight (cargo));
  2309. X
  2310. X  strcat (rstatline, contents (cargo->money, cargo->metal, cargo->jewels,
  2311. X                   cargo->food, cargo->people, cargo->army,
  2312. X                   &cargo->title, 0));
  2313. X
  2314. X  return rstatline;
  2315. X}
  2316. X
  2317. X/* puts out an exec line describing the new cargo of a caravan */
  2318. Xadjust_cargo(ap)
  2319. X     Sarmy *ap;
  2320. X{
  2321. X  char s[EXECLEN];
  2322. X
  2323. X  sprintf(s, "ACARGO:%d:%d:%d:%d:%d:%d:%d:%d:%d\n", ap->id, ap->cargo.money,
  2324. X       ap->cargo.metal, ap->cargo.jewels, ap->cargo.food,
  2325. X       ap->cargo.people, ap->cargo.army, ap->cargo.title.x, ap->cargo.title.y);
  2326. X  gen_exec(s);
  2327. X}
  2328. END_OF_FILE
  2329. if test 27480 -ne `wc -c <'transport.c'`; then
  2330.     echo shar: \"'transport.c'\" unpacked with wrong size!
  2331. fi
  2332. # end of 'transport.c'
  2333. fi
  2334. echo shar: End of archive 18 \(of 28\).
  2335. cp /dev/null ark18isdone
  2336. MISSING=""
  2337. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ; do
  2338.     if test ! -f ark${I}isdone ; then
  2339.     MISSING="${MISSING} ${I}"
  2340.     fi
  2341. done
  2342. if test "${MISSING}" = "" ; then
  2343.     echo You have unpacked all 28 archives.
  2344.     echo "Now execute ./do_cat.sh to build doc files"
  2345.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2346. else
  2347.     echo You still need to unpack the following archives:
  2348.     echo "        " ${MISSING}
  2349. fi
  2350. ##  End of shell archive.
  2351. exit 0
  2352.