fork download
  1. {$mode objfpc} {$h+} {$modeswitch duplicatelocals}
  2. {$warn 5024 off} // hint: parameter not used
  3.  
  4. {$define demonstrate} // дефайн для ideone-демонстрации вместо интерактива
  5.  
  6. program quest;
  7.  
  8. uses
  9. SysUtils;
  10.  
  11. function IfThen(cond: boolean; const ifTrue: unicodestring; const ifFalse: unicodestring = ''): unicodestring;
  12. begin
  13. if cond then result := ifTrue else result := ifFalse;
  14. end;
  15.  
  16. type
  17. TWorld = class;
  18.  
  19. TScene = class
  20. type
  21. FlagEnum = (Scene_IsEnding);
  22. FlagSet = set of FlagEnum;
  23. protected
  24. world: TWorld;
  25. procedure HandleDisplay; virtual; abstract;
  26. procedure HandleCommands; virtual;
  27. function HandleFlags: FlagSet; virtual;
  28. function Command(const cmd, desc: unicodestring): boolean;
  29. end;
  30.  
  31. TWorld = class
  32. // Логика насчёт сцены и её смены.
  33. scene, pendingSwitchTo: TScene;
  34. turnedOff: boolean;
  35. constructor Create(startingScene: TScene);
  36. destructor Destroy; override;
  37. function Alive: boolean;
  38. procedure Display;
  39. procedure SendCommand(const cmd: unicodestring);
  40. procedure SwitchTo(scene: TScene);
  41. procedure TurnOff;
  42. private
  43. commandMode: (AwaitingCommandsToDescribe, AwaitingCommandToPerform, CommandPerformed);
  44. commandToPerform: unicodestring;
  45. hasCommandsExceptEnter: boolean;
  46. procedure CompleteSwitching;
  47.  
  48. public
  49. // Всякие персистентные штуки.
  50. type
  51. SexType = (Sex_Anal, Sex_Irrumatio, Sex_Vaginal);
  52. SexTypes = set of SexType;
  53. var
  54. sexProceed: SexTypes;
  55. erectOnce, doorOpened: boolean;
  56. end;
  57.  
  58. procedure TScene.HandleCommands;
  59. begin
  60. end;
  61.  
  62. function TScene.HandleFlags: FlagSet;
  63. begin
  64. result := [];
  65. end;
  66.  
  67. function TScene.Command(const cmd, desc: unicodestring): boolean;
  68. begin
  69. result := false;
  70. if cmd <> '' then world.hasCommandsExceptEnter := true;
  71. case world.commandMode of
  72. AwaitingCommandsToDescribe: writeln(IfThen(cmd = '', '<ENTER> ', '(' + cmd + ') ') + desc);
  73. AwaitingCommandToPerform:
  74. if cmd = world.commandToPerform then
  75. begin
  76. result := true;
  77. world.commandMode := CommandPerformed;
  78. end;
  79. CommandPerformed: ;
  80. end;
  81. end;
  82.  
  83. constructor TWorld.Create(startingScene: TScene);
  84. begin
  85. inherited Create;
  86. SwitchTo(startingScene);
  87. CompleteSwitching;
  88. end;
  89.  
  90. destructor TWorld.Destroy;
  91. begin
  92. FreeAndNil(scene);
  93. inherited Destroy;
  94. end;
  95.  
  96. function TWorld.Alive: boolean;
  97. begin
  98. result := not turnedOff;
  99. end;
  100.  
  101. procedure TWorld.Display;
  102. begin
  103. scene.HandleDisplay;
  104. if Scene_IsEnding in scene.HandleFlags then exit;
  105. writeln;
  106. commandMode := AwaitingCommandsToDescribe;
  107. hasCommandsExceptEnter := false;
  108. scene.HandleCommands;
  109. if hasCommandsExceptEnter then write(LineEnding + '> ');
  110. end;
  111.  
  112. procedure TWorld.SendCommand(const cmd: unicodestring);
  113. begin
  114. if Scene_IsEnding in scene.HandleFlags then
  115. begin
  116. TurnOff;
  117. exit;
  118. end;
  119. commandMode := AwaitingCommandToPerform;
  120. commandToPerform := cmd;
  121. scene.HandleCommands;
  122. if commandMode = CommandPerformed then
  123. begin
  124. if cmd <> '' then writeln;
  125. end else
  126. writeln('Ась?' + LineEnding);
  127. CompleteSwitching; // обработка команды могла вызвать SwitchTo
  128. end;
  129.  
  130. procedure TWorld.SwitchTo(scene: TScene);
  131. begin
  132. if scene.world <> nil then raise Exception.Create('Нет, создай новую сценку.');
  133.  
  134. // SwitchTo не переключает состояние сразу, потому что это предполагает освобождение старого состояния,
  135. // которое прямо сейчас выполняет какой-нибудь HandleCommand и может не ожидать выдёргивания почвы у себя из-под ног.
  136. FreeAndNil(pendingSwitchTo);
  137. pendingSwitchTo := scene;
  138. end;
  139.  
  140. procedure TWorld.TurnOff;
  141. begin
  142. turnedOff := true;
  143. end;
  144.  
  145. procedure TWorld.CompleteSwitching;
  146. begin
  147. if pendingSwitchTo <> nil then
  148. begin
  149. FreeAndNil(scene);
  150. scene := pendingSwitchTo;
  151. pendingSwitchTo := nil;
  152. scene.world := self;
  153. end;
  154. end;
  155.  
  156. type
  157. Scene_Prologue = class(TScene)
  158. protected
  159. procedure HandleDisplay; override;
  160. procedure HandleCommands; override;
  161. end;
  162.  
  163. Scene_LeaveIsland = class(TScene)
  164. protected
  165. procedure HandleDisplay; override;
  166. function HandleFlags: FlagSet; override;
  167. end;
  168.  
  169. Scene_Girl = class(TScene)
  170. constructor Create(comeFromFar: boolean);
  171. protected
  172. procedure HandleDisplay; override;
  173. procedure HandleCommands; override;
  174. private
  175. comeFromFar: boolean;
  176. end;
  177.  
  178. Scene_Irrumatio = class(TScene)
  179. protected
  180. procedure HandleDisplay; override;
  181. procedure HandleCommands; override;
  182. private
  183. stage: cardinal;
  184. end;
  185.  
  186. Scene_Vaginal = class(TScene)
  187. protected
  188. procedure HandleDisplay; override;
  189. procedure HandleCommands; override;
  190. private
  191. stage: cardinal;
  192. end;
  193.  
  194. Scene_Anal = class(TScene)
  195. protected
  196. procedure HandleDisplay; override;
  197. procedure HandleCommands; override;
  198. private
  199. stage: cardinal;
  200. end;
  201.  
  202. Scene_CantOpen = class(TScene)
  203. protected
  204. procedure HandleDisplay; override;
  205. procedure HandleCommands; override;
  206. end;
  207.  
  208. Scene_DoorOpeningSound = class(TScene)
  209. protected
  210. procedure HandleDisplay; override;
  211. procedure HandleCommands; override;
  212. end;
  213.  
  214. Scene_DoorEntry = class(TScene)
  215. protected
  216. procedure HandleDisplay; override;
  217. procedure HandleCommands; override;
  218. end;
  219.  
  220. Scene_GirlRevenge1 = class(TScene)
  221. protected
  222. procedure HandleDisplay; override;
  223. procedure HandleCommands; override;
  224. function HandleFlags: FlagSet; override;
  225. private
  226. stage: cardinal;
  227. end;
  228.  
  229. Scene_GirlRevenge2 = class(TScene)
  230. protected
  231. procedure HandleDisplay; override;
  232. function HandleFlags: FlagSet; override;
  233. end;
  234.  
  235. procedure Scene_Prologue.HandleDisplay;
  236. begin
  237. writeln(
  238. 'В древней книге ты прочитал о Подземелье Королей, которое даст славу и могущество тому, кто его пройдёт.' + LineEnding +
  239. 'Когда ты приплыл по координатам, загадочный остров возник из ниоткуда.' + LineEnding +
  240. 'Ты спускаешься на берег.');
  241. end;
  242.  
  243. procedure Scene_Prologue.HandleCommands;
  244. begin
  245. if Command('1', 'Исследовать остров.') then world.SwitchTo(Scene_Girl.Create({comeFromFar} true));
  246. if Command('0', 'Покинуть остров.') then world.SwitchTo(Scene_LeaveIsland.Create);
  247. end;
  248.  
  249. procedure Scene_LeaveIsland.HandleDisplay;
  250. begin
  251. writeln(
  252. 'Испуганный, ты развернулся и побежал к кораблю. Ты отплыл от острова, но так и не вернулся домой.' + LineEnding +
  253. '' + LineEnding +
  254. '<КОНЕЦ>');
  255. end;
  256.  
  257. function Scene_LeaveIsland.HandleFlags: FlagSet;
  258. begin
  259. result := [Scene_IsEnding];
  260. end;
  261.  
  262. constructor Scene_Girl.Create(comeFromFar: boolean);
  263. begin
  264. inherited Create;
  265. self.comeFromFar := comeFromFar;
  266. end;
  267.  
  268. procedure Scene_Girl.HandleDisplay;
  269. function MinusArrowsPiece: unicodestring;
  270. var
  271. n: cardinal;
  272. st: TWorld.SexType;
  273. begin
  274. result := '';
  275. n := 0;
  276. for st in world.sexProceed do inc(n);
  277. case n of
  278. 1: result := 'Одна из стрелок выглядит выветренной.';
  279. 2: result := 'Две из стрелок наполовину выветрились.';
  280. end;
  281. end;
  282. var
  283. piece: unicodestring;
  284. shineMentioned: boolean;
  285. begin
  286. writeln(
  287. IfThen(comeFromFar,
  288. 'В сотне метров от берега виднеется витражный купол.' + LineEnding +
  289. 'Подойдя ближе, ты',
  290. 'Ты') + ' видишь каменную площадку и дверь, высеченную в скале.');
  291. if world.doorOpened then
  292. writeln('Изображение треугольника почти выветрилось, его оставшиеся фрагменты окрасились тёмно-красным.')
  293. else
  294. begin
  295. piece := MinusArrowsPiece;
  296. writeln('На двери нарисован треугольник, концы трёх стрелок направлены к его вершинам извне.' + IfThen(piece <> '', LineEnding) + piece);
  297. end;
  298. writeln('В центре площадки лежит голая девушка. ' +
  299. IfThen(world.doorOpened,
  300. 'Она без сознания, но, кажется, стала более подвижной.' + LineEnding +
  301. 'Ты сомневаешься, что она оценит твой дружеский вклад, поэтому не хочешь попадаться ей на глаза.',
  302. 'Похоже, она без сознания.'));
  303.  
  304. piece := '';
  305. shineMentioned := false;
  306. if Sex_Irrumatio in world.sexProceed then
  307. begin
  308. piece := 'Рот девушки блестит на солнце, пробивающемся сквозь купол.';
  309. shineMentioned := true;
  310. end;
  311. if world.sexProceed * [Sex_Vaginal, Sex_Anal] = [Sex_Vaginal] then
  312. begin
  313. piece += IfThen(piece <> '', LineEnding) +
  314. 'Её вагина зияет, ' + IfThen(shineMentioned,
  315. 'из неё течёт струйка вязкой жидкости.',
  316. 'вытекающая струйка вязкой жидкости блестит на солнце, пробивающемся сквозь купол.');
  317. shineMentioned := true;
  318. end
  319. else if world.sexProceed * [Sex_Vaginal, Sex_Anal] = [Sex_Anal] then
  320. begin
  321. piece += IfThen(piece <> '', LineEnding) +
  322. 'Её анус зияет, ' + IfThen(shineMentioned,
  323. 'из него течёт струйка вязкой жидкости.',
  324. 'вытекающая струйка вязкой жидкости блестит на солнце, пробивающемся сквозь купол.');
  325. shineMentioned := true;
  326. end
  327. else if world.sexProceed * [Sex_Vaginal, Sex_Anal] = [Sex_Vaginal, Sex_Anal] then
  328. begin
  329. piece += IfThen(piece <> '', LineEnding) +
  330. IfThen(piece = '', 'Анус и вагина девушки зияют, ', 'Анус и вагина зияют, ') + IfThen(shineMentioned,
  331. 'из них натекла небольшая флуоресцирующая лужица.',
  332. 'лужица вязкой жидкости, натёкшей из них, блестит на солнце, пробивающемся сквозь купол.');
  333. shineMentioned := true;
  334. end;
  335. if piece <> '' then writeln(LineEnding + piece);
  336. end;
  337.  
  338. procedure Scene_Girl.HandleCommands;
  339. var
  340. cmdNo: integer;
  341. begin
  342. cmdNo := 1;
  343. if not (Sex_Irrumatio in world.sexProceed) then
  344. begin
  345. if Command(unicodestring(IntToStr(cmdNo)), 'Трахнуть девушку в рот.') then world.SwitchTo(Scene_Irrumatio.Create);
  346. inc(cmdNo);
  347. end;
  348. if not (Sex_Vaginal in world.sexProceed) then
  349. begin
  350. if Command(unicodestring(IntToStr(cmdNo)), 'Трахнуть девушку в вагину.') then world.SwitchTo(Scene_Vaginal.Create);
  351. inc(cmdNo);
  352. end;
  353. if not (Sex_Anal in world.sexProceed) then
  354. begin
  355. if Command(unicodestring(IntToStr(cmdNo)), 'Трахнуть девушку в анус.') then world.SwitchTo(Scene_Anal.Create);
  356. inc(cmdNo);
  357. end;
  358. if Command(unicodestring(IntToStr(cmdNo)), 'Открыть дверь.') then
  359. if world.doorOpened then
  360. world.SwitchTo(Scene_DoorEntry.Create)
  361. else
  362. world.SwitchTo(Scene_CantOpen.Create);
  363. inc(cmdNo);
  364. if Command('0', 'Покинуть остров.') then world.SwitchTo(Scene_LeaveIsland.Create);
  365. end;
  366.  
  367. procedure NoteGirlSexActAndReturn(world: TWorld; &type: TWorld.SexType);
  368. begin
  369. world.sexProceed += [&type];
  370. world.erectOnce := true;
  371.  
  372. if world.sexProceed = [Sex_Anal, Sex_Irrumatio, Sex_Vaginal] then
  373. begin
  374. world.doorOpened := true;
  375. world.SwitchTo(Scene_DoorOpeningSound.Create);
  376. end else
  377. world.SwitchTo(Scene_Girl.Create({comeFromFar} false));
  378. end;
  379.  
  380. procedure Scene_Irrumatio.HandleDisplay;
  381. begin
  382. case stage of
  383. 0: writeln(
  384. 'Губы девушки манят тебя. Ты приближаешься, чтобы облизнуть их, и чувствуешь её слабое дыхание.' + LineEnding +
  385. 'Ты не ощущаешь сопротивления, проникая языком в её рот. Твой член' + IfThen(world.erectOnce, ' снова') + ' поднимается.' + LineEnding +
  386. 'Ты завершаешь поцелуй и придвигаешься бёдрами.' + LineEnding +
  387. 'Придерживая голову девушки, ты прижимаешь член к её губам. Они распахиваются вслед за приоткрывшейся челюстью и принимают его внутрь.' + LineEnding +
  388. 'Ты начинаешь двигаться. Основание члена ритмично скользит по её податливому языку, а головка тычется в мягкое нёбо.');
  389. 1: writeln(
  390. 'Не вытаскивая члена, ты разворачиваешься и утыкаешься лбом в промежность девушки. Она слабо пахнет морскими водорослями.' + LineEnding +
  391. 'Ты обхватываешь бёдра девушки руками и с усилием просовываешь член ей в глотку. Её горло сводит судорога.' + LineEnding +
  392. 'Ты остаёшься неподвижен и прислушиваешься к ощущениям, пока её горло расслабляется.' + LineEnding +
  393. 'Ты постепенно возобновляешь движения, и через минуту уже, сквозь слюни и сбивающееся дыхание, раз за разом топишь член в её глотке по самые яйца.');
  394. 2: writeln(
  395. 'После ещё нескольких толчков ты разряжаешься внутрь.' + LineEnding +
  396. 'Перистальтика пищевода слабее, чем если бы девушка была в сознании, но, так или иначе, большая часть спермы оказывается у неё в желудке.' + LineEnding +
  397. 'Ты медленно вынимаешь обслюнявленный член из её рта.');
  398. end;
  399. end;
  400.  
  401. procedure Scene_Irrumatio.HandleCommands;
  402. begin
  403. case stage of
  404. 0: if Command('', 'Продолжать.') then inc(stage);
  405. 1: if Command('', 'Кончить в горло.') then inc(stage);
  406. 2: if Command('', 'Подняться.') then NoteGirlSexActAndReturn(world, Sex_Irrumatio);
  407. end;
  408. end;
  409.  
  410. procedure Scene_Vaginal.HandleDisplay;
  411. begin
  412. case stage of
  413. 0: writeln(
  414. 'В предвкушении ты спускаешься на колени перед промежностью девушки.' + LineEnding +
  415. 'В островке волос на её лобке застряли кристаллики соли.' + LineEnding +
  416. 'Ты гладишь девушку по нежной внутренней поверхности бёдер, и она постанывает сквозь забытьё.' + LineEnding +
  417. 'Ты раздвигаешь половые губы девушки левой рукой, а двумя пальцами правой дразнишь вход во влагалище. Немного погодя без труда проскальзываешь ими вовнутрь и аккуратно растягиваешь в стороны. Ты видишь, как потревоженные стенки влагалища слегка пульсируют, пытаясь вернуться к первоначальной форме.');
  418. 1: writeln(
  419. 'Теперь' + IfThen(world.erectOnce, ' снова') + ' совершенно готовый, ты запрокидываешь одну ногу девушки себе на плечо.' + LineEnding +
  420. 'Помогая свободной рукой, ты трёшься стволом члена вдоль её половых губ и клитора. Затем уверенно направляешь головку внутрь, и с хлюпанием смазки он наполовину погружается в её лоно.' + LineEnding +
  421. 'Ты кладёшь ладонь на живот девушки и совершаешь несколько пробных фрикций, постепенно увеличивая глубину.' + LineEnding +
  422. 'Стенки влагалища обхватывают тебя всё плотнее.' + LineEnding +
  423. 'И вот, раззадоренный, ты запрокидываешь её вторую ногу, упираешься локтями в каменный пол и начинаешь бесцеремонно трахать, доставая аккурат до шейки матки в крайней точке амплитуды.' + LineEnding +
  424. 'Купол заполняется похабными звуками соударения юных тел.');
  425. 2: writeln(
  426. 'Устав держаться на весу, ты встаёшь на голени и расставляешь ноги девушки в стороны.' + LineEnding +
  427. 'Ты продолжаешь движения тазом. Грудь девушки покачивается в такт, и ты алчно протягиваешь к ней руки. Ты впиваешься в неё пальцами; девушка в сознании вскрикнула бы от боли, но сейчас она лишь выдохнула сильнее обычного.' + LineEnding +
  428. 'На пределе ты приподнимаешь девушку за талию, погружаешь член до упора, и он, пульсируя, заполняет её горячим семенем.' + LineEnding +
  429. 'На фоне разгорячённого дыхания девушки ты прислушиваешься к отголоскам оргазма, и наконец осторожно достаёшь свой полностью обмякший член.');
  430. end;
  431. end;
  432.  
  433. procedure Scene_Vaginal.HandleCommands;
  434. begin
  435. case stage of
  436. 0: if Command('', 'Секс.') then inc(stage);
  437. 1: if Command('', 'Полапать грудь + финал.') then inc(stage);
  438. 2: if Command('', 'Подняться.') then NoteGirlSexActAndReturn(world, Sex_Vaginal);
  439. end;
  440. end;
  441.  
  442. procedure Scene_Anal.HandleDisplay;
  443. begin
  444. case stage of
  445. 0: writeln(
  446. 'Ты переворачиваешь девушку на живот. Твоему взору открываются её спина и ягодицы.' + LineEnding +
  447. 'Ты несколько раз звонко шлёпаешь по ягодицам, оставляя горящие отпечатки ладоней. Твой член давно рвётся ввысь' + IfThen(world.erectOnce, ' снова') + '.' + LineEnding +
  448. 'Ты оттягиваешь правую ягодицу, и анальное колечко послушно тянется за ней. Похоже, девушке не впервой заниматься этим.' + LineEnding +
  449. 'Ты приставляешь головку члена к анусу девушки. Ты собираешь слюну во рту, наклоняешься и даёшь ей стечь в ложбинку в месте стыка.');
  450. 1: writeln(
  451. 'Ты делаешь несколько толчков, приноравливаясь к сфинктеру. Кажется, с каждым разом он пропускает тебя чуть глубже, но в целом остаётся неприступным.' + LineEnding +
  452. 'Осмелев, ты решительно обхватываешь таз девушки руками и настойчиво, теперь уже не прерываясь, проталкиваешь член внутрь. После первых сантиметров он с неожиданной лёгкостью проходит на всю длину.' + LineEnding +
  453. 'Ты начинаешь фрикции, то и дело шлёпая по ягодицам.' + LineEnding +
  454. 'Через пару минут ты чувствуешь, что полностью освоился в прямой кишке. Тогда ты придерживаешь руками ягодицы девушки в раздвинутом состоянии и — чпок! — достаёшь член, чтобы полюбоваться зияющим результатом своих действий.');
  455. 2: writeln(
  456. 'Ты погружаешь член обратно, теперь совершенно без усилий, и ускоряешь движения.' + LineEnding +
  457. 'Ты чувствуешь себя на пороге оргазма, делаешь последнее, самое глубокое погружение и начинаешь исторгать сперму вовнутрь.' + LineEnding +
  458. 'С последней её каплей живот девушки едва слышно уркнул, словно проглатывая заряд.' + LineEnding +
  459. 'Похлопав по ягодицам вместо головы в знак похвалы, ты вытаскиваешь член. Анус уже не спешит закрываться и лишь подрагивает.');
  460. end;
  461. end;
  462.  
  463. procedure Scene_Anal.HandleCommands;
  464. begin
  465. case stage of
  466. 0: if Command('', 'Вставить.') then inc(stage);
  467. 1: if Command('', 'Продолжить и кончить.') then inc(stage);
  468. 2: if Command('', 'Подняться.') then NoteGirlSexActAndReturn(world, Sex_Anal);
  469. end;
  470. end;
  471.  
  472. procedure Scene_CantOpen.HandleDisplay;
  473. begin
  474. writeln('Дверь не поддаётся.');
  475. end;
  476.  
  477. procedure Scene_CantOpen.HandleCommands;
  478. begin
  479. if Command('', 'Отойти.') then world.SwitchTo(Scene_Girl.Create({comeFromFar} false));
  480. end;
  481.  
  482. procedure Scene_DoorOpeningSound.HandleDisplay;
  483. begin
  484. writeln('Ты слышишь щелчок открывающейся замочной скважины.');
  485. end;
  486.  
  487. procedure Scene_DoorOpeningSound.HandleCommands;
  488. begin
  489. if Command('', 'Продолжить.') then world.SwitchTo(Scene_Girl.Create({comeFromFar} false));
  490. end;
  491.  
  492. procedure Scene_DoorEntry.HandleDisplay;
  493. begin
  494. writeln(
  495. 'Ты открываешь тяжёлую дверь и ступаешь внутрь. Неширокая пологая лестница ведёт вниз, закругляясь.' + LineEnding +
  496. 'Стена слева освещена факелами, горящими странным холодным огнём. Поодаль в стене виднеются двери и ответвления.' + LineEnding +
  497. 'Справа от лестницы пропасть. Твои глаза, привыкающие к полутьме, видят далеко на её дне что-то мерцающее в рассеянном свете факелов.' + LineEnding +
  498. 'Присмотревшись получше, ты видишь вдалеке над пропастью ряды едва заметных точек — по-видимому, таких же факелов. Похоже, лестница идёт по гигантской спирали.' + LineEnding +
  499. '' + LineEnding +
  500. 'Вдруг ты слышишь быстрый, приближающийся звук шагов.' + LineEnding +
  501. '«Я НЕ ДЛЯ ТЕБЯ ЗДЕСЬ ЛЕЖАЛА! Я ЖДАЛА ЧЭДА!»');
  502. end;
  503.  
  504. procedure Scene_DoorEntry.HandleCommands;
  505. begin
  506. if Command('1', 'Обернуться.') then world.SwitchTo(Scene_GirlRevenge1.Create);
  507. if Command('2', 'Не оборачиваться.') then world.SwitchTo(Scene_GirlRevenge2.Create);
  508. end;
  509.  
  510. procedure Scene_GirlRevenge1.HandleDisplay;
  511. begin
  512. case stage of
  513. 0: writeln(
  514. 'Ты решаешься обернуться и твёрдо взглянуть в глаза своей новой суженой.' + LineEnding +
  515. 'Она, роняя слёзы, влетает на лестницу и бросает тебе в голову булыжник.' + LineEnding +
  516. 'Ты машинально отпрыгиваешь влево — и спиной вниз летишь в пропасть.');
  517. 1: writeln(
  518. 'Пара секунд невесомости, и ты отключаешься от адской боли.' + LineEnding +
  519. 'Очнувшись, ты обнаруживаешь себя насаженным в падении на пару зазубренных пик. По-видимому, именно они и составляли дно пропасти.' + LineEnding +
  520. 'К сожалению, на зазубринах осталась часть твоего органокомплекса, и у тебя нет ни единого шанса.' + LineEnding +
  521. 'Вдали ты видишь силуэт девушки, один её глаз светится красной точкой.' + LineEnding +
  522. 'Ты загипнотизированно смотришь на него и чувствуешь, как кровотечение останавливается. Теперь ты умрёшь ещё не через один час.' + LineEnding +
  523. '' + LineEnding +
  524. '<КОНЕЦ>');
  525. end;
  526. end;
  527.  
  528. procedure Scene_GirlRevenge1.HandleCommands;
  529. begin
  530. case stage of
  531. 0: if Command('', 'Падать...') then inc(stage);
  532. end;
  533. end;
  534.  
  535. function Scene_GirlRevenge1.HandleFlags: FlagSet;
  536. begin
  537. case stage of
  538. 1: result := [Scene_IsEnding];
  539. else result := [];
  540. end;
  541. end;
  542.  
  543. procedure Scene_GirlRevenge2.HandleDisplay;
  544. begin
  545. writeln(
  546. 'Твоя спина холодеет, но ты быстро идёшь вперёд, не оборачиваясь.' + LineEnding +
  547. 'После нескольких преодолённых тобой ступенек дверь начинает быстро захлопываться. От неожиданности девушка спотыкается и на всей скорости вмазывается в неё головой.' + LineEnding +
  548. '' + LineEnding +
  549. 'Хруст с характерным хлюпанием — звук расколовшегося черепа — последнее, что ты слышишь, прежде чем дверь окончательно захлопывается и сливается со стеной, отрезая тебе путь назад.' + LineEnding +
  550. 'Тебе становится грустно. Ты возвращаешься к месту прежней двери, прикладываешь ладонь и долго стоишь молча, вспоминая ваше короткое знакомство.' + LineEnding +
  551. 'Встряхнувшись, ты разворачиваешься и решительно шагаешь вниз, в неизвестность.' + LineEnding +
  552. '' + LineEnding +
  553. '<КОНЕЦ>');
  554. end;
  555.  
  556. function Scene_GirlRevenge2.HandleFlags: FlagSet;
  557. begin
  558. result := [Scene_IsEnding];
  559. end;
  560.  
  561. {$ifdef demonstrate}
  562. type
  563. TUnicodeStringArray = array of unicodestring;
  564. TArrayOfUnicodeStringArray = array of TUnicodeStringArray;
  565. {$endif}
  566.  
  567. var
  568. world: TWorld;
  569. cmd: unicodestring;
  570. {$ifdef demonstrate}
  571. scenarios: TArrayOfUnicodeStringArray;
  572. iScenario: SizeInt;
  573. {$endif}
  574.  
  575. begin
  576. {$ifdef demonstrate}
  577. // сценарии для ideone
  578. scenarios := TArrayOfUnicodeStringArray.Create
  579. (
  580. TUnicodeStringArray.Create('1', '0', ''), // концовка 1
  581. TUnicodeStringArray.Create('1', '1', '', '', '', '1', '', '', '', '1', '', '', '', '', '1', '1', '', ''), // концовка 2
  582. TUnicodeStringArray.Create('1', '1', '', '', '', '1', '', '', '', '1', '', '', '', '', '1', '2', '') // концовка 3
  583. );
  584. for iScenario := 0 to High(scenarios) do
  585. begin
  586. writeln('--- Сценарий ', 1 + iScenario, ' / ', length(scenarios), ' ---');
  587. writeln;
  588. world := TWorld.Create(Scene_Prologue.Create);
  589. try
  590. for cmd in scenarios[iScenario] do
  591. begin
  592. world.Display;
  593. writeln(cmd);
  594. world.SendCommand(cmd);
  595. end;
  596. finally
  597. FreeAndNil(world);
  598. end;
  599. end;
  600. {$else}
  601. // интерактив
  602. world := TWorld.Create(Scene_Prologue.Create);
  603. try
  604. while world.Alive do
  605. begin
  606. world.Display;
  607. readln(cmd);
  608. world.SendCommand(cmd);
  609. end;
  610. finally
  611. FreeAndNil(world);
  612. end;
  613. {$endif}
  614. end.
Success #stdin #stdout 0s 4388KB
stdin
Standard input is empty
stdout
--- Сценарий 1 / 3 ---

В древней книге ты прочитал о Подземелье Королей, которое даст славу и могущество тому, кто его пройдёт.
Когда ты приплыл по координатам, загадочный остров возник из ниоткуда.
Ты спускаешься на берег.

(1) Исследовать остров.
(0) Покинуть остров.

> 1

В сотне метров от берега виднеется витражный купол.
Подойдя ближе, ты видишь каменную площадку и дверь, высеченную в скале.
На двери нарисован треугольник, концы трёх стрелок направлены к его вершинам извне.
В центре площадки лежит голая девушка. Похоже, она без сознания.

(1) Трахнуть девушку в рот.
(2) Трахнуть девушку в вагину.
(3) Трахнуть девушку в анус.
(4) Открыть дверь.
(0) Покинуть остров.

> 0

Испуганный, ты развернулся и побежал к кораблю. Ты отплыл от острова, но так и не вернулся домой.

<КОНЕЦ>

--- Сценарий 2 / 3 ---

В древней книге ты прочитал о Подземелье Королей, которое даст славу и могущество тому, кто его пройдёт.
Когда ты приплыл по координатам, загадочный остров возник из ниоткуда.
Ты спускаешься на берег.

(1) Исследовать остров.
(0) Покинуть остров.

> 1

В сотне метров от берега виднеется витражный купол.
Подойдя ближе, ты видишь каменную площадку и дверь, высеченную в скале.
На двери нарисован треугольник, концы трёх стрелок направлены к его вершинам извне.
В центре площадки лежит голая девушка. Похоже, она без сознания.

(1) Трахнуть девушку в рот.
(2) Трахнуть девушку в вагину.
(3) Трахнуть девушку в анус.
(4) Открыть дверь.
(0) Покинуть остров.

> 1

Губы девушки манят тебя. Ты приближаешься, чтобы облизнуть их, и чувствуешь её слабое дыхание.
Ты не ощущаешь сопротивления, проникая языком в её рот. Твой член поднимается.
Ты завершаешь поцелуй и придвигаешься бёдрами.
Придерживая голову девушки, ты прижимаешь член к её губам. Они распахиваются вслед за приоткрывшейся челюстью и принимают его внутрь.
Ты начинаешь двигаться. Основание члена ритмично скользит по её податливому языку, а головка тычется в мягкое нёбо.

<ENTER> Продолжать.

Не вытаскивая члена, ты разворачиваешься и утыкаешься лбом в промежность девушки. Она слабо пахнет морскими водорослями.
Ты обхватываешь бёдра девушки руками и с усилием просовываешь член ей в глотку. Её горло сводит судорога.
Ты остаёшься неподвижен и прислушиваешься к ощущениям, пока её горло расслабляется.
Ты постепенно возобновляешь движения, и через минуту уже, сквозь слюни и сбивающееся дыхание, раз за разом топишь член в её глотке по самые яйца.

<ENTER> Кончить в горло.

После ещё нескольких толчков ты разряжаешься внутрь.
Перистальтика пищевода слабее, чем если бы девушка была в сознании, но, так или иначе, большая часть спермы оказывается у неё в желудке.
Ты медленно вынимаешь обслюнявленный член из её рта.

<ENTER> Подняться.

Ты видишь каменную площадку и дверь, высеченную в скале.
На двери нарисован треугольник, концы трёх стрелок направлены к его вершинам извне.
Одна из стрелок выглядит выветренной.
В центре площадки лежит голая девушка. Похоже, она без сознания.

Рот девушки блестит на солнце, пробивающемся сквозь купол.

(1) Трахнуть девушку в вагину.
(2) Трахнуть девушку в анус.
(3) Открыть дверь.
(0) Покинуть остров.

> 1

В предвкушении ты спускаешься на колени перед промежностью девушки.
В островке волос на её лобке застряли кристаллики соли.
Ты гладишь девушку по нежной внутренней поверхности бёдер, и она постанывает сквозь забытьё.
Ты раздвигаешь половые губы девушки левой рукой, а двумя пальцами правой дразнишь вход во влагалище. Немного погодя без труда проскальзываешь ими вовнутрь и аккуратно растягиваешь в стороны. Ты видишь, как потревоженные стенки влагалища слегка пульсируют, пытаясь вернуться к первоначальной форме.

<ENTER> Секс.

Теперь снова совершенно готовый, ты запрокидываешь одну ногу девушки себе на плечо.
Помогая свободной рукой, ты трёшься стволом члена вдоль её половых губ и клитора. Затем уверенно направляешь головку внутрь, и с хлюпанием смазки он наполовину погружается в её лоно.
Ты кладёшь ладонь на живот девушки и совершаешь несколько пробных фрикций, постепенно увеличивая глубину.
Стенки влагалища обхватывают тебя всё плотнее.
И вот, раззадоренный, ты запрокидываешь её вторую ногу, упираешься локтями в каменный пол и начинаешь бесцеремонно трахать, доставая аккурат до шейки матки в крайней точке амплитуды.
Купол заполняется похабными звуками соударения юных тел.

<ENTER> Полапать грудь + финал.

Устав держаться на весу, ты встаёшь на голени и расставляешь ноги девушки в стороны.
Ты продолжаешь движения тазом. Грудь девушки покачивается в такт, и ты алчно протягиваешь к ней руки. Ты впиваешься в неё пальцами; девушка в сознании вскрикнула бы от боли, но сейчас она лишь выдохнула сильнее обычного.
На пределе ты приподнимаешь девушку за талию, погружаешь член до упора, и он, пульсируя, заполняет её горячим семенем.
На фоне разгорячённого дыхания девушки ты прислушиваешься к отголоскам оргазма, и наконец осторожно достаёшь свой полностью обмякший член.

<ENTER> Подняться.

Ты видишь каменную площадку и дверь, высеченную в скале.
На двери нарисован треугольник, концы трёх стрелок направлены к его вершинам извне.
Две из стрелок наполовину выветрились.
В центре площадки лежит голая девушка. Похоже, она без сознания.

Рот девушки блестит на солнце, пробивающемся сквозь купол.
Её вагина зияет, из неё течёт струйка вязкой жидкости.

(1) Трахнуть девушку в анус.
(2) Открыть дверь.
(0) Покинуть остров.

> 1

Ты переворачиваешь девушку на живот. Твоему взору открываются её спина и ягодицы.
Ты несколько раз звонко шлёпаешь по ягодицам, оставляя горящие отпечатки ладоней. Твой член давно рвётся ввысь снова.
Ты оттягиваешь правую ягодицу, и анальное колечко послушно тянется за ней. Похоже, девушке не впервой заниматься этим.
Ты приставляешь головку члена к анусу девушки. Ты собираешь слюну во рту, наклоняешься и даёшь ей стечь в ложбинку в месте стыка.

<ENTER> Вставить.

Ты делаешь несколько толчков, приноравливаясь к сфинктеру. Кажется, с каждым разом он пропускает тебя чуть глубже, но в целом остаётся неприступным.
Осмелев, ты решительно обхватываешь таз девушки руками и настойчиво, теперь уже не прерываясь, проталкиваешь член внутрь. После первых сантиметров он с неожиданной лёгкостью проходит на всю длину.
Ты начинаешь фрикции, то и дело шлёпая по ягодицам.
Через пару минут ты чувствуешь, что полностью освоился в прямой кишке. Тогда ты придерживаешь руками ягодицы девушки в раздвинутом состоянии и — чпок! — достаёшь член, чтобы полюбоваться зияющим результатом своих действий.

<ENTER> Продолжить и кончить.

Ты погружаешь член обратно, теперь совершенно без усилий, и ускоряешь движения.
Ты чувствуешь себя на пороге оргазма, делаешь последнее, самое глубокое погружение и начинаешь исторгать сперму вовнутрь.
С последней её каплей живот девушки едва слышно уркнул, словно проглатывая заряд.
Похлопав по ягодицам вместо головы в знак похвалы, ты вытаскиваешь член. Анус уже не спешит закрываться и лишь подрагивает.

<ENTER> Подняться.

Ты слышишь щелчок открывающейся замочной скважины.

<ENTER> Продолжить.

Ты видишь каменную площадку и дверь, высеченную в скале.
Изображение треугольника почти выветрилось, его оставшиеся фрагменты окрасились тёмно-красным.
В центре площадки лежит голая девушка. Она без сознания, но, кажется, стала более подвижной.
Ты сомневаешься, что она оценит твой дружеский вклад, поэтому не хочешь попадаться ей на глаза.

Рот девушки блестит на солнце, пробивающемся сквозь купол.
Анус и вагина зияют, из них натекла небольшая флуоресцирующая лужица.

(1) Открыть дверь.
(0) Покинуть остров.

> 1

Ты открываешь тяжёлую дверь и ступаешь внутрь. Неширокая пологая лестница ведёт вниз, закругляясь.
Стена слева освещена факелами, горящими странным холодным огнём. Поодаль в стене виднеются двери и ответвления.
Справа от лестницы пропасть. Твои глаза, привыкающие к полутьме, видят далеко на её дне что-то мерцающее в рассеянном свете факелов.
Присмотревшись получше, ты видишь вдалеке над пропастью ряды едва заметных точек — по-видимому, таких же факелов. Похоже, лестница идёт по гигантской спирали.

Вдруг ты слышишь быстрый, приближающийся звук шагов.
«Я НЕ ДЛЯ ТЕБЯ ЗДЕСЬ ЛЕЖАЛА! Я ЖДАЛА ЧЭДА!»

(1) Обернуться.
(2) Не оборачиваться.

> 1

Ты решаешься обернуться и твёрдо взглянуть в глаза своей новой суженой.
Она, роняя слёзы, влетает на лестницу и бросает тебе в голову булыжник.
Ты машинально отпрыгиваешь влево — и спиной вниз летишь в пропасть.

<ENTER> Падать...

Пара секунд невесомости, и ты отключаешься от адской боли.
Очнувшись, ты обнаруживаешь себя насаженным в падении на пару зазубренных пик. По-видимому, именно они и составляли дно пропасти.
К сожалению, на зазубринах осталась часть твоего органокомплекса, и у тебя нет ни единого шанса.
Вдали ты видишь силуэт девушки, один её глаз светится красной точкой.
Ты загипнотизированно смотришь на него и чувствуешь, как кровотечение останавливается. Теперь ты умрёшь ещё не через один час.

<КОНЕЦ>

--- Сценарий 3 / 3 ---

В древней книге ты прочитал о Подземелье Королей, которое даст славу и могущество тому, кто его пройдёт.
Когда ты приплыл по координатам, загадочный остров возник из ниоткуда.
Ты спускаешься на берег.

(1) Исследовать остров.
(0) Покинуть остров.

> 1

В сотне метров от берега виднеется витражный купол.
Подойдя ближе, ты видишь каменную площадку и дверь, высеченную в скале.
На двери нарисован треугольник, концы трёх стрелок направлены к его вершинам извне.
В центре площадки лежит голая девушка. Похоже, она без сознания.

(1) Трахнуть девушку в рот.
(2) Трахнуть девушку в вагину.
(3) Трахнуть девушку в анус.
(4) Открыть дверь.
(0) Покинуть остров.

> 1

Губы девушки манят тебя. Ты приближаешься, чтобы облизнуть их, и чувствуешь её слабое дыхание.
Ты не ощущаешь сопротивления, проникая языком в её рот. Твой член поднимается.
Ты завершаешь поцелуй и придвигаешься бёдрами.
Придерживая голову девушки, ты прижимаешь член к её губам. Они распахиваются вслед за приоткрывшейся челюстью и принимают его внутрь.
Ты начинаешь двигаться. Основание члена ритмично скользит по её податливому языку, а головка тычется в мягкое нёбо.

<ENTER> Продолжать.

Не вытаскивая члена, ты разворачиваешься и утыкаешься лбом в промежность девушки. Она слабо пахнет морскими водорослями.
Ты обхватываешь бёдра девушки руками и с усилием просовываешь член ей в глотку. Её горло сводит судорога.
Ты остаёшься неподвижен и прислушиваешься к ощущениям, пока её горло расслабляется.
Ты постепенно возобновляешь движения, и через минуту уже, сквозь слюни и сбивающееся дыхание, раз за разом топишь член в её глотке по самые яйца.

<ENTER> Кончить в горло.

После ещё нескольких толчков ты разряжаешься внутрь.
Перистальтика пищевода слабее, чем если бы девушка была в сознании, но, так или иначе, большая часть спермы оказывается у неё в желудке.
Ты медленно вынимаешь обслюнявленный член из её рта.

<ENTER> Подняться.

Ты видишь каменную площадку и дверь, высеченную в скале.
На двери нарисован треугольник, концы трёх стрелок направлены к его вершинам извне.
Одна из стрелок выглядит выветренной.
В центре площадки лежит голая девушка. Похоже, она без сознания.

Рот девушки блестит на солнце, пробивающемся сквозь купол.

(1) Трахнуть девушку в вагину.
(2) Трахнуть девушку в анус.
(3) Открыть дверь.
(0) Покинуть остров.

> 1

В предвкушении ты спускаешься на колени перед промежностью девушки.
В островке волос на её лобке застряли кристаллики соли.
Ты гладишь девушку по нежной внутренней поверхности бёдер, и она постанывает сквозь забытьё.
Ты раздвигаешь половые губы девушки левой рукой, а двумя пальцами правой дразнишь вход во влагалище. Немного погодя без труда проскальзываешь ими вовнутрь и аккуратно растягиваешь в стороны. Ты видишь, как потревоженные стенки влагалища слегка пульсируют, пытаясь вернуться к первоначальной форме.

<ENTER> Секс.

Теперь снова совершенно готовый, ты запрокидываешь одну ногу девушки себе на плечо.
Помогая свободной рукой, ты трёшься стволом члена вдоль её половых губ и клитора. Затем уверенно направляешь головку внутрь, и с хлюпанием смазки он наполовину погружается в её лоно.
Ты кладёшь ладонь на живот девушки и совершаешь несколько пробных фрикций, постепенно увеличивая глубину.
Стенки влагалища обхватывают тебя всё плотнее.
И вот, раззадоренный, ты запрокидываешь её вторую ногу, упираешься локтями в каменный пол и начинаешь бесцеремонно трахать, доставая аккурат до шейки матки в крайней точке амплитуды.
Купол заполняется похабными звуками соударения юных тел.

<ENTER> Полапать грудь + финал.

Устав держаться на весу, ты встаёшь на голени и расставляешь ноги девушки в стороны.
Ты продолжаешь движения тазом. Грудь девушки покачивается в такт, и ты алчно протягиваешь к ней руки. Ты впиваешься в неё пальцами; девушка в сознании вскрикнула бы от боли, но сейчас она лишь выдохнула сильнее обычного.
На пределе ты приподнимаешь девушку за талию, погружаешь член до упора, и он, пульсируя, заполняет её горячим семенем.
На фоне разгорячённого дыхания девушки ты прислушиваешься к отголоскам оргазма, и наконец осторожно достаёшь свой полностью обмякший член.

<ENTER> Подняться.

Ты видишь каменную площадку и дверь, высеченную в скале.
На двери нарисован треугольник, концы трёх стрелок направлены к его вершинам извне.
Две из стрелок наполовину выветрились.
В центре площадки лежит голая девушка. Похоже, она без сознания.

Рот девушки блестит на солнце, пробивающемся сквозь купол.
Её вагина зияет, из неё течёт струйка вязкой жидкости.

(1) Трахнуть девушку в анус.
(2) Открыть дверь.
(0) Покинуть остров.

> 1

Ты переворачиваешь девушку на живот. Твоему взору открываются её спина и ягодицы.
Ты несколько раз звонко шлёпаешь по ягодицам, оставляя горящие отпечатки ладоней. Твой член давно рвётся ввысь снова.
Ты оттягиваешь правую ягодицу, и анальное колечко послушно тянется за ней. Похоже, девушке не впервой заниматься этим.
Ты приставляешь головку члена к анусу девушки. Ты собираешь слюну во рту, наклоняешься и даёшь ей стечь в ложбинку в месте стыка.

<ENTER> Вставить.

Ты делаешь несколько толчков, приноравливаясь к сфинктеру. Кажется, с каждым разом он пропускает тебя чуть глубже, но в целом остаётся неприступным.
Осмелев, ты решительно обхватываешь таз девушки руками и настойчиво, теперь уже не прерываясь, проталкиваешь член внутрь. После первых сантиметров он с неожиданной лёгкостью проходит на всю длину.
Ты начинаешь фрикции, то и дело шлёпая по ягодицам.
Через пару минут ты чувствуешь, что полностью освоился в прямой кишке. Тогда ты придерживаешь руками ягодицы девушки в раздвинутом состоянии и — чпок! — достаёшь член, чтобы полюбоваться зияющим результатом своих действий.

<ENTER> Продолжить и кончить.

Ты погружаешь член обратно, теперь совершенно без усилий, и ускоряешь движения.
Ты чувствуешь себя на пороге оргазма, делаешь последнее, самое глубокое погружение и начинаешь исторгать сперму вовнутрь.
С последней её каплей живот девушки едва слышно уркнул, словно проглатывая заряд.
Похлопав по ягодицам вместо головы в знак похвалы, ты вытаскиваешь член. Анус уже не спешит закрываться и лишь подрагивает.

<ENTER> Подняться.

Ты слышишь щелчок открывающейся замочной скважины.

<ENTER> Продолжить.

Ты видишь каменную площадку и дверь, высеченную в скале.
Изображение треугольника почти выветрилось, его оставшиеся фрагменты окрасились тёмно-красным.
В центре площадки лежит голая девушка. Она без сознания, но, кажется, стала более подвижной.
Ты сомневаешься, что она оценит твой дружеский вклад, поэтому не хочешь попадаться ей на глаза.

Рот девушки блестит на солнце, пробивающемся сквозь купол.
Анус и вагина зияют, из них натекла небольшая флуоресцирующая лужица.

(1) Открыть дверь.
(0) Покинуть остров.

> 1

Ты открываешь тяжёлую дверь и ступаешь внутрь. Неширокая пологая лестница ведёт вниз, закругляясь.
Стена слева освещена факелами, горящими странным холодным огнём. Поодаль в стене виднеются двери и ответвления.
Справа от лестницы пропасть. Твои глаза, привыкающие к полутьме, видят далеко на её дне что-то мерцающее в рассеянном свете факелов.
Присмотревшись получше, ты видишь вдалеке над пропастью ряды едва заметных точек — по-видимому, таких же факелов. Похоже, лестница идёт по гигантской спирали.

Вдруг ты слышишь быстрый, приближающийся звук шагов.
«Я НЕ ДЛЯ ТЕБЯ ЗДЕСЬ ЛЕЖАЛА! Я ЖДАЛА ЧЭДА!»

(1) Обернуться.
(2) Не оборачиваться.

> 2

Твоя спина холодеет, но ты быстро идёшь вперёд, не оборачиваясь.
После нескольких преодолённых тобой ступенек дверь начинает быстро захлопываться. От неожиданности девушка спотыкается и на всей скорости вмазывается в неё головой.

Хруст с характерным хлюпанием — звук расколовшегося черепа — последнее, что ты слышишь, прежде чем дверь окончательно захлопывается и сливается со стеной, отрезая тебе путь назад.
Тебе становится грустно. Ты возвращаешься к месту прежней двери, прикладываешь ладонь и долго стоишь молча, вспоминая ваше короткое знакомство.
Встряхнувшись, ты разворачиваешься и решительно шагаешь вниз, в неизвестность.

<КОНЕЦ>