|
|
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: 2205 (0x89d)
Types: TextFile
Names: »objinit.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Spacewar/objinit.c«
/*
* Spacewar - read in objects and set them up for the universe
*
* Copyright 1985 obo Systems, Inc.
* Copyright 1985 Dan Rosenblatt
*/
#include <stdio.h>
#include "spacewar.h"
#include "universe.h"
#include "obj.h"
VOID objinit()
{
FILE *fobj;
struct obj *p=objlst;
struct universe *puniv;
#ifdef DEBUG
DBG("objinit()\n");
#endif
if (!(fobj = fopen(SWOBJ,"r"))) {
perror(SWOBJ);
exit(1);
}
/* try to read the exact number of objects that there should be */
for (p=objlst;p < objlst+MAXOBJ;++p)
if (fscanf(fobj,"%ld\t%hd\t%c\t%d\t%hd\t%ld\t%lf\t%lf\t%lf\t%lf\n",
&p->oj_mass,&p->oj_rad,&p->oj_rep,&p->oj_octr.ip_ofst,&p->oj_oprd,
&p->oj_orad,&p->oj_ocrpt,&p->oj_optx,&p->oj_opty,&p->oj_optz) != 10) {
perror("bad object");
exit(1);
}
if (!feof(fobj) || ferror(fobj) || fclose(fobj)) {
perror(SWOBJ);
exit(1);
}
/* fix up orbital center and rotation matrix */
for (p=objlst+MAXOBJ;p-- > objlst;) {
/* validate */
if (p->oj_octr.ip_ofst < 0 ||
p->oj_octr.ip_ofst >= p-objlst) {
if (p != objlst) { /* first object is center of universe */
perror("bad oj_octr");
exit(1);
}
}
switch(p->oj_rep) {
case '.':
p->oj_rep = ' ';
case '*': case 'O': case 'o': case '#':
break;
default:
perror("bad oj_rep");
exit(1);
}
/* rotation matrix */
unity(p->oj_rmat);
xrot(p->oj_rmat,NEG(MUL(p->oj_optx,DEGTORAD)));
yrot(p->oj_rmat,NEG(MUL(p->oj_opty,DEGTORAD)));
zrot(p->oj_rmat,NEG(MUL(p->oj_optz,DEGTORAD)));
/* place into universe */
p->oj_octr.ip_ptr = univlst + p->oj_octr.ip_ofst;
puniv = univlst + (p - objlst);
puniv->uv_type = 'O';
puniv->uv_pctr = p->oj_rep;
puniv->uv_pstn = p->oj_pstn;
puniv->uv_mass = p->oj_mass;
puniv->uv_rad = p->oj_rad;
puniv->uv_ptr.uv_obj = p;
p->oj_univ.ip_ptr = puniv;
}
/* update objects so that universe position is current */
/* (necessary because of first-time players that crank */
/* up a new instance of the game and how they are put */
/* into the universe the very first time) */
updobjs();
#ifdef DEBUG
VDBG("objinit return\n");
#endif
}