// If the dragger is to detect for collision between the moving object // and the rest of the world, set up the appropriate collision models. void IvObjectDragger::CheckCollision(bool flag) { _checkCollision = flag; ItemPtr selectedItem = GetSelectedItem(); if (_checkCollision && !!selectedItem) { // synchronize the collision model transform KinBodyItemPtr pbody = boost::dynamic_pointer_cast<KinBodyItem>(selectedItem); if( !!pbody ) { EnvironmentMutex::scoped_try_lock lock(_penv->GetMutex()); if( !!lock ) { int prevoptions = _penv->GetCollisionChecker()->GetCollisionOptions(); _penv->GetCollisionChecker()->SetCollisionOptions(CO_Contacts); CollisionReportPtr preport(new CollisionReport()); if( pbody->GetBody()->CheckSelfCollision(preport) ) { RAVELOG_VERBOSE(str(boost::format("self-collision %s\n")%preport->__str__())); _SetColor(COLLISION_COLOR); } else if( _penv->CheckCollision(KinBodyConstPtr(pbody->GetBody()), preport)) { // if there is a collision, revert to the original transform RAVELOG_VERBOSE(str(boost::format("collision %s\n")%preport->__str__())); _SetColor(COLLISION_COLOR); } else { _SetColor(CHECK_COLOR); } _penv->GetCollisionChecker()->SetCollisionOptions(prevoptions); } } } }
int news(void) { struct natstr *natp; time_t now; int page; time_t then; time_t delta; struct nwsstr nws; struct nstr_item nstr; int page_has_news[N_MAX_PAGE + 1]; int there_is_news = 0; short sectors_taken[MAXNOC][MAXNOC]; short sectors_delta; short max_delta = -1; short abs_delta; short k; int sectors_were_taken = 0; natid i, j; char num[128]; char *verb; if (!snxtitem(&nstr, EF_NEWS, "*", NULL)) return RET_SYN; memset(page_has_news, 0, sizeof(page_has_news)); memset(sectors_taken, 0, sizeof(sectors_taken)); (void)time(&now); natp = getnatp(player->cnum); then = natp->nat_newstim; if (player->argp[1]) { /* * We want to hide events before contact. Proper solution * would be to timestamp the contact. Cheesy approximation: * disable old news. */ if (opt_HIDDEN && !player->god) { pr("Sorry, argument doesn't work with HIDDEN enabled\n"); return RET_FAIL; } delta = days(atoi(player->argp[1])); then = now - delta; } natp->nat_newstim = now; head(); pr("\nThe details of Empire news since %s", ctime(&then)); while (nxtitem(&nstr, &nws)) { if (!nws.nws_vrb || CANT_HAPPEN(nws.nws_vrb > N_MAX_VERB)) continue; if (nws.nws_when < then) continue; if (opt_HIDDEN) { if (!player->god && !(getcontact(getnatp(player->cnum), nws.nws_ano) && getcontact(getnatp(player->cnum), nws.nws_vno))) continue; } ++page_has_news[rpt[(int)nws.nws_vrb].r_newspage]; ++there_is_news; } for (page = 1; page <= N_MAX_PAGE; page++) { if (!page_has_news[page]) continue; pr("\n\t === %s ===\n", page_headings[page].name); snxtitem_rewind(&nstr); while (nxtitem(&nstr, &nws)) { if (CANT_HAPPEN(nws.nws_vrb > N_MAX_VERB)) continue; if (rpt[(int)nws.nws_vrb].r_newspage != page) continue; if (nws.nws_when < then) continue; if (nws.nws_ntm == 0) nws.nws_ntm = 1; if (opt_HIDDEN) { if (!player->god && !(getcontact(getnatp(player->cnum), nws.nws_ano) && getcontact(getnatp(player->cnum), nws.nws_vno))) continue; } if (page == N_FRONT && (nws.nws_vrb == N_WON_SECT || nws.nws_vrb == N_AWON_SECT || nws.nws_vrb == N_PWON_SECT)) { sectors_taken[nws.nws_ano][nws.nws_vno] += nws.nws_ntm; sectors_were_taken += nws.nws_ntm; } preport(&nws); } } if (sectors_were_taken) { for (i = 0; i < MAXNOC; ++i) { for (j = 0; j < i; ++j) { sectors_delta = sectors_taken[i][j] - sectors_taken[j][i]; if (max_delta < abs(sectors_delta)) max_delta = abs(sectors_delta); } } pr("\n\t === The Bottom Line ==\n"); for (k = max_delta; k > 0; --k) { for (i = 0; i < MAXNOC; ++i) { for (j = 0; j < i; ++j) { sectors_delta = sectors_taken[i][j] - sectors_taken[j][i]; abs_delta = abs(sectors_delta); if (abs_delta != k) continue; if (abs_delta == 1) verb = "stole"; else if (abs_delta < 4) verb = "took"; else if (abs_delta < 8) verb = "captured"; else verb = "seized"; if (sectors_delta > 0) { numstr(num, abs_delta); pr("%s %s %s sector%s from %s\n", cname(i), verb, num, splur(sectors_delta), cname(j)); } else if (sectors_delta < 0) { numstr(num, abs_delta); pr("%s %s %s sector%s from %s\n", cname(j), verb, num, splur(-sectors_delta), cname(i)); } } } } } if (!there_is_news) pr("\nNo news at the moment...\n"); return 0; }
static void makemoves(void) { int i, hitme; char ch; while (TRUE) { /* command loop */ hitme = FALSE; justin = 0; Time = 0.0; i = -1; while (TRUE) { /* get a command */ chew(); skip(1); proutn("COMMAND> "); if (scan() == IHEOL) continue; for (i=0; i < 29; i++) // Abbreviations allowed for the first 29 commands, only. if (isit(commands[i])) break; if (i < 29) break; for (; i < NUMCOMMANDS; i++) if (strcmp(commands[i], citem) == 0) break; if (i < NUMCOMMANDS #ifndef CLOAKING && i != 26 // ignore the CLOAK command #endif #ifndef CAPTURE && i != 27 // ignore the CAPTURE command #endif #ifndef SCORE && i != 28 // ignore the SCORE command #endif #ifndef DEBUG && i != 33 // ignore the DEBUG command #endif ) break; if (skill <= SFAIR) { prout("UNRECOGNIZED COMMAND. LEGAL COMMANDS ARE:"); listCommands(TRUE); } else prout("UNRECOGNIZED COMMAND."); } switch (i) { /* command switch */ case 0: // srscan srscan(1); break; case 1: // lrscan lrscan(); break; case 2: // phasers phasers(); if (ididit) { #ifdef CLOAKING if (irhere && d.date >= ALGERON && !isviolreported && iscloaked) { prout("The Romulan ship discovers you are breaking the Treaty of Algeron!"); ncviol++; isviolreported = TRUE; } #endif hitme = TRUE; } break; case 3: // photons photon(); if (ididit) { #ifdef CLOAKING if (irhere && d.date >= ALGERON && !isviolreported && iscloaked) { prout("The Romulan ship discovers you are breaking the Treaty of Algeron!"); ncviol++; isviolreported = TRUE; } #endif hitme = TRUE; } break; case 4: // move warp(1); break; case 5: // shields sheild(1); if (ididit) { attack(2); shldchg = 0; } break; case 6: // dock dock(); break; case 7: // damages dreprt(); break; case 8: // chart chart(0); break; case 9: // impulse impuls(); break; case 10: // rest waiting(); if (ididit) hitme = TRUE; break; case 11: // warp setwrp(); break; case 12: // status srscan(3); break; case 13: // sensors sensor(); break; case 14: // orbit orbit(); if (ididit) hitme = TRUE; break; case 15: // transport "beam" beam(); break; case 16: // mine mine(); if (ididit) hitme = TRUE; break; case 17: // crystals usecrystals(); break; case 18: // shuttle shuttle(); if (ididit) hitme = TRUE; break; case 19: // Planet list preport(); break; case 20: // Status information srscan(2); break; case 21: // Game Report report(0); break; case 22: // use COMPUTER! eta(); break; case 23: listCommands(TRUE); break; case 24: // Emergency exit clearscreen(); // Hide screen freeze(TRUE); // forced save exit(1); // And quick exit break; case 25: probe(); // Launch probe break; #ifdef CLOAKING case 26: cloak(); // turn on/off cloaking if (iscloaking) { attack(2); // We will be seen while we cloak iscloaking = FALSE; iscloaked = TRUE; } break; #endif #ifdef CAPTURE case 27: capture(); // Attempt to get Klingon ship to surrender if (ididit) hitme = TRUE; break; #endif #ifdef SCORE case 28: score(1); // get the score break; #endif case 29: // Abandon Ship abandn(); break; case 30: // Self Destruct dstrct(); break; case 31: // Save Game freeze(FALSE); if (skill > SGOOD) prout("WARNING--Frozen games produce no plaques!"); break; case 32: // Try a desparation measure deathray(); if (ididit) hitme = TRUE; break; #ifdef DEBUG case 33: // What do we want for debug??? debugme(); break; #endif case 34: // Call for help help(); break; case 35: alldone = 1; // quit the game #ifdef DEBUG if (idebug) score(0); #endif break; case 36: helpme(); // get help break; } for (;;) { if (alldone) break; // Game has ended #ifdef DEBUG if (idebug) prout("2500"); #endif if (Time != 0.0) { events(); if (alldone) break; // Events did us in } if (d.galaxy[quadx][quady] == 1000) { // Galaxy went Nova! atover(0); continue; } if (nenhere == 0) movetho(); if (hitme && justin==0) { attack(2); if (alldone) break; if (d.galaxy[quadx][quady] == 1000) { // went NOVA! atover(0); hitme = TRUE; continue; } } break; } if (alldone) break; } }
static void makemoves(void) { int i, hitme; char ch; while (TRUE) { /* command loop */ hitme = FALSE; justin = 0; Time = 0.0; i = -1; while (TRUE) { /* get a command */ chew(); skip(1); proutn("COMMAND> "); // Use of scan() here (after chew) will get a new line of input // and will return IHEOL iff new line of input contains nothing // or a numeric input is detected but conversion fails. if (scan() == IHEOL) continue; for (i=0; i < 26; i++) if (isit(commands[i])) break; if (i < 26) break; for (; i < NUMCOMMANDS; i++) if (strcmp(commands[i], citem) == 0) break; if (i < NUMCOMMANDS) break; // we get here iff the first parsed input from the line does not // match one of the commands. In this case, the rest of the line // is discarded, the below message is printed, and we go back to // get a new command. if (skill <= 2) { prout("UNRECOGNIZED COMMAND. LEGAL COMMANDS ARE:"); listCommands(TRUE); } else prout("UNRECOGNIZED COMMAND."); } // end get command loop // we get here iff the first parsed input from the line matches one // of the commands (i.e., command i). We use i to dispatch the // handling of the command. The line may still contain additional // inputs (i.e., parameters of the command) that is to be parsed by // the dispatched command handler. If the line does not contain // all the necessary parameters, the dispatched command handler is // responsible to get additional input(s) interactively using scan(). // The dispatched command handler is also responsible to handle any // input errors. switch (i) { /* command switch */ case 0: // srscan srscan(1); break; case 1: // lrscan lrscan(); break; case 2: // phasers phasers(); if (ididit) hitme = TRUE; break; case 3: // photons photon(); if (ididit) hitme = TRUE; break; case 4: // move warp(1); break; case 5: // shields sheild(1); if (ididit) { attack(2); shldchg = 0; } break; case 6: // dock dock(); break; case 7: // damages dreprt(); break; case 8: // chart chart(0); break; case 9: // impulse impuls(); break; case 10: // rest waiting(); if (ididit) hitme = TRUE; break; case 11: // warp setwrp(); break; case 12: // status srscan(3); break; case 13: // sensors sensor(); break; case 14: // orbit orbit(); if (ididit) hitme = TRUE; break; case 15: // transport "beam" beam(); break; case 16: // mine mine(); if (ididit) hitme = TRUE; break; case 17: // crystals usecrystals(); break; case 18: // shuttle shuttle(); if (ididit) hitme = TRUE; break; case 19: // Planet list preport(); break; case 20: // Status information srscan(2); break; case 21: // Game Report report(0); break; case 22: // use COMPUTER! eta(); break; case 23: listCommands(TRUE); break; case 24: // Emergency exit clearscreen(); // Hide screen freeze(TRUE); // forced save exit(1); // And quick exit break; case 25: probe(); // Launch probe break; case 26: // Abandon Ship abandn(); break; case 27: // Self Destruct dstrct(); break; case 28: // Save Game freeze(FALSE); if (skill > 3) prout("WARNING--Frozen games produce no plaques!"); break; case 29: // Try a desparation measure deathray(); if (ididit) hitme = TRUE; break; case 30: // What do we want for debug??? #ifdef DEBUG debugme(); #endif break; case 31: // Call for help help(); break; case 32: alldone = 1; // quit the game #ifdef DEBUG if (idebug) score(); #endif break; case 33: helpme(); // get help break; } // end command switch for (;;) { if (alldone) break; // Game has ended #ifdef DEBUG if (idebug) prout("2500"); #endif if (Time != 0.0) { events(); if (alldone) break; // Events did us in } if (d.galaxy[quadx][quady] == 1000) { // Galaxy went Nova! atover(0); continue; } if (nenhere == 0) movetho(); if (hitme && justin==0) { attack(2); if (alldone) break; if (d.galaxy[quadx][quady] == 1000) { // went NOVA! atover(0); hitme = TRUE; continue; } } break; } // end event loop if (alldone) break; } // end command loop }