diff --git a/include/ship.h b/include/ship.h index 871525c2..4b952b6b 100644 --- a/include/ship.h +++ b/include/ship.h @@ -31,7 +31,7 @@ * Thomas Ruschak, 1992 * Ken Stevens, 1995 * Steve McClure, 1998 - * Markus Armbruster, 2004-2013 + * Markus Armbruster, 2004-2014 */ #ifndef SHIP_H @@ -183,6 +183,7 @@ extern double shp_torp_hitchance(struct shpstr *, int); /* src/lib/subs/shpsub.c */ extern void shp_sel(struct nstr_item *, struct emp_qelem *); +extern struct ulist *shp_insque(struct shpstr *, struct emp_qelem *); extern void shp_nav(struct emp_qelem *, double *, double *, int *, natid); extern int shp_sweep(struct emp_qelem *, int, int, natid); extern enum d_navigation shp_check_nav(struct shpstr *, struct sctstr *); diff --git a/src/lib/subs/shpsub.c b/src/lib/subs/shpsub.c index cb73c636..577c5734 100644 --- a/src/lib/subs/shpsub.c +++ b/src/lib/subs/shpsub.c @@ -29,7 +29,7 @@ * Known contributors to this file: * Ken Stevens, 1995 * Steve McClure, 1996-2000 - * Markus Armbruster, 2006-2013 + * Markus Armbruster, 2006-2014 */ #include @@ -61,8 +61,6 @@ void shp_sel(struct nstr_item *ni, struct emp_qelem *list) { struct shpstr ship; - struct mchrstr *mcp; - struct ulist *mlp; emp_initque(list); while (nxtitem(ni, &ship)) { @@ -73,7 +71,6 @@ shp_sel(struct nstr_item *ni, struct emp_qelem *list) */ if (!ship.shp_own || ship.shp_own != player->cnum) continue; - mcp = &mchr[(int)ship.shp_type]; if (opt_MARKET) { if (ontradingblock(EF_SHIP, &ship)) { pr("ship #%d inelligible - it's for sale.\n", @@ -85,14 +82,26 @@ shp_sel(struct nstr_item *ni, struct emp_qelem *list) ship.shp_rflags = 0; memset(ship.shp_rpath, 0, sizeof(ship.shp_rpath)); putship(ship.shp_uid, &ship); - mlp = malloc(sizeof(struct ulist)); - mlp->chrp = (struct empobj_chr *)mcp; - mlp->unit.ship = ship; - mlp->mobil = ship.shp_mobil; - emp_insque(&mlp->queue, list); + shp_insque(&ship, list); } } +/* + * Append SP to LIST. + * Return the new list link. + */ +struct ulist * +shp_insque(struct shpstr *sp, struct emp_qelem *list) +{ + struct ulist *mlp = malloc(sizeof(struct ulist)); + + mlp->chrp = (struct empobj_chr *)&mchr[sp->shp_type]; + mlp->unit.ship = *sp; + mlp->mobil = sp->shp_mobil; + emp_insque(&mlp->queue, list); + return mlp; +} + /* This function assumes that the list was created by shp_sel */ void shp_nav(struct emp_qelem *list, double *minmobp, double *maxmobp, @@ -912,12 +921,7 @@ shp_missdef(struct shpstr *sp, natid victim) char buf[512]; emp_initque(&list); - - mlp = malloc(sizeof(struct ulist)); - mlp->chrp = (struct empobj_chr *)&mchr[(int)sp->shp_type]; - mlp->unit.ship = *sp; - mlp->mobil = sp->shp_mobil; - emp_insque(&mlp->queue, &list); + mlp = shp_insque(sp, &list); sprintf(buf, "%s", prship(&mlp->unit.ship)); eff = sp->shp_effic; diff --git a/src/lib/update/nav_ship.c b/src/lib/update/nav_ship.c index 53873b1c..2010d118 100644 --- a/src/lib/update/nav_ship.c +++ b/src/lib/update/nav_ship.c @@ -256,12 +256,8 @@ nav_ship(struct shpstr *sp) /* Make a list of one ships so we can use the navi.c code */ emp_initque(&ship_list); - mlp = malloc(sizeof(struct ulist)); - mlp->chrp = (struct empobj_chr *)(mchr + sp->shp_type); - mlp->unit.ship = *sp; + mlp = shp_insque(sp, &ship_list); ef_mark_fresh(EF_SHIP, &mlp->unit.ship); - mlp->mobil = sp->shp_mobil; - emp_insque(&mlp->queue, &ship_list); do { if ((sp->shp_mobil > 0) && (!(sp->shp_autonav & AN_LOADING)) && diff --git a/src/lib/update/sail.c b/src/lib/update/sail.c index e411786d..644086cf 100644 --- a/src/lib/update/sail.c +++ b/src/lib/update/sail.c @@ -337,16 +337,11 @@ fltp_to_list(struct fltheadstr *fltp, struct emp_qelem *list) { struct fltelemstr *fe; struct ulist *mlp; - struct shpstr *sp; emp_initque(list); for (fe = fltp->head; fe; fe = fe->next) { - mlp = malloc(sizeof(struct ulist)); - sp = getshipp(fe->num); - mlp->chrp = (struct empobj_chr *)(mchr + sp->shp_type); - mlp->unit.ship = *sp; + mlp = shp_insque(getshipp(fe->num), list); ef_mark_fresh(EF_SHIP, &mlp->unit.ship); mlp->mobil = fe->mobil; - emp_insque(&mlp->queue, list); } }