From 3cb32783abafa8e952bb48ca942aaa87b98f4a40 Mon Sep 17 00:00:00 2001 From: Krzysztof Sikorski Date: Sun, 27 Oct 2024 11:58:50 +0100 Subject: [PATCH] Save all changes --- .editorconfig | 18 + .editorconfig-checker.json | 6 + 2013/daemon/.bzrignore | 6 + 2013/daemon/.editorconfig | 17 + 2013/daemon/LICENSE | 20 + 2013/daemon/README.md | 68 + 2013/daemon/cron.php | 182 + 2013/daemon/daemon.sql | 525 + 2013/daemon/lib/daemon.php | 102 + 2013/daemon/lib/daemon/bosscombat.php | 100 + 2013/daemon/lib/daemon/caernsiege.php | 270 + 2013/daemon/lib/daemon/combat.php | 164 + 2013/daemon/lib/daemon/combat/log.php | 117 + 2013/daemon/lib/daemon/combat/unit.php | 261 + 2013/daemon/lib/daemon/config.php | 56 + 2013/daemon/lib/daemon/controller.php | 158 + 2013/daemon/lib/daemon/dbclient.php | 148 + 2013/daemon/lib/daemon/dbconfig.php | 87 + 2013/daemon/lib/daemon/dbobject.php | 108 + 2013/daemon/lib/daemon/dbobject/character.php | 165 + .../lib/daemon/dbobject/characterdata.php | 609 + 2013/daemon/lib/daemon/dbobject/clan.php | 91 + .../daemon/lib/daemon/dbobject/combatunit.php | 63 + 2013/daemon/lib/daemon/dbobject/event.php | 11 + 2013/daemon/lib/daemon/dbobject/item.php | 160 + .../lib/daemon/dbobject/itemtemplate.php | 20 + 2013/daemon/lib/daemon/dbobject/location.php | 303 + 2013/daemon/lib/daemon/dbobject/monster.php | 49 + 2013/daemon/lib/daemon/dbobject/player.php | 387 + 2013/daemon/lib/daemon/dictionary.php | 85 + 2013/daemon/lib/daemon/duel.php | 182 + 2013/daemon/lib/daemon/email.php | 28 + 2013/daemon/lib/daemon/errorhandler.php | 47 + 2013/daemon/lib/daemon/event.php | 50 + 2013/daemon/lib/daemon/event/deadend.php | 14 + 2013/daemon/lib/daemon/event/help.php | 12 + 2013/daemon/lib/daemon/event/intro.php | 31 + 2013/daemon/lib/daemon/eventinterface.php | 27 + 2013/daemon/lib/daemon/forum.php | 119 + 2013/daemon/lib/daemon/inventory.php | 154 + 2013/daemon/lib/daemon/item.php | 54 + 2013/daemon/lib/daemon/item/givespell.php | 33 + 2013/daemon/lib/daemon/item/heal.php | 32 + 2013/daemon/lib/daemon/item/teleport.php | 15 + 2013/daemon/lib/daemon/iteminterface.php | 28 + 2013/daemon/lib/daemon/math.php | 57 + 2013/daemon/lib/daemon/monstercombat.php | 183 + 2013/daemon/lib/daemon/msgqueue.php | 27 + 2013/daemon/lib/daemon/news.php | 72 + 2013/daemon/lib/daemon/scyzoryk.php | 73 + 2013/daemon/lib/daemon/scyzoryk/browser.php | 235 + .../daemon/lib/daemon/scyzoryk/controller.php | 81 + 2013/daemon/lib/daemon/scyzoryk/dbrow.php | 151 + 2013/daemon/lib/daemon/scyzoryk/editor.php | 139 + 2013/daemon/lib/daemon/scyzoryk/filter.php | 43 + 2013/daemon/lib/daemon/service.php | 47 + 2013/daemon/lib/daemon/service/bank.php | 95 + 2013/daemon/lib/daemon/service/healer.php | 86 + 2013/daemon/lib/daemon/service/shop.php | 202 + 2013/daemon/lib/daemon/service/temple.php | 333 + 2013/daemon/lib/daemon/spell.php | 63 + 2013/daemon/lib/daemon/spell/identify.php | 15 + .../daemon/lib/daemon/spell/scancharacter.php | 69 + 2013/daemon/lib/daemon/spell/scanitem.php | 65 + 2013/daemon/lib/daemon/spell/scanmonster.php | 93 + 2013/daemon/lib/daemon/spell/scout.php | 56 + 2013/daemon/lib/daemon/spellinterface.php | 32 + 2013/daemon/lib/daemon/statistics.php | 233 + 2013/daemon/lib/daemon/view.php | 133 + 2013/daemon/lib/jsmin.php | 291 + 2013/daemon/php.ini | 39 + 2013/daemon/public/.htaccess | 10 + 2013/daemon/public/_init.php | 31 + 2013/daemon/public/account.php | 63 + 2013/daemon/public/auth.php | 46 + 2013/daemon/public/character.php | 89 + 2013/daemon/public/chat.php | 61 + 2013/daemon/public/clan.php | 129 + 2013/daemon/public/duel.php | 39 + 2013/daemon/public/edit-account.php | 41 + 2013/daemon/public/edit-character.php | 60 + 2013/daemon/public/index.php | 27 + 2013/daemon/public/inventory.php | 106 + 2013/daemon/public/mail.php | 67 + 2013/daemon/public/map.php | 86 + 2013/daemon/public/news.php | 33 + 2013/daemon/public/not-implemented.html | 6 + 2013/daemon/public/register.php | 40 + 2013/daemon/public/reset-password.php | 38 + 2013/daemon/public/respawn.php | 59 + 2013/daemon/public/robots.txt | 2 + 2013/daemon/public/rules.php | 21 + 2013/daemon/public/scyzoryk/arena.php | 126 + .../daemon/public/scyzoryk/character-edit.php | 98 + 2013/daemon/public/scyzoryk/characters.php | 30 + .../public/scyzoryk/combat-unit-edit.php | 51 + 2013/daemon/public/scyzoryk/combat-units.php | 61 + .../public/scyzoryk/config-generator.php | 51 + 2013/daemon/public/scyzoryk/config.php | 49 + 2013/daemon/public/scyzoryk/cron-ui.php | 20 + 2013/daemon/public/scyzoryk/event-edit.php | 45 + 2013/daemon/public/scyzoryk/events.php | 43 + 2013/daemon/public/scyzoryk/faction-edit.php | 65 + 2013/daemon/public/scyzoryk/factions.php | 40 + 2013/daemon/public/scyzoryk/generator.php | 205 + 2013/daemon/public/scyzoryk/index.php | 51 + 2013/daemon/public/scyzoryk/info.php | 19 + 2013/daemon/public/scyzoryk/item-edit.php | 72 + .../public/scyzoryk/item-template-edit.php | 45 + .../daemon/public/scyzoryk/item-templates.php | 42 + 2013/daemon/public/scyzoryk/items.php | 62 + 2013/daemon/public/scyzoryk/location-edit.php | 122 + .../public/scyzoryk/location-event-edit.php | 43 + .../public/scyzoryk/location-monster-edit.php | 42 + .../public/scyzoryk/location-path-edit.php | 44 + 2013/daemon/public/scyzoryk/locations.php | 60 + 2013/daemon/public/scyzoryk/map-edit.php | 45 + 2013/daemon/public/scyzoryk/maps.php | 39 + .../public/scyzoryk/monster-drop-edit.php | 42 + 2013/daemon/public/scyzoryk/monster-edit.php | 70 + 2013/daemon/public/scyzoryk/monsters.php | 58 + 2013/daemon/public/scyzoryk/news.php | 47 + 2013/daemon/public/scyzoryk/player-edit.php | 65 + 2013/daemon/public/scyzoryk/players.php | 31 + 2013/daemon/public/scyzoryk/region-edit.php | 48 + 2013/daemon/public/scyzoryk/regions.php | 39 + 2013/daemon/public/scyzoryk/reset.php | 91 + 2013/daemon/public/scyzoryk/search.php | 53 + 2013/daemon/public/scyzoryk/service-edit.php | 64 + 2013/daemon/public/scyzoryk/services.php | 39 + 2013/daemon/public/scyzoryk/title-edit.php | 46 + 2013/daemon/public/scyzoryk/titles.php | 39 + 2013/daemon/public/service.php | 90 + 2013/daemon/public/static/badziew.jpg | Bin 0 -> 16256 bytes 2013/daemon/public/static/badziew2.jpg | Bin 0 -> 6617 bytes 2013/daemon/public/static/badziew3.jpg | Bin 0 -> 10673 bytes 2013/daemon/public/static/badziew4.jpg | Bin 0 -> 13476 bytes 2013/daemon/public/static/badziew5.jpg | Bin 0 -> 19881 bytes 2013/daemon/public/static/basic.css | 67 + 2013/daemon/public/static/biglogo.jpg | Bin 0 -> 41967 bytes 2013/daemon/public/static/common.js | 4 + 2013/daemon/public/static/common.src.js | 23 + 2013/daemon/public/static/dark/bg.jpg | Bin 0 -> 86854 bytes 2013/daemon/public/static/dark/ekwip.png | Bin 0 -> 17030 bytes 2013/daemon/public/static/dark/forum.png | Bin 0 -> 17337 bytes 2013/daemon/public/static/dark/klan.png | Bin 0 -> 16620 bytes 2013/daemon/public/static/dark/konto.png | Bin 0 -> 16523 bytes 2013/daemon/public/static/dark/logo.jpg | Bin 0 -> 10941 bytes 2013/daemon/public/static/dark/otoczenie.png | Bin 0 -> 17321 bytes 2013/daemon/public/static/dark/poczta.png | Bin 0 -> 16826 bytes 2013/daemon/public/static/dark/pomoc.png | Bin 0 -> 17799 bytes 2013/daemon/public/static/dark/postac.png | Bin 0 -> 16819 bytes 2013/daemon/public/static/dark/ranking.png | Bin 0 -> 16659 bytes 2013/daemon/public/static/dark/skin.css | 30 + 2013/daemon/public/static/favicon.png | Bin 0 -> 238 bytes 2013/daemon/public/static/feed.png | Bin 0 -> 689 bytes .../public/static/item-types/accesory.gif | Bin 0 -> 9349 bytes .../daemon/public/static/item-types/armor.gif | Bin 0 -> 11526 bytes .../daemon/public/static/item-types/boots.gif | Bin 0 -> 11917 bytes .../public/static/item-types/gloves.gif | Bin 0 -> 10783 bytes .../public/static/item-types/helmet.gif | Bin 0 -> 10512 bytes 2013/daemon/public/static/item-types/item.gif | Bin 0 -> 10103 bytes .../public/static/item-types/pendant.gif | Bin 0 -> 12595 bytes .../public/static/item-types/weapon1h.gif | Bin 0 -> 12853 bytes .../public/static/item-types/weapon2h.gif | Bin 0 -> 10126 bytes 2013/daemon/public/static/light/bg.jpg | Bin 0 -> 64371 bytes 2013/daemon/public/static/light/ekwip.png | Bin 0 -> 16825 bytes 2013/daemon/public/static/light/forum.png | Bin 0 -> 17112 bytes 2013/daemon/public/static/light/klan.png | Bin 0 -> 16351 bytes 2013/daemon/public/static/light/konto.png | Bin 0 -> 16239 bytes 2013/daemon/public/static/light/logo.jpg | Bin 0 -> 12673 bytes 2013/daemon/public/static/light/otoczenie.png | Bin 0 -> 16738 bytes 2013/daemon/public/static/light/poczta.png | Bin 0 -> 16302 bytes 2013/daemon/public/static/light/pomoc.png | Bin 0 -> 17680 bytes 2013/daemon/public/static/light/postac.png | Bin 0 -> 16444 bytes 2013/daemon/public/static/light/ranking.png | Bin 0 -> 16302 bytes 2013/daemon/public/static/light/skin.css | 31 + .../public/static/maps/Jary_Czyngijskie.jpg | Bin 0 -> 117752 bytes .../daemon/public/static/maps/gory_kranca.jpg | Bin 0 -> 60712 bytes .../public/static/maps/goryczerwone.jpg | Bin 0 -> 116403 bytes 2013/daemon/public/static/maps/kungfu1.jpg | Bin 0 -> 56394 bytes 2013/daemon/public/static/maps/mainmap.jpg | Bin 0 -> 223703 bytes .../public/static/maps/prowincja_yang.jpg | Bin 0 -> 138574 bytes .../public/static/maps/prowincja_yin.jpg | Bin 0 -> 122259 bytes .../daemon/public/static/maps/wieczny_las.jpg | Bin 0 -> 132533 bytes 2013/daemon/public/static/monastery04.png | Bin 0 -> 319751 bytes 2013/daemon/public/static/pack-css.php | 55 + 2013/daemon/public/static/reyka.jpg | Bin 0 -> 7628 bytes 2013/daemon/public/static/scyzoryk.js | 4 + 2013/daemon/public/static/scyzoryk.src.js | 56 + 2013/daemon/public/static/search.png | Bin 0 -> 935 bytes 2013/daemon/public/stats-battles.php | 56 + 2013/daemon/public/stats-characters.php | 94 + 2013/daemon/public/stats-clans.php | 60 + 2013/daemon/public/stats-duels.php | 73 + 2013/daemon/public/stats.php | 74 + 2013/daemon/public/temple.php | 78 + 2013/daemon/tpl/account.xml | 66 + 2013/daemon/tpl/character.xml | 79 + 2013/daemon/tpl/chat.xml | 32 + 2013/daemon/tpl/clan.xml | 136 + 2013/daemon/tpl/duel.xml | 12 + 2013/daemon/tpl/duelcombat.xml | 19 + 2013/daemon/tpl/edit-account.xml | 33 + 2013/daemon/tpl/edit-character.xml | 46 + 2013/daemon/tpl/event.xml | 12 + 2013/daemon/tpl/event/deadend.xml | 3 + 2013/daemon/tpl/event/intro.xml | 9 + 2013/daemon/tpl/index.xml | 49 + 2013/daemon/tpl/inventory.xml | 57 + 2013/daemon/tpl/macros.xml | 108 + 2013/daemon/tpl/mail.xml | 32 + 2013/daemon/tpl/map.xml | 116 + 2013/daemon/tpl/monstercombat.xml | 43 + 2013/daemon/tpl/news.xml | 19 + 2013/daemon/tpl/register.xml | 25 + 2013/daemon/tpl/reset-password.xml | 26 + 2013/daemon/tpl/respawn.xml | 40 + 2013/daemon/tpl/rules.xml | 75 + 2013/daemon/tpl/scyzoryk/arena.xml | 74 + 2013/daemon/tpl/scyzoryk/character-edit.xml | 178 + 2013/daemon/tpl/scyzoryk/characters.xml | 32 + 2013/daemon/tpl/scyzoryk/combat-unit-edit.xml | 125 + 2013/daemon/tpl/scyzoryk/combat-units.xml | 47 + 2013/daemon/tpl/scyzoryk/config-generator.xml | 76 + 2013/daemon/tpl/scyzoryk/config.xml | 126 + 2013/daemon/tpl/scyzoryk/event-edit.xml | 59 + 2013/daemon/tpl/scyzoryk/events.xml | 39 + 2013/daemon/tpl/scyzoryk/faction-edit.xml | 88 + 2013/daemon/tpl/scyzoryk/factions.xml | 39 + 2013/daemon/tpl/scyzoryk/generator.xml | 98 + 2013/daemon/tpl/scyzoryk/index.xml | 35 + 2013/daemon/tpl/scyzoryk/item-edit.xml | 160 + .../tpl/scyzoryk/item-template-edit.xml | 126 + 2013/daemon/tpl/scyzoryk/item-templates.xml | 39 + 2013/daemon/tpl/scyzoryk/items.xml | 76 + 2013/daemon/tpl/scyzoryk/location-edit.xml | 259 + .../tpl/scyzoryk/location-event-edit.xml | 43 + .../tpl/scyzoryk/location-monster-edit.xml | 35 + .../tpl/scyzoryk/location-path-edit.xml | 42 + 2013/daemon/tpl/scyzoryk/locations.xml | 68 + 2013/daemon/tpl/scyzoryk/macros.xml | 39 + 2013/daemon/tpl/scyzoryk/map-edit.xml | 57 + 2013/daemon/tpl/scyzoryk/maps.xml | 43 + .../daemon/tpl/scyzoryk/monster-drop-edit.xml | 35 + 2013/daemon/tpl/scyzoryk/monster-edit.xml | 129 + 2013/daemon/tpl/scyzoryk/monsters.xml | 65 + 2013/daemon/tpl/scyzoryk/news.xml | 61 + 2013/daemon/tpl/scyzoryk/player-edit.xml | 77 + 2013/daemon/tpl/scyzoryk/players.xml | 35 + 2013/daemon/tpl/scyzoryk/region-edit.xml | 71 + 2013/daemon/tpl/scyzoryk/regions.xml | 42 + 2013/daemon/tpl/scyzoryk/reset.xml | 35 + 2013/daemon/tpl/scyzoryk/search.xml | 24 + 2013/daemon/tpl/scyzoryk/service-edit.xml | 106 + 2013/daemon/tpl/scyzoryk/services.xml | 45 + 2013/daemon/tpl/scyzoryk/title-edit.xml | 65 + 2013/daemon/tpl/scyzoryk/titles.xml | 44 + 2013/daemon/tpl/service.xml | 12 + 2013/daemon/tpl/service/bank.xml | 47 + 2013/daemon/tpl/service/healer.xml | 30 + 2013/daemon/tpl/service/shop.xml | 86 + 2013/daemon/tpl/service/temple.xml | 83 + 2013/daemon/tpl/spell/scancharacter.xml | 33 + 2013/daemon/tpl/spell/scanitem.xml | 39 + 2013/daemon/tpl/spell/scanmonster.xml | 46 + 2013/daemon/tpl/spell/scout.xml | 25 + 2013/daemon/tpl/stats-battle.xml | 19 + 2013/daemon/tpl/stats-battles.xml | 34 + 2013/daemon/tpl/stats-character.xml | 69 + 2013/daemon/tpl/stats-characters.xml | 43 + 2013/daemon/tpl/stats-clan.xml | 36 + 2013/daemon/tpl/stats-clans.xml | 35 + 2013/daemon/tpl/stats-duel.xml | 19 + 2013/daemon/tpl/stats-duels.xml | 45 + 2013/daemon/tpl/stats.xml | 67 + .../browser-extension/.editorconfig | 19 + .../browser-extension/.eslintrc.json | 45 + .../browser-extension/.gitattributes | 9 + .../browser-extension/.gitignore | 3 + .../browser-extension/CHANGELOG.md | 13 + .../browser-extension/LICENSE.txt | 287 + .../nexus-archive/browser-extension/README.md | 21 + .../browser-extension/icons/icon.png | Bin 0 -> 3066 bytes .../browser-extension/manifest.json | 38 + .../browser-extension/options/index.html | 32 + .../browser-extension/options/style.css | 3 + .../browser-extension/package-lock.json | 6466 +++++ .../browser-extension/package.json | 16 + .../browser-extension/src/background.js | 13 + .../browser-extension/src/nexusData.js | 81 + .../browser-extension/src/nexusDataQueue.js | 33 + .../browser-extension/src/nexusDataSender.js | 52 + .../browser-extension/src/options.js | 29 + .../browser-extension/src/preferences.js | 93 + .../src/webRequestMonitor.js | 86 + 2021/nexus-archive/website/.editorconfig | 35 + 2021/nexus-archive/website/.env | 12 + 2021/nexus-archive/website/.gitignore | 8 + 2021/nexus-archive/website/CHANGELOG.md | 41 + 2021/nexus-archive/website/LICENSE.txt | 287 + 2021/nexus-archive/website/README.md | 77 + .../assets/PageViewSubmissionJsonSchema.json | 45 + .../website/assets/tailwindcss/input.css | 65 + 2021/nexus-archive/website/bin/console | 18 + .../website/bin/tailwind-build-dev | 2 + .../website/bin/tailwind-build-prod | 2 + 2021/nexus-archive/website/composer.json | 113 + 2021/nexus-archive/website/composer.lock | 7716 ++++++ 2021/nexus-archive/website/config/bundles.php | 14 + .../website/config/packages/dev/debug.php | 12 + .../config/packages/dev/web_profiler.php | 14 + .../website/config/packages/doctrine.php | 56 + .../config/packages/doctrine_migrations.php | 13 + .../website/config/packages/framework.php | 25 + .../website/config/packages/lock.php | 13 + .../website/config/packages/monolog.php | 66 + .../website/config/packages/routing.php | 15 + .../website/config/packages/security.php | 62 + .../config/packages/test/web_profiler.php | 14 + .../website/config/packages/translation.php | 14 + .../website/config/packages/twig.php | 20 + .../website/config/packages/validator.php | 15 + 2021/nexus-archive/website/config/preload.php | 6 + 2021/nexus-archive/website/config/routes.php | 49 + .../nexus-archive/website/config/services.php | 66 + .../website/migrations/Version0001.php | 107 + .../website/migrations/Version0002.php | 52 + .../website/migrations/Version0003.php | 28 + .../website/migrations/Version0004.php | 75 + .../website/migrations/Version0005.php | 34 + .../website/migrations/Version0006.php | 51 + .../website/migrations/Version0007.php | 117 + .../website/migrations/Version0008.php | 36 + .../website/migrations/Version0009.php | 67 + .../website/migrations/Version0010.php | 70 + 2021/nexus-archive/website/package-lock.json | 823 + 2021/nexus-archive/website/package.json | 6 + .../website/public/css/combined.css | 1 + 2021/nexus-archive/website/public/index.php | 11 + .../website/src/Command/BaseCommand.php | 52 + .../src/Command/ExportLeaderboardsCommand.php | 149 + .../Command/UserCreateAccessTokenCommand.php | 129 + .../website/src/Command/UserCreateCommand.php | 145 + .../src/Command/WorkerParseCommand.php | 131 + .../Command/WorkerPruneDatabaseCommand.php | 34 + .../src/Contract/Config/AppParameters.php | 39 + .../website/src/Contract/Config/AppRoutes.php | 21 + .../Config/AppSerializationGroups.php | 13 + .../website/src/Contract/Config/AppTags.php | 11 + .../Doctrine/Entity/DatedEntityInterface.php | 18 + .../Entity/GamePeriodReferenceInterface.php | 14 + .../Entity/UuidPrimaryKeyInterface.php | 14 + .../src/Contract/Entity/LeaderboardTypes.php | 20 + .../Entity/Nexus/GamePeriodIdEnum.php | 14 + .../Entity/Nexus/GamePeriodInterface.php | 33 + .../Nexus/Leaderboard/EntryInterface.php | 16 + .../Nexus/Leaderboard/EntryListInterface.php | 51 + .../Entity/Nexus/LeaderboardInterface.php | 29 + .../PageViewSubmissionResultStatus.php | 14 + .../src/Contract/Service/ClockInterface.php | 15 + .../Contract/Service/Parser/ParserError.php | 11 + .../Service/Parser/ParserInterface.php | 23 + .../Service/Parser/ParserResultInterface.php | 29 + .../Parser/ParserResultProcessorInterface.php | 13 + .../Parser/ParserSelectorInterface.php | 15 + .../website/src/Contract/UserRoles.php | 38 + .../src/Controller/AboutController.php | 26 + .../src/Controller/FaviconController.php | 19 + .../website/src/Controller/HomeController.php | 26 + .../src/Controller/LeaderboardController.php | 70 + .../src/Controller/LoginController.php | 31 + .../src/Controller/SubmitJsonController.php | 59 + .../website/src/DTO/Nexus/Leaderboard.php | 65 + .../src/DTO/Nexus/Leaderboard/Entry.php | 33 + .../src/DTO/Nexus/Leaderboard/EntryList.php | 99 + .../src/DTO/PageViewSubmissionResult.php | 42 + .../DTO/PageViewSubmissionValidatorResult.php | 24 + .../website/src/DTO/ParserResult.php | 70 + .../src/Doctrine/Entity/DatedEntityTrait.php | 53 + .../src/Doctrine/Entity/Nexus/GamePeriod.php | 90 + .../src/Doctrine/Entity/Nexus/Leaderboard.php | 77 + .../Entity/Nexus/LeaderboardCategory.php | 64 + .../Entity/Nexus/LeaderboardEntry.php | 76 + .../website/src/Doctrine/Entity/PageView.php | 155 + .../website/src/Doctrine/Entity/User.php | 152 + .../src/Doctrine/Entity/UserAccessToken.php | 91 + .../Doctrine/Entity/UuidPrimaryKeyTrait.php | 45 + .../Doctrine/Repository/UserRepository.php | 38 + .../Controller/DashboardController.php | 101 + .../Controller/PageViewCrudController.php | 85 + .../UserAccessTokenCrudController.php | 48 + .../Controller/UserCrudController.php | 46 + .../website/src/EasyAdmin/Field/JsonField.php | 26 + 2021/nexus-archive/website/src/Kernel.php | 22 + .../website/src/Service/Clock.php | 24 + .../website/src/Service/DateTimeFactory.php | 30 + .../website/src/Service/MainMenuGenerator.php | 41 + .../website/src/Service/PageViewProcessor.php | 90 + .../src/Service/PageViewSubmissionHandler.php | 113 + .../Service/PageViewSubmissionValidator.php | 46 + .../src/Service/Parser/BreathFourthParser.php | 264 + .../ParserResult/ParserResultProcessor.php | 154 + .../website/src/Service/ParserSelector.php | 36 + .../Repository/Nexus/GamePeriodRepository.php | 43 + .../Nexus/LeaderboardRepository.php | 41 + .../Service/Repository/PageViewRepository.php | 87 + .../Repository/UserAccessTokenRepository.php | 79 + .../src/Service/Repository/UserRepository.php | 70 + .../website/src/Service/Serializer.php | 40 + .../website/src/Service/TokenGenerator.php | 18 + 2021/nexus-archive/website/symfony.lock | 422 + 2021/nexus-archive/website/tailwind.config.js | 12 + .../website/templates/about/index.html.twig | 57 + .../website/templates/base.html.twig | 27 + .../easyadmin/dashboard/index.html.twig | 19 + .../website/templates/home/index.html.twig | 9 + .../templates/leaderboards/index.html.twig | 50 + .../website/templates/login/index.html.twig | 22 + .../templates/submit-json/index.html.twig | 11 + 2022/portfolio-website/.editorconfig | 19 + 2022/portfolio-website/.gitignore | 1 + 2022/portfolio-website/LICENSE.txt | 21 + 2022/portfolio-website/Makefile | 10 + 2022/portfolio-website/README.md | 11 + 2022/portfolio-website/bin/tailwind-build-dev | 2 + .../portfolio-website/bin/tailwind-build-prod | 2 + 2022/portfolio-website/doc/DEVELOPMENT.md | 15 + 2022/portfolio-website/package-lock.json | 988 + 2022/portfolio-website/package.json | 5 + .../portfolio-website/public/css/combined.css | 1 + 2022/portfolio-website/public/index.html | 150 + 2022/portfolio-website/src/input.css | 63 + 2022/portfolio-website/tailwind.config.js | 11 + 2023/homepage/v1-wordpress/.editorconfig | 28 + 2023/homepage/v1-wordpress/Makefile | 66 + 2023/homepage/v1-wordpress/README.md | 10 + .../v1-wordpress/bedrock/.env.example | 28 + 2023/homepage/v1-wordpress/bedrock/.gitignore | 27 + 2023/homepage/v1-wordpress/bedrock/LICENSE.md | 19 + 2023/homepage/v1-wordpress/bedrock/README.md | 62 + .../v1-wordpress/bedrock/composer.json | 75 + .../v1-wordpress/bedrock/composer.lock | 1914 ++ .../bedrock/config/application.php | 153 + .../config/environments/development.php | 20 + .../bedrock/config/environments/staging.php | 17 + 2023/homepage/v1-wordpress/bedrock/phpcs.xml | 24 + .../web/app/languages/admin-network-pl_PL.mo | Bin 0 -> 51238 bytes .../web/app/languages/admin-network-pl_PL.po | 1491 ++ .../bedrock/web/app/languages/admin-pl_PL.mo | Bin 0 -> 555805 bytes .../bedrock/web/app/languages/admin-pl_PL.po | 16342 +++++++++++++ .../app/languages/continents-cities-pl_PL.mo | Bin 0 -> 20997 bytes .../app/languages/continents-cities-pl_PL.po | 2124 ++ ...l_PL-0cc31205f20441b3df1d1b46100f6b8d.json | 1 + ...l_PL-0ce75ad2f775d1cac9696967d484808c.json | 1 + ...l_PL-0eebe503220d4a00341eb011b92769b4.json | 1 + ...l_PL-17179a5f2930647c89151e365f843b6e.json | 1 + ...l_PL-1780a2033cf98d69ce13c2e5c8510004.json | 1 + ...l_PL-1a0cd6a7128913b15c1a10dd68951869.json | 1 + ...l_PL-1bba9045bb07c89671c88a3f328548e8.json | 1 + ...l_PL-1c4303f02ff93b290e9faad991eeb06f.json | 1 + ...l_PL-1d17475f620f63a92e2c5d2681c51ee8.json | 1 + ...l_PL-270d72d1cff17227d37f3244759cbecb.json | 1 + ...l_PL-28b3c3d595952907e08d98287077426c.json | 1 + ...l_PL-2b390f85a3048c5b4255fb45960b6514.json | 1 + ...l_PL-2c5d274ea625dd91556554ad82901529.json | 1 + ...l_PL-320f4ad9792aaa6dedb1e71cbdf85d57.json | 1 + ...l_PL-440127dd25bde48a531ded36f33e927b.json | 1 + ...l_PL-49c6d4acf36cf3aca9f0b2a77617304f.json | 1 + ...l_PL-4a38fe1c0c45989e44682ba6109d9f46.json | 1 + ...l_PL-4bfa11da57ff2600004bb500368247f4.json | 1 + ...l_PL-50278328b502f4eb3f2b8b7ab49324a1.json | 1 + ...l_PL-5251f7623766a714c8207c7edb938628.json | 1 + ...l_PL-529362903a5a05b34b06b5e793fb4cf8.json | 1 + ...l_PL-569e85ef168299eb8c8f24d8ef8c8a78.json | 1 + ...l_PL-6025add6bde16aaeb12787d250f9b414.json | 1 + ...l_PL-60d06fac6f98e8e8f0ec5a945738b660.json | 1 + ...l_PL-68f2cec7514bf8563c723a4d675fcfe6.json | 1 + ...l_PL-7233008897033de5ee0d14f86a42a65a.json | 1 + ...l_PL-7289286ed59e90a8f36ae797df62220b.json | 1 + ...l_PL-7436b7ee9e4f11ac0d618d8cc886eb66.json | 1 + ...l_PL-77fdfadaf2e1ca3a027d1956b910bc50.json | 1 + ...l_PL-7b74c8457eaa7fcc50db41b431f8a003.json | 1 + ...l_PL-7c90cd4398ee2d9d3628c387a87a70e5.json | 1 + ...l_PL-7d5ca435e60d92f024d46c9257aaa0f7.json | 1 + ...l_PL-7f13c36c641b114bf18cd0bcc9ecc7e0.json | 1 + ...l_PL-803bf1ce2131e13efc590c1bc47851fc.json | 1 + ...l_PL-81c889563f09dd13de1701135dc62941.json | 1 + ...l_PL-81d6f084cb273e02e15b01bd9ece87f7.json | 1 + ...l_PL-8240df461220d1d3a028a9a4c5652a5b.json | 1 + ...l_PL-8860e58c20c6a2ab5876a0f07be43bd9.json | 1 + ...l_PL-93882e8f9976382d7f724ac595ed7151.json | 1 + ...l_PL-947c76bb5095da30e16668eec15406b2.json | 1 + ...l_PL-9b256ea9cd54df92095e04c76758ceb0.json | 1 + ...l_PL-9c3519f4870fac83dc0dbf18cb6bd4c4.json | 1 + ...l_PL-9d47a87c240c1d10701cd6a02b28aa1b.json | 1 + ...l_PL-a25d1cc7bf7ca0b4e114f6bea64943f4.json | 1 + ...l_PL-a9dc201dcd011fe71849743133052619.json | 1 + ...l_PL-aabfce98c410957228848dc581e3c420.json | 1 + ...l_PL-ac23eee47530ac63a1178c827db28087.json | 1 + ...l_PL-bf0f094965d3d4a95b47babcb35fc136.json | 1 + ...l_PL-bf23b24175490c2e46aaf92ff6a0c70f.json | 1 + ...l_PL-c31d5f185753910c14afebc6deb2ce24.json | 1 + ...l_PL-ca28138671823450e87dfd354f7afc6b.json | 1 + ...l_PL-daeb084aab42199d26393a56c3465bc0.json | 1 + ...l_PL-e2791ba830489d23043be8650a22a22b.json | 1 + ...l_PL-e2e4c4b80f3adf2c70b431bfdb1b4872.json | 1 + ...l_PL-e53526243551a102928735ec9eed4edf.json | 1 + ...l_PL-f575f481034e90e21d832e415fd95fcf.json | 1 + ...l_PL-f70806bf0c7d62f2908bd5a1c3fe4efc.json | 1 + ...l_PL-f8f49d9fc4a9cf7d78ec99285417bd9c.json | 1 + .../bedrock/web/app/languages/pl_PL.mo | Bin 0 -> 406611 bytes .../bedrock/web/app/languages/pl_PL.po | 20274 ++++++++++++++++ .../themes/twentytwentythree-pl_PL.mo | Bin 0 -> 6880 bytes .../themes/twentytwentythree-pl_PL.po | 433 + .../web/app/mu-plugins/bedrock-autoloader.php | 16 + .../bedrock/web/app/plugins/.gitkeep | 0 .../bedrock/web/app/themes/.gitkeep | 0 .../bedrock/web/app/uploads/.gitkeep | 0 .../v1-wordpress/bedrock/web/index.php | 6 + .../v1-wordpress/bedrock/web/wp-config.php | 9 + 2023/homepage/v1-wordpress/bedrock/wp-cli.yml | 3 + 2023/homepage/v2-symfony/.editorconfig | 34 + 2023/homepage/v2-symfony/.env | 11 + 2023/homepage/v2-symfony/.gitignore | 9 + .../v2-symfony/.php-cs-fixer.dist.php | 32 + 2023/homepage/v2-symfony/LICENCE.txt | 287 + 2023/homepage/v2-symfony/Makefile | 78 + 2023/homepage/v2-symfony/README.md | 18 + 2023/homepage/v2-symfony/TODO.md | 30 + 2023/homepage/v2-symfony/bin/console | 20 + 2023/homepage/v2-symfony/composer.json | 107 + 2023/homepage/v2-symfony/composer.lock | 6114 +++++ 2023/homepage/v2-symfony/config/bundles.php | 17 + .../v2-symfony/config/packages/cache.yaml | 2 + .../v2-symfony/config/packages/doctrine.yaml | 47 + .../config/packages/doctrine_migrations.yaml | 4 + .../v2-symfony/config/packages/framework.yaml | 17 + .../v2-symfony/config/packages/maker.yaml | 2 + .../v2-symfony/config/packages/monolog.yaml | 91 + .../v2-symfony/config/packages/routing.yaml | 9 + .../v2-symfony/config/packages/twig.yaml | 6 + .../v2-symfony/config/packages/uid.yaml | 4 + .../config/packages/web_profiler.yaml | 17 + 2023/homepage/v2-symfony/config/preload.php | 10 + 2023/homepage/v2-symfony/config/routes.yaml | 5 + .../v2-symfony/config/routes/framework.yaml | 4 + .../config/routes/web_profiler.yaml | 8 + 2023/homepage/v2-symfony/config/services.yaml | 22 + .../v2-symfony/migrations/Version0001.php | 75 + .../v2-symfony/migrations/Version0002.php | 31 + .../v2-symfony/migrations/Version0003.php | 32 + 2023/homepage/v2-symfony/public/index.php | 12 + .../src/Command/DocumentTouchCommand.php | 165 + .../Entity/Document/FileInterface.php | 21 + .../Entity/Document/PageInterface.php | 21 + .../Entity/Document/PointerInterface.php | 21 + .../Contracts/Entity/DocumentInterface.php | 44 + .../DocumentRepositoryInterface.php | 15 + .../src/Contracts/Symfony/RouteNames.php | 15 + .../Controller/Admin/DashboardController.php | 38 + .../Controller/CanonicalDomainController.php | 42 + .../src/Controller/DocumentController.php | 112 + .../src/Doctrine/DocumentRepository.php | 26 + .../src/Doctrine/Entity/Document.php | 140 + .../src/Doctrine/Entity/Document/File.php | 43 + .../src/Doctrine/Entity/Document/Page.php | 43 + .../src/Doctrine/Entity/Document/Pointer.php | 45 + .../src/Doctrine/Entity/DocumentType.php | 40 + .../EventSubscriber/DocumentSubscriber.php | 65 + 2023/homepage/v2-symfony/src/Kernel.php | 24 + 2023/homepage/v2-symfony/symfony.lock | 147 + .../templates/admin/dashboard.html.twig | 10 + .../v2-symfony/templates/base.html.twig | 17 + .../v2-symfony/templates/page.html.twig | 12 + .../v2-symfony/tools/parallel-lint/.gitignore | 1 + .../tools/parallel-lint/composer.json | 19 + .../tools/parallel-lint/composer.lock | 177 + .../v2-symfony/tools/php-cs-fixer/.gitignore | 1 + .../tools/php-cs-fixer/composer.json | 18 + .../tools/php-cs-fixer/composer.lock | 1842 ++ 2023/php-coding-standard/.editorconfig | 21 + 2023/php-coding-standard/.gitignore | 4 + .../.php-cs-fixer.dist.php | 43 + 2023/php-coding-standard/CHANGELOG.md | 38 + 2023/php-coding-standard/LICENCE.txt | 21 + 2023/php-coding-standard/Makefile | 52 + 2023/php-coding-standard/README.md | 64 + 2023/php-coding-standard/composer.json | 37 + .../src/PhpCsFixerRulesFactory.php | 361 + .../tools/parallel-lint/.gitignore | 1 + .../tools/parallel-lint/composer.json | 17 + .../tools/parallel-lint/composer.lock | 177 + .../tools/php-cs-fixer/.gitignore | 1 + .../tools/php-cs-fixer/composer.json | 16 + .../tools/php-cs-fixer/composer.lock | 1842 ++ 2024/neverwinter-nights/.editorconfig | 11 + 2024/neverwinter-nights/Makefile | 57 + .../data/localvault/bobbobson.bic | Bin 0 -> 45469 bytes .../data/modules/Birthday Present.mod | Bin 0 -> 67490 bytes .../notes/character-build.md | 39 + Makefile | 31 + README.md | 17 + 603 files changed, 96896 insertions(+) create mode 100644 .editorconfig create mode 100644 .editorconfig-checker.json create mode 100644 2013/daemon/.bzrignore create mode 100644 2013/daemon/.editorconfig create mode 100644 2013/daemon/LICENSE create mode 100644 2013/daemon/README.md create mode 100644 2013/daemon/cron.php create mode 100644 2013/daemon/daemon.sql create mode 100644 2013/daemon/lib/daemon.php create mode 100644 2013/daemon/lib/daemon/bosscombat.php create mode 100644 2013/daemon/lib/daemon/caernsiege.php create mode 100644 2013/daemon/lib/daemon/combat.php create mode 100644 2013/daemon/lib/daemon/combat/log.php create mode 100644 2013/daemon/lib/daemon/combat/unit.php create mode 100644 2013/daemon/lib/daemon/config.php create mode 100644 2013/daemon/lib/daemon/controller.php create mode 100644 2013/daemon/lib/daemon/dbclient.php create mode 100644 2013/daemon/lib/daemon/dbconfig.php create mode 100644 2013/daemon/lib/daemon/dbobject.php create mode 100644 2013/daemon/lib/daemon/dbobject/character.php create mode 100644 2013/daemon/lib/daemon/dbobject/characterdata.php create mode 100644 2013/daemon/lib/daemon/dbobject/clan.php create mode 100644 2013/daemon/lib/daemon/dbobject/combatunit.php create mode 100644 2013/daemon/lib/daemon/dbobject/event.php create mode 100644 2013/daemon/lib/daemon/dbobject/item.php create mode 100644 2013/daemon/lib/daemon/dbobject/itemtemplate.php create mode 100644 2013/daemon/lib/daemon/dbobject/location.php create mode 100644 2013/daemon/lib/daemon/dbobject/monster.php create mode 100644 2013/daemon/lib/daemon/dbobject/player.php create mode 100644 2013/daemon/lib/daemon/dictionary.php create mode 100644 2013/daemon/lib/daemon/duel.php create mode 100644 2013/daemon/lib/daemon/email.php create mode 100644 2013/daemon/lib/daemon/errorhandler.php create mode 100644 2013/daemon/lib/daemon/event.php create mode 100644 2013/daemon/lib/daemon/event/deadend.php create mode 100644 2013/daemon/lib/daemon/event/help.php create mode 100644 2013/daemon/lib/daemon/event/intro.php create mode 100644 2013/daemon/lib/daemon/eventinterface.php create mode 100644 2013/daemon/lib/daemon/forum.php create mode 100644 2013/daemon/lib/daemon/inventory.php create mode 100644 2013/daemon/lib/daemon/item.php create mode 100644 2013/daemon/lib/daemon/item/givespell.php create mode 100644 2013/daemon/lib/daemon/item/heal.php create mode 100644 2013/daemon/lib/daemon/item/teleport.php create mode 100644 2013/daemon/lib/daemon/iteminterface.php create mode 100644 2013/daemon/lib/daemon/math.php create mode 100644 2013/daemon/lib/daemon/monstercombat.php create mode 100644 2013/daemon/lib/daemon/msgqueue.php create mode 100644 2013/daemon/lib/daemon/news.php create mode 100644 2013/daemon/lib/daemon/scyzoryk.php create mode 100644 2013/daemon/lib/daemon/scyzoryk/browser.php create mode 100644 2013/daemon/lib/daemon/scyzoryk/controller.php create mode 100644 2013/daemon/lib/daemon/scyzoryk/dbrow.php create mode 100644 2013/daemon/lib/daemon/scyzoryk/editor.php create mode 100644 2013/daemon/lib/daemon/scyzoryk/filter.php create mode 100644 2013/daemon/lib/daemon/service.php create mode 100644 2013/daemon/lib/daemon/service/bank.php create mode 100644 2013/daemon/lib/daemon/service/healer.php create mode 100644 2013/daemon/lib/daemon/service/shop.php create mode 100644 2013/daemon/lib/daemon/service/temple.php create mode 100644 2013/daemon/lib/daemon/spell.php create mode 100644 2013/daemon/lib/daemon/spell/identify.php create mode 100644 2013/daemon/lib/daemon/spell/scancharacter.php create mode 100644 2013/daemon/lib/daemon/spell/scanitem.php create mode 100644 2013/daemon/lib/daemon/spell/scanmonster.php create mode 100644 2013/daemon/lib/daemon/spell/scout.php create mode 100644 2013/daemon/lib/daemon/spellinterface.php create mode 100644 2013/daemon/lib/daemon/statistics.php create mode 100644 2013/daemon/lib/daemon/view.php create mode 100644 2013/daemon/lib/jsmin.php create mode 100644 2013/daemon/php.ini create mode 100644 2013/daemon/public/.htaccess create mode 100644 2013/daemon/public/_init.php create mode 100644 2013/daemon/public/account.php create mode 100644 2013/daemon/public/auth.php create mode 100644 2013/daemon/public/character.php create mode 100644 2013/daemon/public/chat.php create mode 100644 2013/daemon/public/clan.php create mode 100644 2013/daemon/public/duel.php create mode 100644 2013/daemon/public/edit-account.php create mode 100644 2013/daemon/public/edit-character.php create mode 100644 2013/daemon/public/index.php create mode 100644 2013/daemon/public/inventory.php create mode 100644 2013/daemon/public/mail.php create mode 100644 2013/daemon/public/map.php create mode 100644 2013/daemon/public/news.php create mode 100644 2013/daemon/public/not-implemented.html create mode 100644 2013/daemon/public/register.php create mode 100644 2013/daemon/public/reset-password.php create mode 100644 2013/daemon/public/respawn.php create mode 100644 2013/daemon/public/robots.txt create mode 100644 2013/daemon/public/rules.php create mode 100644 2013/daemon/public/scyzoryk/arena.php create mode 100644 2013/daemon/public/scyzoryk/character-edit.php create mode 100644 2013/daemon/public/scyzoryk/characters.php create mode 100644 2013/daemon/public/scyzoryk/combat-unit-edit.php create mode 100644 2013/daemon/public/scyzoryk/combat-units.php create mode 100644 2013/daemon/public/scyzoryk/config-generator.php create mode 100644 2013/daemon/public/scyzoryk/config.php create mode 100644 2013/daemon/public/scyzoryk/cron-ui.php create mode 100644 2013/daemon/public/scyzoryk/event-edit.php create mode 100644 2013/daemon/public/scyzoryk/events.php create mode 100644 2013/daemon/public/scyzoryk/faction-edit.php create mode 100644 2013/daemon/public/scyzoryk/factions.php create mode 100644 2013/daemon/public/scyzoryk/generator.php create mode 100644 2013/daemon/public/scyzoryk/index.php create mode 100644 2013/daemon/public/scyzoryk/info.php create mode 100644 2013/daemon/public/scyzoryk/item-edit.php create mode 100644 2013/daemon/public/scyzoryk/item-template-edit.php create mode 100644 2013/daemon/public/scyzoryk/item-templates.php create mode 100644 2013/daemon/public/scyzoryk/items.php create mode 100644 2013/daemon/public/scyzoryk/location-edit.php create mode 100644 2013/daemon/public/scyzoryk/location-event-edit.php create mode 100644 2013/daemon/public/scyzoryk/location-monster-edit.php create mode 100644 2013/daemon/public/scyzoryk/location-path-edit.php create mode 100644 2013/daemon/public/scyzoryk/locations.php create mode 100644 2013/daemon/public/scyzoryk/map-edit.php create mode 100644 2013/daemon/public/scyzoryk/maps.php create mode 100644 2013/daemon/public/scyzoryk/monster-drop-edit.php create mode 100644 2013/daemon/public/scyzoryk/monster-edit.php create mode 100644 2013/daemon/public/scyzoryk/monsters.php create mode 100644 2013/daemon/public/scyzoryk/news.php create mode 100644 2013/daemon/public/scyzoryk/player-edit.php create mode 100644 2013/daemon/public/scyzoryk/players.php create mode 100644 2013/daemon/public/scyzoryk/region-edit.php create mode 100644 2013/daemon/public/scyzoryk/regions.php create mode 100644 2013/daemon/public/scyzoryk/reset.php create mode 100644 2013/daemon/public/scyzoryk/search.php create mode 100644 2013/daemon/public/scyzoryk/service-edit.php create mode 100644 2013/daemon/public/scyzoryk/services.php create mode 100644 2013/daemon/public/scyzoryk/title-edit.php create mode 100644 2013/daemon/public/scyzoryk/titles.php create mode 100644 2013/daemon/public/service.php create mode 100644 2013/daemon/public/static/badziew.jpg create mode 100644 2013/daemon/public/static/badziew2.jpg create mode 100644 2013/daemon/public/static/badziew3.jpg create mode 100644 2013/daemon/public/static/badziew4.jpg create mode 100644 2013/daemon/public/static/badziew5.jpg create mode 100644 2013/daemon/public/static/basic.css create mode 100644 2013/daemon/public/static/biglogo.jpg create mode 100644 2013/daemon/public/static/common.js create mode 100644 2013/daemon/public/static/common.src.js create mode 100644 2013/daemon/public/static/dark/bg.jpg create mode 100644 2013/daemon/public/static/dark/ekwip.png create mode 100644 2013/daemon/public/static/dark/forum.png create mode 100644 2013/daemon/public/static/dark/klan.png create mode 100644 2013/daemon/public/static/dark/konto.png create mode 100644 2013/daemon/public/static/dark/logo.jpg create mode 100644 2013/daemon/public/static/dark/otoczenie.png create mode 100644 2013/daemon/public/static/dark/poczta.png create mode 100644 2013/daemon/public/static/dark/pomoc.png create mode 100644 2013/daemon/public/static/dark/postac.png create mode 100644 2013/daemon/public/static/dark/ranking.png create mode 100644 2013/daemon/public/static/dark/skin.css create mode 100644 2013/daemon/public/static/favicon.png create mode 100644 2013/daemon/public/static/feed.png create mode 100644 2013/daemon/public/static/item-types/accesory.gif create mode 100644 2013/daemon/public/static/item-types/armor.gif create mode 100644 2013/daemon/public/static/item-types/boots.gif create mode 100644 2013/daemon/public/static/item-types/gloves.gif create mode 100644 2013/daemon/public/static/item-types/helmet.gif create mode 100644 2013/daemon/public/static/item-types/item.gif create mode 100644 2013/daemon/public/static/item-types/pendant.gif create mode 100644 2013/daemon/public/static/item-types/weapon1h.gif create mode 100644 2013/daemon/public/static/item-types/weapon2h.gif create mode 100644 2013/daemon/public/static/light/bg.jpg create mode 100644 2013/daemon/public/static/light/ekwip.png create mode 100644 2013/daemon/public/static/light/forum.png create mode 100644 2013/daemon/public/static/light/klan.png create mode 100644 2013/daemon/public/static/light/konto.png create mode 100644 2013/daemon/public/static/light/logo.jpg create mode 100644 2013/daemon/public/static/light/otoczenie.png create mode 100644 2013/daemon/public/static/light/poczta.png create mode 100644 2013/daemon/public/static/light/pomoc.png create mode 100644 2013/daemon/public/static/light/postac.png create mode 100644 2013/daemon/public/static/light/ranking.png create mode 100644 2013/daemon/public/static/light/skin.css create mode 100644 2013/daemon/public/static/maps/Jary_Czyngijskie.jpg create mode 100755 2013/daemon/public/static/maps/gory_kranca.jpg create mode 100644 2013/daemon/public/static/maps/goryczerwone.jpg create mode 100755 2013/daemon/public/static/maps/kungfu1.jpg create mode 100755 2013/daemon/public/static/maps/mainmap.jpg create mode 100644 2013/daemon/public/static/maps/prowincja_yang.jpg create mode 100644 2013/daemon/public/static/maps/prowincja_yin.jpg create mode 100755 2013/daemon/public/static/maps/wieczny_las.jpg create mode 100644 2013/daemon/public/static/monastery04.png create mode 100644 2013/daemon/public/static/pack-css.php create mode 100644 2013/daemon/public/static/reyka.jpg create mode 100644 2013/daemon/public/static/scyzoryk.js create mode 100644 2013/daemon/public/static/scyzoryk.src.js create mode 100644 2013/daemon/public/static/search.png create mode 100644 2013/daemon/public/stats-battles.php create mode 100644 2013/daemon/public/stats-characters.php create mode 100644 2013/daemon/public/stats-clans.php create mode 100644 2013/daemon/public/stats-duels.php create mode 100644 2013/daemon/public/stats.php create mode 100644 2013/daemon/public/temple.php create mode 100644 2013/daemon/tpl/account.xml create mode 100644 2013/daemon/tpl/character.xml create mode 100644 2013/daemon/tpl/chat.xml create mode 100644 2013/daemon/tpl/clan.xml create mode 100644 2013/daemon/tpl/duel.xml create mode 100644 2013/daemon/tpl/duelcombat.xml create mode 100644 2013/daemon/tpl/edit-account.xml create mode 100644 2013/daemon/tpl/edit-character.xml create mode 100644 2013/daemon/tpl/event.xml create mode 100644 2013/daemon/tpl/event/deadend.xml create mode 100644 2013/daemon/tpl/event/intro.xml create mode 100644 2013/daemon/tpl/index.xml create mode 100644 2013/daemon/tpl/inventory.xml create mode 100644 2013/daemon/tpl/macros.xml create mode 100644 2013/daemon/tpl/mail.xml create mode 100644 2013/daemon/tpl/map.xml create mode 100644 2013/daemon/tpl/monstercombat.xml create mode 100644 2013/daemon/tpl/news.xml create mode 100644 2013/daemon/tpl/register.xml create mode 100644 2013/daemon/tpl/reset-password.xml create mode 100644 2013/daemon/tpl/respawn.xml create mode 100644 2013/daemon/tpl/rules.xml create mode 100644 2013/daemon/tpl/scyzoryk/arena.xml create mode 100644 2013/daemon/tpl/scyzoryk/character-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/characters.xml create mode 100644 2013/daemon/tpl/scyzoryk/combat-unit-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/combat-units.xml create mode 100644 2013/daemon/tpl/scyzoryk/config-generator.xml create mode 100644 2013/daemon/tpl/scyzoryk/config.xml create mode 100644 2013/daemon/tpl/scyzoryk/event-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/events.xml create mode 100644 2013/daemon/tpl/scyzoryk/faction-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/factions.xml create mode 100644 2013/daemon/tpl/scyzoryk/generator.xml create mode 100644 2013/daemon/tpl/scyzoryk/index.xml create mode 100644 2013/daemon/tpl/scyzoryk/item-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/item-template-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/item-templates.xml create mode 100644 2013/daemon/tpl/scyzoryk/items.xml create mode 100644 2013/daemon/tpl/scyzoryk/location-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/location-event-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/location-monster-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/location-path-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/locations.xml create mode 100644 2013/daemon/tpl/scyzoryk/macros.xml create mode 100644 2013/daemon/tpl/scyzoryk/map-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/maps.xml create mode 100644 2013/daemon/tpl/scyzoryk/monster-drop-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/monster-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/monsters.xml create mode 100644 2013/daemon/tpl/scyzoryk/news.xml create mode 100644 2013/daemon/tpl/scyzoryk/player-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/players.xml create mode 100644 2013/daemon/tpl/scyzoryk/region-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/regions.xml create mode 100644 2013/daemon/tpl/scyzoryk/reset.xml create mode 100644 2013/daemon/tpl/scyzoryk/search.xml create mode 100644 2013/daemon/tpl/scyzoryk/service-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/services.xml create mode 100644 2013/daemon/tpl/scyzoryk/title-edit.xml create mode 100644 2013/daemon/tpl/scyzoryk/titles.xml create mode 100644 2013/daemon/tpl/service.xml create mode 100644 2013/daemon/tpl/service/bank.xml create mode 100644 2013/daemon/tpl/service/healer.xml create mode 100644 2013/daemon/tpl/service/shop.xml create mode 100644 2013/daemon/tpl/service/temple.xml create mode 100644 2013/daemon/tpl/spell/scancharacter.xml create mode 100644 2013/daemon/tpl/spell/scanitem.xml create mode 100644 2013/daemon/tpl/spell/scanmonster.xml create mode 100644 2013/daemon/tpl/spell/scout.xml create mode 100644 2013/daemon/tpl/stats-battle.xml create mode 100644 2013/daemon/tpl/stats-battles.xml create mode 100644 2013/daemon/tpl/stats-character.xml create mode 100644 2013/daemon/tpl/stats-characters.xml create mode 100644 2013/daemon/tpl/stats-clan.xml create mode 100644 2013/daemon/tpl/stats-clans.xml create mode 100644 2013/daemon/tpl/stats-duel.xml create mode 100644 2013/daemon/tpl/stats-duels.xml create mode 100644 2013/daemon/tpl/stats.xml create mode 100644 2021/nexus-archive/browser-extension/.editorconfig create mode 100644 2021/nexus-archive/browser-extension/.eslintrc.json create mode 100644 2021/nexus-archive/browser-extension/.gitattributes create mode 100644 2021/nexus-archive/browser-extension/.gitignore create mode 100644 2021/nexus-archive/browser-extension/CHANGELOG.md create mode 100644 2021/nexus-archive/browser-extension/LICENSE.txt create mode 100644 2021/nexus-archive/browser-extension/README.md create mode 100644 2021/nexus-archive/browser-extension/icons/icon.png create mode 100644 2021/nexus-archive/browser-extension/manifest.json create mode 100644 2021/nexus-archive/browser-extension/options/index.html create mode 100644 2021/nexus-archive/browser-extension/options/style.css create mode 100644 2021/nexus-archive/browser-extension/package-lock.json create mode 100644 2021/nexus-archive/browser-extension/package.json create mode 100644 2021/nexus-archive/browser-extension/src/background.js create mode 100644 2021/nexus-archive/browser-extension/src/nexusData.js create mode 100644 2021/nexus-archive/browser-extension/src/nexusDataQueue.js create mode 100644 2021/nexus-archive/browser-extension/src/nexusDataSender.js create mode 100644 2021/nexus-archive/browser-extension/src/options.js create mode 100644 2021/nexus-archive/browser-extension/src/preferences.js create mode 100644 2021/nexus-archive/browser-extension/src/webRequestMonitor.js create mode 100644 2021/nexus-archive/website/.editorconfig create mode 100644 2021/nexus-archive/website/.env create mode 100644 2021/nexus-archive/website/.gitignore create mode 100644 2021/nexus-archive/website/CHANGELOG.md create mode 100644 2021/nexus-archive/website/LICENSE.txt create mode 100644 2021/nexus-archive/website/README.md create mode 100644 2021/nexus-archive/website/assets/PageViewSubmissionJsonSchema.json create mode 100644 2021/nexus-archive/website/assets/tailwindcss/input.css create mode 100755 2021/nexus-archive/website/bin/console create mode 100755 2021/nexus-archive/website/bin/tailwind-build-dev create mode 100755 2021/nexus-archive/website/bin/tailwind-build-prod create mode 100644 2021/nexus-archive/website/composer.json create mode 100644 2021/nexus-archive/website/composer.lock create mode 100644 2021/nexus-archive/website/config/bundles.php create mode 100644 2021/nexus-archive/website/config/packages/dev/debug.php create mode 100644 2021/nexus-archive/website/config/packages/dev/web_profiler.php create mode 100644 2021/nexus-archive/website/config/packages/doctrine.php create mode 100644 2021/nexus-archive/website/config/packages/doctrine_migrations.php create mode 100644 2021/nexus-archive/website/config/packages/framework.php create mode 100644 2021/nexus-archive/website/config/packages/lock.php create mode 100644 2021/nexus-archive/website/config/packages/monolog.php create mode 100644 2021/nexus-archive/website/config/packages/routing.php create mode 100644 2021/nexus-archive/website/config/packages/security.php create mode 100644 2021/nexus-archive/website/config/packages/test/web_profiler.php create mode 100644 2021/nexus-archive/website/config/packages/translation.php create mode 100644 2021/nexus-archive/website/config/packages/twig.php create mode 100644 2021/nexus-archive/website/config/packages/validator.php create mode 100644 2021/nexus-archive/website/config/preload.php create mode 100644 2021/nexus-archive/website/config/routes.php create mode 100644 2021/nexus-archive/website/config/services.php create mode 100644 2021/nexus-archive/website/migrations/Version0001.php create mode 100644 2021/nexus-archive/website/migrations/Version0002.php create mode 100644 2021/nexus-archive/website/migrations/Version0003.php create mode 100644 2021/nexus-archive/website/migrations/Version0004.php create mode 100644 2021/nexus-archive/website/migrations/Version0005.php create mode 100644 2021/nexus-archive/website/migrations/Version0006.php create mode 100644 2021/nexus-archive/website/migrations/Version0007.php create mode 100644 2021/nexus-archive/website/migrations/Version0008.php create mode 100644 2021/nexus-archive/website/migrations/Version0009.php create mode 100644 2021/nexus-archive/website/migrations/Version0010.php create mode 100644 2021/nexus-archive/website/package-lock.json create mode 100644 2021/nexus-archive/website/package.json create mode 100644 2021/nexus-archive/website/public/css/combined.css create mode 100644 2021/nexus-archive/website/public/index.php create mode 100644 2021/nexus-archive/website/src/Command/BaseCommand.php create mode 100644 2021/nexus-archive/website/src/Command/ExportLeaderboardsCommand.php create mode 100644 2021/nexus-archive/website/src/Command/UserCreateAccessTokenCommand.php create mode 100644 2021/nexus-archive/website/src/Command/UserCreateCommand.php create mode 100644 2021/nexus-archive/website/src/Command/WorkerParseCommand.php create mode 100644 2021/nexus-archive/website/src/Command/WorkerPruneDatabaseCommand.php create mode 100644 2021/nexus-archive/website/src/Contract/Config/AppParameters.php create mode 100644 2021/nexus-archive/website/src/Contract/Config/AppRoutes.php create mode 100644 2021/nexus-archive/website/src/Contract/Config/AppSerializationGroups.php create mode 100644 2021/nexus-archive/website/src/Contract/Config/AppTags.php create mode 100644 2021/nexus-archive/website/src/Contract/Doctrine/Entity/DatedEntityInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Doctrine/Entity/GamePeriodReferenceInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Doctrine/Entity/UuidPrimaryKeyInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Entity/LeaderboardTypes.php create mode 100644 2021/nexus-archive/website/src/Contract/Entity/Nexus/GamePeriodIdEnum.php create mode 100644 2021/nexus-archive/website/src/Contract/Entity/Nexus/GamePeriodInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Entity/Nexus/Leaderboard/EntryInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Entity/Nexus/Leaderboard/EntryListInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Entity/Nexus/LeaderboardInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/PageViewSubmissionResultStatus.php create mode 100644 2021/nexus-archive/website/src/Contract/Service/ClockInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Service/Parser/ParserError.php create mode 100644 2021/nexus-archive/website/src/Contract/Service/Parser/ParserInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Service/Parser/ParserResultInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Service/Parser/ParserResultProcessorInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/Service/Parser/ParserSelectorInterface.php create mode 100644 2021/nexus-archive/website/src/Contract/UserRoles.php create mode 100644 2021/nexus-archive/website/src/Controller/AboutController.php create mode 100644 2021/nexus-archive/website/src/Controller/FaviconController.php create mode 100644 2021/nexus-archive/website/src/Controller/HomeController.php create mode 100644 2021/nexus-archive/website/src/Controller/LeaderboardController.php create mode 100644 2021/nexus-archive/website/src/Controller/LoginController.php create mode 100644 2021/nexus-archive/website/src/Controller/SubmitJsonController.php create mode 100644 2021/nexus-archive/website/src/DTO/Nexus/Leaderboard.php create mode 100644 2021/nexus-archive/website/src/DTO/Nexus/Leaderboard/Entry.php create mode 100644 2021/nexus-archive/website/src/DTO/Nexus/Leaderboard/EntryList.php create mode 100644 2021/nexus-archive/website/src/DTO/PageViewSubmissionResult.php create mode 100644 2021/nexus-archive/website/src/DTO/PageViewSubmissionValidatorResult.php create mode 100644 2021/nexus-archive/website/src/DTO/ParserResult.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Entity/DatedEntityTrait.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Entity/Nexus/GamePeriod.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Entity/Nexus/Leaderboard.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Entity/Nexus/LeaderboardCategory.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Entity/Nexus/LeaderboardEntry.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Entity/PageView.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Entity/User.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Entity/UserAccessToken.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Entity/UuidPrimaryKeyTrait.php create mode 100644 2021/nexus-archive/website/src/Doctrine/Repository/UserRepository.php create mode 100644 2021/nexus-archive/website/src/EasyAdmin/Controller/DashboardController.php create mode 100644 2021/nexus-archive/website/src/EasyAdmin/Controller/PageViewCrudController.php create mode 100644 2021/nexus-archive/website/src/EasyAdmin/Controller/UserAccessTokenCrudController.php create mode 100644 2021/nexus-archive/website/src/EasyAdmin/Controller/UserCrudController.php create mode 100644 2021/nexus-archive/website/src/EasyAdmin/Field/JsonField.php create mode 100644 2021/nexus-archive/website/src/Kernel.php create mode 100644 2021/nexus-archive/website/src/Service/Clock.php create mode 100644 2021/nexus-archive/website/src/Service/DateTimeFactory.php create mode 100644 2021/nexus-archive/website/src/Service/MainMenuGenerator.php create mode 100644 2021/nexus-archive/website/src/Service/PageViewProcessor.php create mode 100644 2021/nexus-archive/website/src/Service/PageViewSubmissionHandler.php create mode 100644 2021/nexus-archive/website/src/Service/PageViewSubmissionValidator.php create mode 100644 2021/nexus-archive/website/src/Service/Parser/BreathFourthParser.php create mode 100644 2021/nexus-archive/website/src/Service/ParserResult/ParserResultProcessor.php create mode 100644 2021/nexus-archive/website/src/Service/ParserSelector.php create mode 100644 2021/nexus-archive/website/src/Service/Repository/Nexus/GamePeriodRepository.php create mode 100644 2021/nexus-archive/website/src/Service/Repository/Nexus/LeaderboardRepository.php create mode 100644 2021/nexus-archive/website/src/Service/Repository/PageViewRepository.php create mode 100644 2021/nexus-archive/website/src/Service/Repository/UserAccessTokenRepository.php create mode 100644 2021/nexus-archive/website/src/Service/Repository/UserRepository.php create mode 100644 2021/nexus-archive/website/src/Service/Serializer.php create mode 100644 2021/nexus-archive/website/src/Service/TokenGenerator.php create mode 100644 2021/nexus-archive/website/symfony.lock create mode 100644 2021/nexus-archive/website/tailwind.config.js create mode 100644 2021/nexus-archive/website/templates/about/index.html.twig create mode 100644 2021/nexus-archive/website/templates/base.html.twig create mode 100644 2021/nexus-archive/website/templates/easyadmin/dashboard/index.html.twig create mode 100644 2021/nexus-archive/website/templates/home/index.html.twig create mode 100644 2021/nexus-archive/website/templates/leaderboards/index.html.twig create mode 100644 2021/nexus-archive/website/templates/login/index.html.twig create mode 100644 2021/nexus-archive/website/templates/submit-json/index.html.twig create mode 100644 2022/portfolio-website/.editorconfig create mode 100644 2022/portfolio-website/.gitignore create mode 100644 2022/portfolio-website/LICENSE.txt create mode 100644 2022/portfolio-website/Makefile create mode 100644 2022/portfolio-website/README.md create mode 100755 2022/portfolio-website/bin/tailwind-build-dev create mode 100755 2022/portfolio-website/bin/tailwind-build-prod create mode 100644 2022/portfolio-website/doc/DEVELOPMENT.md create mode 100644 2022/portfolio-website/package-lock.json create mode 100644 2022/portfolio-website/package.json create mode 100644 2022/portfolio-website/public/css/combined.css create mode 100644 2022/portfolio-website/public/index.html create mode 100644 2022/portfolio-website/src/input.css create mode 100644 2022/portfolio-website/tailwind.config.js create mode 100644 2023/homepage/v1-wordpress/.editorconfig create mode 100644 2023/homepage/v1-wordpress/Makefile create mode 100644 2023/homepage/v1-wordpress/README.md create mode 100644 2023/homepage/v1-wordpress/bedrock/.env.example create mode 100644 2023/homepage/v1-wordpress/bedrock/.gitignore create mode 100644 2023/homepage/v1-wordpress/bedrock/LICENSE.md create mode 100644 2023/homepage/v1-wordpress/bedrock/README.md create mode 100644 2023/homepage/v1-wordpress/bedrock/composer.json create mode 100644 2023/homepage/v1-wordpress/bedrock/composer.lock create mode 100644 2023/homepage/v1-wordpress/bedrock/config/application.php create mode 100644 2023/homepage/v1-wordpress/bedrock/config/environments/development.php create mode 100644 2023/homepage/v1-wordpress/bedrock/config/environments/staging.php create mode 100644 2023/homepage/v1-wordpress/bedrock/phpcs.xml create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/admin-network-pl_PL.mo create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/admin-network-pl_PL.po create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/admin-pl_PL.mo create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/admin-pl_PL.po create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/continents-cities-pl_PL.mo create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/continents-cities-pl_PL.po create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-0cc31205f20441b3df1d1b46100f6b8d.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-0ce75ad2f775d1cac9696967d484808c.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-0eebe503220d4a00341eb011b92769b4.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-17179a5f2930647c89151e365f843b6e.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-1780a2033cf98d69ce13c2e5c8510004.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-1a0cd6a7128913b15c1a10dd68951869.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-1bba9045bb07c89671c88a3f328548e8.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-1c4303f02ff93b290e9faad991eeb06f.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-1d17475f620f63a92e2c5d2681c51ee8.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-270d72d1cff17227d37f3244759cbecb.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-28b3c3d595952907e08d98287077426c.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-2b390f85a3048c5b4255fb45960b6514.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-2c5d274ea625dd91556554ad82901529.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-320f4ad9792aaa6dedb1e71cbdf85d57.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-440127dd25bde48a531ded36f33e927b.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-49c6d4acf36cf3aca9f0b2a77617304f.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-4a38fe1c0c45989e44682ba6109d9f46.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-4bfa11da57ff2600004bb500368247f4.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-50278328b502f4eb3f2b8b7ab49324a1.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-5251f7623766a714c8207c7edb938628.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-529362903a5a05b34b06b5e793fb4cf8.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-569e85ef168299eb8c8f24d8ef8c8a78.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-6025add6bde16aaeb12787d250f9b414.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-60d06fac6f98e8e8f0ec5a945738b660.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-68f2cec7514bf8563c723a4d675fcfe6.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-7233008897033de5ee0d14f86a42a65a.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-7289286ed59e90a8f36ae797df62220b.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-7436b7ee9e4f11ac0d618d8cc886eb66.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-77fdfadaf2e1ca3a027d1956b910bc50.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-7b74c8457eaa7fcc50db41b431f8a003.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-7c90cd4398ee2d9d3628c387a87a70e5.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-7d5ca435e60d92f024d46c9257aaa0f7.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-7f13c36c641b114bf18cd0bcc9ecc7e0.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-803bf1ce2131e13efc590c1bc47851fc.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-81c889563f09dd13de1701135dc62941.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-81d6f084cb273e02e15b01bd9ece87f7.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-8240df461220d1d3a028a9a4c5652a5b.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-8860e58c20c6a2ab5876a0f07be43bd9.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-93882e8f9976382d7f724ac595ed7151.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-947c76bb5095da30e16668eec15406b2.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-9b256ea9cd54df92095e04c76758ceb0.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-9c3519f4870fac83dc0dbf18cb6bd4c4.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-9d47a87c240c1d10701cd6a02b28aa1b.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-a25d1cc7bf7ca0b4e114f6bea64943f4.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-a9dc201dcd011fe71849743133052619.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-aabfce98c410957228848dc581e3c420.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-ac23eee47530ac63a1178c827db28087.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-bf0f094965d3d4a95b47babcb35fc136.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-bf23b24175490c2e46aaf92ff6a0c70f.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-c31d5f185753910c14afebc6deb2ce24.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-ca28138671823450e87dfd354f7afc6b.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-daeb084aab42199d26393a56c3465bc0.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-e2791ba830489d23043be8650a22a22b.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-e2e4c4b80f3adf2c70b431bfdb1b4872.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-e53526243551a102928735ec9eed4edf.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-f575f481034e90e21d832e415fd95fcf.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-f70806bf0c7d62f2908bd5a1c3fe4efc.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL-f8f49d9fc4a9cf7d78ec99285417bd9c.json create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL.mo create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/pl_PL.po create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/themes/twentytwentythree-pl_PL.mo create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/languages/themes/twentytwentythree-pl_PL.po create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/mu-plugins/bedrock-autoloader.php create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/plugins/.gitkeep create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/themes/.gitkeep create mode 100644 2023/homepage/v1-wordpress/bedrock/web/app/uploads/.gitkeep create mode 100644 2023/homepage/v1-wordpress/bedrock/web/index.php create mode 100644 2023/homepage/v1-wordpress/bedrock/web/wp-config.php create mode 100644 2023/homepage/v1-wordpress/bedrock/wp-cli.yml create mode 100644 2023/homepage/v2-symfony/.editorconfig create mode 100644 2023/homepage/v2-symfony/.env create mode 100644 2023/homepage/v2-symfony/.gitignore create mode 100644 2023/homepage/v2-symfony/.php-cs-fixer.dist.php create mode 100644 2023/homepage/v2-symfony/LICENCE.txt create mode 100644 2023/homepage/v2-symfony/Makefile create mode 100644 2023/homepage/v2-symfony/README.md create mode 100644 2023/homepage/v2-symfony/TODO.md create mode 100755 2023/homepage/v2-symfony/bin/console create mode 100644 2023/homepage/v2-symfony/composer.json create mode 100644 2023/homepage/v2-symfony/composer.lock create mode 100644 2023/homepage/v2-symfony/config/bundles.php create mode 100644 2023/homepage/v2-symfony/config/packages/cache.yaml create mode 100644 2023/homepage/v2-symfony/config/packages/doctrine.yaml create mode 100644 2023/homepage/v2-symfony/config/packages/doctrine_migrations.yaml create mode 100644 2023/homepage/v2-symfony/config/packages/framework.yaml create mode 100644 2023/homepage/v2-symfony/config/packages/maker.yaml create mode 100644 2023/homepage/v2-symfony/config/packages/monolog.yaml create mode 100644 2023/homepage/v2-symfony/config/packages/routing.yaml create mode 100644 2023/homepage/v2-symfony/config/packages/twig.yaml create mode 100644 2023/homepage/v2-symfony/config/packages/uid.yaml create mode 100644 2023/homepage/v2-symfony/config/packages/web_profiler.yaml create mode 100644 2023/homepage/v2-symfony/config/preload.php create mode 100644 2023/homepage/v2-symfony/config/routes.yaml create mode 100644 2023/homepage/v2-symfony/config/routes/framework.yaml create mode 100644 2023/homepage/v2-symfony/config/routes/web_profiler.yaml create mode 100644 2023/homepage/v2-symfony/config/services.yaml create mode 100644 2023/homepage/v2-symfony/migrations/Version0001.php create mode 100644 2023/homepage/v2-symfony/migrations/Version0002.php create mode 100644 2023/homepage/v2-symfony/migrations/Version0003.php create mode 100644 2023/homepage/v2-symfony/public/index.php create mode 100644 2023/homepage/v2-symfony/src/Command/DocumentTouchCommand.php create mode 100644 2023/homepage/v2-symfony/src/Contracts/Entity/Document/FileInterface.php create mode 100644 2023/homepage/v2-symfony/src/Contracts/Entity/Document/PageInterface.php create mode 100644 2023/homepage/v2-symfony/src/Contracts/Entity/Document/PointerInterface.php create mode 100644 2023/homepage/v2-symfony/src/Contracts/Entity/DocumentInterface.php create mode 100644 2023/homepage/v2-symfony/src/Contracts/Repository/DocumentRepositoryInterface.php create mode 100644 2023/homepage/v2-symfony/src/Contracts/Symfony/RouteNames.php create mode 100644 2023/homepage/v2-symfony/src/Controller/Admin/DashboardController.php create mode 100644 2023/homepage/v2-symfony/src/Controller/CanonicalDomainController.php create mode 100644 2023/homepage/v2-symfony/src/Controller/DocumentController.php create mode 100644 2023/homepage/v2-symfony/src/Doctrine/DocumentRepository.php create mode 100644 2023/homepage/v2-symfony/src/Doctrine/Entity/Document.php create mode 100644 2023/homepage/v2-symfony/src/Doctrine/Entity/Document/File.php create mode 100644 2023/homepage/v2-symfony/src/Doctrine/Entity/Document/Page.php create mode 100644 2023/homepage/v2-symfony/src/Doctrine/Entity/Document/Pointer.php create mode 100644 2023/homepage/v2-symfony/src/Doctrine/Entity/DocumentType.php create mode 100644 2023/homepage/v2-symfony/src/Doctrine/EventSubscriber/DocumentSubscriber.php create mode 100644 2023/homepage/v2-symfony/src/Kernel.php create mode 100644 2023/homepage/v2-symfony/symfony.lock create mode 100644 2023/homepage/v2-symfony/templates/admin/dashboard.html.twig create mode 100644 2023/homepage/v2-symfony/templates/base.html.twig create mode 100644 2023/homepage/v2-symfony/templates/page.html.twig create mode 100644 2023/homepage/v2-symfony/tools/parallel-lint/.gitignore create mode 100644 2023/homepage/v2-symfony/tools/parallel-lint/composer.json create mode 100644 2023/homepage/v2-symfony/tools/parallel-lint/composer.lock create mode 100644 2023/homepage/v2-symfony/tools/php-cs-fixer/.gitignore create mode 100644 2023/homepage/v2-symfony/tools/php-cs-fixer/composer.json create mode 100644 2023/homepage/v2-symfony/tools/php-cs-fixer/composer.lock create mode 100644 2023/php-coding-standard/.editorconfig create mode 100644 2023/php-coding-standard/.gitignore create mode 100644 2023/php-coding-standard/.php-cs-fixer.dist.php create mode 100644 2023/php-coding-standard/CHANGELOG.md create mode 100644 2023/php-coding-standard/LICENCE.txt create mode 100644 2023/php-coding-standard/Makefile create mode 100644 2023/php-coding-standard/README.md create mode 100644 2023/php-coding-standard/composer.json create mode 100644 2023/php-coding-standard/src/PhpCsFixerRulesFactory.php create mode 100644 2023/php-coding-standard/tools/parallel-lint/.gitignore create mode 100644 2023/php-coding-standard/tools/parallel-lint/composer.json create mode 100644 2023/php-coding-standard/tools/parallel-lint/composer.lock create mode 100644 2023/php-coding-standard/tools/php-cs-fixer/.gitignore create mode 100644 2023/php-coding-standard/tools/php-cs-fixer/composer.json create mode 100644 2023/php-coding-standard/tools/php-cs-fixer/composer.lock create mode 100644 2024/neverwinter-nights/.editorconfig create mode 100644 2024/neverwinter-nights/Makefile create mode 100644 2024/neverwinter-nights/data/localvault/bobbobson.bic create mode 100644 2024/neverwinter-nights/data/modules/Birthday Present.mod create mode 100644 2024/neverwinter-nights/notes/character-build.md create mode 100644 Makefile create mode 100644 README.md diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..11d227d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = LF +insert_final_newline = true +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 +max_line_length = 80 + +[*.php] +# settings required by PSR-12 standard +indent_size = 4 +max_line_length = 120 + +[Makefile] +indent_style = tab diff --git a/.editorconfig-checker.json b/.editorconfig-checker.json new file mode 100644 index 0000000..76321a0 --- /dev/null +++ b/.editorconfig-checker.json @@ -0,0 +1,6 @@ +{ + "Exclude": [ + "^.git/", + "^.idea/" + ] +} diff --git a/2013/daemon/.bzrignore b/2013/daemon/.bzrignore new file mode 100644 index 0000000..d7224fd --- /dev/null +++ b/2013/daemon/.bzrignore @@ -0,0 +1,6 @@ +./cfg/* +./log/* +./tmp/* +./lib/PHPTAL* +./public/google* +./public/scyzoryk/.htaccess diff --git a/2013/daemon/.editorconfig b/2013/daemon/.editorconfig new file mode 100644 index 0000000..795f4da --- /dev/null +++ b/2013/daemon/.editorconfig @@ -0,0 +1,17 @@ +[*] +indent_style = tab +max_line_length = unset + +[*.css] +max_line_length = 140 + +[*.js] # minified files +insert_final_newline = unset + +[*.sql] +indent_style = space + +[lib/jsmin.php] # vendored file +insert_final_newline = unset +indent_style = space +indent_size = 2 diff --git a/2013/daemon/LICENSE b/2013/daemon/LICENSE new file mode 100644 index 0000000..d10bae5 --- /dev/null +++ b/2013/daemon/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2013 Krzysztof Sikorski + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/2013/daemon/README.md b/2013/daemon/README.md new file mode 100644 index 0000000..b0c6693 --- /dev/null +++ b/2013/daemon/README.md @@ -0,0 +1,68 @@ +INTRODUCTION +=== + +The game was never planned to be released in public, +so it's designed for the LAMP stack it was originally hosted on. +Basically the code assumes some software versions and settings, +and will propably break on different configuration. + +REQUIRED SOFTWARE +=== + +* *Apache 2.x*, with enabled mod_rewrite and .htaccess files. +* *PHP 5.2.x* with settings like in attached php.ini file. +* *MySQL 5.1*, may also work on other 5.x versions. +* *PHPTAL 1.2.1* - newer releases are propably also safe. +* The hosting **MUST** also offer crontab or other similar services. + +INSTALLATION +=== + +1. Prepare database tables using attached SQL file. + +2. Configure PHP using attached INI file. + +3. Upload game code into server. + +4. Download PHPTAL library and upload it into lib subdirectory, +you should now have `lib/PHPTAL.php`, `lib/PHPTAL/Context.php` etc. + +5. Enter your hosting's configuration panel and set the `public` subdir +as a domain root, so other files won't be accessible from the Net. + +6. Configure crontab: set the `cron.php` file to be executed every day. + +7. And now the tricky part: create a config file (or files) and upload +it into `cfg` subdirectory. It's a long and weird topic, details below. + +CONFIGURATION +=== + +The game configuration is handled by the `Daemon_Config` class +(`lib/daemon/config.php` file), which uses it to overwrite its public +properties. Consult the class' constructor for details. + +The file's content is simple, it should do nothing more than to return +an associative array of settings. Here's an example of minimal config: + + 'http://example.com/foo/bar/baz/', + 'applicationMail' => 'daemon@example.com', + 'dbHost' => 'localhost', + 'dbSchema' => 'daemon_db', + 'dbUser' => 'username', + 'dbPassword' => 'some_password', + ); + +The tricky part is the config's filename. As you can see in the class' +constructor, it _must_ be exactly the same as the domain on which +the game is hosted, plus the `.php` extension. +For example, if the game is hosted on `example.com`, then the filename +is `example.com.php`. This is designed to prevent accidental overwrites +with config for other machines... + +There is also another tricky part: if you execute a script from the +command line instead of URL, then the script uses a special `_cron.php` +file instead of normal config. So you should create that file too. +Or change the `Daemon_Config`'s constructor ;) diff --git a/2013/daemon/cron.php b/2013/daemon/cron.php new file mode 100644 index 0000000..b086a3c --- /dev/null +++ b/2013/daemon/cron.php @@ -0,0 +1,182 @@ +query($sql, array()); +unset($queries); + +//check for endgame +if(!$dbCfg->rolloversEnabled) + return; + +//create rollover entry +$sql = "INSERT INTO rollovers(date_added) VALUES (now())"; +$dbClient->query($sql); +$rolloverId = $dbClient->lastInsertId(); + +//give turns +$sql = "UPDATE character_data SET turns = LEAST(:limit, turns + :delta)"; +$params = array('delta' => (int) $dbCfg->turnDelta, 'limit' => (int) $dbCfg->turnLimit); +$dbClient->query($sql, $params); + +//run caern sieges +$sql = "SELECT l.location_id FROM locations l JOIN character_data cd USING(location_id) + WHERE l.type='caern' AND cd.faction_id IS NOT NULL AND cd.faction_id != l.faction_id + GROUP BY l.location_id"; +$locations = $dbClient->selectColumn($sql); +foreach ((array) $locations as $siegeLocationId) +{ + $combat = new Daemon_CaernSiege(); + $combat->attachDbClient($dbClient); + $combat->execute($siegeLocationId); + $sql = "INSERT INTO battles(rollover_id, location_id, type, combat_log) + VALUES (:rolloverId, :locationId, 'caern', :combatLog)"; + $params = array('rolloverId' => $rolloverId, 'locationId' => $siegeLocationId, + 'combatLog' => $combat->getCombatLog()); + $dbClient->query($sql, $params); + $dbCfg->siegeLocationId = null; + $siegeLocationId = null; + unset($combat); +} + +//update faction power +$decay = (float) $dbCfg->factionDecay; +$sql = "UPDATE factions f SET f.power = FLOOR(:decay * f.power) + COALESCE(( + SELECT SUM(l.faction_value) FROM locations l WHERE l.type='caern' AND l.faction_id=f.faction_id +), 0)"; +$dbClient->query($sql, array('decay' => $decay)); + +//activate bosses +$sql = "SELECT MAX(level) As max_level, MAX(rank_id) AS max_rank FROM character_data"; +$row = $dbClient->selectRow($sql, array()); +$unlockBosses = ($row['max_level'] >= $dbCfg->bossUnlockLevel) && ($row['max_rank'] >= $dbCfg->bossUnlockRank); +if($unlockBosses) +{ + $dbClient->query("UPDATE locations SET boss_status='active' WHERE type='boss' AND boss_status != 'defeated'"); + if(!$dbCfg->endgame) + $dbCfg->endgame = 1; +} + +//run boss sieges +$sql = "SELECT location_id, name FROM locations WHERE type='boss' AND boss_status = 'active'"; +$locations = $dbClient->selectAll($sql); +if($locations) +{ + $factionPowers = array(); + $sql = "SELECT faction_id, power FROM factions"; + foreach($dbClient->selectAll($sql) as $row) + $factionPowers[$row['faction_id']] = $row['power']; + foreach($locations as $row) + { + $combat = new Daemon_BossCombat(); + $combat->attachDbClient($dbClient); + $combat->execute($row['location_id'], $factionPowers); + $combatLog = $combat->getCombatLog(); + if($combatLog) + { + $sql = "INSERT INTO battles(rollover_id, location_id, type, combat_log) + VALUES (:rolloverId, :locationId, 'boss', :combatLog)"; + $params = array('rolloverId' => $rolloverId, 'locationId' => $row['location_id'], 'combatLog' => $combatLog); + $dbClient->query($sql, $params); + $forum->addChat(null, 'public', "Siedziba bossa \"$row[name]\" zaatakowana!"); + } + } +} + + +//check for ending +$factions = array(); +$sql = "SELECT faction_id, name FROM factions"; +foreach($dbClient->selectAll($sql) as $row) + $factions[$row['faction_id']] = array('name' => $row['name'], 'active' => 0, 'defeated' => 0); +$sql = "SELECT faction_id, (boss_status!='defeated') AS active + FROM locations WHERE type = 'boss' GROUP BY faction_id, active"; +foreach($dbClient->selectAll($sql) as $row) +{ + if($row['active']) + $factions[$row['faction_id']]['active']++; + else + $factions[$row['faction_id']]['defeated']++; +} +$active = array(); +$defeated = array(); +foreach($factions as $factionId => $row) +{ + if($row['active'] || !$row['defeated']) + $active[$factionId] = $row['name']; + else + $defeated[$factionId] = $row['name']; +} +$endgame = (count($active) < 2); +if($endgame) +{ + //final messages + $active = implode(', ', $active); + switch($active) + { + case 'blue': + $msg = "Rewolucja została stłumiona. Niech żyje Porządek!"; + break; + case 'red': + $msg = "Cesarz został obalony. Niech żyje Rewolucja!"; + break; + default: + $msg = "Wojna dobiegła końca, lecz brak w niej zwycięzców. Czas pokaże, kto zajmie miejsce dawnych potęg..."; + } + $forum->addChat(null, 'public', $msg); + //cleanup + $dbCfg->globalMessage = $msg; + $dbCfg->rolloversEnabled = 0; + $dbCfg->turnDelta = 0; + $dbCfg->defaultRespawn = ''; + $sql = "UPDATE character_data SET turns = 0, location_id = NULL"; + $dbClient->query($sql); + $sql = "TRUNCATE TABLE character_regions"; + $dbClient->query($sql); +} + +//update rollover data +$sql = "SELECT COUNT(1) FROM players"; +$nPlayers = $dbClient->selectValue($sql); +$sql = "SELECT COUNT(1) FROM characters"; +$nChars = $dbClient->selectValue($sql); +$sql = "SELECT COUNT(1) FROM clans"; +$nClans = $dbClient->selectValue($sql); +$sql = "UPDATE rollovers SET players_total = :players, characters_total = :chars, + clans_total = :clans WHERE rollover_id = :id"; +$params = array('id' => $rolloverId, 'players' => $nPlayers, 'chars' => $nChars, 'clans' => $nClans); +$dbClient->query($sql, $params); diff --git a/2013/daemon/daemon.sql b/2013/daemon/daemon.sql new file mode 100644 index 0000000..caa3a9e --- /dev/null +++ b/2013/daemon/daemon.sql @@ -0,0 +1,525 @@ +CREATE TABLE battles ( + battle_id int NOT NULL AUTO_INCREMENT, + rollover_id smallint NOT NULL, + location_id varchar(32) NOT NULL, + "type" enum('caern','boss') NOT NULL, + combat_log text NOT NULL, + PRIMARY KEY (battle_id), + KEY rollover_id (rollover_id,battle_id) +); + + +CREATE TABLE characters ( + character_id int NOT NULL AUTO_INCREMENT, + player_id int DEFAULT NULL, + "name" varchar(255) NOT NULL, + gender enum('f','m','n') NOT NULL, + date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_action datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + show_player tinyint(1) NOT NULL DEFAULT 0, + last_mail_id int NOT NULL DEFAULT 0, + clan_id varchar(8) DEFAULT NULL, + avatar_url tinytext, + quote text, + description text, + PRIMARY KEY (character_id), + UNIQUE KEY "name" ("name"), + KEY clan (clan_id,character_id), + KEY date_created (date_created,character_id), + KEY player_id (player_id,character_id), + KEY last_action (last_action) +); + + +CREATE TABLE character_data ( + character_id int NOT NULL, + location_id varchar(32) DEFAULT NULL COMMENT 'current location', + faction_id varchar(32) DEFAULT NULL, + faction_points smallint NOT NULL DEFAULT 0, + rank_id tinyint DEFAULT NULL, + turns smallint NOT NULL DEFAULT 30, + gold_purse int NOT NULL DEFAULT 0, + gold_bank int NOT NULL DEFAULT 0, + "level" smallint NOT NULL DEFAULT 0, + xp_free int NOT NULL DEFAULT 29, + xp_used int NOT NULL DEFAULT 0, + deaths int NOT NULL DEFAULT 0, + health smallint NOT NULL DEFAULT 0, + health_max smallint NOT NULL DEFAULT 70, + mana smallint NOT NULL DEFAULT 0, + mana_max smallint NOT NULL DEFAULT 35, + mana_regen smallint NOT NULL DEFAULT 1, + a_str smallint NOT NULL DEFAULT 7, + a_dex smallint NOT NULL DEFAULT 7, + a_vit smallint NOT NULL DEFAULT 7, + a_pwr smallint NOT NULL DEFAULT 7, + a_wil smallint NOT NULL DEFAULT 7, + s_pstr smallint NOT NULL DEFAULT 0, + s_patk smallint NOT NULL DEFAULT 0, + s_pdef smallint NOT NULL DEFAULT 0, + s_pres smallint NOT NULL DEFAULT 0, + s_preg smallint NOT NULL DEFAULT 0, + s_mstr smallint NOT NULL DEFAULT 0, + s_matk smallint NOT NULL DEFAULT 0, + s_mdef smallint NOT NULL DEFAULT 0, + s_mres smallint NOT NULL DEFAULT 0, + s_mreg smallint NOT NULL DEFAULT 0, + sp_scout tinyint NOT NULL DEFAULT 0, + sp_identify tinyint NOT NULL DEFAULT 0, + sp_vchar tinyint NOT NULL DEFAULT 0, + sp_vmonster tinyint NOT NULL DEFAULT 0, + sp_vitem tinyint NOT NULL DEFAULT 0, + combat_unit_id varchar(32) DEFAULT NULL, + location_event text COMMENT 'event parameters', + PRIMARY KEY (character_id), + KEY "level" ("level",character_id), + KEY xp_used (xp_used,character_id), + KEY faction_id (faction_id,character_id), + KEY location_id (location_id,character_id) +); + + +CREATE TABLE character_missions ( + character_id int NOT NULL, + rollover_id int NOT NULL, + service_id varchar(32) NOT NULL, + "type" enum('monster','item') NOT NULL, + params varchar(32) NOT NULL, + progress enum('active','completed','rewarded') NOT NULL DEFAULT 'active', + PRIMARY KEY (character_id,rollover_id) +); + + +CREATE TABLE character_regions ( + character_id int NOT NULL, + region_id varchar(32) NOT NULL, + PRIMARY KEY (character_id,region_id) +); + + +CREATE TABLE character_statistics ( + character_id int NOT NULL, + missions smallint NOT NULL DEFAULT 0, + duel_wins smallint NOT NULL DEFAULT 0, + duel_losses smallint NOT NULL DEFAULT 0, + kills_mob1 smallint NOT NULL DEFAULT 0, + kills_mob2 smallint NOT NULL DEFAULT 0, + kills_mob3 smallint NOT NULL DEFAULT 0, + kills_mob4 smallint NOT NULL DEFAULT 0, + PRIMARY KEY (character_id), + KEY duel_wins (duel_wins,character_id), + KEY duel_losses (duel_losses,character_id) +); + + +CREATE TABLE character_titles ( + character_id int NOT NULL, + title_id varchar(32) NOT NULL, + PRIMARY KEY (character_id,title_id) +); + + +CREATE TABLE chat ( + message_id int NOT NULL AUTO_INCREMENT, + date_added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + channel_id varchar(255) NOT NULL, + sender_id int DEFAULT NULL, + content text NOT NULL, + PRIMARY KEY (message_id), + KEY sort (channel_id,message_id) +); + + +CREATE TABLE clans ( + clan_id varchar(8) NOT NULL, + "name" varchar(255) NOT NULL, + date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + leader_id int DEFAULT NULL, + description text, + PRIMARY KEY (clan_id), + UNIQUE KEY "name" ("name") +); + + +CREATE TABLE clan_invitations ( + clan_id varchar(32) NOT NULL, + character_id int NOT NULL, + date_added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + description text, + PRIMARY KEY (clan_id,character_id), + KEY search (character_id,clan_id) +); + + +CREATE TABLE combat_units ( + combat_unit_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + faction_id varchar(32) DEFAULT NULL, + health int NOT NULL DEFAULT 70, + health_max int NOT NULL DEFAULT 70, + str1 smallint NOT NULL DEFAULT 7, + atk1 smallint NOT NULL DEFAULT 7, + type1 enum('p','m') DEFAULT 'p', + count1 smallint NOT NULL DEFAULT 1, + sp1_type varchar(32) DEFAULT NULL, + sp1_param smallint DEFAULT NULL, + str2 smallint NOT NULL DEFAULT 7, + atk2 smallint NOT NULL DEFAULT 7, + type2 enum('p','m') DEFAULT NULL, + count2 smallint NOT NULL DEFAULT 0, + sp2_type varchar(32) DEFAULT NULL, + sp2_param smallint DEFAULT NULL, + pdef smallint NOT NULL DEFAULT 7, + pres smallint NOT NULL DEFAULT 7, + mdef smallint NOT NULL DEFAULT 7, + mres smallint NOT NULL DEFAULT 7, + speed smallint NOT NULL DEFAULT 7, + armor smallint NOT NULL DEFAULT 0, + armor_sp_type varchar(32) DEFAULT NULL, + armor_sp_param smallint DEFAULT NULL, + regen float NOT NULL DEFAULT 0, + PRIMARY KEY (combat_unit_id) +); + + +CREATE TABLE duels ( + duel_id int NOT NULL AUTO_INCREMENT, + date_added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + rollover_id smallint DEFAULT NULL, + attacker_id int NOT NULL, + defender_id int NOT NULL, + "type" enum('normal','arena') NOT NULL, + winner enum('a','b') DEFAULT NULL, + combat_log text, + PRIMARY KEY (duel_id) +); + + +CREATE TABLE "events" ( + event_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + handle varchar(255) DEFAULT NULL, + description text, + PRIMARY KEY (event_id) +); + + +CREATE TABLE factions ( + faction_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + power smallint NOT NULL DEFAULT 0, + PRIMARY KEY (faction_id) +); + + +CREATE TABLE faction_ranks ( + faction_id varchar(32) NOT NULL, + rank_id tinyint NOT NULL, + min_points smallint NOT NULL DEFAULT 1, + title_id varchar(32) DEFAULT NULL, + PRIMARY KEY (faction_id,rank_id) +); + + +CREATE TABLE inventory ( + inventory_id int NOT NULL AUTO_INCREMENT, + character_id int NOT NULL, + item_id varchar(32) NOT NULL, + "status" enum('inventory','storage') NOT NULL DEFAULT 'inventory', + flags set('bound','identified') NOT NULL, + equipped enum('hand_a','hand_b','armor','helmet','gloves','boots','pendant','accesory_a','accesory_b') DEFAULT NULL, + PRIMARY KEY (inventory_id), + KEY sort (character_id,"status") +); + + +CREATE TABLE items ( + item_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + "type" enum('weapon1h','weapon2h','armor','helmet','gloves','boots','pendant','accesory','item') NOT NULL DEFAULT 'item', + "value" int NOT NULL DEFAULT 0, + suggested_value float NOT NULL DEFAULT 0, + damage_type enum('p','m') DEFAULT NULL, + special_type varchar(32) DEFAULT NULL, + special_param varchar(255) DEFAULT NULL, + pstr_p smallint NOT NULL DEFAULT 0, + pstr_c smallint NOT NULL DEFAULT 0, + patk_p smallint NOT NULL DEFAULT 0, + patk_c smallint NOT NULL DEFAULT 0, + pdef_p smallint NOT NULL DEFAULT 0, + pdef_c smallint NOT NULL DEFAULT 0, + pres_p smallint NOT NULL DEFAULT 0, + pres_c smallint NOT NULL DEFAULT 0, + mstr_p smallint NOT NULL DEFAULT 0, + mstr_c smallint NOT NULL DEFAULT 0, + matk_p smallint NOT NULL DEFAULT 0, + matk_c smallint NOT NULL DEFAULT 0, + mdef_p smallint NOT NULL DEFAULT 0, + mdef_c smallint NOT NULL DEFAULT 0, + mres_p smallint NOT NULL DEFAULT 0, + mres_c smallint NOT NULL DEFAULT 0, + armor smallint NOT NULL DEFAULT 0, + speed smallint NOT NULL DEFAULT 0, + regen smallint NOT NULL DEFAULT 0, + description text, + PRIMARY KEY (item_id) +); + + +CREATE TABLE item_specials ( + special_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + handle varchar(255) DEFAULT NULL, + description text, + PRIMARY KEY (special_id) +); + + +CREATE TABLE item_templates ( + id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + pstr_p_p smallint NOT NULL DEFAULT 1, + pstr_p_m smallint NOT NULL DEFAULT 1, + pstr_c_p smallint NOT NULL DEFAULT 1, + pstr_c_m smallint NOT NULL DEFAULT 1, + patk_p_p smallint NOT NULL DEFAULT 1, + patk_p_m smallint NOT NULL DEFAULT 1, + patk_c_p smallint NOT NULL DEFAULT 1, + patk_c_m smallint NOT NULL DEFAULT 1, + pdef_p_p smallint NOT NULL DEFAULT 1, + pdef_p_m smallint NOT NULL DEFAULT 1, + pdef_c_p smallint NOT NULL DEFAULT 1, + pdef_c_m smallint NOT NULL DEFAULT 1, + pres_p_p smallint NOT NULL DEFAULT 1, + pres_p_m smallint NOT NULL DEFAULT 1, + pres_c_p smallint NOT NULL DEFAULT 1, + pres_c_m smallint NOT NULL DEFAULT 1, + mstr_p_p smallint NOT NULL DEFAULT 1, + mstr_p_m smallint NOT NULL DEFAULT 1, + mstr_c_p smallint NOT NULL DEFAULT 1, + mstr_c_m smallint NOT NULL DEFAULT 1, + matk_p_p smallint NOT NULL DEFAULT 1, + matk_p_m smallint NOT NULL DEFAULT 1, + matk_c_p smallint NOT NULL DEFAULT 1, + matk_c_m smallint NOT NULL DEFAULT 1, + mdef_p_p smallint NOT NULL DEFAULT 1, + mdef_p_m smallint NOT NULL DEFAULT 1, + mdef_c_p smallint NOT NULL DEFAULT 1, + mdef_c_m smallint NOT NULL DEFAULT 1, + mres_p_p smallint NOT NULL DEFAULT 1, + mres_p_m smallint NOT NULL DEFAULT 1, + mres_c_p smallint NOT NULL DEFAULT 1, + mres_c_m smallint NOT NULL DEFAULT 1, + armor_p smallint NOT NULL DEFAULT 1, + armor_m smallint NOT NULL DEFAULT 1, + speed_p smallint NOT NULL DEFAULT 1, + speed_m smallint NOT NULL DEFAULT 1, + regen_p smallint NOT NULL DEFAULT 1, + regen_m smallint NOT NULL DEFAULT 1, + PRIMARY KEY (id) +); + + +CREATE TABLE locations ( + location_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + "type" enum('normal','arena','caern','boss') NOT NULL DEFAULT 'normal', + chance1 smallint NOT NULL DEFAULT 1, + chance2 smallint NOT NULL DEFAULT 1, + region_id varchar(32) DEFAULT NULL, + faction_id varchar(32) DEFAULT NULL, + faction_value tinyint NOT NULL DEFAULT 1, + description text, + picture_url tinytext, + boss_id varchar(32) DEFAULT NULL, + boss_status enum('hidden','active','defeated') DEFAULT NULL, + PRIMARY KEY (location_id), + KEY region_id (region_id,location_id), + KEY faction_id (faction_id,location_id), + KEY "type" ("type",location_id) +); + + +CREATE TABLE location_events ( + location_id varchar(32) NOT NULL, + event_id varchar(32) NOT NULL, + chance smallint NOT NULL DEFAULT 1, + params varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (location_id,event_id), + KEY event_id (event_id,location_id) +); + + +CREATE TABLE location_monsters ( + location_id varchar(32) NOT NULL, + monster_id varchar(32) NOT NULL, + chance smallint NOT NULL DEFAULT 1, + PRIMARY KEY (location_id,monster_id), + KEY monster_id (monster_id,location_id) +); + + +CREATE TABLE location_paths ( + location_id varchar(32) NOT NULL, + destination_id varchar(32) NOT NULL, + "name" varchar(255) DEFAULT NULL, + cost_gold int NOT NULL DEFAULT 0, + cost_mana smallint NOT NULL DEFAULT 0, + PRIMARY KEY (location_id,destination_id), + KEY destination_id (destination_id,location_id) +); + + +CREATE TABLE location_services ( + location_id varchar(32) NOT NULL, + service_id varchar(32) NOT NULL, + PRIMARY KEY (location_id,service_id) +); + + +CREATE TABLE mail ( + message_id int NOT NULL AUTO_INCREMENT, + date_added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + sender_id int DEFAULT NULL, + recipient_id int NOT NULL, + content text NOT NULL, + PRIMARY KEY (message_id), + KEY sort (recipient_id,message_id) +); + + +CREATE TABLE maps ( + map_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + url varchar(255) NOT NULL, + sort smallint NOT NULL DEFAULT 0, + PRIMARY KEY (map_id) +); + + +CREATE TABLE monsters ( + monster_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + class smallint NOT NULL DEFAULT 1, + "level" smallint NOT NULL DEFAULT 1, + gold int NOT NULL DEFAULT 0, + chance1 smallint NOT NULL DEFAULT 1, + chance2 smallint NOT NULL DEFAULT 1, + title_id varchar(255) DEFAULT NULL, + combat_unit_id varchar(32) DEFAULT NULL, + PRIMARY KEY (monster_id) +); + + +CREATE TABLE monster_drops ( + monster_id varchar(32) NOT NULL, + item_id varchar(32) NOT NULL, + chance smallint NOT NULL DEFAULT 1, + PRIMARY KEY (monster_id,item_id) +); + + +CREATE TABLE newsfeed ( + id varchar(255) NOT NULL, + updated timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + published timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', + title varchar(255) DEFAULT NULL, + author varchar(255) DEFAULT NULL, + content text, + PRIMARY KEY (id), + KEY published (published) +); + + +CREATE TABLE parameters ( + "name" varchar(255) NOT NULL, + "value" text NOT NULL, + PRIMARY KEY ("name") +); + + +CREATE TABLE players ( + player_id int NOT NULL AUTO_INCREMENT, + "name" varchar(255) DEFAULT NULL, + login varchar(255) NOT NULL, + "password" varchar(255) NOT NULL, + date_created timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + last_login datetime DEFAULT NULL, + roles set('chat','login') NOT NULL DEFAULT 'chat,login', + skin varchar(255) DEFAULT NULL, + email varchar(255) DEFAULT NULL, + reset_key varchar(255) DEFAULT NULL, + reset_until date DEFAULT NULL, + reset_password varchar(255) DEFAULT NULL, + PRIMARY KEY (player_id), + UNIQUE KEY login (login), + KEY reset_key (reset_key) +); + + +CREATE TABLE regions ( + region_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + respawn_id varchar(32) DEFAULT NULL, + picture_url tinytext, + PRIMARY KEY (region_id) +); + + +CREATE TABLE rollovers ( + rollover_id smallint NOT NULL AUTO_INCREMENT, + date_added timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, + players_total smallint NOT NULL DEFAULT 0, + characters_total smallint NOT NULL DEFAULT 0, + clans_total smallint DEFAULT NULL, + PRIMARY KEY (rollover_id) +); + + +CREATE TABLE services ( + service_id varchar(32) NOT NULL, + "type" enum('bank','healer','npc','shop','temple') NOT NULL, + "name" varchar(255) NOT NULL, + faction_id varchar(32) DEFAULT NULL, + rank_id tinyint DEFAULT NULL, + description text, + PRIMARY KEY (service_id) +); + + +CREATE TABLE service_items ( + service_id varchar(32) NOT NULL, + item_id varchar(32) NOT NULL, + "type" enum('normal','drop') NOT NULL DEFAULT 'normal', + quantity smallint DEFAULT NULL, + PRIMARY KEY (service_id,item_id), + KEY item_id (item_id,service_id) +); + + +CREATE TABLE spells ( + spell_id varchar(32) NOT NULL, + "name" varchar(255) NOT NULL, + max_level tinyint NOT NULL DEFAULT 7, + max_cost smallint NOT NULL DEFAULT 10, + min_cost smallint NOT NULL DEFAULT 1, + handle varchar(255) DEFAULT NULL, + PRIMARY KEY (spell_id) +); + +INSERT INTO spells (spell_id, `name`, max_level, max_cost, min_cost, handle) VALUES +('identify', 'Identyfikacja', 6, 45, 25, 'Identify'), +('scout', 'Badanie Terenu', 4, 35, 20, 'Scout'), +('vchar', 'Poznanie Postaci', 7, 60, 30, 'ScanCharacter'), +('vitem', 'Poznanie Przedmiotu', 6, 40, 20, 'ScanItem'), +('vmonster', 'Poznanie Potwora', 5, 40, 20, 'ScanMonster'); + +CREATE TABLE titles ( + title_id varchar(32) NOT NULL, + name_f varchar(255) NOT NULL DEFAULT '', + name_m varchar(255) NOT NULL DEFAULT '', + name_n varchar(255) NOT NULL DEFAULT '', + "type" enum('normal','special') NOT NULL DEFAULT 'normal', + PRIMARY KEY (title_id), + KEY "type" ("type",title_id) +); diff --git a/2013/daemon/lib/daemon.php b/2013/daemon/lib/daemon.php new file mode 100644 index 0000000..3d3824c --- /dev/null +++ b/2013/daemon/lib/daemon.php @@ -0,0 +1,102 @@ +dbHost, $cfg->dbSchema); + $params = array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8', time_zone = '+1:00'"); + $dbh = new PDO($dsn, $cfg->dbUser, $cfg->dbPassword, $params); + $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); + return new Daemon_DbClient($dbh); + } + + + //prepares multiline text for displaying, also inserts some basic tags + public static function formatMessage($txt, $markup = false) + { + $txt = nl2br(htmlspecialchars($txt, ENT_QUOTES)); + if($markup) + { + $txt = preg_replace('@\[img\](.+)\[/img\]@uU', '$1', $txt); + $txt = preg_replace('@\[url=(.+)\](.+)\[/url\]@uU', '$2', $txt); + $txt = preg_replace('@\[url\]([img]){0}(.+)\[/url\]@uU', '$1', $txt); + $txt = preg_replace('@(^|>|\s)(https://\S+)($|<|\s)@muU', '$1$2$3', $txt); + $txt = preg_replace('@(^|>|\s)(http://\S+)($|<|\s)@muU', '$1$2$3', $txt); + $txt = preg_replace('@\[b\](.+)\[/b\]@uU', '$1', $txt); + $txt = preg_replace('@\[i\](.+)\[/i\]@uU', '$1', $txt); + $txt = preg_replace('@\[u\](.+)\[/u\]@uU', '$1', $txt); + $txt = preg_replace('@\[s\](.+)\[/s\]@uU', '$1', $txt); + $txt = preg_replace('@\[sub\](.+)\[/sub\]@uU', '$1', $txt); + $txt = preg_replace('@\[sup\](.+)\[/sup\]@uU', '$1', $txt); + } + return $txt; + } + + + //returns value from array, or defaults if it doesn't exist + public static function getArrayValue(array $a, $name, $default = null) + { + return isset($a[$name]) ? $a[$name] : $default; + } + + + //implodes whitespace, optionally preserving newlines + public static function normalizeString($string, $preserveNewlines = false) + { + $string = str_replace(array("\r\n","\r"), "\n", $string); //unix newlines + if($preserveNewlines) + $string = preg_replace('/[^\S\n]+/', ' ', $string); + else $string = preg_replace('/\s+/', ' ', $string); + $string = trim($string); + return $string; + } + + + //generates a password hash + public static function passwordHash($salt, $text) + { + return sha1($salt . $text); + } + + + //returns random salt for password hashing + public static function passwordSalt() + { + $c0 = ord('0'); + $cA = ord('a'); + $cZ = ord('z'); + $max = 10+$cZ-$cA; + $salt = ''; + for($i = 0; $i < 8; ++$i) + { + $x = mt_rand(0, $max); + if($x < 10) + $salt .= chr($c0 + $x); + else $salt .= chr($cA + $x - 10); + } + return $salt; + } + + + //redirects to selected url + public static function redirect($url) + { + session_write_close(); //just in case + header('Content-Type: text/html; charset=UTF-8'); + header(sprintf('Location: %s', $url), true, 303); //"See Other" status + printf('Redirect

continue

', $url); + } +} diff --git a/2013/daemon/lib/daemon/bosscombat.php b/2013/daemon/lib/daemon/bosscombat.php new file mode 100644 index 0000000..fd272d0 --- /dev/null +++ b/2013/daemon/lib/daemon/bosscombat.php @@ -0,0 +1,100 @@ +getLocation($locationId); + $bossFactionId = $location['faction_id']; + $powerMod = Daemon_Math::factionPowerMult($bossFactionId, $factionPowers); + //prepare units + $this->kickNeutrals($locationId); + $units = $this->getCharacterUnits($locationId); + //check for empty caern + if(empty($units)) + return null; + $attackers = false; + foreach($units as $factionId => $faction) + { + if($factionId != $bossFactionId) + $attackers = true; + } + if(!$attackers) + return null; + unset($attackers, $factionId, $faction); + //prepare boss + $boss = $this->getBossUnit($location['boss_id'], $bossFactionId, $powerMod); + if(empty($boss)) + return null; + $units[$bossFactionId][$boss->_id] = $boss; + //add monster support + $supportCount = 0; + foreach($units as $factionId => $faction) + { + if($factionId != $bossFactionId) + $supportCount += count($faction); + else + $supportCount -= count($faction); + } + if($supportCount > 0) + { + $support = $this->getLocationMonsters($locationId, $bossFactionId, $supportCount); + foreach($support as $unit) + $units[$bossFactionId][$unit->_id] = $unit; + } + unset($support, $supportCount); + //execute combat + $this->combatLog = $this->runCombat($units, $bossFactionId); + //save characters + $this->putCharacterUnits($units); + //find winner + $winnerId = $this->getWinnerFaction($units); + //kick losers + $this->kickEnemies($locationId, $winnerId); + //update location, send message + if($winnerId != $bossFactionId) + { + $sql = "UPDATE locations SET boss_status='defeated' WHERE location_id=:id"; + $params = array('id' => $locationId); + $this->dbClient->query($sql, $params); + $msg = "Boss $boss->name z lokacji $location[name] został pokonany!"; + $forum = new Daemon_Forum($this->dbClient); + $forum->addChat(null, 'public', $msg); + } + } + + + private function getBossUnit($monsterId, $factionId, $powerMod) + { + //read base stats + $sql = "SELECT monster_id, name, combat_unit_id + FROM monsters WHERE monster_id=:id"; + $row = $this->dbClient->selectRow($sql, array('id' => $monsterId)); + $unit = new Daemon_Combat_Unit(); + $unit->attachDbClient($this->dbClient); + $unit->get(array('combat_unit_id' => $row['combat_unit_id'])); + $unit->name = $row['name']; + $unit->faction_id = $factionId; + $unit->_id = 'boss'; + //modify stats + $modified = array( + 'str1', 'atk1', 'str2', 'atk2', + 'pdef', 'pres', 'mdef', 'mres', + 'speed', 'armor', 'regen', 'healthMax', + ); + foreach($modified as $name) + $unit->$name *= $powerMod; + $unit->health = $unit->healthMax; + return $unit; + } + + + private function getLocation($locationId) + { + $sql = "SELECT l.faction_id, l.boss_id, l.name, f.name AS faction_name + FROM locations l JOIN factions f USING(faction_id) + WHERE location_id = :id"; + return $this->dbClient->selectRow($sql, array('id' => $locationId)); + } +} diff --git a/2013/daemon/lib/daemon/caernsiege.php b/2013/daemon/lib/daemon/caernsiege.php new file mode 100644 index 0000000..312bb43 --- /dev/null +++ b/2013/daemon/lib/daemon/caernsiege.php @@ -0,0 +1,270 @@ + $faction) + { + foreach($faction as $unit) + { + $attacker = ($factionId != $locationFactionId); + $combat->addUnit($unit->_id, $unit, $attacker); + } + } + } + + + public function attachDbClient(Daemon_DbClient $dbClient) + { + $this->dbClient = $dbClient; + } + + + //executes the siege, generates the report + public function execute($locationId) + { + //prepare units + $this->kickNeutrals($locationId); + $faction = $this->getLocationFaction($locationId); + $caernFactionId = $faction['id']; + $units = $this->getCharacterUnits($locationId); + //check for empty caern + if(empty($units)) + { + $this->combatLog = '

Caern utracony z braku obrońców.

'; + $winnerId = null; + } + else + { + //add monster support + $supportCount = 0; + foreach($units as $factionId => $faction) + { + if($factionId != $caernFactionId) + $supportCount += count($faction); + else + $supportCount -= count($faction); + } + if($supportCount > 0) + { + $support = $this->getLocationMonsters($locationId, $caernFactionId, $supportCount); + foreach($support as $unit) + $units[$caernFactionId][$unit->_id] = $unit; + } + unset($support, $supportCount); + //execute combat + $this->combatLog = $this->runCombat($units, $caernFactionId); + //save characters + $this->putCharacterUnits($units); + //find winner (units modified by combat) + $winnerId = $this->getWinnerFaction($units); + if(!$winnerId) + $msg = 'utracony'; + elseif($winnerId != $caernFactionId) + $msg = 'przejęty'; + else + $msg = 'utrzymany'; + $this->combatLog .= "

Caern $msg!

"; + } + //kick losers + $this->kickEnemies($locationId, $winnerId); + //update location + $sql = "UPDATE locations SET faction_id=:fid WHERE location_id=:id"; + $params = array('fid' => $winnerId, 'id' => $locationId); + $this->dbClient->query($sql, $params); + } + + + protected function getCharacterUnits($locationId) + { + $units = array(); + $sql = "SELECT cd.character_id, c.name, cd.faction_id, cd.health, cd.health_max, cd.combat_unit_id + FROM character_data cd JOIN characters c USING(character_id) + WHERE location_id=:id AND cd.faction_id IS NOT NULL ORDER BY xp_used DESC"; + $data = $this->dbClient->selectAll($sql, array('id' => $locationId)); + foreach($data as $row) + { + $unit = new Daemon_Combat_Unit(); + $unit->attachDbClient($this->dbClient); + $unit->get(array('combat_unit_id' => $row['combat_unit_id'])); + $unit->name = $row['name']; + $unit->faction_id = $row['faction_id']; + $unit->health = $row['health_max']; + $unit->health_max = $row['health_max']; + $unit->_id = $row['character_id']; + $units[$row['faction_id']][$unit->_id] = $unit; + } + return $units; + } + + + public function getCombatLog() + { + return $this->combatLog; + } + + + protected function getLocationFaction($locationId) + { + $sql = "SELECT faction_id AS id, f.name + FROM locations l JOIN factions f USING(faction_id) + WHERE location_id=:id"; + return $this->dbClient->selectRow($sql, array('id' => $locationId)); + } + + + protected function getLocationMonsters($locationId, $factionId, $desiredCount) + { + $result = array(); + $sql = "SELECT m.monster_id, m.name, m.combat_unit_id + FROM location_monsters lm JOIN monsters m USING(monster_id) + WHERE location_id=:id"; + $mobs = $this->dbClient->selectAll($sql, array('id' => $locationId)); + if(empty($mobs)) + return array(); + for($i = 0; $i < $desiredCount; ++$i) + { + $row = $mobs[array_rand($mobs)]; + $unit = new Daemon_Combat_Unit(); + $unit->attachDbClient($this->dbClient); + $unit->get(array('combat_unit_id' => $row['combat_unit_id'])); + $unit->name = $row['name']; + $unit->faction_id = $factionId; + $unit->_id = "mob_$i"; + $result[$unit->_id] = $unit; + } + return $result; + } + + + protected function getWinnerFaction(array $units) + { + $survivors = array(); + foreach($units as $factionId => $faction) + { + $survivors[$factionId] = 0; + foreach($faction as $unit) + { + if($unit->health > 0) + $survivors[$unit->faction_id] += 1; + } + } + $winnerId = null; + $winnerCount = 0; + foreach($survivors as $factionId => $count) + { + if($winnerCount < $count) + { + $winnerId = $factionId; + $winnerCount = $count; + } + } + return $winnerId; + } + + + //kicks enemies out of the caern + public function kickEnemies($locationId, $factionId) + { + $sql = "UPDATE character_data SET location_id=NULL WHERE location_id=:locationId"; + $params = array('locationId' => $locationId); + if($factionId) + { + $sql .= " AND faction_id!=:factionId"; + $params['factionId'] = $factionId; + } + $this->dbClient->query($sql, $params); + } + + + //kicks neutral characters out of the caern + protected function kickNeutrals($locationId) + { + $sql = "UPDATE character_data SET location_id=NULL WHERE location_id=:id AND faction_id IS NULL"; + $this->dbClient->query($sql, array('id' => $locationId)); + } + + + protected function putCharacterUnits(array $units) + { + $sqlLive = "UPDATE character_data SET health=:hp WHERE character_id=:id"; + $sqlDie = "UPDATE character_data SET health=0, location_id=null WHERE character_id=:id"; + foreach($units as $faction) + { + foreach($faction as $unit) + { + if(!is_numeric($unit->_id)) + continue;//monsters have string IDs + if($unit->health > 0) + { + $params = array('id' => $unit->_id, 'hp' => $unit->health); + $this->dbClient->query($sqlLive, $params); + } + else + { + $params = array('id' => $unit->_id); + $this->dbClient->query($sqlDie, $params); + } + } + } + } + + + public function runCombat(array $units, $locationFactionId) + { + $combat = new Daemon_Combat(); + $logger = new Daemon_Combat_Log(); + $combat->attachLogger($logger); + foreach($units as $factionId => $faction) + { + foreach($faction as $unit) + { + $attacker = ($factionId != $locationFactionId); + $combat->addUnit($unit->_id, $unit, $attacker); + } + } + $combat->execute(); + foreach($combat->units as &$unit) + $unit->health = max(0, ceil($unit->health)); + //prepare summary + $summary = array(); + $summary[] = ''; + $summary[] = ''; + $summary[] = ''; + $summary[] = ''; + $summary[] = ''; + $summary[] = ''; + $summary[] = ''; + $summary[] = ''; + $summary[] = ''; + $summary[] = ''; + $summary[] = ''; + foreach($units as $factionId => $faction) + { + foreach($faction as $unit) + { + $attackerTxt = $unit->_attacker ? 'atak' : 'obrona'; + $dmgTotal = $unit->_dmgDealt + $unit->_dmgTaken; + $health = max(0, ceil($unit->health_max - $unit->_dmgTaken)); + $healthPercent = $unit->health_max ? round(100 * $health / $unit->health_max, 2) : 0; + $avgDealt = $unit->_cntDealt ? $unit->_dmgDealt / $unit->_cntDealt : null; + $avgTaken = $unit->_cntTaken ? $unit->_dmgTaken / $unit->_cntTaken : null; + $summary[] = ''; + $summary[] = sprintf('', + $attackerTxt, $unit->name, $unit->faction_id, $healthPercent); + $summary[] = sprintf('', + $unit->_cntDealt, $unit->_dmgDealt, $avgDealt); + $summary[] = sprintf('', + $unit->_cntTaken, $unit->_dmgTaken, $avgTaken); + $summary[] = ''; + } + } + $summary[] = '
Podsumowanie bitwy
StronaPostaćWykonane atakiOtrzymane ataki
ImięFrakcjaZdrowieAtakiObrażeniaŚredniaAtakiObrażeniaŚrednia
%s%s%s%.2f%%%d%.3f%.3f%d%.3f%.3f
'; + return implode('', $summary) . (string) $logger; + } +} diff --git a/2013/daemon/lib/daemon/combat.php b/2013/daemon/lib/daemon/combat.php new file mode 100644 index 0000000..a1134a9 --- /dev/null +++ b/2013/daemon/lib/daemon/combat.php @@ -0,0 +1,164 @@ +attachLogger($logger); +//$combat->addUnit('a', $unit1, true); +//$combat->addUnit('b', $unit2, false); +//$combat->execute(); +//$combatLog = (string) $logger; +class Daemon_Combat +{ + public $units = array(); + public $sideA = array(); + public $sideB = array(); + public $round = 0; + public $roundLimit = 120; + public $tickLimit = 1; + private $_logger = null; + + + public function addUnit($unitId, Daemon_Combat_Unit $unit, $attacker) + { + $unit->attachLogger($this->_logger); + $unit->_id = $unitId; + $unit->_ticks = 0; + $unit->_initiative = mt_rand(0, 32 * $unit->speed); + $unit->_target = null; + $unit->_threat = array(); + $unit->_dmgDealt = 0; + $unit->_dmgTaken = 0; + $this->units[$unitId] = $unit; + $unit->_attacker = (bool) $attacker; + if($unit->_attacker) + { + $this->sideA[$unitId] = $unit; + $unit->_allies = &$this->sideA; + $unit->_enemies = &$this->sideB; + } + else + { + $this->sideB[$unitId] = $unit; + $unit->_allies = &$this->sideB; + $unit->_enemies = &$this->sideA; + } + } + + + public function attachLogger(Daemon_Combat_Log $logger) + { + $this->_logger = $logger; + foreach($this->units as $unit) + $unit->attachLogger($logger); + } + + + protected function callbackActive($unit) + { + return $unit->_ticks > $this->tickLimit; + } + + + protected function callbackSpeedSum($prev, $unit) + { + return $prev + $unit->speed; + } + + + protected function callbackTickCompare($unit1, $unit2) + { + if($unit1->_ticks == $unit2->_ticks) + return $unit1->_initiative - $unit2->_initiative; + else return ($unit1->_ticks < $unit2->_ticks) ? -1 : +1; + } + + + protected function callbackTickInc($unit, $key) + { + if($unit->health > 0) + $unit->_ticks += $unit->speed; + else $unit->_ticks = null; + } + + + protected function debug($round, array $units) + { + if($this->_logger) + { + $result = array("Segment $round"); + foreach($units as $unit) + $result[] = (string) $unit; + $this->_logger->add($result); + } + } + + + public function execute($noCleanup = false) + { + if(!$this->units) + return; + $unitCount = count($this->units); + if ($this->_logger) + $this->_logger->groupCombat = ($unitCount > 2); + $round = 0; + $roundLimit = 100 + 10 * $unitCount; + $speedSum = array_reduce($this->units, array($this, 'callbackSpeedSum'), 0); + $this->tickLimit = 1 + ceil(2 * $speedSum / count($this->units)); + while($round < $roundLimit) + { + $victory = false; + array_walk($this->units, array($this, 'callbackTickInc')); + while($actor = $this->getActiveUnit()) + { + ++$round; + $actor->_ticks -= $this->tickLimit; + $actor->executeRound($round); + //victory check, sides should be updated by units + $victory = (!count($this->sideA) || !count($this->sideB)); + if($victory) + break; + } + if($victory) + break; + } + //after-combat regen & fixes + if (!$noCleanup) + { + foreach($this->units as $unit) + { + if ($unit->health < 1) + { + $unit->health = 0; + } + elseif (($unit->regen > 0) && ($unit->health < $unit->health_max)) + { + $unit->health = $unit->health_max; + if($this->_logger) + $this->_logger->add("$unit->name regeneruje pełnię zdrowia.
"); + } + else + { + $unit->health = Daemon_Math::round($unit->health); + } + } + } + } + + + protected function getActiveUnit() + { + $active = array_filter($this->units, array($this, 'callbackActive')); + uasort($active, array($this, 'callbackTickCompare')); + return array_pop($active); + } + + + public function reset() + { + $this->units = array(); + $this->sideA = array(); + $this->sideB = array(); + } +} diff --git a/2013/daemon/lib/daemon/combat/log.php b/2013/daemon/lib/daemon/combat/log.php new file mode 100644 index 0000000..0c7708d --- /dev/null +++ b/2013/daemon/lib/daemon/combat/log.php @@ -0,0 +1,117 @@ +clear(); + } + + + public function __toString() + { + return $this->buffer; + } + + + public function add($text) + { + $this->buffer .= "$text\n"; + } + + + public function clear() + { + $this->buffer = ''; + } + + + public static function escape($str) + { + return htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); + } + + + public function txtAttackHit($name, $dmg, $magical, $critical, $poison, $shockDmg, $stun, $vampRegen) + { + $txt = $critical ? 'Trafienie krytyczne! ' : ''; + $txt .= sprintf('%s zadaje %.2f obrażeń %s', self::escape($name), + $dmg, $magical ? 'magicznych' : 'fizycznych'); + if($poison) + $txt .= ', zatruwając cel'; + if($stun) + $txt .= ', ogłuszając cel'; + if($vampRegen) + $txt .= sprintf(', regenerując %.2f HP', $vampRegen); + if($shockDmg) + $txt .= sprintf('. Otrzymuje %.2f obrażeń od porażenia', $shockDmg); + $txt .= '.
'; + $this->add($txt); + } + + + public function txtAttackMiss($name, $magical) + { + if($magical) + $this->add('Cel odbił zaklęcie.
'); + else $this->add(sprintf('%s chybił.
', self::escape($name))); + } + + + public function txtDeath($name, $flawlessName = null) + { + $txt = sprintf('%s umiera.
', $name); + if($flawlessName) + { + $atxt = array('%s ziewa.', '%s śmieje się szyderczo.'); + $txt .= sprintf($atxt[array_rand($atxt)], self::escape($flawlessName)).'
'; + } + $this->add($txt); + } + + + public function txtDemon($regen) + { + $this->add(sprintf('Demon w zbroi wchłonął zaklęcie. Cel regeneruje %.2f obrażeń.
', $regen)); + } + + + public function txtPoison($name, $dmg) + { + $this->add(sprintf('%s otrzymuje %.2f obrażeń od trucizny.
', self::escape($name), $dmg)); + } + + + public function txtRegen($name, $regen) + { + $this->add(sprintf('%s regeneruje %.2f obrażeń.
', self::escape($name), $regen)); + } + + + public function txtRoundFooter() + { + $this->add('

'); + } + + + public function txtRoundHeader($round) + { + $this->add(sprintf('

Akcja %d

', $round)); + } + + + public function txtTargetHeader($actorName, $targetName) + { + if($targetName) + { + if ($this->groupCombat) + $this->add(sprintf('%s wybiera cel: %s.
', + self::escape($actorName), self::escape($targetName))); + } + else $this->add(sprintf('%s nie ma już przeciwników.
', self::escape($actorName))); + } +} diff --git a/2013/daemon/lib/daemon/combat/unit.php b/2013/daemon/lib/daemon/combat/unit.php new file mode 100644 index 0000000..37eddc2 --- /dev/null +++ b/2013/daemon/lib/daemon/combat/unit.php @@ -0,0 +1,261 @@ +_id, name: $this->name, ticks: $this->_ticks, health: $this->health/$this->health_max]"; + } + + + public function attachLogger(Daemon_Combat_Log $logger = null) + { + $this->_logger = $logger; + } + + + protected function calculateAttack(array $params) + { + //attack count - check for swarm + if(self::SP_SWARM == $params['sp_type']) + $attackCount = ceil($params['count'] * $this->health / $this->health_max); + else $attackCount = $params['count']; + //prepare variables + $magical = ('m' == $params['type']); + if($magical) + { + $targetDef = $this->_target->mdef; + $targetRes = $this->_target->mres; + $armor = 0; + } + else + { + $targetDef = $this->_target->pdef; + $targetRes = $this->_target->pres; + $armor = $this->_target->armor; + if(self::SP_ETHER == $params['sp_type']) + $armor *= 1 - $params['sp_param']/100; + } + //calculate basic data + $toHit = 100 * $params['atk'] / ($params['atk'] + $targetDef); + $baseDmg = $params['str'] * $params['str'] / ($params['str'] + $targetRes); + //faction effects + if($this->faction_id && $this->_target->faction_id && ($this->faction_id != $this->_target->faction_id)) + { + if(self::SP_FACTION == $params['sp_type']) + $baseDmg *= 1 + $params['sp_param']/100; + if(self::SP_FACTION == $this->_target->armor_sp_type) + $baseDmg /= 1 + $this->_target->armor_sp_param/100; + } + //execute attacks + for($i=0; $i < $attackCount; $i++) + { + $d100 = mt_rand(0,99); + //check for demon + $demon = $magical && (self::SP_DEMON == $this->_target->armor_sp_type); + if($demon && mt_rand(0,99) < $this->_target->armor_sp_param) + { + $regen = min($this->_target->health_max - $this->_target->health, $baseDmg * $this->_target->armor_sp_param / 100); + $this->_target->health += $regen; + if($this->_logger) + $this->_logger->txtDemon($regen); + } + //check for hit + elseif($d100 < $toHit) + { + //calculate damage + $critical = $d100>45; + if($critical) + { + $dmgMult = 2; + if(self::SP_BLOODY == $params['sp_type']) + $dmgMult += $params['sp_param']/100; + } + else $dmgMult = 1 + mt_rand(0,127)/256; + $dmg = max(0, $baseDmg * $dmgMult - $armor); + $this->_target->health -= $dmg; + //update statistics + $this->_target->_flawless = false; + $this->_target->_cntTaken += 1; + $this->_target->_dmgTaken += $dmg; + $this->_cntDealt += 1; + $this->_dmgDealt += $dmg; + //check for poison + if(self::SP_POISON == $params['sp_type']) + { + $poison = $dmg>0 ? $params['sp_param'] : 0; + if(self::SP_ANTIPOISON == $this->_target->armor_sp_type) + $poison *= 1 - $this->_target->armor_sp_param / 100; + $this->_target->_poison += $poison; + } + else $poison = 0; + //check for shock + if(self::SP_SHOCK == $this->_target->armor_sp_type) + { + $shockDmg = $dmg * $this->_target->armor_sp_param / 100; + $this->health -= $shockDmg; + } + else $shockDmg = 0; + //check for stun + $stun = $critical && (self::SP_STUN == $params['sp_type']); + if($stun) + $this->_target->_ticks = 0; + //check for vampirism + if(self::SP_VAMPIRE == $params['sp_type']) + { + $vampRegen = min($this->health_max - $this->health, $dmg * $params['sp_param']/100); + if(self::SP_ANTIVAMP == $this->_target->armor_sp_type) + $vampRegen *= 1 - $this->_target->armor_sp_param / 100; + $this->health += $vampRegen; + } + else $vampRegen = 0; + //print info + if($this->_logger) + { + $this->_logger->txtAttackHit($this->name, $dmg, $magical, $critical, + $poison, $shockDmg, $stun, $vampRegen); + } + } + else + { + if($this->_logger) + $this->_logger->txtAttackMiss($this->name, $magical); + } + } + } + + + protected function executeAttacks() + { + if(!$this->_target) + return; + $this->_target->_threat[$this->_id] = $this; + if($this->count1 && $this->type1) + { + $attackParams = array( + 'str' => $this->str1, + 'atk' => $this->atk1, + 'type' => $this->type1, + 'count' => $this->count1, + 'sp_type' => $this->sp1_type, + 'sp_param' => $this->sp1_param, + ); + $this->calculateAttack($attackParams); + } + if($this->count2 && $this->type2) + { + $attackParams = array( + 'str' => $this->str2, + 'atk' => $this->atk2, + 'type' => $this->type2, + 'count' => $this->count2, + 'sp_type' => $this->sp2_type, + 'sp_param' => $this->sp2_param, + ); + $this->calculateAttack($attackParams); + } + //check for target death + if($this->_target->health <= 0) + { + $this->_target->_ticks = null; + unset($this->_threat[$this->_target->_id]); + unset($this->_enemies[$this->_target->_id]); + if($this->_logger) + $this->_logger->txtDeath($this->_target->name, $this->_flawless ? $this->name : null); + } + } + + + public function executeRound($round) + { + if($this->_logger) + $this->_logger->txtRoundHeader($round); + $this->regen(); + $this->pickTarget(); + if($this->_target) + $this->executeAttacks(); + $this->poison(); + if($this->_logger) + $this->_logger->txtRoundFooter(); + } + + + protected function pickTarget() + { + //clear old target + $this->_target = null; + //try current threat + while($this->_threat && !$this->_target) + { + $targetId = array_rand($this->_threat); + $this->_target = $this->_threat[$targetId]; + if($this->_target->health <= 0) //killed by someone else + { + $this->_target = null; + unset($this->_threat[$targetId]); + } + } + //no threat, try other enemies + if($this->_enemies && !$this->_target) + { + $targetId = array_rand($this->_enemies); + $this->_target = $this->_enemies[$targetId]; + } + //print message + if($this->_logger) + { + if($this->_target) + $this->_logger->txtTargetHeader($this->name, $this->_target->name); + else $this->_logger->txtTargetHeader($this->name, null); + } + } + + + protected function poison() + { + if($this->_poison) + { + $dmg = $this->_poison * $this->_poison / ($this->_poison + $this->pres); + $this->health -= $dmg; + if($this->_logger) + $this->_logger->txtPoison($this->name, $dmg); + if($this->health <= 0) + { + unset($this->_allies[$this->_id]); + if($this->_logger) + $this->_logger->txtDeath($this->name, false); + } + } + } + + + protected function regen() + { + if($this->regen && $this->health < $this->health_max) + { + $delta = min($this->health_max - $this->health, $this->regen); + $this->health += $delta; + if($this->_logger) + $this->_logger->txtRegen($this->name, $delta); + } + } +} diff --git a/2013/daemon/lib/daemon/config.php b/2013/daemon/lib/daemon/config.php new file mode 100644 index 0000000..0243963 --- /dev/null +++ b/2013/daemon/lib/daemon/config.php @@ -0,0 +1,56 @@ +applicationRoot = (string) $applicationRoot; + $hostname = mb_strtolower(getenv('SERVER_NAME')); + if(!$hostname) + $hostname = '_cron'; + $fileName = $hostname . '.php'; + $this->loadFile($this->getFilePath('cfg', $fileName)); + } + + + //loads config from file + public function loadFile($path) + { + if(is_readable($path)) + { + $data = (array) include $path; + foreach($data as $key=>$value) + $this->$key = $value; + } + } + + + //implodes parameters into relative path and prepends it with root + public function getFilePath(/*...*/) + { + $aPath = array_filter(func_get_args()); + array_unshift($aPath, $this->applicationRoot); + return implode(DIRECTORY_SEPARATOR, $aPath); + } + + + //generates URL from relative path + public function getUrl($path) + { + return $path ? "$this->applicationUrl$path" : $this->applicationUrl; + } +} diff --git a/2013/daemon/lib/daemon/controller.php b/2013/daemon/lib/daemon/controller.php new file mode 100644 index 0000000..2a95ec6 --- /dev/null +++ b/2013/daemon/lib/daemon/controller.php @@ -0,0 +1,158 @@ +cfg = $cfg; + session_name($this->cfg->sessionName); + session_cache_limiter(null); + session_start(); + $this->dbClient = Daemon::createDbClient($this->cfg); + $this->dbCfg = new Daemon_DbConfig($this->dbClient); + if(!$this->disablePlayer) + { + $this->player = new Daemon_DbObject_Player($this->dbClient); + $this->activeCharacter = $this->player->getActiveCharacter(); + $this->activeCharacter->updateLastAction(); + $this->characterData = $this->activeCharacter->getCharacterData(); + $this->location = $this->characterData->getLocation(); + } + $this->view = new Daemon_View($this->cfg); + } + + + //checks last action's timestamp + final private function checkActionTimestamp() + { + $lastAction = isset($_SESSION['ts']) ? $_SESSION['ts'] : 0.0; + $_SESSION['ts'] = microtime(true); + return (bool) ($_SESSION['ts'] >= $lastAction + $this->cfg->tsDelta); + } + + + final public function execute() + { + //prepare controller + $this->prepareModel(); + $this->validatePlayer(); + //check last action's timestamp + if($_POST && !$this->checkActionTimestamp()) + { + Daemon_MsgQueue::add('Operacja anulowana: za duża częstość.'); + $_POST = array(); + } + //execute commands + $cmdExecuted = (bool) $this->runCommands(); + //display page + $this->prepareView(); + if($this->pageSubtitleUseQuery) + { + if($qs = getenv('QUERY_STRING')) + $this->pageSubtitleDetails = urldecode($qs); + } + $this->view->setPageTitle($this->pageSubtitle, $this->pageSubtitleDetails, $cmdExecuted); + if(!$this->disablePlayer) + { + $this->view->setGameHeader($this->player->getPlayerId(), + $this->activeCharacter, $this->characterData, $this->location); + $this->view->setPageSkin($this->player->skin); + } + else $this->view->setPageSkin(null); + if(!$this->disableMessages) + $messages = Daemon_MsgQueue::getAll(); + else $messages = array(); + if($this->dbCfg->globalMessage) + $messages[] = $this->dbCfg->globalMessage; + $this->view->setMessages($messages); + $this->view->display($this->pageTemplatePath, $this->pageOutputMode); + } + + + //page-specific + protected function prepareModel() + { + } + + + //page-specific + protected function prepareView() + { + } + + + //page-specific + protected function runCommands() + { + return false; + } + + + final private function validatePlayer() + { + if($this->disablePlayer) + return; + if($this->requireAuthentication && !$this->player->getPlayerId()) + { + Daemon_MsgQueue::add('Strona dostępna tylko dla zalogowanych użytkowników.'); + Daemon::redirect($this->cfg->getUrl(null)); + exit; + } + if($this->requireActiveChar && !$this->player->getCharacterId()) + { + Daemon_MsgQueue::add('Musisz najpierw wybrać aktywną postać.'); + Daemon::redirect($this->cfg->getUrl('account')); + exit; + } + if($this->requiredRole && !$this->player->hasRole($this->requiredRole)) + { + Daemon_MsgQueue::add('Nie masz uprawnień do korzystania z tej funkcji.'); + Daemon::redirect($this->cfg->getUrl('account')); + exit; + } + if($this->requireLocation && !$this->location->location_id) + { + Daemon::redirect($this->cfg->getUrl('respawn')); + exit; + } + if($this->requireNoEvents && $this->characterData->getLocationEvent()) + { + Daemon::redirect($this->cfg->getUrl('map')); + exit; + } + if($this->requireFactionMatch && $this->location->faction_id && $this->characterData->faction_id + && ($this->location->faction_id != $this->characterData->faction_id)) + { + Daemon_MsgQueue::add('Odejdź! Nie przyjmujemy takich jak ty!'); + Daemon::redirect($this->cfg->getUrl('map')); + exit; + } + } +} diff --git a/2013/daemon/lib/daemon/dbclient.php b/2013/daemon/lib/daemon/dbclient.php new file mode 100644 index 0000000..70d49b5 --- /dev/null +++ b/2013/daemon/lib/daemon/dbclient.php @@ -0,0 +1,148 @@ +dbh = $dbHandle; + } + + + //reads maximum length of columns of selected table + public function getColumnMaxLength($table, $column) + { + $sql = 'SELECT CHARACTER_MAXIMUM_LENGTH FROM information_schema.COLUMNS + WHERE TABLE_SCHEMA = SCHEMA() AND TABLE_NAME = :table AND COLUMN_NAME = :column'; + $params = array('table' => $table, 'column' => $column); + return $this->selectColumn($sql, $params); + } + + + //returns internal PDO handle + public function getDbHandle() + { + return $this->dbh; + } + + + //internal exception handler + private function exceptionHandler(PDOException $e, $duplicateMsg = null) + { + //prepare params + $sqlstate = $e->getCode(); + $dbMessage = $e->getMessage(); + //check error type + if('23000' == $sqlstate && false !== stripos($dbMessage, 'duplicate')) + { + $message = $duplicateMsg ? $duplicateMsg : 'Wybrany obiekt już istnieje.'; + Daemon_MsgQueue::add($message); + } + else throw $e; + } + + + //executes a query, returns the statement resource + public function execute($sql, array $params = array(), $duplicateMsg = null) + { + try + { + $sth = $this->dbh->prepare($sql); + foreach((array)$params as $name => $value) + $sth->bindValue(':'.$name, $value, self::paramType($value)); + $sth->execute(); + return $sth; + } + catch(PDOException $e) + { + $this->exceptionHandler($e, $duplicateMsg); + return null; + } + } + + + //returns ID of last inserted row + public function lastInsertId() + { + return $this->dbh->lastInsertId(); + } + + + //returns appriopriate PDO::PARAM_X constant + public static function paramType($value) + { + if(is_null($value)) + return PDO::PARAM_NULL; + elseif(is_int($value)) + return PDO::PARAM_INT; + else return PDO::PARAM_STR; + } + + + //executes a generic non-select query + public function query($sql, array $params = array(), $duplicateMsg = null) + { + $sth = $this->execute($sql, $params, $duplicateMsg); + return !is_null($sth); + } + + + //quotes value for safe use in query + public function quote($value) + { + return $this->dbh->quote($value, self::paramType($value)); + } + + + //select multiple rows from table + public function selectAll($sql, array $params = array()) + { + $sth = $this->execute($sql, $params); + if(is_null($sth)) + return null; + return $sth->fetchAll(PDO::FETCH_ASSOC); + } + + + //select single column from table + public function selectColumn($sql, array $params = array()) + { + $sth = $this->execute($sql, $params); + if(is_null($sth)) + return null; + return $sth->fetchAll(PDO::FETCH_COLUMN, 0); + } + + + //select single row from table (as array) + public function selectRow($sql, array $params = array()) + { + $sth = $this->execute($sql, $params); + if(is_null($sth)) + return null; + return $sth->fetch(PDO::FETCH_ASSOC); + } + + + //select single row from table (as object) + public function selectObject($sql, array $params = array(), $className = 'stdClass') + { + $sth = $this->execute($sql, $params); + if(is_null($sth)) + return null; + return $sth->fetchObject($className); + } + + + //select single value from table + public function selectValue($sql, array $params = array()) + { + $sth = $this->execute($sql, $params); + if(is_null($sth)) + return null; + return $sth->fetchColumn(0); + } +} diff --git a/2013/daemon/lib/daemon/dbconfig.php b/2013/daemon/lib/daemon/dbconfig.php new file mode 100644 index 0000000..aaf4e63 --- /dev/null +++ b/2013/daemon/lib/daemon/dbconfig.php @@ -0,0 +1,87 @@ +dbClient = $dbClient; + } + + + public function __get($name) + { + return $this->get($name); + } + + + public function __set($name, $value) + { + return $this->set($name, $value); + } + + + public function get($name) + { + if(!isset($this->data[$name])) + { + $sql = "SELECT value FROM parameters WHERE name=:name"; + $params = array('name' => $name); + $this->data[$name] = $this->dbClient->selectValue($sql, $params); + } + return $this->data[$name]; + } + + + public function set($name, $value) + { + if (empty($value)) + $value = ''; + $sql = "INSERT INTO parameters(name, value) VALUES (:name, :value) ON DUPLICATE KEY UPDATE value=:value"; + $params = array('name' => $name, 'value' => $value); + $this->dbClient->query($sql, $params); + $this->data[$name] = $value; + } + + + public function getGeneratorWeights($type) + { + $keys = array( + 'pstr_p', 'pstr_c', 'patk_p', 'patk_c', 'pdef_p', 'pdef_c', 'pres_p', 'pres_c', + 'mstr_p', 'mstr_c', 'matk_p', 'matk_c', 'mdef_p', 'mdef_c', 'mres_p', 'mres_c', + 'armor', 'speed', 'regen', 'special_param'); + return $this->getGeneratorOptions("w_$type", $keys); + } + + + private function getGeneratorOptions($key, array $keys) + { + $result = json_decode($this->get("generator_$key"), true); + if (!is_array($result)) + $result = array(); + foreach ($keys as $key) + { + if (empty($result[$key])) + $result[$key] = 0; + } + return $result; + } + + + public function setGeneratorWeights($type, array $options) + { + $this->setGeneratorOptions("w_$type", $options); + } + + + private function setGeneratorOptions($key, array $options) + { + foreach ($options as &$val) + $val = floatval(str_replace(',', '.', $val)); + $this->set("generator_$key", json_encode($options)); + } +} diff --git a/2013/daemon/lib/daemon/dbobject.php b/2013/daemon/lib/daemon/dbobject.php new file mode 100644 index 0000000..42d34c3 --- /dev/null +++ b/2013/daemon/lib/daemon/dbobject.php @@ -0,0 +1,108 @@ +import($params); + } + + + public function attachDbClient(Daemon_DbClient $dbClient = null) + { + $this->_dbClient = $dbClient; + } + + + //deletes object data from database + public function delete() + { + $cond = array(); + $params = array(); + foreach($this->_index as $col) + { + $cond[] = "$col=:$col"; + $params[$col] = $this->$col; + } + $cond = implode(' AND ', $cond); + if(!$cond) + throw new RuntimeException('Index not specified.'); + $sql = "DELETE FROM $this->_tableName WHERE $cond"; + $this->_dbClient->query($sql, $params); + } + + + //retrieves object data from database + public function get(array $params, $ignoreDuplicates = false) + { + if(!$params) + throw new RuntimeException('Params not specified.'); + $cond = array(); + foreach(array_keys($params) as $key) + $cond[] = "$key=:$key"; + $cond = implode(' AND ', $cond); + $sql = "SELECT * FROM $this->_tableName WHERE $cond ORDER BY RAND() LIMIT 2"; + $data = $this->_dbClient->selectAll($sql, $params); + if(is_array($data) && isset($data[0])) + { + if(!$ignoreDuplicates && (count($data) > 1)) + throw new RuntimeException('Multiple rows found.'); + foreach($data[0] as $key => $val) + $this->$key = $val; + } + return true; + } + + + //copies params into object data + public function import($params) + { + $keys = array_keys(get_object_vars($this)); + foreach($keys as $key) + { + if(isset($params[$key]) && ($key[0] != '_')) + $this->$key = $params[$key]; + } + $this->validate(); + } + + + //stores object data in the database + public function put() + { + $this->validate(); + $cols = array(); + $vals = array(); + $mods = array(); + $params = array(); + foreach($this as $col => $val) + { + if($col[0] != '_') + { + $cols[] = $col; + $vals[] = ":$col"; + if(!in_array($col, $this->_index)) + $mods[] = "$col=:$col"; + $params[$col] = $val; + } + } + $cols = implode(', ', $cols); + $vals = implode(', ', $vals); + $mods = implode(', ', $mods); + if($mods) + $sql = "INSERT INTO $this->_tableName ($cols) VALUES ($vals) ON DUPLICATE KEY UPDATE $mods"; + else $sql = "REPLACE INTO $this->_tableName ($cols) VALUES ($vals)"; + $this->_dbClient->query($sql, $params); + } + + + //checks object data + public function validate() {} +} diff --git a/2013/daemon/lib/daemon/dbobject/character.php b/2013/daemon/lib/daemon/dbobject/character.php new file mode 100644 index 0000000..ffe541b --- /dev/null +++ b/2013/daemon/lib/daemon/dbobject/character.php @@ -0,0 +1,165 @@ +_player = $player; + } + + + //checks character's inbox for new messages + public function checkMail() + { + if(!$this->character_id) + return false; + $sql = "SELECT COUNT(1) FROM mail WHERE message_id > COALESCE(:lastMailId, 0) AND recipient_id = :charId"; + $params = array('lastMailId' => $this->last_mail_id, 'charId' => $this->character_id); + return $this->_dbClient->selectValue($sql, $params); + } + + + //try to create a new clan (id or name may be already taken) + public function createClan($clanId, $name) + { + $clanId = Daemon::normalizeString($clanId, false); + $name = Daemon::normalizeString($name, false); + $validId = $this->validateClanId($clanId); + $validName = $this->validateClanId($name); + if($validId && $validName) + { + $sql = "INSERT INTO clans(clan_id, name, leader_id) VALUES (:id, :name, :leaderId)"; + $params = array('id' => $clanId, 'name' => $name, 'leaderId' => $this->character_id); + if($this->_dbClient->query($sql, $params, 'Wybrany ID lub nazwa klanu są już zajęte.')) + { + $this->clan_id = $clanId; + $this->put(); + } + } + } + + + //returns DbObject_CharacterData instance + public function getCharacterData() + { + if(!$this->_characterData) + { + $this->_characterData = new Daemon_DbObject_CharacterData(); + $this->_characterData->attachDbClient($this->_dbClient); + if($this->character_id) + $this->_characterData->get(array('character_id' => $this->character_id)); + $this->_characterData->_characterName = $this->name; + $this->_characterData->_gender = $this->gender; + } + return $this->_characterData; + } + + + //returns a channel=>writeAccess array of channels allowed for character + public function getForumChannels() + { + $cdata = $this->getCharacterData(); + $channels = array('public' => array('name' => 'publiczne', 'writable' => false)); + if($this->character_id) + { + $channels['public']['writable'] = $this->_player->hasRole('chat'); + } + if($cdata->faction_id) + { + $channelId = 'f/'.$cdata->faction_id; + $channels[$channelId] = array('name' => 'frakcyjne', 'writable' => $this->_player->hasRole('chat')); + } + if($this->clan_id) + { + $channelId = 'c/'.$this->clan_id; + $channels[$channelId] = array('name' => 'klanowe', 'writable' => $this->_player->hasRole('chat')); + } + return $channels; + } + + + //reads a list of invitations + public function getInvitations() + { + $sql = "SELECT i.clan_id, c.name AS clan_name, i.description + FROM clan_invitations i JOIN clans c USING(clan_id) + WHERE i.character_id=:id"; + $params = array('id' => $this->character_id); + return $this->_dbClient->selectAll($sql, $params); + } + + + //sends invitation to specified clan + public function inviteClan($clanId, $description, Daemon_Forum $forum) + { + if(!$description) + $description = null; + $sql = "SELECT leader_id FROM clans WHERE clan_id=:id"; + $leaderId = $this->_dbClient->selectValue($sql, array('id' => $clanId)); + if($leaderId) + { + $sql = "INSERT IGNORE INTO clan_invitations(clan_id, character_id, description) + VALUES (:clanId, :charId, :description) ON DUPLICATE KEY UPDATE description=:description"; + $params = array('clanId' => $clanId, 'charId' => $this->character_id, + 'description' => $description); + $this->_dbClient->query($sql, $params); + $msg = "Postać $this->name pragnie dołączyć do klanu."; + $forum->addMailById(null, $leaderId, $msg); + } + else Daemon_MsgQueue::add('Wybrany klan nie istnieje lub nie ma przywódcy.'); + } + + + public function updateLastAction() + { + if($this->character_id) + { + $sql = "UPDATE characters SET last_action = NOW() WHERE character_id=:id"; + $this->_dbClient->query($sql, array('id' => $this->character_id)); + } + } + + + //checks clan id validity + private function validateClanId($input) + { + $maxLength = $this->_dbClient->getColumnMaxLength('clans', 'clan_id'); + if(!$input) + Daemon_MsgQueue::add('Musisz podać ID klanu.'); + elseif(iconv_strlen($input) > $maxLength) + Daemon_MsgQueue::add('Wybrany ID jest za długi.'); + else return true; + return false; + } + + + //checks clan name validity + private function validateClanName($input) + { + $maxLength = $this->_dbClient->getColumnMaxLength('clans', 'name'); + if(!$input) + Daemon_MsgQueue::add('Musisz podać nazwę klanu.'); + elseif(iconv_strlen($input) > $maxLength) + Daemon_MsgQueue::add('Wybrana nazwa jest za długa.'); + else return true; + return false; + } +} diff --git a/2013/daemon/lib/daemon/dbobject/characterdata.php b/2013/daemon/lib/daemon/dbobject/characterdata.php new file mode 100644 index 0000000..0471327 --- /dev/null +++ b/2013/daemon/lib/daemon/dbobject/characterdata.php @@ -0,0 +1,609 @@ +checkTurnCosts()) + return null; + $combat = new Daemon_Duel(); + $combat->attachCharacterData($this); + $combat->attachDbClient($this->_dbClient); + $combat->execute($view, $locationType, $targetId); + return $combat->getCombatLog(); + } + + + //checks of character can attack selected target + public function canAttack(array $target, $rolloverId, $withMessages) + { + //check Id + if($this->character_id == $target['character_id']) + { + if($withMessages) + Daemon_MsgQueue::add('Samobójstwo?'); + return false; + } + //check location + if($this->location_id != $target['location_id']) + { + if($withMessages) + Daemon_MsgQueue::add('Cel opuścił już tą lokację.'); + return false; + } + //check levels + if(4 * $this->xp_used > 5 * $target['xp_used']) + { + if($withMessages) + Daemon_MsgQueue::add('Cel jest za słaby.'); + return false; + } + if(5 * $this->xp_used < 4 * $target['xp_used']) + { + if($withMessages) + Daemon_MsgQueue::add('Cel jest za silny.'); + return false; + } + //check previous attacks + $cond = "attacker_id=:attackerId AND defender_id=:defenderId"; + $params = array('attackerId' => $this->character_id, 'defenderId' => $target['character_id']); + if($rolloverId) + { + $cond .= " AND rollover_id=:rolloverId"; + $params['rolloverId'] = $rolloverId; + } + $sql = "SELECT COUNT(duel_id) FROM duels WHERE $cond"; + if($this->_dbClient->selectValue($sql, $params)) + { + if($withMessages) + Daemon_MsgQueue::add('Cel już był atakowany przez ciebie w tym przeliczeniu.'); + return false; + } + return true; + } + + + //updates turns, gold & mana; returns check result + public function checkTurnCosts($costGold = 0, $costMana = 0) + { + if($this->turns < 1) + { + Daemon_MsgQueue::add('Nie masz dostępnych tur.'); + return false; + } + if($this->gold_purse < $costGold) + { + Daemon_MsgQueue::add('Masz za mało zlota.'); + return false; + } + if($this->mana < $costMana) + { + Daemon_MsgQueue::add('Masz za mało zlota.'); + return false; + } + $this->turns -= 1; + $this->gold_purse -= $costGold; + $this->mana -= $costMana; + return true; + } + + + //checks of target can be attacked, returns combat type (null for error) + public function getCombatType(array $target, $locationType) + { + //check location type + if('normal' != $locationType) + return 'arena'; + //check factions + if($this->faction_id && ($this->faction_id == $target['faction_id'])) + return 'arena'; + //no restrictions, normal fight + return 'normal'; + } + + + //returns Daemon_DbObject_CombatUnit instance + public function getCombatUnit($full = false) + { + if(!$this->_combatUnit) + { + $this->_combatUnit = $full ? new Daemon_Combat_Unit() : new Daemon_DbObject_CombatUnit(); + $this->_combatUnit->attachDbClient($this->_dbClient); + if($this->character_id) + { + if(!$this->combat_unit_id) + $this->combat_unit_id = "character-$this->character_id"; + $this->_combatUnit->get(array('combat_unit_id' => $this->combat_unit_id)); + } + $this->_combatUnit->combat_unit_id = $this->combat_unit_id; + $this->_combatUnit->name = $this->_characterName; + $this->_combatUnit->faction_id = $this->faction_id; + $this->_combatUnit->health = $this->health; + $this->_combatUnit->health_max = $this->health_max; + } + return $this->_combatUnit; + } + + + //calculates "real" level from level & health + public function getEffectiveLevel($addFaction) + { + $factionMult = 0.1; //magic number! + $level = $this->level; + if($addFaction) + $level *= 1 + $factionMult * $this->rank_id; + if($this->health_max) + $level = round($level * $this->health / $this->health_max); + return $level; + } + + + //checks mission history for last mission's data + public function getLastMission($maxProgress) + { + $sql = "SELECT m.*, s.name AS service_name + FROM character_missions m LEFT JOIN services s USING(service_id) + WHERE character_id=:id AND progress<=:maxProgress + ORDER BY rollover_id DESC LIMIT 1"; + $params = array('id' => $this->character_id, 'maxProgress' => $maxProgress); + if($row = $this->_dbClient->selectRow($sql, $params)) + { + $row['_target'] = $this->getMissionTarget($row['type'], $row['params']); + $row['_name'] = $this->getMissionName($row['type'], $row['_target']); + $row['_statusName'] = Daemon_Dictionary::$missionProgress[$row['progress']]; + return $row; + } + else return null; + } + + + private function getMissionName($type, $name) + { + switch($type) + { + case'monster': + return "pokonaj potwora: $name"; + case'item': + return "przynieś przedmiot: $name"; + default: + return null; + } + } + + + private function getMissionTarget($type, $params) + { + switch($type) + { + case'monster': + $sql = "SELECT name FROM monsters WHERE monster_id=:id"; + return $this->_dbClient->selectValue($sql, array('id' => $params)); + case'item': + $sql = "SELECT name FROM items WHERE item_id=:id"; + return $this->_dbClient->selectValue($sql, array('id' => $params)); + default: + return null; + } + } + + + //returns a DbObject_Location instance representing current location + public function getLocation() + { + $object = new Daemon_DbObject_Location(); + $object->attachDbClient($this->_dbClient); + $object->attachCharacterData($this); + if($this->character_id) + $object->get(array('location_id' => $this->location_id)); + return $object; + } + + + public function getLocationEvent() + { + return json_decode($this->location_event, true); + } + + + //fetches a list of possible respawn locations + public function getRespawns($defaultRespawn) + { + $sql = "SELECT location_id, name FROM locations WHERE location_id = :defaultRespawn + OR location_id IN ( + SELECT r.respawn_id FROM regions r + JOIN character_regions cr ON cr.region_id=r.region_id AND cr.character_id=:characterId + ) + OR location_id IN ( + SELECT l.location_id FROM character_regions cr + JOIN locations l ON cr.region_id=l.region_id AND cr.character_id=:characterId + WHERE l.type='caern' AND l.faction_id=:factionId + )"; + $params = array('characterId' => $this->character_id, 'defaultRespawn' => $defaultRespawn, + 'factionId' => $this->faction_id); + if($data = $this->_dbClient->selectAll($sql, $params)) + { + $result = array(); + foreach($data as $row) + $result[$row['location_id']] = $row['name']; + return $result; + } + else return array(); + } + + + public function getSpells() + { + $sql = "SELECT spell_id, name FROM spells ORDER BY name"; + $data = $this->_dbClient->selectAll($sql); + foreach($data as &$row) + { + $col = "sp_$row[spell_id]"; + $row['_cost'] = isset($this->$col) ? $this->$col : null; + $row['_cast'] = ($row['_cost'] <= $this->mana); + } + return $data; + } + + + //increases selected attribute if there is enough xp + public function improveAttribute($key) + { + $col = "a_$key"; + if(isset($this->$col)) + { + $cost = $this->$col; + if($cost <= $this->xp_free) + { + $this->$col += 1; + $this->xp_used += $cost; + $this->xp_free -= $cost; + $this->resetCombatStats(); + $this->put(); + } + else Daemon_MsgQueue::add('Nie masz dość doświadczenia.'); + } + else Daemon_MsgQueue::add('Wybrana cecha nie istnieje.'); + } + + + //increases faction reputation & rank + public function improveReputation($factionId, $delta) + { + //join faction if needed + if(!$this->faction_id) + { + $sql = "SELECT name FROM factions WHERE faction_id=:id"; + $factionName = $this->_dbClient->selectValue($sql, array('id' => $factionId)); + $this->faction_id = $factionId; + Daemon_MsgQueue::add("Dołączasz do frakcji: $factionName."); + } + //raise reputation + $this->faction_points += $delta; + //check for new rank + $sql = "SELECT r.rank_id, r.title_id, t.name_$this->_gender AS title_name + FROM faction_ranks r LEFT JOIN titles t USING(title_id) + WHERE faction_id=:id + AND rank_id = (SELECT MAX(rank_id) FROM faction_ranks WHERE faction_id=:id AND min_points <= :points)"; + $params = array('id' => $factionId, 'points' => $this->faction_points); + $newRank = $this->_dbClient->selectRow($sql, $params); + if($newRank && ($newRank['rank_id'] > (int) $this->rank_id)) + { + $this->rank_id = $newRank['rank_id']; + if($newRank['title_id']) + Daemon_MsgQueue::add("Zdobywasz nową rangę: $newRank[title_name] (poziom $newRank[rank_id])."); + else Daemon_MsgQueue::add("Zdobywasz nową rangę (poziom $newRank[rank_id])."); + } + else Daemon_MsgQueue::add("Rośnie twoja reputacja we frakcji."); + } + + + //increases selected skill if there is enough xp + public function improveSkill($key) + { + $col = "s_$key"; + if(isset($this->$col)) + { + $cost = $this->$col; + if($cost > 0) + { + if($cost <= $this->xp_free) + { + $this->$col += 1; + $this->xp_used += $cost; + $this->xp_free -= $cost; + $this->resetCombatStats(); + $this->put(); + } + else Daemon_MsgQueue::add('Nie masz dość doświadczenia.'); + } + else Daemon_MsgQueue::add('Nie znasz jeszcze tej umiejętności.'); + } + else Daemon_MsgQueue::add('Wybrana umiejętność nie istnieje.'); + } + + + //updates combat stats with equipment bonuses + private function loadEquipmentBonuses() + { + //prepare variables + $unit = $this->getCombatUnit(); + $inventory = new Daemon_Inventory($this->_dbClient, $this); + $zweihander = false; + $attackBonusKeys = array( + 'pstr_p', 'pstr_c', 'patk_p', 'patk_c', + 'mstr_p', 'mstr_c', 'matk_p', 'matk_c', + ); + $modWpn1 = array_fill_keys($attackBonusKeys, 0); + $modWpn2 = array_fill_keys($attackBonusKeys, 0); + $armorBonusKeys = array( + 'pdef_p', 'pdef_c', 'pres_p', 'pres_c', + 'mdef_p', 'mdef_c', 'mres_p', 'mres_c', + 'armor', 'speed', 'regen', + ); + $modArmor = array_fill_keys($armorBonusKeys, 0); + //reset hands & armor + $unit->type1 = 'p'; + $unit->count1 = 1; + $unit->sp1_type = null; + $unit->sp1_param = null; + $unit->type2 = 'p'; + $unit->count2 = 1; + $unit->sp2_type = null; + $unit->sp2_param = null; + $unit->armor_sp_type = null; + $unit->armor_sp_param = null; + //find equipped items, calculate equipment bonuses + $sql = "SELECT item_id, equipped FROM inventory WHERE character_id=:id AND equipped IS NOT NULL"; + $params = array('id' => $this->character_id); + foreach($this->_dbClient->selectAll($sql, $params) AS $row) + { + $item = new Daemon_DbObject_Item(); + $item->attachDbClient($this->_dbClient); + $item->get(array('item_id' => $row['item_id'])); + switch($row['equipped']) + { + case'hand_a': + $zweihander = ('weapon2h' == $item->type); + $unit->count1 = 1; + $unit->type1 = $item->damage_type; + $unit->sp1_type = $item->special_type; + $unit->sp1_param = $item->special_param; + foreach($attackBonusKeys as $name) + $modWpn1[$name] += $item->$name; + break; + case'hand_b': + $unit->count2 = 1; + $unit->type2 = $item->damage_type; + $unit->sp2_type = $item->special_type; + $unit->sp2_param = $item->special_param; + foreach($attackBonusKeys as $name) + $modWpn2[$name] += $item->$name; + break; + case'armor': + $unit->armor_sp_type = $item->special_type; + $unit->armor_sp_param = $item->special_param; + //nobreak + default: + foreach($attackBonusKeys as $name) + { + $modWpn1[$name] += $item->$name; + $modWpn2[$name] += $item->$name; + } + break; + } + foreach($armorBonusKeys as $name) + $modArmor[$name] += $item->$name; + } + $unit->count1 = 1; + $unit->count2 = $zweihander ? 0 : 1; + //first hand + $pstrSkill = $this->s_pstr; + $mstrSkill = $this->s_mstr; + if($zweihander) + { + $pstrSkill *= 1.7; + $mstrSkill *= 1.7; + } + if('m' != $unit->type1) + { + $unit->atk1 = Daemon_Math::combatStat($this->a_dex, $modWpn1['patk_p'], $modWpn1['patk_c'], $this->s_patk); + $unit->str1 = Daemon_Math::combatStat($this->a_str, $modWpn1['pstr_p'], $modWpn1['pstr_c'], $pstrSkill); + } + else + { + $unit->atk1 = Daemon_Math::combatStat($this->a_pwr, $modWpn1['matk_p'], $modWpn1['matk_c'], $this->s_matk); + $unit->str1 = Daemon_Math::combatStat($this->a_pwr, $modWpn1['mstr_p'], $modWpn1['mstr_c'], $mstrSkill); + } + //second hand + if('m' != $unit->type2) + { + $unit->atk2 = Daemon_Math::combatStat($this->a_dex, $modWpn2['patk_p'], $modWpn2['patk_c'], $this->s_patk); + $unit->str2 = Daemon_Math::combatStat($this->a_str, $modWpn2['pstr_p'], $modWpn2['pstr_c'], $this->s_pstr); + } + else + { + $unit->atk2 = Daemon_Math::combatStat($this->a_pwr, $modWpn2['matk_p'], $modWpn2['matk_c'], $this->s_matk); + $unit->str2 = Daemon_Math::combatStat($this->a_pwr, $modWpn2['mstr_p'], $modWpn2['mstr_c'], $this->s_mstr); + } + //physical defense + $unit->pdef = Daemon_Math::combatStat($this->a_dex, $modArmor['pdef_p'], $modArmor['pdef_c'], $this->s_pdef); + $unit->pres = Daemon_Math::combatStat($this->a_vit, $modArmor['pres_p'], $modArmor['pres_c'], $this->s_pres); + //magical defense + $unit->mdef = Daemon_Math::combatStat($this->a_wil, $modArmor['mdef_p'], $modArmor['mdef_c'], $this->s_mdef); + $unit->mres = Daemon_Math::combatStat($this->a_wil, $modArmor['mres_p'], $modArmor['mres_c'], $this->s_mres); + //armor & speed + $unit->speed = Daemon_Math::combatStat($this->a_dex, $modArmor['speed'], 0, 0); + $unit->armor = $modArmor['armor']; + //regen + $unit->regen = Daemon_Math::combatRegen($this->a_vit, $modArmor['regen'] + $this->s_preg); + $unit->put(); + } + + + //try to subtract the cost from character's gold, cancel the operation if the cost is too big + public function payGold($cost, $bankEnabled) + { + $charGold = $this->gold_purse; + if($bankEnabled) + $charGold += $this->gold_bank; + if($charGold < $cost) + { + Daemon_MsgQueue::add("Wymagane $cost zł - nie masz tyle złota."); + return false; + } + $deltaPurse = min($cost, $this->gold_purse); + $this->gold_purse -= $deltaPurse; + $this->gold_bank -= $cost - $deltaPurse; + $this->put(); + return true; + } + + + //regenerates one-turn-worth of health & mana + public function regen($resting) + { + $this->mana += $this->mana_regen; + if($resting) + { + $this->health += $this->a_vit; + $this->mana += ceil($this->a_pwr / 4); + } + if($this->health > $this->health_max) + $this->health = $this->health_max; + if($this->mana > $this->mana_max) + $this->mana = $this->mana_max; + } + + + //calculates combat stats based on attributes, skills and equipment + public function resetCombatStats() + { + //health + $old = $this->health_max; + $this->health_max = 3*$this->a_str + 7*$this->a_vit; + $this->health += $this->health_max - $old; + //mana + $old = $this->mana_max; + $this->mana_max = 3*$this->a_pwr + 2*$this->a_wil; + $this->mana += $this->mana_max - $old; + $this->mana_regen = Daemon_Math::manaRegen($this->a_wil, $this->s_mreg); + //used xp + $this->xp_used = 0; + foreach(array_keys(Daemon_Dictionary::$characterAttributes) as $key) + { + $col = "a_$key"; + $this->xp_used += $this->$col * ($this->$col + 1) / 2; + } + foreach(array_keys(Daemon_Dictionary::$characterSkills) as $key) + { + $col = "s_$key"; + $this->xp_used += $this->$col * ($this->$col + 1) / 2; + } + //update combat stats + $this->loadEquipmentBonuses(); + } + + + //respawns in selected location + public function respawn($locationId, $defaultRespawn) + { + $respawns = $this->getRespawns($defaultRespawn); + if(!isset($respawns[$locationId])) + { + Daemon_MsgQueue::add('Wybrana lokacja nie jest dostępna.'); + return false; + } + $this->location_id = $locationId; + $this->health = $this->health_max; + $this->mana = 4 * $this->mana_regen; + $this->resetCombatStats(); + $this->put(); + return true; + } + + + //executes selected event, returns event log + public function runEvent(Daemon_View $view) + { + $event = $this->getLocationEvent(); + //monster attack + if(isset($event['monsterId'])) + { + $combat = new Daemon_MonsterCombat(); + $combat->attachCharacterData($this); + $combat->attachDbClient($this->_dbClient); + $combat->execute($view, $event['monsterId']); + //return log + return $combat->getCombatLog(); + } + //special event + if(isset($event['eventId'], $event['params'])) + { + $handler = new Daemon_Event(); + $handler->attachCharacterData($this); + $handler->attachDbClient($this->_dbClient); + $handler->execute($view, $event['eventId'], $event['params']); + return $handler->getEventLog(); + } + //no event + return null; + } + + + //updates character's health, location etc to represent death + public function setDeath($clearEquipment) + { + $this->deaths += 1; + $this->health = 0; + $this->mana = 0; + $this->xp_free = 0; + $this->location_id = null; + if($clearEquipment) + { + $this->gold_purse = 0; + $sql = "DELETE FROM inventory WHERE character_id=:id + AND status='inventory' AND NOT FIND_IN_SET('bound', flags)"; + $params = array('id' => $this->character_id); + $this->_dbClient->query($sql, $params); + } + $this->resetCombatStats(); + } + + + public function setLocationEvent(array $data) + { + $event = array(); + //monster attack + if(isset($data['monsterId'])) + $event['monsterId'] = $data['monsterId']; + //special event + if(isset($data['eventId'], $data['params'])) + { + $event['eventId'] = $data['eventId']; + $event['params'] = $data['params']; + } + $this->location_event = json_encode($event); + } +} diff --git a/2013/daemon/lib/daemon/dbobject/clan.php b/2013/daemon/lib/daemon/dbobject/clan.php new file mode 100644 index 0000000..c0dab12 --- /dev/null +++ b/2013/daemon/lib/daemon/dbobject/clan.php @@ -0,0 +1,91 @@ + $this->clan_id, 'charId' => $characterId); + if($this->_dbClient->selectValue($sql, $params)) + { + $sql = "UPDATE characters SET clan_id=:clanId WHERE character_id=:charId"; + $params = array('clanId' => $this->clan_id, 'charId' => $characterId); + $this->_dbClient->query($sql, $params); + $sql = "DELETE FROM clan_invitations WHERE character_id=:id"; + $this->_dbClient->query($sql, array('id' => $characterId)); + $msg = "Podanie do klanu $this->name zostało zaakceptowane."; + $forum->addMailById(null, $characterId, $msg); + } + else Daemon_MsgQueue::add('Wybrane zaproszenie nie istnieje.'); + } + + + //deletes clan and updates its members + public function delete() + { + //TODO + $params = array('id' => $this->clan_id); + $sql = "DELETE FROM clans WHERE clan_id=:id"; + $this->_dbClient->query($sql, $params); + $sql = "DELETE FROM clan_invitations WHERE clan_id=:id"; + $this->_dbClient->query($sql, $params); + $sql = "UPDATE characters SET clan_id=NULL WHERE clan_id=:id"; + $this->_dbClient->query($sql, $params); + } + + + //reads a list of invitations + public function getInvitations() + { + $sql = "SELECT i.*, c.name AS character_name, cd.level, cd.xp_used, + cd.faction_id, COALESCE(cd.rank_id, 0) AS rank_id, + date_format(c.date_created, '%Y-%m-%d') AS date_created + FROM clan_invitations i JOIN characters c USING(character_id) JOIN character_data cd USING(character_id) + WHERE i.clan_id=:id"; + return $this->_dbClient->selectAll($sql, array('id' => $this->clan_id)); + } + + + //fetches leader's name + public function getLeaderName() + { + $sql = "SELECT name FROM characters WHERE character_id=:id"; + return $this->_dbClient->selectValue($sql, array('id' => $this->leader_id)); + } + + + //reads a list of members + public function getMembers() + { + $sql = "SELECT cd.character_id, c.name, cd.level, cd.xp_used, + cd.faction_id, COALESCE(cd.rank_id, 0) AS rank_id, + date_format(c.date_created, '%Y-%m-%d') AS date_created + FROM characters c JOIN character_data cd USING(character_id) WHERE c.clan_id=:id"; + $result = $this->_dbClient->selectAll($sql, array('id' => $this->clan_id)); + foreach($result as &$row) + $row['_isLeader'] = ($row['character_id'] == $this->leader_id); + return $result; + } + + + //removes member from clan + public function kickMember($characterId, Daemon_Forum $forum) + { + if($characterId != $this->leader_id) + { + $sql = "UPDATE characters SET clan_id = NULL WHERE character_id=:id"; + $this->_dbClient->query($sql, array('id' => $characterId)); + $forum->addMailById(null, $characterId, 'Wyrzucono cię z klanu.'); + } + else Daemon_MsgQueue::add('Przywódca nie może odejść, jedynie rozwiązać klan.'); + } +} diff --git a/2013/daemon/lib/daemon/dbobject/combatunit.php b/2013/daemon/lib/daemon/dbobject/combatunit.php new file mode 100644 index 0000000..4497dde --- /dev/null +++ b/2013/daemon/lib/daemon/dbobject/combatunit.php @@ -0,0 +1,63 @@ +type1])) + $this->type1 = null; + if (!isset($attackTypes[$this->type2])) + $this->type2 = null; + if (!isset($attackSpecials[$this->sp1_type])) + $this->sp1_type = null; + if (!isset($attackSpecials[$this->sp2_type])) + $this->sp2_type = null; + if (!isset($armorSpecials[$this->armor_sp_type])) + $this->armor_sp_type = null; + } +} diff --git a/2013/daemon/lib/daemon/dbobject/event.php b/2013/daemon/lib/daemon/dbobject/event.php new file mode 100644 index 0000000..9465441 --- /dev/null +++ b/2013/daemon/lib/daemon/dbobject/event.php @@ -0,0 +1,11 @@ +type])) + { + if ($this->damage_type && isset($itemDamageTypes[$this->damage_type])) + { + $typeName = sprintf('broń %s (obrażenia %s)', + $itemWeaponTypes[$this->type], $itemDamageTypes[$this->damage_type]); + } + else + $typeName = 'tarcza'; + if(isset($combatAttackSpecials[$this->special_type])) + $specialName = sprintf('%s (%s)', $combatAttackSpecials[$this->special_type], $this->special_param); + } + elseif (!empty($itemArmorTypes[$this->type])) + { + $typeName = $itemArmorTypes[$this->type]; + if(isset($combatArmorSpecials[$this->special_type])) + $specialName = sprintf('%s (%s)', $combatArmorSpecials[$this->special_type], $this->special_param); + } + else //usables + { + $typeName = 'niezakładalny'; + } + //stats + $stats = array(); + if($specialName) + $stats[] = $specialName; + if('item' != $this->type) + { + if($this->pstr_p || $this->pstr_c) + $stats[] = $this->getStatDescription('pstr', $this->pstr_p, $this->pstr_c); + if($this->patk_p || $this->patk_c) + $stats[] = $this->getStatDescription('patk', $this->patk_p, $this->patk_c); + if($this->pdef_p || $this->pdef_c) + $stats[] = $this->getStatDescription('pdef', $this->pdef_p, $this->pdef_c); + if($this->pres_p || $this->pres_c) + $stats[] = $this->getStatDescription('pres', $this->pres_p, $this->pres_c); + if($this->mstr_p || $this->mstr_c) + $stats[] = $this->getStatDescription('mstr', $this->mstr_p, $this->mstr_c); + if($this->matk_p || $this->matk_c) + $stats[] = $this->getStatDescription('matk', $this->matk_p, $this->matk_c); + if($this->mdef_p || $this->mdef_c) + $stats[] = $this->getStatDescription('mdef', $this->mdef_p, $this->mdef_c); + if($this->mres_p || $this->mres_c) + $stats[] = $this->getStatDescription('mres', $this->mres_p, $this->mres_c); + if($this->armor) + $stats[] = sprintf('pancerz%+d', $this->armor); + if($this->speed) + $stats[] = sprintf('szybkość%+d%%', $this->speed); + if($this->regen) + $stats[] = sprintf('regen%+d', $this->regen); + } + //final concatenation + if($stats) + $desc = sprintf('%s; %s', $typeName, implode(', ', $stats)); + else $desc = $typeName; + return $desc; + } + + + //returns a list of matching equipment slots + public function getSlots() + { + if ($this->type == 'weapon1h') + return array('hand_a', 'hand_b'); + elseif ($this->type == 'weapon2h') + return array('hand_a'); + elseif ($this->type == 'accesory') + return array('accesory_a', 'accesory_b'); + elseif ($this->type != 'item') + return array($this->type); + else return array(); + } + + + private function getStatDescription($name, $value_p = 0, $value_c = 0) + { + $result = $name; + if($value_p) + $result .= sprintf('%+d%%', $value_p); + if($value_c) + $result .= sprintf('%+d', $value_c); + return $result; + } + + + public function updateSuggestedValue(Daemon_DbConfig $dbCfg) + { + if ($this->type == 'item') + return; + $this->suggested_value = 0.0; + $baseValue = $dbCfg->generatorBaseValue; + $weights = $dbCfg->getGeneratorWeights($this->type); + foreach ($weights as $key => $val) + { + if (isset($this->$key)) + $this->suggested_value += $this->$key * $val; + } + $this->suggested_value *= $baseValue; + } + + + public function validate() + { + if ($this->type == 'weapon1h' || $this->type == 'weapon2h') + { + $specials = Daemon_Dictionary::$combatAttackSpecials; + if(!isset($specials[$this->special_type])) + { + $this->special_type = null; + $this->special_param = null; + } + } + elseif ($this->type != 'item') + { + $this->damage_type = null; + $specials = Daemon_Dictionary::$combatArmorSpecials; + if(($this->type != 'armor') || !isset($specials[$this->special_type])) + { + $this->special_type = null; + $this->special_param = null; + } + } + else //usables + { + $this->damage_type = null; + } + } +} diff --git a/2013/daemon/lib/daemon/dbobject/itemtemplate.php b/2013/daemon/lib/daemon/dbobject/itemtemplate.php new file mode 100644 index 0000000..4439aa7 --- /dev/null +++ b/2013/daemon/lib/daemon/dbobject/itemtemplate.php @@ -0,0 +1,20 @@ +_characterData->checkTurnCosts()) + return false; + //update character data + $this->_characterData->regen(false); + //check for events + $this->checkEvents(2); + //save character data + $this->_characterData->put(); + return true; + } + + + //spends one turn on resting + public function actionRest() + { + //check turn costs + if(!$this->_characterData->checkTurnCosts()) + return false; + //update character data + $this->_characterData->regen(true); + //check for events + $this->checkEvents(1); + //save character data + $this->_characterData->put(); + return true; + } + + + //spends one turn on training + public function actionTrain() + { + //check turn costs + if(!$this->_characterData->checkTurnCosts()) + return false; + //update character data + $this->_characterData->regen(false); + $this->_characterData->xp_free += 1; + //check for events + $this->checkEvents(1); + //save character data + $this->_characterData->put(); + return true; + } + + + //moves character to specified location + public function actionTravel($destinationId) + { + //read path data + $sql = "SELECT * FROM location_paths WHERE location_id=:id AND destination_id=:destId"; + $params = array('id' => $this->location_id, 'destId' => $destinationId); + $path = $this->_dbClient->selectRow($sql, $params); + if(!$path) + { + Daemon_MsgQueue::add('Wybrana ścieżka jest niedostępna.'); + return false; + } + //check turn costs + if(!$this->_characterData->checkTurnCosts($path['cost_gold'], $path['cost_mana'])) + return false; + //update character data + $this->_characterData->regen(false); + $this->_characterData->location_id = $destinationId; + //load destination + $this->get(array('location_id' => $destinationId)); + if($this->region_id) + { + $sql = "INSERT IGNORE INTO character_regions (character_id, region_id) VALUES (:charId, :regionId)"; + $params = array('charId' => $this->_characterData->character_id, 'regionId' => $this->region_id); + $this->_dbClient->query($sql, $params); + } + //check for events + $this->checkEvents(1); + //save character data + $this->_characterData->put(); + return true; + } + + + public function attachCharacterData(Daemon_DbObject_CharacterData $characterData) + { + $this->_characterData = $characterData; + } + + + //checks for events in a location + private function checkEvents($chanceMult) + { + $event = false; + $eventParams = array(); + //check if there was any event + if($this->chance2) + { + $d256 = mt_rand(0, 255); + $failChance = 256 * (1 - $this->chance1 / $this->chance2); + $chance = $chanceMult ? (256 - $failChance / $chanceMult) : 0; + $event = ($d256 < $chance); + } + //check event type + if($event) + { + //read monster data + $sql = "SELECT * FROM location_monsters WHERE location_id=:id"; + $monsters = $this->_dbClient->selectAll($sql, array('id' => $this->location_id)); + //read special events + $sql = "SELECT * FROM location_events WHERE location_id=:id"; + $events = $this->_dbClient->selectAll($sql, array('id' => $this->location_id)); + //find event data + $chanceSum = 0; + foreach($monsters as $row) + $chanceSum += $row['chance']; + foreach($events as $row) + $chanceSum += $row['chance']; + $d256 = mt_rand(0, 255); + foreach($monsters as $row) + { + $chance = 256 * $row['chance'] / $chanceSum; + if($d256 < $chance) + { + $eventParams = array('monsterId' => $row['monster_id']); + break; + } + $d256 -= $chance; + } + foreach($events as $row) + { + $chance = 256 * $row['chance'] / $chanceSum; + if($d256 < $chance) + { + $eventParams = array('eventId' => $row['event_id'], 'params' => $row['params']); + break; + } + $d256 -= $chance; + } + } + //store event + if(!$eventParams) + Daemon_MsgQueue::add('Brak zdarzeń w tej turze.'); + $this->_characterData->setLocationEvent($eventParams); + } + + + //counts characters present in a location + public function getCharacterCount($limit) + { + $sql = "SELECT COUNT(1) FROM character_data WHERE location_id=:id LIMIT :limit"; + $params = array('id' => $this->location_id, 'limit' => $limit); + return $this->_dbClient->selectValue($sql, $params); + } + + + //gets a list of characters present in a location + public function getCharacters(Daemon_DbObject_CharacterData $char, $halfLimit = null) + { + if(empty($this->location_id)) + return array(); + $sql = "SELECT MAX(rollover_id) FROM rollovers"; + $rolloverId = $this->_dbClient->selectValue($sql); + $charId = $this->_characterData->character_id; + $cols = "c.character_id, c.name, cp.location_id, cp.level, cp.xp_used, + c.clan_id, cp.faction_id, COALESCE(cp.rank_id, 0) AS rank_id, f.name AS faction_name"; + $tables = "character_data cp + JOIN characters c USING(character_id) + LEFT JOIN factions f USING(faction_id)"; + $params = array('id' => $this->location_id, 'charId' => $charId); + if($halfLimit) + { + $params['xp'] = $char->xp_used; + $params['halfLimit'] = $halfLimit; + $sql = "( + SELECT $cols FROM $tables + WHERE cp.location_id=:id AND cp.character_id!=:charId AND cp.xp_used >= :xp + ORDER BY xp_used ASC LIMIT $halfLimit + ) UNION ( + SELECT $cols FROM $tables + WHERE cp.location_id=:id AND cp.character_id!=:charId AND cp.xp_used <= :xp + ORDER BY xp_used DESC LIMIT $halfLimit + ) ORDER BY xp_used DESC, name ASC"; + } + else + { + $sql = "SELECT $cols FROM $tables + WHERE cp.location_id=:id AND cp.character_id!=:charId + ORDER BY cp.xp_used DESC, c.name ASC"; + } + $data = $this->_dbClient->selectAll($sql, $params); + foreach($data as &$row) + { + $row['_canAttack'] = $char->canAttack($row, $rolloverId, false); + $row['_sparring'] = ('normal' != $char->getCombatType($row, $this->type)); + } + return $data; + } + + + //gets the name of a faction owning location/caern + public function getFactionName() + { + if(empty($this->faction_id)) + return null; + $sql = "SELECT name FROM factions WHERE faction_id=:id"; + return $this->_dbClient->selectValue($sql, array('id' => $this->faction_id)); + } + + + //get a full list of maps + public function getMaps() + { + $sql = "SELECT * FROM maps WHERE url IS NOT NULL AND url != '' ORDER BY sort, name"; + return $this->_dbClient->selectAll($sql, array()); + } + + + //get a list of paths starting in current location + public function getPaths() + { + if(empty($this->location_id)) + return array(); + $sql = "SELECT p.*, IF(p.name IS NULL OR p.name='', l.name, p.name) AS path_name, + (p.cost_gold<=:gold AND p.cost_mana<=:mana) AS _enabled + FROM location_paths p JOIN locations l ON p.destination_id=l.location_id + WHERE p.location_id=:id ORDER BY l.name, l.location_id"; + $params = array('id' => $this->location_id, + 'gold' => $this->_characterData->gold_purse, + 'mana' => $this->_characterData->mana, + ); + return $this->_dbClient->selectAll($sql, $params); + } + + + public function getPictureUrl() + { + if ($this->picture_url) + return $this->picture_url; + $sql = "SELECT picture_url FROM regions WHERE region_id=:id"; + return $this->_dbClient->selectValue($sql, array('id' => $this->region_id)); + } + + + //get name of the location's region + public function getRegionName() + { + if(empty($this->region_id)) + return null; + $sql = "SELECT name FROM regions WHERE region_id=:id"; + return $this->_dbClient->selectValue($sql, array('id' => $this->region_id)); + } + + + //get a list of available services + public function getServices() + { + if(empty($this->location_id)) + return array(); + $sql = "SELECT s.*, ( + (s.faction_id IS NULL OR :factionId IS NULL OR s.faction_id = :factionId) + AND (s.rank_id IS NULL OR s.rank_id <= :rankId) + ) AS _enabled + FROM location_services l JOIN services s USING(service_id) + WHERE l.location_id=:id ORDER BY s.name"; + $params = array('id' => $this->location_id, + 'factionId' => $this->_characterData->faction_id, + 'rankId' => $this->_characterData->rank_id, + ); + return $this->_dbClient->selectAll($sql, $params); + } + + + //checks object data + public function validate() + { + $this->chance1 = max(0, (int) $this->chance1); + $this->chance2 = max(1, (int) $this->chance2); + if($this->type != 'boss') + { + $this->boss_id = null; + $this->boss_status = null; + if ($this->type != 'caern') + $this->faction_id = null; + } + } +} diff --git a/2013/daemon/lib/daemon/dbobject/monster.php b/2013/daemon/lib/daemon/dbobject/monster.php new file mode 100644 index 0000000..6a81f69 --- /dev/null +++ b/2013/daemon/lib/daemon/dbobject/monster.php @@ -0,0 +1,49 @@ +_combatUnit) + { + $this->_combatUnit = $full ? new Daemon_Combat_Unit() : new Daemon_DbObject_CombatUnit(); + $this->_combatUnit->attachDbClient($this->_dbClient); + if($this->combat_unit_id) + $this->_combatUnit->get(array('combat_unit_id' => $this->combat_unit_id)); + $this->_combatUnit->name = $this->name; + $this->_combatUnit->faction_id = null; + } + return $this->_combatUnit; + } + + + public function validate() + { + $this->class = max(0, (int) $this->class); + $this->level = max(0, (int) $this->level); + $this->gold = max(0, (int) $this->gold); + $this->chance1 = max(0, (int) $this->chance1); + $this->chance2 = max(1, (int) $this->chance2); + //set class + foreach (Daemon_Dictionary::$monsterClassLevels as $class => $level) + { + if ($this->level > $level) + $this->class = $class; + } + } +} diff --git a/2013/daemon/lib/daemon/dbobject/player.php b/2013/daemon/lib/daemon/dbobject/player.php new file mode 100644 index 0000000..c60300c --- /dev/null +++ b/2013/daemon/lib/daemon/dbobject/player.php @@ -0,0 +1,387 @@ +attachDbClient($dbClient); + $this->checkSession(); + if($id = $this->getPlayerId()) + parent::get(array('player_id' => $id)); + } + + + //creates a new character + public function addCharacter($name, $gender, $turnDelta, $turnLimit) + { + if(!$this->getPlayerId()) + return false; + $maxLength = $this->_dbClient->getColumnMaxLength('characters', 'name'); + $name = Daemon::normalizeString($name, false); + $gender = Daemon::normalizeString($gender, false); + $validName = $this->validateName($name, $maxLength); + $validGender = $this->validateGender($gender); + if($validName && $validGender) + { + $sql = "INSERT INTO characters (player_id, name, gender, last_action) VALUES (:playerId, :name, :gender, now())"; + $params = array( + 'playerId' => $this->getPlayerId(), + 'name' => $name, 'gender' => $gender, + ); + $this->_dbClient->query($sql, $params, 'Wybrane imię jest już zajęte.'); + if($id = $this->_dbClient->lastInsertId()) + { + $turns = $this->getStartingTurns($turnDelta, $turnLimit); + $sql = "INSERT INTO character_data(character_id, turns) VALUES (:id, :turns)"; + $this->_dbClient->query($sql, array('id' => $id, 'turns' => $turns)); + $sql = "INSERT INTO character_statistics(character_id) VALUES (:id)"; + $this->_dbClient->query($sql, array('id' => $id)); + } + } + } + + + //checks and stores authentication data (logs in) + public function authenticate($login, $password) + { + $this->get(array('login' => $login)); + if($this->player_id) + { + //check password + list($salt, $hash) = explode(':', $this->password.':'); + if($hash == Daemon::passwordHash($salt, $password)) + { + session_regenerate_id(true); + $_SESSION[self::VARNAME_PLAYER_ID] = (int) $this->player_id; + $_SESSION[self::VARNAME_PLAYER_ADDR] = getenv('REMOTE_ADDR'); + $_SESSION[self::VARNAME_TIMESTAMP] = time(); + $this->last_login = $this->_dbClient->selectValue("SELECT NOW()"); + $this->put(); + } + else $this->player_id = null; + } + if(!$this->player_id) + { + Daemon_MsgQueue::add('Nieprawidłowy login lub hasło.'); + $this->unauthenticate(); + } + } + + + //compares request data with stored auth data + private function checkSession() + { + $prevAddr = $currentAddr = getenv('REMOTE_ADDR'); + $prevTime = $currentTime = time(); + if(isset($_SESSION[self::VARNAME_PLAYER_ADDR])) + $prevAddr = $_SESSION[self::VARNAME_PLAYER_ADDR]; + if(isset($_SESSION[self::VARNAME_TIMESTAMP])) + $prevTime = $_SESSION[self::VARNAME_TIMESTAMP]; + $validAddr = ($currentAddr == $prevAddr); + $validTime = ($currentTime < $prevTime + self::SESSION_TIMEOUT); + if($validAddr && $validTime) + $_SESSION[self::VARNAME_TIMESTAMP] = $currentTime; + else $this->unauthenticate(); + } + + + //resets or deletes selected character + public function deleteCharacter($characterId, $reset, $turnDelta, $turnLimit) + { + if(!$this->getPlayerId()) + return false; + $sql = "SELECT character_id FROM characters WHERE character_id=:id AND player_id=:playerId"; + $params = array('id' => $characterId, 'playerId' => $this->getPlayerId()); + if($id = $this->_dbClient->selectValue($sql, $params)) + { + $params = array('id' => $characterId); + $tables = array('character_data', 'character_missions', 'character_regions', + 'character_statistics', 'character_titles', 'inventory'); + foreach($tables as $table) + { + $sql = "DELETE FROM $table WHERE character_id=:id"; + if ($table == 'character_titles') + $sql .= " AND title_id NOT IN (SELECT title_id FROM titles WHERE type='special')"; + $this->_dbClient->query($sql, $params); + } + if ($reset) + { + $turns = $this->getStartingTurns($turnDelta, $turnLimit); + $sql = "INSERT INTO character_data(character_id, turns) VALUES (:id, :turns)"; + $this->_dbClient->query($sql, array('id' => $id, 'turns' => $turns)); + $sql = "INSERT INTO character_statistics(character_id) VALUES (:id)"; + $this->_dbClient->query($sql, array('id' => $id)); + } + else + { + $sql = "DELETE FROM characters WHERE character_id=:id"; + $this->_dbClient->query($sql, $params); + } + } + } + + + //returns basic data of active character + public function getActiveCharacter() + { + $char = new Daemon_DbObject_Character; + $char->attachDbClient($this->_dbClient); + if($id = $this->getCharacterId()) + $char->get(array('character_id' => $id)); + $this->setCharacterId($char->character_id); + $char->attachPlayer($this); + return $char; + } + + + //returns active character's ID + public function getCharacterId() + { + if(isset($_SESSION[self::VARNAME_CHARACTER_ID])) + return $_SESSION[self::VARNAME_CHARACTER_ID]; + else return null; + } + + + //returns a list of player's characters + public function getCharacters() + { + $sql = "SELECT c.character_id, c.name, + cp.level, cp.turns, cp.health, cp.health_max, l.name AS location_name + FROM characters c + LEFT JOIN character_data cp USING(character_id) + LEFT JOIN locations l USING(location_id) + WHERE player_id = :playerId"; + $params = array('playerId' => $this->getPlayerId()); + $result = array(); + foreach((array) $this->_dbClient->selectAll($sql, $params) as $row) + $result[$row['character_id']] = $row; + return $result; + } + + + //returns authenticated player's ID + public function getPlayerId() + { + if(isset($_SESSION[self::VARNAME_PLAYER_ID])) + $this->player_id = $_SESSION[self::VARNAME_PLAYER_ID]; + else $this->player_id = null; + return $this->player_id; + } + + + //returns a list of player's access roles + public function getRoles() + { + if(!$id = $this->getPlayerId()) + return array(); + if(!is_array($this->roles)) + { + $sql = "SELECT roles FROM players WHERE player_id=:playerId"; + $params = array('playerId' => $this->getPlayerId()); + $this->roles = explode(',', (string) $this->_dbClient->selectValue($sql, $params)); + } + return $this->roles; + } + + + protected function getStartingTurns($turnDelta, $turnLimit) + { + $sql = "SELECT COUNT(rollover_id) FROM rollovers"; + $n = (int) $this->_dbClient->selectValue($sql); + return min($turnLimit, $turnDelta * (1 + $n)); + } + + + //checks if player has selected access role + public function hasRole($name) + { + return in_array($name, $this->getRoles()); + } + + + //stores a new password and sends mail with reset key + public function preparePasswordReset($login, $email, $password, $passwordCopy) + { + if (!$this->validatePassword($password, $passwordCopy)) + return false; + if (!$login || !$email) + { + Daemon_MsgQueue::add('Musisz podać login oraz email.'); + return false; + } + //validate login+email + $sql = "SELECT player_id FROM players WHERE login=:login AND email=:email"; + $params = array('login' => $login, 'email' => $email); + $playerId = $this->_dbClient->selectValue($sql, $params); + if (!$playerId) + { + Daemon_MsgQueue::add('Nieprawidłowy login lub hasło.'); + return false; + } + //store password + $key = sha1(Daemon::passwordSalt() . $login . $email); + $salt = Daemon::passwordSalt(); + $passwordSql = sprintf('%s:%s', $salt, Daemon::passwordHash($salt, $password)); + $sql = "UPDATE players SET reset_key = :key, reset_password = :password, + reset_until = now() + INTERVAL 1 WEEK WHERE player_id = :id"; + $params = array('id' => $playerId, 'key' => $key, 'password' => $passwordSql); + $ok = $this->_dbClient->query($sql, $params); + if (!$ok) + { + Daemon_MsgQueue::add('Nie udało się zapisać nowego hasła.'); + return false; + } + //send mail + $url = sprintf('%sreset-password?key=%s', $GLOBALS['cfg']->applicationUrl, $key); + $subject = "Daemon 2: reset hasla"; + $message = "Aby zresetowac haslo przejdz pod adres:\n$url\n"; + $from = $GLOBALS['cfg']->applicationMail; + $headers = "From: $from\r\nReply-To: $from"; + $ok = mail($email, $subject, $message, $headers); + if ($ok) + $msg = 'Na podany email wysłana została wiadomość z kluczem resetującym hasło.'; + else + $msg = 'Niestety mailer nie działa, reset hasła jest chwilowo niemozliwy.'; + Daemon_MsgQueue::add($msg); + return $ok; + } + + + //creates a new player + public function register($login, $password, $passwordCopy) + { + $maxLength = $this->_dbClient->getColumnMaxLength('players', 'login'); + $validLogin = $this->validateLogin($login, $maxLength); + $validPassword = $this->validatePassword($password, $passwordCopy); + if($validLogin && $validPassword) + { + $salt = Daemon::passwordSalt(); + $passwordSql = sprintf('%s:%s', $salt, Daemon::passwordHash($salt, $password)); + $sql = "INSERT INTO players (login, password, roles) VALUES (:login, :password, 'chat')"; + $params = array('login' => $login, 'password' => $passwordSql); + $ok = $this->_dbClient->query($sql, $params, 'Wybrany login jest już zajęty.'); + Daemon_MsgQueue::add(sprintf('Rejestracja zakończona %s.', $ok ? 'powodzeniem' : 'niepowodzeniem')); + return $ok; + } + return false; + } + + + //resets password based on a hash key + public function resetPassword($key) + { + $sql = "SELECT player_id FROM players WHERE reset_key = :key AND reset_until >= current_date"; + $params = array('key' => $key); + $playerId = $this->_dbClient->selectValue($sql, $params); + if ($playerId) + { + $sql = "UPDATE players SET password = reset_password, reset_password = null, + reset_key = null, reset_until = null WHERE player_id = :id"; + $params = array('id' => $playerId); + $ok = $this->_dbClient->query($sql, $params); + Daemon_MsgQueue::add(sprintf('Zmiana hasła zakończona %s.', $ok ? 'powodzeniem' : 'niepowodzeniem')); + } + else + Daemon_MsgQueue::add('Podany kod jest nieprawidłowy lub nieaktualny.'); + } + + + //stores selected character's ID + public function setCharacterId($id) + { + $_SESSION[self::VARNAME_CHARACTER_ID] = (int) $id; + } + + + //updates password + public function setPassword($password, $passwordCopy) + { + if(!$password && !$passwordCopy) + return; + if($this->validatePassword($password, $passwordCopy)) + { + $salt = Daemon::passwordSalt(); + $this->password = sprintf('%s:%s', $salt, Daemon::passwordHash($salt, $password)); + $this->put(); + Daemon_MsgQueue::add('Hasło zostało zmienione.'); + } + } + + + //deletes stored authentication data (logs out) + public function unauthenticate() + { + unset($_SESSION[self::VARNAME_CHARACTER_ID]); + unset($_SESSION[self::VARNAME_PLAYER_ID]); + unset($_SESSION[self::VARNAME_PLAYER_ADDR]); + unset($_SESSION[self::VARNAME_TIMESTAMP]); + } + + + //checks login validity + private function validateLogin($input, $maxLength) + { + if(!$input) + Daemon_MsgQueue::add('Musisz podać login.'); + elseif(iconv_strlen($input) > $maxLength) + Daemon_MsgQueue::add('Wybrany login jest za długi.'); + else return true; + return false; + } + + + //checks gender validity + private function validateGender($input) + { + if(!in_array($input, array_keys(Daemon_Dictionary::$genders))) + Daemon_MsgQueue::add('Wybrana płeć nie jest dostępna.'); + else return true; + return false; + } + + + //checks name validity + private function validateName($input, $maxLength) + { + if(!$input) + Daemon_MsgQueue::add('Musisz podać imię.'); + elseif(iconv_strlen($input) > $maxLength) + Daemon_MsgQueue::add('Wybrane imię jest za długie.'); + else return true; + return false; + } + + + //checks password validity + private function validatePassword($input, $inputCopy) + { + if(!$input) + Daemon_MsgQueue::add('Musisz podać hasło.'); + elseif($input != $inputCopy) + Daemon_MsgQueue::add('Źle powtórzone hasło.'); + else return true; + return false; + } +} diff --git a/2013/daemon/lib/daemon/dictionary.php b/2013/daemon/lib/daemon/dictionary.php new file mode 100644 index 0000000..597b7a8 --- /dev/null +++ b/2013/daemon/lib/daemon/dictionary.php @@ -0,0 +1,85 @@ + 'ukryty', 'active' => 'aktywny', 'defeated' => 'pokonany'); + + public static $characterAttributes = array( + 'str' => 'Siła', 'dex' => 'Zręczność', 'vit' => 'Wytrzymałość', 'pwr' => 'Moc', 'wil' => 'Siła Woli'); + + public static $characterSkills = array( + 'pstr' => 'Silny Cios', 'patk' => 'Przycelowanie', + 'pdef' => 'Unik', 'pres' => 'Twardziel', 'preg' => 'Regeneracja', + 'mstr' => 'Koncentracja', 'matk' => 'Magia Bojowa', + 'mdef' => 'Kontrzaklęcie', 'mres' => 'Antymagia', 'mreg' => 'Medytacja'); + + public static $combatAttackTypes = array('p' => 'fizyczny', 'm' => 'magiczny'); + + public static $combatAttackSpecials = array( + Daemon_DbObject_CombatUnit::SP_POISON => 'trucizna', + Daemon_DbObject_CombatUnit::SP_VAMPIRE => 'wampiryzm', + Daemon_DbObject_CombatUnit::SP_ETHER => 'eteryczny', + Daemon_DbObject_CombatUnit::SP_BLOODY => 'krwawy', + Daemon_DbObject_CombatUnit::SP_STUN => 'ogłuszenie', + Daemon_DbObject_CombatUnit::SP_FACTION => 'nienawiść', + Daemon_DbObject_CombatUnit::SP_SWARM => 'stado', + ); + + public static $combatArmorSpecials = array( + Daemon_DbObject_CombatUnit::SP_DEMON => 'demon', + Daemon_DbObject_CombatUnit::SP_ANTIPOISON => 'odporność na trucizny', + Daemon_DbObject_CombatUnit::SP_ANTIVAMP => 'odporność na wampiryzm', + Daemon_DbObject_CombatUnit::SP_SHOCK => 'porażenie', + Daemon_DbObject_CombatUnit::SP_FACTION => 'fanatyzm', + ); + + public static $equipmentButtons = array('use' => 'użyj', 'equip' => 'załóż', 'unequip' => 'zdejmij'); + + public static $equipmentFlags = array('bound' => 'przypisany', 'identified' => 'zidentyfikowany'); + + public static $equipmentGroups = array( + 'weapon1h' => 'BROŃ 1R i TARCZE', 'weapon2h' => 'BROŃ 2R', + 'armor' => 'PANCERZE', 'helmet' => 'HEŁMY', 'gloves' => 'RĘKAWICE', + 'boots' => 'BUTY', 'pendant' => 'NASZYJNIKI', 'accesory' => 'DODATKI', + 'item' => 'INNE PRZEDMIOTY'); + + public static $equipmentSlots = array( + 'hand_a' => 'główna ręka', 'hand_b' => 'druga ręka', + 'armor' => 'pancerz', 'helmet' => 'hełm', 'gloves' => 'rękawice', 'boots' => 'buty', + 'pendant' => 'naszyjnik', 'accesory_a' => 'dodatek A', 'accesory_b' => 'dodatek B'); + + public static $genders = array('f' => 'kobieta', 'm' => 'mężczyzna', 'n' => 'nieokreślona'); + + public static $generatorItemTypes = array( + 'weapon1h' => 'broń 1R', 'weapon2h' => 'broń 2R', + 'armor' => 'pancerz', 'helmet' => 'hełm', 'gloves' => 'rękawice', + 'boots' => 'buty', 'pendant' => 'naszyjnik', 'accesory' => 'dodatek'); + + public static $itemTypes = array( + 'weapon1h' => 'broń 1R', 'weapon2h' =>'broń 2R', + 'armor' => 'pancerz', 'helmet' => 'hełm', 'gloves' => 'rękawice', + 'boots' => 'buty', 'pendant' => 'naszyjnik', 'accesory' => 'dodatek', + 'item' => 'niezakładalny'); + + public static $itemDamageTypes = array('' => 'brak', 'p' => 'fizyczne', 'm' => 'magiczne'); + + public static $itemWeaponTypes = array('weapon1h' => 'jednoręczna', 'weapon2h' =>'dwuręczna'); + + public static $itemArmorTypes = array( + 'armor' => 'pancerz', 'helmet' => 'hełm', 'gloves' => 'rękawice', + 'boots' => 'buty', 'pendant' => 'naszyjnik', 'accesory' => 'dodatek'); + + public static $locationTypes = array('normal' => 'zwykła', 'arena'=>'arena', 'caern'=>'caern', 'boss' => 'boss'); + + public static $missionProgress = array( + 'active' => 'aktywna', 'completed' => 'ukończona', 'rewarded' => 'nagrodzona'); + + public static $monsterClasses = array(1 => 'słaby', 2 => 'średni', 3 => 'silny', 4 => 'epicki'); + + public static $monsterClassLevels = array(1 => 0, 2 => 20, 3 => 45, 4 => 70); + + public static $serviceTypes = array( + 'bank'=>'bank', 'healer' => 'uzdrowiciel', 'shop' => 'sklep', 'temple'=>'świątynia'); + + public static $skinDirUrls = array('Ciemny' => 'static/dark', 'Jasny' => 'static/light'); +} diff --git a/2013/daemon/lib/daemon/duel.php b/2013/daemon/lib/daemon/duel.php new file mode 100644 index 0000000..52c6e72 --- /dev/null +++ b/2013/daemon/lib/daemon/duel.php @@ -0,0 +1,182 @@ +characterData = $characterData; + } + + + public function attachDbClient(Daemon_DbClient $dbClient) + { + $this->dbClient = $dbClient; + } + + + public function getCombatLog() + { + return $this->combatLog; + } + + + //returns target character's object + private function getTarget($targetId) + { + $params = array('character_id' => $targetId); + $cdata = new Daemon_DbObject_CharacterData(); + $cdata->attachDbClient($this->dbClient); + $cdata->get($params); + $sql = "SELECT name FROM characters WHERE character_id=:character_id"; + $cdata->_characterName = $this->dbClient->selectValue($sql, $params); + return $cdata; + } + + + public function execute(Daemon_View $view, $locationType, $targetId) + { + $levelMultiplier = 1.2; //magic number! + $attacker = $this->characterData; + $defender = $this->getTarget($targetId); + $winner = null; + $winnerName = null; + $winnerXp = 0; + $winnerLevel = null; + $loserName = null; + $loserLevel = 0; + $sql = "SELECT MAX(rollover_id) FROM rollovers"; + $rolloverId = $this->dbClient->selectValue($sql); + //check if combat is possibile + if(!$attacker->canAttack((array) $defender, $rolloverId, true)) + return null; + //check combat type + $combatType = $attacker->getCombatType((array) $defender, $locationType); + if(!$combatType) + { + Daemon_MsgQueue::add('Nie możesz zaatakować tej postaci.'); + return false; + } + $arena = ('arena' == $combatType); + //pre-calculate xp rewards (depends on health, which changes in combat) + $factionBonus = ($attacker->faction_id && $defender->faction_id + && ($attacker->faction_id != $defender->faction_id)); + $attackerLevel = $attacker->getEffectiveLevel($factionBonus); + $defenderLevel = $defender->getEffectiveLevel($factionBonus); + //execute combat + $winner = $this->runCombat($defender, $combatType); + //update winner + if(self::WINNER_ACTOR == $winner) + { + $winnerChar = $attacker; + $loserChar = $defender; + $winnerXp = Daemon_Math::round($levelMultiplier * $defenderLevel); + } + elseif(self::WINNER_TARGET == $winner) + { + $winnerChar = $defender; + $loserChar = $attacker; + $winnerXp = Daemon_Math::round($levelMultiplier * $attackerLevel); + } + else + { + $winnerChar = null; + $loserChar = null; + } + if($winnerChar && $loserChar) + { + $winnerName = $winnerChar->_characterName; + $loserName = $loserChar->_characterName; + $winnerChar->xp_free += $winnerXp; + $sql = "UPDATE character_statistics SET duel_wins=duel_wins+1 WHERE character_id=:id"; + $this->dbClient->query($sql, array('id' => $winnerChar->character_id)); + $sql = "UPDATE character_statistics SET duel_losses=duel_losses+1 WHERE character_id=:id"; + $this->dbClient->query($sql, array('id' => $loserChar->character_id)); + } + //save characters + $attacker->put(); + $defender->put(); + //log duel + $sql = "INSERT INTO duels(rollover_id, attacker_id, defender_id, type, winner, combat_log) + VALUES (:rolloverId, :attackerId, :defenderId, :type, :winner, :combatLog)"; + $params = array('rolloverId' => $rolloverId, + 'attackerId' => $attacker->character_id, 'defenderId' => $defender->character_id, + 'type' => $combatType, 'winner' => $winner, 'combatLog' => $this->combatLog); + $this->dbClient->query($sql, $params); + //generate report + $view->arena = $arena; + $view->combatLog = $this->combatLog; + $view->attackerName = $attacker->_characterName; + $view->defenderName = $defender->_characterName; + $view->winner = $winner; + $view->winnerName = $winnerName; + $view->winnerXp = $winnerXp; + $view->winnerLevel = $winnerLevel; + $view->loserName = $loserName; + ob_start(); + $view->display('duelcombat.xml'); + $this->combatLog = ob_get_clean(); + return true; + } + + + //executes combat, returns winner flag + private function runCombat(Daemon_DbObject_CharacterData $target, $combatType) + { + $combat = new Daemon_Combat(); + $logger = new Daemon_Combat_Log(); + $combat->attachLogger($logger); + //prepare units + $attackerUnit = $this->characterData->getCombatUnit(true); + $defenderUnit = $target->getCombatUnit(true); + if('arena' == $combatType) + { + $attackerUnit->health = $attackerUnit->health_max; + $defenderUnit->health = $defenderUnit->health_max; + } + //execute combat + $combat->addUnit('a', $attackerUnit, true); + $combat->addUnit('b', $defenderUnit, false); + $combat->execute(); + $this->combatLog = (string) $logger; + //check deaths + $deathA = ($attackerUnit->health < 1); + $deathB = ($defenderUnit->health < 1); + //update characters health, gold & equipment, return winner + if('arena' != $combatType) + { + $attackerUnit->put(); + $this->characterData->health = floor($attackerUnit->health); + $defenderUnit->put(); + $target->health = floor($defenderUnit->health); + } + if($deathA && $deathB) + { + if('arena' != $combatType) + { + $this->characterData->setDeath(true); + $target->setDeath(true, null); + } + return null;//double KO + } + elseif($deathA && !$deathB) + { + if('arena' != $combatType) + $this->characterData->setDeath(true); + return self::WINNER_TARGET; + } + elseif(!$deathA && $deathB) + { + if('arena' != $combatType) + $target->setDeath(true); + return self::WINNER_ACTOR; + } + else return null;//draw + } +} diff --git a/2013/daemon/lib/daemon/email.php b/2013/daemon/lib/daemon/email.php new file mode 100644 index 0000000..b59569f --- /dev/null +++ b/2013/daemon/lib/daemon/email.php @@ -0,0 +1,28 @@ +from = sprintf('no-reply@%s', getenv('SERVER_NAME')); + } + + + public function send() + { + $headers = implode("\r\n", array( + sprintf('From: %s', $this->from), + 'Content-Type:text/plain;charset=UTF-8', + )); + echo "mail($this->to, $this->subject, $this->message, $headers);"; + exit; + } +} diff --git a/2013/daemon/lib/daemon/errorhandler.php b/2013/daemon/lib/daemon/errorhandler.php new file mode 100644 index 0000000..2454d31 --- /dev/null +++ b/2013/daemon/lib/daemon/errorhandler.php @@ -0,0 +1,47 @@ +getMessage(), $ex->getCode(), $ex->getFile(), $ex->getLine(), $ex->getTraceAsString()); + $path = sprintf('%s/exception.%s.log', self::$logDir, date('Ymd.His')); + self::logError($path, $data); + } + + + public static function logError($path, $data) + { + $stored = @file_put_contents($path, $data); + if(!headers_sent()) + header('Content-Type:text/html;charset=UTF-8'); + echo'500 Internal Server Error'; + echo'

Wystąpił błąd

'; + echo'

Kod gry zrobił Aaarghhh! i przestał działać. Albo zdechła baza danych. Albo cokolwiek.

'; + if($stored) + { + echo '

Na szczęście nie zawiodło automatyczne logowanie błędów,' + .' więc nie musisz nic robić poza szturchnięciem admina że jego badziew znow nie działa ;)

'; + } + else + { + echo '

Na dokładkę zawiodło też automatyczne logowanie błędów,' + .' więc to do Ciebie należy ciężkie zadanie powiadomienia o nim admina.' + .' Pamiętaj żeby podać wszystkie możliwe informacje o błędzie,' + .' ułatwi to lub w ogóle umożliwi jego wytropienie.

'; + } + exit; + } +} diff --git a/2013/daemon/lib/daemon/event.php b/2013/daemon/lib/daemon/event.php new file mode 100644 index 0000000..43a2547 --- /dev/null +++ b/2013/daemon/lib/daemon/event.php @@ -0,0 +1,50 @@ +characterData = $characterData; + } + + + public function attachDbClient(Daemon_DbClient $dbClient) + { + $this->dbClient = $dbClient; + } + + + public function getEventLog() + { + return $this->eventLog; + } + + + public function execute(Daemon_View $view, $eventId, $params) + { + //fetch event info + $sql = "SELECT name, handle FROM events WHERE event_id=:id"; + $event = $this->dbClient->selectRow($sql, array('id' => $eventId)); + if(!$event) + $event = array('name' => '???', 'handle' => null); + //check if event is implemented + $className = "Daemon_Event_$event[handle]"; + if(class_exists($className, true) && is_subclass_of($className, 'Daemon_EventInterface')) + { + //valid event, execute it (may update character) + $handler = new $className($this->dbClient, $this->characterData, $view); + $this->eventLog = $handler->execute($params); + } + else + { + //no event, update character + Daemon_MsgQueue::add("Nieznane zdarzenie: $event[name]"); + $this->characterData->setLocationEvent(array()); + $this->characterData->put(); + } + } +} diff --git a/2013/daemon/lib/daemon/event/deadend.php b/2013/daemon/lib/daemon/event/deadend.php new file mode 100644 index 0000000..8264846 --- /dev/null +++ b/2013/daemon/lib/daemon/event/deadend.php @@ -0,0 +1,14 @@ +clearEvent(); + ob_start(); + $this->view->display('event/deadend.xml'); + return ob_get_clean(); + } +} diff --git a/2013/daemon/lib/daemon/event/help.php b/2013/daemon/lib/daemon/event/help.php new file mode 100644 index 0000000..f2af808 --- /dev/null +++ b/2013/daemon/lib/daemon/event/help.php @@ -0,0 +1,12 @@ +clearEvent(); + return 'Aaarghhh!'; + } +} diff --git a/2013/daemon/lib/daemon/event/intro.php b/2013/daemon/lib/daemon/event/intro.php new file mode 100644 index 0000000..46aaf21 --- /dev/null +++ b/2013/daemon/lib/daemon/event/intro.php @@ -0,0 +1,31 @@ +clearEvent(); + //check title + $sql = "SELECT 1 FROM character_titles WHERE character_id=:id AND title_id='cultist'"; + $hasTitle = (bool) $this->dbClient->selectValue($sql, array('id' => $this->characterData->character_id)); + if(!$hasTitle) + { + //run combat + $combat = new Daemon_MonsterCombat(); + $combat->attachCharacterData($this->characterData); + $combat->attachDbClient($this->dbClient); + $combat->execute($this->view, 'cultist', true); + $combatLog = $combat->getCombatLog(); + unset($combat); + } + else $combatLog = null; + //display log + ob_start(); + $this->view->combatLog = $combatLog; + $this->view->hasTitle = $hasTitle; + $this->view->display('event/intro.xml'); + return ob_get_clean(); + } +} diff --git a/2013/daemon/lib/daemon/eventinterface.php b/2013/daemon/lib/daemon/eventinterface.php new file mode 100644 index 0000000..9a9df3f --- /dev/null +++ b/2013/daemon/lib/daemon/eventinterface.php @@ -0,0 +1,27 @@ +dbClient = $dbClient; + $this->characterData = $characterData; + $this->view = $view; + } + + + final protected function clearEvent() + { + $this->characterData->setLocationEvent(array()); + $this->characterData->put(); + } + + + abstract public function execute($params); +} diff --git a/2013/daemon/lib/daemon/forum.php b/2013/daemon/lib/daemon/forum.php new file mode 100644 index 0000000..c77d52e --- /dev/null +++ b/2013/daemon/lib/daemon/forum.php @@ -0,0 +1,119 @@ +dbClient = $dbClient; + } + + + //adds new mail message + public function addChat($senderId, $channelId, $content) + { + $content = Daemon::normalizeString($content, true); + if($content) + { + $sql = "INSERT INTO chat (sender_id, channel_id, content) VALUES (:senderId, :channelId, :content)"; + $params = array('senderId' => $senderId, 'channelId' => $channelId, 'content' => $content); + $this->dbClient->query($sql, $params); + } + else Daemon_MsgQueue::add('Podaj treść wiadomości.'); + } + + + //adds new mail message + public function addMail($senderId, $recipientName, $content) + { + if($recipientId = $this->getCharacterIdByName($recipientName)) + $this->addMailById($senderId, $recipientId, $content); + else Daemon_MsgQueue::add('Wybrany adresat nie istnieje.'); + } + + + //adds new mail message + public function addMailById($senderId, $recipientId, $content) + { + $content = Daemon::normalizeString($content, true); + if($content) + { + $sql = "INSERT INTO mail (sender_id, recipient_id, content) VALUES (:senderId, :recipientId, :content)"; + $params = array('senderId' => $senderId, 'recipientId' => $recipientId, 'content' => $content); + $this->dbClient->query($sql, $params); + } + else Daemon_MsgQueue::add('Podaj treść wiadomości.'); + } + + + //updates message with "reply" link + private static function callbackReplyLink(&$row, $key, $characterId) + { + if($row['sender_id'] && ($row['sender_id'] != $characterId)) + $row['replyUrl'] = sprintf('?to=%s', urlencode($row['sender_name'])); + } + + + //finds character Id by its name + private function getCharacterIdByName($name) + { + $sql = "SELECT character_id FROM characters WHERE name = :name"; + return $this->dbClient->selectValue($sql, array('name' => Daemon::normalizeString($name))); + } + + + //fetches messages from selected channel + public function getChat($limit, $from, $channelId) + { + $params = array('limit' => $limit + 1, 'channelId' => $channelId); + $cond = 'channel_id = :channelId'; + if($from) + { + $cond .= ' AND message_id <= :from'; + $params['from'] = (int) $from; + } + $sql = "SELECT m.*, s.name AS sender_name + FROM chat m LEFT JOIN characters s ON s.character_id = m.sender_id + WHERE $cond ORDER BY message_id DESC LIMIT :limit"; + $list = $this->dbClient->selectAll($sql, $params); + if(count($list) > $limit) + { + $next = array_pop($list); + $next = $next['message_id']; + } + else $next = null; + return array('list' => $list, 'next' => $next); + } + + + //fetches character's mailbox + public function getMail($limit, $from, $characterId) + { + $params = array('limit' => $limit + 1, 'cid1' => $characterId, 'cid2' => $characterId); + $cond = '(sender_id = :cid1 OR recipient_id = :cid2)'; + if($from) + { + $cond .= ' AND message_id <= :from'; + $params['from'] = (int) $from; + } + $sql = "SELECT m.*, s.name AS sender_name, r.name AS recipient_name + FROM mail m + LEFT JOIN characters s ON s.character_id = m.sender_id + LEFT JOIN characters r ON r.character_id = m.recipient_id + WHERE $cond ORDER BY message_id DESC LIMIT :limit"; + + $list = $this->dbClient->selectAll($sql, $params); + if(count($list) > $limit) + { + $next = array_pop($list); + $next = $next['message_id']; + } + else $next = null; + if($list) + array_walk($list, array(get_class($this), 'callbackReplyLink'), $characterId); + return array('list' => $list, 'next' => $next); + } +} diff --git a/2013/daemon/lib/daemon/inventory.php b/2013/daemon/lib/daemon/inventory.php new file mode 100644 index 0000000..b169bfb --- /dev/null +++ b/2013/daemon/lib/daemon/inventory.php @@ -0,0 +1,154 @@ +dbClient = $dbClient; + $this->characterData = $characterData; + } + + + //equips selected item + public function equip($inventoryId, $slot) + { + //check item + $sql = "SELECT item_id FROM inventory WHERE inventory_id=:id AND character_id=:charId"; + $params = array('id' => $inventoryId, 'charId' => $this->characterData->character_id); + $id = $this->dbClient->selectValue($sql, $params); + $item = new Daemon_DbObject_Item(); + $item->attachDbClient($this->dbClient); + $item->get(array('item_id' => $id)); + $slots = $item->getSlots(); + //check slot + if(!in_array($slot, $slots)) + { + Daemon_MsgQueue::add('Nie możesz załozyć tego przedmiotu.'); + return false; + } + //check for 2h weapon equipped + $sql = "SELECT 'weapon2h'=i.type FROM inventory inv JOIN items i USING(item_id) + WHERE character_id=:charId AND equipped='hand_a'"; + $params = array('charId' => $this->characterData->character_id); + $zweihander = (bool) $this->dbClient->selectValue($sql, $params); + //equip item, unequip previous item(s) + if( ('weapon2h' == $item->type) || (('weapon1h' == $item->type) && $zweihander) )//2h equipping or equipped + $unequipSlots = "'hand_a','hand_b'"; + else $unequipSlots = "'$slot'"; + $sql = "UPDATE inventory SET equipped = IF(inventory_id=:id, :slot, null) + WHERE character_id=:charId AND (inventory_id=:id OR equipped IN ($unequipSlots))"; + $params = array('id' => $inventoryId, 'charId' => $this->characterData->character_id, 'slot' => $slot); + $this->dbClient->query($sql, $params); + } + + + //creates equipment array based on items list + public function getEquipment(array $items) + { + $result = array(); + foreach(Daemon_Dictionary::$equipmentSlots as $slot => $name) + $result[$slot] = array('slotName' => $name, 'inventoryId' => null, 'flags' => null, 'item' => null); + foreach($items as $row) + { + if(isset($result[$row['equipped']])) + { + $result[$row['equipped']]['inventoryId'] = $row['inventory_id']; + $result[$row['equipped']]['flags'] = $row['flags']; + $result[$row['equipped']]['item'] = $row['item']; + } + } + return $result; + } + + + //fetches a detailed list of character's items + public function getItems($status, $withoutEquipment = false) + { + $cond = "inv.character_id=:characterId"; + if($status) + $cond .= " AND inv.status=:status"; + if($withoutEquipment) + $cond .= " AND equipped IS NULL"; + $sql = "SELECT inv.inventory_id, inv.item_id, inv.status, inv.flags, inv.equipped + FROM inventory inv JOIN items i USING(item_id) + WHERE $cond ORDER BY i.type, i.name, inv.inventory_id"; + $params = array('characterId' => $this->characterData->character_id); + if($status) + $params['status'] = $status; + if($data = $this->dbClient->selectAll($sql, $params)) + { + $result = array(); + foreach($data as $row) + { + $row['_equipped'] = false; + if($row['flags']) + $row['flags'] = array_fill_keys(explode(',', $row['flags']), true); + else $row['flags'] = array(); + $row['item'] = new Daemon_DbObject_Item(); + $row['item']->attachDbClient($this->dbClient); + $row['item']->get(array('item_id' => $row['item_id'])); + $result[$row['inventory_id']] = $row; + } + return $result; + } + else return array(); + } + + + //groups items by status (equipped/inventory/storage) + public function groupItemsByStatus(array $items) + { + $result = array(); + foreach($items as $id => $row) + { + $status = $row['status']; + if(('inventory' == $status) && $row['equipped']) + $status = 'equipment'; + $result[$status]['items'][$id] = $row; + } + $groupNames = array('equipment' => 'Ekwipunek', 'inventory' => 'Plecak', 'storage' => 'Schowek'); + foreach(array_keys($result) as $key) + { + if(isset($groupNames[$key])) + $result[$key]['name'] = $groupNames[$key]; + else unset($groupNames[$key]); + } + return $result; + } + + + //groups items by type + public function groupItemsByType(array $items) + { + $result = array(); + $groupNames = Daemon_Dictionary::$equipmentGroups; + foreach ($groupNames as $key => $name) + $result[$key] = array('name' => $name, 'items' => array()); + foreach($items as $id => $row) + { + $type = $row['item']->type; + $result[$type]['items'][$id] = $row; + } + foreach(array_keys($result) as $key) + { + if (empty($result[$key]['items'])) + unset($result[$key]); + elseif (empty($result[$key]['name'])) + $result[$key]['name'] = '???'; + } + return $result; + } + + + //unequips selected item + public function unequip($inventoryId) + { + $sql = "UPDATE inventory SET equipped=null WHERE inventory_id=:id AND character_id=:charId"; + $params = array('id' => $inventoryId, 'charId' => $this->characterData->character_id); + $this->dbClient->query($sql, $params); + } +} diff --git a/2013/daemon/lib/daemon/item.php b/2013/daemon/lib/daemon/item.php new file mode 100644 index 0000000..bcea5dc --- /dev/null +++ b/2013/daemon/lib/daemon/item.php @@ -0,0 +1,54 @@ +characterData = $characterData; + } + + + public function attachDbClient(Daemon_DbClient $dbClient) + { + $this->dbClient = $dbClient; + } + + + public function getUsageLog() + { + return $this->usageLog; + } + + + public function execute(Daemon_View $view, $inventoryId) + { + //fetch item data + $sql = "SELECT s.handle, i.special_param AS params + FROM inventory inv JOIN items i USING(item_id) + LEFT JOIN item_specials s ON s.special_id = i.special_type + WHERE inv.character_id=:charId AND inv.inventory_id=:id AND i.type='item'"; + $params = array('charId' => $this->characterData->character_id, 'id' => $inventoryId); + $item = $this->dbClient->selectRow($sql, $params); + if(!$item) + $item = array('handle' => null, 'params' => null); + //check if handler is implemented + $className = "Daemon_Item_$item[handle]"; + if(class_exists($className, true) && is_subclass_of($className, 'Daemon_ItemInterface')) + { + //valid event, execute it (may update character) + $handler = new $className($this->dbClient, $this->characterData, $view); + $this->usageLog = $handler->execute($inventoryId, $item['params']); + return true; + } + else + { + //no effect + Daemon_MsgQueue::add('Nie masz pojęcia do czego to może służyć.'); + return false; + } + } +} diff --git a/2013/daemon/lib/daemon/item/givespell.php b/2013/daemon/lib/daemon/item/givespell.php new file mode 100644 index 0000000..d9997be --- /dev/null +++ b/2013/daemon/lib/daemon/item/givespell.php @@ -0,0 +1,33 @@ +characterData; + //get spell data + $sql = "SELECT * FROM spells WHERE spell_id=:id"; + $spell = $this->dbClient->selectRow($sql, array('id' => $spellId)); + if(!$spell) + return 'Takie zaklęcie nie istnieje.'; + //give spell to character + $colName = "sp_$spellId"; + if(($char->$colName > 0) && ($char->$colName <= $spell['min_cost'])) + return "Zaklęcie $spell[name] znasz już na poziomie mistrzowskim."; + if($char->$colName < 1) + { + $msg = "Poznajesz nowe zaklęcie: $spell[name]."; + $char->$colName = $spell['max_cost']; + } + elseif($char->$colName > $spell['min_cost']) + { + $msg = "Lepiej poznajesz zaklęcie $spell[name] - potrzebujesz mniej many by je rzucić."; + $char->$colName -= round(($spell['max_cost'] - $spell['min_cost']) / ($spell['max_level'] - 1)); + } + $char->put(); + $this->deleteItem($inventoryId); + return $msg; + } +} diff --git a/2013/daemon/lib/daemon/item/heal.php b/2013/daemon/lib/daemon/item/heal.php new file mode 100644 index 0000000..5b6ae6d --- /dev/null +++ b/2013/daemon/lib/daemon/item/heal.php @@ -0,0 +1,32 @@ +characterData; + $params = explode(',', $params); + $deltaHealth = isset($params[0]) ? (int) $params[0] : 0; + $deltaMana = isset($params[1]) ? (int) $params[1] : 0; + if($deltaHealth) + { + $oldValue = $char->health; + $char->health = min($char->health_max, $char->health + $deltaHealth); + $deltaHealth = $char->health - $oldValue; + $msg[] = "zdrowie: +$deltaHealth"; + } + if($deltaMana) + { + $oldValue = $char->mana; + $char->mana = min($char->mana_max, $char->mana + $deltaMana); + $deltaMana = $char->mana - $oldValue; + $msg[] = "mana: +$deltaMana"; + } + $char->put(); + $this->deleteItem($inventoryId); + return implode(', ', $msg); + } +} diff --git a/2013/daemon/lib/daemon/item/teleport.php b/2013/daemon/lib/daemon/item/teleport.php new file mode 100644 index 0000000..71d6434 --- /dev/null +++ b/2013/daemon/lib/daemon/item/teleport.php @@ -0,0 +1,15 @@ +characterData->location_id = $locationId; + $this->characterData->put(); + $this->deleteItem($inventoryId); + return "Nagle znajdujesz się zupełnie gdzieindziej..."; + } +} + diff --git a/2013/daemon/lib/daemon/iteminterface.php b/2013/daemon/lib/daemon/iteminterface.php new file mode 100644 index 0000000..c15acf0 --- /dev/null +++ b/2013/daemon/lib/daemon/iteminterface.php @@ -0,0 +1,28 @@ +dbClient = $dbClient; + $this->characterData = $characterData; + $this->view = $view; + } + + + final protected function deleteItem($inventoryId) + { + $sql = "DELETE FROM inventory WHERE character_id=:charId AND inventory_id=:id"; + $params = array('charId' => $this->characterData->character_id, 'id' => $inventoryId); + $this->dbClient->query($sql, $params); + } + + + abstract public function execute($inventoryId, $params); +} diff --git a/2013/daemon/lib/daemon/math.php b/2013/daemon/lib/daemon/math.php new file mode 100644 index 0000000..7ce63b1 --- /dev/null +++ b/2013/daemon/lib/daemon/math.php @@ -0,0 +1,57 @@ +characterData = $characterData; + } + + + public function attachDbClient(Daemon_DbClient $dbClient) + { + $this->dbClient = $dbClient; + } + + + public function getCombatLog() + { + return $this->combatLog; + } + + + public function execute(Daemon_View $view, $monsterId, $fromEvent = false) + { + $char = $this->characterData; + $winner = null; + $winnerXp = 0; + $winnerGold = null; + $winnerLevel = null; + $winnerDrop = null; + $winnerMission = null; + //load monster + $monster = new Daemon_DbObject_Monster(); + $monster->attachDbClient($this->dbClient); + $monster->get(array('monster_id' => $monsterId)); + //execute combat + $winner = $this->runCombat($monster); + //check for winner, modify character + if(self::WINNER_ACTOR == $winner) + { + //experience + $winnerXp = $monster->level; + $this->characterData->xp_free += $winnerXp; + //gold + $winnerGold = $monster->gold; + $this->characterData->gold_purse += $winnerGold; + //level + if($monster->level > $this->characterData->level) + { + $winnerLevel = $monster->level; + $this->characterData->level = $winnerLevel; + } + else $winnerLevel = null; + //statistics + if(($monster->class >=1) && ($monster->class<=4)) + { + $colname = "kills_mob{$monster->class}"; + $sql = "UPDATE character_statistics SET $colname=$colname+1 WHERE character_id=:id"; + $this->dbClient->query($sql, array('id' => $this->characterData->character_id)); + } + //drop + $winnerDrop = $this->rollDrop($monster); + //title + if($monster->title_id) + { + $sql = "INSERT IGNORE INTO character_titles(character_id, title_id) VALUES(:charId, :titleId)"; + $params = array( + 'charId' => $this->characterData->character_id, + 'titleId' => $monster->title_id); + $this->dbClient->query($sql, $params); + } + //mission + $mission = $this->characterData->getLastMission('active'); + if(('monster' == $mission['type']) && ($monster->monster_id == $mission['params'])) + { + $sql = "UPDATE character_missions SET progress='completed' + WHERE character_id=:cid AND rollover_id=:rid"; + $params = array('cid' => $this->characterData->character_id, 'rid' => $mission['rollover_id']); + $this->dbClient->query($sql, $params); + $winnerMission = true; + } + } + elseif(self::WINNER_MONSTER == $winner) + $this->characterData->setDeath(true); + //update character + $this->characterData->setLocationEvent(array()); + $this->characterData->put(); + //generate report + $view->combatLog = $this->combatLog; + $view->fromEvent = $fromEvent; + $view->monsterName = $monster->name; + $view->winner = $winner; + $view->winnerXp = $winnerXp; + $view->winnerGold = $winnerGold; + $view->winnerLevel = $winnerLevel; + $view->winnerDrop = $winnerDrop; + $view->winnerMission = $winnerMission; + ob_start(); + $view->display('monstercombat.xml'); + $this->combatLog = ob_get_clean(); + } + + + //rolls for monster drops, return array of item names + private function rollDrop(Daemon_DbObject_Monster $monster) + { + $itemId = null; + $itemName = null; + //check if there was any drop + if($monster->chance2) + { + $d256 = mt_rand(0, 255); + $chance = 256 * $monster->chance1 / $monster->chance2; + $itemId = ($d256 < $chance); + } + if($itemId) + { + $itemId = null; + //read drops + $sql = "SELECT item_id, chance, name FROM monster_drops JOIN items USING(item_id) WHERE monster_id=:id"; + $drops = $this->dbClient->selectAll($sql, array('id' => $monster->monster_id)); + //roll drop + $chanceSum = 0; + foreach($drops as $row) + $chanceSum += $row['chance']; + $d256 = mt_rand(0, 255); + foreach($drops as $row) + { + $chance = 256 * $row['chance'] / $chanceSum; + if($d256 < $chance) + { + $itemId = $row['item_id']; + $itemName = $row['name']; + break; + } + $d256 -= $chance; + } + //give drop + if($itemId) + { + $sql = "INSERT INTO inventory(character_id, item_id) VALUES (:charId, :itemId)"; + $params = array('charId' => $this->characterData->character_id, 'itemId' => $itemId); + $this->dbClient->query($sql, $params); + } + } + return $itemName; + } + + + //executes combat, returns winner flag + private function runCombat(Daemon_DbObject_Monster $monster) + { + $combat = new Daemon_Combat(); + $logger = new Daemon_Combat_Log(); + $combat->attachLogger($logger); + //prepare units + $characterUnit = $this->characterData->getCombatUnit(true); + $monsterUnit = $monster->getCombatUnit(true); + $monsterUnit->health = $monsterUnit->health_max; + //add units + $combat->addUnit('a', $characterUnit, true); + $combat->addUnit('b', $monsterUnit, false); + //execute combat + $combat->execute(); + $this->combatLog = (string) $logger; + //update character + $characterUnit->put(); + $this->characterData->health = floor($characterUnit->health); + //check winner + if($this->characterData->health < 1) + return self::WINNER_MONSTER; + if($monsterUnit->health < 1) + return self::WINNER_ACTOR; + return null; + } +} diff --git a/2013/daemon/lib/daemon/msgqueue.php b/2013/daemon/lib/daemon/msgqueue.php new file mode 100644 index 0000000..f9043bf --- /dev/null +++ b/2013/daemon/lib/daemon/msgqueue.php @@ -0,0 +1,27 @@ +dbClient = $dbClient; + } + + + protected function callbackFormatDates(&$row) + { + $row['published'] = date(DATE_ATOM, $row['published_ts']); + $row['updated'] = date(DATE_ATOM, $row['updated_ts']); + } + + + //deletes entry by ID + public function deleteEntry($id) + { + $sql = "DELETE FROM newsfeed WHERE id=:id"; + $this->dbClient->query($sql, array('id' => $id)); + } + + + //generates an ID for a new entry + public function generateId($domain, $title) + { + $suffix = preg_replace('/\W+/', '-', $title); + return sprintf('tag:%s,%s:%s', $domain, date('Y-m-d'), $suffix); + } + + + //fetches last entry's update time + public function getLastUpdated() + { + $sql = "SELECT UNIX_TIMESTAMP(MAX(updated)) FROM newsfeed"; + return date(DATE_ATOM, (int) $this->dbClient->selectValue($sql, array())); + } + + + //fetches a list of last entries + public function getEntries($limit, $format = false) + { + $params = array(); + $sql = "SELECT *, UNIX_TIMESTAMP(published) AS published_ts, UNIX_TIMESTAMP(updated) AS updated_ts + FROM newsfeed ORDER BY published DESC"; + if($limit) + { + $params = array('limit' => $limit); + $sql .= " LIMIT :limit"; + } + $data = $this->dbClient->selectAll($sql, $params); + if($format && $data) + array_walk($data, array($this, 'callbackFormatDates')); + return $data; + } + + + //creates or updates a feed entry + public function updateEntry($id, $title, $author, $content) + { + $sql = "INSERT INTO newsfeed (id, published, title, author, content) + VALUES (:id, NOW(), :title, :author, :content) + ON DUPLICATE KEY UPDATE updated=NOW(), title=:title, author=:author, content=:content"; + $params = array('id' => $id, 'title' => $title, 'author' => $author, 'content' => $content); + $this->dbClient->query($sql, $params); + } +} diff --git a/2013/daemon/lib/daemon/scyzoryk.php b/2013/daemon/lib/daemon/scyzoryk.php new file mode 100644 index 0000000..d3db7ed --- /dev/null +++ b/2013/daemon/lib/daemon/scyzoryk.php @@ -0,0 +1,73 @@ +dbClient = $dbClient; + } + + + public function deleteRows($tableName, $indexCol, array $ids) + { + $sql = "DELETE FROM $tableName WHERE $indexCol=:id"; + foreach($ids as $id) + $this->dbClient->query($sql, array('id' => $id)); + } + + + public function selectRow($className, $id, $id2 = null) + { + $tableName = constant("$className::TABLE_NAME"); + $indexCol = constant("$className::INDEX_COL"); + $indexCol2 = constant("$className::INDEX_COL2"); + if(!$tableName || !$indexCol) + throw new InvalidArgumentException('Unsupported class name!'); + $cond = array("$indexCol=:id"); + $params = array('id' => $id); + if($indexCol2 && $id2) + { + $cond[] = "$indexCol2=:id2"; + $params['id2'] = $id2; + } + $cond = implode(' AND ', $cond); + $sql = "SELECT * FROM $tableName WHERE $cond"; + return $this->dbClient->selectObject($sql, $params, $className); + } + + + public function updateRow(Daemon_Scyzoryk_DbRow $row) + { + $row->validate(); + $className = get_class($row); + $tableName = constant("$className::TABLE_NAME"); + $indexCol = constant("$className::INDEX_COL"); + $indexCol2 = constant("$className::INDEX_COL2"); + if(!$tableName || !$indexCol) + throw new InvalidArgumentException('This table must be edited manually!'); + $cols = array(); + $vals = array(); + $mods = array(); + $params = array(); + $ignore = array($indexCol, $indexCol2); + foreach($row as $col => $val) + { + $cols[] = $col; + $vals[] = ":$col"; + if(!in_array($col, $ignore)) + $mods[] = "$col=:$col"; + $params[$col] = $val; + } + $cols = implode(', ', $cols); + $vals = implode(', ', $vals); + $mods = implode(', ', $mods); + if($mods) + $sql = "INSERT INTO $tableName ($cols) VALUES ($vals) ON DUPLICATE KEY UPDATE $mods"; + else $sql = "REPLACE INTO $tableName ($cols) VALUES ($vals)"; + $this->dbClient->query($sql, $params); + } +} diff --git a/2013/daemon/lib/daemon/scyzoryk/browser.php b/2013/daemon/lib/daemon/scyzoryk/browser.php new file mode 100644 index 0000000..5ec4cfd --- /dev/null +++ b/2013/daemon/lib/daemon/scyzoryk/browser.php @@ -0,0 +1,235 @@ + $id, 'name' => $name); + return $this->dbClient->selectAll($sql, $params); + } + + + public function getCombatUnits(Daemon_Scyzoryk_Filter $filter = null) + { + $cond = array(); + $params = array(); + if($filter instanceof Daemon_Scyzoryk_Filter) + { + if($filter->id) + { + $cond[] = "combat_unit_id LIKE CONCAT('%', :id, '%')"; + $params['id'] = $filter->id; + } + if($filter->name) + { + $cond[] = "name LIKE CONCAT('%', :name, '%')"; + $params['name'] = $filter->name; + } + } + $cond = $cond ? 'WHERE '.implode(' AND ', $cond) : null; + $sql = "SELECT *, (combat_unit_id LIKE 'character-%') AS _character + FROM combat_units $cond ORDER BY _character, combat_unit_id"; + return $this->dbClient->selectAll($sql, $params); + } + + + public function getFactionRanks($factionId) + { + $sql = "SELECT * FROM faction_ranks r LEFT JOIN titles USING(title_id) WHERE r.faction_id=:id ORDER BY rank_id"; + return $this->dbClient->selectAll($sql, array('id' => $factionId)); + } + + + public function getFactions() + { + $sql = "SELECT * FROM factions ORDER BY faction_id"; + return $this->dbClient->selectAll($sql, array()); + } + + + public function getItems(Daemon_Scyzoryk_Filter $filter) + { + $cond = array(); + $params = array(); + if($filter->id) + { + $cond[] = "item_id LIKE CONCAT('%', :id, '%')"; + $params['id'] = $filter->id; + } + if($filter->name) + { + $cond[] = "name LIKE CONCAT('%', :name, '%')"; + $params['name'] = $filter->name; + } + if($filter->type) + { + $cond[] = 'type = :type'; + $params['type'] = $filter->type; + } + $cond = $cond ? 'WHERE '.implode(' AND ', $cond) : null; + $sql = "SELECT * FROM items $cond + ORDER BY type, damage_type, suggested_value, value, item_id"; + return $this->dbClient->selectAll($sql, $params); + } + + + public function getItemTemplates() + { + $sql = "SELECT * FROM item_templates ORDER BY id"; + return $this->dbClient->selectAll($sql, array()); + } + + + public function getLocationEvents($locationId) + { + $sql = "SELECT * FROM location_events + WHERE location_id=:id ORDER BY event_id"; + return $this->dbClient->selectAll($sql, array('id' => $locationId)); + } + + + public function getLocationMonsters($locationId) + { + $sql = "SELECT l.*, m.name AS monster_name + FROM location_monsters l + LEFT JOIN monsters m USING(monster_id) + WHERE l.location_id=:id ORDER BY l.monster_id"; + return $this->dbClient->selectAll($sql, array('id' => $locationId)); + } + + + public function getLocationPaths($locationId) + { + $sql = "SELECT p.*, loc.name AS destination_name + FROM location_paths p + LEFT JOIN locations loc ON p.destination_id = loc.location_id + WHERE p.location_id=:id ORDER BY p.destination_id"; + return $this->dbClient->selectAll($sql, array('id' => $locationId)); + } + + + public function getLocationServices($locationId) + { + $sql = "SELECT l.*, s.name AS service_name, s.type AS service_type + FROM location_services l + LEFT JOIN services s USING(service_id) + WHERE l.location_id=:id ORDER BY s.service_id"; + return $this->dbClient->selectAll($sql, array('id' => $locationId)); + } + + + public function getLocations(Daemon_Scyzoryk_Filter $filter) + { + $cond = array(); + $params = array(); + if($filter->id) + { + $cond[] = "l.location_id LIKE CONCAT('%', :id, '%')"; + $params['id'] = $filter->id; + } + if($filter->name) + { + $cond[] = "l.name LIKE CONCAT('%', :name, '%')"; + $params['name'] = $filter->name; + } + if($filter->region_id) + { + $cond[] = 'l.region_id = :region_id'; + $params['region_id'] = $filter->region_id; + } + $cond = $cond ? 'WHERE '.implode(' AND ', $cond) : null; + $sql = "SELECT l.*, r.name AS region_name, + ( SELECT GROUP_CONCAT(lp.destination_id SEPARATOR ',') + FROM location_paths lp WHERE lp.location_id=l.location_id ) AS paths, + ( SELECT GROUP_CONCAT(lm.monster_id SEPARATOR ',') + FROM location_monsters lm WHERE lm.location_id=l.location_id ) AS monsters + FROM locations l LEFT JOIN regions r USING(region_id) $cond ORDER BY l.region_id, l.location_id"; + $data = $this->dbClient->selectAll($sql, $params); + foreach ($data as &$row) + { + $row['paths'] = explode(',', $row['paths']); + $row['monsters'] = explode(',', $row['monsters']); + } + return $data; + } + + + public function getMaps() + { + $sql = "SELECT * FROM maps ORDER BY sort, map_id"; + return $this->dbClient->selectAll($sql, array()); + } + + + public function getMonsterDrops($monsterId) + { + $sql = "SELECT m.*, i.name FROM monster_drops m LEFT JOIN items i USING(item_id) WHERE m.monster_id=:id"; + return $this->dbClient->selectAll($sql, array('id' => $monsterId)); + } + + + public function getMonsters(Daemon_Scyzoryk_Filter $filter) + { + $cond = array(); + $params = array(); + if($filter->id) + { + $cond[] = "m.monster_id LIKE CONCAT('%', :id, '%')"; + $params['id'] = $filter->id; + } + if($filter->name) + { + $cond[] = "m.name LIKE CONCAT('%', :name, '%')"; + $params['name'] = $filter->name; + } + if($filter->class) + { + $cond[] = "m.class = :class"; + $params['class'] = $filter->class; + } + $cond = $cond ? 'WHERE '.implode(' AND ', $cond) : null; + $sql = "SELECT m.*, ( SELECT GROUP_CONCAT(md.item_id SEPARATOR ', ') + FROM monster_drops md WHERE md.monster_id=m.monster_id ) AS drops + FROM monsters m $cond ORDER BY m.level, m.monster_id"; + $data = $this->dbClient->selectAll($sql, $params); + foreach ($data as &$row) + $row['drops'] = explode(',', $row['drops']); + return $data; + } + + + public function getRegions() + { + $sql = "SELECT r.*, l.name AS respawn_name + FROM regions r LEFT JOIN locations l ON l.location_id = r.respawn_id + ORDER BY r.region_id"; + return $this->dbClient->selectAll($sql, array()); + } + + + public function getServiceItems($serviceId) + { + $sql = "SELECT s.*, i.name, s.type='drop' AS _drop + FROM service_items s LEFT JOIN items i USING(item_id) + WHERE s.service_id=:id ORDER BY type, item_id"; + return $this->dbClient->selectAll($sql, array('id' => $serviceId)); + } + + + public function getServices() + { + $sql = "SELECT * FROM services ORDER BY service_id"; + return $this->dbClient->selectAll($sql, array()); + } + + + public function getTitles() + { + $sql = "SELECT * FROM titles ORDER BY title_id"; + return $this->dbClient->selectAll($sql, array()); + } +} diff --git a/2013/daemon/lib/daemon/scyzoryk/controller.php b/2013/daemon/lib/daemon/scyzoryk/controller.php new file mode 100644 index 0000000..0baccb7 --- /dev/null +++ b/2013/daemon/lib/daemon/scyzoryk/controller.php @@ -0,0 +1,81 @@ +cfg = $cfg; + session_name($this->cfg->sessionName); + session_cache_limiter(null); + session_start(); + $this->dbClient = Daemon::createDbClient($this->cfg); + $this->browser = new Daemon_Scyzoryk_Browser($this->dbClient); + $this->editor = new Daemon_Scyzoryk_Editor($this->dbClient); + $this->view = new Daemon_View($this->cfg); + $this->editId = isset($_GET['id']) ? $_GET['id'] : null; + $this->editId2 = isset($_GET['id2']) ? $_GET['id2'] : null; + } + + + //checks last action's timestamp + final private function checkActionTimestamp() + { + $lastAction = isset($_SESSION['ts']) ? $_SESSION['ts'] : 0.0; + $_SESSION['ts'] = microtime(true); + return (bool) ($_SESSION['ts'] >= $lastAction + $this->cfg->tsDelta); + } + + + final public function execute() + { + //prepare controller + $this->prepareModel(); + //check last action's timestamp + if($_POST && !$this->checkActionTimestamp()) + { + Daemon_MsgQueue::add('Operacja anulowana: za duża częstość.'); + $_POST = array(); + } + //execute commands + $cmdExecuted = (bool) $this->runCommands(); + //display page + $this->prepareView(); + $this->view->setPageTitle($this->pageSubtitle, $this->pageSubtitleDetails, $cmdExecuted); + $this->view->setMessages(Daemon_MsgQueue::getAll()); + $this->view->display($this->pageTemplatePath, Daemon_View::MODE_HTML); + } + + + //page-specific + protected function prepareModel() + { + } + + + //page-specific + protected function prepareView() + { + } + + + //page-specific + protected function runCommands() + { + return false; + } +} diff --git a/2013/daemon/lib/daemon/scyzoryk/dbrow.php b/2013/daemon/lib/daemon/scyzoryk/dbrow.php new file mode 100644 index 0000000..f271ff9 --- /dev/null +++ b/2013/daemon/lib/daemon/scyzoryk/dbrow.php @@ -0,0 +1,151 @@ + $value) + if(property_exists($this, $name)) + $this->$name = Daemon::normalizeString($value, true); + $this->validate(); + } + public function validate() {} +} + + +class Daemon_Scyzoryk_DbRowFaction extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'factions'; + const INDEX_COL = 'faction_id'; + public $faction_id; + public $name; +} + + +class Daemon_Scyzoryk_DbRowFactionRank extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'faction_ranks'; + const INDEX_COL = 'faction_id'; + const INDEX_COL2 = 'rank_id'; + public $faction_id; + public $rank_id; + public $min_points = 1; + public $title_id = null; +} + + +class Daemon_Scyzoryk_DbRowLocationEvent extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'location_events'; + const INDEX_COL = 'location_id'; + const INDEX_COL2 = 'event_id'; + public $location_id; + public $event_id; + public $chance = 1; + public $params = ''; +} + + +class Daemon_Scyzoryk_DbRowLocationMonster extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'location_monsters'; + const INDEX_COL = 'location_id'; + const INDEX_COL2 = 'monster_id'; + public $location_id; + public $monster_id; + public $chance = 1; +} + + +class Daemon_Scyzoryk_DbRowLocationPath extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'location_paths'; + const INDEX_COL = 'location_id'; + const INDEX_COL2 = 'destination_id'; + public $location_id; + public $destination_id; + public $name = null; + public $cost_gold = 0; + public $cost_mana = 0; +} + + +class Daemon_Scyzoryk_DbRowLocationService extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'location_services'; + const INDEX_COL = 'location_id'; + const INDEX_COL2 = 'service_id'; + public $location_id; + public $service_id; +} + + +class Daemon_Scyzoryk_DbRowMap extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'maps'; + const INDEX_COL = 'map_id'; + public $map_id; + public $name; + public $url = ''; +} + + +class Daemon_Scyzoryk_DbRowMonsterDrop extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'monster_drops'; + const INDEX_COL = 'monster_id'; + const INDEX_COL2 = 'item_id'; + public $monster_id; + public $item_id; + public $chance = 1; +} + + +class Daemon_Scyzoryk_DbRowRegion extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'regions'; + const INDEX_COL = 'region_id'; + public $region_id; + public $name; + public $respawn_id = null; + public $picture_url = null; +} + + +class Daemon_Scyzoryk_DbRowService extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'services'; + const INDEX_COL = 'service_id'; + public $service_id; + public $name; + public $type = 'npc'; + public $faction_id; + public $rank_id; + public $description = null; +} + + +class Daemon_Scyzoryk_DbRowServiceItem extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'service_items'; + const INDEX_COL = 'service_id'; + const INDEX_COL2 = 'item_id'; + public $service_id; + public $item_id; + public $type = 'normal'; + public $quantity = null; +} + + +class Daemon_Scyzoryk_DbRowTitle extends Daemon_Scyzoryk_DbRow +{ + const TABLE_NAME = 'titles'; + const INDEX_COL = 'title_id'; + public $title_id; + public $name_f = ''; + public $name_m = ''; + public $name_n = ''; +} diff --git a/2013/daemon/lib/daemon/scyzoryk/editor.php b/2013/daemon/lib/daemon/scyzoryk/editor.php new file mode 100644 index 0000000..1b5adba --- /dev/null +++ b/2013/daemon/lib/daemon/scyzoryk/editor.php @@ -0,0 +1,139 @@ +deleteRows('combat_units', 'combat_unit_id', $ids); + } + + + public function deleteFactionRanks($factionId, array $ids) + { + $sql = "DELETE FROM faction_ranks WHERE faction_id=:factionId AND rank_id=:id"; + foreach($ids as $id) + $this->dbClient->query($sql, array('factionId' => $factionId, 'id' => $id)); + } + + + public function deleteFactions(array $ids) + { + $this->deleteRows('factions', 'faction_id', $ids); + $this->deleteRows('faction_ranks', 'faction_id', $ids); + } + + + public function deleteItems(array $ids) + { + $this->deleteRows('items', 'item_id', $ids); + $this->deleteRows('service_items', 'item_id', $ids); + $this->deleteRows('monster_drops', 'item_id', $ids); + } + + + public function deleteItemTemplates(array $ids) + { + $this->deleteRows('item_templates', 'id', $ids); + } + + + public function deleteLocationEvents($locationId, array $ids) + { + $sql = "DELETE FROM location_events WHERE location_id=:locationId AND event_id=:id"; + foreach($ids as $id) + $this->dbClient->query($sql, array('locationId' => $locationId, 'id' => $id)); + } + + + public function deleteLocationMonsters($locationId, array $ids) + { + $sql = "DELETE FROM location_monsters WHERE location_id=:locationId AND monster_id=:id"; + foreach($ids as $id) + $this->dbClient->query($sql, array('locationId' => $locationId, 'id' => $id)); + } + + + public function deleteLocationPaths($srcId, array $dst, array $rev = array()) + { + $sql = "DELETE FROM location_paths WHERE location_id=:src AND destination_id=:dst"; + foreach($dst as $key => $id) + { + $this->dbClient->query($sql, array('src' => $srcId, 'dst' => $id)); + if(!empty($rev[$key])) + $this->dbClient->query($sql, array('src' => $id, 'dst' => $srcId)); + } + } + + + public function deleteLocationServices($locationId, array $ids) + { + $sql = "DELETE FROM location_services WHERE location_id=:locationId AND service_id=:id"; + foreach($ids as $id) + $this->dbClient->query($sql, array('locationId' => $locationId, 'id' => $id)); + } + + + public function deleteLocations(array $ids) + { + $this->deleteRows('locations', 'location_id', $ids); + $this->deleteRows('location_events', 'location_id', $ids); + $this->deleteRows('location_monsters', 'location_id', $ids); + $this->deleteRows('location_paths', 'location_id', $ids); + $this->deleteRows('location_paths', 'destination_id', $ids); + $this->deleteRows('location_services', 'location_id', $ids); + } + + + public function deleteMaps(array $ids) + { + $this->deleteRows('maps', 'map_id', $ids); + } + + + public function deleteMonsterDrops($monsterId, array $ids) + { + $sql = "DELETE FROM monster_drops WHERE monster_id=:monsterId AND item_id=:id"; + foreach($ids as $id) + $this->dbClient->query($sql, array('monsterId' => $monsterId, 'id' => $id)); + } + + + public function deleteMonsters(array $ids) + { + $this->deleteRows('monsters', 'monster_id', $ids); + $this->deleteRows('monster_drops', 'monster_id', $ids); + $this->deleteRows('location_monsters', 'monster_id', $ids); + } + + + public function deleteRegions(array $ids) + { + $this->deleteRows('regions', 'region_id', $ids); + $sql = "UPDATE locations SET region_id = null WHERE region_id=:id"; + foreach($ids as $id) + $this->dbClient->query($sql, array('id' => $id)); + } + + + public function deleteServiceItems($serviceId, array $ids) + { + $sql = "DELETE FROM service_items WHERE service_id=:serviceId AND item_id=:id"; + foreach($ids as $id) + $this->dbClient->query($sql, array('serviceId' => $serviceId, 'id' => $id)); + } + + + public function deleteServices(array $ids) + { + $this->deleteRows('services', 'service_id', $ids); + $this->deleteRows('service_items', 'service_id', $ids); + } + + + public function deleteTitles(array $ids) + { + $this->deleteRows('titles', 'title_id', $ids); + } +} diff --git a/2013/daemon/lib/daemon/scyzoryk/filter.php b/2013/daemon/lib/daemon/scyzoryk/filter.php new file mode 100644 index 0000000..3dafddf --- /dev/null +++ b/2013/daemon/lib/daemon/scyzoryk/filter.php @@ -0,0 +1,43 @@ +cols = array_merge(array('id', 'name'), (array) $extraCols); + if(!isset($_SESSION[self::SESSION_VARNAME][$name])) + $_SESSION[self::SESSION_VARNAME][$name] = array(); + if(!$noSession) + $this->data = & $_SESSION[self::SESSION_VARNAME][$name]; + else $this->data = array(); + } + + + public function __get($name) + { + return isset($this->data[$name]) ? $this->data[$name] : null; + } + + + public function __isset($name) + { + return in_array($name, $this->cols) ? true : isset($this->data[$name]); + } + + + public function __set($name, $value) + { + $this->data[$name] = $value; + } + + + public function __unset($name) + { + unset($this->data[$name]); + } +} diff --git a/2013/daemon/lib/daemon/service.php b/2013/daemon/lib/daemon/service.php new file mode 100644 index 0000000..0ea66a7 --- /dev/null +++ b/2013/daemon/lib/daemon/service.php @@ -0,0 +1,47 @@ +dbClient = $dbClient; + $this->characterData = $characterData; + $this->view = $view; + $this->serviceData = $serviceData; + $this->bankEnabled = $bankEnabled; + $this->templeEnabled = $templeEnabled; + } + + + final protected function clearEvent() + { + $this->characterData->setLocationEvent(array()); + $this->characterData->put(); + } + + + final public function getEventLog() + { + return $this->eventLog; + } + + + final public function isCommand() + { + return $this->isCommand; + } + + + abstract public function execute($params); +} diff --git a/2013/daemon/lib/daemon/service/bank.php b/2013/daemon/lib/daemon/service/bank.php new file mode 100644 index 0000000..c78a826 --- /dev/null +++ b/2013/daemon/lib/daemon/service/bank.php @@ -0,0 +1,95 @@ +dbClient, $this->characterData); + //run commands + $this->isCommand = $this->runCommands($params); + //generate output + $items = $inventory->getItems('inventory', true); + $storage = $inventory->getItems('storage'); + $storageLimit = $this->getStorageLimit(); + $this->view->goldBank = $this->characterData->gold_bank; + $this->view->goldPurse = $this->characterData->gold_purse; + $this->view->inventory = $items; + $this->view->storage = $storage; + $this->view->storageLimit = $storageLimit; + $this->view->storageFull = (count($storage) >= $storageLimit); + ob_start(); + $this->view->display('service/bank.xml'); + $this->eventLog = ob_get_clean(); + } + + + private function runCommands($params) + { + //gold operations + if(isset($params['getGold'], $params['putGold'])) + { + $this->goldOperations($params['getGold'], $params['putGold']); + return true; + } + //item operations + if(isset($params['getItem'])) + { + $this->getItem($params['getItem']); + return true; + } + if(isset($params['putItem'])) + { + $this->putItem($params['putItem']); + return true; + } + return false; + } + + + //fetches item from storage + private function getItem($inventoryId) + { + $sql = "UPDATE inventory SET status='inventory' WHERE inventory_id=:id AND character_id=:charId"; + $params = array('id' => $inventoryId, 'charId' => $this->characterData->character_id); + $this->dbClient->query($sql, $params); + } + + + private function getStorageLimit() + { + return self::STORAGE_LIMIT + max(0, floor(log($this->characterData->level))); + } + + + //puts item into storage + private function putItem($inventoryId) + { + $sql = "SELECT COUNT(1) FROM inventory WHERE character_id=:charId AND status='storage'"; + $n = $this->dbClient->selectValue($sql, array('charId' => $this->characterData->character_id)); + if($n < $this->getStorageLimit()) + { + $sql = "UPDATE inventory SET status='storage' WHERE inventory_id=:id AND character_id=:charId AND equipped IS NULL"; + $params = array('id' => $inventoryId, 'charId' => $this->characterData->character_id); + $this->dbClient->query($sql, $params); + } + else Daemon_MsgQueue::add('Twój schowek jest pełny.'); + } + + + private function goldOperations($getGold, $putGold) + { + //get gold + $delta = max(0, min((int) $getGold, $this->characterData->gold_bank)); + $this->characterData->gold_purse += $delta; + $this->characterData->gold_bank -= $delta; + //put gold + $delta = max(0, min((int) $putGold, $this->characterData->gold_purse)); + $this->characterData->gold_bank += $delta; + $this->characterData->gold_purse -= $delta; + //store mods + $this->characterData->put(); + } +} diff --git a/2013/daemon/lib/daemon/service/healer.php b/2013/daemon/lib/daemon/service/healer.php new file mode 100644 index 0000000..38ad744 --- /dev/null +++ b/2013/daemon/lib/daemon/service/healer.php @@ -0,0 +1,86 @@ +setParams(); + //run commands + $this->isCommand = $this->runCommands($params); + //generate output + ob_start(); + $this->view->characterData = $this->characterData; + $this->view->bankEnabled = $this->bankEnabled; + $this->view->deltaHealthMin = $this->deltaHealthMin; + $this->view->deltaHealthMax = $this->deltaHealthMax; + $this->view->deltaManaMin = $this->deltaManaMin; + $this->view->deltaManaMax = $this->deltaManaMax; + $this->view->display('service/healer.xml'); + $this->eventLog = ob_get_clean(); + } + + + private function runCommands($params) + { + if(isset($params['heal'])) + { + $this->heal($params['heal'], $this->bankEnabled); + return true; + } + if(isset($params['rest'])) + { + $this->rest(); + return true; + } + return false; + } + + + //heals a random amount of health and mana + public function heal($gold, $bankEnabled) + { + if (!$this->characterData->payGold($gold, $bankEnabled)) + return false; + $this->characterData->health += mt_rand($gold * $this->deltaHealthMin, $gold * $this->deltaHealthMax); + $this->characterData->mana += mt_rand($gold * $this->deltaManaMin, $gold * $this->deltaManaMax); + if($this->characterData->health > $this->characterData->health_max) + $this->characterData->health = $this->characterData->health_max; + if($this->characterData->mana > $this->characterData->mana_max) + $this->characterData->mana = $this->characterData->mana_max; + $this->characterData->put(); + return true; + } + + + public function setParams() + { + $dbCfg = new Daemon_DbConfig($this->dbClient); + $params = $dbCfg->healer; + if(is_scalar($params)) + $params = explode(',', $params); + if(isset($params[0], $params[1], $params[2], $params[3])) + { + $this->deltaHealthMin = (int) $params[0]; + $this->deltaHealthMax = (int) $params[1]; + $this->deltaManaMin = (int) $params[2]; + $this->deltaManaMax = (int) $params[3]; + } + } + + + //rests one turn without events + public function rest() + { + if(!$this->characterData->checkTurnCosts()) + return false; + $this->characterData->regen(true); + $this->characterData->put(); + return true; + } +} diff --git a/2013/daemon/lib/daemon/service/shop.php b/2013/daemon/lib/daemon/service/shop.php new file mode 100644 index 0000000..9f351a3 --- /dev/null +++ b/2013/daemon/lib/daemon/service/shop.php @@ -0,0 +1,202 @@ +dbClient, $this->characterData); + //run commands + $this->isCommand = $this->runCommands($params); + //generate output + $equipment = array(); + $inventory = array(); + $items = $inventoryObj->getItems('inventory'); + foreach($items as $key => $row) + { + $row['_price'] = ceil($row['item']->value / 2); + if($row['equipped']) + $equipment[$key] = $row; + else $inventory[$key] = $row; + } + $storage = $this->bankEnabled ? $inventoryObj->getItems('storage') : array(); + foreach($storage as &$row) + $row['_price'] = ceil($row['item']->value / 2); + $this->view->shopName = $this->serviceData['name']; + $this->view->shopDescription = $this->serviceData['description']; + $this->view->goldBank = $this->characterData->gold_bank; + $this->view->goldPurse = $this->characterData->gold_purse; + $this->view->bankEnabled = $this->bankEnabled; + $this->view->equipment = $equipment; + $this->view->inventory = $inventory; + $this->view->storage = $storage; + $this->view->hasItems = ($equipment || $inventory || $storage); + $this->view->shopItems = $this->getItems(); + ob_start(); + $this->view->display('service/shop.xml'); + $this->eventLog = ob_get_clean(); + } + + + private function runCommands($params) + { + //sell item + if(isset($params['sell'])) + { + $this->buyFromCharacter($params['sell']); + return true; + } + //buy item(s) + if(isset($params['buy'], $params['amount'])) + { + $this->sellToCharacter($params['buy'], $params['amount'], !empty($params['bind'])); + return true; + } + return false; + } + + + //buys item from character + public function buyFromCharacter(array $ids) + { + foreach($ids as $inventoryId) + { + $cond = "inv.inventory_id=:id AND character_id=:charId"; + $params = array('id' => $inventoryId, 'charId' => $this->characterData->character_id); + if(!$this->bankEnabled) + $cond .= " AND inv.status!='storage'"; + $sql = "SELECT i.item_id, i.name, i.value, inv.equipped + FROM inventory inv JOIN items i USING(item_id) WHERE $cond"; + if($item = $this->dbClient->selectRow($sql, $params)) + { + $sql = "DELETE FROM inventory WHERE inventory_id=:id"; + $this->dbClient->query($sql, array('id' => $inventoryId)); + $buyPrice = ceil($item['value'] / 2); + if($this->bankEnabled) + $this->characterData->gold_bank += $buyPrice; + else $this->characterData->gold_purse += $buyPrice; + $this->characterData->put(); + //add to shop offer + $sql = "INSERT INTO service_items (service_id, item_id, type, quantity) + VALUES (:serviceId, :itemId, 'drop', 1) ON DUPLICATE KEY UPDATE quantity = quantity + 1"; + $params = array('serviceId' => $this->serviceData['service_id'], 'itemId' => $item['item_id']); + $this->dbClient->query($sql, $params); + Daemon_MsgQueue::add("Sprzedajesz $item[name] za $buyPrice zł."); + //update character stats if item was equipped + if($item['equipped']) + { + $this->characterData->resetCombatStats(); + $this->characterData->put(); + } + } + else Daemon_MsgQueue::add('Wybrany przedmiot nie istnieje.'); + } + } + + + //fetches shop's offer, grouped by item type + public function getItems() + { + $result = array(); + $sql = "SELECT s.item_id, s.type, s.quantity + FROM service_items s JOIN items i USING(item_id) + WHERE service_id=:id ORDER BY i.type ASC, s.type ASC, i.damage_type ASC, i.name ASC"; + $params = array('id' => $this->serviceData['service_id']); + if($data = $this->dbClient->selectAll($sql, $params)) + { + $characterGold = $this->characterData->gold_purse; + if($this->bankEnabled) + $characterGold += $this->characterData->gold_bank; + foreach($data as $row) + { + $item = new Daemon_DbObject_Item(); + $item->attachDbClient($this->dbClient); + $item->get(array('item_id' => $row['item_id'])); + $type = $item->type; + $item->_price = $this->sellPrice($item->value, $row['quantity']); + $item->_drop = ('normal' != $row['type']); + $item->_quantity = $row['quantity']; + $item->_canBuy = ($item->_price <= $characterGold); + $item->_soldOff = ($item->_drop && ($item->_quantity < 1)); + if(!empty($this->_flags['temple'])) + $item->_canBind = ($item->value + $item->_price <= $characterGold); + else $item->_canBind = false; + $result[$type]['items'][$row['item_id']] = $item; + } + } + $groupNames = Daemon_Dictionary::$equipmentGroups; + foreach(array_keys($result) as $key) + { + if(isset($groupNames[$key])) + $result[$key]['name'] = $groupNames[$key]; + else unset($groupNames[$key]); + } + return $result; + } + + + //calculates item price + public function sellPrice($value, $quantity) + { + if($quantity > 0) + { + $mult = 1 + 4 * exp(-$quantity / 64); + return ceil($value * $mult); + } + else return $value; + } + + + //sells item to character + public function sellToCharacter($itemId, $amount, $bind) + { + $amount = max(1, $amount); + if(!$this->templeEnabled) + $bind = false; + //fetch item data + $sql = "SELECT s.*, i.name, i.value FROM service_items s JOIN items i USING(item_id) + WHERE service_id=:serviceId AND item_id=:itemId"; + $params = array('serviceId' => $this->serviceData['service_id'], 'itemId' => $itemId); + $item = $this->dbClient->selectRow($sql, $params); + //check availability + if(!$item) + { + Daemon_MsgQueue::add('Wybrany przedmiot nie jest dostępny.'); + return false; + } + if(('normal' != $item['type']) && ($amount > $item['quantity'])) + { + Daemon_MsgQueue::add('Nie ma tyle towaru w ofercie.'); + return false; + } + //calculate total cost + $totalCost = 0; + for($i = 0; $i < $amount; ++$i) + $totalCost += $this->sellPrice($item['value'], $item['quantity'] - $i); + if($bind) + $totalCost += $amount * $item['value']; + //check character gold + if(!$this->characterData->payGold($totalCost, $this->bankEnabled)) + return false; + //update service + if('normal' != $item['type']) + { + $sql = "UPDATE service_items SET quantity = quantity - :amount + WHERE service_id=:serviceId AND item_id=:itemId"; + $params = array('serviceId' => $this->serviceData['service_id'], 'itemId' => $itemId, 'amount' => $amount); + $this->dbClient->query($sql, $params); + } + //update character + $sql = "INSERT INTO inventory(character_id, item_id, flags) VALUES (:charId, :itemId, :flags)"; + $params = array('charId' => $this->characterData->character_id, 'itemId' => $itemId); + $params['flags'] = $bind ? 'bound,identified' : 'identified'; + for($i = 0; $i < $amount; ++$i) + $this->dbClient->query($sql, $params); + //show message + if($amount > 1) + Daemon_MsgQueue::add("Kupujesz {$amount}x $item[name] za łączną kwotę $totalCost zł."); + else Daemon_MsgQueue::add("Kupujesz $item[name] za $totalCost zł."); + return true; + } +} diff --git a/2013/daemon/lib/daemon/service/temple.php b/2013/daemon/lib/daemon/service/temple.php new file mode 100644 index 0000000..34b10e0 --- /dev/null +++ b/2013/daemon/lib/daemon/service/temple.php @@ -0,0 +1,333 @@ +setParams(); + //run commands + $this->isCommand = $this->runCommands($params); + //generate output + ob_start(); + $this->view->characterData = $this->characterData; + $this->view->bankEnabled = $this->bankEnabled; + $this->view->itemsToBind = $this->getItems(false, true); + $this->view->itemsToOffer = $this->getItems(true, false); + $this->view->lastMission = $this->characterData->getLastMission('completed'); + $this->view->display('service/temple.xml'); + $this->eventLog = ob_get_clean(); + } + + + private function runCommands($params) + { + //bind item + if(isset($params['bind'])) + { + $this->bindItem($params['bind']); + return true; + } + //pray at altar + if(isset($params['pray'])) + { + $inventoryId = isset($params['offer']) ? $params['offer'] : null; + $this->pray($params['pray'], $inventoryId); + return true; + } + //give up mission + if(isset($params['giveUp'])) + { + $this->removeMission(); + return true; + } + //check mission + $this->checkMission(); + return false; + } + + + public function bindItem($inventoryId) + { + //get item data + $sql = "SELECT i.name, i.value FROM inventory inv JOIN items i USING(item_id) + WHERE inventory_id=:id AND character_id=:charId AND NOT FIND_IN_SET('bound', inv.flags)"; + $params = array('id' => $inventoryId, 'charId' => $this->characterData->character_id); + $item = $this->dbClient->selectRow($sql, $params); + if(!$item) + { + Daemon_MsgQueue::add('Wybrany przedmiot nie istnieje albo już jest przypisany.'); + return false; + } + //check character gold + if(!$this->characterData->payGold($item['value'], $this->bankEnabled)) + return false; + //bind item + $sql = "UPDATE inventory SET flags = CONCAT(',bound,', flags) WHERE inventory_id=:id"; + $params = array('id' => $inventoryId); + $this->dbClient->query($sql, $params); + } + + + //check if the mission is completed + public function checkMission() + { + $inventoryId = null; + $char = $this->characterData; + $mission = $char->getLastMission('completed'); + //check conditions + if(!$mission) + return false; + if('completed' != $mission['progress']) + return false; + if($this->serviceData['service_id'] != $mission['service_id']) + return false; + //give xp & gold + $rewardXp = ceil(sqrt($char->xp_used)); + $rewardGold = mt_rand(10 * $rewardXp, 15 * $rewardXp); + $char->xp_free += $rewardXp; + if($this->bankEnabled) + $char->gold_bank += $rewardGold; + else $char->gold_purse += $rewardGold; + $message = "Misja wykonana. Doświadczenie +$rewardXp, złoto +$rewardGold."; + //give skill + $skillNames = Daemon_Dictionary::$characterSkills; + foreach(array_keys($skillNames) as $key) + { + $name = "s_$key"; + if($char->$name) + unset($skillNames[$key]); + } + if(isset($skillNames['preg']) && ($char->xp_used >= $this->xpForRegen)) + $skill = 'preg'; + else //random other skill + { + unset($skillNames['preg']); + $skill = array_rand($skillNames); + } + if($skill) + { + $skillName = $skillNames[$skill]; + $message .= " Poznajesz nową umiejętność: $skillName."; + $name = "s_$skill"; + $char->$name = 1; + } + //join faction or raise reputation + if($this->serviceData['faction_id']) + $char->improveReputation($this->serviceData['faction_id'], mt_rand(4,6)); + //save character & mission + $char->put(); + $sql = "UPDATE character_statistics SET missions=missions+1 WHERE character_id=:id"; + $this->dbClient->query($sql, array('id' => $char->character_id)); + $sql = "UPDATE character_missions SET progress='rewarded' + WHERE character_id=:cid AND rollover_id=:rid"; + $params = array('cid' => $char->character_id, 'rid' => $mission['rollover_id']); + $this->dbClient->query($sql, $params); + Daemon_MsgQueue::add($message); + } + + + //returns a list of unbound items + public function getItems($withoutEquipped = false, $withoutBound = false) + { + $result = array(); + $cond = "character_id=:id"; + if($withoutEquipped) + $cond .= " AND inv.equipped IS NULL"; + if($withoutBound) + $cond .= " AND NOT FIND_IN_SET('bound', inv.flags)"; + if(!$this->bankEnabled) + $cond .= " AND status!='storage'"; + $sql = "SELECT inv.*, i.name, i.value FROM inventory inv JOIN items i USING(item_id) + WHERE $cond ORDER BY i.name, inv.inventory_id"; + $params = array('id' => $this->characterData->character_id); + foreach($this->dbClient->selectAll($sql, $params) as $row) + { + $flags = $row['flags'] + ? array_fill_keys(explode(',', $row['flags']), true) + : array(); + $status = $row['status']; + if(('inventory' == $status) && $row['equipped']) + $status = 'equipment'; + $result[$status][$row['inventory_id']] = array( + 'name' => $row['name'], 'value' => $row['value'], 'flags' => $flags); + } + return $result; + } + + + //gives mission if its allowed + private function giveMission() + { + $char = $this->characterData; + $lastMission = $char->getLastMission('rewarded'); + //check character's xp + if($char->xp_used < $this->xpForMission) + { + switch($char->_gender) + { + case 'm': $weak = 'słaby'; break; + case 'k': $weak = 'słaba'; break; + default: $weak = 'słabe'; + } + Daemon_MsgQueue::add( + "Słyszysz głos z nieba:" + ." \"Twa gorliwość jest godna pochwały, lecz jesteś jeszcze za $weak" + ." - wróć gdy osiągniesz $this->xpForMission doświadczenia.\"" + ); + return false; + } + //check last mission + $sql = "SELECT MAX(rollover_id) FROM rollovers"; + $lastRollover = $this->dbClient->selectValue($sql); + if (empty($lastRollover)) + { + Daemon_MsgQueue::add( + 'Słyszysz głos z nieba:' + .' "Twa gorliwość jest godna pochwały, lecz jeszcze za wcześnie na misje. Wróć później."' + ); + return false; + } + if($lastRollover && $lastMission && ($lastRollover <= $lastMission['rollover_id'])) + { + switch($char->_gender) + { + case 'm': $x = 'wykonałeś'; break; + case 'k': $x = 'wykonałaś'; break; + default: $x = 'wykonałeś'; + } + Daemon_MsgQueue::add( + "Słyszysz głos z nieba:" + ." \"Twa gorliwość jest godna pochwały, lecz $x już dzisiaj misję. Wróć później." + ); + return false; + } + //get character's region + $sql = "SELECT region_id FROM locations WHERE location_id=:id"; + $regionId = $this->dbClient->selectValue($sql, array('id' => $char->location_id)); + //find monster near character's level & location + $cols = "m.monster_id, m.name"; + $tables = "monsters m JOIN location_monsters lm USING(monster_id) JOIN locations l USING(location_id)"; + $params = array('regionId' => $regionId, 'level' => $char->level); + $sql = "SELECT $cols FROM $tables + WHERE l.region_id=:regionId AND m.level>=:level AND lm.chance > 0 + ORDER BY level ASC, RAND() LIMIT 1"; + $monster = $this->dbClient->selectRow($sql, $params); + if(!$monster) + { + $sql = "SELECT $cols FROM $tables + WHERE l.region_id=:regionId AND m.level<:level AND lm.chance > 0 + ORDER BY level DESC, RAND() LIMIT 1"; + $monster = $this->dbClient->selectRow($sql, $params); + } + if(!$monster) + return false; + //get random drop from that monster + $sql = "SELECT i.item_id, i.name, md.chance*RAND() AS ord + FROM items i JOIN monster_drops md USING(item_id) + WHERE md.monster_id=:id AND md.chance > 0 ORDER BY ord LIMIT 1"; + $params = array('id' => $monster['monster_id']); + $item = $this->dbClient->selectRow($sql, $params); + //choose mission type + if($item && (mt_rand(0,255) < 128)) + { + $missionType = 'item'; + $missionParams = $item['item_id']; + $message = "Przynieś mi przedmiot - $item[name] - a twój wysiłek zostanie nagrodzony."; + } + else + { + $missionType = 'monster'; + $missionParams = $monster['monster_id']; + $message = "Pokonaj potwora - $monster[name] - a twój wysiłek zostanie nagrodzony."; + } + $sql = "INSERT INTO character_missions(character_id, rollover_id, service_id, type, params) + VALUES (:cid, :rid, :sid, :type, :params)"; + $params = array('cid' => $char->character_id, 'rid' => $lastRollover, + 'sid' => $this->serviceData['service_id'], 'type' => $missionType, 'params' => $missionParams); + $this->dbClient->query($sql, $params); + Daemon_MsgQueue::add("Słyszysz głos z nieba: \"$message\""); + return true; + } + + + //pray at altar, offering gold + public function pray($gold, $inventoryId) + { + $char = $this->characterData; + $mission = $char->getLastMission('active'); + $gold = ceil(abs($gold)); + //check character gold + if(!$char->payGold($gold, $this->bankEnabled)) + return false; + //check item for value and mission + $cond = "inv.character_id=:charId AND inv.inventory_id=:inventoryId"; + if(!$this->bankEnabled) + $cond .= " AND inv.status!='storage'"; + $sql = "SELECT inv.item_id, i.value FROM inventory inv JOIN items i USING(item_id) WHERE $cond"; + $params = array('charId' => $char->character_id, 'inventoryId' => $inventoryId); + $item = $this->dbClient->selectRow($sql, $params); + if($item) + { + $gold += $item['value']; + //check for mission target + if(($this->serviceData['service_id'] == $mission['service_id']) && ('item' == $mission['type']) + && ($item['item_id'] == $mission['params']) && ('completed' != $mission['progress'])) + { + $mission['progress'] = 1; + $sql = "UPDATE character_missions SET progress='completed' + WHERE character_id=:cid AND rollover_id=:rid"; + $params = array('cid' => $char->character_id, 'rid' => $mission['rollover_id']); + $this->dbClient->query($sql, $params); + } + //remove item + $sql = "DELETE FROM inventory WHERE inventory_id=:id"; + $this->dbClient->query($sql, array('id' => $inventoryId)); + $char->resetCombatStats(); + } + //check for reaction + if(!$mission['progress']) + { + $wealth = $gold + $char->gold_purse + $char->gold_bank; + if($wealth) + $chance = round(2560 * $gold / $wealth); + else $chance = 0; + $d256 = mt_rand(0, 255); + if($chance <= $d256) + { + Daemon_msgQueue::add('Twa ofiara nie wywołała żadnej reakcji.'); + return false; + } + } + //heal character & give mission + $char->health = $char->health_max; + $char->mana = $char->mana_max; + Daemon_MsgQueue::add('Stwórca przyjął ofiarę. Twoje rany zostały uleczone a siły odnowione.'); + if($mission['progress']) + $this->checkMission(); + else $this->giveMission(); + //save character + $this->characterData->put(); + return true; + } + + + //removes mission + public function removeMission() + { + $sql = "DELETE FROM character_missions WHERE character_id=:id AND progress < 'completed'"; + $this->dbClient->query($sql, array('id' => $this->characterData->character_id)); + } + + + public function setParams() + { + $dbCfg = new Daemon_DbConfig($this->dbClient); + $this->xpForMission = max(0, (int) $dbCfg->templeXpForMission); + $this->xpForRegen = max(0, (int) $dbCfg->templeXpForRegen); + } +} diff --git a/2013/daemon/lib/daemon/spell.php b/2013/daemon/lib/daemon/spell.php new file mode 100644 index 0000000..56c14fb --- /dev/null +++ b/2013/daemon/lib/daemon/spell.php @@ -0,0 +1,63 @@ +characterData = $characterData; + } + + + public function attachDbClient(Daemon_DbClient $dbClient) + { + $this->dbClient = $dbClient; + } + + + public function getUsageLog() + { + return $this->usageLog; + } + + + public function execute(Daemon_View $view, $spellId) + { + //fetch spell info + $sql = "SELECT name, handle FROM spells WHERE spell_id=:id"; + $spell = $this->dbClient->selectRow($sql, array('id' => $spellId)); + if(!$spell) + $spell = array('name' => '???', 'handle' => null); + //get spell's cost + $cost = null; + foreach($this->characterData->getSpells() as $row) + { + if($row['spell_id'] == $spellId) + $cost = $row['_cost']; + } + if(!$cost) + { + Daemon_MsgQueue::add('Nie znasz tego zaklęcia.'); + return false; + } + //check if handler is implemented + $className = "Daemon_Spell_$spell[handle]"; + if(class_exists($className, true) && is_subclass_of($className, 'Daemon_SpellInterface')) + { + //valid spell, execute it + $handler = new $className($this->dbClient, $this->characterData, $view); + $this->usageLog = $handler->execute($spellId, $cost); + $this->characterData->put(); + return true; + } + else + { + //no effect + Daemon_MsgQueue::add("Nieznany efekt: $spell[name]"); + return false; + } + } +} diff --git a/2013/daemon/lib/daemon/spell/identify.php b/2013/daemon/lib/daemon/spell/identify.php new file mode 100644 index 0000000..c680ac9 --- /dev/null +++ b/2013/daemon/lib/daemon/spell/identify.php @@ -0,0 +1,15 @@ +updateCharacterMana($cost)) + return null; + $sql = "UPDATE inventory SET flags=CONCAT(flags, ',identified') WHERE character_id=:id AND status!='storage'"; + $this->dbClient->query($sql, array('id' => $this->characterData->character_id)); + Daemon_MsgQueue::add('Zawartość plecaka została zidentyfikowana.'); + return null; + } +} diff --git a/2013/daemon/lib/daemon/spell/scancharacter.php b/2013/daemon/lib/daemon/spell/scancharacter.php new file mode 100644 index 0000000..89665fc --- /dev/null +++ b/2013/daemon/lib/daemon/spell/scancharacter.php @@ -0,0 +1,69 @@ +updateCharacterMana($cost)) + return null; + $result['char'] = $this->getCharacterByName($target); + if($result['char']->character_id) + { + $result['cdata'] = $result['char']->getCharacterData(); + if($result['cdata']->level) + $chance = $this->characterData->level / ($this->characterData->level + $result['cdata']->level); + else $chance = 0; + if(mt_rand(0, 255) < 256 * $chance) + { + $result['equipment'] = $this->getEquipmentByCharacterId($result['char']->character_id); + $result['locationName'] = $this->getLocationNameById($result['cdata']->location_id); + } + else + { + Daemon_MsgQueue::add('Nie udało się rzucić zaklęcia!'); + $result = null; + } + } + else + { + Daemon_MsgQueue::add('Dziwne... zaklęcie niczego nie wskazuje...'); + $result = null; + } + } + $this->view->spellId = $spellId; + $this->view->cost = $cost; + $this->view->target = $target; + $this->view->result = $result; + ob_start(); + $this->view->display('spell/scancharacter.xml'); + return ob_get_clean(); + } + + + private function getCharacterByName($name) + { + $char = new Daemon_DbObject_Character(); + $char->attachDbClient($this->dbClient); + $char->get(array('name' => $name), true); + return $char; + } + + + private function getEquipmentByCharacterId($charId) + { + $sql = "SELECT i.name FROM inventory inv JOIN items i USING(item_id) + WHERE inv.character_id=:id AND inv.equipped IS NOT NULL ORDER BY i.name"; + return $this->dbClient->selectColumn($sql, array('id' => $charId)); + } + + + private function getLocationNameById($locationId) + { + $sql = "SELECT name FROM locations WHERE location_id=:id"; + return $this->dbClient->selectValue($sql, array('id' => $locationId)); + } +} diff --git a/2013/daemon/lib/daemon/spell/scanitem.php b/2013/daemon/lib/daemon/spell/scanitem.php new file mode 100644 index 0000000..19356b8 --- /dev/null +++ b/2013/daemon/lib/daemon/spell/scanitem.php @@ -0,0 +1,65 @@ +updateCharacterMana($cost)) + return null; + $item = $this->getItemByName($target); + if($item->item_id) + { + $result['item'] = $item; + $result['typeName'] = Daemon::getArrayValue(Daemon_Dictionary::$itemTypes, $item->type); + $result['damageType'] = Daemon::getArrayValue(Daemon_Dictionary::$itemDamageTypes, $item->damage_type); + $result['shops'] = $this->getShopsByItemId($result['item']->item_id); + $result['monsters'] = $this->getMonstersByItemId($result['item']->item_id); + } + else + { + Daemon_MsgQueue::add('Dziwne... zaklęcie niczego nie wskazuje...'); + $result = null; + } + } + $this->view->spellId = $spellId; + $this->view->cost = $cost; + $this->view->target = $target; + $this->view->result = $result; + ob_start(); + $this->view->display('spell/scanitem.xml'); + return ob_get_clean(); + } + + + private function getItemByName($name) + { + $item = new Daemon_DbObject_Item(); + $item->attachDbClient($this->dbClient); + $item->get(array('name' => $name), true); + return $item; + } + + + private function getMonstersByItemId($itemId) + { + $sql = "SELECT m.name, m.level FROM monster_drops md JOIN monsters m USING(monster_id) + WHERE md.item_id=:id ORDER BY m.name"; + $data = $this->dbClient->selectAll($sql, array('id' => $itemId)); + $result = array(); + foreach($data as $row) + $result[] = sprintf('%s (poziom %d)', $row['name'], $row['level']); + return $result; + } + + + private function getShopsByItemId($itemId) + { + $sql = "SELECT s.name FROM service_items si JOIN services s USING(service_id) + WHERE si.item_id=:id ORDER BY s.name"; + return $this->dbClient->selectColumn($sql, array('id' => $itemId)); + } +} diff --git a/2013/daemon/lib/daemon/spell/scanmonster.php b/2013/daemon/lib/daemon/spell/scanmonster.php new file mode 100644 index 0000000..d8fef0b --- /dev/null +++ b/2013/daemon/lib/daemon/spell/scanmonster.php @@ -0,0 +1,93 @@ +updateCharacterMana($cost)) + return null; + $result['monster'] = $this->getMonsterByName($target); + if($result['monster']->monster_id) + { + if($result['monster']->level) + $chance = $this->characterData->level / ($this->characterData->level + $result['monster']->level); + else $chance = 0; + if(mt_rand(0, 255) < 256 * $chance) + { + $result['title'] = $this->getTitleById($result['monster']->title_id); + $result['items'] = $this->getItemsByMonsterId($result['monster']->monster_id); + $result['locations'] = $this->getLocationsByMonsterId($result['monster']->monster_id); + $result['className'] = Daemon_Dictionary::$monsterClasses[$result['monster']->class]; + //prepare combat unit + $unit = (array) $result['monster']->getCombatUnit(false); + $attackTypes = Daemon_Dictionary::$combatAttackTypes; + $attackSpecials = Daemon_Dictionary::$combatAttackSpecials; + $armorSpecials = Daemon_Dictionary::$combatArmorSpecials; + $unit['type1_name'] = $unit['type1'] ? $attackTypes[$unit['type1']] : null; + $unit['type2_name'] = $unit['type2'] ? $attackTypes[$unit['type2']] : null; + $unit['sp1_name'] = $unit['sp1_type'] ? $attackSpecials[$unit['sp1_type']] : null; + $unit['sp2_name'] = $unit['sp2_type'] ? $attackSpecials[$unit['sp2_type']] : null; + $unit['armor_sp_name'] = $unit['armor_sp_type'] ? $armorSpecials[$unit['armor_sp_type']] : null; + $result['unit'] = $unit; + } + else + { + Daemon_MsgQueue::add('Nie udało się rzucić zaklęcia!'); + $result = null; + } + } + else + { + Daemon_MsgQueue::add('Dziwne... zaklęcie niczego nie wskazuje...'); + $result = null; + } + } + $this->view->spellId = $spellId; + $this->view->cost = $cost; + $this->view->target = $target; + $this->view->result = $result; + ob_start(); + $this->view->display('spell/scanmonster.xml'); + return ob_get_clean(); + } + + + private function getItemsByMonsterId($monsterId) + { + $sql = "SELECT i.name, md.chance FROM monster_drops md JOIN items i USING(item_id) + WHERE md.monster_id=:id ORDER BY i.name"; + $data = $this->dbClient->selectAll($sql, array('id' => $monsterId)); + $result = array(); + foreach($data as $row) + $result[] = sprintf('%s (częstość %d)', $row['name'], $row['chance']); + return $result; + } + + + private function getLocationsByMonsterId($monsterId) + { + $sql = "SELECT l.name FROM location_monsters lm JOIN locations l USING(location_id) + WHERE lm.monster_id=:id ORDER BY l.name"; + return $this->dbClient->selectColumn($sql, array('id' => $monsterId)); + } + + + private function getMonsterByName($name) + { + $monster = new Daemon_DbObject_Monster(); + $monster->attachDbClient($this->dbClient); + $monster->get(array('name' => $name), true); + return $monster; + } + + + private function getTitleById($titleId) + { + $sql = "SELECT name_f, name_m, name_n FROM titles WHERE title_id=:id"; + return $this->dbClient->selectRow($sql, array('id' => $titleId)); + } +} diff --git a/2013/daemon/lib/daemon/spell/scout.php b/2013/daemon/lib/daemon/spell/scout.php new file mode 100644 index 0000000..05a8237 --- /dev/null +++ b/2013/daemon/lib/daemon/spell/scout.php @@ -0,0 +1,56 @@ +updateCharacterMana($cost)) + return null; + $location = $this->getLocationById($this->characterData->location_id); + if(!$location->location_id) + { + Daemon_MsgQueue::add('Nie da się badać Otchłani!'); + return null; + } + $locations = array(0 => $location); + $pathIds = $this->getPathsByLocationId($this->characterData->location_id); + foreach($pathIds as $id) + $locations[] = $this->getLocationById($id); + ob_start(); + $this->view->locations = $locations; + $this->view->display('spell/scout.xml'); + return ob_get_clean(); + } + + + private function getLocationById($locationId) + { + $location = new Daemon_DbObject_Location; + $location->attachDbClient($this->dbClient); + $location->get(array('location_id' => $locationId)); + $location->_monsters = array(); + $location->_events = array(); + if($location->location_id) + { + $params = array('id' => $location->location_id); + $sql = "SELECT m.name, m.level, lm.chance FROM location_monsters lm JOIN monsters m USING(monster_id) + WHERE lm.location_id=:id ORDER BY m.name"; + foreach($this->dbClient->selectAll($sql, $params) as $row) + $location->_monsters[] = sprintf('%s (poziom %d, częstość %d)', $row['name'], $row['level'], $row['chance']); + $sql = "SELECT e.name, le.chance FROM location_events le JOIN events e USING(event_id) + WHERE le.location_id=:id ORDER BY e.name"; + foreach($this->dbClient->selectAll($sql, $params) as $row) + $location->_events[] = sprintf('%s (specjalne, częstość %d)', $row['name'], $row['chance']); + } + return $location; + } + + + private function getPathsByLocationId($locationId) + { + $sql = "SELECT destination_id FROM location_paths p + JOIN locations l ON l.location_id = p.destination_id + WHERE p.location_id=:id ORDER BY l.name, p.destination_id"; + return $this->dbClient->selectColumn($sql, array('id' => $locationId)); + } +} diff --git a/2013/daemon/lib/daemon/spellinterface.php b/2013/daemon/lib/daemon/spellinterface.php new file mode 100644 index 0000000..da5bb72 --- /dev/null +++ b/2013/daemon/lib/daemon/spellinterface.php @@ -0,0 +1,32 @@ +dbClient = $dbClient; + $this->characterData = $characterData; + $this->view = $view; + } + + + abstract public function execute($spellId, $cost); + + + final public function updateCharacterMana($cost) + { + if($this->characterData->mana < $cost) + { + Daemon_MsgQueue::add("Koszt $cost - nie masz tyle many."); + return false; + } + $this->characterData->mana -= $cost; + return true; + } +} diff --git a/2013/daemon/lib/daemon/statistics.php b/2013/daemon/lib/daemon/statistics.php new file mode 100644 index 0000000..3377445 --- /dev/null +++ b/2013/daemon/lib/daemon/statistics.php @@ -0,0 +1,233 @@ + array('key' => 'name', 'sort' => 'name ASC', 'from' => 'name >= :from'), + 'lvl' => array('key' => 'level', 'sort' => 'level DESC', 'from' => 'level <= :from'), + 'xp' => array('key' => 'xp_used', 'sort' => 'xp_used DESC', 'from' => 'xp_used <= :from'), + 'fac' => array('key' => 'faction_id', 'sort' => 'faction_id ASC', 'from' => 'faction_id >= :from'), + 'clan' => array('key' => 'clan_id', 'sort' => 'clan_id ASC', 'from' => 'clan_id >= :from'), + 'date' => array('key' => 'date_created', 'sort' => 'date_created ASC', 'from' => 'date_created >= :from'), + 'last' => array('key' => 'last_action', 'sort' => 'last_action DESC', 'from' => 'last_action >= :from'), + 'win' => array('key' => 'duel_wins', 'sort' => 'duel_wins DESC', 'from' => 'duel_wins <= :from'), + 'los' => array('key' => 'duel_losses', 'sort' => 'duel_losses DESC', 'from' => 'duel_losses <= :from'), + ); + + + public function __construct(Daemon_DbClient $dbClient) + { + $this->dbClient = $dbClient; + } + + + public function getBattleById($battleId) + { + $sql = "SELECT b.combat_log, b.type, l.name AS location_name + FROM battles b + LEFT JOIN locations l USING(location_id) + WHERE b.battle_id = :battleId"; + $params = array('battleId' => $battleId); + return $this->dbClient->selectRow($sql, $params); + } + + + public function getBattles($limit, $from) + { + $params = array('limit' => $limit + 1); + $cond = ''; + if($from) + { + $cond = 'WHERE battle_id <= :from'; + $params['from'] = (int) $from; + } + $sql = "SELECT b.battle_id, b.rollover_id, b.location_id, b.type, l.name AS location_name, + IF(b.combat_log IS NULL OR b.combat_log = '', 0, 1) AS log_exists + FROM battles b + LEFT JOIN locations l USING(location_id) + $cond ORDER BY battle_id DESC LIMIT :limit"; + return $this->getItemList($sql, $params, $limit, 'battle_id'); + } + + + //fetches character data by ID + public function getCharacterById($characterId) + { + $params = array('characterId' => $characterId); + $sql = "SELECT c.player_id, p.name AS player_name, c.show_player, + c.name, c.gender, c.clan_id, cp.level, cp.xp_used, + c.avatar_url, c.quote, c.description, date_format(c.date_created, '%Y-%m-%d') AS date_created, + cl.name AS clan_name, f.name AS faction_name, COALESCE(cp.rank_id, 0) AS rank_id, + CASE c.gender WHEN 'f' THEN frt.name_f WHEN 'm' THEN frt.name_m ELSE frt.name_n END AS rank_name + FROM characters c + LEFT JOIN players p USING(player_id) + LEFT JOIN character_data cp USING(character_id) + LEFT JOIN factions f USING(faction_id) + LEFT JOIN faction_ranks fr USING(faction_id, rank_id) + LEFT JOIN titles frt USING(title_id) + LEFT JOIN clans cl USING(clan_id) + WHERE character_id = :characterId"; + if($character = $this->dbClient->selectRow($sql, $params)) + { + $sql = "SELECT CASE c.gender WHEN 'f' THEN t.name_f WHEN 'm' THEN t.name_m WHEN 'n' THEN t.name_n END AS title + FROM character_titles ct + JOIN characters c ON c.character_id=ct.character_id + JOIN titles t ON ct.title_id=t.title_id + WHERE ct.character_id = :characterId ORDER BY title ASC"; + if($titles = $this->dbClient->selectColumn($sql, $params)) + $character['titles'] = implode(', ', $titles); + else $character['titles'] = null; + $sql = "SELECT * FROM character_statistics WHERE character_id = :characterId"; + $character['statistics'] = $this->dbClient->selectRow($sql, $params); + } + return $character; + } + + + //fetches a list of characters + public function getCharacters($limit, $from, $order, $clanId) + { + if(!isset($this->charactersOrderTypes[$order])) + $order = 'xp'; + $orderParams = $this->charactersOrderTypes[$order]; + + $from = explode(',', $from, 2); + if(count($from)<2) + $from = array(); + + $params = array('limit' => $limit + 1); + $where = array("$orderParams[key] IS NOT NULL", "c.character_id!=392"); + if($clanId) + { + $params['clanId'] = $clanId; + $where[] = 'clan_id=:clanId'; + } + if($from) + { + $params['from'] = $from[1]; + $params['characterId'] = $from[0]; + $where[] = "($orderParams[from] AND character_id>= :characterId)"; + } + if($where) + $where = 'WHERE ' . implode(' AND ', $where); + else $where = ''; + $orderClause = $orderParams['sort']; + $sql = "SELECT c.character_id, c.name, c.clan_id, cp.level, cp.xp_used, + cp.faction_id, COALESCE(cp.rank_id, 0) AS rank_id, + date_format(c.date_created, '%Y-%m-%d') AS date_created, + date_format(c.last_action, '%Y-%m-%d') AS last_action, + cs.duel_wins, cs.duel_losses, cs.kills_mob1, cs.kills_mob2, cs.kills_mob3, cs.kills_mob4 + FROM characters c + LEFT JOIN character_data cp USING(character_id) + LEFT JOIN character_statistics cs USING(character_id) + $where ORDER BY $orderClause, character_id ASC LIMIT :limit"; + $list = $this->dbClient->selectAll($sql, $params); + if(count($list) > $limit) + { + $next = array_pop($list); + $next = sprintf('%s,%s', $next['character_id'], $next[$orderParams['key']]); + } + else $next = null; + return array('list' => $list, 'next' => $next); + } + + + //fetches clan data by ID + public function getClanById($clanId) + { + $params = array('clanId' => $clanId); + $sql = "SELECT cl.*, c.name AS leader_name, + date_format(cl.date_created, '%Y-%m-%d') AS date_created + FROM clans cl LEFT JOIN characters c ON c.character_id=leader_id + WHERE cl.clan_id = :clanId"; + if($clan = $this->dbClient->selectRow($sql, $params)) + { + $sql = "SELECT COUNT(1) FROM characters WHERE clan_id = :clanId"; + $clan['members'] = $this->dbClient->selectColumn($sql, $params); + } + return $clan; + } + + + //fetches a list of clans + public function getClans($limit, $from) + { + $params = array('limit' => $limit + 1); + $cond = ''; + if($from) + { + $cond = 'WHERE cl.clan_id >= :from'; + $params['from'] = $from; + } + $sql = "SELECT cl.*, c.name AS leader_name, n.members, + date_format(cl.date_created, '%Y-%m-%d') AS date_created + FROM clans cl LEFT JOIN characters c ON c.character_id=leader_id + LEFT JOIN ( + SELECT clan_id, COUNT(1) AS members FROM characters WHERE clan_id IS NOT NULL GROUP BY clan_id + ) AS n ON n.clan_id=cl.clan_id + $cond ORDER BY cl.clan_id ASC LIMIT :limit"; + return $this->getItemList($sql, $params, $limit, 'clan_id'); + } + + + //fetches combat log by duelId + public function getDuelById($characterId, $duelId) + { + $sql = "SELECT d.combat_log, ca.name AS attacker_name, cb.name AS defender_name + FROM duels d + LEFT JOIN characters ca ON ca.character_id=d.attacker_id + LEFT JOIN characters cb ON cb.character_id=d.defender_id + WHERE d.duel_id = :duelId AND (d.attacker_id=:characterId OR d.defender_id=:characterId)"; + $params = array('characterId' => $characterId, 'duelId' => $duelId); + return $this->dbClient->selectRow($sql, $params); + } + + + //fetches a list of duels, optionally filtered by character + public function getDuels($limit, $from, $characterId, $viewerId) + { + $params = array('limit' => $limit + 1, 'vid1' => $viewerId, 'vid2' => $viewerId); + $where = array(); + if($characterId) + { + $params['characterId'] = $characterId; + $where[] = '(attacker_id=:characterId OR defender_id=:characterId)'; + } + if($from) + { + $params['from'] = (int) $from; + $where[] = 'duel_id <= :from'; + } + if($where) + $where = 'WHERE ' . implode(' AND ', $where); + else $where = ''; + $sql = "SELECT d.duel_id, + date_format(d.date_added, '%Y-%m-%d %H:%i:%s') AS date_added, + d.rollover_id, d.attacker_id, d.defender_id, d.type, d.winner, + ( + d.combat_log IS NOT NULL AND d.combat_log != '' + AND (d.attacker_id = :vid1 OR d.defender_id = :vid2) + ) AS log_exists, + ca.name AS attacker_name, cb.name AS defender_name + FROM duels d + LEFT JOIN characters ca ON ca.character_id=d.attacker_id + LEFT JOIN characters cb ON cb.character_id=d.defender_id + $where ORDER BY d.duel_id DESC LIMIT :limit"; + return $this->getItemList($sql, $params, $limit, 'duel_id'); + } + + + private function getItemList($sql, array $params, $limit, $indexCol) + { + $list = $this->dbClient->selectAll($sql, $params); + if(count($list) > $limit) + { + $next = array_pop($list); + $next = $next[$indexCol]; + } + else $next = null; + return array('list' => $list, 'next' => $next); + } +} diff --git a/2013/daemon/lib/daemon/view.php b/2013/daemon/lib/daemon/view.php new file mode 100644 index 0000000..856e3af --- /dev/null +++ b/2013/daemon/lib/daemon/view.php @@ -0,0 +1,133 @@ + /u', ">\n", $str); + } +} + + +class Daemon_View +{ + public $subtitle; + public $subtitleDetails; + public $titlePrefix; + private $applicationTitle; //for setPageTitle() + private $filter; + private $phptal; + const MODE_HTML = PHPTAL::HTML5; + const MODE_ATOM = PHPTAL::XML; + const PAGING_MAX_ITEMS = 10; + + + public function __construct(Daemon_Config $cfg) + { + $this->applicationTitle = $cfg->applicationTitle; + $this->phptal = new PHPTAL(); + $this->phptal->setTemplateRepository(array($cfg->getFilePath('tpl'))); + $this->phptal->setPhpCodeDestination($cfg->getFilePath('tmp')); + $this->filter = new Daemon_View_Filter(); + if($cfg->minifyHtml) + $this->phptal->setPostFilter($this->filter); + } + + + public function __set($name, $value) + { + $this->phptal->$name = $value; + } + + + //displays page content + public function display($templateName, $outputMode = self::MODE_HTML) + { + if($outputMode != self::MODE_HTML) + { + $contentType = 'Content-Type:application/atom+xml;charset=UTF-8'; + $this->phptal->setOutputMode(PHPTAL::XML); + } + else + { + $contentType = 'Content-Type:text/html;charset=UTF-8'; + $this->phptal->setOutputMode(PHPTAL::HTML5); + } + $this->phptal->setTemplate($templateName); + header($contentType); + echo $this->phptal->execute(); + } + + + //generates channel menu for chat page + public function getChatMenu($channels, $channelId = null) + { + $menu = array(); + foreach($channels as $key => $row) + $menu[] = array('name' => $row['name'], 'url' => ($key != $channelId) ? "?v=$key" : null); + return $menu; + } + + + //generates menu for statistics pages + public function getStatisticsMenu($type = null) + { + $menu = array( + 'status' => array('name' => 'Status', 'url' => 'stats'), + 'characters' => array('name' => 'Postacie', 'url' => 'stats-characters'), + 'clans' => array('name' => 'Klany', 'url' => 'stats-clans'), + 'duels' => array('name' => 'Pojedynki', 'url' => 'stats-duels'), + 'battles' => array('name' => 'Bitwy', 'url' => 'stats-battles'), + ); + if(isset($menu[$type])) + $menu[$type]['url'] = null; + return $menu; + } + + + public function setGameHeader($playerId, $activeCharacter = null, $characterData = null, $location = null) + { + $this->__set('playerId', $playerId); + $this->__set('activeCharacter', $activeCharacter); + $this->__set('characterData', $characterData); + $this->__set('location', $location); + } + + + public function setMessages($messages) + { + $this->__set('pageMessages', $messages); + } + + + public function setPageSkin($skinId) + { + $skinDirUrls = Daemon_Dictionary::$skinDirUrls; + if (isset($skinDirUrls[$skinId])) + $url = $skinDirUrls[$skinId]; + else + $url = array_shift($skinDirUrls); + $this->__set('pageSkinName', $skinId); + $this->__set('pageSkinUrl', $url); + } + + + public function setPageTitle($subtitle = null, $details = null, $isCommand = false) + { + $title = $this->applicationTitle; + if($subtitle) + { + if($details) + $title = sprintf('%s: %s - %s', $subtitle, $details, $title); + else $title = sprintf('%s - %s', $subtitle, $title); + } + if($isCommand) + $title = sprintf('[cmd] %s', $title); + $this->__set('pageTitle', $title); + } +} diff --git a/2013/daemon/lib/jsmin.php b/2013/daemon/lib/jsmin.php new file mode 100644 index 0000000..2f3bcc7 --- /dev/null +++ b/2013/daemon/lib/jsmin.php @@ -0,0 +1,291 @@ + + * @copyright 2002 Douglas Crockford (jsmin.c) + * @copyright 2008 Ryan Grove (PHP port) + * @license http://opensource.org/licenses/mit-license.php MIT License + * @version 1.1.1 (2008-03-02) + * @link http://code.google.com/p/jsmin-php/ + */ + +class JSMin { + const ORD_LF = 10; + const ORD_SPACE = 32; + + protected $a = ''; + protected $b = ''; + protected $input = ''; + protected $inputIndex = 0; + protected $inputLength = 0; + protected $lookAhead = null; + protected $output = ''; + + // -- Public Static Methods -------------------------------------------------- + + public static function minify($js) { + $jsmin = new JSMin($js); + return $jsmin->min(); + } + + // -- Public Instance Methods ------------------------------------------------ + + public function __construct($input) { + $this->input = str_replace("\r\n", "\n", $input); + $this->inputLength = strlen($this->input); + } + + // -- Protected Instance Methods --------------------------------------------- + + protected function action($d) { + switch($d) { + case 1: + $this->output .= $this->a; + + case 2: + $this->a = $this->b; + + if ($this->a === "'" || $this->a === '"') { + for (;;) { + $this->output .= $this->a; + $this->a = $this->get(); + + if ($this->a === $this->b) { + break; + } + + if (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated string literal.'); + } + + if ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } + } + } + + case 3: + $this->b = $this->next(); + + if ($this->b === '/' && ( + $this->a === '(' || $this->a === ',' || $this->a === '=' || + $this->a === ':' || $this->a === '[' || $this->a === '!' || + $this->a === '&' || $this->a === '|' || $this->a === '?')) { + + $this->output .= $this->a . $this->b; + + for (;;) { + $this->a = $this->get(); + + if ($this->a === '/') { + break; + } elseif ($this->a === '\\') { + $this->output .= $this->a; + $this->a = $this->get(); + } elseif (ord($this->a) <= self::ORD_LF) { + throw new JSMinException('Unterminated regular expression '. + 'literal.'); + } + + $this->output .= $this->a; + } + + $this->b = $this->next(); + } + } + } + + protected function get() { + $c = $this->lookAhead; + $this->lookAhead = null; + + if ($c === null) { + if ($this->inputIndex < $this->inputLength) { + $c = $this->input[$this->inputIndex]; + $this->inputIndex += 1; + } else { + $c = null; + } + } + + if ($c === "\r") { + return "\n"; + } + + if ($c === null || $c === "\n" || ord($c) >= self::ORD_SPACE) { + return $c; + } + + return ' '; + } + + protected function isAlphaNum($c) { + return ord($c) > 126 || $c === '\\' || preg_match('/^[\w\$]$/', $c) === 1; + } + + protected function min() { + $this->a = "\n"; + $this->action(3); + + while ($this->a !== null) { + switch ($this->a) { + case ' ': + if ($this->isAlphaNum($this->b)) { + $this->action(1); + } else { + $this->action(2); + } + break; + + case "\n": + switch ($this->b) { + case '{': + case '[': + case '(': + case '+': + case '-': + $this->action(1); + break; + + case ' ': + $this->action(3); + break; + + default: + if ($this->isAlphaNum($this->b)) { + $this->action(1); + } + else { + $this->action(2); + } + } + break; + + default: + switch ($this->b) { + case ' ': + if ($this->isAlphaNum($this->a)) { + $this->action(1); + break; + } + + $this->action(3); + break; + + case "\n": + switch ($this->a) { + case '}': + case ']': + case ')': + case '+': + case '-': + case '"': + case "'": + $this->action(1); + break; + + default: + if ($this->isAlphaNum($this->a)) { + $this->action(1); + } + else { + $this->action(3); + } + } + break; + + default: + $this->action(1); + break; + } + } + } + + return $this->output; + } + + protected function next() { + $c = $this->get(); + + if ($c === '/') { + switch($this->peek()) { + case '/': + for (;;) { + $c = $this->get(); + + if (ord($c) <= self::ORD_LF) { + return $c; + } + } + + case '*': + $this->get(); + + for (;;) { + switch($this->get()) { + case '*': + if ($this->peek() === '/') { + $this->get(); + return ' '; + } + break; + + case null: + throw new JSMinException('Unterminated comment.'); + } + } + + default: + return $c; + } + } + + return $c; + } + + protected function peek() { + $this->lookAhead = $this->get(); + return $this->lookAhead; + } +} + +// -- Exceptions --------------------------------------------------------------- +class JSMinException extends Exception {} +?> \ No newline at end of file diff --git a/2013/daemon/php.ini b/2013/daemon/php.ini new file mode 100644 index 0000000..4f7cbbe --- /dev/null +++ b/2013/daemon/php.ini @@ -0,0 +1,39 @@ +[PHP] +; language options +short_open_tag = Off +asp_tags = Off + +; error handling and logging +error_reporting = E_ALL | E_STRICT +display_errors = On +display_startup_errors = Off +log_errors = On +log_errors_max_len = 0 +html_errors = Off +error_log = "path/to/error.log" + +; data handling +register_globals = Off +register_long_arrays = Off +register_argc_argv = Off +auto_globals_jit = On +magic_quotes_gpc = Off +magic_quotes_runtime = Off +magic_quotes_sybase = Off +default_mimetype = "text/plain" +default_charset = "UTF-8" +always_populate_raw_post_data = Off + + +[Date] +date.timezone = "Europe/Warsaw" + +[iconv] +iconv.input_encoding = "UTF-8" +iconv.internal_encoding = "UTF-8" +iconv.output_encoding = "UTF-8" + +[Session] +session.use_cookies = 1 +session.use_only_cookies = 1 +session.auto_start = 0 diff --git a/2013/daemon/public/.htaccess b/2013/daemon/public/.htaccess new file mode 100644 index 0000000..be9318b --- /dev/null +++ b/2013/daemon/public/.htaccess @@ -0,0 +1,10 @@ +DirectoryIndex index.php +Redirect gone ./favicon.ico +Redirect permanent /help http://pl.daemon.wikia.com/wiki/Daemon_Wiki + +RewriteEngine On + +RewriteCond %{SCRIPT_FILENAME} !-d +RewriteCond %{SCRIPT_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME}.php -f +RewriteRule ^(.*)$ /$1.php [L,QSA] diff --git a/2013/daemon/public/_init.php b/2013/daemon/public/_init.php new file mode 100644 index 0000000..28d45fa --- /dev/null +++ b/2013/daemon/public/_init.php @@ -0,0 +1,31 @@ +characters = $this->player->getCharacters(); + //mark active character + $activeCharId = $this->player->getCharacterId(); + if($activeCharId && isset($this->characters[$activeCharId])) + $this->characters[$activeCharId]['active'] = true; + else $activeCharId = null; + //prepare view + $this->view->characters = $this->characters; + $this->view->genders = Daemon_Dictionary::$genders; + $this->view->preview = Daemon::formatMessage($this->activeCharacter->description, true); + } + + + protected function runCommands() + { + $turnDelta = $this->dbCfg->turnDelta; + $turnLimit = $this->dbCfg->turnLimit; + //create character + if(isset($_POST['newName'], $_POST['newGender'])) + { + $this->player->addCharacter($_POST['newName'], $_POST['newGender'], $turnDelta, $turnLimit); + return true; + } + //set active character + if(isset($_POST['use'])) + { + $this->player->setCharacterId($_POST['use']); + $this->activeCharacter = $this->player->getActiveCharacter(); + $this->characterData = $this->activeCharacter->getCharacterData(); + $this->activeCharacter->updateLastAction(); + return true; + } + //reset or delete character + if(isset($_POST['char'], $_POST['action'])) + { + $reset = ($_POST['action'] == 'reset'); + $this->player->deleteCharacter($_POST['char'], $reset, $turnDelta, $turnLimit); + $this->activeCharacter = $this->player->getActiveCharacter(); + $this->characterData = $this->activeCharacter->getCharacterData(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Account($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/auth.php b/2013/daemon/public/auth.php new file mode 100644 index 0000000..18abf53 --- /dev/null +++ b/2013/daemon/public/auth.php @@ -0,0 +1,46 @@ +cfg->applicationUrl; + if($this->player->getPlayerId()) + $url .= 'account'; + Daemon::redirect($url); + exit; + } + + + protected function runCommands() + { + if(!$this->dbCfg->loginEnabled) + return false; + if(isset($_POST['login'], $_POST['pass'])) + { + $this->player->authenticate($_POST['login'], $_POST['pass']); + return true; + } + if(isset($_POST['logout'])) + { + $this->player->unauthenticate(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Auth($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/character.php b/2013/daemon/public/character.php new file mode 100644 index 0000000..17b2db3 --- /dev/null +++ b/2013/daemon/public/character.php @@ -0,0 +1,89 @@ +eventLog) + { + $this->pageSubtitle = 'Użycie zaklęcia'; + $this->pageTemplatePath = 'event.xml'; + $this->view->eventLog = $this->eventLog; + return; + } + //prepare attributes list + $list = array(); + foreach(Daemon_Dictionary::$characterAttributes as $key => $name) + { + $col = "a_$key"; + $value = $this->characterData->$col; + $list[$key] = array('name' => $name, 'value' => $value, 'inc' => ($value <= $this->characterData->xp_free)); + } + $this->view->attributes = $list; + //prepare skill list + $list = array(); + foreach(Daemon_Dictionary::$characterSkills as $key => $name) + { + $col = "s_$key"; + $value = $this->characterData->$col; + $list[$key] = array('name' => $name, 'value' => $value, 'inc' => ($value <= $this->characterData->xp_free)); + } + $this->view->skills = $list; + //prepare spell list + $this->view->spells = $this->characterData->getSpells(); + //prepare combat stats + $unit = (array) $this->characterData->getCombatUnit(); + $attackTypes = Daemon_Dictionary::$combatAttackTypes; + $attackSpecials = Daemon_Dictionary::$combatAttackSpecials; + $armorSpecials = Daemon_Dictionary::$combatArmorSpecials; + $unit['type1_name'] = $unit['type1'] ? $attackTypes[$unit['type1']] : null; + $unit['type2_name'] = $unit['type2'] ? $attackTypes[$unit['type2']] : null; + $unit['sp1_name'] = $unit['sp1_type'] ? $attackSpecials[$unit['sp1_type']] : null; + $unit['sp2_name'] = $unit['sp2_type'] ? $attackSpecials[$unit['sp2_type']] : null; + $unit['armor_sp_name'] = $unit['armor_sp_type'] ? $armorSpecials[$unit['armor_sp_type']] : null; + $this->view->combatStats = $unit; + } + + + protected function runCommands() + { + //improve attribute + if(isset($_POST['incA'])) + { + $this->characterData->improveAttribute($_POST['incA']); + return true; + } + //improve skill + if(isset($_POST['incS'])) + { + $this->characterData->improveSkill($_POST['incS']); + return true; + } + //cast spell + if(isset($_POST['cast'])) + { + $handler = new Daemon_Spell(); + $handler->attachCharacterData($this->characterData); + $handler->attachDbClient($this->dbClient); + $handler->execute($this->view, $_POST['cast']); + $this->eventLog = $handler->getUsageLog(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Character($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/chat.php b/2013/daemon/public/chat.php new file mode 100644 index 0000000..2bd7bdf --- /dev/null +++ b/2013/daemon/public/chat.php @@ -0,0 +1,61 @@ +forum = new Daemon_Forum($this->dbClient); + $this->channels = $this->activeCharacter->getForumChannels(); + $this->channelId = isset($_GET['v']) ? $_GET['v'] : null; + if(!isset($this->channels[$this->channelId])) + $this->channelId = 'public'; + $this->writeAccess = !empty($this->channels[$this->channelId]['writable']); + } + + + public function prepareView() + { + $listLimit = max(1, (int) $this->dbCfg->listLimitMessages); + $listOffset = isset($_GET['n']) ? (int) $_GET['n'] : 0; + + $this->pageSubtitleUseQuery = true; + $from = isset($_GET['from']) ? (int) $_GET['from'] : 0; + $data = $this->forum->getChat($listLimit, $from, $this->channelId); + + foreach($data['list'] as &$row) + $row['content'] = Daemon::formatMessage($row['content'], true); + $this->view->inputMsg = isset($_POST['msg']) ? $_POST['msg'] : null; + $this->view->list = $data['list']; + + $this->view->menu = $this->view->getChatMenu($this->channels, $this->channelId); + $this->view->nextUrl = $data['next'] ? '?from='.urlencode($data['next']) : null; + $this->view->channelId = $this->channelId; + $this->view->writeAccess = $this->writeAccess; + } + + + protected function runCommands() + { + if($this->writeAccess && isset($_POST['msg'])) + { + $this->forum->addChat($this->player->getCharacterId(), $this->channelId, $_POST['msg']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Chat($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/clan.php b/2013/daemon/public/clan.php new file mode 100644 index 0000000..f0eaab5 --- /dev/null +++ b/2013/daemon/public/clan.php @@ -0,0 +1,129 @@ +clan = new Daemon_DbObject_Clan; + if($this->activeCharacter->clan_id) + { + $this->clan->attachDbClient($this->dbClient); + $this->clan->get(array('clan_id' => $this->activeCharacter->clan_id)); + if($this->clan->leader_id) + $this->isLeader = ($this->clan->leader_id == $this->activeCharacter->character_id); + } + } + + + public function prepareView() + { + if($this->clan->clan_id) + $this->prepareViewMember(); + else $this->prepareViewSolo(); + } + + + private function prepareViewMember() + { + $this->view->clan = $this->clan; + $this->view->preview = Daemon::formatMessage($this->clan->description, true); + $this->view->isLeader = $this->isLeader; + $this->view->members = $this->clan->getMembers($this->activeCharacter->character_id); + $invitations = $this->clan->getInvitations(); + foreach($invitations as &$row) + $row['description'] = Daemon::formatMessage($row['description'], true); + $this->view->invitations = $invitations; + } + + + private function prepareViewSolo() + { + $this->view->invitations = $this->activeCharacter->getInvitations(); + } + + + public function runCommands() + { + if($this->clan->clan_id) + return $this->runCommandsMember(); + else return $this->runCommandsSolo(); + } + + + private function runCommandsMember() + { + if($this->isLeader) + { + if(isset($_POST['accept'])) + { + $forum = new Daemon_Forum($this->dbClient); + $this->clan->acceptCharacter($_POST['accept'], $forum); + return true; + } + if(isset($_POST['kick'])) + { + $forum = new Daemon_Forum($this->dbClient); + $this->clan->kickMember($_POST['kick'], $forum); + return true; + } + if(isset($_POST['setLeader'], $_POST['desc'])) + { + if($_POST['setLeader'] && ($_POST['setLeader'] != $this->clan->leader_id)) + { + $this->clan->leader_id = $_POST['setLeader']; + $this->isLeader = false; + } + $this->clan->description = $_POST['desc']; + $this->clan->put(); + return true; + } + if(isset($_POST['disband'])) + { + $this->clan->delete(); + $this->clan = new Daemon_DbObject_Clan; + $this->activeCharacter->clan_id = null; + return true; + } + } + if(isset($_POST['leave'])) + { + $this->activeCharacter->clan_id = null; + $this->activeCharacter->put(); + return true; + } + } + + + private function runCommandsSolo() + { + if(isset($_POST['join'], $_POST['desc'])) + { + $forum = new Daemon_Forum($this->dbClient); + $this->activeCharacter->inviteClan($_POST['join'], $_POST['desc'], $forum); + return true; + } + if(isset($_POST['create'], $_POST['id'], $_POST['name'])) + { + $this->activeCharacter->createClan($_POST['id'], $_POST['name']); + $this->prepareModel(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/duel.php b/2013/daemon/public/duel.php new file mode 100644 index 0000000..8f35305 --- /dev/null +++ b/2013/daemon/public/duel.php @@ -0,0 +1,39 @@ +view->combatLog = $this->combatLog; + } + + + public function runCommands() + { + //attack + if(isset($_POST['attack'])) + { + $this->view->setGameHeader($this->player->getPlayerId(), + $this->activeCharacter, $this->characterData, $this->location); + $this->combatLog = $this->characterData->attack($this->view, $_POST['attack'], $this->location->type); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Duel($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/edit-account.php b/2013/daemon/public/edit-account.php new file mode 100644 index 0000000..72aa5d1 --- /dev/null +++ b/2013/daemon/public/edit-account.php @@ -0,0 +1,41 @@ +view->player = $this->player; + $this->view->skins = array_keys(Daemon_Dictionary::$skinDirUrls); + } + + + protected function runCommands() + { + //update player data + if(isset($_POST['name'], $_POST['pass1'], $_POST['pass2'], $_POST['skin'], $_POST['email'])) + { + if($_POST['pass1'] || $_POST['pass2']) + $this->player->setPassword($_POST['pass1'], $_POST['pass2']); + $_POST['name'] = Daemon::normalizeString($_POST['name']); + $this->player->name = $_POST['name'] ? $_POST['name'] : null; + $this->player->skin = $_POST['skin'] ? $_POST['skin'] : null; + $this->player->email = $_POST['email'] ? $_POST['email'] : null; + $this->player->put(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/edit-character.php b/2013/daemon/public/edit-character.php new file mode 100644 index 0000000..b79357a --- /dev/null +++ b/2013/daemon/public/edit-character.php @@ -0,0 +1,60 @@ +character = new Daemon_DbObject_Character; + if($id) + { + $this->character->attachDbClient($this->dbClient); + $params = array('character_id' => $id, 'player_id' => $this->player->getPlayerId()); + $this->character->get($params); + } + if(!$this->character->character_id) + { + Daemon_MsgQueue::add('Wybrana postać nie istnieje.'); + Daemon::redirect($this->cfg->getUrl('map')); + exit; + } + } + + + public function prepareView() + { + $this->pageSubtitleDetails = $this->character->name; + $this->view->character = $this->character; + $this->view->preview = Daemon::formatMessage($this->character->description, true); + } + + + protected function runCommands() + { + //update character + if(isset($_POST['avatar'], $_POST['quote'], $_POST['desc'])) + { + $this->character->show_player = !empty($_POST['player']); + $this->character->avatar_url = $_POST['avatar']; + $this->character->quote = $_POST['quote']; + $this->character->description = $_POST['desc']; + $this->character->put(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Account($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/index.php b/2013/daemon/public/index.php new file mode 100644 index 0000000..4de6119 --- /dev/null +++ b/2013/daemon/public/index.php @@ -0,0 +1,27 @@ +news = new Daemon_News($this->dbClient); + } + + + public function prepareView() + { + $this->view->loginEnabled = (bool) $this->dbCfg->loginEnabled; + $this->view->news = $this->news->getEntries(3, false); + } +} + + +$ctrl = new Daemon_Controller_Index($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/inventory.php b/2013/daemon/public/inventory.php new file mode 100644 index 0000000..1f66cc7 --- /dev/null +++ b/2013/daemon/public/inventory.php @@ -0,0 +1,106 @@ +inventory = new Daemon_Inventory($this->dbClient, $this->characterData); + } + + + public function prepareView() + { + if($this->eventLog) + { + $this->pageSubtitle = 'Użycie przedmiotu'; + $this->view->eventLog = $this->eventLog; + } + else $this->view->eventLog = null; + $items = $this->inventory->getItems('inventory'); + $this->view->equipmentSlots = Daemon_Dictionary::$equipmentSlots; + //prepare items + $cmdNames = Daemon_Dictionary::$equipmentButtons; + foreach($items as &$row) + { + if($row['equipped']) + $cmd = 'unequip'; + elseif('item' != $row['item']->type) + $cmd = 'equip'; + else $cmd = 'use'; + if(isset($cmdNames[$cmd])) + { + $row['item']->_cmdType = $cmd; + $row['item']->_cmdName = $cmdNames[$cmd]; + } + else + { + $row['item']->_cmdType = null; + $row['item']->_cmdName = null; + } + $row['_showSlots'] = ('equip' == $cmd); + $row['_slots'] = $row['item']->getSlots(); + $row['_multiSlots'] = (count($row['_slots']) > 1); + } + $this->view->items = $this->inventory->groupItemsByType($items); + $this->view->equipment = $this->inventory->getEquipment($items); + //prepare combat stats + $unit = (array) $this->characterData->getCombatUnit(); + $attackTypes = Daemon_Dictionary::$combatAttackTypes; + $attackSpecials = Daemon_Dictionary::$combatAttackSpecials; + $armorSpecials = Daemon_Dictionary::$combatArmorSpecials; + $unit['type1_name'] = $unit['type1'] ? $attackTypes[$unit['type1']] : null; + $unit['type2_name'] = $unit['type2'] ? $attackTypes[$unit['type2']] : null; + $unit['sp1_name'] = $unit['sp1_type'] ? $attackSpecials[$unit['sp1_type']] : null; + $unit['sp2_name'] = $unit['sp2_type'] ? $attackSpecials[$unit['sp2_type']] : null; + $unit['armor_sp_name'] = $unit['armor_sp_type'] ? $armorSpecials[$unit['armor_sp_type']] : null; + $this->view->combatStats = $unit; + } + + + protected function runCommands() + { + //equip item + if(isset($_POST['equip'], $_POST['slot'])) + { + $this->inventory->equip($_POST['equip'], $_POST['slot']); + $this->characterData->resetCombatStats(); + $this->characterData->put(); + return true; + } + //unequip item + if(isset($_POST['unequip'])) + { + $this->inventory->unequip($_POST['unequip']); + $this->characterData->resetCombatStats(); + $this->characterData->put(); + return true; + } + //use item + if(isset($_POST['use'])) + { + $handler = new Daemon_Item(); + $handler->attachCharacterData($this->characterData); + $handler->attachDbClient($this->dbClient); + $handler->execute($this->view, $_POST['use']); + $this->eventLog = $handler->getUsageLog(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Inventory($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/mail.php b/2013/daemon/public/mail.php new file mode 100644 index 0000000..5b88fdc --- /dev/null +++ b/2013/daemon/public/mail.php @@ -0,0 +1,67 @@ +forum = new Daemon_Forum($this->dbClient); + if(isset($_GET['to'])) + $_POST['to'] = $_GET['to']; + } + + + public function prepareView() + { + //fetch mail + $listLimit = max(1, (int) $this->dbCfg->listLimitMessages); + $listOffset = isset($_GET['n']) ? (int) $_GET['n'] : 0; + $characterId = (int) $this->activeCharacter->character_id; + + $this->pageSubtitleUseQuery = true; + $from = isset($_GET['from']) ? (int) $_GET['from'] : 0; + $data = $this->forum->getMail($listLimit, $from, $characterId); + foreach($data['list'] as &$row) + $row['content'] = Daemon::formatMessage($row['content'], true); + + //mark as read + if($data['list']) + { + $messageId = $data['list'][0]['message_id']; + $sql = "UPDATE characters SET last_mail_id = :messageId WHERE character_id = :characterId"; + $params = array('characterId' => $characterId, 'messageId' => $messageId); + $this->dbClient->query($sql, $params); + $this->activeCharacter->last_mail_id = $messageId; + } + + //display page + $this->view->inputTo = isset($_POST['to']) ? $_POST['to'] : null; + $this->view->inputMsg = isset($_POST['msg']) ? $_POST['msg'] : null; + $this->view->list = $data['list']; + $nextUrl = $data['next'] ? '?from='.urlencode($data['next']) : null; + $this->view->nextUrl = $nextUrl; + } + + + protected function runCommands() + { + if(isset($_POST['to'], $_POST['msg'])) + { + $this->forum->addMail($this->player->getCharacterId(), $_POST['to'], $_POST['msg']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Chat($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/map.php b/2013/daemon/public/map.php new file mode 100644 index 0000000..c544d8a --- /dev/null +++ b/2013/daemon/public/map.php @@ -0,0 +1,86 @@ +eventLog) + { + $this->pageSubtitle = 'Zdarzenie'; + $this->pageTemplatePath = 'event.xml'; + $this->view->eventLog = $this->eventLog; + return; + } + $bossStatuses = Daemon_Dictionary::$bossStatuses; + if(isset($bossStatuses[$this->location->boss_status])) + $this->location->boss_status_name = $bossStatuses[$this->location->boss_status]; + else + $this->location->boss_status_name = null; + $this->pageSubtitleDetails = $this->location->name; + $this->view->locationDesc = nl2br(htmlspecialchars($this->location->description)); + $this->view->pictureUrl = $this->location->getPictureUrl(); + $this->view->region = $this->location->getRegionName(); + $this->view->faction = $this->location->getFactionName(); + $this->view->maps = $this->location->getMaps(); + $this->view->paths = $this->location->getPaths(); + $this->view->services = $this->location->getServices(); + $this->view->lastMission = $this->characterData->getLastMission('completed'); + //prepare character list + $showAll = isset($_GET['more']); + $halfLimit = $showAll ? null : (int) ceil($this->dbCfg->listLimitCharacters/2); + $n = $this->location->getCharacterCount(2*$halfLimit+1); + $characters = $this->location->getCharacters($this->characterData, $halfLimit); + $this->view->characters = $characters; + $this->view->showMoreLink = !$showAll && ($n > 2*$halfLimit); + } + + + public function runCommands() + { + $isCommand = false; + //actions + if(isset($_POST['act'])) + { + switch($_POST['act']) + { + case'train': + $this->location->actionTrain(); + break; + case'rest': + $this->location->actionRest(); + break; + case'hunt': + $this->location->actionHunt(); + break; + } + $isCommand = true; + } + //travel + if(isset($_POST['travel'])) + { + $this->location->actionTravel($_POST['travel']); + $isCommand = true; + } + //run events + $this->view->setGameHeader($this->player->getPlayerId(), + $this->activeCharacter, $this->characterData, $this->location); + $this->eventLog = $this->characterData->runEvent($this->view); + //set "isCommand" flag + return $isCommand; + } +} + + +$ctrl = new Daemon_Controller_Map($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/news.php b/2013/daemon/public/news.php new file mode 100644 index 0000000..720a046 --- /dev/null +++ b/2013/daemon/public/news.php @@ -0,0 +1,33 @@ +news = new Daemon_News($this->dbClient); + } + + + public function prepareView() + { + $this->view->feedId = $this->cfg->applicationUrl; + $this->view->feedUrl = "{$this->cfg->applicationUrl}news"; + $this->view->feedTitle = $this->cfg->applicationTitle; + $this->view->feedUpdated = $this->news->getLastUpdated(); + $this->view->entries = $this->news->getEntries(10, true); + } +} + + +$ctrl = new Daemon_Controller_News($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/not-implemented.html b/2013/daemon/public/not-implemented.html new file mode 100644 index 0000000..045a1da --- /dev/null +++ b/2013/daemon/public/not-implemented.html @@ -0,0 +1,6 @@ + + + +Błąd +

Wybrana strona jeszcze nie istnieje.

+ diff --git a/2013/daemon/public/register.php b/2013/daemon/public/register.php new file mode 100644 index 0000000..d6ef0e8 --- /dev/null +++ b/2013/daemon/public/register.php @@ -0,0 +1,40 @@ +registerEnabled = (bool) $this->dbCfg->registerEnabled; + } + + + public function prepareView() + { + $this->view->registerEnabled = $this->registerEnabled; + } + + + protected function runCommands() + { + if(!$this->registerEnabled) + Daemon_MsgQueue::add('Rejestracja wyłączona.'); + elseif(isset($_POST['login'], $_POST['pass'], $_POST['pass2'])) + { + $this->player->register($_POST['login'], $_POST['pass'], $_POST['pass2']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Register($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/reset-password.php b/2013/daemon/public/reset-password.php new file mode 100644 index 0000000..948fd43 --- /dev/null +++ b/2013/daemon/public/reset-password.php @@ -0,0 +1,38 @@ +registerEnabled = (bool) $this->dbCfg->registerEnabled; + } + + + protected function runCommands() + { + if(isset($_POST['login'], $_POST['email'], $_POST['pass'], $_POST['pass2'])) + { + $this->player->preparePasswordReset($_POST['login'], $_POST['email'], $_POST['pass'], $_POST['pass2']); + return true; + } + elseif (isset($_GET['key'])) + { + $this->player->resetPassword($_GET['key']); + return true; + } + return false; + } + +} + + +$ctrl = new Daemon_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/respawn.php b/2013/daemon/public/respawn.php new file mode 100644 index 0000000..064212f --- /dev/null +++ b/2013/daemon/public/respawn.php @@ -0,0 +1,59 @@ +characterData->xp_used)) + { + Daemon_MsgQueue::add('Pamiętaj by wydać startowe doświadczenie.'); + Daemon::redirect($this->cfg->getUrl('character')); + exit; + } + $this->defaultRespawn = $this->dbCfg->defaultRespawn; + $this->gender = $this->characterData->_gender; + if(empty($this->location->location_id)) + $this->respawns = $this->characterData->getRespawns($this->defaultRespawn); + else + { + Daemon_MsgQueue::add('Już posiadasz powłokę cielesną.'); + Daemon::redirect($this->cfg->getUrl('map')); + exit; + } + } + + + public function prepareView() + { + $this->view->respawns = $this->respawns; + $this->view->firstOne = empty($this->characterData->deaths); + $this->view->rolloversEnabled = (bool) $this->dbCfg->rolloversEnabled; + } + + + protected function runCommands() + { + if(isset($_POST['respawn'])) + { + $this->characterData->respawn($_POST['respawn'], $this->defaultRespawn); + Daemon::redirect($this->cfg->getUrl('map')); + exit; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Respawn($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/robots.txt b/2013/daemon/public/robots.txt new file mode 100644 index 0000000..5d856c8 --- /dev/null +++ b/2013/daemon/public/robots.txt @@ -0,0 +1,2 @@ +User-Agent: * +Allow: * diff --git a/2013/daemon/public/rules.php b/2013/daemon/public/rules.php new file mode 100644 index 0000000..f542c4c --- /dev/null +++ b/2013/daemon/public/rules.php @@ -0,0 +1,21 @@ +view->lastModified = date(DATE_RFC1123, filemtime($this->cfg->getFilePath('tpl', 'rules.xml'))); + } +} + + +$ctrl = new Daemon_Controller_Rules($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/arena.php b/2013/daemon/public/scyzoryk/arena.php new file mode 100644 index 0000000..63e802d --- /dev/null +++ b/2013/daemon/public/scyzoryk/arena.php @@ -0,0 +1,126 @@ +selectMode = isset($_POST['mode']) ? $_POST['mode'] : null; + $this->combatCount = isset($_POST['n']) ? min(500, max(100, (int) $_POST['n'])) : 100; + $this->unitIdA = isset($_POST['unitA']) ? $_POST['unitA'] : null; + $this->unitIdB = isset($_POST['unitB']) ? $_POST['unitB'] : null; + } + + + public function prepareView() + { + $this->view->selectMode = $this->selectMode; + $this->view->combatCount = $this->combatCount; + $this->view->unitIdA = $this->unitIdA; + $this->view->unitIdB = $this->unitIdB; + $this->view->winsA = round(100 * $this->winsA / $this->combatCount, 2); + $this->view->winsB = round(100 * $this->winsB / $this->combatCount, 2); + $this->view->draws = round(100 * $this->draws / $this->combatCount, 2); + $this->view->doubleKOs = round(100 * $this->doubleKOs / $this->combatCount, 2); + $this->view->healthSumA = round(100 * $this->healthSumA / $this->combatCount, 2); + $this->view->healthSumB = round(100 * $this->healthSumB / $this->combatCount, 2); + $this->view->healthMinA = round(100 * $this->healthMinA, 2); + $this->view->healthMinB = round(100 * $this->healthMinB, 2); + $this->view->healthMaxA = round(100 * $this->healthMaxA, 2); + $this->view->healthMaxB = round(100 * $this->healthMaxB, 2); + + $filter = new Daemon_Scyzoryk_Filter('combat-units'); + $filter->noChars = false; + $unitsC = $unitsM = array(); + foreach ($this->browser->getCombatUnits($filter) as $row) + { + if ($row['_character']) + $unitsC[] = $row; + else + $unitsM[] = $row; + } + $this->view->unitsC = $unitsC; + $this->view->unitsM = $unitsM; + } + + + public function runCommands() + { + if(isset($_POST['attack'])) + { + if(!$this->unitIdA || !$this->unitIdB) + { + Daemon_MsgQueue::add('Wybierz obie jednostki.'); + return true; + } + $this->winsA = 0; + $this->winsB = 0; + $this->draws = 0; + $this->doubleKOs = 0; + $this->healthSumA = 0; + $this->healthSumB = 0; + $unitA = new Daemon_Combat_Unit(); + $unitA->attachDbClient($this->dbClient); + $unitA->get(array('combat_unit_id' => $this->unitIdA)); + $unitB = new Daemon_Combat_Unit(); + $unitB->attachDbClient($this->dbClient); + $unitB->get(array('combat_unit_id' => $this->unitIdB)); + $this->healthMinA = 1.0; + $this->healthMinB = 1.0; + $this->healthMaxA = 0.0; + $this->healthMaxB = 0.0; + for ($i = 0; $i < $this->combatCount; ++$i) + { + $unitA->health = $unitA->health_max; + $unitB->health = $unitB->health_max; + $combat = new Daemon_Combat(); + $combat->addUnit('a', $unitA, true); + $combat->addUnit('b', $unitB, false); + $combat->execute(true); + $deathA = ($unitA->health < 1); + $deathB = ($unitB->health < 1); + if ($deathA && $deathB) + $this->doubleKOs += 1; + elseif ($deathA) + $this->winsB += 1; + elseif ($deathB) + $this->winsA += 1; + else + $this->draws += 1; + $relHealthA = max(0.0, $unitA->health / $unitA->health_max); + $relHealthB = max(0.0, $unitB->health / $unitB->health_max); + $this->healthSumA += $relHealthA; + $this->healthSumB += max(0.0, $relHealthB); + $this->healthMinA = min($this->healthMinA, $relHealthA); + $this->healthMinB = min($this->healthMinB, $relHealthB); + $this->healthMaxA = max($this->healthMaxA, $relHealthA); + $this->healthMaxB = max($this->healthMaxB, $relHealthB); + } + return true; + } + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/character-edit.php b/2013/daemon/public/scyzoryk/character-edit.php new file mode 100644 index 0000000..35380bd --- /dev/null +++ b/2013/daemon/public/scyzoryk/character-edit.php @@ -0,0 +1,98 @@ +character = new Daemon_DbObject_Character(); + $this->character->attachDbClient($this->dbClient); + $this->character->get(array('character_id' => $this->editId)); + if (empty($this->character->character_id)) + { + Daemon_MsgQueue::add('Wybrana postać nie istnieje.'); + Daemon::redirect($this->cfg->getUrl('scyzoryk/characters')); + exit; + } + $this->characterData = $this->character->getCharacterData(); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->character ? $this->character->name : null; + $this->view->character = $this->character; + $this->view->characterData = $this->characterData; + $this->view->genders = Daemon_Dictionary::$genders; + } + + + protected function runCommands() + { + if(is_null($this->character)) + return false; + if(isset($_POST['save'])) + { + $this->character->name = Daemon::getArrayValue($_POST, 'name'); + $this->character->gender = Daemon::getArrayValue($_POST, 'gender'); + $this->character->last_action = Daemon::getArrayValue($_POST, 'last_action'); + $this->character->clan_id = Daemon::getArrayValue($_POST, 'clan_id'); + $this->character->avatar_url = Daemon::getArrayValue($_POST, 'avatar_url'); + $this->character->quote = Daemon::getArrayValue($_POST, 'quote'); + $this->character->description = Daemon::getArrayValue($_POST, 'description'); + $this->character->put(); + return true; + } + if(isset($_POST['saveData'])) + { + $this->characterData->location_id = Daemon::getArrayValue($_POST, 'location_id'); + $this->characterData->faction_id = Daemon::getArrayValue($_POST, 'faction_id'); + $this->characterData->faction_points = (int) Daemon::getArrayValue($_POST, 'faction_points'); + $this->characterData->rank_id = (int) Daemon::getArrayValue($_POST, 'rank_id'); + $this->characterData->turns = (int) Daemon::getArrayValue($_POST, 'turns'); + $this->characterData->gold_purse = (int) Daemon::getArrayValue($_POST, 'gold_purse'); + $this->characterData->gold_bank = (int) Daemon::getArrayValue($_POST, 'gold_bank'); + $this->characterData->level = (int) Daemon::getArrayValue($_POST, 'level'); + $this->characterData->xp_free = (int) Daemon::getArrayValue($_POST, 'xp_free'); + $this->characterData->health = (int) Daemon::getArrayValue($_POST, 'health'); + $this->characterData->health_max = (int) Daemon::getArrayValue($_POST, 'health_max'); + $this->characterData->mana = (int) Daemon::getArrayValue($_POST, 'mana'); + $this->characterData->mana_max = (int) Daemon::getArrayValue($_POST, 'mana_max'); + $this->characterData->a_str = (int) Daemon::getArrayValue($_POST, 'a_str'); + $this->characterData->a_dex = (int) Daemon::getArrayValue($_POST, 'a_dex'); + $this->characterData->a_vit = (int) Daemon::getArrayValue($_POST, 'a_vit'); + $this->characterData->a_pwr = (int) Daemon::getArrayValue($_POST, 'a_pwr'); + $this->characterData->a_wil = (int) Daemon::getArrayValue($_POST, 'a_wil'); + $this->characterData->s_pstr = (int) Daemon::getArrayValue($_POST, 's_pstr'); + $this->characterData->s_patk = (int) Daemon::getArrayValue($_POST, 's_patk'); + $this->characterData->s_pdef = (int) Daemon::getArrayValue($_POST, 's_pdef'); + $this->characterData->s_pres = (int) Daemon::getArrayValue($_POST, 's_pres'); + $this->characterData->s_preg = (int) Daemon::getArrayValue($_POST, 's_preg'); + $this->characterData->s_mstr = (int) Daemon::getArrayValue($_POST, 's_mstr'); + $this->characterData->s_matk = (int) Daemon::getArrayValue($_POST, 's_matk'); + $this->characterData->s_mdef = (int) Daemon::getArrayValue($_POST, 's_mdef'); + $this->characterData->s_mres = (int) Daemon::getArrayValue($_POST, 's_mres'); + $this->characterData->s_mreg = (int) Daemon::getArrayValue($_POST, 's_mreg'); + $this->characterData->sp_scout = (int) Daemon::getArrayValue($_POST, 'sp_scout'); + $this->characterData->sp_identify = (int) Daemon::getArrayValue($_POST, 'sp_identify'); + $this->characterData->sp_vchar = (int) Daemon::getArrayValue($_POST, 'sp_vchar'); + $this->characterData->sp_vmonster = (int) Daemon::getArrayValue($_POST, 'sp_vmonster'); + $this->characterData->sp_vitem = (int) Daemon::getArrayValue($_POST, 'sp_vitem'); + $this->characterData->put(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/characters.php b/2013/daemon/public/scyzoryk/characters.php new file mode 100644 index 0000000..263a68e --- /dev/null +++ b/2013/daemon/public/scyzoryk/characters.php @@ -0,0 +1,30 @@ +dbClient->selectAll($sql); +/* + foreach ($data as &$row) + $row['characters'] = explode("\n", $row['characters']); +*/ + $this->view->rows = $data; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/combat-unit-edit.php b/2013/daemon/public/scyzoryk/combat-unit-edit.php new file mode 100644 index 0000000..7028005 --- /dev/null +++ b/2013/daemon/public/scyzoryk/combat-unit-edit.php @@ -0,0 +1,51 @@ +unit = new Daemon_DbObject_CombatUnit(); + $this->unit->attachDbClient($this->dbClient); + if($this->editId) + $this->unit->get(array('combat_unit_id' => $this->editId)); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->unit ? $this->unit->name : null; + $this->view->unit = $this->unit; + $this->view->attackTypes = Daemon_Dictionary::$combatAttackTypes; + $this->view->attackSpecials = Daemon_Dictionary::$combatAttackSpecials; + $this->view->armorSpecials = Daemon_Dictionary::$combatArmorSpecials; + } + + + protected function runCommands() + { + if(isset($_POST['combat_unit_id'])) + { + if(!$_POST['combat_unit_id']) + { + Daemon_MsgQueue::add('Uzupełnij ID.'); + return true; + } + $this->unit->import($_POST); + $this->unit->put(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/combat-units.php b/2013/daemon/public/scyzoryk/combat-units.php new file mode 100644 index 0000000..fe93a07 --- /dev/null +++ b/2013/daemon/public/scyzoryk/combat-units.php @@ -0,0 +1,61 @@ +filter = new Daemon_Scyzoryk_Filter('combat-units'); + } + + + protected function prepareView() + { + $this->view->filter = $this->filter; + $units = array(); + foreach ($this->browser->getCombatUnits($this->filter) as $row) + if (!$row['_character']) + $units[] = $row; + $this->view->units = $units; + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName']) && $_POST['newId']) + { + $object = new Daemon_DbObject_CombatUnit(); + $object->attachDbClient($this->dbClient); + $object->combat_unit_id = $_POST['newId']; + $object->name = $_POST['newName']; + $object->put(); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteCombatUnits($_POST['del']); + return true; + } + //set filter + if(isset($_POST['filter']) && is_array($_POST['filter'])) + { + foreach($_POST['filter'] as $name => $value) + $this->filter->$name = $value; + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/config-generator.php b/2013/daemon/public/scyzoryk/config-generator.php new file mode 100644 index 0000000..6757934 --- /dev/null +++ b/2013/daemon/public/scyzoryk/config-generator.php @@ -0,0 +1,51 @@ +dbCfg = new Daemon_DbConfig($this->dbClient); + $this->itemTypes = Daemon_Dictionary::$generatorItemTypes; + } + + + protected function prepareView() + { + $this->view->generatorBaseValue = $this->dbCfg->generatorBaseValue; + $generatorOptions = array(); + foreach ($this->itemTypes as $type => $name) + { + $generatorOptions[$type] = array( + 'name' => $name, + 'weights' => $this->dbCfg->getGeneratorWeights("$type") + ); + } + $this->view->generatorOptions = $generatorOptions; + } + + + protected function runCommands() + { + if(isset($_POST['baseValue'], $_POST['weights']) && is_array($_POST['weights'])) + { + $this->dbCfg->generatorBaseValue = max(1, (int) $_POST['baseValue']); + foreach (array_keys($this->itemTypes) as $type) + $this->dbCfg->setGeneratorWeights($type, $_POST['weights'][$type]); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Config($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/config.php b/2013/daemon/public/scyzoryk/config.php new file mode 100644 index 0000000..35a91a3 --- /dev/null +++ b/2013/daemon/public/scyzoryk/config.php @@ -0,0 +1,49 @@ +dbCfg = new Daemon_DbConfig($this->dbClient); + } + + + protected function prepareView() + { + $this->view->cfg = $this->dbCfg; + //healer + $healer = explode(',', $this->dbCfg->healer); + if(!isset($healer[0], $healer[1], $healer[2], $healer[3])) + $healer = array(null, null, null, null); + $this->view->healer = $healer; + } + + + protected function runCommands() + { + if(isset($_POST['cfg']) && is_array($_POST['cfg'])) + { + $cfg = $_POST['cfg']; + if(isset($_POST['healer']) && is_array($_POST['healer'])) + $cfg['healer'] = implode(',', $_POST['healer']); + else $cfg['healer'] = '1,1,1,1'; + ksort($cfg); + foreach($cfg as $name => $value) + $this->dbCfg->$name = $value; + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Config($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/cron-ui.php b/2013/daemon/public/scyzoryk/cron-ui.php new file mode 100644 index 0000000..38029bf --- /dev/null +++ b/2013/daemon/public/scyzoryk/cron-ui.php @@ -0,0 +1,20 @@ + + + + +Cron +
+

+
+ diff --git a/2013/daemon/public/scyzoryk/event-edit.php b/2013/daemon/public/scyzoryk/event-edit.php new file mode 100644 index 0000000..4d42cc7 --- /dev/null +++ b/2013/daemon/public/scyzoryk/event-edit.php @@ -0,0 +1,45 @@ +editObj = new Daemon_DbObject_Event(); + $this->editObj->attachDbClient($this->dbClient); + if($this->editId) + $this->editObj->get(array('event_id' => $this->editId)); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->editObj ? $this->editObj->name : null; + $this->view->editObj = $this->editObj; + } + + + protected function runCommands() + { + if(isset($_POST['event_id'])) + { + $this->editObj->import($_POST); + if($_POST['event_id']) + $this->editObj->put(); + else Daemon_MsgQueue::add('Uzupełnij ID.'); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_EventEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/events.php b/2013/daemon/public/scyzoryk/events.php new file mode 100644 index 0000000..27e6ecf --- /dev/null +++ b/2013/daemon/public/scyzoryk/events.php @@ -0,0 +1,43 @@ +view->items = $this->dbClient->selectAll($sql); + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName']) && $_POST['newId']) + { + $object = new Daemon_DbObject_Event(); + $object->attachDbClient($this->dbClient); + $object->event_id = $_POST['newId']; + $object->name = $_POST['newName']; + $object->put(); + return true; + } + //delete rows + if(isset($_POST['del']) && is_array($_POST['del'])) + { + $this->editor->deleteRows('events', 'event_id', $_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Events($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/faction-edit.php b/2013/daemon/public/scyzoryk/faction-edit.php new file mode 100644 index 0000000..3c97e0c --- /dev/null +++ b/2013/daemon/public/scyzoryk/faction-edit.php @@ -0,0 +1,65 @@ +faction = $this->editor->selectRow('Daemon_Scyzoryk_DbRowFaction', $this->editId); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->faction ? $this->faction->name : null; + $this->view->faction = $this->faction; + $this->view->factionRanks = $this->browser->getFactionRanks($this->editId); + $this->view->titles = $this->browser->getTitles(); + } + + + protected function runCommands() + { + if(is_null($this->faction)) + return false; + if(isset($_POST['id'], $_POST['name']) && $_POST['id']) + { + $this->faction->faction_id = $_POST['id']; + $this->faction->name = $_POST['name']; + $this->faction->power = $_POST['power']; + $this->editor->updateRow($this->faction); + return true; + } + //add rank + if(isset($_POST['addRank'], $_POST['id']) && $_POST['id']) + { + $params = array( + 'faction_id' => $this->editId, + 'rank_id' => (int) $_POST['id'], + 'min_points' => (int) Daemon::getArrayValue($_POST, 'min_points'), + 'title_id' => Daemon::getArrayValue($_POST, 'title_id'), + ); + $row = new Daemon_Scyzoryk_DbRowFactionRank($params); + $this->editor->updateRow($row); + return true; + } + //delete ranks + if(isset($_POST['del'])) + { + $this->editor->deleteFactionRanks($this->editId, $_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_FactionEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/factions.php b/2013/daemon/public/scyzoryk/factions.php new file mode 100644 index 0000000..c4e4836 --- /dev/null +++ b/2013/daemon/public/scyzoryk/factions.php @@ -0,0 +1,40 @@ +view->factions = $this->browser->getFactions(); + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName']) && $_POST['newId']) + { + $params = array('faction_id' => $_POST['newId'], 'name' => $_POST['newName']); + $this->editor->updateRow(new Daemon_Scyzoryk_DbRowFaction($params)); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteFactions($_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Factions($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/generator.php b/2013/daemon/public/scyzoryk/generator.php new file mode 100644 index 0000000..35e733e --- /dev/null +++ b/2013/daemon/public/scyzoryk/generator.php @@ -0,0 +1,205 @@ +dbCfg = new Daemon_DbConfig($this->dbClient); + $this->itemWeaponTypes = Daemon_Dictionary::$itemWeaponTypes; + unset($this->itemWeaponTypes['']); + $this->itemArmorTypes = Daemon_Dictionary::$itemArmorTypes; + unset($this->itemArmorTypes['']); + $this->itemTemplates = $this->browser->getItemTemplates(); + } + + + protected function prepareView() + { + $this->view->itemWeaponTypes = $this->itemWeaponTypes; + $this->view->itemArmorTypes = $this->itemArmorTypes; + $this->view->itemTemplates = $this->itemTemplates; + } + + + protected function runCommands() + { + //generate random item + if (isset($_POST['generate'], $_POST['id'], $_POST['name'], + $_POST['type'], $_POST['value'], $_POST['template'])) + { + if (empty($_POST['id'])) + { + Daemon_MsgQueue::add('Musisz wybrać ID.'); + return true; + } + if (empty($_POST['template'])) + { + Daemon_MsgQueue::add('Musisz wybrać szablon przedmiotu.'); + return true; + } + $item = $this->generateItem($_POST['id'], $_POST['name'], + $_POST['type'], $_POST['value'], $_POST['template']); + if ($item && ($item->item_id)) + { + $item->attachDbClient($this->dbClient); + $item->put(); + $url = $this->cfg->getUrl('scyzoryk/item-edit?id='.urlencode($item->item_id)); + Daemon::redirect($url); + exit; + } + return true; + } + //merge items + if (isset($_POST['merge'], $_POST['id'], $_POST['name'])) + { + //multipliers + $this->weightA = isset($_POST['weightA']) ? max(1, (int) $_POST['weightA']) : 1; + $this->weightB = isset($_POST['weightB']) ? max(1, (int) $_POST['weightB']) : 1; + //base items + $baseItemA = new Daemon_DbObject_Item(); + $baseItemA->attachDbClient($this->dbClient); + if(isset($_POST['baseA'])) + $baseItemA->get(array('item_id' => $_POST['baseA'])); + $baseItemB = new Daemon_DbObject_Item(); + $baseItemB->attachDbClient($this->dbClient); + if(isset($_POST['baseB'])) + $baseItemB->get(array('item_id' => $_POST['baseB'])); + //result item + $resultItem = new Daemon_DbObject_Item(); + $resultItem->attachDbClient($this->dbClient); + if($this->editId) + $resultItem->get(array('item_id' => $this->editId)); + $resultItem->item_id = $_POST['id']; + $resultItem->name = $_POST['name']; + $resultItem->type = $baseItemA->type; + $resultItem->damage_type = $baseItemA->damage_type; + $resultItem->special_type = $baseItemA->special_type; + $resultItem->regen = ($baseItemA->regen + $baseItemB->regen) / 2; + //merge values + $keys = array('value', 'special_param', + 'pstr_p', 'pstr_c', 'patk_p', 'patk_c', + 'pdef_p', 'pdef_c', 'pres_p', 'pres_c', + 'mstr_p', 'mstr_c', 'matk_p', 'matk_c', + 'mdef_p', 'mdef_c', 'mres_p', 'mres_c', + 'armor', 'speed', 'regen'); + foreach ($keys as $k) + $resultItem->$k = $this->mergeValues($baseItemA->$k, $baseItemB->$k); + //save item + if ($resultItem->item_id) + { + $resultItem->validate(); + $resultItem->updateSuggestedValue($this->dbCfg); + $resultItem->put(); + Daemon::redirect($this->cfg->getUrl('scyzoryk/item-edit?id='.urlencode($resultItem->item_id))); + exit; + } + return true; + } + } + + + private function mergeValues($valueA, $valueB) + { + $x = $this->weightA * (int) $valueA + $this->weightB * (int) $valueB; + $y = max(1, $this->weightA + $this->weightB); + return round($x / $y); + } + + + private function generateItem($id, $name, $type, $value, $templateId) + { + //initialise + $item = new Daemon_DbObject_Item(); + $item->item_id = $id; + $item->name = $name; + $isWeapon = false; + $isArmor = false; + if (isset($this->itemWeaponTypes[$type])) + { + $isWeapon = true; + $item->type = $_POST['type']; + $item->damage_type = 'p'; + } + elseif (isset($this->itemArmorTypes[$type])) + { + $isArmor = true; + $item->type = $_POST['type']; + } + if (!$isWeapon && !$isArmor) + { + Daemon_MsgQueue::add('Wybierz typ przedmiotu.'); + return null; + } + //read chances + $chances = array(); + $template = new Daemon_DbObject_ItemTemplate(); + $template->attachDbClient($this->dbClient); + $template->get(array('id' => $templateId)); + foreach (get_object_vars($template) as $key => $val) + { + if (($key[0] != '_') && !empty($val) && is_numeric($val)) + $chances[$key] = (float) $val; + } + //generate stats + $specialKeys = array('armor', 'speed', 'regen'); + while ($item->suggested_value < $value) + { + $chanceKey = $this->getRandomKey($chances); + unset($matches); + preg_match('/^(.+)_([^_]+)$/', $chanceKey, $matches); + if (isset($matches[0], $matches[1])) + { + $key = $matches[1]; + $sign = ($matches[2] != 'm') ? +1 : -1; + $item->$key += $sign; + } + else + { + Daemon_MsgQueue::add('Ten szablon nie nadaje się do generowania - suma szans nie jest dodatnia.'); + return null; + } + $item->updateSuggestedValue($this->dbCfg); + } + //set price + $item->value = round($item->suggested_value); + return $item; + } + + + private function getRandomKey(array $chances) + { + $chanceSum = array_sum($chances); + if ($chanceSum < 1) + return null; + $key = null; + $d256 = mt_rand(0, 255); + foreach ($chances as $key => $val) + { + $chance = 256 * $val / $chanceSum; + if($d256 < $chance) + break; + $d256 -= $chance; + } + return $key; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/index.php b/2013/daemon/public/scyzoryk/index.php new file mode 100644 index 0000000..e895056 --- /dev/null +++ b/2013/daemon/public/scyzoryk/index.php @@ -0,0 +1,51 @@ +view->prices = $prices; + + //Ile bonusu powinien mieć przedmiot za potwora + $bonuses = array(); + $cecha = 0; + $cena = 0; + for ($i = 1; $i < 100; ++$i) + { + if ($i < 11) + $mnoz=3; + elseif ($cecha<31) + $mnoz=4; + else + $mnoz=5; + $cena = round($cena * 0.9 + $i * $mnoz); + $cecha += $mnoz; + $st = round($cecha * $i / (100+$i)); + $bonuses[] = array('bonusp' => $i, 'bonusc' => $st, 'price' => $cena); + } + $this->view->bonuses = $bonuses; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Index($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/info.php b/2013/daemon/public/scyzoryk/info.php new file mode 100644 index 0000000..2d324de --- /dev/null +++ b/2013/daemon/public/scyzoryk/info.php @@ -0,0 +1,19 @@ +dbCfg = new Daemon_DbConfig($this->dbClient); + $this->item = new Daemon_DbObject_Item(); + $this->item->attachDbClient($this->dbClient); + if($this->editId) + $this->item->get(array('item_id' => $this->editId)); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->item ? $this->item->name : null; + $this->view->item = $this->item; + $this->view->itemTypes = Daemon_Dictionary::$itemTypes; + $this->view->itemWeaponTypes = Daemon_Dictionary::$itemWeaponTypes; + $this->view->itemDamageTypes = Daemon_Dictionary::$itemDamageTypes; + $this->view->itemArmorTypes = Daemon_Dictionary::$itemArmorTypes; + $this->view->combatAttackSpecials = Daemon_Dictionary::$combatAttackSpecials; + $this->view->combatArmorSpecials = Daemon_Dictionary::$combatArmorSpecials; + $itemUsableSpecials = array(); + $sql = "SELECT special_id, name FROM item_specials ORDER BY name"; + foreach($this->dbClient->selectAll($sql) as $row) + $itemUsableSpecials[$row['special_id']] = $row['name']; + $this->view->itemSpecials = $itemUsableSpecials; + } + + + protected function runCommands() + { + if(is_null($this->item)) + return false; + if(isset($_POST['id'], $_POST['name'], $_POST['p']) && $_POST['id']) + { + $this->item->item_id = $_POST['id']; + $this->item->name = $_POST['name']; + $this->item->type = Daemon::getArrayValue($_POST, 'type'); + $this->item->value = Daemon::getArrayValue($_POST, 'value'); + $this->item->description = Daemon::getArrayValue($_POST, 'description'); + $this->item->damage_type = Daemon::getArrayValue($_POST, 'damage_type'); + $this->item->special_type = Daemon::getArrayValue($_POST, 'special_type'); + $this->item->special_param = Daemon::getArrayValue($_POST, 'special_param'); + $keys = array_keys(get_class_vars('Daemon_DbObject_Item')); + foreach($_POST['p'] as $key => $val) + if(in_array($key, $keys)) + $this->item->$key = $val; + $this->item->validate(); + $this->item->updateSuggestedValue($this->dbCfg); + $this->item->put(); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_ItemEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/item-template-edit.php b/2013/daemon/public/scyzoryk/item-template-edit.php new file mode 100644 index 0000000..5d0d0d4 --- /dev/null +++ b/2013/daemon/public/scyzoryk/item-template-edit.php @@ -0,0 +1,45 @@ +editObj = new Daemon_DbObject_ItemTemplate(); + $this->editObj->attachDbClient($this->dbClient); + if($this->editId) + $this->editObj->get(array('id' => $this->editId)); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->editObj ? $this->editObj->name : null; + $this->view->editObj = $this->editObj; + } + + + protected function runCommands() + { + if(isset($_POST['id'])) + { + $this->editObj->import($_POST); + if($_POST['id']) + $this->editObj->put(); + else Daemon_MsgQueue::add('Uzupełnij ID.'); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/item-templates.php b/2013/daemon/public/scyzoryk/item-templates.php new file mode 100644 index 0000000..f0f438a --- /dev/null +++ b/2013/daemon/public/scyzoryk/item-templates.php @@ -0,0 +1,42 @@ +view->rows = $this->browser->getItemTemplates(); + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName']) && $_POST['newId']) + { + $item = new Daemon_DbObject_ItemTemplate(); + $item->attachDbClient($this->dbClient); + $item->id = $_POST['newId']; + $item->name = $_POST['newName']; + $item->put(); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteItemTemplates($_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/items.php b/2013/daemon/public/scyzoryk/items.php new file mode 100644 index 0000000..3100f2d --- /dev/null +++ b/2013/daemon/public/scyzoryk/items.php @@ -0,0 +1,62 @@ +filter = new Daemon_Scyzoryk_Filter('items', array('type')); + } + + + protected function prepareView() + { + $this->view->filter = $this->filter; + $this->view->items = $this->browser->getItems($this->filter); + $this->view->itemTypes = Daemon_Dictionary::$itemTypes; + $this->view->itemWeaponTypes = Daemon_Dictionary::$itemWeaponTypes; + $this->view->itemDamageTypes = Daemon_Dictionary::$itemDamageTypes; + $this->view->itemArmorTypes = Daemon_Dictionary::$itemArmorTypes; + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName'], $_POST['newType']) && $_POST['newId']) + { + $item = new Daemon_DbObject_Item(); + $item->attachDbClient($this->dbClient); + $item->item_id = $_POST['newId']; + $item->name = $_POST['newName']; + $item->type = $_POST['newType']; + $item->put(); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteItems($_POST['del']); + return true; + } + //set filter + if(isset($_POST['filter']) && is_array($_POST['filter'])) + { + foreach($_POST['filter'] as $name => $value) + $this->filter->$name = $value; + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Items($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/location-edit.php b/2013/daemon/public/scyzoryk/location-edit.php new file mode 100644 index 0000000..4092cee --- /dev/null +++ b/2013/daemon/public/scyzoryk/location-edit.php @@ -0,0 +1,122 @@ +editObj = new Daemon_DbObject_Location(); + $this->editObj->attachDbClient($this->dbClient); + if($this->editId) + $this->editObj->get(array('location_id' => $this->editId)); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->editObj ? $this->editObj->name : null; + $this->view->editObj = $this->editObj; + $this->view->paths = $this->browser->getLocationPaths($this->editId); + $this->view->monsters = $this->browser->getLocationMonsters($this->editId); + $this->view->events = $this->browser->getLocationEvents($this->editId); + $this->view->services = $this->browser->getLocationServices($this->editId); + $this->view->regions = $this->browser->getRegions(); + $this->view->factions = $this->browser->getFactions(); + $this->view->locationTypes = Daemon_Dictionary::$locationTypes; + $this->view->bossStatuses = Daemon_Dictionary::$bossStatuses; + //event names + $sql = "SELECT event_id, name FROM events ORDER BY event_id"; + $this->view->eventNames = $this->dbClient->selectAll($sql); + //service names + $sql = "SELECT service_id, name, type FROM services ORDER BY service_id"; + $this->view->serviceNames = $this->dbClient->selectAll($sql); + } + + + protected function runCommands() + { + if(isset($_POST['location_id'])) + { + $this->editObj->import($_POST); + if($_POST['location_id']) + $this->editObj->put(); + else Daemon_MsgQueue::add('Uzupełnij ID.'); + return true; + } + //add path + if(isset($_POST['addPath'], $_POST['id']) && $_POST['id']) + { + $params = array('location_id' => $this->editId, 'destination_id' => $_POST['id']); + $row = new Daemon_Scyzoryk_DbRowLocationPath($params); + $this->editor->updateRow($row); + if(!empty($_POST['bidir'])) + { + $params = array('location_id' => $_POST['id'], 'destination_id' => $this->editId); + $row = new Daemon_Scyzoryk_DbRowLocationPath($params); + $this->editor->updateRow($row); + } + return true; + } + //delete paths + if(isset($_POST['delPaths'])) + { + $delPathsRev = (array) Daemon::getArrayValue($_POST, 'delPathsRev', array()); + $this->editor->deleteLocationPaths($this->editId, $_POST['delPaths'], $delPathsRev); + return true; + } + //add monster + if(isset($_POST['addMonster'], $_POST['id']) && $_POST['id']) + { + $params = array('location_id' => $this->editId, 'monster_id' => $_POST['id']); + $row = new Daemon_Scyzoryk_DbRowLocationMonster($params); + $this->editor->updateRow($row); + return true; + } + //delete monsters + if(isset($_POST['delMonster'])) + { + $this->editor->deleteLocationMonsters($this->editId, $_POST['delMonster']); + return true; + } + //add event + if(isset($_POST['addEvent'], $_POST['id']) && $_POST['id']) + { + $params = array('location_id' => $this->editId, 'event_id' => $_POST['id']); + $row = new Daemon_Scyzoryk_DbRowLocationEvent($params); + $this->editor->updateRow($row); + return true; + } + //delete events + if(isset($_POST['delEvent'])) + { + $this->editor->deleteLocationEvents($this->editId, $_POST['delEvent']); + return true; + } + //add service + if(isset($_POST['addService'], $_POST['id']) && $_POST['id']) + { + $params = array('location_id' => $this->editId, 'service_id' => $_POST['id']); + $row = new Daemon_Scyzoryk_DbRowLocationService($params); + $this->editor->updateRow($row); + return true; + } + //delete services + if(isset($_POST['delService'])) + { + $this->editor->deleteLocationServices($this->editId, $_POST['delService']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_LocationEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/location-event-edit.php b/2013/daemon/public/scyzoryk/location-event-edit.php new file mode 100644 index 0000000..98087fa --- /dev/null +++ b/2013/daemon/public/scyzoryk/location-event-edit.php @@ -0,0 +1,43 @@ +event = $this->editor->selectRow('Daemon_Scyzoryk_DbRowLocationEvent', $this->editId, $this->editId2); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->event ? 'edycja zdarzenia specjalnego' : null; + $this->view->event = $this->event; + } + + + protected function runCommands() + { + if(is_null($this->event)) + return false; + if(isset($_POST['chance'], $_POST['params'])) + { + $this->event->chance = $_POST['chance']; + $this->event->params = $_POST['params']; + $this->editor->updateRow($this->event); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_LocationEventEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/location-monster-edit.php b/2013/daemon/public/scyzoryk/location-monster-edit.php new file mode 100644 index 0000000..ea7006d --- /dev/null +++ b/2013/daemon/public/scyzoryk/location-monster-edit.php @@ -0,0 +1,42 @@ +monster = $this->editor->selectRow('Daemon_Scyzoryk_DbRowLocationMonster', $this->editId, $this->editId2); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->monster ? 'edycja zdarzenia-potwora' : null; + $this->view->monster = $this->monster; + } + + + protected function runCommands() + { + if(is_null($this->monster)) + return false; + if(isset($_POST['chance'])) + { + $this->monster->chance = $_POST['chance']; + $this->editor->updateRow($this->monster); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_LocationMonsterEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/location-path-edit.php b/2013/daemon/public/scyzoryk/location-path-edit.php new file mode 100644 index 0000000..2aca151 --- /dev/null +++ b/2013/daemon/public/scyzoryk/location-path-edit.php @@ -0,0 +1,44 @@ +path = $this->editor->selectRow('Daemon_Scyzoryk_DbRowLocationPath', $this->editId, $this->editId2); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->path ? 'edycja ścieżki' : null; + $this->view->path = $this->path; + } + + + protected function runCommands() + { + if(is_null($this->path)) + return false; + if(isset($_POST['name'])) + { + $this->path->name = $_POST['name']; + $this->path->cost_gold = Daemon::getArrayValue($_POST, 'cost_gold'); + $this->path->cost_mana = Daemon::getArrayValue($_POST, 'cost_mana'); + $this->editor->updateRow($this->path); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_LocationPathEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/locations.php b/2013/daemon/public/scyzoryk/locations.php new file mode 100644 index 0000000..9473fd9 --- /dev/null +++ b/2013/daemon/public/scyzoryk/locations.php @@ -0,0 +1,60 @@ +filter = new Daemon_Scyzoryk_Filter('locations', array('region_id')); + } + + + protected function prepareView() + { + $this->view->filter = $this->filter; + $this->view->locations = $this->browser->getLocations($this->filter); + $this->view->regions = $this->browser->getRegions(); + $this->view->locationTypes = Daemon_Dictionary::$locationTypes; + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName'], $_POST['newRegion']) && $_POST['newId']) + { + $object = new Daemon_DbObject_Location(); + $object->attachDbClient($this->dbClient); + $object->location_id = $_POST['newId']; + $object->name = $_POST['newName']; + $object->region_id = $_POST['newRegion']; + $object->put(); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteLocations($_POST['del']); + return true; + } + //set filter + if(isset($_POST['filter']) && is_array($_POST['filter'])) + { + foreach($_POST['filter'] as $name => $value) + $this->filter->$name = $value; + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Locations($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/map-edit.php b/2013/daemon/public/scyzoryk/map-edit.php new file mode 100644 index 0000000..5174432 --- /dev/null +++ b/2013/daemon/public/scyzoryk/map-edit.php @@ -0,0 +1,45 @@ +map = $this->editor->selectRow('Daemon_Scyzoryk_DbRowMap', $this->editId); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->map ? $this->map->name : null; + $this->view->map = $this->map; + } + + + protected function runCommands() + { + if(is_null($this->map)) + return false; + if(isset($_POST['id'], $_POST['name']) && $_POST['id']) + { + $this->map->map_id = $_POST['id']; + $this->map->name = $_POST['name']; + $this->map->url = Daemon::getArrayValue($_POST, 'url'); + $this->map->sort = max(0, Daemon::getArrayValue($_POST, 'sort')); + $this->editor->updateRow($this->map); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_MapEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/maps.php b/2013/daemon/public/scyzoryk/maps.php new file mode 100644 index 0000000..e919668 --- /dev/null +++ b/2013/daemon/public/scyzoryk/maps.php @@ -0,0 +1,39 @@ +view->maps = $this->browser->getMaps(); + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName']) && $_POST['newId']) + { + $params = array('map_id' => $_POST['newId'], 'name' => $_POST['newName']); + $this->editor->updateRow(new Daemon_Scyzoryk_DbRowMap($params)); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteMaps($_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Maps($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/monster-drop-edit.php b/2013/daemon/public/scyzoryk/monster-drop-edit.php new file mode 100644 index 0000000..bba3c06 --- /dev/null +++ b/2013/daemon/public/scyzoryk/monster-drop-edit.php @@ -0,0 +1,42 @@ +drop = $this->editor->selectRow('Daemon_Scyzoryk_DbRowMonsterDrop', $this->editId, $this->editId2); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->drop ? 'edycja dropu' : null; + $this->view->drop = $this->drop; + } + + + protected function runCommands() + { + if(is_null($this->drop)) + return false; + if(isset($_POST['chance'])) + { + $this->drop->chance = $_POST['chance']; + $this->editor->updateRow($this->drop); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_MonsterDropEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/monster-edit.php b/2013/daemon/public/scyzoryk/monster-edit.php new file mode 100644 index 0000000..fc5d114 --- /dev/null +++ b/2013/daemon/public/scyzoryk/monster-edit.php @@ -0,0 +1,70 @@ +monster = new Daemon_DbObject_Monster(); + $this->monster->attachDbClient($this->dbClient); + if($this->editId) + $this->monster->get(array('monster_id' => $this->editId)); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->monster ? $this->monster->name : null; + $this->view->monster = $this->monster; + $this->view->drops = $this->browser->getMonsterDrops($this->editId); + $this->view->titles = $this->browser->getTitles(); + $this->view->combatUnits = $this->browser->getCombatUnits(null); + $names = Daemon_Dictionary::$monsterClasses; + $this->view->className = isset($names[$this->monster->class]) ? $names[$this->monster->class] : null; + $this->view->attackTypes = Daemon_Dictionary::$combatAttackTypes; + $this->view->attackSpecials = Daemon_Dictionary::$combatAttackSpecials; + $this->view->armorSpecials = Daemon_Dictionary::$combatArmorSpecials; + } + + + protected function runCommands() + { + if(isset($_POST['monster_id'])) + { + if(!$_POST['monster_id']) + { + Daemon_MsgQueue::add('Uzupełnij ID.'); + return true; + } + $this->monster->import($_POST); + $this->monster->put(); + return true; + } + //add drop + if(isset($_POST['addDrop'], $_POST['id']) && $_POST['id']) + { + $params = array('monster_id' => $this->editId, 'item_id' => $_POST['id']); + $row = new Daemon_Scyzoryk_DbRowMonsterDrop($params); + $this->editor->updateRow($row); + return true; + } + //delete drops + if(isset($_POST['del'])) + { + $this->editor->deleteMonsterDrops($this->editId, $_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/monsters.php b/2013/daemon/public/scyzoryk/monsters.php new file mode 100644 index 0000000..e53aac8 --- /dev/null +++ b/2013/daemon/public/scyzoryk/monsters.php @@ -0,0 +1,58 @@ +filter = new Daemon_Scyzoryk_Filter('monsters', array('class')); + } + + + protected function prepareView() + { + $this->view->filter = $this->filter; + $this->view->monsters = $this->browser->getMonsters($this->filter); + $this->view->monsterClasses = Daemon_Dictionary::$monsterClasses; + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName']) && $_POST['newId']) + { + $object = new Daemon_DbObject_Monster(); + $object->attachDbClient($this->dbClient); + $object->monster_id = $_POST['newId']; + $object->name = $_POST['newName']; + $object->put(); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteMonsters($_POST['del']); + return true; + } + //set filter + if(isset($_POST['filter']) && is_array($_POST['filter'])) + { + foreach($_POST['filter'] as $name => $value) + $this->filter->$name = $value; + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Monsters($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/news.php b/2013/daemon/public/scyzoryk/news.php new file mode 100644 index 0000000..76750db --- /dev/null +++ b/2013/daemon/public/scyzoryk/news.php @@ -0,0 +1,47 @@ +news = new Daemon_News($this->dbClient); + } + + + protected function prepareView() + { + $this->view->entries = $this->news->getEntries(null, false); + } + + + protected function runCommands() + { + //delete entry + if(isset($_POST['del'])) + { + $this->news->deleteEntry($_POST['del']); + return true; + } + //add entry + if(isset($_POST['id'], $_POST['title'], $_POST['author'], $_POST['content'])) + { + if(!$_POST['id']) + $_POST['id'] = $this->news->generateId(getenv('SERVER_NAME'), $_POST['title']); + $this->news->updateEntry($_POST['id'], $_POST['title'], $_POST['author'], $_POST['content']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_News($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/player-edit.php b/2013/daemon/public/scyzoryk/player-edit.php new file mode 100644 index 0000000..3561064 --- /dev/null +++ b/2013/daemon/public/scyzoryk/player-edit.php @@ -0,0 +1,65 @@ +player = new Daemon_DbObject_Player($this->dbClient); + $this->player->get(array('player_id' => $this->editId)); + if (empty($this->player->login)) + { + Daemon_MsgQueue::add('Wybrany gracz nie istnieje.'); + Daemon::redirect($this->cfg->getUrl('scyzoryk/players')); + exit; + } + //player roles + $this->playerRoles = array('chat' => false, 'login' => false); + foreach (explode(',', $this->player->roles) as $key) + $this->playerRoles[$key] = true; + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->player ? $this->player->login : null; + $this->view->player = $this->player; + $this->view->skins = array_keys(Daemon_Dictionary::$skinDirUrls); + $this->view->playerRoles = $this->playerRoles; + } + + + protected function runCommands() + { + if(is_null($this->player)) + return false; + if(isset($_POST['save'])) + { + $this->player->date_created = Daemon::getArrayValue($_POST, 'date_created'); + $this->player->last_login = Daemon::getArrayValue($_POST, 'last_login'); + $this->player->name = Daemon::getArrayValue($_POST, 'name'); + $this->player->skin = Daemon::getArrayValue($_POST, 'skin'); + $this->player->email = Daemon::getArrayValue($_POST, 'email'); + foreach ($this->playerRoles as $key => &$val) + $val = isset($_POST['roles'][$key]); + $this->player->roles = implode(',', array_keys(array_filter($this->playerRoles))); + $this->player->put(); + if(!empty($_POST['pass1']) || !empty($_POST['pass2'])) + $this->player->setPassword($_POST['pass1'], $_POST['pass2']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/players.php b/2013/daemon/public/scyzoryk/players.php new file mode 100644 index 0000000..7d04795 --- /dev/null +++ b/2013/daemon/public/scyzoryk/players.php @@ -0,0 +1,31 @@ +dbClient->selectAll($sql); + foreach ($data as &$row) + $row['characters'] = explode("\n", $row['characters']); + $this->view->rows = $data; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/region-edit.php b/2013/daemon/public/scyzoryk/region-edit.php new file mode 100644 index 0000000..6a5a22d --- /dev/null +++ b/2013/daemon/public/scyzoryk/region-edit.php @@ -0,0 +1,48 @@ +region = $this->editor->selectRow('Daemon_Scyzoryk_DbRowRegion', $this->editId); + } + + + protected function prepareView() + { + $filter = new Daemon_Scyzoryk_Filter('locations', array('region_id'), true); + $filter->region_id = $this->region->region_id; + $this->pageSubtitleDetails = $this->region ? $this->region->name : null; + $this->view->region = $this->region; + $this->view->locations = $this->browser->getLocations($filter); + } + + + protected function runCommands() + { + if(is_null($this->region)) + return false; + if(isset($_POST['id'], $_POST['name']) && $_POST['id']) + { + $this->region->region_id = $_POST['id']; + $this->region->name = $_POST['name']; + $this->region->respawn_id = Daemon::getArrayValue($_POST, 'respawn_id'); + $this->region->picture_url = Daemon::getArrayValue($_POST, 'picture_url'); + $this->editor->updateRow($this->region); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_RegionEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/regions.php b/2013/daemon/public/scyzoryk/regions.php new file mode 100644 index 0000000..11d055d --- /dev/null +++ b/2013/daemon/public/scyzoryk/regions.php @@ -0,0 +1,39 @@ +view->regions = $this->browser->getRegions(); + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName']) && $_POST['newId']) + { + $params = array('region_id' => $_POST['newId'], 'name' => $_POST['newName']); + $this->editor->updateRow(new Daemon_Scyzoryk_DbRowRegion($params)); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteRegions($_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Regions($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/reset.php b/2013/daemon/public/scyzoryk/reset.php new file mode 100644 index 0000000..d57ee26 --- /dev/null +++ b/2013/daemon/public/scyzoryk/reset.php @@ -0,0 +1,91 @@ +dbCfg = new Daemon_DbConfig($this->dbClient); + } + + + private function resetCharacters() + { + $queries = array( + "TRUNCATE TABLE inventory", + "TRUNCATE TABLE character_data", + "INSERT INTO character_data(character_id) SELECT character_id FROM characters", + "DELETE FROM combat_units WHERE combat_unit_id LIKE 'character-%'", + "TRUNCATE TABLE character_regions", + "TRUNCATE TABLE character_missions", + "DELETE FROM character_titles WHERE title_id NOT IN (SELECT title_id FROM titles WHERE type='special')", + "TRUNCATE TABLE character_statistics", + "INSERT INTO character_statistics(character_id) SELECT character_id FROM characters", + ); + foreach ($queries as $q) + $this->dbClient->query($q); + } + + + private function resetHistory() + { + $queries = array( + "UPDATE characters SET last_mail_id = DEFAULT", + "TRUNCATE TABLE mail", + "TRUNCATE TABLE chat", + "TRUNCATE TABLE duels", + "TRUNCATE TABLE rollovers", + ); + foreach ($queries as $q) + $this->dbClient->query($q); + } + + + public function runCommands() + { + $methods = array( + 'characters' => 'resetCharacters', + 'history' => 'resetHistory', + 'items' => 'updateItems', + ); + if (isset($_POST['reset'])) + { + if (isset($methods[$_POST['reset']])) + { + $method = $methods[$_POST['reset']]; + $this->$method(); + } + return true; + } + } + + + private function updateItems() + { + $sql = "SELECT item_id FROM items"; + $ids = $this->dbClient->selectColumn($sql); + $n = 0; + foreach ($ids as $id) + { + $item = new Daemon_DbObject_Item(); + $item->attachDbClient($this->dbClient); + $item->get(array('item_id' => $id)); + $item->validate(); + $item->updateSuggestedValue($this->dbCfg); + $item->put(); + $n += 1; + } + Daemon_MsgQueue::add("Przeliczono $n przedmiotów."); + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/search.php b/2013/daemon/public/scyzoryk/search.php new file mode 100644 index 0000000..7095eac --- /dev/null +++ b/2013/daemon/public/scyzoryk/search.php @@ -0,0 +1,53 @@ +searchType = isset($_GET['type']) ? $_GET['type'] : null; + $this->inputId = isset($_POST['id']) ? $_POST['id'] : null; + $this->inputName = isset($_POST['name']) ? $_POST['name'] : null; + } + + + protected function prepareView() + { + $this->view->results = $this->results; + $this->view->inputId = $this->inputId; + $this->view->inputName = $this->inputName; + } + + + protected function runCommands() + { + if(!$this->inputId && !$this->inputName) + return false; + $searchTypes = array( + 'l' => array('tableName' => 'locations', 'indexCol' => 'location_id'), + 'm' => array('tableName' => 'monsters', 'indexCol' => 'monster_id'), + 'i' => array('tableName' => 'items', 'indexCol' => 'item_id'), + ); + if(!isset($searchTypes[$this->searchType])) + return false; + $searchType = $searchTypes[$this->searchType]; + $tableName = $searchType['tableName']; + $indexCol = $searchType['indexCol']; + $this->results = $this->browser->findRow($tableName, $indexCol, $this->inputId, $this->inputName); + return true; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Search($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/service-edit.php b/2013/daemon/public/scyzoryk/service-edit.php new file mode 100644 index 0000000..50acd76 --- /dev/null +++ b/2013/daemon/public/scyzoryk/service-edit.php @@ -0,0 +1,64 @@ +service = $this->editor->selectRow('Daemon_Scyzoryk_DbRowService', $this->editId); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->service ? $this->service->name : null; + $this->view->service = $this->service; + $this->view->serviceItems = $this->browser->getServiceItems($this->editId); + $this->view->factions = $this->browser->getFactions(); + $this->view->serviceTypes = Daemon_Dictionary::$serviceTypes; + } + + + protected function runCommands() + { + if(is_null($this->service)) + return false; + if(isset($_POST['id'], $_POST['name'], $_POST['type']) && $_POST['id']) + { + $this->service->service_id = $_POST['id']; + $this->service->name = $_POST['name']; + $this->service->type = $_POST['type']; + $this->service->faction_id = empty($_POST['faction_id']) ? null : $_POST['faction_id']; + $this->service->rank_id = empty($_POST['rank_id']) ? null : (int) $_POST['rank_id']; + $this->service->description = Daemon::getArrayValue($_POST, 'desc'); + $this->editor->updateRow($this->service); + return true; + } + //add item + if(isset($_POST['addItem'], $_POST['id']) && $_POST['id']) + { + $params = array('service_id' => $this->editId, 'item_id' => $_POST['id']); + $row = new Daemon_Scyzoryk_DbRowServiceItem($params); + $this->editor->updateRow($row); + return true; + } + //delete items + if(isset($_POST['del'])) + { + $this->editor->deleteServiceItems($this->editId, $_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/services.php b/2013/daemon/public/scyzoryk/services.php new file mode 100644 index 0000000..e35e3a9 --- /dev/null +++ b/2013/daemon/public/scyzoryk/services.php @@ -0,0 +1,39 @@ +view->services = $this->browser->getServices(); + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId'], $_POST['newName']) && $_POST['newId']) + { + $params = array('service_id' => $_POST['newId'], 'name' => $_POST['newName']); + $this->editor->updateRow(new Daemon_Scyzoryk_DbRowService($params)); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteServices($_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/title-edit.php b/2013/daemon/public/scyzoryk/title-edit.php new file mode 100644 index 0000000..3d95828 --- /dev/null +++ b/2013/daemon/public/scyzoryk/title-edit.php @@ -0,0 +1,46 @@ +title = $this->editor->selectRow('Daemon_Scyzoryk_DbRowTitle', $this->editId); + } + + + protected function prepareView() + { + $this->pageSubtitleDetails = $this->title ? $this->editId : null; + $this->view->title = $this->title; + } + + + protected function runCommands() + { + if(is_null($this->title)) + return false; + if(isset($_POST['id']) && $_POST['id']) + { + $this->title->title_id = $_POST['id']; + $this->title->name_f = Daemon::getArrayValue($_POST, 'name_f'); + $this->title->name_m = Daemon::getArrayValue($_POST, 'name_m'); + $this->title->name_n = Daemon::getArrayValue($_POST, 'name_n'); + $this->title->type = Daemon::getArrayValue($_POST, 'type'); + $this->editor->updateRow($this->title); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_TitleEdit($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/scyzoryk/titles.php b/2013/daemon/public/scyzoryk/titles.php new file mode 100644 index 0000000..ca2e18d --- /dev/null +++ b/2013/daemon/public/scyzoryk/titles.php @@ -0,0 +1,39 @@ +view->titles = $this->browser->getTitles(); + } + + + protected function runCommands() + { + //add new row + if(isset($_POST['newId']) && $_POST['newId']) + { + $params = array('title_id' => $_POST['newId']); + $this->editor->updateRow(new Daemon_Scyzoryk_DbRowTitle($params)); + return true; + } + //delete rows + if(isset($_POST['del'])) + { + $this->editor->deleteTitles($_POST['del']); + return true; + } + return false; + } +} + + +$ctrl = new Daemon_Scyzoryk_Controller_Titles($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/service.php b/2013/daemon/public/service.php new file mode 100644 index 0000000..af5a573 --- /dev/null +++ b/2013/daemon/public/service.php @@ -0,0 +1,90 @@ +characterData->character_id) + return;//logged out + //check available services + $services = $this->location->getServices(); + $serviceId = isset($_GET['id']) ? $_GET['id'] : null; + $this->service = null; + $this->bankEnabled = false; + $this->templeEnabled = false; + foreach ($services as $srv) + { + if (empty($srv['_enabled'])) + continue; + if ($srv['service_id'] == $serviceId) + $this->service = $srv; + if ($srv['type'] == 'bank') + $this->bankEnabled = true; + elseif ($srv['type'] == 'temple') + $this->templeEnabled = true; + } + if(empty($this->service)) + { + Daemon_MsgQueue::add('Wybrana usługa nie istnieje lub jest niedostępna.'); + Daemon::redirect($this->cfg->getUrl('map')); + exit; + } + //prepare service handler + $classes = array( + 'bank' => 'Daemon_Service_Bank', + 'healer' => 'Daemon_Service_Healer', + 'shop' => 'Daemon_Service_Shop', + 'temple' => 'Daemon_Service_Temple', + ); + if (isset($classes[$this->service['type']])) + $className = $classes[$this->service['type']]; + else + $className = null; + if(class_exists($className, true) && is_subclass_of($className, 'Daemon_Service')) + { + $this->handler = new $className($this->dbClient, $this->characterData, $this->view, + $this->service, $this->bankEnabled, $this->templeEnabled); + } + else + { + Daemon_MsgQueue::add('Nieznany typ usługi.'); + Daemon::redirect($this->cfg->getUrl('map')); + exit; + } + } + + + public function prepareView() + { + $this->pageSubtitleDetails = $this->service['name']; + $this->view->eventLog = $this->handler->getEventLog(); + } + + + public function runCommands() + { + $this->handler->execute($_POST); + return $this->handler->isCommand(); + } +} + + +$ctrl = new Daemon_Controller_Page($cfg); +$ctrl->execute(); diff --git a/2013/daemon/public/static/badziew.jpg b/2013/daemon/public/static/badziew.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a9a619af3906f99c0a52acdbc6393931216f081b GIT binary patch literal 16256 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 SmV?o9B2Wy4De6i7UHC8YFH++G literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/badziew2.jpg b/2013/daemon/public/static/badziew2.jpg new file mode 100644 index 0000000000000000000000000000000000000000..f29b51cb4512aad7039863acbb3c6add633b7007 GIT binary patch literal 6617 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 literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/badziew4.jpg b/2013/daemon/public/static/badziew4.jpg new file mode 100644 index 0000000000000000000000000000000000000000..24e1473ab539c15e915503da805d0654e83fd460 GIT binary patch literal 13476 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 literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/badziew5.jpg b/2013/daemon/public/static/badziew5.jpg new file mode 100644 index 0000000000000000000000000000000000000000..613cc31fed29b9df5190e920a6a9b19f11ab2b9a GIT binary patch literal 19881 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 img {border-style:none; vertical-align:text-bottom} +a > * {color:inherit; background-color:transparent} +a[rel=feed] {padding-right:16px;background:url("feed.png") no-repeat right} +caption {margin-top:1em} +th, td {padding-left:1ex; padding-right:1ex} + +header {display:table; margin-bottom:1ex} +header > h1, header > form {display:table-cell} +header > h1 {vertical-align:top; max-width:50%} +header > h1 * {width:100%} +header p, header ul {margin:.2ex 2ex} +header ul {list-style-type:none; padding-left:0} +header ul > li {margin-right:1ex; text-align:center} +section {display:block; margin-top:1ex; margin-bottom:1ex} +#menu {display:block; clear:both} +#menu > li {display:block; float:left} +#menu > li > a {display:block; float:left; min-width:100px; padding-top:85px; background-repeat:no-repeat} + +.msg {font-weight:bold; padding:0 1ex; outline-style:solid} +ul.msg > li {margin:0; list-style-position:inside} +ul.menu {padding:.5em 1ex; list-style-type:none} +ul.menu > li {display:inline; margin:0 1ex} +ul.menu > li > * {display:inline} +ul.news {padding-left:0} +dt {font-weight:bold} + +fieldset {margin:1ex} +form > p {margin-left:1ex} +label {white-space:nowrap} +input, select, textarea, button {border-style:solid; border-color:#000; font-family:monospace; margin:0.5ex} +button {cursor:pointer; font-family:sans-serif} +th label, td label {font-weight:normal} +input[type=checkbox], input[type=radio] {vertical-align:middle} +button {border-style:outset; -moz-border-radius:4px; border-radius:4px} + +.center {text-align:center} +.center legend {text-align:center; margin:auto} +.border {border-style:solid} +table.border {margin:1ex} +table.border th, table.border td {border-style:solid} + +.avatar {text-align:center} +.avatar img, img.bbcode {max-width:400px; max-height:500px} + +.multicols {display:table; width:100%; border-collapse:separate; border-spacing:1ex} +.multicols > * {display:table-cell; padding:1ex; vertical-align:top; border-style:solid} + +.ex {font-size:1.5em; font-weight:bold;} + +form.pretty > fieldset {text-align:center} +form.pretty ul {margin:0; padding:0; text-align:left} +form.pretty li {list-style:none; margin: 0; padding: 1ex} +form.pretty li > * {margin:0; padding:0} +form.pretty li > label {display: inline-block; min-width:25%; line-height:1.8; vertical-align: top} +form.pretty li > input[type=checkbox] {margin-left:25%} + +div.locationName {height:20em; background-position: center center; background-repeat: no-repeat} +div.locationName *, div.locationName a {background: transparent} + +section.item-list {clear:both} +section.item-list > img {float:left} +section.item-list > form {margin-left:155px} diff --git a/2013/daemon/public/static/biglogo.jpg b/2013/daemon/public/static/biglogo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..2e94029833dd0ff1a44b9032705c8d730054240d GIT binary patch literal 41967 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
  • >bM{w(kRc|CDg)$j)#S+x^hJ)H(1Npd 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 vPv=Gprh9o-)iIlXc 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 literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/dark/forum.png b/2013/daemon/public/static/dark/forum.png new file mode 100644 index 0000000000000000000000000000000000000000..242b7a2589ceb92da02d6aefc6de68925936ae1a GIT binary patch literal 17337 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 literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/dark/klan.png b/2013/daemon/public/static/dark/klan.png new file mode 100644 index 0000000000000000000000000000000000000000..dcfc994e584b843c4f6041c7e4ed0c9c7e6fa40d GIT binary patch literal 16620 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 literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/dark/konto.png b/2013/daemon/public/static/dark/konto.png new file mode 100644 index 0000000000000000000000000000000000000000..0d9daf3ce80c3bda54c26c65570c788789cb2ba4 GIT binary patch literal 16523 zcmV)4K+3;~P)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z001?%Nkld5kXEbszRS=Pp(CExo>dHqLN3_3(?>YJ7-s-N`d^40tYcbNmMSWX;U44G{?8_y^zdAn(pa&2DSO5-ydH0VK0AGHM z%10f5s{DEYuqnF{ z@3-&uH~uhx>>m;M!$yvy-8u$^3sG4B(!2yfC|6MVa4K6nlrJH`6Yx3#{~iIqNWf^)vkWW=5Cbp+4FhumrVKnsKuf?og|X=O2?SlbV)Xm^#|?- zu3Q;FR|t=k7njF2WdKk>-~viezzg6N_!a>Fw&w5q5P%;g;C}!>1biC-&lB+fFz_Y; z!hkWr3k>{u296BycDZg0uqZdg^hFZxT?ubSB5ll^W~6iE_XEfuBoGe3bpRg$@FIXy z0H0CdQ~;lVZ305fyP69CP0H`Z1V{nL3LpYZ3n)X(qFEKF;_&J6#8iqv2A&;Ezi3G zj{ZRdG3<=0++ZxLFE{i$fIkP|+W~x)0*?~#e@5U_5#R_sihxPLNdQs;d<13@m?q%; z37`agssL6C@R9%@Q{awdF=dL5%5n5_&Ek1Fz}oKzMp|x7N~626~`7> zTHuZYPAza`fu#c$4)~-6dIxMR5Nv+!kb!-=u&^EjxLqC(Mq3=IIsL;@))N4K0>IY; z*adJoZW_&);hsQ}aw*e#$PCm=@P zFacK*@U{YFj`A3nZ5x8wY%w z13uz_pLW0#4;(mP;(#BIKwEz24F-OfGSQ1#dkTaRwNAQ8|I@Ldd8238ET251bx7Vs9>*i3jhVCH~p4!Gul4>+Lqz@P8{Rrxh> zfOy~y2mIXx+_QkXEV9O;nJy`2`NOc9b^ttAETP>3z!d=d0QLpARXBh{COmq8dq6rM z_CVVK+YV@YVABC7JrDx$X9_5v>w#AS@LF%oGFkg|>iC0ZQdP!TS#Hw=!~io$MFAyd zlK@po0s@#+YA6&j?odj5h*3C1wW`Si>VeJy3kys<;2q#RFsp#x1G^rmt1Nq?2VSdy zGY?#kz>xcLjzNecFyvnb5H#{QwTPS#7sbehExV$yIOScw*Jpyu@Mc+3 z)>)gct^>{rI8_1c6ITD8g6O31r5+#xj#;6i0G;c&5?v;oL0EmfH zLDmo(CKwC0kvXNP3PVa02Rxaia8ip*E8w~ZRvvg#0WW(X)h4A$j z;PTqM%a3gfgpSDfOuM~e+FMKNj3jGQ^0f$a5~3s`Q4}dzE20n;Nuo-CLZN^{32LcW zDhvX%AqI@GU<(IQSQQ|FEL2}vwr!YoTe8HDCL%vtL;q9-yi#SZtt-GcfbW5;0a(_+ zPSIEM1l$+kfdH{^NBsSms$ULAL;zn6;9mo-9B5fMUVrbr# z8!iAy3&=LFhb{1E1Mn8`+x(fcEz!DjX1^yo>;UbFMd~_4=VD^+Lw53F6m284OTbbT zt%&wQXhjhP2&y6?!bGg>E0&ZTBrzp11q^4bWg_D&sb^K|L@M^q_q$hpa+RMfj*W4Z zOEG=o*m~1TE49KlQ0W2c0que70rLUnvkn zSYoH>0|VeU0DQdo2J4i?ko1}GlP(iGZUMW^th3qx+byuS$zsWEfXSA4e^FH~I7`+@ z3hZL4T~uGiUbSxp+f9%*0-I!bsfuNixK-6tC2Uo7t9e7HT9?2UFoxM$z(SzWD=Y!@PWQR#rxWQ*>l zkgdRhUlgT$O@I&f0ChmL3ANRIC zvyx7+JUc_TSun7&hBs_%$Hqpo4#rwhRaSzbs*7t2*mY`ycY4t+lj z%uQ-HJEm)Ay|4G->p6vP4o$O7Rn@iXG{qoc)7nnN^{PW;mm~06%;6Vg5s8)NB?>f} zfk*(Zc;GPs_luYP6>&raa8%;?e;&X?0B=hs{=5UOwOQG^Z6>-D;$xk!ll284DB>yg z-m6TS(AQ1qSz9%_TGu=4Zo2z;HQ6~~#*^yM9Z!^wUE7}8zF!)~!s~23_kLY_*H4@e zwQ~u?V8b9Lka3)#?2MWq%8?8uYweCqeK#Q&MXF`HX~@tlHT5Ji?J4w-VmP!X4-bQ{ z_m;-*CGJ91*Hg<>$F`T)2Om{60x1Gj0zRIAxd5T)h>ZZ10@sRBvmoFh0k>S%8E+RQ z{uNnG)8fuQ0`MmVxLZuks>{k&wiy7s&R1FI$5;bg7B+xvnPZ$Z5}PIjWBX)jW2V)a zKiq$un!^XZtsmODdQkcLu_r#6b=!r7t{TVN>8x&N&V_@f4vlj%aZW%05ra%t$pj#X z5NCsyMDz2N^`=!dL4;2X`BmHaMKhT$*Xy0G>-IwEul16yAf;VRpRcevdEaRbCce7gpCRe&g0w8kJ#Cn+^`z-+Sd*RLP6zhkG7*kG@&5*Y(;trAhThlo%-ho|MLDxiuWLi@GG zAVQiFHkI3M!-P-U{_OE;b9}tnOph1GM{ClnQS_u&U5l@lvF~pMNvS4iGpUi7G;TYe zRCiL20y_o1NwerVDZBPF#m{=4a=zoA5nveDv01c-FJ;;ei5fpjcG&{Juudaz8h|hK znG@b$tRieKcD}3tI}m@Bmu{Go%%&+dO}DL^P4nTeUifR*k3`Hnbobs{&1~oPj-fl# zkRI=ATwZZiH+Lr1>;%N9yi@O-5;NGC3;;7|0AW}cC;+NZRj{f;1eJ(NN|<;jAtu`M zeY{$^emQH_52y9w!D@YW7UIe3?DVv6w=X4QL)@%l6wwIPrm1H_AlY;fRhK0dHVS-A zA^yt*dXe%-K6RCxY|2-D6`p}-H10Q2fJ_iiWrHB8}BEgFw%BOlac}x%?T+fvF_Ih*ya4Z=A5d1i-DII zctkk>`7(eXLFOcV77)9|RGk6%Zwfs-WbbhsffoaCwa;d1-vYDkg>^LO1Qf0qM3Sc2 zEXBI+wxCrDoO0hjuxCea?aut?Dx%N1iMzLJ=EsMs+nF)R8KdkR*jli)7=U17G6)5T zvzK4~7V-WQYVBVkA_hRD`gxA=?^Mg>Pfm`G9_l3^G^GrNF`$&7#-KJvuUQlKoK16Q z)5K`J<4ic-_G#%n`s3&%^p%QmQsQatSpdSevm{atyjX}2&goZg@;YQ-zhng)2KF8B zn?-~@Q$(2`%HHzJ#YZ>-@PVSJX94*7Vyeyx0B2j^+6JIPd>V-&SpsGW(rz|QY0~s9 z^JW7*Z50m^^z*T6-*8>`*;ya&9)x&&jd(k?R-AKcoP+Tm#<}yw%L%!l#R*UG+JCZX;_8`-dLSDAC2>& zCryc&V93K7pA>Zxb*gIFuu+9cF%jh`Y~l+*lyWxEX8{V&z{CI@1OLPTf182d8dZ}# zQ(0drKEo#qH~eM-`T+d79{6{PrNkXTE%0OuT;D$JGxTe~FNt(DsRh$X2yEJ3Wg(Uy zK=1|Q>}PGlr|r7Ex96IZYxBCBIwu36c_6;E7&v3#itY95H`4z8-(+LHlbP+9kfWcQ z0B)-HAK$$1eLuW&`}U7L#SJN)bHiB7fe00m?h+D!O`qc9cD=OQ97C%DsIkNo)mTB{ zDsN2yoWw|+q-WK(a6)ZznEj#6VfWh>__PIn$^ie|04GIvysNSvQhy%;@BqM1C@_t{ zUIaeV13%pXf1z*%7ezgI(L9)~DwII^DX21uAqlRDo==9LnT)$lto_MOJLx30~mcV67tIXj$8!nCTz`%2Hb zU?hsz+6!Q;McUtg-B#5nnAxx~AR_SCa(agOs;W1{n71$11oxb@q*eW_stv`R>Wh*}R)pl~msA`ObfaJ{Vq;>D2RN@*U*db!Nt} z=#rej1VUcMyg(w)nX38>r38u*Iub|E@?kcCbnE3oh~Y{KVTUzM zM0Ju>(}a!b*ytuD@1YY1e8>TJ9gsY5-vhw`3!edUA?Lx>z6TI};fQwtd`N&c0k22k zg8`Tqj#za$rZj7TSi;-`5ZDqF)2a5*z6I7T(TT8mhk>`IhVMK#oj$%bowZY6NmXS| z7<0op2$#TUuU-3ETY`eh9{X$T+}O zez&PAxjC6^@6+SsCo1=2YOl2^9Eiw)1-43XOt9=NZ`%Y1ntIi#2mY)FKInnpEnvLe z18@3V2+>AB!_%dX=S6L{JlOzv3&7n3d~L|wunjrkbJ*wXo9}YsXUI2X&LGm>If3E6 zZQHJo@r>*0(R642cCEN`wW^-HFq>}%P8ekWu*~pyET#q#<^2wvo0^gJGXTNQ@U90C zLo8zaX1t`}^3iDyx9VpZ>1Ywuol z_Vj99hss$cYqO#p%+m21gE3OprhJx|Gv~aEo_LmyC_rT2WB}q>oN(C_FJ5?6RXVL} zxi;V3+&xly(A(ls&jDN)U@rl;63~=Nj2M8E2rNUcyzoO|Ku@qeNO(RC$=NOl zf+1Zg}oKs^AU<{14Fe7gGQb33Zm>B{+ z*FAWKVje`&7yv4MhZ=*rs`dH3z3%?v^lZ^?j@qt2PQU`7g9uE5sB;A8K!_mQk?!^i z>4CROko0B%Bm$2EU?cF&5%^HbVf4EUd>+8h0{AssJn9c={s5(1*!45z@g!!2{bITIB>>bIh_&$EXReq{x9^<#(=%>Q!SPI$ zmQi$?#SV$HhGJCi1$6-KmmK#p0%swoS~&rC60jh!Xb6ZT4^E;)=*N?K*p?MlE)Lr4_}zq$JZxKH*r}vJQZRX0(c`Z z#(E<`iH$?uG#Y?6V9XoF+H1^w0mPuZ--9EFC`FM^^_$gZvtF2!#}BPHR<_p3tez&e zR>$J#9Dw28ij_638rf?m{nY!lF}wotB0+jmO#zw$Q3^yHK^j220lFxg^|WO6no>%- zO1Y|iD!`rqzotN>tfP-Dav-YGjFL@2S4te;NWkj}cwYkc6R?iJJOVKi86g1HX%vZ; z(iTh$t9Y_M@sD4aH)ppd^X{oQ&!qs~<;MdU&U;M&MG ze2FnPFf)YcSE=uQsuPLJ<*D0lR(6vT>S_`VTb(!4GzLLN_cDGA!el5!pG16#@@YXJ@v zcqBlSjNT>zUssg26g9t&fR6-Dgh1X!>$xS;jYC{cD}PiI&RE>m8dhhm;!@CU49sOf z$QT4kWUC6*WTH`p>aP2TsjgolWBvm+W@d_aJzU>~BO(Dm%Q3!fti{g3RZ1duwLG-~ zSw|I$l8B8_dIkXF`>dST+E-FL7npbpV5>yi1jM9}#L%RG5TR7LbIk1pw+c5P0n3yn z4N0c)kpK_%BAa(=k?V3;^P64ajIHD%;^&G?izz!KApzT{crg%3HLqkocM48jU71w^ zEv)i#YF%*bQ(l<<>fAOH*u1&vK{DNt_+a}41L@#1b&sZ4wES2?dvEh~ zcWAlXT;_nwn}?WDJFBzGB_@tw>OmR+3QC$pp+Zn%R%00&rA`Vjz*(W&q+ETW;gJBp zF1f0GsF#IB&Nf{sh5aPJz5?H;z`riQx`?U+$p}9dpb{cY)+(GO%aS%~ViiO8d`;cd zO(KEyDG=W4dWoRcSBmMZ?wk50Go5{pbMAZCn1f+wp0AO&eJ+|r)=KohQwU!Ob^Udu z`d?FwFR?0!4U9EVbstiqSHte^+OJms<9QDJa_D4qt*q6lw=%CxINeZ)M2e!81W*x0 zV#*DeL=b2zfEjIIDbnUxb9=#ynt^z0XlAjczhF;u$4i6Ud+-gK0oiKqU0X^1?4B?k zCu61|h^{tC7En!wWXG}8&^SjguzKDB^Lqkgq;zA`%+h@Jea8FmCBrX)M@qSTA6)`t z_z|Les(MeYZ2Olq+R}-_u;C6vm>dDLLzE)E&7lkB8PMuYgs+ zljw`s_LP`m+DKi99C{+M#&~1guB|yY47^MA$h&|e*4nVQ_ir)t4;bS5{CyEvX6=mwRnpJ1^4hGh&}3AtknJQ(=YElBB^7kTHs?rR((H>`9xF*>VA&qy_)$e_|dq)NrvhAlVFutMr9=NZ0aqzkg7XLfd;UE4OOdJ)L|8?AOfpF#(`DZ`CtYWuijX2b z>z~t0*KR()m5lit3LHEYMJ?h@i2w=E6rd8JlAt1xvQmi?iO6>d(VwOmZ$tHGH2*xE zFj4`C6sn(bo6S$32mhXNU*r2V%<2roTDI1*B_bk)fhvnCjanH!WeKxan(q%wBR&%_ zRDbMHt|xn{s&9i_uldUWt`KmOa))NI>MvS{N_V#~5i=1Jl!?eI)W?{n>n_eWAx@9C z+v>D!4fLr*%`>mjIo~(U_p9pr$M2o5@raHhfi)ZOkd%-{OHz6uA`vM?3gK_7>OWCc zc^U{nRW_8;fA3bSlP`6Dnd2gLA@J$CHz6eBO;#DqnP(XQsh%s{p_-$Nqp+0wzb6EA zbdjLzC_ChelFyC=922nQ%oQ(}4|p22*N+x+&b_jvWEgBYBRxx^JBu#to_1Zc?7Q`W zmTr>w_$Rl!yB{H<@8hSFI!}kRk@bKAP!)(IAZ7cJLLgjB%53t@?s3DMiE>5n~K7grA`G`mGcrcg+7$OzHbmN=-@$DPGbc0}yGX>{Y+DZJPgl zwYz&mQ_9iU(S3Fy(4*zbzWI1Hd9>(f+b+%=X=MqX0b+$Qxn+p#XrpqWnfYSz{u%>+ zje!^FqF0-Te8h95d~jiaEdz%p*W$#oU;$gMeW_&g6ce$+T4PI=aX8cFPZ!%j&_ho!vX@_d=I; zjmm@+j-keok_X6%4xAviG|QLATxi#uOy5%mZgUn*!#`$*pxuZbtH8!I%VK6iCo?E{q={d)!FUSlXh=9O?4f#aZaUFXKPA` zs$WlK*E2KHr94B57iFTxn5RSCM3IPo#;#Vk+v)UANlHJcs`IDy%!rf5AUthpA*Ey! z@R$1e{Mfzo&JPc1(?0aHX*cG{YB@dGbO&u850KJKlGaw#I>0yuIVhK6GAZ;qU!?@| zvj%v_0A~jH1q1vV15Zj)D4|H3O);gW4D548Fqn+u6PHKmcn548u=T)+&sTWGhq@T2 zRpq%Cs(V5e6?+1`5>mRd?7E|SXN&dW^t7+M@7Ne=jM4L|?3AJyb1s7DU2@S+al=Kb z^ofn}e-0vbNaqQ>+UH_`{&N`-4sWwq`Cy8E7lx}XiZt-}t*?!^VxSKak zs=NNk1~c%Y_?)1FG@|)*kR4c-{k2WsV3wNuN@36T?Q7 zs;JsT#XhOrFdA1~-!307mz%pM$Ng?oNmF^PjZw+*q5bp>AfDF7TBoSa zD&SR7iE@>Ps$jIZaK=kTv`;PY+XlF8vJdgpqyk$|c?ZCYTt?zp;LHJsrI_}teCbUO zoK--mfQJ=8HPG~mhwZk1(amaOb7^|?(0K$7No5^lSS;Gj=E35$+pT@7oZlW8lPYFS zeg6-L=r5;t0bwAjQH5sU&NFj{8L8`#tkvKgbSN?#Ifds|*k$W0TU<|rP+rSGbab>h zb8jC%-aB4zZYJy1!?D zUo0(L=K~$h59PSXPSMR@4d7)3u9l3_LUM!maj8I{lKQ({664n+a1caHGR7umO{!%E z0_8|V?nzFh5|T)8%(1dooVCi%|9YtFDRBjCqykad@6VIMKfUF?aW!pFLZg+0Wd+yYuGb zlUv8@&8zD^d_a;sZ$uARbf*G*L*N+{Q_<}d*py{vfSCe31!$5N*LjpgUu9|X?GE@B z%2H@m8X}`DPd*Re1ps%8#guGjCw9Pr&m8b}4_vPRseuobN;cmEDJT}H?G9a28&6b4 z(UhQj3dBB1kUqu}YJ(6bV~mI@y-c*-ef##&{OIUEdADkC9@jgK6Z@rbKuR9N-@Es7 z0RHS#ajL-|7>OJ$J3fT~DJz8l>3gIQ&}}z#wm36iczADm=lIFBo8z*4 zQ+le`2H3N}+~vyVdB}=Ks)BA0?1$V@WJ?VX#V8vIaaK8tMC6m|L`C-vNs7?0?GO{T z5P+koNdVmnq21ltO|$7tn)Ces(`Aq}DtUR&hQ@bkWIP9=SV9ux1pqOggV1ib^!Vi1 z-hOm%`o_bDH}5W1@7uKftD4eFM&!V%?pW2P222BRBZ`TtEosez23Xa=Cu`tA1x$(v z|2YqQ%HywtfXC)$K}M3tJkWS%Q8c$ z>8uj~=|WJ$R+wGNRYNL@NQxjSQS5tOk(&D|Hc7H4+wJ1kw%y!1jQu=DshdXYy4G`I zjv7p4D80EC(<-J2W;oWMU$%K-F)iMmXE29tQB^_wXd%dcH3>(hLbSh*rB^+!CYDC4Z z`e+ti&+ERUP1iwHa)w1RL3vQVqjLFY?Q|^!)=T1NOz?9tbm@8DZt3LY*giOVSlxSg zckkYlN6+0~tUhqob{`BOet<-tccO=0bXF_shO+#hi(;OWI5Y!vmctV?1$L&u&IG6? z!1V_BKn=XF24V%g>GHsozODMpS3V3KGRMXNrE>r-;;(A!Pdo7Hw}y1qvUJu#pm^h6+} z81ufr1jPAHFLuAY8yJHa8m-uFDXtgh^yIO7^WNRrZ{5Ft<*g@A-gma%eBgB3zt;8f zRU~=NiCpm_Gq2iA2zCmXxd`T}x$U-qP=FW~PXO0ss}ePEqXItefmce=@#A-E?;WNS z54q|xS_w1GkDn;8Q+EDIsXkaqzAiMk1TXYrT#i+d1Q4@f%S=RoQGpSFlfoy}Dv36| zN)=P8+Zg=1@BE_O+Eu&dC##j&^gYE8kYXT_950HYCstq_3wl?M7ziIDy6u)?*HOD! z^I~ykPEL;e>681DI}hGDc;oTW&4;Ip_pi6xSJz#5EyeT_Qo3bD4=R&3RFs0HG*vt+H6ZWplytCrXLy=ihDez%YQmAKA8R%3m;dxsv%qWmps^ z;LVgrMog!qEDWzvYhi7Y=uDIBhnV&^AwFKT{qfOy zb26zGi`|pc)z#T_dpMtU^QMXO={#0dEtPXxd#Bbpt)0(lv1d#k==+{j1lxAQeIIDK zU7O`<;kKJ))o+&5<#x4ychO$yy6&ciaLa3YPBh(+B!?`rV?^f_)HZ;v2|N?Uj>y0X z0{|ESfJx>6uJZ&mDdCQ2bARF%z#)MD4ZvRn@T->{y7AOrDdK66VH=Y@#^01&0`lQf z3HYScZaye;ilD$Z0(d{=VYLF)p1QauAPJiTg?d0i0>gkMK}94}QJstEzKC3nAs%<3 zKijnJ@oKw1Jz1Wunv;4tt6bOks;{fMZ>lOz>pC)9nfNO0&l{;+uIz>=Vv4lwd+tNv zu4~P5yK!yT*|W{2S-0&(LOYk(?`^vN>bi^9`;e|1O;=||t`O-SATtrIJ=9MLrUo!c zDsvIO1VSt#$xeWF0`v_~H-N7%oVi#g)SMQj{9DCZ`mWN`-d}EJw4;8yK}1n;^u%P# z=_eHU6#>3cfJ4c<|FjsJJ4Ku=%IwuC17cLKnl36kJu}wq7$R>}Z4ah-W%8N&7ADdtdKxL6i!LF zkI{ra+Ac=dc74MdCVhyLWfy0Ci2Eezz^UwokglX8d!A$$(76$*r=$&AR5oQ(eVP=r z48p(xJj)InWmqegDG+hEvNd7dI*}w4qfm^(lEm~u>Lh9* z(pbpEKxQVS83&oM%B~}sIno^^nNrdw25nf?P8i-W9T`DCkLiV}sGR_D3dp2z#3X~# zPJynx*EGQ6qMY}KSd+b|#;MAtZUDSlM)Q4HRuz>P)r2I7NnH|HQgsliSWz`rYfCycBoogvanLD9 z-KLi+1+6NAwFm*2mRVnMz0@D@$E-P%mm7A`w+f$$ae9x9GX#4wzS0LbnB*!Kwz84 zKeJEbx2nlAyRBh$fDNRk2P7!jr0N4{B~*rnG4-4@7*J%To`Il=f{7{+3e1qWNwSTk z4CuBO5>cqak}3hP25MNJ5P3DMM%a;>;aCYbeT4m8O@@9*QH= zmXUY+%x4aLm4J^Ea6rJ-QuV>5;J}vL_NfK-%49C_z=;=im8OXo)sD%v%+doKNPWn~ zyb@JY0*NF|PzVx7GKeW4v66T}QiYH}4J4%qbh$LU6r^e{`%%rq7DX(Pa?XgUV^%}i z!dNHJ7mV=drb*@#k=aCaw*g*kvhwAkfbFD+rt(^BvWY6iS({eCL3Od!r2sLE9eq-y z%Nc-QDN&4PPN&h)L`GAdm(vE|%HZ93k#m-_>;7VyPG1vnS_VeBGNnbzX-(HG@QW_b z+iLI5ZdX#iY;BBA8@b3Kg`Lx>?xfT&0WC@U$Gf(4?v z8jUH>a3WGD=Xn{{K=Y9*LwQ$;VZ9Wz=Y=}09IX=#C?1Q<~maE`C5 zl3E3lpAlY8@tRC@32RY6-SfR|HGcI>n}j&TEmYwP;;-wA9%FL!IUQxe`xMNB^ zNOFT9Vg!Yhw3R#!+=#*|U_pqga4PUcPbmS)l+Oz?1U1==Bm=NhSf`RI(Y;y~CF9un zOjMNUa$l~#&SC$$&OmI+XQU*5LK)P4YI4!`P?~gBXf)&+HboqLri|Hm*D*okVJXAz zHwD?De!nUu`nD*U7YfQJlusV{zZf_u=QZ3jz^@tLedPd*MlqDbL_pBl9~yyxJo z;Q*uQ$cLapa2-_}JSipnCk5eQ7l8BFe{U`n_QCBC>`fRA@T=<{&*rVL!U z)&rAr@(PFCy}FL7eN;utO_VMXaUz5Sx>Z6eP|BNy6n!~Og;>?tlJ6c0`FrjtY1v*RFuLpGr$`$T^Ee$ivR(eQuWDFEgON zss|3rX)7NLz)l&$vW$5>D*ehS0W-<{-(14+uS=djjM54vrEuB~RqU7Rc1y8WEMT0u z{Mh*{UV9H5mi+RaDieL-3kYTRAGw@K`)$hq>&MH~fH%tI%8!?X&+Wni_lK(Q-|Jyd zha;cC7F7EJ1{IdOS*|+;`A?7R;i0sDh*=FyE@vqp?v!HQ<&(0?=mcEtfxVFDReZEe zOnV^$#}U{RAl3;aPJACLCH0*-R2(HDw{xol-( zbga#nefTWt#i=Q6`C@y?r?~vb=+ey$CobyfW`@_O?AD|g2k>yZI9+RA&Ym+V4|AL) zV5iIiu`yrwO27AU>G}R(NmO0ceAv`Z9+s0^q9|9ggL1WEU(TZQrD%?eiG5bU@%Ey) z`fUsRuNL^U0iG{b%%Yr`F@&-Iz<%r~JC{Z=CLK9>{3VbcA8MqRcE`}Hr={#!i<1&d zSw`mzW4vX-+jLC-skS~%-X-b*4q25v-Un`_L;d}zTN;xwA3`!01yZSXkZWEdJAE$ zsjO^cV5G06siTTD002Tm2jl7nCIJ8!S8q=vbtR;^g(VU`34j4S00syGfGx_)UDsIc zHh?Xfs>(<&tkWO4()})as-y0 z{k+}(=#Q~Xao_0=gQ0)e6B{6wY5uUo-+b#YpTAk*58Ju8+F^bE#O!Y8V)us!u^i*; zgT^vM2g^~u7_=Xj=dsN0?BjyL@((OixS(yl004^kqxVLm9I-5bWrXK#BV{bh001t+ z;otcFzp*#k9~&nCD7(2o^u#zgdLwV5xR8R9k`hP_w4XED+nd+G7Ug8?X@^vHb8)wI zeFy-5U-O?{0NJ11BC$yp6O`k&#?-2UzH&G4@|15r)*MT={F79ao3opbC(_H^7KKLg{?|qP z|K0K5!uq#3ZW*EN(Vl2m?5Rw#s|@4nfSqnvJB&BR%@v7p{qJV@|Fhe_#qbCJUe{P4 zFZ&Hp*zf@)QxpK?^8^4TCjcPU1y~E{pLx^4GX?(Kd1lOef3JHiW9@&*|4o3CuuZTR z#sT?9t!#7~iSqIE{lnOM;*Y=q@Bw0g0-yz$05;$zzzYZg;(#=u0H^|5fIe^=umJ7? zD8LbL0XzXeAP5KrqJTIc8Au0mfI^@Qs0QkRCZG-I0{Vd0z&J1sEC8#(2CxGh0>{92 z;1c^FgM$b`D%`@rMi1@H#=5PSv!AOsL92n&Q4A^}l`=tC?a_7G1<2qYGg0V#phLta9LA#;!o z$S24J6b2=SBB8ucX{ZL&1d4)sKtrJM&>UzLv=urCor7*dkDBDsWnGhHw^ec5uGKU@$5eCrlis0keQTfCa+hVfnBISTAe_whcRj!{M}W z9=I%AA8rfxhDX7(;dSsH_$+(}{sWf)ml;cuq7u=Ic#HT(NJw~tP=U~r(3>!ku$pjyaGmf6 z5jhbbktUHH(IcWHWsAWC#@kJCEX{3lieUwC9@-oAS)#sAloK~kh761lcUJP$;-%x$ag4U z6r2>A6b~rkD4tPFQXEr~QHoHSQugatw2v-{8Dqb|d;m+l_rr8ct2l0M1&@wVQ-D=(7a^lM8n&t*`i*h@1=WI7s0E@>&siqyU9nz zr^6S<*T#3m&(3ejpTa-P|64#*z*(S7U{#PzP)jgO@TK5aA#Nd*P_EFtFrl!T@FU@N z;S&)a5wu8w$g(K8sIF+VXus$$F>x_Zv3jwO;_Tx0#Ph_LBq$^dB;qATByl8_Bp*q3 zNnS{aNqI{(Nqv##m3ES@k=~c#ltIgs$!yEA%G$~n%WlXax>~wvx@&qI zdainH`hdQsewzL}15N`EgHA)3p@Ctp;jWROQIOHFF}bmgagFi!+e){SZm*i$H1RR% zHzhW;Hmx>2H&Zc7HQO-fHxD)+x1h7YShQQhEln*eEYGY|tPG zm$gr|-*=F8NOSn;DDRlz_z9zo$-$gF(0EYz;M_^ysnY4%+041Y1=r=CONT3&tCQ=X z8yB5uHwAVxHQ{s9C(>urSI#%r_lKXU-wS_I ze^>vBhujaJJlqRV3n&kS2BHG{gIIz>gEoT|gNs8zA@@W2AF(}(c(n6a{c%+&eyCIE zn=pZ})UeZVv+$P@j1i9`wjz!;)Q-7gOX@s!~Z)15&rsbkka&BA>=SJx#YsAI%WS zD9psq^vT@F(#dMiX3tK}zRGdTS;$q&ZOCKDdy;paZ$XFOx__GL8v|OxS z+*)#@B%>5o>RY;7W?D8}E>T`xL01u1@vG9ca-+(qYOq?oy1Is;CaD%&>r?x&&bn^; znaZ>Fdfxit2C9a*=fHEH=Le1V8W)?ioBCf!yr^&HXwGXPZ;5RMwLWY;ZgXtgXt!ve z>Co!ve<}U4rIW9-vWulFx0|v%=@tH~h*#G=0X=8E?!BM-9QwBVZTeRS%m?NN4F@NO zw1-AstGyl=Rvhjbksaw8l^X3BlNf6o7aMP#5S?gwBl@OgQf#tyN_?t)T5|g3jLgid zS^3$%IhDEB^P2PH3wjGPizbW9OV&#p%XZ8AZ=K(stoW{6u0CGFS&Mx~@-AbYVZG!% z*ZYPIv5oFcmCcDQ>RouUVe)D zO!_(R=;l%L7lkhq$L7a7C!QzQU*o^geycncIqg3)I9vbj^8NBW_6O~cstbvW;h$zd z_b&ae;8$6{xPHC-t^IrL+U5HCdKFLxU{EL&2MWW%f#Jch9|Bw$43_|bk57P)k03$( zRsN&;yYXM;pFu#_?=?aMAq@!$4FwSq5yc-tL_zwOE9u`A;yxrHJu;&yuE@%|F9}{*Pgy*uFS0IMygb3V$2 zfk2>;Kf_`Jg0Miz1Ql_}4Q*LHLSYm_DaDOSMtw8K_dPc$!%nE!*oBQ#ORiS{1mrJo zQa~QKuo=qSmQPb6-O@Z^9xcX~(UfDm5Mg0rFC@L1j_^+nQvZgv$qzmfVWEHDQH-xF zc_zXYR_5PBdNr@rs+3hN$RK!?6Sh<8NLJaGyCt6!f3W_^#KM}vmAx=u!?UznH4WAJ z^z=s610~xmA!F62@1{O1Jgl{S%)QlrcegaJnL(mP_G!euG$ZbsPQVBit2^X1vQ1l? z$zh=|;VPzY!1>>#7TC^l5c8W+gtm5M|gY-mDPO6r1&mV%ycMjeUX&zXsAO zFMj!IQGJus(=@r*t$Uy}l%@1>U+&-;V&I%E`OM5V<~9%VOjI&MEyd(F=imdh8H<5V z{u`Z|9d2=XFQo{#klhHjz^lJ<^jH3HPuPDXefZDBQT)K>@2jJdjKyC`HHu)3;3~#f z60Ayh?>DA;mvFoL!I~sj!GU_YnomO~i}MGWje=f-yCiFDNj5Bx>K_L!W;J(Kz6OBv zx_pabN$n^TKSkMq^GN>kv1cuz#{0pJOpsY=u=k#O6gCH_Y<_k!_Eu_P~!fu?x1N+4yJ@nMBk z45)i-b8(ZB*&xNfxtHCX^x4^BK;2ybw04uTi>%hqNAvQN0jAG7-%7B;vSny*`;@#66O;nO;M8SE)cxGr{k|FjpFl>QT1)a(eYGwo+8| z2;X#sJpMLa?3=y>%EX*N!%0&aiDzOtY#I;m%Iex(sc;H((eyZR^|Zv|o|DiDw^CjM zDV^8Aa?b^GhOkJ1=9g;ur{2G}PZ{U8k0&bLF1*Odx(0Sbjs!!D<$t}DN9bva(7)xq zatFcFCN(b~-SV)EH&#sAu>P4x)cJ7_P<+*-ZwzrMnVII53duva5O5=^k;%YMcOLGA z;>BNcUGmX;<-}k`WG~^@=LxTzWPiu9aXM}_m&ZJpkG_q3R2;Tb@zD(pVv3QE0qBQRw(&*Wj8n-}}7FI02kLyinjgC)4j z33Y0yD6MbT^v6=LV%HyQ1W&|`5|aUARNRdk>$XZwS(FK_Xx^B!fXE#Sizoew+_sZNe@YaoHN1 zFDT>8-cui!8>Z8|TdHQb25hYi!aaJvQj5pgS8n)ss^}GsGVwM~s}1I=zNn}!8*J_8 zmCz1o%-Sn3^CIXJdHpGxi& zg)we+KvOsDy=UYOb~kycj1vk1MV5W(8;mc-SB%ZnIb{R&PUJ$v!Yqs=A2ntBSm%{;Vy*7>FKaeP@{Fu zV07Q{`ZxbC?`zJlr1HgWbG|bUel&aF5c~^g^iZhFj1%K z%C&|bb}4l{lavv_g$76)$M^dsJBZ6lxaI@tL>Z`sy<5UAxY{aXABCT8M3`9T$FrM| z0aHzcmyKkc7jAq}U!J9XZTSN;YSzJ?Xhb~g35>RMba`)%!=pWbAu)@?`7Xn(tfjZ~ z1@q35)7y1^eTIG%hiQ;AH71{--v`D=xZ>;rJuEbzzDLaX;R{9*ZH~$ivqL^#+r5nt z<4((~dG)!}mB>lUoYcVHsVlURXy2#VTXXwYbqHBerDY0~)+=k{yHt8_Af$<8YoFu? z_*^VgyY3PPg;#KHZZ%uVg{~}p(QyjXq$GuVMM>=Q1Xv49#l-Bt)31)Xpqv;E^wMd% zY3%D&TGQ*KZ(Ya7_jTg^j7N8V&+`RazvRmojdHhA8Putd*8RtCz{J8kyiz*pEg2(O zF2vY+)n+b+XH}d7d5pF{`;xCC9h?R{DBd~u&2kbQ-qr9`w~vYzQ?ZvxxPPe7)!iAV zpI)#+E%!w@AxhleWh}?9M8^oDPnD zWQ5K8IZA|N+a`;AQH2#sma+f*#|l7Cn~=+u$+Wyr^@6u? zmh3=6Z>cBjAqt~$p!DhtGEEZK4y>9kKNpIkN&L<^@%Q*F24M|&Ql%((iL;p1CWj!Q=B!K0^< zA0?=pt+&UjgiYB$#3wkNk8vU~fH~P#K$>mqp4H>HK+!~WJKCW`x9UmKjX@&DUg(Qx zRP*o97Hv|Cc;t9?r6Ao1C%+MWZPCZpOHP~5gnI79CSh?J8Brb2MB{&8URHac1$I*k zPc+8a1T30o7@|EW#zI;(Rh(Sm{|y`vAgmU5PqYn_dZ$A+Xsc7f*=k$jF%6I^up z3VK+;W%Fe7Sg?+;2m4lr#NfB`7%EmKhl*N38 z6wzv>Kyg-$QmG2urCmDl*iK7#H)rPcR9n#qtOlu8#^#U?OebWVTnkrMI=6(a?Sp^*vp4jkGA;|ytQ|fp(o`nvyh=OoYB*M zYRZkfU9QyVT%KO5HPT{6$(>vh!NaR)G(SIdyMnG^EAr!FZH8&y^m|b=U)#~c>D!O1 z&eQ5Yj!WO{y;{&l3#{yvjE)P9i9Lrd5ZDT>^ljm$o#huDyfn>Gy;QS{WVV-JTRJ=| ze;;#C;J%pyLB9u)t34cjAP%)AoldH#wa>}ve%4PIss8DGuk3tbrTl}}jTM_qbuQEO znMC$Nk&5@8%3VKQ|>=ej>QqXh|@ld1a7t4IN-! zXKZECaTk)aOaBD&$qn|+QHndzqQbJTRMQXPL>rl+cvr{*yG|4j zH-p(sa!Rz%;df7=wJjgOKL5KERyI9@ld?Bo&Wn8YOdeZ>&%_`@xL$GTX!!o5+>?zM z>g4%IAN6BJioA;4Y49TTS-q8`_{*W}D1Fi$%>4o?-PD@mJMo7jIBg6r_E1O^YirrC zaoN3HG6H?ns?(?B*IPI5pS;;M7Rg(bY>#yfQ(o2%b&AX*@bt}kro^W_dJKUq|)nD9u^&}n+i)H$9oBNrbR z);awiRj*N}9J4+!v|Rn{$p7y(yJ47JCR9SuON zx_5HrS$fjK-56GC`^Gh%I^c!cwrE)1Pk4d$$ZCd=Z4p<=f#cH)0n?!igq3GxDIKDiUn=l_nSMZF`TIy*NF8{tGS7t^|f4lp8IFrp( z>d)vG<~KH<7j+72A8EWHogWO{-GD18p~qL^_BkxNRE%3Pk&p2v{m&+aU+V#~ILeSF zQqrFK!YQHV!5lV{mC&_b89pi`_U2*bN0MVCE%A^zvx{eL_NSkz9y0yrd8f4{lo8<5 zZjbickQqu>g8ovJw3pbIY76V5l9rBn{+xPVC9UG{&87ZlVL^&Sy0kldNZBb`=YA%- z*LMapVQZl-plpUhyIbpo96=@@Qq@AdE95F3WZaE@dyBR_f_7+>UH_qc4f^!HQ+QM_ zBfMOdQ^5*V{f*mv5HtIZnr}}pa_Z!1VNU!tpmPoA5ekhBV$Pa2wj{h5g6Mp~bg^>?M=fm%W9T_@Up0&8tVxcl5KfBLA# zUI%*f$qb8~Hescqpx2_4>k&9KoP}AEjIYwGf|$}?6^-fDGtAq@eIU71%>15AxB8BSf)S1$uyp~(}Ztk|(>?`!P zaD))?V%7JN#BOqlfUCA>1z#hCgobR)8h>!vr83$Fmq8ubE0_phX%{_C#2iTdK0K7+ zS;41V#>qMa_uZ3kYZBGmE)X}LWd2^5RT8ePdulj%C|0Y1iFOW5Sjv-%-(U8)vir5( z#jL!<)Lx&&&dk=jbXVjAKS3P(^7ww}M{y;pnts@j$EHM+SkJ65%+u_PWUi_4)?z6ZvQG7 zl#A{p;R1xZp7438Z}#-hb?GE*Wba(^5@kD;TR(W2QI*jqG{)A}dUIALUTxQx4J<a8swoU{HoI`5!gm-zKb&k7Px_HejD&@is_%{}*dYd^Z$OZmY`ILUztJgj)9%PGBg zhbWSI?bu34598Q1(CX2FNB^`oq=jwiP1-OUa^AMLR-0?y{EU%!{F7;(?PQ+^ zk&gfYxAF?%^05LXP0$+N0SI%qO|$8{=N5Ir;`e@L8hh0Obdqbpg$?||Xh9%-be=>+ z7~b|(>(i!e$!0u;HMjaz<={l|r?e9^vJZMjcm$4K>du_@z8t;f1MQj@6Y=$(R_Bl4 zaN~Na&03NkZx?CcIiw*$F@)eEp7=_TTjnF{@_feAzm2)#O0qQCsd}~s{kE5EFd5&hyBYh^0gmX6Orr0LW&S;*_ANgV&Hez|MFi&^Cw z=#*=~Pv+Ge`jDV0^W5RmigU~ipCiNSeq)#=t9j`0`OkP`yS`UZ>peRU7maTUncPQV2 zc8c2I4>8i3(m2bNZ#JVm!CiK%2&98g-j}w!{qI$i=&HCSY(J76h-i8r5(#f6BRdB* zpLE7dTjkdun40mF@8=lPI)93elUddJvE;ci@&n0O9ZF{hX$kQjFMeh%#j;SFShnmP zep$MbYnL-dKY`O886gZhz~9mQ$^5IDfqZkQlQjF)y}l&%%}6c623w=tNV+1| zC2?WABV4v$zcQ`f>T3Ny)K5fGcCj_Sd-+(B_D7QhP2bdA$#TJY^QANoallm{yYE-s zm(AFci2dQ)4C~DBl$=bqobgSSXK3w>5#o0$RK7L+aj`9+D)dGHrAZ`%oy^zgiO7L- z?#2^ZDWPKHK2aS)K2(Em(@CQ=u~ngl&ZTh@jg+t+y$#93`{geL!?*o8b&8@ABl}h& zQ-Tw_*nVl7wxt}|%dx-EkmTs#Ncz43>IDFvAmzh#5aHKmUx-47H78;JX89S{%j)hm zVQNM%$>G60`rNfFs-|b(%P~$=6OW|;`4$$vxIA<~of~PXVzwQq2%@jA7nkH!x56D( z>dsV>XU{l3x#j-`$!;@l^9}oQ6Ylp+X*Pq2wIB=5@F*ZS%Zr|$Gjk<7gP-UQPxl{g){uWQT~HYi8@s(XFzXu1f~V zuPc;y%L+AgGb;yBYnB8pT0K6Gwkin^RPQFoQM{7fTo*iXW1h;{txL&$ni9<&^g0W< z6ZzUjEvIkj#t4(TbyOvu$cfL!Ov&M5d56B2_Ccldhakx;F;?EEpt)b92LZX-T865Mq zFW3f~F$iYS zWX@cbC&{6`Gs(rQodhwLMKQ_8r5k~s^%1tkGKIvz-eEz=LTN=&IBH3s^79U}cRtAk zhaOtO%UfhB=4)|1QGOnyhd8@lD|e=TYggWsYY>%8av7*lNpNIp6;{78c`rQV@`9qp zl~J4G>rW3oS4-S+`RpQ1a&aiGtV#ENkz+C*r)yK8;ON2d-Zz=FDa)|6*LwLPU-2jE zxWqGh3ATiZDMB22r%zL|a!)Nv6X`9;{0jp!dgT>}^)8;_@sT(`t<-(Wz%-CONB#jM zwmcfvtn2*^?=yPx?Q`V-v_AY~@r4sBgV-gbak|HiqF~O6+hIgQZ-nM%J(nAli|<&P zTM>9mVt>Q*bSjKR)kv8=-|(-I(6Vmy5SF5q4fq{4COYutk_^K)-0K+LOm};}uia_%T`kp>qeEgy1F?A1QCj(LaOSCS6)lPIs5qiC{p;2qR&n3F+ zpGA_>25|0!7!zf=4t(;vmokTrSKu4R!y`X$warSj#d0{8Ac!*`vDd(H$5K=-29@>tMQsAaBs3Sqw+oJ zmx!M;G`G~ldtFeG^gPZ-_ z9waBQjRSm>mgOhbN%Ohs&0^et4*XR@ zT(tou(&y6=&e*>O|Gl9f6^K>J?kmZNeNiH9jIJui#UEIVM5fDyoRL&Ys@Zg7rGotz z6*ft=^Dk;9GW})J=cU||k@WAoX${|S`;D%bau;9>yDw+b)kTUr&#T80Z4E3gXYeH> znL$m?4HpW}2 literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/dark/otoczenie.png b/2013/daemon/public/static/dark/otoczenie.png new file mode 100644 index 0000000000000000000000000000000000000000..cc46e47a1d7cf50d5fc06a991fc9d795448b8502 GIT binary patch literal 17321 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 U7{^I^3jhEB07*qoM6N<$f~)sOBme*a literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/dark/poczta.png b/2013/daemon/public/static/dark/poczta.png new file mode 100644 index 0000000000000000000000000000000000000000..f3c8a332e42f40dcb5088ffa2ac244556a1d92bd GIT binary patch literal 16826 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 *, .box, fieldset, table.border th, table.border td {background-color:black; background-color:rgba(0, 0, 0, 0.5)} + body {background-image: url(bg.jpg)} + a:link, a:visited {font-weight:bold; color:red} + a:link:focus, a:visited:focus {color:red; background-color:white} + a:link:hover, a:visited:hover {color:red; background-color:white} + .msg {outline-color:red} + .msg, .msg > * {color:yellow; background-color:inherit} + input, select, textarea, button {border-color:#fff; color:white; background-color:black} + input:focus, select:focus, select:focus *, textarea:focus, button:focus, button:focus *, + input:hover, select:hover, select:hover *, textarea:hover, button:hover, button:hover * + {color:white; border-color:red; background-color:#333} + [disabled], [disabled]:hover {color:gray; border-color:gray; outline-color:gray; background-color:black} + button {background-image:-moz-linear-gradient(center top, gray, black)} + button {background-image:-webkit-gradient(linear, left top, left bottom, from(gray), to(black));} + #menu .menu-map {background-image:url(otoczenie.png)} + #menu .menu-character {background-image:url(postac.png)} + #menu .menu-inventory {background-image:url(ekwip.png)} + #menu .menu-clan {background-image:url(klan.png)} + #menu .menu-mail {background-image:url(poczta.png)} + #menu .menu-chat {background-image:url(forum.png)} + #menu .menu-account {background-image:url(konto.png)} + #menu .menu-register {background-image:url(konto.png)} + #menu .menu-stats {background-image:url(ranking.png)} + #menu .menu-help {background-image:url(pomoc.png)} +} diff --git a/2013/daemon/public/static/favicon.png b/2013/daemon/public/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..282fcc731ca83ecce1b5781106c2ba0ca9cd164a GIT binary patch literal 238 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61SBU+%rFB|jKx9jP7LeL$-D$|I14-?iy0WW zg+Z8+Vb&Z8pdfpRr>`sf4HjvBQ}e)&NftmM$r9Iy66gHf+|;}h2Ir#G#FEq$h4Rdj z30{&)V3iec_a8!Fum=E41DI?mXk-@Zi)* z$8)z{GmAK>Gc=U%{OsO#$o|Sw<=hp!e_M#vgirW9Z4QU2K{E^ch4rhPqh8$i<#xLe c8GemXKfzAoc*8koPoOmnp00i_>zopr018M;!~g&Q literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/feed.png b/2013/daemon/public/static/feed.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c949d2244f2c0c81d65e74719af2a1b56d06a3 GIT binary patch literal 689 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 EAKS+a4gdfE literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/item-types/armor.gif b/2013/daemon/public/static/item-types/armor.gif new file mode 100644 index 0000000000000000000000000000000000000000..11ee027fc246f2c7f7f89cd778c7768dfbb52d18 GIT binary patch literal 11526 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 B-BADl literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/item-types/boots.gif b/2013/daemon/public/static/item-types/boots.gif new file mode 100644 index 0000000000000000000000000000000000000000..b94f6279f792fb2025dcc1cf0beffd28dae8ae10 GIT binary patch literal 11917 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 BXt@9Y literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/item-types/gloves.gif b/2013/daemon/public/static/item-types/gloves.gif new file mode 100644 index 0000000000000000000000000000000000000000..e2d4af6f20e58c92a9a9af32e9bba23d27d17708 GIT binary patch literal 10783 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 dVdpKLfA$ai@f78Y literal 0 HcmV?d00001 diff --git a/2013/daemon/public/static/item-types/pendant.gif b/2013/daemon/public/static/item-types/pendant.gif new file mode 100644 index 0000000000000000000000000000000000000000..c85c3459e64249da3623e8ae7ad15269dd5ea133 GIT binary patch literal 12595 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%0DqVFT%Q?f6>qtx3(y(=l@fF-`zUYD-?5&3O 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