ship capacities and CR 66

This commit is contained in:
Enno Rehling 2010-01-24 01:01:27 +00:00
parent 5fc0ed8631
commit f93c2f28ef
8 changed files with 26 additions and 49 deletions

View file

@ -81,7 +81,7 @@ extern int verbosity;
boolean opt_cr_absolute_coords = false; boolean opt_cr_absolute_coords = false;
/* globals */ /* globals */
#define C_REPORT_VERSION 65 #define C_REPORT_VERSION 66
#define TAG_LOCALE "de" #define TAG_LOCALE "de"
#ifdef TAG_LOCALE #ifdef TAG_LOCALE
@ -611,16 +611,14 @@ cr_output_ship(FILE * F, const ship * sh, const unit * u, int fcaptain, const fa
if (u && (u->faction == f || omniscient(f))) { if (u && (u->faction == f || omniscient(f))) {
int n = 0, p = 0; int n = 0, p = 0;
int mweight = shipcapacity(sh); int mweight = shipcapacity(sh);
int mcabins = sh->type->cabins;
getshipweight(sh, &n, &p); getshipweight(sh, &n, &p);
fprintf(F, "%d;cargo\n", n); fprintf(F, "%d;capacity\n", n);
fprintf(F, "%d;capacity\n", mcabins); fprintf(F, "%d;cargo\n", mweight);
if (sh->type->cabins) {
fprintf(F, "%d;cabins\n", sh->type->cabins);
}
fprintf(F, "%d;speed\n", shipspeed(sh, u)); fprintf(F, "%d;speed\n", shipspeed(sh, u));
n = (n+99) / 100; /* 1 Silber = 1 GE */
fprintf(F, "%d;Ladung\n", n);
fprintf(F, "%d;MaxLadung\n", mweight / 100);
} }
/* shore */ /* shore */
w = NODIRECTION; w = NODIRECTION;

View file

@ -1185,29 +1185,21 @@ enter_ship(unit * u, struct order * ord, int id, boolean report)
return false; return false;
} }
if (CheckOverload()) { if (CheckOverload()) {
static int rule_capacity = -1;
int sweight, scabins; int sweight, scabins;
int mweight = shipcapacity(sh); int mweight = shipcapacity(sh);
int mcabins = sh->type->cabins; int mcabins = sh->type->cabins;
if (rule_capacity<0) { if (mweight>0) {
rule_capacity = get_param_int(global.parameters, "rules.ship.capacity", 0);
}
if (rule_capacity!=0) {
mcabins *= PERSON_WEIGHT;
}
if (mweight>0 && mcabins>0) {
getshipweight(sh, &sweight, &scabins); getshipweight(sh, &sweight, &scabins);
sweight += weight(u); sweight += weight(u);
if (rule_capacity==0) { if (mcabins) {
scabins += u->number; int pweight = u->number * u->race->weight;
} else {
/* weight goes into number of cabins, not cargo */ /* weight goes into number of cabins, not cargo */
scabins += u->number * u->race->weight; scabins += pweight;
sweight -= u->number * u->race->weight; sweight -= pweight;
} }
if (sweight > mweight || scabins > mcabins) { if (sweight > mweight || (mcabins && (scabins > mcabins))) {
if (report) cmistake(u, ord, 34, MSG_MOVE); if (report) cmistake(u, ord, 34, MSG_MOVE);
return false; return false;
} }

View file

@ -465,21 +465,14 @@ cansail(const region * r, ship * sh)
if (sh->type->construction && sh->size!=sh->type->construction->maxsize) { if (sh->type->construction && sh->size!=sh->type->construction->maxsize) {
return false; return false;
} else { } else {
static int rule_capacity = -1;
int n = 0, p = 0; int n = 0, p = 0;
int mweight = shipcapacity(sh); int mweight = shipcapacity(sh);
int mcabins = sh->type->cabins; int mcabins = sh->type->cabins;
if (rule_capacity<0) {
rule_capacity = get_param_int(global.parameters, "rules.ship.capacity", 0);
}
if (rule_capacity!=0) {
mcabins *= PERSON_WEIGHT;
}
getshipweight(sh, &n, &p); getshipweight(sh, &n, &p);
if (n > mweight) return false; if (n > mweight) return false;
if (p > mcabins) return false; if (mcabins && p > mcabins) return false;
} }
return true; return true;
} }

View file

@ -266,24 +266,19 @@ shipcapacity (const ship * sh)
void void
getshipweight(const ship * sh, int *sweight, int *scabins) getshipweight(const ship * sh, int *sweight, int *scabins)
{ {
static int rule_capacity = -1;
unit * u; unit * u;
*sweight = 0; *sweight = 0;
*scabins = 0; *scabins = 0;
if (rule_capacity<0) {
rule_capacity = get_param_int(global.parameters, "rules.ship.capacity", 0);
}
for (u = sh->region->units; u; u = u->next) { for (u = sh->region->units; u; u = u->next) {
if (u->ship == sh) { if (u->ship == sh) {
*sweight += weight(u); *sweight += weight(u);
if (rule_capacity==0) { if (sh->type->cabins) {
*scabins += u->number; int pweight = u->number * u->race->weight;
} else {
/* weight goes into number of cabins, not cargo */ /* weight goes into number of cabins, not cargo */
*scabins += u->number * u->race->weight; *scabins += pweight;
*sweight -= u->number * u->race->weight; *sweight -= pweight;
} }
} }
} }

View file

@ -37,7 +37,7 @@ typedef struct ship_type {
double storm; /* multiplier for chance to drift in storm */ double storm; /* multiplier for chance to drift in storm */
double damage; /* multiplier for damage taken by the ship */ double damage; /* multiplier for damage taken by the ship */
int cabins; /* max. cabins (people) */ int cabins; /* max. cabins (weight) */
int cargo; /* max. cargo (weight) */ int cargo; /* max. cargo (weight) */
int cptskill; /* min. skill of captain */ int cptskill; /* min. skill of captain */

View file

@ -528,7 +528,7 @@ parse_ships(xmlDocPtr doc)
st->name[1] = strcat(strcpy(malloc(strlen(st->name[0])+3), st->name[0]),"_a"); st->name[1] = strcat(strcpy(malloc(strlen(st->name[0])+3), st->name[0]),"_a");
xmlFree(propValue); xmlFree(propValue);
st->cabins = xml_ivalue(node, "cabins", 0); st->cabins = xml_ivalue(node, "cabins", 0) * PERSON_WEIGHT;
st->cargo = xml_ivalue(node, "cargo", 0); st->cargo = xml_ivalue(node, "cargo", 0);
st->combat = xml_ivalue(node, "combat", 0); st->combat = xml_ivalue(node, "combat", 0);
st->cptskill = xml_ivalue(node, "cptskill", 0); st->cptskill = xml_ivalue(node, "cptskill", 0);

View file

@ -142,7 +142,6 @@
<param name="rules.migrants" value="0"/> <param name="rules.migrants" value="0"/>
<param name="rules.check_overload" value="0"/> <param name="rules.check_overload" value="0"/>
<param name="rules.combat.goblinbonus" value="3"/> <param name="rules.combat.goblinbonus" value="3"/>
<param name="rules.ship.capacity" value="1"/> <!-- -->
<param name="rules.ship.damage_drift" value="0.00"/> <!-- percent damage from drifting--> <param name="rules.ship.damage_drift" value="0.00"/> <!-- percent damage from drifting-->
<param name="rules.alliances" value="1"/> <param name="rules.alliances" value="1"/>
<param name="rules.combat.herospeed" value="3"/> <param name="rules.combat.herospeed" value="3"/>

View file

@ -1,6 +1,6 @@
<?xml version="1.0"?> <?xml version="1.0"?>
<ships> <ships>
<ship name="trireme" range="7" storm="1.00" damage="1.00" cabins="20000" cargo="200000" cptskill="4" minskill="1" sumskill="120" opensea="yes"> <ship name="trireme" range="7" storm="1.00" damage="1.00" cargo="200000" cptskill="4" minskill="1" sumskill="120" opensea="yes">
<coast terrain="ocean"/> <coast terrain="ocean"/>
<coast terrain="plain"/> <coast terrain="plain"/>
<construction skill="shipcraft" minskill="4" maxsize="200" reqsize="1"> <construction skill="shipcraft" minskill="4" maxsize="200" reqsize="1">
@ -8,7 +8,7 @@
</construction> </construction>
</ship> </ship>
<ship name="caravel" range="5" storm="1.00" damage="1.00" cabins="30000" cargo="300000" cptskill="3" minskill="1" sumskill="30" opensea="yes"> <ship name="caravel" range="5" storm="1.00" damage="1.00" cargo="300000" cptskill="3" minskill="1" sumskill="30" opensea="yes">
<coast terrain="ocean"/> <coast terrain="ocean"/>
<coast terrain="plain"/> <coast terrain="plain"/>
<construction skill="shipcraft" minskill="3" maxsize="250" reqsize="1"> <construction skill="shipcraft" minskill="3" maxsize="250" reqsize="1">
@ -16,7 +16,7 @@
</construction> </construction>
</ship> </ship>
<ship name="dragonship" range="5" storm="1.00" damage="1.00" cabins="10000" cargo="100000" cptskill="2" minskill="1" sumskill="50" opensea="yes"> <ship name="dragonship" range="5" storm="1.00" damage="1.00" cargo="100000" cptskill="2" minskill="1" sumskill="50" opensea="yes">
<coast terrain="ocean"/> <coast terrain="ocean"/>
<coast terrain="plain"/> <coast terrain="plain"/>
<construction skill="shipcraft" minskill="2" maxsize="100" reqsize="1"> <construction skill="shipcraft" minskill="2" maxsize="100" reqsize="1">
@ -24,7 +24,7 @@
</construction> </construction>
</ship> </ship>
<ship name="longboat" range="3" storm="1.00" damage="1.00" cabins="5000" cargo="50000" cptskill="1" minskill="1" sumskill="10" opensea="yes"> <ship name="longboat" range="3" storm="1.00" damage="1.00" cargo="50000" cptskill="1" minskill="1" sumskill="10" opensea="yes">
<coast terrain="ocean"/> <coast terrain="ocean"/>
<coast terrain="plain"/> <coast terrain="plain"/>
<construction skill="shipcraft" minskill="1" maxsize="50" reqsize="1"> <construction skill="shipcraft" minskill="1" maxsize="50" reqsize="1">
@ -32,7 +32,7 @@
</construction> </construction>
</ship> </ship>
<ship name="balloon" range="2" storm="1.00" damage="1.00" cabins="500" cargo="5000" cptskill="6" minskill="6" sumskill="6" opensea="yes" fly="yes"> <ship name="balloon" range="2" storm="1.00" damage="1.00" cargo="5000" cptskill="6" minskill="6" sumskill="6" opensea="yes" fly="yes">
<coast terrain="ocean"/> <coast terrain="ocean"/>
<coast terrain="plain"/> <coast terrain="plain"/>
<coast terrain="swamp"/> <coast terrain="swamp"/>
@ -47,7 +47,7 @@
<construction skill="shipcraft" minskill="100" maxsize="5" reqsize="1"/> <construction skill="shipcraft" minskill="100" maxsize="5" reqsize="1"/>
</ship> </ship>
<ship name="boat" range="2" storm="1.00" damage="1.00" cabins="500" cargo="5000" cptskill="1" minskill="1" sumskill="2" opensea="yes"> <ship name="boat" range="2" storm="1.00" damage="1.00" cargo="5000" cptskill="1" minskill="1" sumskill="2" opensea="yes">
<coast terrain="ocean"/> <coast terrain="ocean"/>
<coast terrain="plain"/> <coast terrain="plain"/>
<coast terrain="swamp"/> <coast terrain="swamp"/>
@ -64,7 +64,7 @@
</construction> </construction>
</ship> </ship>
<ship name="flyingcarpet" range="3" storm="1.00" damage="1.00" cabins="5000" cargo="50000" cptskill="6" minskill="6" sumskill="10" opensea="yes" fly="yes"> <ship name="flyingcarpet" range="3" storm="1.00" damage="1.00" cargo="50000" cptskill="6" minskill="6" sumskill="10" opensea="yes" fly="yes">
<coast terrain="ocean"/> <coast terrain="ocean"/>
<coast terrain="plain"/> <coast terrain="plain"/>
<coast terrain="swamp"/> <coast terrain="swamp"/>