├── BeaRLibItems.dll ├── BearLibFOV.dll ├── BearLibPF.dll ├── BearLibTerminal.dll ├── CHANGELOG.md ├── ForgottenSaga.exe ├── ForgottenSagaWizard.bat ├── LICENSE ├── README.md ├── WorldEditor.exe ├── clean.bat ├── config.ini ├── images ├── eye.bmp ├── items+eye.bmp ├── items.bmp ├── smalladd.png ├── terrain+eye.bmp └── terrain.bmp ├── resources ├── Andale_Mono.ttf ├── UbuntuMono-R.ttf ├── Washington.ttf ├── black_cave.crt ├── black_cave.itm ├── black_cave.map ├── black_cave_pit.crt ├── black_cave_pit.itm ├── black_cave_pit.map ├── black_warg.qst ├── boar_pelt.qst ├── cdl.bmp ├── cdr.bmp ├── colors.ini ├── ctl.bmp ├── ctr.bmp ├── dragon.bmp ├── elk.qst ├── far_cave.crt ├── far_cave.itm ├── far_cave.map ├── flags.txt ├── forest_of_boars.crt ├── forest_of_boars.itm ├── forest_of_boars.map ├── goblin_telorgon.qst ├── goblin_virn.qst ├── goblins.bmp ├── hl.bmp ├── icon.ico ├── minotaur.bmp ├── objects.ini ├── orc_camp.crt ├── orc_camp.itm ├── orc_camp.map ├── orc_dar_gul.qst ├── orc_leader.qst ├── orc_shaman.qst ├── orc_tashak_suum.qst ├── paper.bmp ├── plain_of_bones.crt ├── plain_of_bones.itm ├── plain_of_bones.map ├── portal.qst ├── russian.black_cave.txt ├── russian.black_cave_pit.txt ├── russian.forest_of_boars.txt ├── russian.intro.txt ├── russian.names.txt ├── russian.objects.txt ├── russian.orc_camp.txt ├── russian.plain_of_bones.txt ├── russian.terrain.txt ├── russian.txt ├── russian.world.txt ├── russian.worldeditor.txt ├── stone_idol.qst ├── terrain.ini ├── test_door.qst ├── vl.bmp ├── warg_spirit.qst ├── well.qst ├── witch.bmp └── world.ini ├── sources ├── ForgottenSaga.Classes.pas ├── ForgottenSaga.Entities.pas ├── ForgottenSaga.Scenes.pas ├── bearengine │ ├── Engine.pas │ ├── ForgottenSaga.dpr │ ├── ForgottenSaga.dproj │ ├── ForgottenSaga.lpi │ ├── ForgottenSaga.res │ ├── ForgottenSaga.todo │ └── Include.inc ├── includes │ ├── BeaRLibItems.pas │ └── BearLibTerminal.pas ├── vclengine │ ├── Engine.pas │ ├── ForgottenSaga.MainForm.dfm │ ├── ForgottenSaga.MainForm.pas │ ├── ForgottenSaga.dof │ ├── ForgottenSaga.dpr │ ├── ForgottenSaga.dproj │ ├── ForgottenSaga.res │ └── Include.inc └── worldeditor │ ├── Include.inc │ ├── WorldEditor.Classes.pas │ ├── WorldEditor.MainForm.dfm │ ├── WorldEditor.MainForm.pas │ ├── WorldEditor.NewMapForm.dfm │ ├── WorldEditor.NewMapForm.pas │ ├── WorldEditor.ProgressBarForm.dfm │ ├── WorldEditor.ProgressBarForm.pas │ ├── WorldEditor.dof │ ├── WorldEditor.dpr │ ├── WorldEditor.dproj │ ├── WorldEditor.lpi │ ├── WorldEditor.res │ ├── WorldEditor.todo │ └── images.bmp ├── temp ├── dev.txt ├── items.txt ├── quests.txt └── todo.txt └── upx.bat /BeaRLibItems.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/BeaRLibItems.dll -------------------------------------------------------------------------------- /BearLibFOV.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/BearLibFOV.dll -------------------------------------------------------------------------------- /BearLibPF.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/BearLibPF.dll -------------------------------------------------------------------------------- /BearLibTerminal.dll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/BearLibTerminal.dll -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | **Version 0.0.3** 4 | 5 | - Improved World Editor. 6 | - Some cleanup of the code. 7 | - Added configuration file config.ini. 8 | - Library BearLibTerminal updated to version 0.14.4. 9 | 10 | --- 11 | 12 | 13 | **Version 0.0.2 - August 15, 2016** 14 | 15 | - BearLibTerminal integrated. 16 | - Major cleanup of the code. 17 | - Bug fixes to core and controls. Some new minor features. 18 | 19 | --- 20 | 21 | 22 | **Version 0.0.1 - July 26, 2016** 23 | 24 | - Compacting code. 25 | - Initial source commit. 26 | 27 | 28 | -------------------------------------------------------------------------------- /ForgottenSaga.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/ForgottenSaga.exe -------------------------------------------------------------------------------- /ForgottenSagaWizard.bat: -------------------------------------------------------------------------------- 1 | ForgottenSaga.exe -w 2 | pause -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Sergiy Tkach 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Forgotten Saga 2 | 3 | ## Introduction 4 | A tactical turn-based roguelike game with elements of survival and world exploration, where the player controls the hero, fighting enemies, completing tasks, collecting resources and upgrading equipment. 5 | 6 | --- 7 | 8 | ## Current State 9 | The game is currently in demo stage with very limited contents and lots of issues to solve and improve. 10 | 11 | --- 12 | 13 | ## Controls: 14 | The game is controlled via the keyboard. 15 | 16 | **Menus:** 17 | - Arrow keys to navigate. 18 | - ENTER to enter/confirm. 19 | - ESC to cancel. 20 | 21 | **Gameplay:** 22 | - Arrow keys to move around. 23 | - ESC to enter main menu and cancel. 24 | - L to enter look mode. 25 | - I to enter inventory. 26 | - J to enter journal (quest log). 27 | 28 | --- 29 | 30 | ## Credits 31 | Copyright (C) 2016-2017 Sergiy Tkach (DevApromix) 32 | 33 | This program is free software; you can redistribute it and/or modify it under the terms of the MIT License version 2 as published by the Free Software Foundation. 34 | -------------------------------------------------------------------------------- /WorldEditor.exe: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/WorldEditor.exe -------------------------------------------------------------------------------- /clean.bat: -------------------------------------------------------------------------------- 1 | del /s *.~* 2 | del /s *.dcu 3 | del /s *.ppu 4 | del /s *.lps 5 | del /s *.bak 6 | del /s *.identcache 7 | del /s *.otares 8 | del /s *.local 9 | del /s *.cfg 10 | del /s *.ddp 11 | del /s *.a 12 | del /s *.compiled 13 | del /s *.o 14 | del /s *.or 15 | -------------------------------------------------------------------------------- /config.ini: -------------------------------------------------------------------------------- 1 | [BearLibTerminal] 2 | window: title="Forgotten Saga" 3 | log: file=log.txt, level=trace 4 | font: resources\Andale_Mono.ttf, size=11 5 | 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /images/eye.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/images/eye.bmp -------------------------------------------------------------------------------- /images/items+eye.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/images/items+eye.bmp -------------------------------------------------------------------------------- /images/items.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/images/items.bmp -------------------------------------------------------------------------------- /images/smalladd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/images/smalladd.png -------------------------------------------------------------------------------- /images/terrain+eye.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/images/terrain+eye.bmp -------------------------------------------------------------------------------- /images/terrain.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/images/terrain.bmp -------------------------------------------------------------------------------- /resources/Andale_Mono.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/Andale_Mono.ttf -------------------------------------------------------------------------------- /resources/UbuntuMono-R.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/UbuntuMono-R.ttf -------------------------------------------------------------------------------- /resources/Washington.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/Washington.ttf -------------------------------------------------------------------------------- /resources/black_cave.crt: -------------------------------------------------------------------------------- 1 | ;Black Cave 2 | 3 | [0] 4 | Name=Spider 5 | X=24 6 | Y=12 7 | Life=100/100 8 | Symbol=s 9 | File= 10 | Color=222,111,111 11 | Dialog=0 12 | NPC=0 13 | [1] 14 | Name=Spider 15 | X=22 16 | Y=25 17 | Life=100/100 18 | Symbol=s 19 | File= 20 | Color=222,111,111 21 | Dialog=0 22 | NPC=0 23 | [2] 24 | Name=Spider 25 | X=10 26 | Y=14 27 | Life=100/100 28 | Symbol=s 29 | File= 30 | Color=222,111,111 31 | Dialog=0 32 | NPC=0 33 | [3] 34 | Name=Gray Spider 35 | X=16 36 | Y=19 37 | Life=100/100 38 | Symbol=S 39 | File= 40 | Color=65,65,65 41 | Dialog=0 42 | NPC=0 43 | -------------------------------------------------------------------------------- /resources/black_cave.itm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/black_cave.itm -------------------------------------------------------------------------------- /resources/black_cave.map: -------------------------------------------------------------------------------- 1 | ; black_cave.map 2 | [0] 3 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 4 | 2222...222222222..2222222222......2..222.2...2222222222.......2222222222...22222 5 | 2222...2222222222....2222222222.....2222...22.222222...22222...............22222 6 | 22222......222222222...22222222.2.....22.2222.22....22222222222222222222.2222222 7 | 2222222.......22222222...2222222222......22.2...22222222222222222222222222222222 8 | 222222222222...2222222222..22222222.....2.2...22222............2222....222222222 9 | 22222222222222..2222222222.22222222...K......2222..222222222222........222222222 10 | 222222222222222..222222222.222222222....2..222222.22222222..222....2222222222222 11 | 2222222222222222..22222222..222222222......222222..........222..2222222222222222 12 | 2222222222222222....222222..22222222......222222222222222222...222222222222..222 13 | 222222222222222222....22222.22222...22.....22222.22222222.....2222222222.....222 14 | 22222222222222222222......2...2222.2222...22.22..22222....22222222222.....222222 15 | 22222222222222222222222...2.222222..2222..2..2..22..2...22222222222....222222222 16 | 222222.....22222222222....2.222222..22....2....2......2222222222222...2222222222 17 | 222222......222222222.2.2.2.2222.22...2..........2.22.222222222222...22222222222 18 | 2222222222............2.......22.222.22...22.....2.22.222222222222..222222222222 19 | 222222222222222222....2..222.............2222.2.......2222K....222..222222222222 20 | 22222222222222222........2...2.....222.....22...2.22.......................22222 21 | 222222222222222.......22.22..2.22..2..2..22222..222...22222...22222222....2..222 22 | 2222222222222....222.22...2.222...22............222222222222....2222222222....22 23 | 2222222222....222222222222..22222....2....22222...2222222222.222222222222222..22 24 | 22222222...2222222222222222.2222..2......22222222...22222222.22222222.....222222 25 | 222222.2..2222222222222222222222.22.....2..2222222....22222...222222..222..22222 26 | 22222....22222222......222222222............222222......222...222...222222.22222 27 | 22222...222222...22222222.22222.22.....22...222222222222.2222222..22222222..2222 28 | 2222..2222222..222222....L.2222.....22..22.222222222.2.....222...222..22222.2222 29 | 222..2222222.22222222222............22.222..22222222....2......222222.......2222 30 | 222..222222..222222222......2...222.2..2222222222222222222.....22222222....22222 31 | 2222.22222..22222......22222222.2...22.2222222222222222222..........222222222222 32 | 2222......222222..22..2222222222...222.22222222222222222...22222222..22222222222 33 | 222222222222222.222..222222222222..222...2222222222222...22222222222...222222222 34 | 222222222222222....222222222222222..22..222222222222..222222222222222..222222222 35 | 222222222222...222222222....222222.2222.22222222......2222222222222222......2222 36 | 2222222222...2222222.....22222222..22222.222222........222222222222222222....222 37 | 2222222...2.222222...22222222222..222222....22..2222222.....22222222222222222222 38 | 2222222.22..2222...2222222222222..222222222.22222222222222222....222222222222222 39 | 2222222....22222..2222222222222...222222222....22222222222222222...2222222222222 40 | 22222222222222222.22222222.2....22222222222222..222222222222222222......22222222 41 | 22222222222222222.........222222222222222222222222222222222222222222222222222222 42 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 43 | [1] 44 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 45 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 46 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 47 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 48 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 49 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 50 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 51 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 52 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 53 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 54 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 55 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 56 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 57 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 58 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 59 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 60 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 61 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 62 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 63 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 64 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 65 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 66 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 67 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 68 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 69 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 70 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 71 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 72 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 73 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 74 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 75 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 76 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 77 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 78 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 79 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 80 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 81 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 82 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 83 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 84 | -------------------------------------------------------------------------------- /resources/black_cave_pit.crt: -------------------------------------------------------------------------------- 1 | ;The Pit 2 | 3 | [10] 4 | Name=Deep Spider 5 | X=24 6 | Y=12 7 | Life=100/100 8 | Symbol=S 9 | File= 10 | Color=255,255,255 11 | Dialog=0 12 | NPC=0 13 | [20] 14 | Name=Spider 15 | X=22 16 | Y=25 17 | Life=100/100 18 | Symbol=s 19 | File= 20 | Color=255,255,255 21 | Dialog=0 22 | NPC=0 23 | [30] 24 | Name=Spider 25 | X=10 26 | Y=14 27 | Life=100/100 28 | Symbol=s 29 | File= 30 | Color=255,255,255 31 | Dialog=0 32 | NPC=0 33 | [40] 34 | Name=Spider 35 | X=16 36 | Y=19 37 | Life=100/100 38 | Symbol=s 39 | File= 40 | Color=255,255,255 41 | Dialog=0 42 | NPC=0 43 | [50] 44 | Name=Spider 45 | X=26 46 | Y=27 47 | Life=100/100 48 | Symbol=s 49 | File= 50 | Color=255,255,255 51 | Dialog=0 52 | NPC=0 53 | [60] 54 | Name=Deep Spider 55 | X=43 56 | Y=29 57 | Life=100/100 58 | Symbol=S 59 | File= 60 | Color=255,255,255 61 | Dialog=0 62 | NPC=0 63 | -------------------------------------------------------------------------------- /resources/black_cave_pit.itm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/black_cave_pit.itm -------------------------------------------------------------------------------- /resources/black_cave_pit.map: -------------------------------------------------------------------------------- 1 | ; black_cave_pit.map 2 | [0] 3 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 4 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 5 | 22222222222222222222222222222222222202022222222222222222222222222222222222222222 6 | 22222222222222222222222222222222222000022222222222222222222222222222222222222222 7 | 22222222222222222222222222222222222002020222222222222222222222222222222222222222 8 | 22222222222222222222222222222222222200000222222222222222222222222222222222222222 9 | 22222222222222222222222222220022220220L00002222222222222222222222222222222222222 10 | 22222222222222222222222222222022220220000002222222222222222222222222222222222222 11 | 22222222222222220000222222202022220020000000002222222222222222222222222222222222 12 | 22222222222222220020222222200022220000000020200002222222222222222222222222222222 13 | 22222222222222222000002222020022222202000200200000000222222222222222222222222222 14 | 22222222222222222222000022000222200002000000002222000000022222222222222222222222 15 | 22222222222222222222220000002222202022220022202222222000222222222222222222222222 16 | 22222222222222222222222020000022220020000002222222222200222222222222222222222222 17 | 22222222220002222222222020202000200000000002000022222222222222222222222222222222 18 | 22222222222200000022222222200000222222200000020022222222222222222222222222222222 19 | 2222222222222222200002002222000000000220000000002222222200L222222222222222222222 20 | 22222222222222222200000002200200020000000022022222202200002222222222222222222222 21 | 22222222222222222022222000002002020000000000222222000002222222222222222222222222 22 | 22222222222222220000000020000220000020000202222220022222222222222222222222222222 23 | 22222222222222222222020000202200002020000200000000022202222222222222222222222222 24 | 22222222222222222222020022202222002200000200022022220002222222222222222222222222 25 | 22222222222222222222022222202222222200000000000222200222222222222222222222222222 26 | 22222222222222222222022222222222220200000222000000000022222222222222222222222222 27 | 22222222222222222222022220200000220002200002002022202022222222222222222222222222 28 | 22222222222222222222200200222200000000002022002022202222222222222222222222222222 29 | 22222222222222222222200000200000000022202002222222222222222222222222222222222222 30 | 22222222222222222222222220000000202022202200022222222222222222222222222222222222 31 | 22222222222222222222222220200202202022220000002222222222222222222222222222222222 32 | 22222222222222222222222222222222222022222020202222222222222222222222222222222222 33 | 22222222222222222222222222222222222222220020002222222222222222222222222222222222 34 | 22222222222222222222222222222222222222222002202222222222222222222222222222222222 35 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 36 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 37 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 38 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 39 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 40 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 41 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 42 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 43 | [1] 44 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 45 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 46 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 47 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 48 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 49 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 50 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 51 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 52 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 53 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 54 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 55 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 56 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 57 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 58 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 59 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 60 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 61 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 62 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 63 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 64 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 65 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 66 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 67 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 68 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 69 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 70 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 71 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 72 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 73 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 74 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 75 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 76 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 77 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 78 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 79 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 80 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 81 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 82 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 83 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 84 | -------------------------------------------------------------------------------- /resources/black_warg.qst: -------------------------------------------------------------------------------- 1 | :0 2 | pln У многих племен в качестве ездовых животных используются сильные и выносливые варги - огромные черные волки. Они вольно гуляют по лагерю и никого не трогают. Заметив одного из них, ты подходишь к нему и пытаешься его погладить... Но, взглянув в его кроваво-красные глаза, быстро отходишь назад... 3 | btn close, Спокойно, друг! 4 | end 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /resources/boar_pelt.qst: -------------------------------------------------------------------------------- 1 | ; For Quest #4. 2 | ; After defeating the boar. 3 | 4 | if quest4=1 then 5 | if inv? Boar Pelt < 5 then 6 | inv+ Boar Pelt 7 | endif 8 | endif -------------------------------------------------------------------------------- /resources/cdl.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/cdl.bmp -------------------------------------------------------------------------------- /resources/cdr.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/cdr.bmp -------------------------------------------------------------------------------- /resources/colors.ini: -------------------------------------------------------------------------------- 1 | [BLACK] 2 | R=0 3 | G=0 4 | B=0 5 | 6 | [BLUE] 7 | R=48 8 | G=52 9 | B=109 10 | 11 | [GREEN] 12 | R=52 13 | G=101 14 | B=36 15 | 16 | [CYAN] 17 | R=97 18 | G=154 19 | B=255 20 | 21 | [RED] 22 | R=174 23 | G=48 24 | B=48 25 | 26 | [MAGENTA] 27 | R=117 28 | G=65 29 | B=138 30 | 31 | [BROWN] 32 | R=211 33 | G=125 34 | B=44 35 | 36 | [LGRAY] 37 | R=134 38 | G=150 39 | B=162 40 | 41 | [DGRAY] 42 | R=77 43 | G=73 44 | B=77 45 | 46 | [LBLUE] 47 | R=89 48 | G=125 49 | B=207 50 | 51 | [LGREEN] 52 | R=109 53 | G=170 54 | B=44 55 | 56 | [LCYAN] 57 | R=109 58 | G=195 59 | B=203 60 | 61 | [LRED] 62 | R=219 63 | G=85 64 | B=97 65 | 66 | [LMAGENTA] 67 | R=215 68 | G=121 69 | B=186 70 | 71 | [YELLOW] 72 | R=219 73 | G=215 74 | B=93 75 | 76 | [WHITE] 77 | R=223 78 | G=239 79 | B=215 -------------------------------------------------------------------------------- /resources/ctl.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/ctl.bmp -------------------------------------------------------------------------------- /resources/ctr.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/ctr.bmp -------------------------------------------------------------------------------- /resources/dragon.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/dragon.bmp -------------------------------------------------------------------------------- /resources/elk.qst: -------------------------------------------------------------------------------- 1 | :0 2 | pln Стена леса внезапно раскрывается и ты видишь огромного лося. Зверь нервно бьет копытами. Его глаза налиты кровью. В тебе он видит только противника! 3 | if quest7=1 then 4 | btn close (proc elk), Атаковать! 5 | endif 6 | btn close, Отступить 7 | end 8 | 9 | :elk 10 | dialog orc_camp:goblin_telorgon:1 11 | dialog forest_of_boars:elk:1 12 | exp 12 13 | quest7=2 14 | inv+ Elk Meat 15 | qlog 7:В густой чаще я выследил лося и хорошо поохотился. Отнесу мясо Телоргону. 16 | qlog 7:update 17 | end 18 | 19 | :1 20 | pln У твоих ног лежат останки лося. Кто-то хорошо поохотился... 21 | btn close, Пройти мимо 22 | end 23 | -------------------------------------------------------------------------------- /resources/far_cave.crt: -------------------------------------------------------------------------------- 1 | ;Far Cave 2 | 3 | [0] 4 | Name=Кобольд 5 | X=24 6 | Y=12 7 | Life=100/100 8 | Symbol=k 9 | File= 10 | Color=255,255,255 11 | Dialog=0 12 | NPC=0 13 | [2] 14 | Name=Кобольд 15 | X=22 16 | Y=25 17 | Life=100/100 18 | Symbol=k 19 | File= 20 | Color=255,255,255 21 | Dialog=0 22 | NPC=0 23 | [4] 24 | Name=Кобольд 25 | X=10 26 | Y=14 27 | Life=100/100 28 | Symbol=k 29 | File= 30 | Color=255,255,255 31 | Dialog=0 32 | NPC=0 33 | [6] 34 | Name=Кобольд 35 | X=16 36 | Y=19 37 | Life=100/100 38 | Symbol=k 39 | File= 40 | Color=255,255,255 41 | Dialog=0 42 | NPC=0 43 | [8] 44 | Name=Кобольд 45 | X=9 46 | Y=35 47 | Life=100/100 48 | Symbol=k 49 | File= 50 | Color=255,255,255 51 | Dialog=0 52 | NPC=0 53 | [10] 54 | Name=Кобольд 55 | X=47 56 | Y=36 57 | Life=100/100 58 | Symbol=k 59 | File= 60 | Color=255,255,255 61 | Dialog=0 62 | NPC=0 63 | -------------------------------------------------------------------------------- /resources/far_cave.itm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/far_cave.itm -------------------------------------------------------------------------------- /resources/far_cave.map: -------------------------------------------------------------------------------- 1 | ; far_cave.map 2 | [0] 3 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 4 | 22222222200000222222222222222222222222222222200000222222222222222222222222222222 5 | 22222000000000222222222222222222222222222222000000222222222222222222222222222222 6 | 22220000000000222222222222222002222222222222000000222222222222220000000000222222 7 | 22220000000000222222222222200000222222222222000222222222222222200000000000222222 8 | 22220000000000222222222222200000000000222200002222222222222222200022220000022222 9 | 22222222222000022222222222220000200000002200022222222222222222000222222000022222 10 | 22222222222220000022222222222222222222000000022222222222222220002222222200022222 11 | 22222000000000000002222222222222222222200000222222222222222000002222222200022222 12 | 22200000000000000000022222222222222222200022222222222222220000222222222220022222 13 | 22200000222222222220000222222222222222000222222222222222000222222222222220022222 14 | 22220002222222222222200000000002222220000222222222222200022222222222222200002222 15 | 22222222222222222222222000000000000000022222222222200000222222222222222200000222 16 | 22222222222222222222222002222222000000022222222220000022222222222222222200000022 17 | 22222200000000222222222222222222220000000222222200000222222200000222222222000022 18 | 22220000002000222222222222222222222000000022220000002222222000000000022222022222 19 | 22200002222200222222222222222222000022200000000000222222222000002222222222222222 20 | 22200022222220022222222222220000022222222000000022222222222000002222222222222222 21 | 22220022222220002222222220000022222222222222000022222222222200222222222222222222 22 | 22200022222222200020000000022222222222222222220002222222222200222222222222222222 23 | 22220002222222222000000222222222222000000022222000022222222220022222222222222222 24 | 22222200222222222220022222222222000000000000000000000222222220022222222222222222 25 | 22222220002222222220000222222220000000000000000000000022222220022222222222222222 26 | 22222200002222222222200022222220000022222222222222000000222200022222222222222222 27 | 22200000002222222222200022222220000222222222222222222200000200022222222222222222 28 | 22200000222222222222200022222222222222222222222222222222000000222222222222222222 29 | 22220000222222222200000022222222222222222222222222222222220000000222222222222222 30 | 22222222222222000000000222222222222222222222222222222000000000000002220000000222 31 | 222222222000000222222222222222222222222222222000000000000000222200000000000L0222 32 | 22222220000002222222222222222222220000000000002000002222222222200002222000000222 33 | 22222000000222222220000000000000000000000000022222222222222222000222222222222222 34 | 22200000022222200000000000000000002222222222222222222222222200002222222222222222 35 | 22000000222000000222222222222222222222222222222222222222222000222222222222222222 36 | 22002222200000000022222222222222222222222222222222222222000022222222222222222222 37 | 22222220000000000022222222222222222222222222222220000000000222222222222222222222 38 | 22222000000000022222222222222222222222222222222220002222222222222222222222222222 39 | 22222220000222222222222222222222222222222222200000022222222222222222222222222222 40 | 22222222222222222222222222222222222222222222200000022222222222222222222222222222 41 | 22222222222222222222222222222222222222222222200000222222222222222222222222222222 42 | 22222222222222222222222222222222222222222222222222222222222222222222222222222222 43 | [1] 44 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 45 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 46 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 47 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 48 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 49 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 50 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 51 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 52 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 53 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 54 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 55 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 56 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 57 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 58 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 59 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 60 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 61 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 62 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 63 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 64 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 65 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 66 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 67 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 68 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 69 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 70 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 71 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 72 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 73 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 74 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 75 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 76 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 77 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 78 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 79 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 80 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 81 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 82 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 83 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 84 | -------------------------------------------------------------------------------- /resources/flags.txt: -------------------------------------------------------------------------------- 1 | -------------------- 2 | ==================== 3 | -=-=-=-=-=-=-=-=-=-= 4 | =-=-=-=-=-=-=-=-=-=- 5 | -~-~-~-~-~-~-~-~-~-~ 6 | ~-~-~-~-~-~-~-~-~-~- 7 | ~~~~~~~~~~~~~~~~~~~~ 8 | ~=~=~=~=~=~=~=~=~=~= 9 | =~=~=~=~=~=~=~=~=~=~ 10 | =+=+=+=+=+=+=+=+=+=+ 11 | +=+=+=+=+=+=+=+=+=+= 12 | ++++++++++++++++++++ 13 | -----==========----- 14 | ------========------ 15 | -------======------- 16 | --------====-------- 17 | -----<<<<<>>>>>----- 18 | ------<<<<>>>>------ 19 | -------<<<>>>------- 20 | --------<<>>-------- 21 | ===--------------=== 22 | ===---========---=== 23 | ======--------====== 24 | ========----======== 25 | -* * * * ** * * * *- 26 | -*-*-*-*-**-*-*-*-*- 27 | -----*-*-**-*-*----- 28 | -*-*-*-*----*-*-*-*- 29 | ---*-*--------*-*--- 30 | -*-*-*--------*-*-*- 31 | -*-*------------*-*- 32 | >>>>>>>>>--<<<<<<<<< 33 | >>>>>>>------<<<<<<< 34 | >>>>>----------<<<<< 35 | >>>--------------<<< 36 | =====----==----===== 37 | ==--=====--=====--== 38 | ><<--<<<---->>>-->>< 39 | ><<--<<<-<>->>>-->>< 40 | ><<>><<<---->>><<>>< 41 | ><<==<<<====>>>==>>< 42 | ><<--<<<-><->>>-->>< 43 | ><<==<<<=><=>>>==>>< 44 | )))------)(------((( 45 | )))------()------((( 46 | )))))----)(----((((( 47 | )))))----()----((((( 48 | (((------)(------))) 49 | (((------()------))) 50 | (((((----)(----))))) 51 | (((((----()----))))) 52 | #################### 53 | #####==========##### 54 | ####=====##=====#### 55 | ####==#==##==#==#### 56 | ####====####====#### 57 | ####==########==#### 58 | xxxxxxxxxxxxxxxxxxxx 59 | xxxxxxxoxxxxxoxxxxxx 60 | xxxxxOOOxOOxOOOxxxxx 61 | xxxxxOOOxxxxOOOxxxxx 62 | xOOxxOOOxxxxOOOxxOOx 63 | xOOxxOOOxOOxOOOxxOOx 64 | xxxxxOOOOOOOOOOxxxxx 65 | |----++------++----| 66 | |---+---####---+---| 67 | |----++#----#++----| 68 | |-----#-#--#-#-----| 69 | |------######------| 70 | |-------####-------| 71 | |--------^---------| 72 | |-------|||--------| 73 | |------=====-------| 74 | |--------#---------| 75 | |------------------| 76 | -----++------++----- 77 | ----+---####---+---- 78 | -----++#----#++----- 79 | ------#-#--#-#------ 80 | -------######------- 81 | --------####-------- 82 | ---------^---------- 83 | --------|||--------- 84 | -------=====-------- 85 | ---------#---------- 86 | -------------------- 87 | \******************/ 88 | -\****************/- 89 | --\**************/-- 90 | ---\************/--- 91 | ----\**********/---- 92 | -----\********/----- 93 | \**\************/**/ 94 | *\**\**********/**/- 95 | --\**\********/**/-- 96 | ---\**\******/**/--- 97 | ----\**\****/**/---- 98 | -----\**\**/**/----- 99 | \**\**\******/**/**/ 100 | *\**\**\****/**/**/- 101 | --\**\**\**/**/**/-- 102 | ---\**\**\/**/**/--- 103 | \**\**\**\/**/**/**/ 104 | \++++++++++++++++++/ 105 | \++++++++++++++++/- 106 | --\++++++++++++++/-- 107 | ---\++++++++++++/--- 108 | ----\++++++++++/---- 109 | -----\++++++++/----- 110 | \******************/ 111 | *\****************/* 112 | **\**************/** 113 | ***\************/*** 114 | ****\**********/**** 115 | *****\********/***** 116 | \**\************/**/ 117 | *\**\**********/**/* 118 | **\**\********/**/** 119 | ***\**\******/**/*** 120 | ****\**\****/**/**** 121 | *****\**\**/**/***** 122 | \**\**\******/**/**/ 123 | *\**\**\****/**/**/* 124 | **\**\**\**/**/**/** 125 | ***\**\**\/**/**/*** 126 | \**\**\**\/**/**/**/ 127 | \++++++++++++++++++/ 128 | *\++++++++++++++++/* 129 | **\++++++++++++++/** 130 | ***\++++++++++++/*** 131 | ****\++++++++++/**** 132 | *****\++++++++/***** 133 | 00000000000000000000 134 | oooooooooooooooooooo 135 | xxxxxxxxxxxxxxxxxxxx 136 | XXXXXXXXXXXXXXXXXXXX 137 | ;:;:;:;:;:;:;:;:;:;: 138 | :;:;:;:;:;:;:;:;:;:; 139 | VVVVVVVVVVVVVVVVVVVV 140 | vvvvvvvvvvvvvvvvvvvv 141 | VvVvVvVvVvVvVvVvVvVv 142 | vVvVvVvVvVvVvVvVvVvV 143 | xXxXxXxXxXxXxXxXxXxX 144 | XxXxXxXxXxXxXxXxXxXx 145 | ---/-----------\---- 146 | ------\-----/------- 147 | ----\---------/----- 148 | |========|++++++++++ 149 | |========|+|=======| 150 | | | | |=| X | 151 | | [] |+| [=] | 152 | ++/---\++__/===\++++ 153 | +/ _ \/ / _ \+++ 154 | / | | \/ | | \++ 155 | UOUOUOUOUOUOUOUOUOUO 156 | OIOIOIOIOIOIOIOIOIOI 157 | IUIUIUIUIUIUIUIUIUIU 158 | OUOUOUOUOUOUOUOUOUOU 159 | IOIOIOIOIOIOIOIOIOIO 160 | UIUIUIUIUIUIUIUIUIUI 161 | IXIXIXIXIXIXIXIXIXIX 162 | XIXIXIXIXIXIXIXIXIXI 163 | XUXUXUXUXUXUXUXUXUXU 164 | UXUXUXUXUXUXUXUXUXUX 165 | XOXOXOXOXOXOXOXOXOXO 166 | xOxOxOxOxOxOxOxOxOxO 167 | OxOxOxOxOxOxOxOxOxOx 168 | UxUxUxUxUxUxUxUxUxUx 169 | IxIxIxIxIxIxIxIxIxIx 170 | xUxUxUxUxUxUxUxUxUxU 171 | xIxIxIxIxIxIxIxIxIxI 172 | :::==============::: 173 | :::==== ==== ====::: 174 | :::=== ====== ===::: 175 | :::==== = = ====::: 176 | :::=== == == ===::: 177 | :::=== == ===::: 178 | :::=== ==== ===::: 179 | :::=== = = ===::: 180 | :::=== ===::: 181 | :::XXXXXXXXXXXXXX::: 182 | :::XXXX XXXX XXXX::: 183 | :::XXX XXXXXX XXX::: 184 | :::XXXX X X XXXX::: 185 | :::XXX XX XX XXX::: 186 | :::XXX XX XXX::: 187 | :::XXX XXXX XXX::: 188 | :::XXX X X XXX::: 189 | :::XXX XXX::: 190 | :::--------------::: 191 | :::---- ---- ----::: 192 | :::--- ------ ---::: 193 | :::---- - - ----::: 194 | :::--- -- -- ---::: 195 | :::--- -- ---::: 196 | :::--- ---- ---::: 197 | :::--- - - ---::: 198 | :::--- ---::: 199 | =====++======++===== 200 | ====+===####===+==== 201 | =====++#====#++===== 202 | ======#=#==#=#====== 203 | =======######======= 204 | ========####======== 205 | III==============III 206 | III==== ==== ====III 207 | III=== ====== ===III 208 | III==== = = ====III 209 | III=== == == ===III 210 | III=== == ===III 211 | III=== ==== ===III 212 | III=== = = ===III 213 | III=== ===III 214 | IIIXXXXXXXXXXXXXXIII 215 | IIIXXXX XXXX XXXXIII 216 | IIIXXX XXXXXX XXXIII 217 | IIIXXXX X X XXXXIII 218 | IIIXXX XX XX XXXIII 219 | IIIXXX XX XXXIII 220 | IIIXXX XXXX XXXIII 221 | IIIXXX X X XXXIII 222 | IIIXXX XXXIII 223 | III--------------III 224 | III---- ---- ----III 225 | III--- ------ ---III 226 | III---- - - ----III 227 | III--- -- -- ---III 228 | III--- -- ---III 229 | III--- ---- ---III 230 | III--- - - ---III 231 | III--- ---III 232 | =III============III= 233 | ==III==========III== 234 | ===III========III=== 235 | ====III======III==== 236 | =====III====III===== 237 | ======III==III====== 238 | =======IIIIII======= 239 | iIIIiiiiiiiiiiiiIIIi 240 | iiIIIiiiiiiiiiiIIIii 241 | iiiIIIiiiiiiiiIIIiii 242 | iiiiIIIiiiiiiIIIiiii 243 | iiiiiIIIiiiiIIIiiiii 244 | iiiiiiIIIiiIIIiiiiii 245 | iiiiiiiIIIIIIiiiiiii 246 | =======# #======== 247 | ======# X #======= 248 | ======# O #======= 249 | ======# ~ #======= 250 | ======# x #======= 251 | ======# = #======= 252 | ======# + #======= 253 | ======# # #======= 254 | ======# - #======= 255 | ======# #======= 256 | {{{{{{{ }}}}}}}} 257 | {}{}{}{}{}{}{}{}{}{} 258 | }{}{}{}{}{}{}{}{}{}{ 259 | }}{{}}{{}}{{}}{{}}{{ 260 | }{{}}{{}}{{}}{{}}{{} 261 | ******************** 262 | * **************** * 263 | ** ************** ** 264 | *** ************ *** 265 | **** ********** **** 266 | ***** ******** ***** 267 | ****** ****** ****** 268 | ******* **** ******* 269 | ******** ** ******** 270 | ********* ********* 271 | * ****** *********** 272 | ** **** ************ 273 | *** ** ************* 274 | **** ************** 275 | *X****************X* 276 | **X**************X** 277 | ***X************X*** 278 | ****X**********X**** 279 | *****X********X***** 280 | ******X******X****** 281 | *******X****X******* 282 | ********X**X******** 283 | *********XX********* 284 | *X******X*********** 285 | **X****X************ 286 | ***X**X************* 287 | ****XX************** 288 | -=----------------=- 289 | --=--------------=-- 290 | ---=------------=--- 291 | ----=----------=---- 292 | -----=--------=----- 293 | ------=------=------ 294 | -------=----=------- 295 | --------=--=-------- 296 | ---------==--------- 297 | -=------=----------- 298 | --=----=------------ 299 | ---=--=------------- 300 | ----==-------------- 301 | *=****************=* 302 | **=**************=** 303 | ***=************=*** 304 | ****=**********=**** 305 | *****=********=***** 306 | ******=******=****** 307 | *******=****=******* 308 | ********=**=******** 309 | *********==********* 310 | *=******=*********** 311 | **=****=************ 312 | ***=**=************* 313 | ****==************** 314 | I#I #I I# I#I 315 | I#I#I I#I#I 316 | I#I#I# #I#I#I 317 | I#I#I#I I#I#I#I 318 | I#I#I#I# #I#I#I#I 319 | I#I#I#I#I I#I#I#I#I 320 | I#I#I#I#I##I#I#I#I#I -------------------------------------------------------------------------------- /resources/forest_of_boars.crt: -------------------------------------------------------------------------------- 1 | ;Forest of Boars 2 | 3 | [stone_idol] 4 | Name=Stone Idol 5 | X=10 6 | Y=28 7 | Life=100/100 8 | Symbol=A 9 | File=stone_idol.qst 10 | Color=100,140,100 11 | Dialog=0 12 | NPC=1 13 | 14 | [elk] 15 | Name=Elk 16 | X=11 17 | Y=15 18 | Life=100/100 19 | Symbol=E 20 | File=elk.qst 21 | Color=200,200,160 22 | Dialog=0 23 | NPC=1 24 | 25 | [well] 26 | Name=Magic Well 27 | X=15 28 | Y=18 29 | Life=100/100 30 | Symbol=U 31 | File=well.qst 32 | Color=160,170,255 33 | Dialog=0 34 | NPC=1 35 | 36 | [58] 37 | Name=Thistle Boar 38 | X=34 39 | Y=22 40 | Life=100/100 41 | Symbol=B 42 | File=defeat:boar_pelt.qst 43 | Color=255,255,255 44 | Dialog=0 45 | NPC=0 46 | 47 | [60] 48 | Name=Thistle Boar 49 | X=42 50 | Y=24 51 | Life=100/100 52 | Symbol=B 53 | File=defeat:boar_pelt.qst 54 | Color=255,255,255 55 | Dialog=0 56 | NPC=0 57 | 58 | [62] 59 | Name=Thistle Boar 60 | X=44 61 | Y=19 62 | Life=100/100 63 | Symbol=B 64 | File=defeat:boar_pelt.qst 65 | Color=255,255,255 66 | Dialog=0 67 | NPC=0 68 | 69 | [64] 70 | Name=Thistle Boar 71 | X=44 72 | Y=27 73 | Life=100/100 74 | Symbol=B 75 | File=defeat:boar_pelt.qst 76 | Color=255,255,255 77 | Dialog=0 78 | NPC=0 79 | 80 | [66] 81 | Name=Thistle Boar 82 | X=40 83 | Y=22 84 | Life=100/100 85 | Symbol=B 86 | File=defeat:boar_pelt.qst 87 | Color=255,255,255 88 | Dialog=0 89 | NPC=0 90 | 91 | [68] 92 | Name=Thistle Boar 93 | X=40 94 | Y=14 95 | Life=100/100 96 | Symbol=B 97 | File=defeat:boar_pelt.qst 98 | Color=255,255,255 99 | Dialog=0 100 | NPC=0 101 | 102 | [70] 103 | Name=Thistle Boar 104 | X=56 105 | Y=19 106 | Life=100/100 107 | Symbol=b 108 | File=defeat:boar_pelt.qst 109 | Color=255,255,255 110 | Dialog=0 111 | NPC=0 112 | 113 | [72] 114 | Name=Thistle Boar 115 | X=52 116 | Y=23 117 | Life=100/100 118 | Symbol=b 119 | File=defeat:boar_pelt.qst 120 | Color=255,255,255 121 | Dialog=0 122 | NPC=0 123 | 124 | [74] 125 | Name=Thistle Boar 126 | X=61 127 | Y=6 128 | Life=100/100 129 | Symbol=b 130 | File=defeat:boar_pelt.qst 131 | Color=255,255,255 132 | Dialog=0 133 | NPC=0 134 | 135 | [76] 136 | Name=Thistle Boar 137 | X=54 138 | Y=3 139 | Life=100/100 140 | Symbol=B 141 | File=defeat:boar_pelt.qst 142 | Color=255,255,255 143 | Dialog=0 144 | NPC=0 145 | 146 | [78] 147 | Name=Thistle Boar 148 | X=16 149 | Y=14 150 | Life=100/100 151 | Symbol=B 152 | File=defeat:boar_pelt.qst 153 | Color=255,255,255 154 | Dialog=0 155 | NPC=0 156 | 157 | [80] 158 | Name=Thistle Boar 159 | X=46 160 | Y=16 161 | Life=100/100 162 | Symbol=b 163 | File=defeat:boar_pelt.qst 164 | Color=255,255,255 165 | Dialog=0 166 | NPC=0 167 | 168 | [82] 169 | Name=Thistle Boar 170 | X=17 171 | Y=11 172 | Life=100/100 173 | Symbol=b 174 | File=defeat:boar_pelt.qst 175 | Color=255,255,255 176 | Dialog=0 177 | NPC=0 178 | 179 | [84] 180 | Name=Thistle Boar 181 | X=50 182 | Y=31 183 | Life=100/100 184 | Symbol=b 185 | File=defeat:boar_pelt.qst 186 | Color=255,255,255 187 | Dialog=0 188 | NPC=0 189 | 190 | [86] 191 | Name=Thistle Boar 192 | X=42 193 | Y=36 194 | Life=100/100 195 | Symbol=b 196 | File=defeat:boar_pelt.qst 197 | Color=255,255,255 198 | Dialog=0 199 | NPC=0 200 | 201 | [88] 202 | Name=Thistle Boar 203 | X=52 204 | Y=12 205 | Life=100/100 206 | Symbol=B 207 | File=defeat:boar_pelt.qst 208 | Color=255,255,255 209 | Dialog=0 210 | NPC=0 211 | 212 | [90] 213 | Name=Thistle Boar 214 | X=57 215 | Y=14 216 | Life=100/100 217 | Symbol=B 218 | File=defeat:boar_pelt.qst 219 | Color=255,255,255 220 | Dialog=0 221 | NPC=0 222 | -------------------------------------------------------------------------------- /resources/forest_of_boars.itm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/forest_of_boars.itm -------------------------------------------------------------------------------- /resources/forest_of_boars.map: -------------------------------------------------------------------------------- 1 | ; forest_of_boars.map 2 | [0] 3 | //////////////////////////////////////////////------0222222222222222222222222222 4 | /////////////////////////////////////////////////---0022222222222222222222222222 5 | /////////////////////////////////////////////////---0000222222222222222222222222 6 | //////////////////////////////////////////////////---000000002222222222222222222 7 | /////////////////////////////////////////////////////-------00000000002222222222 8 | ////////////////////////////////////////////////////////-------------00000222222 9 | ///////////////////////////////////////////////////////////////----------0002222 10 | ////////////////////////////////////////////////////////////////--/---/----00002 11 | ////////////////////////////////////>>>(<(<((((((<<<<<<((((C>(<((<((<(<<<<((<(((D(((((((((<<<<<<((<((C(((<<((<<((>>>((((EEEEECC((<<< 47 | (<(((<(((<<<<(>((((((((((((((((((((;(((((<<((((((((((((((((C(((>((<((((((((;((((((((((((((((((((((((((((((CC(C(C(((((((((((((((<(((<<<(( 60 | <<(<>>>>><<((((((((((((((((((;(((((<>>>(((((((((((CC((C(((<(((((((((((<((CC<(<(( 61 | <<<((<(((<((<((((((((((((((((((((<((>>>>((((((((C(C(((C(((((((((((((CCCC(>(((((DA((<((=CCC((<(((((((CC(((((C(((<((( 63 | <<<((>(((((((((((?((((<<((<((<>((AAA((((((((((((((((((C(((((((<(((( 74 | <<<(((((>>>(<<(((((<(<<>(<(((AAA<((<<((((C(<<(>(((<>((((<(((((<<<<(<(C<(CCC<<<((<(<(((<(( 76 | ((<((((((>>>><((<((C(==((((((<>(>((==((((((DDDD((((((CCC<<<((((((<((((((((((((<(((((((((D<(<(<<<((((<<( 53 | ((((((>(((((((((((((((DD(((((((C(<<<<<(((((<(((<<<<((((<<(((((DDD(((((<((((((<<< 54 | (((((>((((((((((((((((D((((((((((=((<<<(((((<<<<<<<((((<<<((((((DDDD((<<<(((<<<< 55 | ((((((((((((((((((((((>((((((;((==(<(<(<(<((((<(<(((((<(<((((((DDD((((((<(<<<<<< 56 | (((((((((<(((((((((((((((((((((====(<<((<(((((((((((((<<(;((((D(((((((((<(((<<<< 57 | ((((((((<(<(((((((((((((((((((?(===((<<<((((((((((<<<<<<<<(((((((((((((<((((<<<< 58 | (((((((((<((((((((((((((((((((((===<(<<<<((((A((((<<<(<<<<<(((((((D((((<((<<<<<< 59 | (((((<<<<(((((((((((((D((((((((<=<<<((<<(<;((((<(((<<<<((<<(((((((((((((((((<<<< 60 | (((((<<(<<<<<((((((((((((((((((=<<<<(((<<<((((<<<(<<<(<<(((((((((((((((((((((((< 61 | (((((<<(<<<<((((((((((((((((((((((<(((((((;((<<<<<<<(<<<(((((((((<<((((((((((((< 62 | A(((((<<<<(((((((((((((((((((((((((((((((((((/<<<<((((<(((((((B((<<<((((((((((<< 63 | ((((((((((<<(((((((((((((((A((((((((AE((((((E((<((<(<(((((((((((((<<<((((((((((( 64 | (A(((((((((<<<(((((((((((((((((((((((;(((((((((<(((<<<<<(((((((((((<<<(((((((((( 65 | A(A((((((((<(<((((((((((((((((((((((((((((<((((((((==<<((((((((A(((<<<(((((((((( 66 | (((((((((((<<<((((((((((((((((((((((((= 77 | <A((A(((((((((((((((((==(((((((((((((((;((((<(<<<;;;<((<<<<<<<<<<< 80 | (AAA(@@@@((@AAA>>>((AA((AAAAA(((((((=((((;(((((((((((((((<(<(<<;<<<<<<<((<<<<<<< 81 | ((AA((AA@@@@(AAA(>>>(AA((DAA(((((((=(((((((((((;((((((((((;;;<<<<<<<<(<<(<((<<(< 82 | (AAAAAAAAA(AAAA(>>>>>>>>>AAAAA<<<<((<<<<<<<<(<(<(<<<<<<<<< 84 | -------------------------------------------------------------------------------- /resources/orc_dar_gul.qst: -------------------------------------------------------------------------------- 1 | :0 2 | pln Приветствую! После недавнего нападения нежити мы кое-как привели себя в порядок. Но я не досчитался нескольких ящиков с припасами. А это сильно бьет по моей репутации. Один разведчик мне рассказал, что ящики могли унести в свое логово гноллы, что обитают в кабаньем лесу. Отправляйся к ним и припугни их хорошенько, чтобы они знали, что с Ордой шутки плохи. Реши мою проблему и я не останусь в долгу! 3 | btn close (proc quest10), Я верну припасы 4 | btn close, Я еще вернусь... 5 | end 6 | 7 | :quest10 8 | quest10=1 9 | qlog 10:begin 10 | qlog 10:Гноллы-грабители 11 | qlog 10:Торговец Дар-Гул в орочьем лагере попросил меня поискать ящики с припасами. 12 | qlog 10:Возможно, ящики унесли к себе гноллы, что обитают в кабаньем лесу. 13 | dialog orc_camp:orc_dar_gul:1 14 | end 15 | 16 | :1 17 | pln Приветствую! Ты вернул все ящики с припасами? 18 | if quest10=1 then 19 | btn close, Еще нет, но я верну припасы. 20 | endif 21 | if quest10=2 then 22 | btn bonus10, Верно, все припасы на месте! 23 | endif 24 | end 25 | 26 | :bonus10 27 | pln Это хорошая новость. Вот твоя награда. 28 | dialog orc_camp:orc_dar_gul:2 29 | qlog 10:Я вернул все ящики с припасами. 30 | qlog 10:close 31 | inv+ Gold, 75 32 | inv- Crate, 5 33 | exp 11 34 | btn close, Еще увидимся! 35 | end 36 | 37 | :2 38 | pln Приветствую! 39 | ;Проклятые гноллы! Я осмотрел ящики и часть из них была вскрыта. Думаю, мне уже не удасться вернуть все содержимое этих ящиков. Но моя репутация сильно пострадает без ядов, которыми смазывают стрелы наши охотники. Ты готов выполнить еще одно поручение? 40 | btn close, Загляну как я к тебе в другой раз 41 | end 42 | 43 | Пауки, которые обитают в пещерах, вырабатывают сильнейший яд, который как раз нам и нужен. Добудешь мне такого? -------------------------------------------------------------------------------- /resources/orc_leader.qst: -------------------------------------------------------------------------------- 1 | :0 2 | pln Этой ночью твой отец и мой славный брат отправился в вечный поход к Чертогам Ташака. Это печальное известие... Но ты сильный! Ты должен отомстишь за него! Как всегда было в нашем роду... 3 | btn v1, Это плохая новость... 4 | btn v2, Я готов побеждать своих врагов!.. 5 | end 6 | 7 | :v1 8 | pln Мой брат был славный воин. Вместе мы прошли не одно сражение... Что?... Эй! Неужели ты пустил слезу? 9 | btn v2, Нет, вождь! Я - сильный! 10 | btn v3, Как мне жить без него?.. 11 | end 12 | 13 | :v3 14 | pln Оркай! Ты - жалкий червь барахтающийся в тине Сумеречного Залива! Вытри слезы, не пристало воину превращаться в женщину... Воспрянь духом! Отомсти за свой род! За честь и славу! 15 | btn v1, Так и сделаю, вождь! 16 | end 17 | 18 | :v2 19 | pln Ты - часть гордого племени! Ты много лет живешь среди нас и это уже доказывает, что в тебе есть огромная сила. Но ты должен постоянно доказывать это. Всем! По другому нельзя... 20 | btn v4, Как это произошло? 21 | end 22 | 23 | :v4 24 | pln Сложно сказать, не выжил никто. С тех пор, как в Дарос вторгся Мертвый Король, все действия наших шаманов покрыты тайной. Мне известно только, что он искал что-то по поручению Совета. Поговори с нашим Шаманом, возможно тебе он расскажет больше. 25 | btn v5, Я хочу отомстить за его смерть! 26 | end 27 | 28 | :v5 29 | pln И ты сделаешь это! Собирайся в путь. Больше я тебя не держу в лагере. Это испытание для настоящего воина. Победи своих врагов, отомсти за отца! 30 | btn close (dialog orc_camp:orc_leader:1&dialog orc_camp:orc_shaman:1), Так и сделаю, вождь! 31 | end 32 | 33 | :1 34 | pln Рад тебя видеть, воин! Ты уже поговорил с шаманом? 35 | btn close, Я решил визит к нему не откладывать... 36 | end 37 | 38 | :2 39 | pln Приветствую, молодой воин! Ты говорил с шаманом? 40 | btn yes, С шаманом тяжело найти общий язык, ведь так? 41 | end 42 | 43 | :yes 44 | pln Все верно, воин! Наш шаман - та еще штучка. Но не всегда он был таким... Он изменился с тех пор, как погибла его семья. 45 | btn well, Тебе что-то известно о таинственном источнике шаманов? 46 | btn close, Я еще вернусь... 47 | end 48 | 49 | :well 50 | pln Не так чтобы много... Я же не разбираюсь в этих их магических штучках... Но помню, что брат рассказывал о колодце в кабаньем лесу, от которого исходит странное сияние... 51 | btn close, Мне эти знания пригодятся... 52 | end 53 | 54 | :3 55 | pln Здраствуй, воин! Шаман рассказал мне о том, как ты выручил его. Да, видимо не легкое было задание. Но мое еще сложнее будет. Ты готов выполнить поручение? 56 | btn q2, Я выполню любое твое задание! 57 | btn close, В другой раз... 58 | end 59 | 60 | :q2 61 | pln Старый троль Дух Варга ушел на промысел на Равнину Костей. Он рыбак. Срочно доставь ему этот пакет. Он был хорошим другом твоего отца, может что-то знать. Расспроси его. 62 | btn close (proc quest2), Я поговорю с Духом Варга! 63 | btn close, В другой раз... 64 | end 65 | 66 | :quest2 67 | quest2=1 68 | qlog 2:begin 69 | qlog 2:Пакет для рыбака 70 | qlog 2:Где-то на Равнине Костей сейчас рыбачит троль Дух Варга. Нужно найти его и отдать пакет. 71 | dialog orc_camp:orc_leader:4 72 | inv+ Pack 73 | end 74 | 75 | :4 76 | pln Как продвигаются твои поиски? Ты уже нашел Духа Варга? 77 | if quest2=1 then 78 | btn close, Нет, но я ищу его... 79 | endif 80 | if quest2=2 then 81 | btn bonus2, Я отдал пакет. 82 | endif 83 | end 84 | 85 | :bonus2 86 | quest2=3 87 | qlog 2:. 88 | qlog 2:close 89 | 90 | end 91 | -------------------------------------------------------------------------------- /resources/orc_shaman.qst: -------------------------------------------------------------------------------- 1 | :0 2 | pln Приветствую! Что привело тебя ко мне? Сейчас я слишком занят, иди, поговори с вождем. 3 | btn close, Еще встретимся... 4 | end 5 | 6 | :1 7 | pln Приветствую, молодой воин! Что привело тебя в мою обитель? 8 | btn погиб отец, Погиб мой отец! Я жажду отмщения! 9 | btn нужна информация, Я слышал... 10 | btn close, Я загляну к тебе в другой раз... 11 | end 12 | 13 | :погиб отец 14 | pln ...и много славных воинов из нашего клана. Я первый узнал об этом, заглянув в зеленый пруд Крам-Торка. Но что тебе от меня нужно? 15 | btn больше информации, Мне нужно знать больше об их задании! 16 | btn close, Я наверное пойду уже... 17 | end 18 | 19 | :нужна информация 20 | pln Я тебя внимательно слушаю, но времени у нас очень мало! Так что торопись! 21 | btn эликсиры, ...ты умеешь варить целительные зелья? 22 | btn 1, Теперь мне все понятно. 23 | end 24 | 25 | :эликсиры 26 | pln Да, все верно. Все шаманы умеют варить эликсиры. И не только исцеляющие плоть. Не задаром конечно. Если у тебя есть звонкая монета, ты всегда сможешь приобрести парочку-другую... 27 | btn нужна информация, Буду знать. 28 | end 29 | 30 | :больше информации 31 | pln Да кто ты такой!? Я не выдаю тайны первому попавшемуся оборванцу! Убирайся, и будешь жить!.. Не вижу смысла посылать юнца... 32 | btn должен рассказать, Ты должен рассказать! Или... 33 | btn испытание, Ты откроешься только тому, кому веришь? Испытай меня! 34 | end 35 | 36 | :должен рассказать 37 | pln Или что!? Ты - жалкий щенок! УБИРАЙСЯ! Хватит с нас ненужных жертв... Я посвящаю в тайны только достойных! 38 | btn испытание, Тогда испытай меня! Проверим, достоин ли я этой тайны! 39 | end 40 | 41 | :испытание 42 | pln Испытаю тебя! Так и быть. Вчера я отправил своего лучшего ученика к магическому колодцу набрать целебной воды. Но он не вернулся. Все указывает на то, что он погиб. Отправляйся на восток в лес и принеси мне воды из источника! Задание не из легких, так что основательно приготовся. Там очень опасно для юного воина. Посмотрим, насколько ты хорош. 43 | btn close (proc quest1), Я принесу воды из источника! 44 | end 45 | 46 | :quest1 47 | quest1=1 48 | qlog 1:begin 49 | qlog 1:Орочий магический источник 50 | qlog 1:Шаман отправил меня на поиски магического источника. Я должен принести ему сосуд с магической водой. 51 | dialog orc_camp:orc_leader:2 52 | dialog orc_camp:orc_shaman:2 53 | inv+ Crystal Phial 54 | end 55 | 56 | :2 57 | pln Не томи! Как проходит мое испытание? Уже нашел магический колодец? 58 | if quest1=1 then 59 | btn close, Я все еще в поисках... 60 | endif 61 | if quest1=2 then 62 | btn bonus1, Я принес воду из магического колодца! 63 | endif 64 | end 65 | 66 | :bonus1 67 | quest1=3 68 | qlog 1:Шаман остался доволен. Он дал мне за труды три целительных пузырька. Но значит ли это, что он откроет свою тайну? 69 | qlog 1:close 70 | inv- Filled Crystal Phial 71 | inv+ Item,Minor Healing Potion,1,,,!,255,100,100,3,1 72 | pln Много лет мы используем воду из источника для изготовления целительных эликсиров. Рецепт очень сложный и мы его держим в тайне. Другие ингридиенты еще сложнее достать, чем магическую воду. Спасибо тебе за помощь. Вот, возьми себе три эликсира. И пускай Крам-Торк тебя оберегает! 73 | btn close (dialog orc_camp:orc_leader:3&dialog orc_camp:orc_shaman:3), Благодарю! Они мне пригодятся. 74 | end 75 | 76 | :3 77 | pln Приветствую, молодой воин! Удивил ты меня. Удивил сильно. 78 | btn close, Это было легкое задание... 79 | end 80 | 81 | :4 82 | pln Приветствую... воин! Что-то ты не часто ко мне заходишь... 83 | btn взволнован, Мне кажется, или ты взволнован? 84 | btn close, Я вернусь позже. 85 | end 86 | 87 | :взволнован 88 | pln Так и есть! Один из моих учеников вчера открыл магический портал. После такого эксперимента несчастного разорвало на куски. Но из бреши в пространстве в наш мир пришли враждебные создания. Наш отряд разведчиков столкнулся с ними в бою и мне пришлось залечивать их ужасные раны. Портал нужно закрыть любой ценой! 89 | pln Вот, возьми мое магическое кольцо и сделай это! Не теряй ни минуты! 90 | btn close (proc quest3), Я закрою портал! 91 | btn close, Возможно, я закрою портал позже... 92 | end 93 | 94 | :quest3 95 | quest3=1 96 | qlog 3:begin 97 | qlog 3:Портал в другой мир 98 | qlog 3:Один из учеников шамана открыл портал в другое измерение. Шаман просит меня закрыть опасный портал. Для этого он дал мне магическое черное кольцо. 99 | inv+ Black Ring 100 | dialog orc_camp:orc_shaman:5 101 | end 102 | 103 | :5 104 | pln Только не говори мне, что тебе не удалось закрыть портал? 105 | if quest3=1 then 106 | btn close, Я все еще в поисках портала... 107 | endif 108 | if quest3=2 then 109 | btn bonus3, Я использовал твое кольцо и закрыл портал! 110 | endif 111 | end 112 | 113 | :bonus3 114 | quest3=3 115 | qlog 3:Я получил от шамана вознаграждение - двести монет. 116 | qlog 3:close 117 | inv- Black Ring 118 | pln Теперь я буду лучше следить за своими учениками... Вот, держи 200 монет... И... отдай мне кольцо! 119 | btn close (dialog orc_camp:orc_shaman:6), Деньги мне пригодятся. 120 | end 121 | 122 | :6 123 | pln Приветствую, молодой воин! Удивил ты меня. Удивил сильно. 124 | btn close, Это было легкое задание... 125 | end 126 | -------------------------------------------------------------------------------- /resources/orc_tashak_suum.qst: -------------------------------------------------------------------------------- 1 | :0 2 | pln Приветствую! У меня есть к тебе просьба исключительно личного характера. Недавно шаман попросил меня сделать новые сапоги. Для них хорошо подходит шкура диких вепрей. Но я не могу отлучиться в лес поохотиться на кабанов - у меня слишком много работы. Сделай это за меня. Пяти свиных шкурок будет достаточно. 3 | btn w, Кто ты? 4 | btn v, Что я получу взамен? 5 | btn close (proc quest4), Я принесу тебе кожу 6 | btn close, Я еще зайду... 7 | end 8 | 9 | :w 10 | pln Имя мое Ташак-Суум. Я кожевник. Делаю доспехи из кожи. 11 | btn 0, Понятно 12 | end 13 | 14 | :v 15 | pln Я дам тебе по десять золотых монет за каждую свиную шкурку. 16 | btn 0, Хорошо 17 | end 18 | 19 | :quest4 20 | quest4=1 21 | qlog 4:begin 22 | qlog 4:Кожа - кожевнику 23 | qlog 4:Кожевник Ташак-Суум из Лагеря Орков попросил меня поохотиться в лесу на кабанов и принести ему их кожу. 24 | qlog 4:Я должен добыть пять кабаньих шкур. 25 | dialog orc_camp:orc_tashak_suum:1 26 | end 27 | 28 | :1 29 | pln Приветствую! У тебя хорошие новости для меня? Ты принес свиную кожу? 30 | if quest4=1 then 31 | btn close, Нет, но я добуду кожу. 32 | endif 33 | if quest4=2 then 34 | btn bonus4, Вепри мертвы, а их кожа у меня. 35 | endif 36 | end 37 | 38 | :bonus4 39 | pln Теперь я сошью превосходные сапоги для шамана. Вот твоя награда. 40 | dialog orc_camp:orc_tashak_suum:2 41 | qlog 4:Я отдал кожу кожевнику. В награду он дал мне пятьдесят золотых монет - по десять за каждую шкуру. 42 | qlog 4:close 43 | inv+ Gold, 50 44 | inv- Boar Pelt, 5 45 | exp 9 46 | btn close, До встречи! 47 | end 48 | 49 | :2 50 | pln Похоже, ты не так прост, как кажется! 51 | btn close, Всегда рад помочь 52 | end -------------------------------------------------------------------------------- /resources/paper.bmp: -------------------------------------------------------------------------------- 1 | BMv86(x(@8 2 |     3 |       4 |    5 |       6 |   7 |  8 |  9 |  10 |  11 |    12 |      13 |    14 |   15 |   16 |    17 |  18 |  19 |    20 |      21 |  22 |    23 |  24 |        25 |       26 |    27 |  28 |      29 |      30 |  31 | 32 | 33 |   34 | 35 | 36 | 37 |   38 | 39 |   40 | 41 | 42 |   43 |    44 | 45 | 46 | 47 |  48 | 49 | 50 | 51 |  52 |    53 |      54 |       55 |  56 | 57 | 58 | 59 |   60 |  61 |  62 |  63 |   64 | 65 | 66 | 67 |  68 |  69 | 70 | 71 |  72 |  73 |   74 |      75 |   76 | 77 | 78 |    79 | 80 | 81 | 82 |          83 |       84 | 85 |            86 |  87 |  88 |   89 |   90 |    91 |     92 |      93 |     94 |  95 |    96 |     97 |    98 | 99 | 100 |  101 |  102 |  103 | 104 |           105 |            106 |   107 |  108 |     109 | 110 | 111 | 112 |  113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 |     121 |  # 122 |  123 |   124 |   125 |       126 |      127 |  128 |  129 |   130 |  131 | 132 | 133 |   134 |    135 |  #        136 |   137 |       138 |  139 |  140 |  141 |   142 |   143 |  144 | 145 | 146 | 147 |      148 |   149 | 150 |         151 |     152 |  153 |   154 |   155 |     156 |   157 |     158 |    159 |   160 |        161 |  162 | 163 |    164 | 165 | 166 |         167 |   168 |  169 |  170 |  171 | # 172 |  173 |   174 |     175 |  176 |  177 |  178 |  179 |   180 |   181 |       182 |      183 |    184 |  185 |  186 |  187 |  188 |  189 |      190 |   191 |   192 | 193 |  194 |        195 |     196 |   197 |  198 |        199 |     200 |  201 |  202 |   203 |         204 |  205 |   206 |  207 |      208 |    209 |  210 |   211 |     212 | 213 |     214 |  215 |  216 |   217 |      218 |    219 | 220 |   221 |           222 |  223 |  224 |    225 |  226 |  227 |    228 |   229 |  230 | 231 |       232 |  233 |   234 |       235 |   236 |     237 |   238 |   239 |   240 |    241 | 242 |        243 |     244 |  245 |  246 |        247 |       248 |      249 |   250 |  251 |              252 |  253 |  254 |   255 |  256 |  257 |   258 |      259 |  # 260 |     261 | 262 |  263 |    264 |    265 | #   266 | 267 |      268 |    269 |  270 |  271 |   272 |   ## 273 |  274 |  275 |        276 |        277 |    278 |    279 |  280 |   281 |  282 |     283 |       284 |  285 |    286 |   287 |  288 |   289 |    290 |    291 |      292 |  293 |     294 |       295 |    296 |   297 |  298 |  299 |  300 |  301 |    302 |  303 |  304 |    305 |   306 |   307 |     308 |    309 |    310 |    311 |  312 |  313 |  314 |    315 |       316 |         317 |  318 | 319 | 320 |   321 |  322 |    323 |  324 |     325 |   326 |      327 |      328 |           329 |  330 | 331 |   332 |    333 |   334 |     335 |  336 |   337 |    338 |  339 |   340 |   341 |  342 |    343 | 344 | 345 |    346 |    347 | 348 | 349 | 350 |    351 |   352 |   353 |    354 |    355 |  356 | 357 | 358 | 359 |    360 |   361 |  362 |   363 |  364 |   365 |        366 |         367 |         368 | 369 |    370 |  371 |   372 |  373 |   374 |    375 |   376 |      377 |   378 |   379 |  380 |  381 |  382 | 383 |   384 |  385 |  386 |  387 |   388 |     389 |   390 |       391 |  392 |     393 |    394 |           395 |     396 |    397 |  398 |              399 |   400 |     401 |    402 |  403 |  404 |    405 |    406 |  407 |  408 |  409 |     410 |      411 |       412 |  413 |       -------------------------------------------------------------------------------- /resources/plain_of_bones.crt: -------------------------------------------------------------------------------- 1 | ;Plain of Bones 2 | 3 | [portal] 4 | Name=Portal 5 | X=55 6 | Y=7 7 | Life=100/100 8 | Symbol=O 9 | File=portal.qst 10 | Color=20,40,250 11 | Dialog=0 12 | NPC=1 13 | 14 | [troll_warg_spirit] 15 | Name=Дух Варга 16 | X=15 17 | Y=29 18 | Life=100/100 19 | Symbol=T 20 | File=warg_spirit.qst 21 | Color=190,140,150 22 | Dialog=0 23 | NPC=1 24 | 25 | [0] 26 | Name=Вожак Стаи 27 | X=24 28 | Y=8 29 | Life=100/100 30 | Symbol=W 31 | File= 32 | Color=255,255,255 33 | Dialog=0 34 | NPC=0 35 | [1] 36 | Name=Серебристый Волк 37 | X=20 38 | Y=26 39 | Life=100/100 40 | Symbol=W 41 | File= 42 | Color=255,255,255 43 | Dialog=0 44 | NPC=0 45 | [2] 46 | Name=Серый Волк 47 | X=6 48 | Y=14 49 | Life=100/100 50 | Symbol=W 51 | File= 52 | Color=255,255,255 53 | Dialog=0 54 | NPC=0 55 | [3] 56 | Name=Волчица 57 | X=16 58 | Y=19 59 | Life=100/100 60 | Symbol=w 61 | File= 62 | Color=255,255,255 63 | Dialog=0 64 | NPC=0 65 | [4] 66 | Name=Молодой Волк 67 | X=39 68 | Y=32 69 | Life=100/100 70 | Symbol=w 71 | File= 72 | Color=255,255,255 73 | Dialog=0 74 | NPC=0 75 | [5] 76 | Name=Волчица 77 | X=43 78 | Y=11 79 | Life=100/100 80 | Symbol=w 81 | File= 82 | Color=255,255,255 83 | Dialog=0 84 | NPC=0 85 | [6] 86 | Name=Туманная Волчица 87 | X=33 88 | Y=25 89 | Life=100/100 90 | Symbol=W 91 | File= 92 | Color=255,255,255 93 | Dialog=0 94 | NPC=0 95 | [7] 96 | Name=Волчица 97 | X=68 98 | Y=37 99 | Life=100/100 100 | Symbol=w 101 | File= 102 | Color=255,255,255 103 | Dialog=0 104 | NPC=0 105 | [8] 106 | Name=Матерый Волк 107 | X=75 108 | Y=21 109 | Life=100/100 110 | Symbol=w 111 | File= 112 | Color=255,255,255 113 | Dialog=0 114 | NPC=0 115 | [9] 116 | Name=Старая Волчица 117 | X=70 118 | Y=24 119 | Life=100/100 120 | Symbol=W 121 | File= 122 | Color=255,255,255 123 | Dialog=0 124 | NPC=0 125 | [10] 126 | Name=Волк 127 | X=69 128 | Y=22 129 | Life=100/100 130 | Symbol=w 131 | File= 132 | Color=255,255,255 133 | Dialog=0 134 | NPC=0 135 | [11] 136 | Name=Волк 137 | X=66 138 | Y=23 139 | Life=100/100 140 | Symbol=w 141 | File= 142 | Color=255,255,255 143 | Dialog=0 144 | NPC=0 145 | [12] 146 | Name=Старый Волк 147 | X=65 148 | Y=25 149 | Life=100/100 150 | Symbol=W 151 | File= 152 | Color=255,255,255 153 | Dialog=0 154 | NPC=0 155 | [13] 156 | Name=Волченок 157 | X=69 158 | Y=27 159 | Life=100/100 160 | Symbol=w 161 | File= 162 | Color=255,255,255 163 | Dialog=0 164 | NPC=0 165 | [14] 166 | Name=Волченок 167 | X=72 168 | Y=28 169 | Life=100/100 170 | Symbol=w 171 | File= 172 | Color=255,255,255 173 | Dialog=0 174 | NPC=0 175 | -------------------------------------------------------------------------------- /resources/plain_of_bones.itm: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/plain_of_bones.itm -------------------------------------------------------------------------------- /resources/plain_of_bones.map: -------------------------------------------------------------------------------- 1 | ; plain_of_bones.map 2 | [0] 3 | ////////-/////---//--//////////2222222222222222222222222222222222222222222222222 4 | /////////--/--//////////--///--//-----222222222222222222222222222222222222222222 5 | /--/////////--/-///---/////-///000-------------222222222222222222222222222222222 6 | ///////--/////////--////--/-----0//00--///--------222222222222222222222222222222 7 | ////-----///----///----//////////0/0------/------------------2222222222222222222 8 | -///--////-//---///-//-///-///0000--000----/-----------------------2222222222222 9 | --////--//-///---/-----//--///0//--0000---/---------------0-0---------2222222222 10 | //--//////--//////---/-/--/-////0-//0/---/-00--00-00-00-----0--------22222222222 11 | ///////////////-/////--/---/-///--0-0--///----0---0---00---0-------------2222222 12 | ///////-///----/--//----/---//----/---/-//--00000-00-0000000000--000------222222 13 | --//-//-/-/////////-/////-///--/-//---------0000000-----0--0------00------222222 14 | /-//---///-///--//-///-/--2///----/-/--00000---0-/0-0-000-0------0--------222222 15 | -//-/-//////--/-/-/-/////222----4-/-//00---/0/-------00-00------0-----2222222222 16 | ///-//////-----//---///-///-///----//0-/-/---/-------0000------0----222222222222 17 | /////////-0///////////-//--/---/--/-//------/-----/---0000-0-00----22222--222222 18 | //-//-/////////////---//---/--/--00000------/----------0----------2222--------22 19 | --//-//-/-///////--/////---/-////0---/-000--/-----0----00-------22222----------- 20 | --/-//-///---/---//-////-/-//--/------//0////------00--0-0000--2222------------- 21 | --//////-----///---/--///-//--/---0000000---//---/---0--00-0--2222-------------0 22 | -/-//-/-//---//--//////////-//--0000//-0-------------------0---22---------0-0--- 23 | ////-11///--//--//-/-/////-//-------0/00/----0--------------0-------0----0------ 24 | //-11111--/////--/-/////-/--//-----//---//-0--/-------------0--------0----00000- 25 | //1133311-///-/////-/////////------///-//0-////--------------0-0000--0------00-0 26 | 11133333111-/////-////-----------------/---00----0000-0---0---0-0000-0------0000 27 | 13333333331111111--////-/-/////--------/----0--------------------0000--------0-- 28 | 3333333333333311111---//----////////-/-//---000000-00--0--0-----0--00-------0--- 29 | 33311111333333333311--/////////--////-----/00//-----0-------0------0-------0---- 30 | 3111111111133333333111/-------/----//-/----0---0----0--------000-0-00------0---- 31 | 111111111111113333333111//////-//---/--/------0-0--0-0-------0--0-00-0-----K--22 32 | 11-----------111333333111----/---/--///-/-/-/--00--0-00------0-------00-------22 33 | -----//////----111333333311---////--//000000/0------0--0-----00---------------22 34 | -////////--//--1111333333311---------/0-----/------00--0000-0--000-00--------222 35 | /-----/-/-----/---1113333331111------/////////------0---00--0-0-------------2222 36 | -----//-/-----/-----11133333331111---------///-/////-0----0---------------222222 37 | ////--//////---///---1113333333331111----//----/---/-0-----000000000---222222222 38 | -//////-/---------/----11113333333331111---//////////-0---------0000222222222222 39 | --//-//////////////-------111333333333111111----///---00-0--00-00000222222222222 40 | --/-----/------/--////------11111333333333111//////--------------000022222222222 41 | --//-///-----//////////--------11133333333311//////---------22222222222222222222 42 | -----------------//-------------11113333333111//--------222222222222222222222222 43 | [1] 44 | C(CCCCCCCCCC(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 45 | CCCCCCC((C(((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 46 | CCCCCC((((((((((((((((((((((((((((((((((((>>>>>((((((((((((((((((((((((((((((((( 47 | CCC((((((((((((((((((((((((((((((((((((((((>(>>>(((((((((((((((((((((((((((((((( 48 | ((((((((((((((((((((((((((((((((((((((((((((((>>(((((((((((((((((((((((((((((((( 49 | (((((((((((((((((((((CCCCC(((((((((((((((((((((((((((((((((>>>>((((((((((((((((( 50 | (((((((((((((((((((((CCCCCCCCC(((((((((((((((((((((((((((((>>>>(>((((((((((((((( 51 | ((((((((((((((((((((((((((CCCCC((((((((((((((((((((((((((((((((((((((((((((((((( 52 | (((((((((((((((((((((((((((CCCC((((((((((((((((((((((((((((((((((((((((>>((((((( 53 | (((((((((((((((((((((((((CC(C(C(((((((((((((((((((((((((((((((((((((((>>>>(((((( 54 | (((((((((((((((((((((((CCC(C((CCCCC((((((((((((((((((((((((((((((((((>>>>>(((((( 55 | ((((((((((((((((((((((((CCCCCCCCC(C((((((((((((((((((((((((((((((((((((((((((((( 56 | ((((((((((((((((((((((((((((((CCCC(CCC(((((((((((((((((((((((((((((((((((((((((( 57 | ((((((((((((((((((((((((((((((((CC(((CC((((((((((((((((((((((((((((((((((((((((( 58 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 59 | ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>>>>>>>((( 60 | ((((((((((((((((((((((((((((((((CC((((((((((((((((((((((((((((((((((((>(>>(((((( 61 | (((((((((((((((((((((((((((((((CC(((((((((((((((((((((((((((((((((((((>>(((((((( 62 | ((((((((((((((((((((((((((((CCCC(((((((((((((((((((((((((((((((((((((((((((((((( 63 | ((((((((((((((((((((((((((CCCCCC(((((((((((((((((((((((((((((((((((((((((((((((( 64 | ((((((((((((((((((((((((((CCCC(((((((((((((((((((((((((((((((((((((((((((((((((( 65 | (((((((((((((((((((((((((((C(((((((((((((((((((((((((((((((((((((((((((((((((((( 66 | ((((((((((((((((((((((CCCCCCC((((((((((((((((((((((((((((((((((((((((((((((((((( 67 | ((((((((((((((((((((((C(((C(C((((((((((((((((((((((((((((((((((((((((((((((((((( 68 | (((((((((((((((((((((((CCC(C(((((((((((((((((((((((((((((((((((((((((((((((((((( 69 | (((((((((((((((((((((((CCC(C(((((((((((((((((((((((((((((((((((((((((((((((((((> 70 | (((((((((((((((((((((((CC((((((((((((((((((((((((((((((((((((((((((((((((((((>>> 71 | ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>>>> 72 | ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>>(( 73 | ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>>(( 74 | ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>>>((( 75 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( 76 | (((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>(((((((( 77 | ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>(>>(((((((( 78 | CC((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((>>>>>>>((((((((( 79 | CCC(((CC((((((((((((((((((((((((((((((((((((((((((((((((((((>((((((((((((((((((( 80 | (CCCC((CCCC((((((((((((((((((((((((((((((((((((((((((((((>>>>((((((((((((((((((( 81 | CC(C(CC((CCC(((((((((((((((((((((((((((((((((((((((((((>>>>>>((((((((((((((((((( 82 | CC(CCC(CCCCCCCC(((((((((((((((((((((((((((((((((((((((>>>((((((((((((((((((((((( 83 | (CCC(CCCCC((CCC((((((((((((((((((((((((((((((((((((>>>>((((((((((((((((((((((((( 84 | -------------------------------------------------------------------------------- /resources/portal.qst: -------------------------------------------------------------------------------- 1 | :0 2 | proc portal 3 | if quest3=1 then 4 | btn ring, Использовать кольцо шамана! 5 | endif 6 | end 7 | 8 | :ring 9 | quest3=2 10 | dialog plain_of_bones:portal:1 11 | qlog 3:Мне удалось закрыть портал. 12 | pln Ты в точности повторяешь все те манипуляции с кольцом, о которых поведал шаман. Чувствуется легкое покалывание в указательном пальце и кольцо растворяется в воздухе. Проходит какой-то промежуток времени... Внезапная вспышка озаряет небо... Портал перестает существовать. Вместо него к тучам вздымается разноцветный луч. 13 | btn close, Уйти. 14 | end 15 | 16 | :1 17 | pln Ты стоишь у круга камней. Из центра луч света бьет в небо, переливаясь всеми оттенками радуги. 18 | btn close, Уйти. 19 | end 20 | 21 | :portal 22 | pln Ты стоишь у открытого магического портала. Сгустки магии выплескиваются наружу, играя всеми оттенками радуги. Природа этой магии тебе не известна. Как и то, что рвется наружу через портал. 23 | btn close, Отойти от портала. 24 | end 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /resources/russian.black_cave.txt: -------------------------------------------------------------------------------- 1 | Spider=Паук 2 | Gray Spider=Серый Прядильщик -------------------------------------------------------------------------------- /resources/russian.black_cave_pit.txt: -------------------------------------------------------------------------------- 1 | Spider=Паук 2 | Deep Spider=Глубинный Паук 3 | -------------------------------------------------------------------------------- /resources/russian.forest_of_boars.txt: -------------------------------------------------------------------------------- 1 | Stone Idol=Каменный Идол 2 | Magic Well=Магический Источник 3 | Elk=Лось 4 | Thistle Boar=Кабан -------------------------------------------------------------------------------- /resources/russian.intro.txt: -------------------------------------------------------------------------------- 1 | Земля, некогда опоганенная людским родом, стала пристанищем еще одного зла. Мертвый Король со своей армией вошел в Дарос, чтобы покорить эти земли. 2 | Древние драконы пробуждены от тысячелетнего сна. Драконы - опасные и сильные враги. Эльфы, гномы и жалкие людишки спешно покидают свои королевства... 3 | И только вождь небольшого племени зеленокожих решил дать отпор силам Хаоса и спасти Дарос от разрушения. Но для этого ему нужно найти древний артефакт, с помощью которого можно получить огромную силу и власть. Сумеют ли шаманы вовремя найти этот волшебный предмет? Оракулы вопят о конце света... Кто выживет в последние дни? 4 | Обычный молодой парень, которого вождь вызвал к себе в шатер. Он еще не знает, какая судьба его ждет... -------------------------------------------------------------------------------- /resources/russian.names.txt: -------------------------------------------------------------------------------- 1 | Avgu,Leo,Tan,Sho,Penr,Lok,Gron,Lar,Midr=Авгу,Лео,Тан,Шо,Пенр,Лок,Грон,Лар,Мидр 2 | sin,neg,zar,kar,tun,rel,bal,rin,kon=син,нег,зар,кар,тун,рел,бал,рин,кон 3 | or,fin,shog,tal,rod,pin,ol,kan,on=ор,фин,шог,тал,род,пин,ол,кан,он 4 | Had,Rod,Shag,Dor,Lid,Tar,Kreg,Bron,Shung=Хад,Род,Шаг,Дор,Лид,Тар,Крэг,Брон,Шунг 5 | Garum,Turum,Ur,Utak,Udoom,Ud,Urak,Doon,Vuug=Гарум,Турум,Ур,Утак,Удум,Уд,Урак,Дун,Вууг 6 | Kat,Shak,Gir,Bood,Dreg,Din,Grok,Rig,Sadr=Кат,Шак,Гир,Буд,Дрэг,Дин,Грок,Риг,Садр 7 | Blind,Glad,Proud,Sharp-sighted,Powerful,Dancer,Guarding,Thunderous,Night=Слепой,Яростный,Гордый,Зоркий,Могучий,Танцующий,Стерегущий,Громовой,Ночной 8 | Wolfhound,Wood-goblin,Destroyer,Crusher,Pathfinder,Astrologer,Bootes,Caretaker,Befouler=Волкодав,Моховик,Обрушитель,Крушитель,Следопыт,Звездочет,Волопас,Смотритель,Осквернитель 9 | -------------------------------------------------------------------------------- /resources/russian.objects.txt: -------------------------------------------------------------------------------- 1 | None=Пустота -------------------------------------------------------------------------------- /resources/russian.orc_camp.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/russian.orc_camp.txt -------------------------------------------------------------------------------- /resources/russian.plain_of_bones.txt: -------------------------------------------------------------------------------- 1 | Portal=Портал -------------------------------------------------------------------------------- /resources/russian.terrain.txt: -------------------------------------------------------------------------------- 1 | None=Пустота 2 | Dirt=Грязь 3 | Grass=Трава 4 | Willow=Ива 5 | Oak=Дуб 6 | Entrance to dungeon=Вход в подземелье 7 | Out of the dungeon=Выход из подземелья 8 | Stone wall=Каменная стена 9 | Stone floor=Каменный пол 10 | -------------------------------------------------------------------------------- /resources/russian.txt: -------------------------------------------------------------------------------- 1 | Forgotten Saga=Забытая Сага 2 | New game=Новая игра 3 | High scores table=Таблица рекордов 4 | About FS=Об авторах ЗС 5 | Quit=Выход 6 | Continue=Продолжить 7 | Save game=Сохранить игру 8 | Load game=Загрузить игру 9 | Exit game=Завершить 10 | Select race=Выбери расу 11 | Orc=Орк 12 | Troll=Троль 13 | Goblin=Гоблин 14 | What is your name?=Выбери имя героя 15 | Random name=Генерировать 16 | Back to main menu=Вернуться в главное меню 17 | Quest log=Журнал заданий 18 | Honor=Честь 19 | Close=Закрыть 20 | Save=Сохранить 21 | Load=Загрузить 22 | Read=Читать 23 | Back=Назад 24 | Drop=Бросить 25 | %s %s %d level=%s %s %d-го уровня 26 | Exp=Опыт 27 | Life=Жизнь 28 | Mana=Магия 29 | Adrenalin=Адреналин 30 | Honor=Слава 31 | Gold=Золото 32 | Victory!=Победа! 33 | Defeat!=Поражение! 34 | Inventory=Инвентарь 35 | Pickup all items=Поднять все предметы 36 | Items=Предметы 37 | Quest Items=Квестовые Предметы 38 | You pick up a %s.=Ты поднял %s. 39 | You are carrying a too much!=Ты перегружен! 40 | Empty slot=Пустой слот 41 | The new quest is added to the log.=Новое задание добавлено в журнал. 42 | You have completed the quest.=Ты выполнил задание. 43 | I have completed this quest.=Я выполнил это задание. 44 | You walked in location: %s.=Ты вошел в локацию: %s. 45 | You have opened a new territory: %s.=Ты открыл новую территорию: %s. 46 | 47 | Battle Axe=Боевой Топор 48 | Short Spear=Короткое Копье 49 | Bone Sword=Костяной Меч 50 | 51 | Filled Crystal Phial=Наполненный хрустальный фиал 52 | Crystal Phial=Хрустальный фиал 53 | Black Ring=Черное кольцо 54 | Pack=Пакет 55 | Elk Meat=Мясо лося 56 | Boar Pelt=Кожа вепря -------------------------------------------------------------------------------- /resources/russian.world.txt: -------------------------------------------------------------------------------- 1 | Orc Camp=Лагерь Орков 2 | Forest of Boars=Лес Кабанов 3 | Black Cave=Черная Пещера 4 | Pit=Яма 5 | Plain of Bones=Равнина Костей 6 | Far Cave=Дальняя Пещера 7 | -------------------------------------------------------------------------------- /resources/russian.worldeditor.txt: -------------------------------------------------------------------------------- 1 | we 2 | -------------------------------------------------------------------------------- /resources/stone_idol.qst: -------------------------------------------------------------------------------- 1 | :0 2 | if quest8=1 then 3 | btn talk, Говорить с идолом. 4 | endif 5 | pln Ночь. Воют волки и ухают совы. Ты стоишь перед огромным каменным идолом, отдаленно напомиющим дюжего огра. Время безуспешно пыталось уничтожить гранитного монстра и только часть его большого тела покрылась сетью мелких трещин. В некоторых местах из них еще пробиваются лучики энергии, таящейся в каменном истукане. 6 | btn close, Отойти от идола. 7 | end 8 | 9 | :talk 10 | pln Внезапно каменный истукан склоняется над тобой. Лучи энергии начинают танцевать на замшелом камне с еще большей силой. Ты вздагиваешь, услышав речь. 11 | pln - Я тебя слушаю... 12 | btn goblins, Расскажи мне о гоблинах... 13 | btn orcs, Поведай мне об орках... 14 | btn trolls, Что ты знаешь о троллях?.. 15 | btn 0, Это все, что я хотел узнать 16 | end 17 | 18 | :goblins 19 | pln race 20 | btn talk, Понятно 21 | end 22 | 23 | :orcs 24 | pln race 25 | btn talk, Понятно 26 | end 27 | 28 | :trolls 29 | pln race 30 | btn talk, Понятно 31 | end 32 | 33 | :speak 34 | dialog orc_camp:goblin_virn:1 35 | quest8=2 36 | qlog 8:Я нашел забытого каменного идола огров и поговорил с ним. Магический истукан был не слишком разговорчив, но кое-что все же удалось узнать. Нужно побыстрее рассказать гоблину. 37 | qlog 8:update 38 | btn close, ... 39 | end 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /resources/terrain.ini: -------------------------------------------------------------------------------- 1 | [NONE] 2 | Name=None 3 | Symbol=_ 4 | Passable=0 5 | Color=BLACK 6 | Layer=2 7 | 8 | [RES1] 9 | Name=Dummy 10 | Symbol=_ 11 | Passable=0 12 | Color=0,0,0 13 | Layer=3 14 | 15 | [RES2] 16 | Name=Dummy 17 | Symbol=_ 18 | Passable=0 19 | Color=0,0,0 20 | Layer=3 21 | 22 | [RES3] 23 | Name=Dummy 24 | Symbol=_ 25 | Passable=0 26 | Color=0,0,0 27 | Layer=3 28 | 29 | [RES4] 30 | Name=Dummy 31 | Symbol=_ 32 | Passable=0 33 | Color=0,0,0 34 | Layer=3 35 | 36 | [GRAVEL] 37 | Name=Gravel 38 | Symbol=g 39 | Passable=1 40 | Color=90,90,100 41 | Layer=0 42 | 43 | [DIRT] 44 | Name=Dirt 45 | Symbol=. 46 | Passable=1 47 | Color=165,80,0 48 | Layer=0 49 | 50 | [GRASS] 51 | Name=Grass 52 | Symbol=" 53 | Passable=1 54 | Color=0,60,0 55 | Layer=0 56 | 57 | [STONE] 58 | Name=Stone 59 | Symbol=% 60 | Passable=1 61 | Color=200,200,200 62 | Layer=0 63 | 64 | [SAND] 65 | Name=Sand 66 | Symbol=& 67 | Passable=1 68 | Color=255,200,0 69 | Layer=0 70 | 71 | [ROCK] 72 | Name=Rock 73 | Symbol=# 74 | Passable=0 75 | Color=DGRAY 76 | Layer=0 77 | 78 | [WATER] 79 | Name=Water 80 | Symbol== 81 | Passable=1 82 | Color=150,150,250 83 | Layer=0 84 | 85 | [DEEP_WATER] 86 | Name=Deep water 87 | Symbol== 88 | Passable=1 89 | Color=50,100,200 90 | Layer=0 91 | 92 | [LAVA] 93 | Name=Lava 94 | Symbol== 95 | Passable=1 96 | Color=255,0,0 97 | Layer=0 98 | 99 | [RES6] 100 | Name=Dummy 101 | Symbol=_ 102 | Passable=0 103 | Color=0,0,0 104 | Layer=3 105 | 106 | [RES7] 107 | Name=Dummy 108 | Symbol=_ 109 | Passable=0 110 | Color=0,0,0 111 | Layer=3 112 | 113 | [RES8] 114 | Name=Dummy 115 | Symbol=_ 116 | Passable=0 117 | Color=0,0,0 118 | Layer=3 119 | 120 | [RES9] 121 | Name=Dummy 122 | Symbol=_ 123 | Passable=0 124 | Color=0,0,0 125 | Layer=3 126 | 127 | [WILLOW_TREE] 128 | Name=Willow 129 | Symbol=f 130 | Passable=0 131 | Color=100,220,100 132 | Layer=1 133 | 134 | [OAK_TREE] 135 | Name=Oak 136 | Symbol=T 137 | Passable=0 138 | Color=0,120,0 139 | Layer=1 140 | 141 | [ASH_TREE] 142 | Name=Ash 143 | Symbol=t 144 | Passable=0 145 | Color=90,200,90 146 | Layer=1 147 | 148 | [YEW_TREE] 149 | Name=Yew 150 | Symbol=Y 151 | Passable=0 152 | Color=120,170,100 153 | Layer=1 154 | 155 | [BIRCH_TREE] 156 | Name=Birch 157 | Symbol=F 158 | Passable=0 159 | Color=0,250,0 160 | Layer=1 161 | 162 | [ASPEN_TREE] 163 | Name=Aspen 164 | Symbol=V 165 | Passable=0 166 | Color=60,140,10 167 | Layer=1 168 | 169 | [MAPLE_TREE] 170 | Name=Maple 171 | Symbol=T 172 | Passable=0 173 | Color=10,180,20 174 | Layer=1 175 | 176 | [WALNUT_TREE] 177 | Name=Walnut 178 | Symbol=v 179 | Passable=0 180 | Color=0,160,0 181 | Layer=1 182 | 183 | [PINE_TREE] 184 | Name=Pine 185 | Symbol=f 186 | Passable=0 187 | Color=70,200,90 188 | Layer=1 189 | 190 | [CEDAR_TREE] 191 | Name=Cedar 192 | Symbol=F 193 | Passable=0 194 | Color=30,170,80 195 | Layer=1 196 | 197 | [SPRUCE_TREE] 198 | Name=Spruce 199 | Symbol=y 200 | Passable=0 201 | Color=60,210,40 202 | Layer=1 203 | 204 | [RES10] 205 | Name=Dummy 206 | Symbol=_ 207 | Passable=0 208 | Color=0,0,0 209 | Layer=3 210 | 211 | [RES11] 212 | Name=Dummy 213 | Symbol=_ 214 | Passable=0 215 | Color=0,0,0 216 | Layer=3 217 | 218 | [RES12] 219 | Name=Dummy 220 | Symbol=_ 221 | Passable=0 222 | Color=0,0,0 223 | Layer=3 224 | 225 | [RES13] 226 | Name=Dummy 227 | Symbol=_ 228 | Passable=0 229 | Color=0,0,0 230 | Layer=3 231 | 232 | [RES14] 233 | Name=Dummy 234 | Symbol=_ 235 | Passable=0 236 | Color=0,0,0 237 | Layer=3 238 | 239 | [RES15] 240 | Name=Dummy 241 | Symbol=_ 242 | Passable=0 243 | Color=0,0,0 244 | Layer=3 245 | 246 | [STAIRS_UP] 247 | Name=Out of the dungeon 248 | Symbol=< 249 | Passable=1 250 | Color=200,200,200 251 | Layer=0 252 | 253 | [STAIRS_DOWN] 254 | Name=Entrance to dungeon 255 | Symbol=> 256 | Passable=1 257 | Color=200,200,200 258 | Layer=0 259 | 260 | [RES16] 261 | Name=Dummy 262 | Symbol=_ 263 | Passable=0 264 | Color=0,0,0 265 | Layer=3 266 | 267 | [RES17] 268 | Name=Dummy 269 | Symbol=_ 270 | Passable=0 271 | Color=0,0,0 272 | Layer=3 273 | 274 | [RES18] 275 | Name=Dummy 276 | Symbol=_ 277 | Passable=0 278 | Color=0,0,0 279 | Layer=3 280 | 281 | [RES19] 282 | Name=Dummy 283 | Symbol=_ 284 | Passable=0 285 | Color=0,0,0 286 | Layer=3 287 | 288 | [RES20] 289 | Name=Dummy 290 | Symbol=_ 291 | Passable=0 292 | Color=0,0,0 293 | Layer=3 294 | 295 | [STONE_FLOOR] 296 | Name=Stone floor 297 | Symbol=% 298 | Passable=1 299 | Color=100,100,100 300 | Layer=0 301 | 302 | [STONE_WALL] 303 | Name=Stone wall 304 | Symbol=# 305 | Passable=0 306 | Color=220,220,220 307 | Layer=0 308 | 309 | [CLOSED_DOOR] 310 | Name=Closed door 311 | Symbol=+ 312 | Passable=0 313 | Color=200,160,100 314 | Layer=1 315 | 316 | [OPENED_DOOR] 317 | Name=Opened door 318 | Symbol=- 319 | Passable=1 320 | Color=200,160,100 321 | Layer=1 322 | 323 | [CLOSED_GATE] 324 | Name=Closed gate 325 | Symbol=# 326 | Passable=0 327 | Color=200,100,200 328 | Layer=1 329 | 330 | [OPENED_GATE] 331 | Name=Opened gate 332 | Symbol=/ 333 | Passable=1 334 | Color=200,100,200 335 | Layer=1 336 | 337 | [CLOSED_LIUK] 338 | Name=Closed liuk 339 | Symbol=* 340 | Passable=0 341 | Color=100,100,200 342 | Layer=1 343 | 344 | [RES21] 345 | Name=Dummy 346 | Symbol=_ 347 | Passable=0 348 | Color=0,0,0 349 | Layer=3 350 | 351 | [RES22] 352 | Name=Dummy 353 | Symbol=_ 354 | Passable=0 355 | Color=0,0,0 356 | Layer=3 357 | 358 | [RES23] 359 | Name=Dummy 360 | Symbol=_ 361 | Passable=0 362 | Color=0,0,0 363 | Layer=3 364 | 365 | [RES24] 366 | Name=Dummy 367 | Symbol=_ 368 | Passable=0 369 | Color=0,0,0 370 | Layer=3 371 | 372 | [RES25] 373 | Name=Dummy 374 | Symbol=_ 375 | Passable=0 376 | Color=0,0,0 377 | Layer=3 378 | 379 | [ROAD] 380 | Name=Road 381 | Symbol=: 382 | Passable=1 383 | Color=120,40,0 384 | Layer=0 385 | 386 | [RES26] 387 | Name=Dummy 388 | Symbol=_ 389 | Passable=0 390 | Color=0,0,0 391 | Layer=3 392 | 393 | [RES27] 394 | Name=Dummy 395 | Symbol=_ 396 | Passable=0 397 | Color=0,0,0 398 | Layer=3 399 | 400 | [RES28] 401 | Name=Dummy 402 | Symbol=_ 403 | Passable=0 404 | Color=0,0,0 405 | Layer=3 406 | 407 | [RES29] 408 | Name=Dummy 409 | Symbol=_ 410 | Passable=0 411 | Color=0,0,0 412 | Layer=3 413 | 414 | [RES30] 415 | Name=Dummy 416 | Symbol=_ 417 | Passable=0 418 | Color=0,0,0 419 | Layer=3 420 | 421 | 422 | -------------------------------------------------------------------------------- /resources/test_door.qst: -------------------------------------------------------------------------------- 1 | :0 2 | p=5 3 | box p 4 | end -------------------------------------------------------------------------------- /resources/vl.bmp: -------------------------------------------------------------------------------- 1 | BM66(@  &D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 2 | 4&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 3 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 &D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 4 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 &D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 5 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 *L'&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 6 | 4&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 7 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 &D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 8 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 &D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 9 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 *L'&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 10 | 4,E< 5 J&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 11 | 4&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 12 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 &D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 13 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 &D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 14 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 *L'&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 15 | 4,E< 5 JDC$"J 3?C?Fm,S?B 1 *L'&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 16 | 4,E< 5 JDC$"J 3?C?Fm,S?&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P+8@ 721A<!M 6//5H :;<='+! '%62 &, $5791N3PKi.LGe5S5V6W)J; .&IBC3Z%L: 17 | 4,E< 5 JDC$"J 3?C?Fm,S?&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P&D >#A70P?^?^/N:Y1N%!<Fa-F4O'C =%E<\1S#H99'P -------------------------------------------------------------------------------- /resources/warg_spirit.qst: -------------------------------------------------------------------------------- 1 | :0 2 | pln ... 3 | btn close, ... 4 | end 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /resources/well.qst: -------------------------------------------------------------------------------- 1 | :0 2 | proc well 3 | if quest1=1 then 4 | btn close (proc water), Набрать воды из источника. 5 | endif 6 | end 7 | 8 | :water 9 | dialog forest_of_boars:well:1 10 | quest1=2 11 | qlog 1:Я нашел источник и набрал воды из него. Нужно побыстрее отнести ее шаману. 12 | inv- Crystal Phial 13 | inv+ Filled Crystal Phial 14 | end 15 | 16 | :1 17 | proc well 18 | end 19 | 20 | :well 21 | pln Ты стоишь у магического источника и смотришь на водную гладь. Вода кристально чистая. Со дна к поверхности всплывают мелкие пузыри. 22 | btn close, Отойти от источника. 23 | end 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /resources/witch.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/resources/witch.bmp -------------------------------------------------------------------------------- /resources/world.ini: -------------------------------------------------------------------------------- 1 | [orc_camp] 2 | Name=Orc Camp 3 | Level=0 4 | Left=forest_of_boars 5 | Up= 6 | Right=plain_of_bones 7 | Down= 8 | Top= 9 | Bottom= 10 | 11 | [forest_of_boars] 12 | Name=Forest of Boars 13 | Level=1 14 | Left= 15 | Up= 16 | Right=orc_camp 17 | Down= 18 | Top= 19 | Bottom=black_cave 20 | 21 | [black_cave] 22 | Name=Black Cave 23 | Level=2 24 | Left= 25 | Up= 26 | Right= 27 | Down= 28 | Top=forest_of_boars 29 | Bottom=black_cave_pit 30 | 31 | [black_cave_pit] 32 | Name=Pit 33 | Level=3 34 | Left= 35 | Up= 36 | Right= 37 | Down= 38 | Top=black_cave 39 | Bottom= 40 | 41 | [plain_of_bones] 42 | Name=Plain of Bones 43 | Level=1 44 | Left=orc_camp 45 | Up= 46 | Right= 47 | Down= 48 | Top= 49 | Bottom=far_cave 50 | 51 | [far_cave] 52 | Name=Far Cave 53 | Level=2 54 | Left= 55 | Up= 56 | Right= 57 | Down= 58 | Top=plain_of_bones 59 | Bottom= 60 | 61 | 62 | -------------------------------------------------------------------------------- /sources/bearengine/Engine.pas: -------------------------------------------------------------------------------- 1 | unit Engine; 2 | 3 | interface 4 | 5 | uses 6 | Types; 7 | 8 | {$REGION ' Keyboard scancodes '} 9 | 10 | const 11 | TK_A = $04; 12 | TK_B = $05; 13 | TK_C = $06; 14 | TK_D = $07; 15 | TK_E = $08; 16 | TK_F = $09; 17 | TK_G = $0A; 18 | TK_H = $0B; 19 | TK_I = $0C; 20 | TK_J = $0D; 21 | TK_K = $0E; 22 | TK_L = $0F; 23 | TK_M = $10; 24 | TK_N = $11; 25 | TK_O = $12; 26 | TK_P = $13; 27 | TK_Q = $14; 28 | TK_R = $15; 29 | TK_S = $16; 30 | TK_T = $17; 31 | TK_U = $18; 32 | TK_V = $19; 33 | TK_W = $1A; 34 | TK_X = $1B; 35 | TK_Y = $1C; 36 | TK_Z = $1D; 37 | TK_1 = $1E; 38 | TK_2 = $1F; 39 | TK_3 = $20; 40 | TK_4 = $21; 41 | TK_5 = $22; 42 | TK_6 = $23; 43 | TK_7 = $24; 44 | TK_8 = $25; 45 | TK_9 = $26; 46 | TK_0 = $27; 47 | TK_RETURN = $28; 48 | TK_ENTER = $28; 49 | TK_ESCAPE = $29; 50 | TK_BACKSPACE = $2A; 51 | TK_TAB = $2B; 52 | TK_SPACE = $2C; 53 | TK_MINUS = $2D; 54 | TK_EQUALS = $2E; 55 | TK_LBRACKET = $2F; 56 | TK_RBRACKET = $30; 57 | TK_BACKSLASH = $31; 58 | TK_SEMICOLON = $33; 59 | TK_APOSTROPHE = $34; 60 | TK_GRAVE = $35; 61 | TK_COMMA = $36; 62 | TK_PERIOD = $37; 63 | TK_SLASH = $38; 64 | TK_F1 = $3A; 65 | TK_F2 = $3B; 66 | TK_F3 = $3C; 67 | TK_F4 = $3D; 68 | TK_F5 = $3E; 69 | TK_F6 = $3F; 70 | TK_F7 = $40; 71 | TK_F8 = $41; 72 | TK_F9 = $42; 73 | TK_F10 = $43; 74 | TK_F11 = $44; 75 | TK_F12 = $45; 76 | TK_PAUSE = $48; 77 | TK_INSERT = $49; 78 | TK_HOME = $4A; 79 | TK_PAGEUP = $4B; 80 | TK_DELETE = $4C; 81 | TK_END = $4D; 82 | TK_PAGEDOWN = $4E; 83 | TK_RIGHT = $4F; 84 | TK_LEFT = $50; 85 | TK_DOWN = $51; 86 | TK_UP = $52; 87 | TK_KP_DIVIDE = $54; 88 | TK_KP_MULTIPLY = $55; 89 | TK_KP_MINUS = $56; 90 | TK_KP_PLUS = $57; 91 | TK_KP_ENTER = $58; 92 | TK_KP_1 = $59; 93 | TK_KP_2 = $5A; 94 | TK_KP_3 = $5B; 95 | TK_KP_4 = $5C; 96 | TK_KP_5 = $5D; 97 | TK_KP_6 = $5E; 98 | TK_KP_7 = $5F; 99 | TK_KP_8 = $60; 100 | TK_KP_9 = $61; 101 | TK_KP_0 = $62; 102 | TK_KP_PERIOD = $63; 103 | TK_SHIFT = $70; 104 | TK_CONTROL = $71; 105 | TK_ALT = $72; 106 | 107 | {$ENDREGION ' Keyboard scancodes '} 108 | {$REGION ' TEngine '} 109 | 110 | type 111 | TEngine = class(TObject) 112 | public const 113 | clClear = -1; 114 | kcBegin = '{'; 115 | kcEnd = '}'; 116 | public type 117 | TAlign = (aLeft, aCenter, aRight); 118 | public type 119 | TSize = record 120 | Width: Integer; 121 | Height: Integer; 122 | end; 123 | strict private 124 | FWindow: TSize; 125 | FChar: TSize; 126 | public 127 | procedure Clear; 128 | constructor Create(AWidth, AHeight: Integer); 129 | destructor Destroy; override; 130 | procedure Print(X, Y: Integer; S: string; Align: TAlign = aLeft; AdvWidth: Byte = 0); overload; 131 | function Print(S: string; R: TRect): Types.TSize; overload; 132 | procedure ForegroundColor(Color: Integer); 133 | procedure BackgroundColor(Color: Integer); 134 | function LightColor(Color: Integer; Percent: Byte): Integer; 135 | function DarkColor(Color: Integer; Percent: Byte): Integer; 136 | function GetColor(Color: Integer): Cardinal; 137 | property Window: TSize read FWindow write FWindow; 138 | property Char: TSize read FChar write FChar; 139 | class function GetTextLength(Text: string): Integer; 140 | function GetVersion: string; 141 | procedure Close; 142 | end; 143 | 144 | {$ENDREGION ' TEngine '} 145 | 146 | implementation 147 | 148 | uses 149 | BearLibTerminal, 150 | {$IFNDEF FPC} 151 | Windows, 152 | {$ELSE} 153 | LCLIntf, LCLType, LazUTF8, 154 | {$ENDIF} 155 | Classes, SysUtils; 156 | 157 | {$REGION ' TEngine '} 158 | 159 | constructor TEngine.Create(AWidth, AHeight: Integer); 160 | begin 161 | Randomize; 162 | FWindow.Width := AWidth; 163 | FWindow.Height := AHeight; 164 | terminal_set(Format('window: size=%dx%d, icon=%s', [AWidth, AHeight, 165 | 'resources\icon.ico'])); 166 | FChar.Width := terminal_state(TK_CELL_WIDTH); 167 | FChar.Height := terminal_state(TK_CELL_HEIGHT); 168 | end; 169 | 170 | destructor TEngine.Destroy; 171 | begin 172 | inherited; 173 | end; 174 | 175 | procedure TEngine.ForegroundColor(Color: Integer); 176 | begin 177 | terminal_color(GetColor(Color)); 178 | end; 179 | 180 | procedure TEngine.BackgroundColor(Color: Integer); 181 | begin 182 | case Color of 183 | clClear: 184 | terminal_bkcolor(0); 185 | else 186 | terminal_bkcolor(GetColor(Color)); 187 | end; 188 | end; 189 | 190 | procedure TEngine.Clear; 191 | begin 192 | terminal_clear(); 193 | end; 194 | 195 | procedure TEngine.Close; 196 | begin 197 | terminal_close(); 198 | end; 199 | 200 | procedure TEngine.Print(X, Y: Integer; S: string; Align: TAlign = aLeft; AdvWidth: Byte = 0); 201 | var 202 | W: Integer; 203 | begin 204 | case Align of 205 | aLeft: 206 | terminal_print(X, Y, S); 207 | aCenter: 208 | begin 209 | if (AdvWidth > 0) then W := AdvWidth else W := Window.Width; 210 | terminal_print((W div 2) - (GetTextLength(S) div 2), Y, S); 211 | end; 212 | aRight: 213 | terminal_print(Window.Width - GetTextLength(S), Y, S); 214 | end; 215 | end; 216 | 217 | function TEngine.Print(S: string; R: TRect): Types.TSize; 218 | begin 219 | Result := terminal_print(R.Left, R.Top, R.Right, R.Bottom, TK_ALIGN_LEFT, S); 220 | end; 221 | 222 | function TEngine.GetVersion: string; 223 | begin 224 | Result := terminal_get('version'); 225 | end; 226 | 227 | function TEngine.DarkColor(Color: Integer; Percent: Byte): Integer; 228 | var 229 | R, G, B: Byte; 230 | C: Integer; 231 | begin 232 | if Color < 0 then 233 | C := GetSysColor(Color and $000000FF) 234 | else 235 | C := Color; 236 | R := GetRValue(C); 237 | G := GetGValue(C); 238 | B := GetBValue(C); 239 | R := R - MulDiv(R, Percent, 100); 240 | G := G - MulDiv(G, Percent, 100); 241 | B := B - MulDiv(B, Percent, 100); 242 | Result := RGB(R, G, B); 243 | end; 244 | 245 | function TEngine.LightColor(Color: Integer; Percent: Byte): Integer; 246 | var 247 | R, G, B: Byte; 248 | C: Integer; 249 | begin 250 | if Color < 0 then 251 | C := GetSysColor(Color and $000000FF) 252 | else 253 | C := Color; 254 | R := GetRValue(C); 255 | G := GetGValue(C); 256 | B := GetBValue(C); 257 | R := R + MulDiv(255 - R, Percent, 100); 258 | G := G + MulDiv(255 - G, Percent, 100); 259 | B := B + MulDiv(255 - B, Percent, 100); 260 | Result := RGB(R, G, B); 261 | end; 262 | 263 | function TEngine.GetColor(Color: Integer): Cardinal; 264 | begin 265 | Result := color_from_argb($FF, Byte(Color), Byte(Color shr 8), Byte(Color shr 16)); 266 | end; 267 | 268 | class function TEngine.GetTextLength(Text: string): Integer; 269 | begin 270 | {$IFNDEF FPC} 271 | Result := Length(Text); 272 | {$ELSE} 273 | Result := UTF8Length(Text); 274 | {$ENDIF} 275 | end; 276 | 277 | {$ENDREGION ' TEngine '} 278 | 279 | end. 280 | -------------------------------------------------------------------------------- /sources/bearengine/ForgottenSaga.dpr: -------------------------------------------------------------------------------- 1 | {%ToDo 'ForgottenSaga.todo'} 2 | 3 | program ForgottenSaga; 4 | 5 | uses 6 | SysUtils, 7 | Engine in 'Engine.pas', 8 | BearLibItems in '..\includes\BearLibItems.pas', 9 | BearLibTerminal in '..\includes\BearLibTerminal.pas', 10 | ForgottenSaga.Classes in '..\ForgottenSaga.Classes.pas', 11 | ForgottenSaga.Entities in '..\ForgottenSaga.Entities.pas', 12 | ForgottenSaga.Scenes in '..\ForgottenSaga.Scenes.pas'; 13 | 14 | var 15 | Key: Word = 0; 16 | IsRender: Boolean = True; 17 | 18 | begin 19 | terminal_open(); 20 | Saga := TSaga.Create(TMap.Size.Width + TUI.PanelWidth, TMap.Size.Height); 21 | try 22 | Saga.Refresh; 23 | terminal_set(Format('window.title=%s', ['Forgotten Saga'])); 24 | Saga.Stages.Render; 25 | terminal_refresh(); 26 | repeat 27 | if IsRender then Saga.Stages.Render; 28 | Key := 0; 29 | if terminal_has_input() then 30 | begin 31 | Key := terminal_read(); 32 | Saga.Stages.Update(Key); 33 | IsRender := True; 34 | Continue; 35 | end; 36 | if (Saga.Notification.Tick > 99) then 37 | begin 38 | Saga.Stages.Timer; 39 | Saga.Notification.Tick := 0; 40 | IsRender := True; 41 | Continue; 42 | end; 43 | if IsRender then terminal_refresh(); 44 | Saga.Notification.Tick := Saga.Notification.Tick + 1; 45 | terminal_delay(10); 46 | IsRender := False; 47 | until (Key = TK_CLOSE); 48 | terminal_close(); 49 | finally 50 | Saga.Free; 51 | end; 52 | 53 | end. 54 | -------------------------------------------------------------------------------- /sources/bearengine/ForgottenSaga.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {79BFAD2D-6092-4FCC-AFEB-6FB0E1090EB7} 4 | ForgottenSaga.dpr 5 | True 6 | Debug 7 | 1 8 | Application 9 | VCL 10 | 18.3 11 | Win32 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Cfg_2 34 | true 35 | true 36 | 37 | 38 | false 39 | 00400000 40 | false 41 | false 42 | true 43 | 1049 44 | false 45 | false 46 | Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;FMXTee;$(DCC_Namespace) 47 | CompanyName=;FileDescription=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0;Comments=;CFBundleName=;CFBundleDisplayName=;UIDeviceFamily=;CFBundleIdentifier=;CFBundleVersion=;CFBundlePackageType=;CFBundleSignature=;CFBundleAllowMixedLocalizations=;UISupportedInterfaceOrientations=;CFBundleExecutable=;CFBundleResourceSpecification=;LSRequiresIPhoneOS=;CFBundleInfoDictionaryVersion=;CFBundleDevelopmentRegion=;package=;label=;versionCode=;versionName=;persistent=;restoreAnyVersion=;installLocation=;largeHeap=;theme= 48 | ForgottenSaga 49 | 50 | 51 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 52 | true 53 | $(BDS)\bin\default_app.manifest 54 | 1033 55 | CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 56 | true 57 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 58 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 59 | 60 | 61 | 0 62 | 0 63 | false 64 | RELEASE;$(DCC_Define) 65 | 66 | 67 | DEBUG;$(DCC_Define) 68 | false 69 | true 70 | 71 | 72 | -w 73 | 0 74 | ..\..\ 75 | true 76 | 1033 77 | CompanyName=;FileVersion=0.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName) 78 | Debug 79 | 80 | 81 | 82 | MainSource 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | Cfg_2 92 | Base 93 | 94 | 95 | Base 96 | 97 | 98 | Cfg_1 99 | Base 100 | 101 | 102 | 103 | Delphi.Personality.12 104 | 105 | 106 | 107 | 108 | ForgottenSaga.dpr 109 | 110 | 111 | False 112 | False 113 | 1 114 | 0 115 | 0 116 | 0 117 | False 118 | False 119 | False 120 | False 121 | False 122 | 1049 123 | 1251 124 | 125 | 126 | 127 | 128 | 1.0.0.0 129 | 130 | 131 | 132 | 133 | 134 | 1.0.0.0 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | Microsoft Office 2000 Sample Automation Server Wrapper Components 162 | Microsoft Office XP Sample Automation Server Wrapper Components 163 | 164 | 165 | 166 | True 167 | 168 | False 169 | 170 | 12 171 | 172 | 173 | 174 | 175 | -------------------------------------------------------------------------------- /sources/bearengine/ForgottenSaga.lpi: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | <UseAppBundle Value="False"/> 15 | <ResourceType Value="res"/> 16 | </General> 17 | <i18n> 18 | <EnableI18N LFM="False"/> 19 | </i18n> 20 | <VersionInfo> 21 | <StringTable ProductVersion=""/> 22 | </VersionInfo> 23 | <BuildModes Count="1"> 24 | <Item1 Name="Default" Default="True"/> 25 | </BuildModes> 26 | <PublishOptions> 27 | <Version Value="2"/> 28 | </PublishOptions> 29 | <RunParams> 30 | <local> 31 | <FormatVersion Value="1"/> 32 | </local> 33 | </RunParams> 34 | <RequiredPackages Count="1"> 35 | <Item1> 36 | <PackageName Value="LCL"/> 37 | </Item1> 38 | </RequiredPackages> 39 | <Units Count="1"> 40 | <Unit0> 41 | <Filename Value="ForgottenSaga.dpr"/> 42 | <IsPartOfProject Value="True"/> 43 | </Unit0> 44 | </Units> 45 | </ProjectOptions> 46 | <CompilerOptions> 47 | <Version Value="11"/> 48 | <PathDelim Value="\"/> 49 | <Target> 50 | <Filename Value="..\..\ForgottenSaga"/> 51 | </Target> 52 | <SearchPaths> 53 | <IncludeFiles Value="$(ProjOutDir)"/> 54 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 55 | </SearchPaths> 56 | </CompilerOptions> 57 | <Debugging> 58 | <Exceptions Count="3"> 59 | <Item1> 60 | <Name Value="EAbort"/> 61 | </Item1> 62 | <Item2> 63 | <Name Value="ECodetoolError"/> 64 | </Item2> 65 | <Item3> 66 | <Name Value="EFOpenError"/> 67 | </Item3> 68 | </Exceptions> 69 | </Debugging> 70 | </CONFIG> 71 | -------------------------------------------------------------------------------- /sources/bearengine/ForgottenSaga.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/sources/bearengine/ForgottenSaga.res -------------------------------------------------------------------------------- /sources/bearengine/ForgottenSaga.todo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/sources/bearengine/ForgottenSaga.todo -------------------------------------------------------------------------------- /sources/bearengine/Include.inc: -------------------------------------------------------------------------------- 1 | {$DEFINE BEARENGINE} 2 | 3 | {$UNDEF PASCAL_REGIONS} 4 | {$UNDEF PASCAL_GENERICS} 5 | -------------------------------------------------------------------------------- /sources/includes/BeaRLibItems.pas: -------------------------------------------------------------------------------- 1 | unit BeaRLibItems; 2 | 3 | interface 4 | 5 | type 6 | Item = record 7 | ItemID: Integer; 8 | X: Integer; 9 | Y: Integer; 10 | MapID: Integer; 11 | Identify: Integer; 12 | Stack: Integer; 13 | Amount: Integer; 14 | MinDamage: Integer; 15 | MaxDamage: Integer; 16 | Defense: Integer; 17 | Durability: Integer; 18 | MaxDurability: Integer; 19 | Weight: Integer; 20 | Size: Integer; 21 | SlotID: Integer; 22 | Equipment: Integer; 23 | Price: Integer; 24 | Color: Cardinal; 25 | end; 26 | 27 | // Library 28 | procedure Items_Open(); stdcall; external 'BeaRLibItems.dll'; 29 | procedure Items_Close(); stdcall; external 'BeaRLibItems.dll'; 30 | function Items_GetVersion(): PWideChar; stdcall; external 'BeaRLibItems.dll'; 31 | procedure Items_Clear_Item(var AItem: Item); external 'BeaRLibItems.dll'; 32 | 33 | // Dungeon 34 | procedure Items_Dungeon_Clear(); stdcall; external 'BeaRLibItems.dll'; 35 | procedure Items_Dungeon_MapClear(MapID: Integer); stdcall; external 'BeaRLibItems.dll'; 36 | procedure Items_Dungeon_MapClearXY(MapID: Integer; AX, AY: Integer); stdcall; external 'BeaRLibItems.dll'; 37 | 38 | function Items_Dungeon_GetCount(): Integer; stdcall; external 'BeaRLibItems.dll'; 39 | function Items_Dungeon_GetMapCount(MapID: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 40 | function Items_Dungeon_GetMapCountXY(MapID: Integer; AX, AY: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 41 | 42 | function Items_Dungeon_GetItemCount(ItemID: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 43 | function Items_Dungeon_GetMapItemCount(MapID, ItemID: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 44 | function Items_Dungeon_GetMapItemCountXY(MapID, ItemID: Integer; AX, AY: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 45 | 46 | function Items_Dungeon_SetItem(Index: Integer; AItem: Item): Integer; stdcall; external 'BeaRLibItems.dll'; 47 | function Items_Dungeon_GetItem(Index: Integer): Item; stdcall; external 'BeaRLibItems.dll'; 48 | 49 | function Items_Dungeon_SetMapItem(MapID, Index: Integer; AItem: Item): Integer; stdcall; external 'BeaRLibItems.dll'; 50 | function Items_Dungeon_GetMapItem(MapID, Index: Integer): Item; stdcall; external 'BeaRLibItems.dll'; 51 | 52 | function Items_Dungeon_SetMapItemXY(MapID, Index: Integer; AX, AY: Integer; AItem: Item): Integer; stdcall; external 'BeaRLibItems.dll'; 53 | function Items_Dungeon_GetMapItemXY(MapID, Index: Integer; AX, AY: Integer): Item; stdcall; external 'BeaRLibItems.dll'; 54 | 55 | procedure Items_Dungeon_AppendItem(AItem: Item; InHead: Boolean = False); stdcall; external 'BeaRLibItems.dll'; 56 | 57 | function Items_Dungeon_DeleteItem(Index: Integer; var AItem: Item): Integer; stdcall; external 'BeaRLibItems.dll'; 58 | function Items_Dungeon_DeleteMapItem(MapID: Integer; Index: Integer; var AItem: Item): Integer; stdcall; external 'BeaRLibItems.dll'; 59 | function Items_Dungeon_DeleteMapItemXY(MapID: Integer; Index, AX, AY: Integer; var AItem: Item): Integer; stdcall; external 'BeaRLibItems.dll'; 60 | 61 | function Items_Dungeon_GetMapItemAmountXY(MapID, ItemID, AX, AY: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 62 | 63 | // Inventory 64 | procedure Items_Inventory_Clear(); stdcall; external 'BeaRLibItems.dll'; 65 | 66 | function Items_Inventory_GetCount(): Integer; stdcall; external 'BeaRLibItems.dll'; 67 | function Items_Inventory_GetItemCount(ItemID: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 68 | 69 | function Items_Inventory_GetWeight(): Integer; stdcall; external 'BeaRLibItems.dll'; 70 | function Items_Inventory_GetItemWeight(ItemID: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 71 | 72 | function Items_Inventory_GetSize(): Integer; stdcall; external 'BeaRLibItems.dll'; 73 | function Items_Inventory_GetItemSize(ItemID: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 74 | 75 | function Items_Inventory_GetItemAmount(ItemID: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 76 | function Items_Inventory_DeleteItemAmount(ItemID, Amount: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 77 | 78 | function Items_Inventory_SetItem(Index: Integer; AItem: Item): Integer; stdcall; external 'BeaRLibItems.dll'; 79 | function Items_Inventory_GetItem(Index: Integer): Item; stdcall; external 'BeaRLibItems.dll'; 80 | 81 | procedure Items_Inventory_AppendItem(AItem: Item); stdcall; external 'BeaRLibItems.dll'; 82 | function Items_Inventory_DeleteItem(Index: Integer; var AItem: Item): Integer; stdcall; external 'BeaRLibItems.dll'; 83 | 84 | function Items_Inventory_EquipItem(Index: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 85 | function Items_Inventory_UnEquipItem(Index: Integer): Integer; stdcall; external 'BeaRLibItems.dll'; 86 | 87 | procedure Items_Inventory_SetSlotCount(ACount: Integer); stdcall; external 'BeaRLibItems.dll'; 88 | function Items_Inventory_GetSlotCount: Integer; stdcall; external 'BeaRLibItems.dll'; 89 | 90 | implementation 91 | 92 | end. 93 | -------------------------------------------------------------------------------- /sources/vclengine/Engine.pas: -------------------------------------------------------------------------------- 1 | unit Engine; 2 | 3 | {$IFDEF FPC} 4 | {$MODE Delphi} 5 | {$ENDIF} 6 | 7 | interface 8 | 9 | {$I Include.inc} 10 | 11 | uses 12 | Graphics, 13 | Types; 14 | 15 | {$IFDEF PASCAL_REGIONS} 16 | {$REGION ' Keyboard scancodes '} 17 | {$ENDIF PASCAL_REGIONS} 18 | 19 | const 20 | TK_A = ord('A'); 21 | TK_B = ord('B'); 22 | TK_C = ord('C'); 23 | TK_D = ord('D'); 24 | TK_E = ord('E'); 25 | TK_F = ord('F'); 26 | TK_G = ord('G'); 27 | TK_H = ord('H'); 28 | TK_I = ord('I'); 29 | TK_J = ord('J'); 30 | TK_K = ord('K'); 31 | TK_L = ord('L'); 32 | TK_M = ord('M'); 33 | TK_N = ord('N'); 34 | TK_O = ord('O'); 35 | TK_P = ord('P'); 36 | TK_Q = ord('Q'); 37 | TK_R = ord('R'); 38 | TK_S = ord('S'); 39 | TK_T = ord('T'); 40 | TK_U = ord('U'); 41 | TK_V = ord('V'); 42 | TK_W = ord('W'); 43 | TK_X = ord('X'); 44 | TK_Y = ord('Y'); 45 | TK_Z = ord('Z'); 46 | 47 | TK_1 = 49; 48 | TK_2 = 50; 49 | TK_3 = 51; 50 | TK_4 = 52; 51 | TK_5 = 53; 52 | TK_6 = 54; 53 | TK_7 = 55; 54 | TK_8 = 56; 55 | TK_9 = 57; 56 | TK_0 = 58; 57 | 58 | TK_F1 = 112; 59 | TK_F2 = 113; 60 | TK_F3 = 114; 61 | TK_F4 = 115; 62 | TK_F5 = 116; 63 | TK_F6 = 117; 64 | TK_F7 = 118; 65 | TK_F8 = 119; 66 | TK_F9 = 120; 67 | TK_F10 = 121; 68 | TK_F11 = 122; 69 | TK_F12 = 123; 70 | 71 | TK_ENTER = 13; 72 | TK_ESCAPE = 27; 73 | TK_SPACE = 32; 74 | TK_TAB = 9; 75 | 76 | TK_KP_0 = 96; 77 | TK_KP_1 = 97; 78 | TK_KP_2 = 98; 79 | TK_KP_3 = 99; 80 | TK_KP_4 = 100; 81 | TK_KP_5 = 101; 82 | TK_KP_6 = 102; 83 | TK_KP_7 = 103; 84 | TK_KP_8 = 104; 85 | TK_KP_9 = 105; 86 | 87 | TK_COMMA = 188; 88 | TK_PERIOD = 190; 89 | 90 | TK_RIGHT = 39; 91 | TK_LEFT = 37; 92 | TK_DOWN = 40; 93 | TK_UP = 38; 94 | 95 | {$IFDEF PASCAL_REGIONS} 96 | {$ENDREGION ' Keyboard scancodes '} 97 | {$REGION ' TEngine '} 98 | {$ENDIF PASCAL_REGIONS} 99 | 100 | const 101 | clClear = -1; 102 | kcBegin = '{'; 103 | kcEnd = '}'; 104 | 105 | type 106 | TEngine = class(TObject) 107 | public const 108 | clClear = -1; 109 | kcBegin = '{'; 110 | kcEnd = '}'; 111 | public type 112 | TAlign = (aLeft, aCenter, aRight); 113 | public type 114 | TSize = record 115 | Width: Integer; 116 | Height: Integer; 117 | end; 118 | strict private 119 | FSurface: TBitmap; 120 | FWindow: TSize; 121 | FChar: TSize; 122 | public 123 | procedure Clear; 124 | constructor Create(AWidth, AHeight: Integer); 125 | destructor Destroy; override; 126 | procedure Print(X, Y: Integer; S: string; A: TAlign; P: Integer); overload; 127 | function Print(S: string; R: TRect; A: TAlign = aLeft): Integer; overload; 128 | procedure ForegroundColor(Color: Integer); 129 | procedure BackgroundColor(Color: Integer); 130 | function LightColor(Color: Integer; Percent: Byte): Integer; 131 | function DarkColor(Color: Integer; Percent: Byte): Integer; 132 | property Surface: TBitmap read FSurface write FSurface; 133 | property Window: TSize read FWindow write FWindow; 134 | property Char: TSize read FChar write FChar; 135 | class function GetTextLength(Text: string): Integer; 136 | function GetVersion: string; 137 | procedure Close; 138 | end; 139 | 140 | {$IFDEF PASCAL_REGIONS} 141 | {$ENDREGION ' TEngine '} 142 | {$ENDIF PASCAL_REGIONS} 143 | 144 | implementation 145 | 146 | uses 147 | {$IFNDEF FPC} 148 | Windows, 149 | {$ELSE} 150 | LCLIntf, LCLType, LMessages, LazUTF8, 151 | {$ENDIF} 152 | Forms, Classes, SysUtils; 153 | 154 | {$IFDEF PASCAL_REGIONS} 155 | {$REGION ' TEngine '} 156 | {$ENDIF PASCAL_REGIONS} 157 | 158 | constructor TEngine.Create(AWidth, AHeight: Integer); 159 | begin 160 | Randomize; 161 | FWindow.Width := AWidth; 162 | FWindow.Height := AHeight; 163 | FSurface := Graphics.TBitmap.Create; 164 | FSurface.PixelFormat := pf16bit; 165 | FSurface.Canvas.Brush.Style := bsClear; 166 | FSurface.Canvas.Font.Name := 'Courier New'; 167 | FSurface.Canvas.Font.Style := [fsBold]; 168 | FSurface.Canvas.Font.Size := 10; 169 | FChar.Width := Surface.Canvas.TextWidth('W'); 170 | FChar.Height := Surface.Canvas.TextHeight('W'); 171 | FSurface.Width := FChar.Width * FWindow.Width; 172 | FSurface.Height := FChar.Height * FWindow.Height; 173 | end; 174 | 175 | destructor TEngine.Destroy; 176 | begin 177 | FSurface.Free; 178 | inherited; 179 | end; 180 | 181 | procedure TEngine.ForegroundColor(Color: Integer); 182 | begin 183 | Surface.Canvas.Font.Color := Color; 184 | end; 185 | 186 | class function TEngine.GetTextLength(Text: string): Integer; 187 | begin 188 | Result := Length(Text); 189 | end; 190 | 191 | function TEngine.GetVersion: string; 192 | begin 193 | Result := '1.0.0'; 194 | end; 195 | 196 | procedure TEngine.BackgroundColor(Color: Integer); 197 | begin 198 | case Color of 199 | clClear: 200 | Surface.Canvas.Brush.Style := bsClear; 201 | else 202 | Surface.Canvas.Brush.Color := Color; 203 | end; 204 | end; 205 | 206 | procedure TEngine.Clear; 207 | begin 208 | Surface.Canvas.Brush.Color := clBlack; 209 | Surface.Canvas.FillRect(Rect(0, 0, Surface.Width, Surface.Height)); 210 | BackgroundColor(clClear); 211 | end; 212 | 213 | procedure TEngine.Close; 214 | begin 215 | Application.Terminate; 216 | end; 217 | 218 | procedure TEngine.Print(X, Y: Integer; S: string; A: TAlign; P: Integer); 219 | begin 220 | case A of 221 | aLeft: 222 | Surface.Canvas.TextOut(X * Char.Width, Y * Char.Height, S); 223 | aCenter: 224 | Surface.Canvas.TextOut(((Window.Width div 2) - (GetTextLength(S) div 2)) * 225 | Char.Width, Y * Char.Height, S); 226 | aRight: 227 | Surface.Canvas.TextOut((Window.Width - GetTextLength(S)) * Char.Width, 228 | Y * Char.Height, S); 229 | end; 230 | end; 231 | 232 | function TEngine.Print(S: string; R: TRect; A: TAlign = aLeft): Integer; 233 | var 234 | I, C, L: Word; 235 | SL: TStringList; 236 | V: string; 237 | 238 | procedure AddRow(S: string); 239 | begin 240 | Print(R.Left div Char.Width, (L * Char.Height + R.Top) 241 | div Char.Height, S, A, 0); 242 | end; 243 | 244 | function AddLine(astr, aword: string): Boolean; 245 | begin 246 | Result := Surface.Canvas.TextWidth(astr + aword) >= R.Right; 247 | if Result then 248 | begin 249 | AddRow(astr); 250 | Inc(L) 251 | end; 252 | end; 253 | 254 | procedure WordDivider; 255 | begin 256 | SL := TStringList.Create; 257 | StringReplace(S, ' ', ' ', [rfReplaceAll]); 258 | SL.Delimiter := ' '; 259 | SL.DelimitedText := S; 260 | end; 261 | 262 | begin 263 | Result := 0; 264 | if (S = '') then 265 | Exit; 266 | WordDivider; 267 | L := 0; 268 | V := ''; 269 | C := SL.Count - 1; 270 | R.Top := R.Top * Char.Height; 271 | R.Left := R.Left * Char.Width; 272 | R.Right := R.Right * Char.Width; 273 | for I := 0 to C do 274 | begin 275 | if AddLine(V, SL[I]) then 276 | V := ''; 277 | V := V + SL[I] + ' '; 278 | if (I = C) and (V <> '') then 279 | begin 280 | AddRow(V); 281 | Inc(L); 282 | end; 283 | end; 284 | Result := L; 285 | SL.Free; 286 | end; 287 | 288 | function TEngine.DarkColor(Color: Integer; Percent: Byte): Integer; 289 | var 290 | R, G, B: Byte; 291 | C: Integer; 292 | begin 293 | C := ColorToRGB(Color); 294 | R := GetRValue(C); 295 | G := GetGValue(C); 296 | B := GetBValue(C); 297 | R := R - MulDiv(R, Percent, 100); 298 | G := G - MulDiv(G, Percent, 100); 299 | B := B - MulDiv(B, Percent, 100); 300 | Result := RGB(R, G, B); 301 | end; 302 | 303 | function TEngine.LightColor(Color: Integer; Percent: Byte): Integer; 304 | var 305 | R, G, B: Byte; 306 | C: Integer; 307 | begin 308 | C := ColorToRGB(Color); 309 | R := GetRValue(C); 310 | G := GetGValue(C); 311 | B := GetBValue(C); 312 | R := R + MulDiv(255 - R, Percent, 100); 313 | G := G + MulDiv(255 - G, Percent, 100); 314 | B := B + MulDiv(255 - B, Percent, 100); 315 | Result := RGB(R, G, B); 316 | end; 317 | 318 | {$IFDEF PASCAL_REGIONS} 319 | {$ENDREGION ' TEngine '} 320 | {$ENDIF PASCAL_REGIONS} 321 | 322 | end. 323 | -------------------------------------------------------------------------------- /sources/vclengine/ForgottenSaga.MainForm.dfm: -------------------------------------------------------------------------------- 1 | object fMain: TfMain 2 | Left = 228 3 | Top = 183 4 | BorderIcons = [biSystemMenu, biMinimize] 5 | BorderStyle = bsSingle 6 | Caption = 'Forgotten Saga' 7 | ClientHeight = 453 8 | ClientWidth = 688 9 | Color = clBtnFace 10 | Font.Charset = DEFAULT_CHARSET 11 | Font.Color = clWindowText 12 | Font.Height = -11 13 | Font.Name = 'Tahoma' 14 | Font.Style = [] 15 | OldCreateOrder = False 16 | OnCreate = FormCreate 17 | OnDestroy = FormDestroy 18 | OnKeyDown = FormKeyDown 19 | OnPaint = FormPaint 20 | PixelsPerInch = 96 21 | TextHeight = 13 22 | object Timer: TTimer 23 | Interval = 2500 24 | OnTimer = TimerTimer 25 | Left = 88 26 | Top = 40 27 | end 28 | end 29 | -------------------------------------------------------------------------------- /sources/vclengine/ForgottenSaga.MainForm.pas: -------------------------------------------------------------------------------- 1 | unit ForgottenSaga.MainForm; 2 | 3 | interface 4 | 5 | {$I Include.inc} 6 | 7 | uses 8 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 9 | Dialogs, ExtCtrls; 10 | 11 | type 12 | TfMain = class(TForm) 13 | Timer: TTimer; 14 | procedure FormCreate(Sender: TObject); 15 | procedure FormPaint(Sender: TObject); 16 | procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 17 | procedure FormDestroy(Sender: TObject); 18 | procedure TimerTimer(Sender: TObject); 19 | private 20 | { Private declarations } 21 | public 22 | { Public declarations } 23 | end; 24 | 25 | var 26 | fMain: TfMain; 27 | 28 | implementation 29 | 30 | uses Engine, ForgottenSaga.Classes, ForgottenSaga.Entities, ForgottenSaga.Scenes; 31 | 32 | {$R *.dfm} 33 | 34 | procedure TfMain.FormCreate(Sender: TObject); 35 | begin 36 | Saga := TSaga.Create(TMap.Size.Width + TUI.PanelWidth, TMap.Size.Height); 37 | ClientWidth := Saga.Engine.Surface.Width; 38 | ClientHeight := Saga.Engine.Surface.Height; 39 | Left := (Screen.Width div 2) - (Width div 2); 40 | Top := (Screen.Height div 2) - (Height div 2); 41 | Application.Title := __('Forgotten Saga'); 42 | Caption := Application.Title; 43 | end; 44 | 45 | procedure TfMain.FormPaint(Sender: TObject); 46 | begin 47 | Saga.Stages.Render; 48 | Canvas.Draw(0, 0, Saga.Engine.Surface); 49 | end; 50 | 51 | procedure TfMain.FormKeyDown(Sender: TObject; var Key: Word; 52 | Shift: TShiftState); 53 | begin 54 | Saga.Stages.Update(Key); 55 | FormPaint(Sender); 56 | end; 57 | 58 | procedure TfMain.FormDestroy(Sender: TObject); 59 | begin 60 | Saga.Free; 61 | end; 62 | 63 | procedure TfMain.TimerTimer(Sender: TObject); 64 | begin 65 | Saga.Stages.Timer; 66 | if (Saga.Notification.Counter = 0) then 67 | Exit; 68 | FormPaint(Sender); 69 | end; 70 | 71 | end. 72 | -------------------------------------------------------------------------------- /sources/vclengine/ForgottenSaga.dof: -------------------------------------------------------------------------------- 1 | [FileVersion] 2 | Version=7.0 3 | [Compiler] 4 | A=8 5 | B=0 6 | C=1 7 | D=1 8 | E=0 9 | F=0 10 | G=1 11 | H=1 12 | I=1 13 | J=0 14 | K=0 15 | L=1 16 | M=0 17 | N=1 18 | O=1 19 | P=1 20 | Q=0 21 | R=0 22 | S=0 23 | T=0 24 | U=0 25 | V=1 26 | W=0 27 | X=1 28 | Y=1 29 | Z=1 30 | ShowHints=1 31 | ShowWarnings=1 32 | UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; 33 | NamespacePrefix= 34 | SymbolDeprecated=1 35 | SymbolLibrary=1 36 | SymbolPlatform=1 37 | UnitLibrary=1 38 | UnitPlatform=1 39 | UnitDeprecated=1 40 | HResultCompat=1 41 | HidingMember=1 42 | HiddenVirtual=1 43 | Garbage=1 44 | BoundsError=1 45 | ZeroNilCompat=1 46 | StringConstTruncated=1 47 | ForLoopVarVarPar=1 48 | TypedConstVarPar=1 49 | AsgToTypedConst=1 50 | CaseLabelRange=1 51 | ForVariable=1 52 | ConstructingAbstract=1 53 | ComparisonFalse=1 54 | ComparisonTrue=1 55 | ComparingSignedUnsigned=1 56 | CombiningSignedUnsigned=1 57 | UnsupportedConstruct=1 58 | FileOpen=1 59 | FileOpenUnitSrc=1 60 | BadGlobalSymbol=1 61 | DuplicateConstructorDestructor=1 62 | InvalidDirective=1 63 | PackageNoLink=1 64 | PackageThreadVar=1 65 | ImplicitImport=1 66 | HPPEMITIgnored=1 67 | NoRetVal=1 68 | UseBeforeDef=1 69 | ForLoopVarUndef=1 70 | UnitNameMismatch=1 71 | NoCFGFileFound=1 72 | MessageDirective=1 73 | ImplicitVariants=1 74 | UnicodeToLocale=1 75 | LocaleToUnicode=1 76 | ImagebaseMultiple=1 77 | SuspiciousTypecast=1 78 | PrivatePropAccessor=1 79 | UnsafeType=0 80 | UnsafeCode=0 81 | UnsafeCast=0 82 | [Linker] 83 | MapFile=0 84 | OutputObjs=0 85 | ConsoleApp=1 86 | DebugInfo=0 87 | RemoteSymbols=0 88 | MinStackSize=16384 89 | MaxStackSize=1048576 90 | ImageBase=4194304 91 | ExeDescription= 92 | [Directories] 93 | OutputDir= 94 | UnitOutputDir= 95 | PackageDLLOutputDir= 96 | PackageDCPOutputDir= 97 | SearchPath= 98 | Packages=vcl;rtl;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;vclx;dbrtl;soaprtl;dsnap;VclSmp;dbexpress;vcldb;dbxcds;adortl;ibxpress;vclactnband;bdertl;vclshlctrls;dclOfficeXP;SynEdit_R7;vclZipForged7 99 | Conditionals= 100 | DebugSourceDirs= 101 | UsePackages=0 102 | [Parameters] 103 | RunParams= 104 | HostApplication= 105 | Launcher= 106 | UseLauncher=0 107 | DebugCWD= 108 | [Version Info] 109 | IncludeVerInfo=1 110 | AutoIncBuild=0 111 | MajorVer=0 112 | MinorVer=1 113 | Release=0 114 | Build=0 115 | Debug=0 116 | PreRelease=0 117 | Special=0 118 | Private=0 119 | DLL=0 120 | Locale=1033 121 | CodePage=1252 122 | [Version Info Keys] 123 | CompanyName= 124 | FileDescription= 125 | FileVersion=0.1.0.0 126 | InternalName= 127 | LegalCopyright= 128 | LegalTrademarks= 129 | OriginalFilename= 130 | ProductName= 131 | ProductVersion=1.0.0.0 132 | [HistoryLists\hlUnitAliases] 133 | Count=1 134 | Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; 135 | -------------------------------------------------------------------------------- /sources/vclengine/ForgottenSaga.dpr: -------------------------------------------------------------------------------- 1 | program ForgottenSaga; 2 | 3 | uses 4 | Forms, 5 | Engine in 'Engine.pas', 6 | BearLibItems in '..\includes\BearLibItems.pas', 7 | ForgottenSaga.MainForm in 'ForgottenSaga.MainForm.pas' {fMain}, 8 | ForgottenSaga.Classes in '..\ForgottenSaga.Classes.pas', 9 | ForgottenSaga.Entities in '..\ForgottenSaga.Entities.pas', 10 | ForgottenSaga.Scenes in '..\ForgottenSaga.Scenes.pas'; 11 | 12 | {$R *.res} 13 | 14 | begin 15 | Application.Initialize; 16 | Application.Title := 'Forgotten Saga'; 17 | Application.CreateForm(TfMain, fMain); 18 | Application.Run; 19 | end. 20 | -------------------------------------------------------------------------------- /sources/vclengine/ForgottenSaga.dproj: -------------------------------------------------------------------------------- 1 | <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 2 | <PropertyGroup> 3 | <ProjectGuid>{53B47760-0FE4-44AB-A74B-7A272290AFBF}</ProjectGuid> 4 | <MainSource>ForgottenSaga.dpr</MainSource> 5 | <Base>True</Base> 6 | <Config Condition="'$(Config)'==''">Debug</Config> 7 | <TargetedPlatforms>1</TargetedPlatforms> 8 | <AppType>Application</AppType> 9 | <FrameworkType>VCL</FrameworkType> 10 | <ProjectVersion>18.3</ProjectVersion> 11 | <Platform Condition="'$(Platform)'==''">Win32</Platform> 12 | </PropertyGroup> 13 | <PropertyGroup Condition="'$(Config)'=='Base' or '$(Base)'!=''"> 14 | <Base>true</Base> 15 | </PropertyGroup> 16 | <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Base)'=='true') or '$(Base_Win32)'!=''"> 17 | <Base_Win32>true</Base_Win32> 18 | <CfgParent>Base</CfgParent> 19 | <Base>true</Base> 20 | </PropertyGroup> 21 | <PropertyGroup Condition="'$(Config)'=='Release' or '$(Cfg_1)'!=''"> 22 | <Cfg_1>true</Cfg_1> 23 | <CfgParent>Base</CfgParent> 24 | <Base>true</Base> 25 | </PropertyGroup> 26 | <PropertyGroup Condition="'$(Config)'=='Debug' or '$(Cfg_2)'!=''"> 27 | <Cfg_2>true</Cfg_2> 28 | <CfgParent>Base</CfgParent> 29 | <Base>true</Base> 30 | </PropertyGroup> 31 | <PropertyGroup Condition="('$(Platform)'=='Win32' and '$(Cfg_2)'=='true') or '$(Cfg_2_Win32)'!=''"> 32 | <Cfg_2_Win32>true</Cfg_2_Win32> 33 | <CfgParent>Cfg_2</CfgParent> 34 | <Cfg_2>true</Cfg_2> 35 | <Base>true</Base> 36 | </PropertyGroup> 37 | <PropertyGroup Condition="'$(Base)'!=''"> 38 | <DCC_UsePackage>vcl;rtl;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;vclx;dbrtl;soaprtl;dsnap;VclSmp;dbexpress;vcldb;dbxcds;adortl;ibxpress;vclactnband;bdertl;vclshlctrls;dclOfficeXP;SynEdit_R7;vclZipForged7;$(DCC_UsePackage)</DCC_UsePackage> 39 | <VerInfo_Locale>1033</VerInfo_Locale> 40 | <DCC_K>false</DCC_K> 41 | <DCC_F>false</DCC_F> 42 | <DCC_E>false</DCC_E> 43 | <DCC_S>false</DCC_S> 44 | <DCC_DebugInformation>true</DCC_DebugInformation> 45 | <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> 46 | <DCC_ImageBase>00400000</DCC_ImageBase> 47 | <DCC_Namespace>Vcl;Vcl.Imaging;Vcl.Touch;Vcl.Samples;Vcl.Shell;System;Xml;Data;Datasnap;Web;Soap;FMXTee;Winapi;$(DCC_Namespace)</DCC_Namespace> 48 | <DCC_N>true</DCC_N> 49 | <DCC_SymbolReferenceInfo>1</DCC_SymbolReferenceInfo> 50 | <VerInfo_Keys>CompanyName=;FileDescription=;FileVersion=0.1.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductName=;ProductVersion=1.0.0.0</VerInfo_Keys> 51 | <VerInfo_MajorVer>0</VerInfo_MajorVer> 52 | <VerInfo_MinorVer>1</VerInfo_MinorVer> 53 | <SanitizedProjectName>ForgottenSaga</SanitizedProjectName> 54 | </PropertyGroup> 55 | <PropertyGroup Condition="'$(Base_Win32)'!=''"> 56 | <Icon_MainIcon>ForgottenSaga_Icon.ico</Icon_MainIcon> 57 | <VerInfo_IncludeVerInfo>true</VerInfo_IncludeVerInfo> 58 | <VerInfo_Locale>1033</VerInfo_Locale> 59 | <Manifest_File>$(BDS)\bin\default_app.manifest</Manifest_File> 60 | <DCC_Namespace>System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace)</DCC_Namespace> 61 | <VerInfo_Keys>CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)</VerInfo_Keys> 62 | <AppEnableRuntimeThemes>true</AppEnableRuntimeThemes> 63 | <UWP_DelphiLogo44>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png</UWP_DelphiLogo44> 64 | <UWP_DelphiLogo150>$(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png</UWP_DelphiLogo150> 65 | </PropertyGroup> 66 | <PropertyGroup Condition="'$(Cfg_1)'!=''"> 67 | <DCC_LocalDebugSymbols>false</DCC_LocalDebugSymbols> 68 | <DCC_Define>RELEASE;$(DCC_Define)</DCC_Define> 69 | <DCC_SymbolReferenceInfo>0</DCC_SymbolReferenceInfo> 70 | <DCC_DebugInformation>0</DCC_DebugInformation> 71 | </PropertyGroup> 72 | <PropertyGroup Condition="'$(Cfg_2)'!=''"> 73 | <DCC_Define>DEBUG;$(DCC_Define)</DCC_Define> 74 | <DCC_Optimize>false</DCC_Optimize> 75 | <DCC_GenerateStackFrames>true</DCC_GenerateStackFrames> 76 | </PropertyGroup> 77 | <PropertyGroup Condition="'$(Cfg_2_Win32)'!=''"> 78 | <VerInfo_MinorVer>0</VerInfo_MinorVer> 79 | <VerInfo_MajorVer>1</VerInfo_MajorVer> 80 | <VerInfo_Keys>CompanyName=;FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProductVersion=1.0.0.0;Comments=;ProgramID=com.embarcadero.$(MSBuildProjectName);FileDescription=$(MSBuildProjectName);ProductName=$(MSBuildProjectName)</VerInfo_Keys> 81 | <DCC_ExeOutput>..\..\</DCC_ExeOutput> 82 | <Icon_MainIcon>..\..\resources\icon.ico</Icon_MainIcon> 83 | <BT_BuildType>Debug</BT_BuildType> 84 | </PropertyGroup> 85 | <ItemGroup> 86 | <DelphiCompile Include="$(MainSource)"> 87 | <MainSource>MainSource</MainSource> 88 | </DelphiCompile> 89 | <DCCReference Include="Engine.pas"/> 90 | <DCCReference Include="..\includes\BearLibItems.pas"/> 91 | <DCCReference Include="ForgottenSaga.MainForm.pas"> 92 | <Form>fMain</Form> 93 | </DCCReference> 94 | <DCCReference Include="..\ForgottenSaga.Classes.pas"/> 95 | <DCCReference Include="..\ForgottenSaga.Entities.pas"/> 96 | <DCCReference Include="..\ForgottenSaga.Scenes.pas"/> 97 | <BuildConfiguration Include="Debug"> 98 | <Key>Cfg_2</Key> 99 | <CfgParent>Base</CfgParent> 100 | </BuildConfiguration> 101 | <BuildConfiguration Include="Base"> 102 | <Key>Base</Key> 103 | </BuildConfiguration> 104 | <BuildConfiguration Include="Release"> 105 | <Key>Cfg_1</Key> 106 | <CfgParent>Base</CfgParent> 107 | </BuildConfiguration> 108 | </ItemGroup> 109 | <ProjectExtensions> 110 | <Borland.Personality>Delphi.Personality.12</Borland.Personality> 111 | <Borland.ProjectType/> 112 | <BorlandProject> 113 | <Delphi.Personality> 114 | <Source> 115 | <Source Name="MainSource">ForgottenSaga.dpr</Source> 116 | </Source> 117 | <VersionInfo> 118 | <VersionInfo Name="IncludeVerInfo">True</VersionInfo> 119 | <VersionInfo Name="AutoIncBuild">False</VersionInfo> 120 | <VersionInfo Name="MajorVer">0</VersionInfo> 121 | <VersionInfo Name="MinorVer">1</VersionInfo> 122 | <VersionInfo Name="Release">0</VersionInfo> 123 | <VersionInfo Name="Build">0</VersionInfo> 124 | <VersionInfo Name="Debug">False</VersionInfo> 125 | <VersionInfo Name="PreRelease">False</VersionInfo> 126 | <VersionInfo Name="Special">False</VersionInfo> 127 | <VersionInfo Name="Private">False</VersionInfo> 128 | <VersionInfo Name="DLL">False</VersionInfo> 129 | <VersionInfo Name="Locale">1033</VersionInfo> 130 | <VersionInfo Name="CodePage">1252</VersionInfo> 131 | </VersionInfo> 132 | <VersionInfoKeys> 133 | <VersionInfoKeys Name="CompanyName"/> 134 | <VersionInfoKeys Name="FileDescription"/> 135 | <VersionInfoKeys Name="FileVersion">0.1.0.0</VersionInfoKeys> 136 | <VersionInfoKeys Name="InternalName"/> 137 | <VersionInfoKeys Name="LegalCopyright"/> 138 | <VersionInfoKeys Name="LegalTrademarks"/> 139 | <VersionInfoKeys Name="OriginalFilename"/> 140 | <VersionInfoKeys Name="ProductName"/> 141 | <VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys> 142 | </VersionInfoKeys> 143 | <Excluded_Packages> 144 | <Excluded_Packages Name="$(BDSBIN)\dcloffice2k190.bpl">Microsoft Office 2000 Sample Automation Server Wrapper Components</Excluded_Packages> 145 | <Excluded_Packages Name="$(BDSBIN)\dclofficexp190.bpl">Microsoft Office XP Sample Automation Server Wrapper Components</Excluded_Packages> 146 | </Excluded_Packages> 147 | </Delphi.Personality> 148 | <Platforms> 149 | <Platform value="Win32">True</Platform> 150 | </Platforms> 151 | </BorlandProject> 152 | <ProjectFileVersion>12</ProjectFileVersion> 153 | </ProjectExtensions> 154 | <Import Project="$(BDS)\Bin\CodeGear.Delphi.Targets" Condition="Exists('$(BDS)\Bin\CodeGear.Delphi.Targets')"/> 155 | <Import Project="$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj" Condition="Exists('$(APPDATA)\Embarcadero\$(BDSAPPDATABASEDIR)\$(PRODUCTVERSION)\UserTools.proj')"/> 156 | </Project> 157 | -------------------------------------------------------------------------------- /sources/vclengine/ForgottenSaga.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/sources/vclengine/ForgottenSaga.res -------------------------------------------------------------------------------- /sources/vclengine/Include.inc: -------------------------------------------------------------------------------- 1 | {$DEFINE VCLENGINE} 2 | 3 | {$UNDEF PASCAL_REGIONS} 4 | -------------------------------------------------------------------------------- /sources/worldeditor/Include.inc: -------------------------------------------------------------------------------- 1 | {$DEFINE VCLENGINE} 2 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.Classes.pas: -------------------------------------------------------------------------------- 1 | unit WorldEditor.Classes; 2 | 3 | interface 4 | 5 | uses Windows, Graphics, Types, Forms, Controls, ForgottenSaga.Classes, 6 | ForgottenSaga.Entities, Dialogs; 7 | 8 | {$REGION ' TEditor '} 9 | function __(S: string): string; 10 | 11 | type 12 | TEditor = class(TSaga) 13 | private 14 | FCurrentMap: TMap; 15 | FPos: TPoint; 16 | FToolBarHeight: Integer; 17 | FTile: TTiles.TTileEnum; 18 | FModified: Boolean; 19 | FCreatures: TCreatures; 20 | FItems: TItems; 21 | public 22 | constructor Create; 23 | destructor Destroy; override; 24 | procedure RenderTerrain; 25 | procedure RenderObjects; 26 | procedure RenderItems; 27 | procedure RenderCreatures; 28 | procedure MouseMove(Layer: TMap.TLayerEnum; X, Y: Integer); 29 | procedure MouseDown(Layer: TMap.TLayerEnum; Button: TMouseButton; 30 | X, Y: Integer); 31 | procedure KeyDown(var Key: Word); 32 | property Pos: TPoint read FPos write FPos; 33 | property ToolBarHeight: Integer read FToolBarHeight write FToolBarHeight; 34 | property CurrentMap: TMap read FCurrentMap write FCurrentMap; 35 | property Tile: TTiles.TTileEnum read FTile write FTile; 36 | property Modified: Boolean read FModified write FModified; 37 | property Creatures: TCreatures read FCreatures write FCreatures; 38 | property Items: TItems read FItems write FItems; 39 | end; 40 | 41 | var 42 | Editor: TEditor; 43 | 44 | {$ENDREGION ' TEditor '} 45 | {$REGION ' Utils '} 46 | 47 | type 48 | Utils = class(TObject) 49 | public 50 | class function ShowForm(const Form: TForm): Integer; 51 | class function MsgDlg(const Msg: string; DlgType: TMsgDlgType; 52 | Buttons: TMsgDlgButtons; HelpCtx: Integer = 0): Integer; 53 | end; 54 | {$ENDREGION ' Utils '} 55 | 56 | implementation 57 | 58 | uses Engine; 59 | 60 | {$REGION ' TEditor '} 61 | 62 | function __(S: string): string; 63 | begin 64 | Result := '?'; 65 | if (S = '') then 66 | Exit; 67 | Result := Editor.Lg.Get(S); 68 | end; 69 | 70 | constructor TEditor.Create; 71 | begin 72 | inherited Create(TMap.Size.Width, TMap.Size.Height); 73 | CurrentMap := TMap.Create; 74 | Creatures := TCreatures.Create; 75 | Items := TItems.Create; 76 | Modified := False; 77 | end; 78 | 79 | destructor TEditor.Destroy; 80 | begin 81 | Items.Free; 82 | Creatures.Free; 83 | CurrentMap.Free; 84 | inherited; 85 | end; 86 | 87 | procedure TEditor.KeyDown(var Key: Word); 88 | begin 89 | 90 | end; 91 | 92 | procedure TEditor.MouseDown(Layer: TMap.TLayerEnum; Button: TMouseButton; 93 | X, Y: Integer); 94 | begin 95 | case Button of 96 | mbLeft: 97 | begin 98 | case Layer of 99 | lrTerrain, lrObjects: 100 | CurrentMap.SetTile(Pos.X, Pos.Y, Layer, Self.Tile); 101 | end; 102 | Modified := True; 103 | end; 104 | mbRight: 105 | begin 106 | case Layer of 107 | lrTerrain, lrObjects: 108 | CurrentMap.SetTile(Pos.X, Pos.Y, Layer, tNone); 109 | end; 110 | Modified := True; 111 | end; 112 | end; 113 | end; 114 | 115 | procedure TEditor.MouseMove(Layer: TMap.TLayerEnum; X, Y: Integer); 116 | begin 117 | Pos := Point(X div Engine.Char.Width, (Y - ToolBarHeight) 118 | div Engine.Char.Height); 119 | if (GetKeyState(VK_LBUTTON) < 0) and (CurrentMap.CellInMap(Pos.X, Pos.Y)) then 120 | CurrentMap.SetTile(Pos.X, Pos.Y, Layer, Self.Tile); 121 | end; 122 | 123 | procedure TEditor.RenderCreatures; 124 | var 125 | I: Integer; 126 | E: TCreature; 127 | begin 128 | for I := 0 to Creatures.Count - 1 do 129 | begin 130 | E := Creatures.Entity[I]; 131 | Editor.UI.DrawChar(E.Pos.X, E.Pos.Y, E.Symbol, E.Color, E.BackColor); 132 | end; 133 | end; 134 | 135 | procedure TEditor.RenderItems; 136 | var 137 | I: Integer; 138 | E: TItem; 139 | begin 140 | for I := 0 to Items.Count - 1 do 141 | begin 142 | E := Items.Entity[I]; 143 | Editor.UI.DrawChar(E.Pos.X, E.Pos.Y, E.Symbol, E.Color, E.BackColor); 144 | end; 145 | end; 146 | 147 | procedure TEditor.RenderObjects; 148 | var 149 | X, Y: Integer; 150 | TerTile, ObjTile: TTiles.TTileProp; 151 | begin 152 | for Y := 0 to CurrentMap.Height - 1 do 153 | for X := 0 to CurrentMap.Width - 1 do 154 | if not CurrentMap.HasTile(tNone, X, Y, lrObjects) then 155 | begin 156 | TerTile := Editor.Tiles.GetTile(CurrentMap.GetTile(X, Y, lrTerrain)); 157 | ObjTile := Editor.Tiles.GetTile(CurrentMap.GetTile(X, Y, lrObjects)); 158 | Editor.UI.DrawChar(X, Y, ObjTile.Symbol, ObjTile.Color, 159 | Editor.Engine.DarkColor(TerTile.Color, TTiles.TileDarkPercent)); 160 | end; 161 | end; 162 | 163 | procedure TEditor.RenderTerrain; 164 | var 165 | X, Y: Integer; 166 | TerTile: TTiles.TTileProp; 167 | begin 168 | for Y := 0 to CurrentMap.Height - 1 do 169 | for X := 0 to CurrentMap.Width - 1 do 170 | begin 171 | TerTile := Editor.Tiles.GetTile(CurrentMap.GetTile(X, Y, lrTerrain)); 172 | Editor.UI.DrawChar(X, Y, TerTile.Symbol, TerTile.Color, 173 | Editor.Engine.DarkColor(TerTile.Color, TTiles.TileDarkPercent)); 174 | end; 175 | end; 176 | 177 | {$ENDREGION ' TEditor '} 178 | {$REGION ' Utils '} 179 | 180 | class function Utils.MsgDlg(const Msg: string; DlgType: TMsgDlgType; 181 | Buttons: TMsgDlgButtons; HelpCtx: Integer): Integer; 182 | begin 183 | Result := ShowForm(CreateMessageDialog(Msg, DlgType, Buttons)); 184 | end; 185 | 186 | class function Utils.ShowForm(const Form: TForm): Integer; 187 | begin 188 | with Form do 189 | begin 190 | BorderStyle := bsDialog; 191 | Position := poOwnerFormCenter; 192 | Result := ShowModal; 193 | end; 194 | end; 195 | {$ENDREGION ' Utils '} 196 | 197 | end. 198 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.MainForm.pas: -------------------------------------------------------------------------------- 1 | unit WorldEditor.MainForm; 2 | 3 | interface 4 | 5 | uses 6 | Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, 7 | Dialogs, ExtCtrls, Menus, Buttons, ComCtrls, ToolWin, ImgList, StdCtrls, 8 | ForgottenSaga.Entities, ForgottenSaga.Classes, System.ImageList; 9 | 10 | type 11 | TfMain = class(TForm) 12 | ToolsPanel: TPanel; 13 | ToolBar: TToolBar; 14 | StatusBar: TStatusBar; 15 | ImageList: TImageList; 16 | ToolButton1: TToolButton; 17 | ToolButton2: TToolButton; 18 | btTerrain: TToolButton; 19 | btObjects: TToolButton; 20 | btItems: TToolButton; 21 | btCreatures: TToolButton; 22 | ToolButton3: TToolButton; 23 | brTerrain: TToolButton; 24 | brObjects: TToolButton; 25 | brItems: TToolButton; 26 | brCreatures: TToolButton; 27 | TerListBox: TListBox; 28 | Label1: TLabel; 29 | OD: TOpenDialog; 30 | SD: TSaveDialog; 31 | ToolButton4: TToolButton; 32 | ToolButton5: TToolButton; 33 | ToolButton6: TToolButton; 34 | ObjListBox: TListBox; 35 | ItmListBox: TListBox; 36 | CrtListBox: TListBox; 37 | bfBlock: TToolButton; 38 | procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); 39 | procedure FormCreate(Sender: TObject); 40 | procedure FormDestroy(Sender: TObject); 41 | procedure FormPaint(Sender: TObject); 42 | procedure FormMouseDown(Sender: TObject; Button: TMouseButton; 43 | Shift: TShiftState; X, Y: Integer); 44 | procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 45 | procedure brTerrainClick(Sender: TObject); 46 | procedure TerListBoxClick(Sender: TObject); 47 | procedure ToolButton1Click(Sender: TObject); 48 | procedure ToolButton4Click(Sender: TObject); 49 | procedure ToolButton6Click(Sender: TObject); 50 | procedure ObjListBoxClick(Sender: TObject); 51 | procedure brObjectsClick(Sender: TObject); 52 | procedure brItemsClick(Sender: TObject); 53 | procedure brCreaturesClick(Sender: TObject); 54 | procedure CrtListBoxClick(Sender: TObject); 55 | procedure ItmListBoxClick(Sender: TObject); 56 | procedure bfBlockClick(Sender: TObject); 57 | procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); 58 | private 59 | procedure LoadResources; 60 | { Private declarations } 61 | public 62 | { Public declarations } 63 | procedure UpdateCaption; 64 | function GetCurrentLayer(): Byte; 65 | function GetRealTile(Index: Integer; Layer: TTiles.TLayerTypeEnum) 66 | : TTiles.TTileEnum; 67 | function CheckModified: Boolean; 68 | procedure LoadMap; 69 | end; 70 | 71 | var 72 | fMain: TfMain; 73 | 74 | implementation 75 | 76 | uses WorldEditor.Classes, WorldEditor.NewMapForm, WorldEditor.ProgressBarForm; 77 | 78 | {$R *.dfm} 79 | 80 | procedure Border(Pos: TPoint; Color: Integer; Symbol: Char = #32); 81 | begin 82 | Editor.Engine.Surface.Canvas.Pen.Color := Color; 83 | Editor.Engine.Surface.Canvas.Brush.Style := bsClear; 84 | Editor.Engine.Surface.Canvas.Rectangle(Pos.X * Editor.Engine.Char.Width - 1, 85 | Pos.Y * Editor.Engine.Char.Height - 1, Pos.X * Editor.Engine.Char.Width + 86 | Editor.Engine.Char.Width + 1, Pos.Y * Editor.Engine.Char.Height + 87 | Editor.Engine.Char.Height + 1); 88 | end; 89 | 90 | procedure TfMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 91 | begin 92 | CanClose := not CheckModified; 93 | end; 94 | 95 | procedure TfMain.FormCreate(Sender: TObject); 96 | begin 97 | Randomize; 98 | TerListBox.Height := 500; 99 | ObjListBox.Height := 500; 100 | ItmListBox.Height := 500; 101 | CrtListBox.Height := 500; 102 | Editor := TEditor.Create; 103 | Editor.ToolBarHeight := ToolBar.Height; 104 | Editor.Tile := tNone; 105 | ClientWidth := Editor.Engine.Surface.Width + ToolsPanel.Width; 106 | ClientHeight := Editor.Engine.Surface.Height + Editor.ToolBarHeight + 107 | StatusBar.Height; 108 | Left := (Screen.Width div 2) - (Width div 2); 109 | Top := (Screen.Height div 2) - (Height div 2); 110 | btTerrain.Down := True; 111 | btObjects.Down := True; 112 | btItems.Down := True; 113 | btCreatures.Down := True; 114 | brTerrain.Click; 115 | brTerrain.Down := True; 116 | UpdateCaption; 117 | LoadResources; 118 | FormPaint(Sender); 119 | end; 120 | 121 | procedure TfMain.FormMouseMove(Sender: TObject; Shift: TShiftState; 122 | X, Y: Integer); 123 | begin 124 | Editor.MouseMove(TMap.TLayerEnum(GetCurrentLayer), X, Y); 125 | FormPaint(Sender); 126 | Label1.Caption := Format('%d:%d', [Editor.Pos.X, Editor.Pos.Y]); 127 | end; 128 | 129 | procedure TfMain.FormPaint(Sender: TObject); 130 | begin 131 | Editor.Engine.Clear; 132 | if btTerrain.Down then 133 | Editor.RenderTerrain; 134 | if btObjects.Down then 135 | Editor.RenderObjects; 136 | if btItems.Down then 137 | Editor.RenderItems; 138 | if btCreatures.Down then 139 | Editor.RenderCreatures; 140 | if brTerrain.Down then 141 | Border(Editor.Pos, clYellow); 142 | if brObjects.Down then 143 | Border(Editor.Pos, clWhite); 144 | if brItems.Down then 145 | Border(Editor.Pos, clSkyBlue); 146 | if brCreatures.Down then 147 | Border(Editor.Pos, clFuchsia); 148 | Canvas.Draw(0, Editor.ToolBarHeight, Editor.Engine.Surface); 149 | end; 150 | 151 | function TfMain.GetCurrentLayer: Byte; 152 | begin 153 | if brTerrain.Down then 154 | Result := 0; 155 | if brObjects.Down then 156 | Result := 1; 157 | if brItems.Down then 158 | Result := 2; 159 | if brCreatures.Down then 160 | Result := 3; 161 | end; 162 | 163 | function TfMain.GetRealTile(Index: Integer; Layer: TTiles.TLayerTypeEnum) 164 | : TTiles.TTileEnum; 165 | var 166 | Tile: TTiles.TTileEnum; 167 | Counter: Byte; 168 | Flag: Boolean; 169 | begin 170 | Counter := 0; 171 | Result := tNone; 172 | for Tile := Low(TTiles.TTileEnum) to High(TTiles.TTileEnum) do 173 | begin 174 | Flag := (Editor.Tiles.GetTile(Tile).Layer = Layer) or 175 | (Editor.Tiles.GetTile(Tile).Layer = ltBoth); 176 | if not Flag then 177 | Continue; 178 | if (Counter = Index) then 179 | begin 180 | Result := Tile; 181 | Break; 182 | end; 183 | if Flag then 184 | Inc(Counter); 185 | end; 186 | end; 187 | 188 | procedure TfMain.ItmListBoxClick(Sender: TObject); 189 | begin 190 | // 191 | end; 192 | 193 | procedure TfMain.LoadMap; 194 | var 195 | I: Integer; 196 | begin 197 | Editor.CurrentMap.FileName := OD.FileName; 198 | Editor.CurrentMap.LoadFromFile(Editor.CurrentMap.FileName); 199 | 200 | Editor.Items.LoadFromFile(ChangeFileExt(Editor.CurrentMap.FileName, '.itm')); 201 | ItmListBox.Clear; 202 | for I := 0 to Editor.Items.Count - 1 do 203 | begin 204 | ItmListBox.Items.Append(Format(TPlayer.KeyFmt, 205 | [Editor.Items.Entity[I].Symbol, __(Editor.Items.Entity[I].Name)])); 206 | end; 207 | ItmListBox.ItemIndex := 0; 208 | 209 | Editor.Creatures.LoadFromFile 210 | (ChangeFileExt(Editor.CurrentMap.FileName, '.crt')); 211 | CrtListBox.Clear; 212 | for I := 0 to Editor.Creatures.Count - 1 do 213 | begin 214 | CrtListBox.Items.Append(Format(TPlayer.KeyFmt, 215 | [Editor.Creatures.Entity[I].Symbol, 216 | __(Editor.Creatures.Entity[I].Name)])); 217 | end; 218 | CrtListBox.ItemIndex := 0; 219 | 220 | UpdateCaption; 221 | 222 | FormPaint(Self); 223 | end; 224 | 225 | procedure TfMain.LoadResources; 226 | var 227 | I: TTiles.TTileEnum; 228 | ObjFlag: Boolean; 229 | TerFlag: Boolean; 230 | J: Integer; 231 | begin 232 | TerListBox.Clear; 233 | ObjListBox.Clear; 234 | 235 | for I := Low(TTiles.TTileEnum) to High(TTiles.TTileEnum) do 236 | begin 237 | TerFlag := (Editor.Tiles.GetTile(I).Layer = ltTerrain) or 238 | (Editor.Tiles.GetTile(I).Layer = ltBoth); 239 | ObjFlag := (Editor.Tiles.GetTile(I).Layer = ltObjects) or 240 | (Editor.Tiles.GetTile(I).Layer = ltBoth); 241 | if TerFlag then 242 | TerListBox.Items.Append(Format(TPlayer.KeyFmt, 243 | [Editor.Tiles.GetTile(I).Symbol, Editor.Tiles.GetTile(I).Name])); 244 | if ObjFlag then 245 | ObjListBox.Items.Append(Format(TPlayer.KeyFmt, 246 | [Editor.Tiles.GetTile(I).Symbol, Editor.Tiles.GetTile(I).Name])); 247 | end; 248 | TerListBox.ItemIndex := 0; 249 | ObjListBox.ItemIndex := 0; 250 | end; 251 | 252 | procedure TfMain.FormDestroy(Sender: TObject); 253 | begin 254 | Editor.Free; 255 | end; 256 | 257 | procedure TfMain.FormMouseDown(Sender: TObject; Button: TMouseButton; 258 | Shift: TShiftState; X, Y: Integer); 259 | begin 260 | Editor.MouseDown(TMap.TLayerEnum(GetCurrentLayer), Button, X, Y); 261 | FormPaint(Sender); 262 | UpdateCaption; 263 | end; 264 | 265 | procedure TfMain.FormKeyDown(Sender: TObject; var Key: Word; 266 | Shift: TShiftState); 267 | begin 268 | Editor.KeyDown(Key); 269 | FormPaint(Sender); 270 | UpdateCaption; 271 | end; 272 | 273 | procedure TfMain.bfBlockClick(Sender: TObject); 274 | begin 275 | // 276 | end; 277 | 278 | procedure TfMain.brCreaturesClick(Sender: TObject); 279 | begin 280 | TerListBox.Visible := False; 281 | ObjListBox.Visible := False; 282 | ItmListBox.Visible := False; 283 | CrtListBox.Visible := True; 284 | CrtListBoxClick(Sender); 285 | FormPaint(Sender); 286 | end; 287 | 288 | procedure TfMain.brItemsClick(Sender: TObject); 289 | begin 290 | TerListBox.Visible := False; 291 | ObjListBox.Visible := False; 292 | CrtListBox.Visible := False; 293 | ItmListBox.Visible := True; 294 | ItmListBoxClick(Sender); 295 | FormPaint(Sender); 296 | end; 297 | 298 | procedure TfMain.brObjectsClick(Sender: TObject); 299 | begin 300 | TerListBox.Visible := False; 301 | ItmListBox.Visible := False; 302 | CrtListBox.Visible := False; 303 | ObjListBox.Visible := True; 304 | ObjListBoxClick(Sender); 305 | FormPaint(Sender); 306 | end; 307 | 308 | procedure TfMain.brTerrainClick(Sender: TObject); 309 | begin 310 | ObjListBox.Visible := False; 311 | ItmListBox.Visible := False; 312 | CrtListBox.Visible := False; 313 | TerListBox.Visible := True; 314 | TerListBoxClick(Sender); 315 | FormPaint(Sender); 316 | end; 317 | 318 | function TfMain.CheckModified: Boolean; 319 | begin 320 | Result := False; 321 | if Editor.Modified and (Utils.MsgDlg('Quit?', mtConfirmation, mbOKCancel) <> 322 | mrOk) then 323 | Result := True; 324 | end; 325 | 326 | procedure TfMain.CrtListBoxClick(Sender: TObject); 327 | begin 328 | // 329 | end; 330 | 331 | procedure TfMain.TerListBoxClick(Sender: TObject); 332 | begin 333 | Editor.Tile := GetRealTile(TerListBox.ItemIndex, ltTerrain); 334 | end; 335 | 336 | procedure TfMain.ObjListBoxClick(Sender: TObject); 337 | begin 338 | Editor.Tile := GetRealTile(ObjListBox.ItemIndex, ltObjects); 339 | end; 340 | 341 | procedure TfMain.ToolButton1Click(Sender: TObject); 342 | begin 343 | if Editor.Modified then 344 | Editor.Modified := False; 345 | OD.InitialDir := TUtils.GetPath('resources'); 346 | if OD.Execute then 347 | begin 348 | fProgressBar.Left := Self.Left + 349 | ((Self.Width div 2) - (fProgressBar.Width div 2)); 350 | fProgressBar.Top := Self.Top + 351 | ((Self.Height div 2) - (fProgressBar.Height div 2)); 352 | fProgressBar.Speed := 100; 353 | fProgressBar.Start; 354 | fProgressBar.OnAct := LoadMap; 355 | fProgressBar.ShowModal; 356 | end; 357 | FormPaint(Sender); 358 | end; 359 | 360 | procedure TfMain.ToolButton4Click(Sender: TObject); 361 | begin 362 | if (Editor.CurrentMap.FileName <> '') then 363 | begin 364 | Editor.CurrentMap.SaveToFile(Editor.CurrentMap.FileName); 365 | Editor.Modified := False; 366 | UpdateCaption; 367 | end; 368 | end; 369 | 370 | procedure TfMain.ToolButton6Click(Sender: TObject); 371 | begin 372 | fNew.Left := Self.Left + ((Self.Width div 2) - (fNew.Width div 2)); 373 | fNew.Top := Self.Top + ((Self.Height div 2) - (fNew.Height div 2)); 374 | fNew.cbTerrain.Items.Assign(Self.TerListBox.Items); 375 | fNew.cbTerrain.ItemIndex := Self.TerListBox.ItemIndex; 376 | fNew.cbObjects.Items.Assign(Self.ObjListBox.Items); 377 | fNew.cbObjects.ItemIndex := Self.ObjListBox.ItemIndex; 378 | fNew.cbTerSpot.Items.Assign(Self.TerListBox.Items); 379 | fNew.cbTerSpot.ItemIndex := Self.TerListBox.ItemIndex; 380 | fNew.cbObjSpot.Items.Assign(Self.ObjListBox.Items); 381 | fNew.cbObjSpot.ItemIndex := Self.ObjListBox.ItemIndex; 382 | fNew.cbWall.Items.Assign(Self.TerListBox.Items); 383 | fNew.cbWall.ItemIndex := 0; 384 | fNew.cbFloor.Items.Assign(Self.TerListBox.Items); 385 | fNew.cbFloor.ItemIndex := 0; 386 | fNew.ShowModal; 387 | end; 388 | 389 | procedure TfMain.UpdateCaption; 390 | var 391 | S: string; 392 | begin 393 | if Editor.Modified then 394 | S := '*' 395 | else 396 | S := ''; 397 | if (Editor.CurrentMap.FileName = '') then 398 | Caption := Application.Title 399 | else 400 | Caption := Format('%s%s - %s', [ExtractFileName(Editor.CurrentMap.FileName), 401 | S, Application.Title]); 402 | end; 403 | 404 | end. 405 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.NewMapForm.dfm: -------------------------------------------------------------------------------- 1 | object fNew: TfNew 2 | Left = 0 3 | Top = 0 4 | BorderStyle = bsDialog 5 | Caption = 'Tools' 6 | ClientHeight = 379 7 | ClientWidth = 609 8 | Color = clBtnFace 9 | Font.Charset = DEFAULT_CHARSET 10 | Font.Color = clWindowText 11 | Font.Height = -11 12 | Font.Name = 'Tahoma' 13 | Font.Style = [] 14 | OldCreateOrder = False 15 | Position = poDefault 16 | PixelsPerInch = 96 17 | TextHeight = 13 18 | object btnClose: TBitBtn 19 | Left = 256 20 | Top = 329 21 | Width = 81 22 | Height = 25 23 | Cancel = True 24 | Caption = 'Close' 25 | Default = True 26 | ModalResult = 1 27 | TabOrder = 0 28 | end 29 | object GroupBox1: TGroupBox 30 | Left = 8 31 | Top = 8 32 | Width = 265 33 | Height = 57 34 | Caption = 'Terrain' 35 | TabOrder = 1 36 | object btTerFill: TBitBtn 37 | Left = 208 38 | Top = 20 39 | Width = 43 40 | Height = 25 41 | Caption = 'Fill' 42 | TabOrder = 0 43 | OnClick = btTerFillClick 44 | end 45 | object cbTerrain: TComboBox 46 | Left = 17 47 | Top = 22 48 | Width = 185 49 | Height = 21 50 | Style = csDropDownList 51 | TabOrder = 1 52 | end 53 | end 54 | object GroupBox2: TGroupBox 55 | Left = 8 56 | Top = 71 57 | Width = 265 58 | Height = 57 59 | Caption = 'Objects' 60 | TabOrder = 2 61 | object btObjFill: TBitBtn 62 | Left = 208 63 | Top = 20 64 | Width = 43 65 | Height = 25 66 | Caption = 'Fill' 67 | TabOrder = 0 68 | OnClick = btObjFillClick 69 | end 70 | object cbObjects: TComboBox 71 | Left = 17 72 | Top = 22 73 | Width = 185 74 | Height = 21 75 | Style = csDropDownList 76 | TabOrder = 1 77 | end 78 | end 79 | object btGen: TBitBtn 80 | Left = 392 81 | Top = 188 82 | Width = 153 83 | Height = 25 84 | Caption = 'Gen Cave' 85 | TabOrder = 3 86 | OnClick = btGenClick 87 | end 88 | object cbFloor: TComboBox 89 | Left = 392 90 | Top = 43 91 | Width = 185 92 | Height = 21 93 | Style = csDropDownList 94 | TabOrder = 4 95 | end 96 | object cbWall: TComboBox 97 | Left = 392 98 | Top = 8 99 | Width = 185 100 | Height = 21 101 | Style = csDropDownList 102 | TabOrder = 5 103 | end 104 | object edNum: TEdit 105 | Left = 400 106 | Top = 88 107 | Width = 25 108 | Height = 21 109 | TabOrder = 6 110 | Text = '7' 111 | end 112 | object UpDown1: TUpDown 113 | Left = 425 114 | Top = 88 115 | Width = 16 116 | Height = 21 117 | Associate = edNum 118 | Min = 1 119 | Max = 20 120 | Position = 7 121 | TabOrder = 7 122 | end 123 | object GroupBox3: TGroupBox 124 | Left = 8 125 | Top = 134 126 | Width = 265 127 | Height = 79 128 | Caption = 'Terrain' 129 | TabOrder = 8 130 | object btAddTerSpot: TBitBtn 131 | Left = 208 132 | Top = 20 133 | Width = 43 134 | Height = 25 135 | Caption = 'Add' 136 | TabOrder = 0 137 | OnClick = btAddTerSpotClick 138 | end 139 | object cbTerSpot: TComboBox 140 | Left = 17 141 | Top = 22 142 | Width = 185 143 | Height = 21 144 | Style = csDropDownList 145 | TabOrder = 1 146 | end 147 | object edTerSpotCount: TEdit 148 | Left = 88 149 | Top = 49 150 | Width = 25 151 | Height = 21 152 | TabOrder = 2 153 | Text = '10' 154 | end 155 | object UpDown2: TUpDown 156 | Left = 113 157 | Top = 49 158 | Width = 16 159 | Height = 21 160 | Associate = edTerSpotCount 161 | Min = 1 162 | Max = 50 163 | Position = 10 164 | TabOrder = 3 165 | end 166 | object edTerSpotSize: TEdit 167 | Left = 210 168 | Top = 51 169 | Width = 25 170 | Height = 21 171 | TabOrder = 4 172 | Text = '25' 173 | end 174 | object UpDown3: TUpDown 175 | Left = 235 176 | Top = 51 177 | Width = 16 178 | Height = 21 179 | Associate = edTerSpotSize 180 | Min = 10 181 | Position = 25 182 | TabOrder = 5 183 | end 184 | end 185 | object GroupBox4: TGroupBox 186 | Left = 8 187 | Top = 219 188 | Width = 265 189 | Height = 79 190 | Caption = 'Objects' 191 | TabOrder = 9 192 | object btAddObjSpot: TBitBtn 193 | Left = 208 194 | Top = 20 195 | Width = 43 196 | Height = 25 197 | Caption = 'Add' 198 | TabOrder = 0 199 | OnClick = btAddObjSpotClick 200 | end 201 | object cbObjSpot: TComboBox 202 | Left = 17 203 | Top = 22 204 | Width = 185 205 | Height = 21 206 | Style = csDropDownList 207 | TabOrder = 1 208 | end 209 | object edObjSpotCount: TEdit 210 | Left = 88 211 | Top = 49 212 | Width = 25 213 | Height = 21 214 | TabOrder = 2 215 | Text = '10' 216 | end 217 | object UpDown4: TUpDown 218 | Left = 113 219 | Top = 49 220 | Width = 16 221 | Height = 21 222 | Associate = edObjSpotCount 223 | Min = 1 224 | Max = 50 225 | Position = 10 226 | TabOrder = 3 227 | end 228 | object edObjSpotSize: TEdit 229 | Left = 208 230 | Top = 51 231 | Width = 25 232 | Height = 21 233 | TabOrder = 4 234 | Text = '25' 235 | end 236 | object UpDown5: TUpDown 237 | Left = 233 238 | Top = 51 239 | Width = 16 240 | Height = 21 241 | Associate = edObjSpotSize 242 | Min = 10 243 | Position = 25 244 | TabOrder = 5 245 | end 246 | end 247 | end 248 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.NewMapForm.pas: -------------------------------------------------------------------------------- 1 | unit WorldEditor.NewMapForm; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 7 | System.Classes, Vcl.Graphics, 8 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Buttons, Vcl.ComCtrls; 9 | 10 | type 11 | TfNew = class(TForm) 12 | btnClose: TBitBtn; 13 | GroupBox1: TGroupBox; 14 | btTerFill: TBitBtn; 15 | cbTerrain: TComboBox; 16 | GroupBox2: TGroupBox; 17 | btObjFill: TBitBtn; 18 | cbObjects: TComboBox; 19 | btGen: TBitBtn; 20 | cbFloor: TComboBox; 21 | cbWall: TComboBox; 22 | edNum: TEdit; 23 | UpDown1: TUpDown; 24 | GroupBox3: TGroupBox; 25 | btAddTerSpot: TBitBtn; 26 | cbTerSpot: TComboBox; 27 | edTerSpotCount: TEdit; 28 | UpDown2: TUpDown; 29 | edTerSpotSize: TEdit; 30 | UpDown3: TUpDown; 31 | GroupBox4: TGroupBox; 32 | btAddObjSpot: TBitBtn; 33 | cbObjSpot: TComboBox; 34 | edObjSpotCount: TEdit; 35 | UpDown4: TUpDown; 36 | edObjSpotSize: TEdit; 37 | UpDown5: TUpDown; 38 | procedure btTerFillClick(Sender: TObject); 39 | procedure btObjFillClick(Sender: TObject); 40 | procedure btGenClick(Sender: TObject); 41 | procedure btAddTerSpotClick(Sender: TObject); 42 | procedure btAddObjSpotClick(Sender: TObject); 43 | private 44 | { Private declarations } 45 | public 46 | { Public declarations } 47 | end; 48 | 49 | var 50 | fNew: TfNew; 51 | 52 | implementation 53 | 54 | {$R *.dfm} 55 | 56 | uses WorldEditor.Classes, WorldEditor.MainForm, ForgottenSaga.Entities; 57 | 58 | procedure TfNew.btAddObjSpotClick(Sender: TObject); 59 | var 60 | G: TMapGenerator; 61 | I, C: Integer; 62 | begin 63 | fMain.ObjListBox.ItemIndex := fNew.cbObjSpot.ItemIndex; 64 | G := TMapGenerator.Create; 65 | G.Map := Editor.CurrentMap; 66 | try 67 | G.Num := StrToIntDef(edObjSpotSize.Text, 25); 68 | C := StrToIntDef(edObjSpotCount.Text, 10); 69 | for I := 1 to C do 70 | G.AddSpot(fMain.GetRealTile(cbObjSpot.ItemIndex, ltObjects), lrObjects); 71 | finally 72 | G.Free; 73 | end; 74 | Editor.Modified := True; 75 | fMain.UpdateCaption(); 76 | fMain.Refresh; 77 | end; 78 | 79 | procedure TfNew.btAddTerSpotClick(Sender: TObject); 80 | var 81 | G: TMapGenerator; 82 | I, C: Integer; 83 | begin 84 | fMain.TerListBox.ItemIndex := fNew.cbTerSpot.ItemIndex; 85 | G := TMapGenerator.Create; 86 | G.Map := Editor.CurrentMap; 87 | try 88 | G.Num := StrToIntDef(edTerSpotSize.Text, 25); 89 | C := StrToIntDef(edTerSpotCount.Text, 10); 90 | for I := 1 to C do 91 | G.AddSpot(fMain.GetRealTile(cbTerSpot.ItemIndex, ltTerrain), lrTerrain); 92 | finally 93 | G.Free; 94 | end; 95 | Editor.Modified := True; 96 | fMain.UpdateCaption(); 97 | fMain.Refresh; 98 | end; 99 | 100 | procedure TfNew.btGenClick(Sender: TObject); 101 | var 102 | G: TMapGenerator; 103 | I: Integer; 104 | begin 105 | G := TMapGenerator.Create; 106 | G.Map := Editor.CurrentMap; 107 | try 108 | G.MGTiles.Wall := (fMain.GetRealTile(cbWall.ItemIndex, ltTerrain)); 109 | G.MGTiles.Floor := (fMain.GetRealTile(cbFloor.ItemIndex, ltTerrain)); 110 | G.Num := StrToIntDef(edNum.Text, 7); 111 | G.Map.Clear; 112 | G.Map.FillLayer(lrTerrain, G.MGTiles.Wall); 113 | G.Start := Point(TMap.Size.Width div 2, TMap.Size.Height div 2); 114 | G.GenCave(); 115 | finally 116 | G.Free; 117 | end; 118 | Editor.Modified := True; 119 | fMain.UpdateCaption(); 120 | fMain.Refresh; 121 | end; 122 | 123 | procedure TfNew.btObjFillClick(Sender: TObject); 124 | begin 125 | fMain.ObjListBox.ItemIndex := fNew.cbObjects.ItemIndex; 126 | fMain.ObjListBoxClick(Self); 127 | Editor.CurrentMap.FillLayer(lrObjects, Editor.Tile); 128 | Editor.Modified := True; 129 | fMain.UpdateCaption(); 130 | fMain.Refresh; 131 | end; 132 | 133 | procedure TfNew.btTerFillClick(Sender: TObject); 134 | begin 135 | fMain.TerListBox.ItemIndex := fNew.cbTerrain.ItemIndex; 136 | fMain.TerListBoxClick(Self); 137 | Editor.CurrentMap.FillLayer(lrTerrain, Editor.Tile); 138 | Editor.Modified := True; 139 | fMain.UpdateCaption(); 140 | fMain.Refresh; 141 | end; 142 | 143 | end. 144 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.ProgressBarForm.dfm: -------------------------------------------------------------------------------- 1 | object fProgressBar: TfProgressBar 2 | Left = 0 3 | Top = 0 4 | BorderIcons = [] 5 | BorderStyle = bsNone 6 | Caption = 'fProgressBar' 7 | ClientHeight = 87 8 | ClientWidth = 593 9 | Color = clBtnFace 10 | Font.Charset = DEFAULT_CHARSET 11 | Font.Color = clWindowText 12 | Font.Height = -11 13 | Font.Name = 'Tahoma' 14 | Font.Style = [] 15 | OldCreateOrder = False 16 | OnCreate = FormCreate 17 | PixelsPerInch = 96 18 | TextHeight = 13 19 | object ProgressBar1: TProgressBar 20 | Left = 0 21 | Top = 0 22 | Width = 593 23 | Height = 87 24 | Align = alClient 25 | TabOrder = 0 26 | end 27 | object Timer1: TTimer 28 | OnTimer = Timer1Timer 29 | Left = 216 30 | Top = 32 31 | end 32 | end 33 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.ProgressBarForm.pas: -------------------------------------------------------------------------------- 1 | unit WorldEditor.ProgressBarForm; 2 | 3 | interface 4 | 5 | uses 6 | Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, 7 | System.Classes, Vcl.Graphics, 8 | Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ExtCtrls; 9 | 10 | type 11 | TNotifyEvent = procedure of object; 12 | 13 | type 14 | TfProgressBar = class(TForm) 15 | ProgressBar1: TProgressBar; 16 | Timer1: TTimer; 17 | procedure FormCreate(Sender: TObject); 18 | procedure Timer1Timer(Sender: TObject); 19 | private 20 | FIsFinish: Boolean; 21 | FSpeed: Integer; 22 | procedure Clear; 23 | procedure Finish; 24 | procedure SetIsFinish(const Value: Boolean); 25 | procedure SetSpeed(const Value: Integer); 26 | public 27 | OnAct: TNotifyEvent; 28 | property IsFinish: Boolean read FIsFinish write SetIsFinish; 29 | property Speed: Integer read FSpeed write SetSpeed; 30 | procedure Start; 31 | end; 32 | 33 | var 34 | fProgressBar: TfProgressBar; 35 | 36 | implementation 37 | 38 | uses Math; 39 | 40 | {$R *.dfm} 41 | { TfProgressBar } 42 | 43 | procedure TfProgressBar.Clear; 44 | begin 45 | IsFinish := False; 46 | ProgressBar1.Position := 0; 47 | end; 48 | 49 | procedure TfProgressBar.Finish; 50 | begin 51 | IsFinish := True; 52 | Timer1.Enabled := False; 53 | ModalResult := mrOk; 54 | if Assigned(OnAct) then 55 | OnAct; 56 | end; 57 | 58 | procedure TfProgressBar.FormCreate(Sender: TObject); 59 | begin 60 | Clear; 61 | Speed := 1; 62 | Timer1.Enabled := False; 63 | end; 64 | 65 | procedure TfProgressBar.SetIsFinish(const Value: Boolean); 66 | begin 67 | FIsFinish := Value; 68 | end; 69 | 70 | procedure TfProgressBar.SetSpeed(const Value: Integer); 71 | begin 72 | FSpeed := Math.EnsureRange(Value, 1, 100); 73 | end; 74 | 75 | procedure TfProgressBar.Start; 76 | begin 77 | Clear; 78 | Timer1.Interval := 100 div Speed; 79 | Timer1.Enabled := True; 80 | end; 81 | 82 | procedure TfProgressBar.Timer1Timer(Sender: TObject); 83 | begin 84 | if ProgressBar1.Position >= ProgressBar1.Max then 85 | Finish; 86 | ProgressBar1.Position := ProgressBar1.Position + 1; 87 | end; 88 | 89 | end. 90 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.dof: -------------------------------------------------------------------------------- 1 | [FileVersion] 2 | Version=7.0 3 | [Compiler] 4 | A=8 5 | B=0 6 | C=1 7 | D=1 8 | E=0 9 | F=0 10 | G=1 11 | H=1 12 | I=1 13 | J=0 14 | K=0 15 | L=1 16 | M=0 17 | N=1 18 | O=1 19 | P=1 20 | Q=0 21 | R=0 22 | S=0 23 | T=0 24 | U=0 25 | V=1 26 | W=0 27 | X=1 28 | Y=1 29 | Z=1 30 | ShowHints=1 31 | ShowWarnings=1 32 | UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; 33 | NamespacePrefix= 34 | SymbolDeprecated=1 35 | SymbolLibrary=1 36 | SymbolPlatform=1 37 | UnitLibrary=1 38 | UnitPlatform=1 39 | UnitDeprecated=1 40 | HResultCompat=1 41 | HidingMember=1 42 | HiddenVirtual=1 43 | Garbage=1 44 | BoundsError=1 45 | ZeroNilCompat=1 46 | StringConstTruncated=1 47 | ForLoopVarVarPar=1 48 | TypedConstVarPar=1 49 | AsgToTypedConst=1 50 | CaseLabelRange=1 51 | ForVariable=1 52 | ConstructingAbstract=1 53 | ComparisonFalse=1 54 | ComparisonTrue=1 55 | ComparingSignedUnsigned=1 56 | CombiningSignedUnsigned=1 57 | UnsupportedConstruct=1 58 | FileOpen=1 59 | FileOpenUnitSrc=1 60 | BadGlobalSymbol=1 61 | DuplicateConstructorDestructor=1 62 | InvalidDirective=1 63 | PackageNoLink=1 64 | PackageThreadVar=1 65 | ImplicitImport=1 66 | HPPEMITIgnored=1 67 | NoRetVal=1 68 | UseBeforeDef=1 69 | ForLoopVarUndef=1 70 | UnitNameMismatch=1 71 | NoCFGFileFound=1 72 | MessageDirective=1 73 | ImplicitVariants=1 74 | UnicodeToLocale=1 75 | LocaleToUnicode=1 76 | ImagebaseMultiple=1 77 | SuspiciousTypecast=1 78 | PrivatePropAccessor=1 79 | UnsafeType=0 80 | UnsafeCode=0 81 | UnsafeCast=0 82 | [Linker] 83 | MapFile=0 84 | OutputObjs=0 85 | ConsoleApp=1 86 | DebugInfo=0 87 | RemoteSymbols=0 88 | MinStackSize=16384 89 | MaxStackSize=1048576 90 | ImageBase=4194304 91 | ExeDescription= 92 | [Directories] 93 | OutputDir= 94 | UnitOutputDir= 95 | PackageDLLOutputDir= 96 | PackageDCPOutputDir= 97 | SearchPath= 98 | Packages=vcl;rtl;vclie;xmlrtl;inet;inetdbbde;inetdbxpress;vclx;dbrtl;soaprtl;dsnap;VclSmp;dbexpress;vcldb;dbxcds;adortl;ibxpress;vclactnband;bdertl;vclshlctrls;dclOfficeXP;SynEdit_R7;vclZipForged7 99 | Conditionals= 100 | DebugSourceDirs= 101 | UsePackages=0 102 | [Parameters] 103 | RunParams= 104 | HostApplication= 105 | Launcher= 106 | UseLauncher=0 107 | DebugCWD= 108 | [Version Info] 109 | IncludeVerInfo=0 110 | AutoIncBuild=0 111 | MajorVer=1 112 | MinorVer=0 113 | Release=0 114 | Build=0 115 | Debug=0 116 | PreRelease=0 117 | Special=0 118 | Private=0 119 | DLL=0 120 | Locale=1049 121 | CodePage=1251 122 | [Version Info Keys] 123 | CompanyName= 124 | FileDescription= 125 | FileVersion=1.0.0.0 126 | InternalName= 127 | LegalCopyright= 128 | LegalTrademarks= 129 | OriginalFilename= 130 | ProductName= 131 | ProductVersion=1.0.0.0 132 | Comments= 133 | [HistoryLists\hlUnitAliases] 134 | Count=1 135 | Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; 136 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.dpr: -------------------------------------------------------------------------------- 1 | program WorldEditor; 2 | 3 | uses 4 | Forms, 5 | Engine in '..\VCLEngine\Engine.pas', 6 | WorldEditor.MainForm in 'WorldEditor.MainForm.pas' {fMain}, 7 | WorldEditor.Classes in 'WorldEditor.Classes.pas', 8 | ForgottenSaga.Classes in '..\ForgottenSaga.Classes.pas', 9 | ForgottenSaga.Scenes in '..\ForgottenSaga.Scenes.pas', 10 | ForgottenSaga.Entities in '..\ForgottenSaga.Entities.pas', 11 | WorldEditor.NewMapForm in 'WorldEditor.NewMapForm.pas' {fNew}, 12 | BeaRLibItems in '..\includes\BeaRLibItems.pas', 13 | WorldEditor.ProgressBarForm in 'WorldEditor.ProgressBarForm.pas' {fProgressBar}; 14 | 15 | {$R *.res} 16 | 17 | begin 18 | Application.Initialize; 19 | Application.Title := 'Forgotten Saga WorldEditor'; 20 | Application.CreateForm(TfMain, fMain); 21 | Application.CreateForm(TfNew, fNew); 22 | Application.CreateForm(TfProgressBar, fProgressBar); 23 | Application.Run; 24 | 25 | end. 26 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.lpi: -------------------------------------------------------------------------------- 1 | <?xml version="1.0" encoding="UTF-8"?> 2 | <CONFIG> 3 | <ProjectOptions> 4 | <Version Value="9"/> 5 | <PathDelim Value="\"/> 6 | <General> 7 | <Flags> 8 | <UseDefaultCompilerOptions Value="True"/> 9 | </Flags> 10 | <SessionStorage Value="InProjectDir"/> 11 | <MainUnit Value="0"/> 12 | <Title Value="WorldEditor"/> 13 | <ResourceType Value="res"/> 14 | <UseXPManifest Value="True"/> 15 | <Icon Value="0"/> 16 | </General> 17 | <i18n> 18 | <EnableI18N LFM="False"/> 19 | </i18n> 20 | <VersionInfo> 21 | <StringTable ProductVersion=""/> 22 | </VersionInfo> 23 | <BuildModes Count="1"> 24 | <Item1 Name="Default" Default="True"/> 25 | </BuildModes> 26 | <PublishOptions> 27 | <Version Value="2"/> 28 | </PublishOptions> 29 | <RunParams> 30 | <local> 31 | <FormatVersion Value="1"/> 32 | </local> 33 | </RunParams> 34 | <RequiredPackages Count="1"> 35 | <Item1> 36 | <PackageName Value="LCL"/> 37 | </Item1> 38 | </RequiredPackages> 39 | <Units Count="1"> 40 | <Unit0> 41 | <Filename Value="WorldEditor.dpr"/> 42 | <IsPartOfProject Value="True"/> 43 | </Unit0> 44 | </Units> 45 | </ProjectOptions> 46 | <CompilerOptions> 47 | <Version Value="11"/> 48 | <PathDelim Value="\"/> 49 | <Target> 50 | <Filename Value="WorldEditor"/> 51 | </Target> 52 | <SearchPaths> 53 | <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/> 54 | </SearchPaths> 55 | <Linking> 56 | <Options> 57 | <Win32> 58 | <GraphicApplication Value="True"/> 59 | </Win32> 60 | </Options> 61 | </Linking> 62 | </CompilerOptions> 63 | <Debugging> 64 | <Exceptions Count="3"> 65 | <Item1> 66 | <Name Value="EAbort"/> 67 | </Item1> 68 | <Item2> 69 | <Name Value="ECodetoolError"/> 70 | </Item2> 71 | <Item3> 72 | <Name Value="EFOpenError"/> 73 | </Item3> 74 | </Exceptions> 75 | </Debugging> 76 | </CONFIG> 77 | -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/sources/worldeditor/WorldEditor.res -------------------------------------------------------------------------------- /sources/worldeditor/WorldEditor.todo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/sources/worldeditor/WorldEditor.todo -------------------------------------------------------------------------------- /sources/worldeditor/images.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/sources/worldeditor/images.bmp -------------------------------------------------------------------------------- /temp/dev.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/temp/dev.txt -------------------------------------------------------------------------------- /temp/items.txt: -------------------------------------------------------------------------------- 1 | inv+ Item,Sword,3,Sword,Metal,),128,255,255,1,12 2 | 3 | inv+ Item,Minor Healing Potion,1,,,!,255,100,100,1,1 4 | inv+ Item,Lesser Healing Potion,2,,,!,255,75,75,1,1 5 | inv+ Item,Healing Potion,3,,,!,255,50,50,1,1 6 | 7 | 8 | -------------------------------------------------------------------------------- /temp/quests.txt: -------------------------------------------------------------------------------- 1 | +----+---------------------------------------------+--------------------------------------------------------+ 2 | | NN | Название | Предметы | 3 | +----+---------------------------------------------+--------------------------------------------------------+ 4 | | 1 | Орочий магический источник | Crystal Phial, Filled Crystal Phial | 5 | | 2 | Пакет для рыбака | Pack | 6 | | 3 | Портал в другой мир | Black Ring | 7 | | 4 | Кожа - кожевнику | Boar Pelt | 8 | | 5 | | | 9 | | 6 | | | 10 | | 7 | Мясо для повара | Elk Meat | 11 | | 8 | Говорящий каменный идол | --- | 12 | | 9 | Зеленая вода | Water Pitcher | 13 | | 10 | Гноллы-грабители | Crate | 14 | +----+---------------------------------------------+--------------------------------------------------------+ -------------------------------------------------------------------------------- /temp/todo.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/devapromix/forgotten-saga/1502c7d558327edc9ccdfb7d385b8afefc99df1d/temp/todo.txt -------------------------------------------------------------------------------- /upx.bat: -------------------------------------------------------------------------------- 1 | "d:\usr\upx\upx.exe" *.dll 2 | "d:\usr\upx\upx.exe" *.exe --------------------------------------------------------------------------------