|
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 u
Length: 5782 (0x1696) Types: TextFile Names: »updaln.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987 └─⟦this⟧ »EUUGD18/General/Spacewar/updaln.c«
/* * Spacewar - alien intelligence * thrust toward and attack * find a player to attack/randomly de-assign * if not attacking, randomly thrust toward objects * * Copyright 1985 obo Systems, Inc. * Copyright 1985 Dan Rosenblatt */ #include "spacewar.h" #ifndef VMS #include <sys/types.h> #else /* BSD SYSIII SYSV */ #include <types.h> #endif /* VMS */ #include "universe.h" #include "sys.h" #include "aln.h" #include "build.h" #include "flds.h" #include "login.h" #include "crft.h" #include "torp.h" #include "obj.h" static VOID thr(paln,tmpvec) struct aln *paln; double *tmpvec; { rttosp(tmpvec,tmpvec); tmpvec[0] = FLOAT(RANDOM(50)+20); sptort(tmpvec,tmpvec); vdiff(tmpvec,paln->al_vel,paln->al_thr); } VOID updaln() { register struct aln *paln; struct sys *psys; register struct universe *puniv; double vdist(),ftmp,tmpvec[3]; long l; int i; dsplcmnt tmpdspl; #ifdef DEBUG DBG("updaln()\n"); #endif for (paln=alnlst+MAXALN;paln-- > alnlst;paln->al_dly -= 1) { psys = paln->al_sys; if (paln->al_atck.ip_ptr) { /*ftmp = vdist(paln->al_atck.ip_ptr->uv_pstn,paln->al_pstn);*/ tmpdspl = vdisp(paln->al_atck.ip_ptr,paln->al_univ.ip_ptr,'d'); ftmp = tmpdspl.dst; } /* not attacking or delaying or no energy+phasers to attack with */ if (!paln->al_atck.ip_ptr || paln->al_dly > 0 || !psys[DILITH].s_cap || !psys[PHASERS].s_cap) goto noatck; /* too far away to attack; less chance if closer */ if (SUB(ftmp,2500.) > 0.) goto noatck; if (RANDOM(100) > 15 + INT(ftmp)/25) goto noatck; /* attack and set delay */ if ((l = INT(ftmp)/(RANDOM(50)+1)) > 100L) l = 100L; if (paln->al_aeval > 500) l += paln->al_aeval/20; if (l > psys[DILITH].s_lvl && psys[DILITH].s_lvl < 50) goto noatck; if (l > psys[DILITH].s_lvl) l = psys[DILITH].s_lvl; psys[DILITH].s_lvl -= l; l *= psys[PHASERS].s_pct; l /= 100L; l *= 100L - psys[PHASERS].s_dmg; l /= 100L; l *= psys[PHASERS].s_cap; l /= 100L; /*for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) if (puniv->uv_type == 'A' && puniv->uv_ptr.uv_aln == paln) damage(puniv,paln->al_atck.ip_ptr,1.,FLOAT(l), "Phaser attack"); */ damage(paln->al_univ.ip_ptr,paln->al_atck.ip_ptr,1.,FLOAT(l), "Phaser attack"); paln->al_dly = 3; noatck: /* find an attackee */ if (paln->al_atck.ip_ptr) ; else if (RANDOM(100) < 10) { /* find a close one */ for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) if (puniv->uv_type == 'P' && !puniv->uv_ptr.uv_crft->cr_dock.ip_ptr) { tmpdspl = vdisp(paln->al_univ.ip_ptr,puniv,'d'); if (SUB(tmpdspl.dst,500.) < 0.) { paln->al_atck.ip_ptr = puniv; paln->al_dly = 50; ftmp = tmpdspl.dst; break; } } } else if (RANDOM(100) > 90) { /* choose a random one */ puniv = univlst + RANDOM(MAXUNIVERSE-MAXOBJ) + MAXOBJ; if (puniv->uv_type == 'P' && !puniv->uv_ptr.uv_crft->cr_dock.ip_ptr) { paln->al_atck.ip_ptr = puniv; paln->al_dly = 50; /*ftmp = vdist(puniv->uv_pstn,paln->al_pstn);*/ tmpdspl = vdisp(puniv,paln->al_univ.ip_ptr,'d'); ftmp = tmpdspl.dst; } } /* randomly de-assign; decreasing probability based on aeval */ if (paln->al_atck.ip_ptr && RANDOM(5000) < 500 - paln->al_aeval) paln->al_atck.ip_ptr = NULL; if (paln->al_aeval > 0) paln->al_aeval -= 1; /* decay of evaluation (lose interest) */ /* get closer to attackee by warping */ if (paln->al_atck.ip_ptr && psys[WARP].s_cap && (l=500L+15L*INT(SQRT(ftmp))) > 1170L && psys[WARP].s_lvl >= l) { psys[WARP].s_lvl -= l; paln->al_dly = 5; for (i=0;i<3;++i) paln->al_pstn[i] = ADD(paln->al_atck.ip_ptr->uv_pstn[i], FLOAT(RANDOM(600) - 300)); vchngd(paln->al_univ.ip_ptr); for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) { register struct crft *pcrft; if (puniv->uv_type != 'P') continue; pcrft = puniv->uv_ptr.uv_crft; if (pcrft->cr_auto.ip_ptr && pcrft->cr_auto.ip_ptr->uv_type == 'A' && pcrft->cr_auto.ip_ptr->uv_ptr.uv_aln == paln) { pcrft->cr_auto.ip_ptr = NULL; biton(pcrft->cr_chng,BIT_AUTOFFWD); } if (pcrft->cr_dock.ip_ptr && pcrft->cr_dock.ip_ptr->uv_type == 'A' && pcrft->cr_auto.ip_ptr->uv_ptr.uv_aln == paln) { pcrft->cr_dock.ip_ptr = NULL; pcrft->cr_scrn[7][15] = '?'; } } } /* compute thrust */ /* not attacking, go toward an object */ if (!paln->al_atck.ip_ptr && paln->al_dly <= 0) { puniv = univlst + RANDOM(MAXOBJ); /*vdiff(puniv->uv_pstn,paln->al_pstn,tmpvec);*/ tmpdspl = vdisp(puniv,paln->al_univ.ip_ptr,'v'); thr(paln,/*tmpvec*/tmpdspl.vec); paln->al_dly = 200; /* attacking, go toward attackee */ } else if (paln->al_atck.ip_ptr) { if (paln->al_dly < -60) { /* long wait ==> break off */ /*vdiff(paln->al_pstn,paln->al_atck.ip_ptr->uv_pstn,tmpvec);*/ tmpdspl = vdisp(paln->al_univ.ip_ptr,paln->al_atck.ip_ptr,'v'); thr(paln,/*tmpvec*/tmpdspl.vec); paln->al_dly = 20; paln->al_atck.ip_ptr = NULL; } else { /*ftmp = vdist(paln->al_pstn,paln->al_atck.ip_ptr->uv_pstn);*/ tmpdspl = vdisp(paln->al_univ.ip_ptr,paln->al_atck.ip_ptr,'d'); ftmp = tmpdspl.dst; for (i=0;i<3;++i) tmpvec[i] = ADD(paln->al_pstn[i],paln->al_vel[i]); ftmp = SUB(ftmp,vdist(tmpvec,paln->al_atck.ip_ptr->uv_pstn)); if (ftmp <= 0.) { /* getting further away */ /*vdiff(paln->al_atck.ip_ptr->uv_pstn,paln->al_pstn,tmpvec);*/ tmpdspl = vdisp(paln->al_atck.ip_ptr,paln->al_univ.ip_ptr,'v'); thr(paln,/*tmpvec*/tmpdspl.vec); } } } } #ifdef DEBUG VDBG("updaln return\n"); #endif }