void RideItem::computeMetrics() { const QDateTime nilTime; if ((computeMetricsTime != nilTime) && (computeMetricsTime >= zones->modificationTime)) { return; } if (!ride()) return; computeMetricsTime = QDateTime::currentDateTime(); int zone_range = zoneRange(); int num_zones = numZones(); time_in_zone.clear(); if (zone_range >= 0) { num_zones = zones->numZones(zone_range); time_in_zone.resize(num_zones); } int hr_zone_range = hrZoneRange(); int num_hr_zones = numHrZones(); time_in_hr_zone.clear(); if (hr_zone_range >= 0) { num_hr_zones = hrZones->numZones(hr_zone_range); time_in_hr_zone.resize(num_hr_zones); } double secs_delta = ride()->recIntSecs(); foreach (const RideFilePoint *point, ride()->dataPoints()) { if (point->watts >= 0.0) { if (num_zones > 0) { int zone = zones->whichZone(zone_range, point->watts); if (zone >= 0) time_in_zone[zone] += secs_delta; } } if (point->hr >= 0.0) { if (num_hr_zones > 0) { int hrZone = hrZones->whichZone(hr_zone_range, point->hr); if (hrZone >= 0) time_in_hr_zone[hrZone] += secs_delta; } } } QStringList allMetrics; const RideMetricFactory &factory = RideMetricFactory::instance(); for (int i = 0; i < factory.metricCount(); ++i) allMetrics.append(factory.metricName(i)); metrics = RideMetric::computeMetrics(ride(), zones, hrZones, allMetrics); }
double RideItem::timeInHrZone(int zone) { computeMetrics(); if (!ride()) return 0.0; assert(zone < numHrZones()); return time_in_hr_zone[zone]; }
void RideItem::setStartTime(QDateTime newDateTime) { dateTime = newDateTime; setText(0, dateTime.toString("ddd")); setText(1, dateTime.toString("MMM d, yyyy")); setText(2, dateTime.toString("h:mm AP")); ride()->setStartTime(newDateTime); main->notifyRideSelected(); }
bool MinecraftHook::Pig::interactWithPlayer(::Pig* self, Player& player) { if(_interactWithPlayer(self, player)) { return true; } if(self->hasSaddle()) { if(!player.region.getLevel()->isClientSide()) { /* TODO: too lazy to setup vtables */ uintptr_t** vtable = *((uintptr_t***) &player); void (*ride)(Player*, Entity&) = (void (*)(Player*, Entity&)) vtable[104/4]; ride(&player, *self); return true; } } return false; }
bool SrmDevice::download(CommPortPtr dev, const QDir &tmpdir, QString &tmpname, QString &filename, StatusCallback statusCallback, QString &err) { // Totally ghetto, proof-of-concept integration with srmio. cb = statusCallback; QString path; if (!dev2path(dev, path, err)) return false; if (!get_tmpname(tmpdir, tmpname, err)) return false; SrmpcConn srm(path, logfunc); if (!srm.d) { err = "Couldn't open device " + path + ": " + strerror(errno); return false; } int opt_all = 0; // XXX: what does this do? int opt_fixup = 1; // fix bad data like srmwin.exe does SrmioData srmdata(srmpc_get_data(srm.d, opt_all, opt_fixup)); if (!srmdata.d) { err = "srmpc_get_data failed"; return false; } if (srm_data_write_srm7(srmdata.d, tmpname.toAscii().constData()) < 0) { err = "Couldn't write to file " + tmpname + ": " + strerror(errno); return false; } // Read it back in to get the ride start time. SrmFileReader reader; QStringList errs; QFile file(tmpname); QStringList errors; boost::scoped_ptr<RideFile> ride( RideFileFactory::instance().openRideFile(file, errors)); BOOST_FOREACH(QString err, errors) fprintf(stderr, "error: %s\n", err.toAscii().constData()); filename = ride->startTime().toString("yyyy_MM_dd_hh_mm_ss") + ".srm"; return true; }
int cypher(void) { int n; int junk; int lflag; char buffer[10]; lflag = -1; while (wordtype[wordnumber] == ADJS) wordnumber++; while (wordnumber <= wordcount) { switch (wordvalue[wordnumber]) { case UP: if (location[position].access || wiz || tempwiz) { if (!location[position].access) puts("Zap! A gust of wind lifts you up."); if (!battlestar_move(location[position].up, AHEAD)) return (-1); } else { puts("There is no way up"); return (-1); } lflag = 0; break; case DOWN: if (!battlestar_move(location[position].down, AHEAD)) return (-1); lflag = 0; break; case LEFT: if (!battlestar_move(left, LEFT)) return (-1); lflag = 0; break; case RIGHT: if (!battlestar_move(right, RIGHT)) return (-1); lflag = 0; break; case AHEAD: if (!battlestar_move(ahead, AHEAD)) return (-1); lflag = 0; break; case BACK: if (!battlestar_move(back, BACK)) return (-1); lflag = 0; break; case SHOOT: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(location[position].objects, n) && objsht[n]) { wordvalue[wordnumber + 1] = n; wordnumber = shoot(); } wordnumber++; wordnumber++; } else shoot(); break; case TAKE: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(location[position].objects, n) && objsht[n]) { wordvalue[wordnumber + 1] = n; wordnumber = take(location[position].objects); } wordnumber++; wordnumber++; } else take(location[position].objects); break; case DROP: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(inven, n)) { wordvalue[wordnumber + 1] = n; wordnumber = drop("Dropped"); } wordnumber++; wordnumber++; } else drop("Dropped"); break; case KICK: case THROW: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { for (n = 0; n < NUMOFOBJECTS; n++) { if ((testbit(inven, n) || testbit(location[position].objects, n)) && objsht[n]) { wordvalue[wordnumber + 1] = n; wordnumber = throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown"); } } wordnumber += 2; } else throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown"); break; case TAKEOFF: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(wear, n)) { wordvalue[wordnumber + 1] = n; wordnumber = takeoff(); } wordnumber += 2; } else takeoff(); break; case DRAW: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(wear, n)) { wordvalue[wordnumber + 1] = n; wordnumber = draw(); } wordnumber += 2; } else draw(); break; case PUTON: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(location[position].objects, n) && objsht[n]) { wordvalue[wordnumber + 1] = n; wordnumber = puton(); } wordnumber += 2; } else puton(); break; case WEARIT: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(inven, n)) { wordvalue[wordnumber + 1] = n; wordnumber = wearit(); } wordnumber += 2; } else wearit(); break; case EAT: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(inven, n)) { wordvalue[wordnumber + 1] = n; wordnumber = eat(); } wordnumber += 2; } else eat(); break; case PUT: put(); break; case INVEN: if (ucard(inven)) { puts("You are holding:\n"); for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(inven, n)) printf("\t%s\n", objsht[n]); printf("\n= %d kilogram%s (%d%%)\n", carrying, (carrying == 1 ? "." : "s."), (WEIGHT ? carrying * 100 / WEIGHT : -1)); printf("Your arms are %d%% full.\n", encumber * 100 / CUMBER); } else puts("You aren't carrying anything."); if (ucard(wear)) { puts("\nYou are wearing:\n"); for (n = 0; n < NUMOFOBJECTS; n++) if (testbit(wear, n)) printf("\t%s\n", objsht[n]); } else puts("\nYou are stark naked."); if (card(injuries, NUMOFINJURIES)) { puts("\nYou have suffered:\n"); for (n = 0; n < NUMOFINJURIES; n++) if (injuries[n]) printf("\t%s\n", ouch[n]); printf("\nYou can still carry up to %d kilogram%s\n", WEIGHT, (WEIGHT == 1 ? "." : "s.")); } else puts("\nYou are in perfect health."); break; case USE: lflag = use(); break; case LOOK: if (!notes[CANTSEE] || testbit(inven, LAMPON) || testbit(location[position].objects, LAMPON) || matchlight) { beenthere[position] = 2; writedes(); printobjs(); if (matchlight) { puts("\nYour match splutters out."); matchlight = 0; } } else puts("I can't see anything."); return (-1); break; case SU: if (wiz || tempwiz) { printf("\nRoom (was %d) = ", position); fgets(buffer, 10, stdin); if (*buffer != '\n') sscanf(buffer, "%d", &position); printf("Time (was %d) = ", gtime); fgets(buffer, 10, stdin); if (*buffer != '\n') sscanf(buffer, "%d", >ime); printf("Fuel (was %d) = ", fuel); fgets(buffer, 10, stdin); if (*buffer != '\n') sscanf(buffer, "%d", &fuel); printf("Torps (was %d) = ", torps); fgets(buffer, 10, stdin); if (*buffer != '\n') sscanf(buffer, "%d", &torps); printf("CUMBER (was %d) = ", CUMBER); fgets(buffer, 10, stdin); if (*buffer != '\n') sscanf(buffer, "%d", &CUMBER); printf("WEIGHT (was %d) = ", WEIGHT); fgets(buffer, 10, stdin); if (*buffer != '\n') sscanf(buffer, "%d", &WEIGHT); printf("Clock (was %d) = ", gclock); fgets(buffer, 10, stdin); if (*buffer != '\n') sscanf(buffer, "%d", &gclock); printf("Wizard (was %d, %d) = ", wiz, tempwiz); fgets(buffer, 10, stdin); if (*buffer != '\n') { sscanf(buffer, "%d", &junk); if (!junk) tempwiz = wiz = 0; } printf("\nDONE.\n"); return (0); } else puts("You aren't a wizard."); break; case SCORE: printf("\tPLEASURE\tPOWER\t\tEGO\n"); printf("\t%3d\t\t%3d\t\t%3d\n\n", pleasure, power, ego); printf("This gives you the rating of %s in %d turns.\n", rate(), gtime); printf("You have visited %d out of %d rooms this run (%d%%).\n", card(beenthere, NUMOFROOMS), NUMOFROOMS, card(beenthere, NUMOFROOMS) * 100 / NUMOFROOMS); break; case KNIFE: case KILL: murder(); break; case UNDRESS: case RAVAGE: ravage(); break; case SAVE: save(); break; case FOLLOW: lflag = follow(); break; case GIVE: give(); break; case KISS: kiss(); break; case LOVE: love(); break; case RIDE: lflag = ride(); break; case DRIVE: lflag = drive(); break; case LIGHT: light(); break; case LAUNCH: if (!launch()) return (-1); else lflag = 0; break; case LANDIT: if (!land()) return (-1); else lflag = 0; break; case TIME: chime(); break; case SLEEP: zzz(); break; case DIG: dig(); break; case JUMP: lflag = jump(); break; case BURY: bury(); break; case SWIM: puts("Surf's up!"); break; case DRINK: drink(); break; case QUIT: die(0); default: puts("How's that?"); return (-1); break; } if (wordnumber < wordcount && *words[wordnumber++] == ',') continue; else return (lflag); } return (lflag); }
void LooseLightshow::handleNoteOn(byte channel, byte instrument, byte velocity) { isStarted = true; switch (instrument) { case KICK: kick(); break; case SNARE: snare(); break; case SNARE_RIM: snare(); break; case XSTICK: snare(); break; case CRASH1: crash(); break; case CRASH1_EDGE: crash(); break; case CRASH2: crash(); break; case CRASH2_EDGE: crash(); break; case TOM1: tom(); break; case TOM2: tom(); break; case TOM3: tom(); break; case TOM1_RIM: tom(); break; case TOM2_RIM: tom(); break; case TOM3_RIM: tom(); break; case RIDE: ride(); break; case RIDE_EDGE: ride(); break; case RIDE_BELL: ride(); break; case HIHAT_OPEN: hihat(); break; case HIHAT_OPEN_RIM: hihat(); break; case HIHAT_CLOSED: hihat(); break; case HIHAT_CLOSED_RIM: hihat(); break; case HIHAT_PEDAL: break; } }
bool SrmDevice::preview( QString &err ) { srmio_error_t serr; size_t block_cnt; struct _srmio_pc_xfer_block_t block; if( ! is_open ){ if( ! open( err ) ) return false; } rideList.clear(); if( ! srmio_pc_can_preview( pc ) ) // nothing to do return true; if( ! srmio_pc_xfer_start( pc, &serr ) ){ err = tr("failed to start download: %1") .arg(serr.message); goto fail; } if( ! srmio_pc_xfer_get_blocks( pc, &block_cnt, &serr ) ){ err = tr("failed to get number of data blocks: %1") .arg(serr.message); goto fail; } emit updateStatus(tr("found %1 ride blocks").arg(block_cnt)); while( srmio_pc_xfer_block_next( pc, &block )){ DeviceRideItemPtr ride( new DeviceRideItem ); if( block.start ) ride->startTime.setTime_t( 0.1 * block.start ); if( block.end ) ride->endTime.setTime_t( 0.1 * block.end ); ride->work = block.total; ride->wanted = false; rideList.append( ride ); if( block.athlete ) free( block.athlete ); block.athlete = NULL; } if( srmio_pc_xfer_state_success != srmio_pc_xfer_status( pc, &serr ) ){ err = tr( "preview failed: %1") .arg(serr.message); goto fail; } if( ! srmio_pc_xfer_finish( pc, &serr ) ){ err = tr("preview failed: %1") .arg(serr.message); goto fail; } return true; fail: rideList.clear(); return false; }
int RideImportWizard::process() { // set progress bar limits - for each file we // will make 5 passes over the files // 1. checking it is a file ane readable // 2. parsing it with the RideFileReader // 3. [optional] collect date/time information from user // 4. copy file into Library // 5. Process for CPI (not implemented yet) // So, therefore the progress bar runs from 0 to files*4. (since step 5 is not implemented yet) progressBar->setMinimum(0); progressBar->setMaximum(filenames.count()*4); // Pass one - Is it valid? phaseLabel->setText(tr("Step 1 of 4: Check file permissions")); for (int i=0; i < filenames.count(); i++) { // get fullpath name for processing QFileInfo thisfile(filenames[i]); if (thisfile.exists() && thisfile.isFile() && thisfile.isReadable()) { // is it one we understand ? QStringList suffixList = RideFileFactory::instance().suffixes(); QRegExp suffixes(QString("^(%1)$").arg(suffixList.join("|"))); suffixes.setCaseSensitivity(Qt::CaseInsensitive); if (suffixes.exactMatch(thisfile.suffix())) { // Woot. We know how to parse this baby tableWidget->item(i,5)->setText(tr("Queued")); } else { tableWidget->item(i,5)->setText(tr("Error - Unknown file type")); } } else { // Cannot open tableWidget->item(i,5)->setText(tr("Error - Not a valid file")); } progressBar->setValue(progressBar->value()+1); } QApplication::processEvents(); if (aborted) { done(0); } repaint(); // Pass 2 - Read in with the relevant RideFileReader method phaseLabel->setText(tr("Step 2 of 4: Validating Files")); for (int i=0; i< filenames.count(); i++) { // does the status say Queued? if (!tableWidget->item(i,5)->text().startsWith(tr("Error"))) { QStringList errors; QFile thisfile(filenames[i]); tableWidget->item(i,5)->setText(tr("Parsing...")); tableWidget->setCurrentCell(i,5); QApplication::processEvents(); if (aborted) { done(0); } this->repaint(); boost::scoped_ptr<RideFile> ride(RideFileFactory::instance().openRideFile(thisfile, errors)); // did it parse ok? if (ride && errors.empty()) { // ITS A KEEPER, LETS GET SOME METADATA ON DISPLAY tableWidget->item(i,5)->setText(tr("Validated")); // Set Date and Time if (ride->startTime().isNull()) { // Poo. The user needs to supply the date/time for this ride blanks[i] = true; tableWidget->item(i,1)->setText(tr("")); tableWidget->item(i,2)->setText(tr("")); } else { // Cool, the date and time was extrcted from the source file blanks[i] = false; tableWidget->item(i,1)->setText(ride->startTime().toString(tr("dd MMM yyyy"))); tableWidget->item(i,2)->setText(ride->startTime().toString(tr("hh:mm:ss ap"))); } tableWidget->item(i,1)->setTextAlignment(Qt::AlignRight); // put in the middle tableWidget->item(i,2)->setTextAlignment(Qt::AlignRight); // put in the middle // show duration by looking at last data point if (ride->dataPoints().last() != NULL) { int secs = ride->dataPoints().last()->secs; QChar zero = QLatin1Char ( '0' ); QString time = QString("%1:%2:%3").arg(secs/3600,2,10,zero) .arg(secs%3600/60,2,10,zero) .arg(secs%60,2,10,zero); tableWidget->item(i,3)->setText(time); tableWidget->item(i,3)->setTextAlignment(Qt::AlignHCenter); // put in the middle // show distance by looking at last data point int km = ride->dataPoints().last()->km; QString dist = QString ("%1 km").arg(km, 1,10,zero); tableWidget->item(i,4)->setText(dist); tableWidget->item(i,4)->setTextAlignment(Qt::AlignRight); // put in the middle } else { tableWidget->item(i,3)->setText(tr("00:00:00")); // duration tableWidget->item(i,3)->setTextAlignment(Qt::AlignHCenter); // put in the middle tableWidget->item(i,4)->setText(tr("0 km")); tableWidget->item(i,4)->setTextAlignment(Qt::AlignRight); // put in the middle } } else { // nope - can't handle this file tableWidget->item(i,5)->setText(tr("Error - ") + errors.join(tr(" "))); } } progressBar->setValue(progressBar->value()+1); QApplication::processEvents(); if (aborted) { done(0); } this->repaint(); } // Pass 3 - get missing date and times for imported files phaseLabel->setText(tr("Step 3 of 4: Confirm Date and Time")); int needdates=0; bool first = true; for (int i=0; i<filenames.count(); i++) { // ignore errors QTableWidgetItem *t = tableWidget->item(i,5); if (t->text().startsWith(tr("Error"))) continue; // date needed? if (blanks[i]) { needdates++; t = tableWidget->item(i,1); t->setFlags(t->flags() | (Qt::ItemIsEditable)); // make editable ONLY if not present - // we cannot override the RideFileReader if (first) { tableWidget->editItem(t); first = false; } t = tableWidget->item(i,2); t->setFlags(t->flags() | (Qt::ItemIsEditable)); // make editable ONLY if not present - // we cannot override the RideFileReader } // does nothing for the moment progressBar->setValue(progressBar->value()+1); progressBar->repaint(); } // Wait for user to press save abortButton->setText(tr("Save")); aborted = false; cancelButton->setHidden(false); todayButton->setHidden(false); overFiles->setHidden(false); if (needdates == 0) { // no need to wait for the user to input dates // nd press save if all the dates are set // (i.e. they got set by the file importers already) // do nothing for now since we need to confirm dates // and confirm overwrite files rather than importing // without user intervention abortButton->setDisabled(false); // abortClicked(); } else { // de-activate Save button until the dates and times are sorted abortButton->setDisabled(true); } connect(tableWidget, SIGNAL(itemChanged(QTableWidgetItem *)), this, SLOT(activateSave())); return 0; }
// // MIDI // void WitchLightshow::handleNoteOn(byte channel, byte instrument, byte velocity) { switch (instrument) { case KICK: break; case SNARE: break; case CRASH1: crash(); break; case CRASH1_EDGE: crash(); break; case CRASH2: crash(); break; case CRASH2_EDGE: crash(); break; case TOM1: tom(); break; case TOM2: tom(); break; case TOM3: tom(); break; case TOM1_RIM: tom(); break; case TOM2_RIM: tom(); break; case TOM3_RIM: tom(); break; case RIDE: ride(); break; case RIDE_EDGE: ride(); break; case RIDE_BELL: ride(); break; case HIHAT_OPEN: hiHat(); break; case HIHAT_OPEN_RIM: hiHat(); break; case HIHAT_CLOSED: hiHat(); break; case HIHAT_CLOSED_RIM: hiHat(); break; case HIHAT_PEDAL: break; } }
/* returns 0 if error or no more commands to do, * 1 if there are more commands remaining on the current input line */ int cypher(void) { int n; int junk; int lflag = -1; char *filename, *rfilename; size_t filename_len; while (wordnumber <= wordcount) { if (wordtype[wordnumber] != VERB && !(wordtype[wordnumber] == OBJECT && wordvalue[wordnumber] == KNIFE)) { printf("%s: How's that?\n", (wordnumber == wordcount) ? words[wordnumber - 1] : words[wordnumber]); return (0); } switch (wordvalue[wordnumber]) { case AUXVERB: /* Take the following word as the verb */ wordnumber++; return(cypher()); break; case UP: if (location[position].access || wiz || tempwiz) { if (!location[position].access) puts("Zap! A gust of wind lifts you up."); if (!moveplayer(location[position].up, AHEAD)) return (0); } else { puts("There is no way up."); return (0); } lflag = 0; break; case DOWN: if (!moveplayer(location[position].down, AHEAD)) return (0); lflag = 0; break; case LEFT: if (!moveplayer(left, LEFT)) return (0); lflag = 0; break; case RIGHT: if (!moveplayer(right, RIGHT)) return (0); lflag = 0; break; case AHEAD: if (!moveplayer(ahead, AHEAD)) return (0); lflag = 0; break; case BACK: if (!moveplayer(back, BACK)) return (0); lflag = 0; break; case SHOOT: verb_with_all(location[position].objects, OBJ_PERSON, shoot, "shoot at"); break; case TAKE: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { int things; things = 0; for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(location[position].objects, n) && objsht[n]) { things++; wordvalue[wordnumber + 1] = n; /* Some objects (type NOUNS) have special treatment in take(). For these * we must set the type to NOUNS. However for SWORD and BODY all it does * is find which of many objects is meant, so we need do nothing here. * BATHGOD must become NORMGOD as well. NOUNS with no special case must be * included here to get the right error. DOOR cannot occur as an object so * need not be included. */ switch (n) { case BATHGOD: wordvalue[wordnumber + 1] = NORMGOD; /* FALLTHROUGH */ case NORMGOD: case AMULET: case MEDALION: case TALISMAN: case MAN: case TIMER: case NATIVE: wordtype[wordnumber + 1] = NOUNS; break; default: wordtype[wordnumber + 1] = OBJECT; } wordnumber = take(location[position].objects); wordnumber += 2; } if (!things) puts("Nothing to take!"); } else take(location[position].objects); break; case DROP: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { int things; things = 0; for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(inven, n)) { things++; wordvalue[wordnumber + 1] = n; wordnumber = drop("Dropped"); } wordnumber++; wordnumber++; if (!things) puts("Nothing to drop!"); } else drop("Dropped"); break; case KICK: case THROW: if (wordnumber < wordcount && wordvalue[wordnumber + 1] == EVERYTHING) { int things, wv; things = 0; wv = wordvalue[wordnumber]; for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(inven, n) || (TestBit(location[position].objects, n) && objsht[n])) { things++; wordvalue[wordnumber + 1] = n; wordnumber = throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown"); } wordnumber += 2; if (!things) printf("Nothing to %s!\n", wv == KICK ? "kick" : "throw"); } else throw(wordvalue[wordnumber] == KICK ? "Kicked" : "Thrown"); break; case TAKEOFF: verb_with_all(wear, 0, takeoff, "take off"); break; case DRAW: verb_with_all(wear, 0, draw, "draw"); break; case PUTON: verb_with_all(location[position].objects, 0, puton, "put on"); break; case WEARIT: verb_with_all(inven, 0, wearit, "wear"); break; case EAT: verb_with_all(inven, 0, eat, "eat"); break; case PUT: put(); break; case INVEN: if (ucard(inven)) { puts("You are holding:\n"); for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(inven, n)) printf("\t%s\n", objsht[n]); printf("\n= %d kilogram%s ", carrying, (carrying == 1 ? "." : "s.")); if (WEIGHT) printf("(%d%%)\n", carrying * 100 / WEIGHT); else printf("(can't lift any weight%s)\n", (carrying ? " or move with what you have" : "")); if (CUMBER) printf("Your arms are %d%% full.\n", encumber * 100 / CUMBER); else printf("You can't pick anything up.\n"); } else puts("You aren't carrying anything."); if (ucard(wear)) { puts("\nYou are wearing:\n"); for (n = 0; n < NUMOFOBJECTS; n++) if (TestBit(wear, n)) printf("\t%s\n", objsht[n]); } else puts("\nYou are stark naked."); if (card(injuries, NUMOFINJURIES)) { puts("\nYou have suffered:\n"); for (n = 0; n < NUMOFINJURIES; n++) if (injuries[n]) printf("\t%s\n", ouch[n]); printf("\nYou can still carry up to %d kilogram%s\n", WEIGHT, (WEIGHT == 1 ? "." : "s.")); } else puts("\nYou are in perfect health."); break; case USE: lflag = use(); break; case OPEN: dooropen(); break; case LOOK: if (!notes[CANTSEE] || TestBit(inven, LAMPON) || TestBit(location[position].objects, LAMPON) || matchlight) { beenthere[position] = 2; writedes(); printobjs(); if (matchlight) { puts("\nYour match splutters out."); matchlight = 0; } } else puts("I can't see anything."); return (0); /* No commands after a look */ break; case SU: if (wiz || tempwiz) { getnum(&position, "\nRoom (was %d) = ", position); getnum(&ourtime, "Time (was %d) = ", ourtime); getnum(&fuel, "Fuel (was %d) = ", fuel); getnum(&torps, "Torps (was %d) = ", torps); getnum(&CUMBER, "CUMBER (was %d) = ", CUMBER); getnum(&WEIGHT, "WEIGHT (was %d) = ", WEIGHT); getnum(&ourclock, "Clock (was %d) = ", ourclock); if (getnum(&junk, "Wizard (was %d, %d) = ", wiz, tempwiz) != -1 && !junk) tempwiz = wiz = 0; printf("\nDONE.\n"); return (0); /* No commands after a SU */ } else puts("You aren't a wizard."); break; case SCORE: printf("\tPLEASURE\tPOWER\t\tEGO\n"); printf("\t%3d\t\t%3d\t\t%3d\n\n", pleasure, power, ego); printf("This gives you the rating of %s in %d turns.\n", rate(), ourtime); printf("You have visited %d out of %d rooms this run (%d%%).\n", card(beenthere, NUMOFROOMS), NUMOFROOMS, card(beenthere, NUMOFROOMS) * 100 / NUMOFROOMS); break; /* case KNIFE: */ case KILL: murder(); break; case UNDRESS: undress(); break; case RAVAGE: ravage(); break; case SAVE: printf("\nSave file name (default %s): ", DEFAULT_SAVE_FILE); filename = fgetln(stdin, &filename_len); if (filename_len == 0 || (filename_len == 1 && filename[0] == '\n')) rfilename = save_file_name(DEFAULT_SAVE_FILE, strlen(DEFAULT_SAVE_FILE)); else { if (filename[filename_len - 1] == '\n') filename_len--; rfilename = save_file_name(filename, filename_len); } save(rfilename); free(rfilename); break; case VERBOSE: verbose = 1; printf("[Maximum verbosity]\n"); break; case BRIEF: verbose = 0; printf("[Standard verbosity]\n"); break; case FOLLOW: lflag = follow(); break; case GIVE: give(); break; case KISS: kiss(); break; case LOVE: love(); break; case RIDE: lflag = ride(); break; case DRIVE: lflag = drive(); break; case LIGHT: light(); break; case LAUNCH: if (!launch()) return (0); else lflag = 0; break; case LANDIT: if (!land()) return (0); else lflag = 0; break; case TIME: chime(); break; case SLEEP: zzz(); break; case DIG: dig(); break; case JUMP: lflag = jump(); break; case BURY: bury(); break; case SWIM: puts("Surf's up!"); break; case DRINK: drink(); break; case QUIT: die(0); default: puts("How's that?"); return (0); break; } if (!lflag) newlocation(); if (wordnumber < wordcount && !stop_cypher && (*words[wordnumber] == ',' || *words[wordnumber] == '.')) { wordnumber++; return (1); } else return (0); } return (0); }