About: Source:NetHack 1.4f/read.c   Sponge Permalink

An Entity of Type : owl:Thing, within Data Space : 134.155.108.49:8890 associated with source dataset(s)

Below is the full text to read.c from the source code of NetHack 1.4f. To link to a particular line, write [[NetHack 1.4f/read.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code

AttributesValues
rdfs:label
  • Source:NetHack 1.4f/read.c
rdfs:comment
  • Below is the full text to read.c from the source code of NetHack 1.4f. To link to a particular line, write [[NetHack 1.4f/read.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code
dcterms:subject
dbkwik:nethack/pro...iPageUsesTemplate
abstract
  • Below is the full text to read.c from the source code of NetHack 1.4f. To link to a particular line, write [[NetHack 1.4f/read.c#line123]], for example. Warning! This is the source code from an old release. For the latest release, see Source code 1. /* SCCS Id: @(#)read.c 1.4 87/08/08 2. /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */ 3. /* hack.read.c - version 1.0.3 */ 4. 5. #include "hack.h" 6. 7. extern struct monst *makemon(); 8. extern struct permonst pm_eel; 9. extern struct obj *mkobj_at(); 10. char *hcolor(); 11. boolean known; 12. int identify(); 13. 14. doread() { 15. register struct obj *scroll; 16. register boolean confused = (Confusion != 0); 17. 18. known = FALSE; 19. scroll = getobj("#-?", "read"); /* "#-" added by GAN 10/22/86 */ 20. if(!scroll) return(0); 21. 22. /* below added to allow reading of fortune cookies */ 23. if(scroll->otyp ==FORTUNE_COOKIE) { 24. if(Blind) { 25. pline("This cookie has a scrap of paper inside!"); 26. pline("What a pity, that you cannot read it!"); 27. } else 28. outrumor(); 29. useup(scroll); 30. return(1); 31. } else 32. if(scroll->olet != SCROLL_SYM) { 33. pline("That is a silly thing to read."); 34. return(0); 35. } 36. 37. if(!scroll->dknown && Blind) { 38. pline("Being blind, you cannot read the formula on the scroll."); 39. return(0); 40. } 41. if(Blind) 42. pline("As you pronounce the formula on it, the scroll disappears."); 43. else 44. pline("As you read the scroll, it disappears."); 45. if(confused) 46. if (Hallucination) 47. pline("Being so trippy, you screw up ... "); 48. else 49. pline("Being confused, you mispronounce the magic words ... "); 50. 51. if(!seffects(scroll)) { 52. if(!objects[scroll->otyp].oc_name_known) { 53. if(known && !confused) { 54. objects[scroll->otyp].oc_name_known = 1; 55. more_experienced(0,10); 56. } else if(!objects[scroll->otyp].oc_uname) 57. docall(scroll); 58. } 59. #ifdef MARKER 60. if(!(scroll->otyp == SCR_BLANK_PAPER) || confused) 61. #endif 62. useup(scroll); 63. } 64. return(1); 65. } 66. 67. seffects(sobj) 68. register struct obj *sobj; 69. { 70. extern struct obj *some_armor(); 71. register boolean confused = (Confusion != 0); 72. 73. switch(sobj->otyp) { 74. #ifdef MAIL 75. case SCR_MAIL: 76. readmail(/* scroll */); 77. break; 78. #endif 79. case SCR_ENCHANT_ARMOR: 80. { 81. register struct obj *otmp = some_armor(); 82. if(!otmp) { 83. strange_feeling(sobj,"Your skin glows then fades."); 84. return(1); 85. } 86. if(confused) { 87. pline("Your %s is covered by a shimmering %s %s!", 88. objects[otmp->otyp].oc_name, Hallucination ? hcolor() : 89. "gold", (otmp->otyp == SHIELD ? "layer" : "shield")); 90. otmp->rustfree = 1; 91. break; 92. } 93. #ifdef KAA 94. if(otmp->spe > (otmp->otyp == ELFIN_CHAIN_MAIL ? 5 : 3) 95. && rn2(otmp->spe)) { 96. #else 97. if(otmp->spe > 3 && rn2(otmp->spe)) { 98. #endif 99. pline("Your %s glows violently %s for a while, then evaporates.", 100. objects[otmp->otyp].oc_name, 101. Hallucination ? hcolor() : "green"); 102. useup(otmp); 103. break; 104. } 105. pline("Your %s glows %s for a moment.", 106. objects[otmp->otyp].oc_name, 107. Hallucination ? hcolor() : "green"); 108. otmp->cursed = 0; 109. otmp->spe++; 110. break; 111. } 112. case SCR_DESTROY_ARMOR: 113. if(confused) { 114. register struct obj *otmp = some_armor(); 115. if(!otmp) { 116. strange_feeling(sobj,"Your bones itch."); 117. return(1); 118. } 119. pline("Your %s glows %s for a moment.", 120. objects[otmp->otyp].oc_name, 121. Hallucination ? hcolor() : "purple"); 122. otmp->rustfree = 0; 123. break; 124. } 125. if(!destroy_arm()) { 126. strange_feeling(sobj,"Your skin itches."); 127. return(1); 128. } 129. break; 130. case SCR_CONFUSE_MONSTER: 131. #ifdef SPELLS 132. case SPE_CONFUSE_MONSTER: 133. #endif 134. if(u.usym != '@') { 135. pline("You feel confused."); 136. HConfusion += rnd(100); 137. } else if(confused) { 138. pline("Your hands begin to glow %s.", 139. Hallucination ? hcolor() : "purple"); 140. HConfusion += rnd(100); 141. } else { 142. pline("Your hands begin to glow %s.", 143. Hallucination ? hcolor() : "blue"); 144. u.umconf = 1; 145. } 146. break; 147. case SCR_SCARE_MONSTER: 148. #ifdef SPELLS 149. case SPE_CAUSE_FEAR: 150. #endif 151. { register int ct = 0; 152. register struct monst *mtmp; 153. 154. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) 155. if(cansee(mtmp->mx,mtmp->my)) { 156. if(confused) 157. mtmp->mflee = mtmp->mfroz = mtmp->msleep = 0; 158. else 159. if (! resist(mtmp, sobj->olet, 0, NOTELL)) 160. mtmp->mflee = 1; 161. ct++; 162. } 163. if(!ct) 164. pline("You hear %s in the distance.", 165. (confused) ? "sad wailing" : "maniacal laughter"); 166. #ifdef KAA 167. # ifdef SPELLS 168. else if(sobj->otyp == SCR_SCARE_MONSTER) 169. # endif 170. pline ("You hear %s close by.", 171. (confused) ? "sad wailing" : "maniacal laughter"); 172. #endif 173. break; 174. } 175. case SCR_BLANK_PAPER: 176. if(confused) 177. pline("You see strange patterns on this scroll."); 178. else { 179. pline("This scroll seems to be blank."); 180. #ifdef MARKER 181. pline("No, wait..."); 182. known = TRUE; 183. #endif 184. } 185. break; 186. case SCR_REMOVE_CURSE: 187. #ifdef SPELLS 188. case SPE_REMOVE_CURSE: 189. #endif 190. { register struct obj *obj; 191. if(confused) 192. if (Hallucination) 193. pline("You feel the power of the Force against you!"); 194. else 195. pline("You feel like you need some help."); 196. else 197. if (Hallucination) 198. pline("You feel in touch with the Universal Oneness."); 199. else 200. pline("You feel like someone is helping you."); 201. for(obj = invent; obj ; obj = obj->nobj) 202. if(obj->owornmask) 203. obj->cursed = confused; 204. if(Punished && !confused) { 205. Punished = 0; 206. freeobj(uchain); 207. unpobj(uchain); 208. free((char *) uchain); 209. uball->spe = 0; 210. uball->owornmask &= ~W_BALL; 211. uchain = uball = (struct obj *) 0; 212. } 213. break; 214. } 215. case SCR_CREATE_MONSTER: 216. #ifdef SPELLS 217. case SPE_CREATE_MONSTER: 218. #endif 219. { register int cnt = 1; 220. 221. if(!rn2(73)) cnt += rnd(4); 222. if(confused) cnt += 12; 223. while(cnt--) 224. #ifdef WIZARD 225. if(wizard) { 226. char buf[BUFSZ], cmlet; 227. struct permonst *crmonst; 228. 229. do { 230. pline("What monster to create? "); 231. getlin(buf); 232. } while(strlen(buf) != 1); 233. cmlet = buf[0]; 234. for(crmonst = mons; crmonst->mlet != cmlet && 235. crmonst != PM_EEL; crmonst++) ; 236. (void) makemon(crmonst, u.ux, u.uy); 237. } else 238. #endif /* WIZARD /**/ 239. (void) makemon(confused ? PM_ACID_BLOB : 240. (struct permonst *) 0, u.ux, u.uy); 241. break; 242. } 243. case SCR_ENCHANT_WEAPON: 244. if(uwep && uwep->olet == WEAPON_SYM && confused) { 245. /* olet check added 10/25/86 GAN */ 246. pline("Your %s covered by a shimmering %s shield!", 247. aobjnam(uwep, "are"), 248. Hallucination ? hcolor() : "gold"); 249. uwep->rustfree = 1; 250. } else 251. if(!chwepon(sobj, 1)) /* tests for !uwep */ 252. return(1); 253. break; 254. case SCR_DAMAGE_WEAPON: 255. if(uwep && uwep->olet == WEAPON_SYM && confused) { 256. /* olet check added 10/25/86 GAN */ 257. pline("Your %s %s for a moment.", 258. aobjnam(uwep,"glow"), 259. Hallucination ? hcolor() : "purple"); 260. uwep->rustfree = 0; 261. } else 262. if(!chwepon(sobj, -1)) /* tests for !uwep */ 263. return(1); 264. break; 265. case SCR_TAMING: 266. #ifdef SPELLS 267. case SPE_CHARM_MONSTER: 268. #endif 269. { register int i,j; 270. register int bd = confused ? 5 : 1; 271. register struct monst *mtmp; 272. 273. for(i = -bd; i <= bd; i++) for(j = -bd; j <= bd; j++) 274. if(mtmp = m_at(u.ux+i, u.uy+j)) 275. if(!resist(mtmp, sobj->olet, 0, NOTELL)) 276. (void) tamedog(mtmp, (struct obj *) 0); 277. break; 278. } 279. case SCR_GENOCIDE: 280. pline("You have found a scroll of genocide!"); 281. #ifdef SPELLS 282. case SPE_GENOCIDE: 283. #endif 284. known = TRUE; 285. do_genocide(); 286. break; 287. case SCR_LIGHT: 288. if(!Blind) known = TRUE; 289. litroom(!confused); 290. break; 291. case SCR_TELEPORTATION: 292. if(confused) 293. level_tele(); 294. else { 295. #ifdef QUEST 296. register int oux = u.ux, ouy = u.uy; 297. tele(); 298. if(dist(oux, ouy) > 100) known = TRUE; 299. #else 300. register int uroom = inroom(u.ux, u.uy); 301. tele(); 302. if(uroom != inroom(u.ux, u.uy)) known = TRUE; 303. #endif 304. if(Teleport_control) 305. known = TRUE; 306. } 307. break; 308. case SCR_GOLD_DETECTION: 309. /* Unfortunately this code has become slightly less elegant, 310. now that gold and traps no longer are of the same type. */ 311. if(confused) { 312. register struct trap *ttmp; 313. 314. if(!ftrap) { 315. strange_feeling(sobj, "Your toes stop itching."); 316. return(1); 317. } else { 318. for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) 319. if(ttmp->tx != u.ux || ttmp->ty != u.uy) 320. goto outtrapmap; 321. /* only under me - no separate display required */ 322. pline("Your toes itch!"); 323. break; 324. outtrapmap: 325. cls(); 326. for(ttmp = ftrap; ttmp; ttmp = ttmp->ntrap) 327. at(ttmp->tx, ttmp->ty, Hallucination ? rndobjsym() : GOLD_SYM); 328. prme(); 329. pline("You feel very greedy!"); 330. } 331. } else { 332. register struct gold *gtmp; 333. 334. if(!fgold) { 335. strange_feeling(sobj, "You feel materially poor."); 336. return(1); 337. } else { 338. known = TRUE; 339. for(gtmp = fgold; gtmp; gtmp = gtmp->ngold) 340. if(gtmp->gx != u.ux || gtmp->gy != u.uy) 341. goto outgoldmap; 342. /* only under me - no separate display required */ 343. pline("You notice some gold between your feet."); 344. break; 345. outgoldmap: 346. cls(); 347. for(gtmp = fgold; gtmp; gtmp = gtmp->ngold) 348. at(gtmp->gx, gtmp->gy, Hallucination ? rndobjsym() : GOLD_SYM); 349. prme(); 350. pline("You feel very greedy, and sense gold!"); 351. } 352. } 353. /* common sequel */ 354. more(); 355. docrt(); 356. break; 357. case SCR_FOOD_DETECTION: 358. #ifdef SPELLS 359. case SPE_DETECT_FOOD: 360. #endif 361. { register ct = 0, ctu = 0; 362. register struct obj *obj; 363. register char foodsym = confused ? POTION_SYM : FOOD_SYM; 364. 365. for(obj = fobj; obj; obj = obj->nobj) 366. if(obj->olet == foodsym) { 367. if(obj->ox == u.ux && obj->oy == u.uy) ctu++; 368. else ct++; 369. } 370. if(!ct && !ctu) { 371. strange_feeling(sobj,"Your nose twitches."); 372. return(1); 373. } else if(!ct) { 374. known = TRUE; 375. pline("You smell %s close nearby.", 376. confused ? "something" : "food"); 377. 378. } else { 379. known = TRUE; 380. cls(); 381. for(obj = fobj; obj; obj = obj->nobj) 382. if(obj->olet == foodsym) 383. at(obj->ox, obj->oy, Hallucination ? rndobjsym() : 384. FOOD_SYM); 385. prme(); 386. pline("Your nose tingles and you smell %s!", 387. confused ? "something" : "food"); 388. more(); 389. docrt(); 390. } 391. break; 392. } 393. case SCR_IDENTIFY: 394. /* known = TRUE; */ 395. if(confused) 396. pline("You identify this as an identify scroll."); 397. else 398. pline("This is an identify scroll."); 399. useup(sobj); 400. objects[SCR_IDENTIFY].oc_name_known = 1; 401. #ifdef SPELLS 402. case SPE_IDENTIFY: 403. #endif 404. if(!confused) 405. while(!ggetobj("identify", identify, rn2(5) ? 1 : rn2(5)) && invent); 406. return(1); 407. case SCR_MAGIC_MAPPING: 408. known = TRUE; 409. pline("On this scroll %s a map!", confused ? "was" : "is"); 410. #ifdef SPELLS 411. case SPE_MAGIC_MAPPING: 412. #endif 413. do_mapping(); 414. break; 415. case SCR_AMNESIA: 416. { register int zx, zy; 417. 418. known = TRUE; 419. for(zx = 0; zx < COLNO; zx++) for(zy = 0; zy < ROWNO; zy++) 420. if(!confused || rn2(7)) 421. if(!cansee(zx,zy)) 422. levl[zx][zy].seen = 0; 423. docrt(); 424. pline("Who was that Maude person anyway?"); 425. #ifdef SPELLS 426. losespells(); 427. #endif 428. break; 429. } 430. case SCR_FIRE: 431. { register int num; 432. register struct monst *mtmp; 433. 434. /* 435. * Note: This case was modified 11/4/86 by DKC to eliminate the problem with 436. * reading a scroll of fire while confused or resistant to fire. Formerly, 437. * the code failed to initialize the variable "num" in these cases, resulting 438. * in monsters being hit for a possibly large (and possibly negative) damage. 439. * The actions taken now are: 440. * If the player is fire resistant, monsters 441. * take the normal damage (1-6 except for Y's and F's), and the player is 442. * unaffected. 443. */ 444. known = TRUE; 445. if(confused) { 446. if(Fire_resistance) 447. pline("Oh look, what a pretty fire in your hands."); 448. else { 449. pline("The scroll catches fire and you burn your hands."); 450. losehp(1, "scroll of fire"); 451. } 452. break; 453. } 454. pline("The scroll erupts in a tower of flame!"); 455. num = rnd(6); 456. if(Fire_resistance) 457. pline("You are uninjured."); 458. else { 459. u.uhpmax -= num; 460. losehp(num, "scroll of fire"); 461. } 462. num = (2*num + 1)/3; 463. for(mtmp = fmon; mtmp; mtmp = mtmp->nmon) { 464. if(dist(mtmp->mx,mtmp->my) < 3) { 465. mtmp->mhp -= num; /* No saving throw! */ 466. if(index("FY", mtmp->data->mlet)) 467. mtmp->mhp -= 3*num; /* this might well kill 'F's */ 468. if(mtmp->mhp < 1) { 469. killed(mtmp); 470. break; /* primitive */ 471. } 472. } 473. } 474. break; 475. } 476. case SCR_PUNISHMENT: 477. known = TRUE; 478. if(confused) { 479. pline("You feel guilty."); 480. break; 481. } 482. pline("You are being punished for your misbehaviour!"); 483. if(Punished){ 484. pline("Your iron ball gets heavier."); 485. uball->owt += 15; 486. break; 487. } 488. Punished = INTRINSIC; 489. setworn(mkobj_at(CHAIN_SYM, u.ux, u.uy), W_CHAIN); 490. setworn(mkobj_at(BALL_SYM, u.ux, u.uy), W_BALL); 491. uball->spe = 1; /* special ball (see save) */ 492. break; 493. default: 494. impossible("What weird effect is this? (%u)", sobj->otyp); 495. } 496. return(0); 497. } 498. 499. identify(otmp) /* also called by newmail() */ 500. register struct obj *otmp; 501. { 502. objects[otmp->otyp].oc_name_known = 1; 503. #ifdef KAA 504. otmp->known = 1; 505. if (otmp->olet != WEAPON_SYM) otmp->dknown = 1; 506. /* Now, the dknown field is special for weapons, indicating blessing. */ 507. #else 508. otmp->known = otmp->dknown = 1; 509. #endif 510. prinv(otmp); 511. return(1); 512. } 513. 514. litroom(on) 515. register boolean on; 516. { 517. register num,zx,zy; 518. 519. /* first produce the text (provided he is not blind) */ 520. if(Blind) goto do_it; 521. if(!on) { 522. if(u.uswallow || !xdnstair || levl[u.ux][u.uy].typ == CORR || 523. !levl[u.ux][u.uy].lit) { 524. pline("It seems even darker in here than before."); 525. return; 526. } else 527. pline("It suddenly becomes dark in here."); 528. } else { 529. if(u.uswallow){ 530. pline("%s's stomach is lit.", Monnam(u.ustuck)); 531. return; 532. } 533. if(!xdnstair){ 534. pline("Nothing Happens."); 535. return; 536. } 537. #ifdef QUEST 538. pline("The cave lights up around you, then fades."); 539. return; 540. #else 541. if(levl[u.ux][u.uy].typ == CORR) { 542. pline("The corridor lights up around you, then fades."); 543. return; 544. } else if(levl[u.ux][u.uy].lit) { 545. pline("The light here seems better now."); 546. return; 547. } else 548. pline("The room is lit."); 549. #endif 550. } 551. 552. do_it: 553. #ifdef QUEST 554. return; 555. #else 556. if(levl[u.ux][u.uy].lit == on) 557. return; 558. if(levl[u.ux][u.uy].typ == DOOR) { 559. if(IS_ROOM(levl[u.ux][u.uy+1].typ)) zy = u.uy+1; 560. else if(IS_ROOM(levl[u.ux][u.uy-1].typ)) zy = u.uy-1; 561. else zy = u.uy; 562. if(IS_ROOM(levl[u.ux+1][u.uy].typ)) zx = u.ux+1; 563. else if(IS_ROOM(levl[u.ux-1][u.uy].typ)) zx = u.ux-1; 564. else zx = u.ux; 565. } else { 566. zx = u.ux; 567. zy = u.uy; 568. } 569. for(seelx = u.ux; (num = levl[seelx-1][zy].typ) != CORR && num != 0; 570. seelx--); 571. for(seehx = u.ux; (num = levl[seehx+1][zy].typ) != CORR && num != 0; 572. seehx++); 573. for(seely = u.uy; (num = levl[zx][seely-1].typ) != CORR && num != 0; 574. seely--); 575. for(seehy = u.uy; (num = levl[zx][seehy+1].typ) != CORR && num != 0; 576. seehy++); 577. for(zy = seely; zy <= seehy; zy++) 578. for(zx = seelx; zx <= seehx; zx++) { 579. levl[zx][zy].lit = on; 580. if(!Blind && dist(zx,zy) > 2) 581. if(on) prl(zx,zy); else nosee(zx,zy); 582. } 583. if(!on) seehx = 0; 584. #endif 585. } 586. 587. /* Test whether we may genocide all monsters with symbol ch */ 588. monstersym(ch) /* arnold@ucsfcgl */ 589. register char ch; 590. { 591. register struct permonst *mp; 592. 593. /* 594. * can't genocide certain monsters 595. */ 596. if (index("12 &:", ch)) return FALSE; 597. 598. if (ch == pm_eel.mlet) return TRUE; 599. for (mp = mons; mp < &mons[CMNUM+2]; mp++) 600. if (mp->mlet == ch) return TRUE; 601. 602. return FALSE; 603. } 604. 605. do_genocide() { 606. extern char genocided[], fut_geno[]; 607. char buf[BUFSZ]; 608. register struct monst *mtmp, *mtmp2; 609. 610. if(Confusion != 0) *buf = u.usym; 611. else do { 612. pline("What monster do you want to genocide (Type the letter)? "); 613. getlin(buf); 614. } 615. 616. while(strlen(buf) != 1 || !monstersym(*buf)); 617. 618. if(!index(fut_geno, *buf)) charcat(fut_geno, *buf); 619. if(!index(genocided, *buf)) charcat(genocided, *buf); 620. else { 621. pline("Such monsters do not exist in this world."); 622. return; 623. } 624. for(mtmp = fmon; mtmp; mtmp = mtmp2){ 625. mtmp2 = mtmp->nmon; 626. if(mtmp->data->mlet == *buf) 627. mondead(mtmp); 628. } 629. pline("Wiped out all %c's.", Hallucination ? '@' : *buf); 630. /* Scare the hallucinating player */ 631. if(*buf == '@') { 632. u.uhp = -1; 633. killer = "scroll of genocide"; 634. /* A polymorphed character will die as soon as he is rehumanized. */ 635. if(u.usym != '@') pline("You feel dead inside."); 636. else done("died"); 637. } 638. #ifdef KAA 639. else if (*buf==u.usym) rehumanize(); 640. #endif 641. } 642. 643. do_mapping() 644. { 645. register struct rm *lev; 646. register int num, zx, zy; 647. 648. for(zy = 0; zy < ROWNO; zy++) 649. for(zx = 0; zx < COLNO; zx++) { 650. 651. if((Confusion != 0) && rn2(7)) continue; 652. lev = &(levl[zx][zy]); 653. if((num = lev->typ) == 0) continue; 654. 655. if(num == SCORR) { 656. lev->typ = CORR; 657. lev->scrsym = CORR_SYM; 658. } else if(num == SDOOR) { 659. lev->typ = DOOR; 660. lev->scrsym = DOOR_SYM; 661. /* do sth in doors ? */ 662. } else if(lev->seen) continue; 663. #ifndef QUEST 664. if(num != ROOM) 665. #endif 666. { 667. lev->seen = lev->new = 1; 668. if(lev->scrsym == STONE_SYM || !lev->scrsym) 669. newsym(zx,zy); 670. else on_scr(zx,zy); 671. } 672. } 673. } 674. 675. destroy_arm() { 676. 677. if(uarm) { 678. pline("Your armor turns to dust and falls to the floor!"); 679. useup(uarm); 680. } else if(uarmh) { 681. pline("Your helmet turns to dust and is blown away!"); 682. useup(uarmh); 683. } else if(uarmg) { 684. pline("Your gloves vanish!"); 685. useup(uarmg); 686. selftouch("You"); 687. } else if(uarms) { 688. pline("Your shield crumbles away!"); 689. useup(uarms); 690. } else return(0); /* could not destroy anything */ 691. 692. return(1); 693. }
Alternative Linked Data Views: ODE     Raw Data in: CXML | CSV | RDF ( N-Triples N3/Turtle JSON XML ) | OData ( Atom JSON ) | Microdata ( JSON HTML) | JSON-LD    About   
This material is Open Knowledge   W3C Semantic Web Technology [RDF Data] Valid XHTML + RDFa
OpenLink Virtuoso version 07.20.3217, on Linux (x86_64-pc-linux-gnu), Standard Edition
Data on this page belongs to its respective rights holders.
Virtuoso Faceted Browser Copyright © 2009-2012 OpenLink Software