initial commit
working generation of big panels for Plamen campaign
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
**/*.png
|
||||
!parts/*.png
|
||||
.DS_Store
|
||||
13
Pipfile
Normal file
@@ -0,0 +1,13 @@
|
||||
[[source]]
|
||||
url = "https://pypi.org/simple"
|
||||
verify_ssl = true
|
||||
name = "pypi"
|
||||
|
||||
[packages]
|
||||
pillow = "9.5.0"
|
||||
requests = "*"
|
||||
|
||||
[dev-packages]
|
||||
|
||||
[requires]
|
||||
python_version = "3.10"
|
||||
206
Pipfile.lock
generated
Normal file
@@ -0,0 +1,206 @@
|
||||
{
|
||||
"_meta": {
|
||||
"hash": {
|
||||
"sha256": "22548ae00762b9b7bcdd00701e9ffe30358d1a942f9b9841e5c741b6a044017d"
|
||||
},
|
||||
"pipfile-spec": 6,
|
||||
"requires": {
|
||||
"python_version": "3.10"
|
||||
},
|
||||
"sources": [
|
||||
{
|
||||
"name": "pypi",
|
||||
"url": "https://pypi.org/simple",
|
||||
"verify_ssl": true
|
||||
}
|
||||
]
|
||||
},
|
||||
"default": {
|
||||
"certifi": {
|
||||
"hashes": [
|
||||
"sha256:0f0d56dc5a6ad56fd4ba36484d6cc34451e1c6548c61daad8c320169f91eddc7",
|
||||
"sha256:c6c2e98f5c7869efca1f8916fed228dd91539f9f1b444c314c06eef02980c716"
|
||||
],
|
||||
"markers": "python_version >= '3.6'",
|
||||
"version": "==2023.5.7"
|
||||
},
|
||||
"charset-normalizer": {
|
||||
"hashes": [
|
||||
"sha256:04afa6387e2b282cf78ff3dbce20f0cc071c12dc8f685bd40960cc68644cfea6",
|
||||
"sha256:04eefcee095f58eaabe6dc3cc2262f3bcd776d2c67005880894f447b3f2cb9c1",
|
||||
"sha256:0be65ccf618c1e7ac9b849c315cc2e8a8751d9cfdaa43027d4f6624bd587ab7e",
|
||||
"sha256:0c95f12b74681e9ae127728f7e5409cbbef9cd914d5896ef238cc779b8152373",
|
||||
"sha256:0ca564606d2caafb0abe6d1b5311c2649e8071eb241b2d64e75a0d0065107e62",
|
||||
"sha256:10c93628d7497c81686e8e5e557aafa78f230cd9e77dd0c40032ef90c18f2230",
|
||||
"sha256:11d117e6c63e8f495412d37e7dc2e2fff09c34b2d09dbe2bee3c6229577818be",
|
||||
"sha256:11d3bcb7be35e7b1bba2c23beedac81ee893ac9871d0ba79effc7fc01167db6c",
|
||||
"sha256:12a2b561af122e3d94cdb97fe6fb2bb2b82cef0cdca131646fdb940a1eda04f0",
|
||||
"sha256:12d1a39aa6b8c6f6248bb54550efcc1c38ce0d8096a146638fd4738e42284448",
|
||||
"sha256:1435ae15108b1cb6fffbcea2af3d468683b7afed0169ad718451f8db5d1aff6f",
|
||||
"sha256:1c60b9c202d00052183c9be85e5eaf18a4ada0a47d188a83c8f5c5b23252f649",
|
||||
"sha256:1e8fcdd8f672a1c4fc8d0bd3a2b576b152d2a349782d1eb0f6b8e52e9954731d",
|
||||
"sha256:20064ead0717cf9a73a6d1e779b23d149b53daf971169289ed2ed43a71e8d3b0",
|
||||
"sha256:21fa558996782fc226b529fdd2ed7866c2c6ec91cee82735c98a197fae39f706",
|
||||
"sha256:22908891a380d50738e1f978667536f6c6b526a2064156203d418f4856d6e86a",
|
||||
"sha256:3160a0fd9754aab7d47f95a6b63ab355388d890163eb03b2d2b87ab0a30cfa59",
|
||||
"sha256:322102cdf1ab682ecc7d9b1c5eed4ec59657a65e1c146a0da342b78f4112db23",
|
||||
"sha256:34e0a2f9c370eb95597aae63bf85eb5e96826d81e3dcf88b8886012906f509b5",
|
||||
"sha256:3573d376454d956553c356df45bb824262c397c6e26ce43e8203c4c540ee0acb",
|
||||
"sha256:3747443b6a904001473370d7810aa19c3a180ccd52a7157aacc264a5ac79265e",
|
||||
"sha256:38e812a197bf8e71a59fe55b757a84c1f946d0ac114acafaafaf21667a7e169e",
|
||||
"sha256:3a06f32c9634a8705f4ca9946d667609f52cf130d5548881401f1eb2c39b1e2c",
|
||||
"sha256:3a5fc78f9e3f501a1614a98f7c54d3969f3ad9bba8ba3d9b438c3bc5d047dd28",
|
||||
"sha256:3d9098b479e78c85080c98e1e35ff40b4a31d8953102bb0fd7d1b6f8a2111a3d",
|
||||
"sha256:3dc5b6a8ecfdc5748a7e429782598e4f17ef378e3e272eeb1340ea57c9109f41",
|
||||
"sha256:4155b51ae05ed47199dc5b2a4e62abccb274cee6b01da5b895099b61b1982974",
|
||||
"sha256:49919f8400b5e49e961f320c735388ee686a62327e773fa5b3ce6721f7e785ce",
|
||||
"sha256:53d0a3fa5f8af98a1e261de6a3943ca631c526635eb5817a87a59d9a57ebf48f",
|
||||
"sha256:5f008525e02908b20e04707a4f704cd286d94718f48bb33edddc7d7b584dddc1",
|
||||
"sha256:628c985afb2c7d27a4800bfb609e03985aaecb42f955049957814e0491d4006d",
|
||||
"sha256:65ed923f84a6844de5fd29726b888e58c62820e0769b76565480e1fdc3d062f8",
|
||||
"sha256:6734e606355834f13445b6adc38b53c0fd45f1a56a9ba06c2058f86893ae8017",
|
||||
"sha256:6baf0baf0d5d265fa7944feb9f7451cc316bfe30e8df1a61b1bb08577c554f31",
|
||||
"sha256:6f4f4668e1831850ebcc2fd0b1cd11721947b6dc7c00bf1c6bd3c929ae14f2c7",
|
||||
"sha256:6f5c2e7bc8a4bf7c426599765b1bd33217ec84023033672c1e9a8b35eaeaaaf8",
|
||||
"sha256:6f6c7a8a57e9405cad7485f4c9d3172ae486cfef1344b5ddd8e5239582d7355e",
|
||||
"sha256:7381c66e0561c5757ffe616af869b916c8b4e42b367ab29fedc98481d1e74e14",
|
||||
"sha256:73dc03a6a7e30b7edc5b01b601e53e7fc924b04e1835e8e407c12c037e81adbd",
|
||||
"sha256:74db0052d985cf37fa111828d0dd230776ac99c740e1a758ad99094be4f1803d",
|
||||
"sha256:75f2568b4189dda1c567339b48cba4ac7384accb9c2a7ed655cd86b04055c795",
|
||||
"sha256:78cacd03e79d009d95635e7d6ff12c21eb89b894c354bd2b2ed0b4763373693b",
|
||||
"sha256:80d1543d58bd3d6c271b66abf454d437a438dff01c3e62fdbcd68f2a11310d4b",
|
||||
"sha256:830d2948a5ec37c386d3170c483063798d7879037492540f10a475e3fd6f244b",
|
||||
"sha256:891cf9b48776b5c61c700b55a598621fdb7b1e301a550365571e9624f270c203",
|
||||
"sha256:8f25e17ab3039b05f762b0a55ae0b3632b2e073d9c8fc88e89aca31a6198e88f",
|
||||
"sha256:9a3267620866c9d17b959a84dd0bd2d45719b817245e49371ead79ed4f710d19",
|
||||
"sha256:a04f86f41a8916fe45ac5024ec477f41f886b3c435da2d4e3d2709b22ab02af1",
|
||||
"sha256:aaf53a6cebad0eae578f062c7d462155eada9c172bd8c4d250b8c1d8eb7f916a",
|
||||
"sha256:abc1185d79f47c0a7aaf7e2412a0eb2c03b724581139193d2d82b3ad8cbb00ac",
|
||||
"sha256:ac0aa6cd53ab9a31d397f8303f92c42f534693528fafbdb997c82bae6e477ad9",
|
||||
"sha256:ac3775e3311661d4adace3697a52ac0bab17edd166087d493b52d4f4f553f9f0",
|
||||
"sha256:b06f0d3bf045158d2fb8837c5785fe9ff9b8c93358be64461a1089f5da983137",
|
||||
"sha256:b116502087ce8a6b7a5f1814568ccbd0e9f6cfd99948aa59b0e241dc57cf739f",
|
||||
"sha256:b82fab78e0b1329e183a65260581de4375f619167478dddab510c6c6fb04d9b6",
|
||||
"sha256:bd7163182133c0c7701b25e604cf1611c0d87712e56e88e7ee5d72deab3e76b5",
|
||||
"sha256:c36bcbc0d5174a80d6cccf43a0ecaca44e81d25be4b7f90f0ed7bcfbb5a00909",
|
||||
"sha256:c3af8e0f07399d3176b179f2e2634c3ce9c1301379a6b8c9c9aeecd481da494f",
|
||||
"sha256:c84132a54c750fda57729d1e2599bb598f5fa0344085dbde5003ba429a4798c0",
|
||||
"sha256:cb7b2ab0188829593b9de646545175547a70d9a6e2b63bf2cd87a0a391599324",
|
||||
"sha256:cca4def576f47a09a943666b8f829606bcb17e2bc2d5911a46c8f8da45f56755",
|
||||
"sha256:cf6511efa4801b9b38dc5546d7547d5b5c6ef4b081c60b23e4d941d0eba9cbeb",
|
||||
"sha256:d16fd5252f883eb074ca55cb622bc0bee49b979ae4e8639fff6ca3ff44f9f854",
|
||||
"sha256:d2686f91611f9e17f4548dbf050e75b079bbc2a82be565832bc8ea9047b61c8c",
|
||||
"sha256:d7fc3fca01da18fbabe4625d64bb612b533533ed10045a2ac3dd194bfa656b60",
|
||||
"sha256:dd5653e67b149503c68c4018bf07e42eeed6b4e956b24c00ccdf93ac79cdff84",
|
||||
"sha256:de5695a6f1d8340b12a5d6d4484290ee74d61e467c39ff03b39e30df62cf83a0",
|
||||
"sha256:e0ac8959c929593fee38da1c2b64ee9778733cdf03c482c9ff1d508b6b593b2b",
|
||||
"sha256:e1b25e3ad6c909f398df8921780d6a3d120d8c09466720226fc621605b6f92b1",
|
||||
"sha256:e633940f28c1e913615fd624fcdd72fdba807bf53ea6925d6a588e84e1151531",
|
||||
"sha256:e89df2958e5159b811af9ff0f92614dabf4ff617c03a4c1c6ff53bf1c399e0e1",
|
||||
"sha256:ea9f9c6034ea2d93d9147818f17c2a0860d41b71c38b9ce4d55f21b6f9165a11",
|
||||
"sha256:f645caaf0008bacf349875a974220f1f1da349c5dbe7c4ec93048cdc785a3326",
|
||||
"sha256:f8303414c7b03f794347ad062c0516cee0e15f7a612abd0ce1e25caf6ceb47df",
|
||||
"sha256:fca62a8301b605b954ad2e9c3666f9d97f63872aa4efcae5492baca2056b74ab"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==3.1.0"
|
||||
},
|
||||
"idna": {
|
||||
"hashes": [
|
||||
"sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4",
|
||||
"sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"
|
||||
],
|
||||
"markers": "python_version >= '3.5'",
|
||||
"version": "==3.4"
|
||||
},
|
||||
"pillow": {
|
||||
"hashes": [
|
||||
"sha256:07999f5834bdc404c442146942a2ecadd1cb6292f5229f4ed3b31e0a108746b1",
|
||||
"sha256:0852ddb76d85f127c135b6dd1f0bb88dbb9ee990d2cd9aa9e28526c93e794fba",
|
||||
"sha256:1781a624c229cb35a2ac31cc4a77e28cafc8900733a864870c49bfeedacd106a",
|
||||
"sha256:1e7723bd90ef94eda669a3c2c19d549874dd5badaeefabefd26053304abe5799",
|
||||
"sha256:229e2c79c00e85989a34b5981a2b67aa079fd08c903f0aaead522a1d68d79e51",
|
||||
"sha256:22baf0c3cf0c7f26e82d6e1adf118027afb325e703922c8dfc1d5d0156bb2eeb",
|
||||
"sha256:252a03f1bdddce077eff2354c3861bf437c892fb1832f75ce813ee94347aa9b5",
|
||||
"sha256:2dfaaf10b6172697b9bceb9a3bd7b951819d1ca339a5ef294d1f1ac6d7f63270",
|
||||
"sha256:322724c0032af6692456cd6ed554bb85f8149214d97398bb80613b04e33769f6",
|
||||
"sha256:35f6e77122a0c0762268216315bf239cf52b88865bba522999dc38f1c52b9b47",
|
||||
"sha256:375f6e5ee9620a271acb6820b3d1e94ffa8e741c0601db4c0c4d3cb0a9c224bf",
|
||||
"sha256:3ded42b9ad70e5f1754fb7c2e2d6465a9c842e41d178f262e08b8c85ed8a1d8e",
|
||||
"sha256:432b975c009cf649420615388561c0ce7cc31ce9b2e374db659ee4f7d57a1f8b",
|
||||
"sha256:482877592e927fd263028c105b36272398e3e1be3269efda09f6ba21fd83ec66",
|
||||
"sha256:489f8389261e5ed43ac8ff7b453162af39c3e8abd730af8363587ba64bb2e865",
|
||||
"sha256:54f7102ad31a3de5666827526e248c3530b3a33539dbda27c6843d19d72644ec",
|
||||
"sha256:560737e70cb9c6255d6dcba3de6578a9e2ec4b573659943a5e7e4af13f298f5c",
|
||||
"sha256:5671583eab84af046a397d6d0ba25343c00cd50bce03787948e0fff01d4fd9b1",
|
||||
"sha256:5ba1b81ee69573fe7124881762bb4cd2e4b6ed9dd28c9c60a632902fe8db8b38",
|
||||
"sha256:5d4ebf8e1db4441a55c509c4baa7a0587a0210f7cd25fcfe74dbbce7a4bd1906",
|
||||
"sha256:60037a8db8750e474af7ffc9faa9b5859e6c6d0a50e55c45576bf28be7419705",
|
||||
"sha256:608488bdcbdb4ba7837461442b90ea6f3079397ddc968c31265c1e056964f1ef",
|
||||
"sha256:6608ff3bf781eee0cd14d0901a2b9cc3d3834516532e3bd673a0a204dc8615fc",
|
||||
"sha256:662da1f3f89a302cc22faa9f14a262c2e3951f9dbc9617609a47521c69dd9f8f",
|
||||
"sha256:7002d0797a3e4193c7cdee3198d7c14f92c0836d6b4a3f3046a64bd1ce8df2bf",
|
||||
"sha256:763782b2e03e45e2c77d7779875f4432e25121ef002a41829d8868700d119392",
|
||||
"sha256:77165c4a5e7d5a284f10a6efaa39a0ae8ba839da344f20b111d62cc932fa4e5d",
|
||||
"sha256:7c9af5a3b406a50e313467e3565fc99929717f780164fe6fbb7704edba0cebbe",
|
||||
"sha256:7ec6f6ce99dab90b52da21cf0dc519e21095e332ff3b399a357c187b1a5eee32",
|
||||
"sha256:833b86a98e0ede388fa29363159c9b1a294b0905b5128baf01db683672f230f5",
|
||||
"sha256:84a6f19ce086c1bf894644b43cd129702f781ba5751ca8572f08aa40ef0ab7b7",
|
||||
"sha256:8507eda3cd0608a1f94f58c64817e83ec12fa93a9436938b191b80d9e4c0fc44",
|
||||
"sha256:85ec677246533e27770b0de5cf0f9d6e4ec0c212a1f89dfc941b64b21226009d",
|
||||
"sha256:8aca1152d93dcc27dc55395604dcfc55bed5f25ef4c98716a928bacba90d33a3",
|
||||
"sha256:8d935f924bbab8f0a9a28404422da8af4904e36d5c33fc6f677e4c4485515625",
|
||||
"sha256:8f36397bf3f7d7c6a3abdea815ecf6fd14e7fcd4418ab24bae01008d8d8ca15e",
|
||||
"sha256:91ec6fe47b5eb5a9968c79ad9ed78c342b1f97a091677ba0e012701add857829",
|
||||
"sha256:965e4a05ef364e7b973dd17fc765f42233415974d773e82144c9bbaaaea5d089",
|
||||
"sha256:96e88745a55b88a7c64fa49bceff363a1a27d9a64e04019c2281049444a571e3",
|
||||
"sha256:99eb6cafb6ba90e436684e08dad8be1637efb71c4f2180ee6b8f940739406e78",
|
||||
"sha256:9adf58f5d64e474bed00d69bcd86ec4bcaa4123bfa70a65ce72e424bfb88ed96",
|
||||
"sha256:9b1af95c3a967bf1da94f253e56b6286b50af23392a886720f563c547e48e964",
|
||||
"sha256:a0aa9417994d91301056f3d0038af1199eb7adc86e646a36b9e050b06f526597",
|
||||
"sha256:a0f9bb6c80e6efcde93ffc51256d5cfb2155ff8f78292f074f60f9e70b942d99",
|
||||
"sha256:a127ae76092974abfbfa38ca2d12cbeddcdeac0fb71f9627cc1135bedaf9d51a",
|
||||
"sha256:aaf305d6d40bd9632198c766fb64f0c1a83ca5b667f16c1e79e1661ab5060140",
|
||||
"sha256:aca1c196f407ec7cf04dcbb15d19a43c507a81f7ffc45b690899d6a76ac9fda7",
|
||||
"sha256:ace6ca218308447b9077c14ea4ef381ba0b67ee78d64046b3f19cf4e1139ad16",
|
||||
"sha256:b416f03d37d27290cb93597335a2f85ed446731200705b22bb927405320de903",
|
||||
"sha256:bf548479d336726d7a0eceb6e767e179fbde37833ae42794602631a070d630f1",
|
||||
"sha256:c1170d6b195555644f0616fd6ed929dfcf6333b8675fcca044ae5ab110ded296",
|
||||
"sha256:c380b27d041209b849ed246b111b7c166ba36d7933ec6e41175fd15ab9eb1572",
|
||||
"sha256:c446d2245ba29820d405315083d55299a796695d747efceb5717a8b450324115",
|
||||
"sha256:c830a02caeb789633863b466b9de10c015bded434deb3ec87c768e53752ad22a",
|
||||
"sha256:cb841572862f629b99725ebaec3287fc6d275be9b14443ea746c1dd325053cbd",
|
||||
"sha256:cfa4561277f677ecf651e2b22dc43e8f5368b74a25a8f7d1d4a3a243e573f2d4",
|
||||
"sha256:cfcc2c53c06f2ccb8976fb5c71d448bdd0a07d26d8e07e321c103416444c7ad1",
|
||||
"sha256:d3c6b54e304c60c4181da1c9dadf83e4a54fd266a99c70ba646a9baa626819eb",
|
||||
"sha256:d3d403753c9d5adc04d4694d35cf0391f0f3d57c8e0030aac09d7678fa8030aa",
|
||||
"sha256:d9c206c29b46cfd343ea7cdfe1232443072bbb270d6a46f59c259460db76779a",
|
||||
"sha256:e49eb4e95ff6fd7c0c402508894b1ef0e01b99a44320ba7d8ecbabefddcc5569",
|
||||
"sha256:f8286396b351785801a976b1e85ea88e937712ee2c3ac653710a4a57a8da5d9c",
|
||||
"sha256:f8fc330c3370a81bbf3f88557097d1ea26cd8b019d6433aa59f71195f5ddebbf",
|
||||
"sha256:fbd359831c1657d69bb81f0db962905ee05e5e9451913b18b831febfe0519082",
|
||||
"sha256:fe7e1c262d3392afcf5071df9afa574544f28eac825284596ac6db56e6d11062",
|
||||
"sha256:fed1e1cf6a42577953abbe8e6cf2fe2f566daebde7c34724ec8803c4c0cda579"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==9.5.0"
|
||||
},
|
||||
"requests": {
|
||||
"hashes": [
|
||||
"sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
|
||||
"sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
|
||||
],
|
||||
"index": "pypi",
|
||||
"version": "==2.31.0"
|
||||
},
|
||||
"urllib3": {
|
||||
"hashes": [
|
||||
"sha256:61717a1095d7e155cdb737ac7bb2f4324a858a1e2e6466f6d03ff630ca68d3cc",
|
||||
"sha256:d055c2f9d38dc53c808f6fdc8eab7360b6fdbbde02340ed25cfbcd817c62469e"
|
||||
],
|
||||
"markers": "python_version >= '3.7'",
|
||||
"version": "==2.0.2"
|
||||
}
|
||||
},
|
||||
"develop": {}
|
||||
}
|
||||
BIN
fonts/NotoSerif-Bold.ttf
Executable file
BIN
fonts/NotoSerif-BoldItalic.ttf
Executable file
BIN
fonts/NotoSerif-Italic.ttf
Executable file
BIN
fonts/NotoSerif-Regular.ttf
Executable file
BIN
fonts/alaruss.ttf
Normal file
205
generate.py
Normal file
@@ -0,0 +1,205 @@
|
||||
from PIL import Image, ImageDraw, ImageFont
|
||||
import requests, os
|
||||
|
||||
DNDB_BASE_URL = "https://www.dndbeyond.com/character/"
|
||||
DNDB_CHARS = [
|
||||
{
|
||||
"characterId": 69760590,
|
||||
"characterName": "Вевель",
|
||||
"characterClass": "острожник 10",
|
||||
"portraitName": "vevel",
|
||||
"characterUrl": "/profile/megavenik/characters/69760590",
|
||||
"avatarUrl": "https://www.dndbeyond.com/avatars/thumbnails/31479/654/150/154/1581111423-69760590.jpeg",
|
||||
},
|
||||
{
|
||||
"characterId": 69976266,
|
||||
"characterName": "Милош",
|
||||
"characterClass": "помазанник",
|
||||
"portraitName": "milosh",
|
||||
"characterUrl": "/profile/EdgarBrin/characters/69976266",
|
||||
"avatarUrl": "https://www.dndbeyond.com/avatars/thumbnails/31479/725/150/155/1581111423-69976266.jpeg",
|
||||
},
|
||||
{
|
||||
"characterId": 69976392,
|
||||
"characterName": "Милица",
|
||||
"characterClass": "голос",
|
||||
"portraitName": "militsa",
|
||||
"characterUrl": "/profile/tritiumTino/characters/69976392",
|
||||
"avatarUrl": "https://www.dndbeyond.com/avatars/thumbnails/31479/709/150/154/1581111423-69976392.jpeg",
|
||||
},
|
||||
{
|
||||
"characterId": 90463225,
|
||||
"characterName": "Нивенна",
|
||||
"characterClass": "чаровница",
|
||||
"portraitName": "nivenna",
|
||||
"characterUrl": "/profile/Maslinium/characters/90463225",
|
||||
"avatarUrl": "https://www.dndbeyond.com/avatars/thumbnails/31479/748/160/150/1581111423-90463225.jpeg",
|
||||
},
|
||||
{
|
||||
"characterId": 99072742,
|
||||
"characterName": "Дарпа",
|
||||
"characterClass": "кухарь",
|
||||
"portraitName": "darpa",
|
||||
"characterUrl": "/profile/Forfattare/characters/99072742",
|
||||
"avatarUrl": "https://www.dndbeyond.com/avatars/thumbnails/34003/953/150/153/1581111423-99072742.jpeg",
|
||||
},
|
||||
{
|
||||
"characterId": 99483409,
|
||||
"characterName": "Деян",
|
||||
"characterClass": "",
|
||||
"portraitName": "deyan",
|
||||
"characterUrl": "/profile/SantaKosh/characters/99483409",
|
||||
"avatarUrl": "https://www.dndbeyond.com/avatars/thumbnails/34005/197/157/150/1581111423-99483409.jpeg",
|
||||
}
|
||||
]
|
||||
|
||||
class DataModifierService:
|
||||
def getModifiersByType(self, groupedModifiers: dict, type: str, subType: str = "") -> list:
|
||||
matching = []
|
||||
|
||||
for __, modifiers in groupedModifiers.items():
|
||||
filtered = list(filter(lambda item: 'type' in item and type == item['type'], modifiers))
|
||||
|
||||
if subType:
|
||||
filtered = list(filter(lambda item: 'subType' in item and subType == item['subType'], filtered))
|
||||
|
||||
matching += filtered
|
||||
|
||||
return matching
|
||||
|
||||
|
||||
def getTotalModifierValue(self, groupedModifiers: dict, type: str, subType: str) -> int:
|
||||
modifiers = self.getModifiersByType(groupedModifiers, type, subType)
|
||||
modifier_values = [modifier['value'] for modifier in modifiers]
|
||||
return sum(modifier_values)
|
||||
|
||||
def get_stat_modifier(stat):
|
||||
import math
|
||||
return math.floor((stat - 10) / 2)
|
||||
|
||||
def calculate_coordinates(object_width, object_height, center_point):
|
||||
"""
|
||||
Calculates the coordinates to put the center point of an object at a specified point.
|
||||
|
||||
Args:
|
||||
object_width (int): The width of the object.
|
||||
object_height (int): The height of the object.
|
||||
center_point (tuple): The (x, y) coordinates of the point where the center of the object should be placed.
|
||||
|
||||
Returns:
|
||||
tuple: The (x, y) coordinates of the top-left corner of the object.
|
||||
"""
|
||||
x = center_point[0] - object_width // 2
|
||||
y = center_point[1] - object_height // 2
|
||||
return (x, y)
|
||||
|
||||
def get_correct_text_sizes(draw, text: str, font: ImageFont.FreeTypeFont):
|
||||
label_width, label_height = draw.textsize(text, font=font)
|
||||
|
||||
# to fix text placing we need to get offsets
|
||||
# https://stackoverflow.com/questions/59008322/pillow-imagedraw-text-coordinates-to-center
|
||||
offset_x, offset_y = font.getoffset(text)
|
||||
label_width += offset_x
|
||||
label_height += offset_y
|
||||
|
||||
return (label_width, label_height)
|
||||
|
||||
def generate_main(char: dict):
|
||||
STATS_DICT = {
|
||||
1: {
|
||||
"name": "strength",
|
||||
"coords": (684, 304)
|
||||
},
|
||||
2: {
|
||||
"name": "dexterity",
|
||||
"coords": (684, 381)
|
||||
},
|
||||
3: {
|
||||
"name": "constitution",
|
||||
"coords": (684, 457)
|
||||
},
|
||||
4: {
|
||||
"name": "intelligence",
|
||||
"coords": (767, 304)
|
||||
},
|
||||
5: {
|
||||
"name": "wisdom",
|
||||
"coords": (767, 381)
|
||||
},
|
||||
6: {
|
||||
"name": "charisma",
|
||||
"coords": (767, 457)
|
||||
},
|
||||
}
|
||||
|
||||
headers = {
|
||||
'Content-Type': 'text/json',
|
||||
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0',
|
||||
'Referer': 'https://www.dndbeyond.com/'
|
||||
}
|
||||
response = requests.get(f"{DNDB_BASE_URL}/{char['characterId']}/json", headers=headers)
|
||||
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
print(data["stats"])
|
||||
else:
|
||||
print("Error: Failed to retrieve data from URL.")
|
||||
return False
|
||||
# Load the background image
|
||||
background = Image.open("parts/background-main.png")
|
||||
|
||||
# Load the image to be placed on top
|
||||
foreground = Image.open(f"parts/{char['portraitName']}-main.png")
|
||||
|
||||
# Paste the foreground image onto the background
|
||||
background.paste(foreground, (0, 0), foreground)
|
||||
|
||||
# Create a drawing context
|
||||
draw = ImageDraw.Draw(background)
|
||||
|
||||
draw_width, _ = draw.im.size # pyright: ignore[reportGeneralTypeIssues]
|
||||
|
||||
for stat in data["stats"]:
|
||||
modifiers = data.get('modifiers', {})
|
||||
|
||||
modifier_service = DataModifierService()
|
||||
total_modifier_value = modifier_service.getTotalModifierValue(modifiers, 'bonus', STATS_DICT[stat['id']]['name'] + '-score')
|
||||
stat["value"] += total_modifier_value
|
||||
final_stat = get_stat_modifier(stat["value"])
|
||||
|
||||
# Define the font and font size for the text labels
|
||||
stats_font = ImageFont.truetype("fonts/NotoSerif-Regular.ttf", 30)
|
||||
|
||||
# Add text labels on top of the image
|
||||
stats_label = f"+{final_stat}" if final_stat > 0 else f"{final_stat}"
|
||||
|
||||
print(f"{STATS_DICT[stat['id']]['name']}: {stats_label}")
|
||||
label_width, label_height = get_correct_text_sizes(draw, stats_label, stats_font)
|
||||
|
||||
draw.text(calculate_coordinates(label_width, label_height, STATS_DICT[stat["id"]]["coords"]), stats_label, font=stats_font, fill=(255, 255, 255))
|
||||
|
||||
name_font = ImageFont.truetype("fonts/alaruss.ttf", 96)
|
||||
name_label = char['characterName'].upper()
|
||||
|
||||
label_width, label_height = get_correct_text_sizes(draw, name_label, name_font)
|
||||
|
||||
draw.text((draw_width-label_width-20, 120), name_label, font=name_font, fill=(255,255,255))
|
||||
|
||||
class_font = ImageFont.truetype("fonts/NotoSerif-Regular.ttf", 32)
|
||||
class_label = char['characterClass'].lower()
|
||||
label_width, label_height = get_correct_text_sizes(draw, class_label, class_font)
|
||||
|
||||
draw.text((draw_width-label_width-15, 203), class_label, font=class_font, fill=(255,255,255))
|
||||
|
||||
results_dir = "results"
|
||||
if not os.path.exists(results_dir):
|
||||
os.makedirs(results_dir)
|
||||
|
||||
background.save(f"results/{char['portraitName']}-main.png")
|
||||
|
||||
return True
|
||||
|
||||
# Save the resulting image
|
||||
generate_main(DNDB_CHARS[0])
|
||||
# for char in DNDB_CHARS:
|
||||
# generate_main(char)
|
||||
BIN
parts/background-main.png
Normal file
|
After Width: | Height: | Size: 333 KiB |
BIN
parts/darpa-main.png
Normal file
|
After Width: | Height: | Size: 232 KiB |
BIN
parts/deyan-main.png
Normal file
|
After Width: | Height: | Size: 234 KiB |
BIN
parts/militsa-main.png
Normal file
|
After Width: | Height: | Size: 196 KiB |
BIN
parts/milosh-main.png
Normal file
|
After Width: | Height: | Size: 189 KiB |
BIN
parts/nivenna-main.png
Normal file
|
After Width: | Height: | Size: 227 KiB |
BIN
parts/vevel-main.png
Normal file
|
After Width: | Height: | Size: 191 KiB |