|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T o
Length: 6140 (0x17fc) Types: TextFile Names: »order.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/X/Xconq/order.c«
/* Copyright (c) 1987, 1988 Stanley T. Shebs, University of Utah. */ /* This program may be used, copied, modified, and redistributed freely */ /* for noncommercial purposes, so long as this notice remains intact. */ /* RCS $Header: order.c,v 1.1 88/06/21 12:30:30 shebs Exp $ */ #include "config.h" #include "misc.h" #include "dir.h" #include "period.h" #include "side.h" #include "unit.h" char *ordernames[] = ORDERNAMES; /* full names of orders */ char *dirnames[] = DIRNAMES; /* short names of directions */ char orderbuf[BUFSIZE]; /* buffer for printed form of an order */ char oargbuf[BUFSIZE]; /* buffer for order's arguments */ int orderargs[] = ORDERARGS; /* types of parameters for each order */ /* General routine to wake a unit up (and maybe all its cargo). */ wake_unit(unit, wakeocc) Unit *unit; bool wakeocc; { Unit *occ; unit->orders.type = AWAKE; unit->orders.rept = 0; unit->orders.flags = NORMAL; if (wakeocc) { for_all_occupants(unit, occ) wake_unit(occ, wakeocc); } } /* Stash a "wakeup call" - will only be for main unit, not occupants. */ cache_awake(side) Side *side; { side->tmporder->type = AWAKE; side->tmporder->rept = 0; finish_teach(side); } /* Give a unit sentry orders. */ order_sentry(unit, n) Unit *unit; int n; { unit->orders.type = SENTRY; unit->orders.rept = n; } /* Stash sentry orders. */ cache_sentry(side, n) Side *side; int n; { side->tmporder->type = SENTRY; side->tmporder->rept = n; finish_teach(side); } /* Fill in the given unit with direction-moving orders. */ order_movedir(unit, dir, n) Unit *unit; int dir, n; { unit->orders.type = MOVEDIR; unit->orders.p.dir = dir; unit->orders.rept = n; } cache_movedir(side, dir, n) Side *side; int dir, n; { side->tmporder->type = MOVEDIR; side->tmporder->p.dir = dir; side->tmporder->rept = n; finish_teach(side); } /* Give the unit orders to move to a given place - it only needs to do this */ /* once, repetition is nonsensical. */ order_moveto(unit, x, y) Unit *unit; int x, y; { unit->orders.type = MOVETO; unit->orders.rept = 1; unit->orders.p.pt[0].x = x; unit->orders.p.pt[0].y = y; } cache_moveto(side, x, y) Side *side; int x, y; { side->tmporder->type = MOVETO; side->tmporder->rept = 1; side->tmporder->p.pt[0].x = x; side->tmporder->p.pt[0].y = y; finish_teach(side); } /* Order to follow an edge just needs to remember the direction. */ order_edge(unit, d, n) Unit *unit; int d, n; { unit->orders.type = EDGE; unit->orders.rept = n; unit->orders.p.dir = d; } cache_edge(side, d, n) Side *side; int d, n; { side->tmporder->type = EDGE; side->tmporder->rept = n; side->tmporder->p.dir = d; finish_teach(side); } /* Order to follow a unit just needs the unit to follow. */ order_follow(unit, leader, n) Unit *unit, *leader; int n; { unit->orders.type = FOLLOW; unit->orders.rept = n; unit->orders.p.leader = leader; } cache_follow(side, leader, n) Side *side; Unit *leader; int n; { side->tmporder->type = FOLLOW; side->tmporder->rept = n; side->tmporder->p.leader = leader; finish_teach(side); } /* A two-waypoint patrol suffices for many purposes. */ /* Should have a more general patrol routine eventually (> 2 waypoints). */ order_patrol(unit, x0, y0, x1, y1, n) Unit *unit; int x0, y0, x1, y1, n; { unit->orders.type = PATROL; unit->orders.rept = n; unit->orders.p.pt[0].x = x0; unit->orders.p.pt[0].y = y0; unit->orders.p.pt[1].x = x1; unit->orders.p.pt[1].y = y1; } cache_patrol(side, x0, y0, x1, y1, n) Side *side; int x0, y0, x1, y1, n; { side->tmporder->type = PATROL; side->tmporder->rept = n; side->tmporder->p.pt[0].x = x0; side->tmporder->p.pt[0].y = y0; side->tmporder->p.pt[1].x = x1; side->tmporder->p.pt[1].y = y1; finish_teach(side); } /* Switch from standing order teaching mode back to normal, and confirm */ /* that the standing order has been set. */ finish_teach(side) Side *side; { Unit *occ; side->teach = FALSE; side->sounit->standing->orders[side->soutype] = side->tmporder; notify(side, "%s has orders for %s to %s.", unit_handle(side, side->sounit), utypes[side->soutype].name, order_desig(side->tmporder)); for_all_occupants(side->sounit, occ) { if (occ->type == side->soutype) { copy_orders(&(occ->orders), side->tmporder); } } show_timemode(side); } /* Display orders in some coherent fashion. Use the information about the */ /* types of order parameters to decide how to display them. */ char * order_desig(orders) Order *orders; { switch (orderargs[orders->type]) { case NOARG: sprintf(oargbuf, ""); break; case DIR: sprintf(oargbuf, "%s ", dirnames[orders->p.dir]); break; case POS: sprintf(oargbuf, "%d,%d ", orders->p.pt[0].x, orders->p.pt[0].y); break; case LEADER: sprintf(oargbuf, "%s ", unit_handle(NULL, orders->p.leader)); break; case WAYPOINTS: sprintf(oargbuf, "%d,%d %d,%d ", orders->p.pt[0].x, orders->p.pt[0].y, orders->p.pt[1].x, orders->p.pt[1].y); break; default: case_panic("order arg type", orderargs[orders->type]); } if (orders->rept > 1) sprintf(orderbuf, "%s %s(%d)", ordernames[orders->type], oargbuf, orders->rept); else sprintf(orderbuf, "%s %s", ordernames[orders->type], oargbuf); return orderbuf; } /* Yeah yeah, assignment statements supposedly copy structures. */ copy_orders(dst, src) Order *dst, *src; { dst->type = src->type; dst->rept = src->rept; dst->flags = src->flags; switch (orderargs[src->type]) { case NOARG: break; case DIR: dst->p.dir = src->p.dir; break; case POS: dst->p.pt[0].x = src->p.pt[0].x; dst->p.pt[0].y = src->p.pt[0].y; break; case LEADER: /* ??? */ break; case WAYPOINTS: dst->p.pt[0].x = src->p.pt[0].x; dst->p.pt[0].y = src->p.pt[0].y; dst->p.pt[1].x = src->p.pt[1].x; dst->p.pt[1].y = src->p.pt[1].y; break; default: case_panic("order arg type", orderargs[src->type]); } }