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

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

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

<КОНЕЦ>