Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • Elvenoob/degrees-of-lewdity
  • FreeER/degrees-of-lewdity
  • CrimsonTide/degrees-of-lewdity
  • scyne/degrees-of-lewdity
  • asbjorn/degrees-of-lewdity
  • liah55/degrees-of-lewdity
  • CanolaCulture/degrees-of-lewdity
  • Spectacular/degrees-of-lewdity
  • vultureangels/degrees-of-lewdity
  • stepidbesterd/degrees-of-lewdity
  • larsrand/degrees-of-lewdity
  • Music5264/degrees-of-lewdity
  • gayskele/degrees-of-lewdity
  • Pregmodder/degrees-of-lewdity
  • GoodMan_624/degrees-of-lewdity
  • AshNoBad/degrees-of-lewdity
  • poonta/degrees-of-lewdity
  • ezsh/degrees-of-lewdity
  • Obelus/degrees-of-lewdity
  • garbageman/degrees-of-lewdity
  • Noot/degrees-of-lewdity
  • Vrelnir/degrees-of-lewdity
  • aimozg/degrees-of-lewdity
  • Blank_/degrees-of-lewdity
  • klorpa/degrees-of-lewdity
  • bcy603/degrees-of-lewdity
  • Uncanine/degrees-of-lewdity
  • lewdmodder/degrees-of-lewdity
  • setsuna/degrees-of-lewdity
  • electronemissary/degrees-of-lewdity
  • 00c356/degrees-of-lewdity
  • pettan/degrees-of-lewdity
  • soup/degrees-of-lewdity
  • nickylass/degrees-of-lewdity
  • BelshazzarII/degrees-of-lewdity
  • Mauno/degrees-of-lewdity
  • Stuffedgame/degrees-of-lewdity
  • TaiwanSmurf/degrees-of-lewdity
  • Icemourne/degrees-of-lewdity
  • Hitcihker42/degrees-of-lewdity
  • LuckyLucky/degrees-of-lewdity
  • CasaBlanc/degrees-of-lewdity
  • YetAnotherDeviant/degrees-of-lewdity
  • number361/degrees-of-lewdity
  • shikiyoku/degrees-of-lewdity
  • siowyisheng/degrees-of-lewdity
  • unlined4928/degrees-of-lewdity
  • mihairu/degrees-of-lewdity
  • araven/degrees-of-lewdity
  • Hexogen/degrees-of-lewdity
  • Klain/degrees-of-lewdity
  • Chingonerio/degrees-of-lewdity
  • lewddude/degrees-of-lewdity
  • Dinesty30/degrees-of-lewdity
  • zerou/degrees-of-lewdity
  • SumGai/degrees-of-lewdity
  • QuadChroma/degrees-of-lewdity
  • hwp/degrees-of-lewdity
  • DitFranXX/degrees-of-lewdity
  • ndarkflame/degrees-of-lewdity
  • fuguer/degrees-of-lewdity
  • bean/degrees-of-lewdity
  • xomikob988/degrees-of-lewdity
  • purity/degrees-of-lewdity
  • voa/degrees-of-lewdity
  • FeralMoon/degrees-of-lewdity
  • mw.wabbit/degrees-of-lewdity
  • sassyenzie1/degrees-of-lewdity
  • katiek/degrees-of-lewdity
  • Dolmodder328/degrees-of-lewdity
  • 2ndSnake/degrees-of-lewdity
  • AbelofAurelia/degrees-of-lewdity
  • Sommar/degrees-of-lewdity
  • bsin/degrees-of-lewdity
  • Braymann/degrees-of-lewdity
  • YUNKING/degrees-of-lewdity
  • loofaaa/degrees-of-lewdity
  • RedStar/degrees-of-lewdity
  • JohnFilitov/degrees-of-lewdity
  • Raahs/degrees-of-lewdity
  • that_coding_dumbass/degrees-of-lewdity
  • PubNut/degrees-of-lewdity
  • CLUBDOGMApa/degrees-of-lewdity
  • Xhianil/degrees-of-lewdity
  • ANotNiceMouse/degrees-of-lewdity
  • tremainekason/degrees-of-lewdity
  • coldblood512/degrees-of-lewdity
  • b.smith/degrees-of-lewdity
  • erutheae/degrees-of-lewdity
  • vv3r3vv0lf/degrees-of-lewdity
  • LordCydano/degrees-of-lewdity
  • noteleven/degrees-of-lewdity
  • theabyssatmidnight/degrees-of-lewdity
  • Redalastor13/degrees-of-lewdity
  • noeinan/degrees-of-lewdity
  • PhaseDave/degrees-of-lewdity
  • BigBlackAwoo/degrees-of-lewdity
  • oyea/degrees-of-lewdity
  • hedpets/degrees-of-lewdity
  • C0D3/degrees-of-lewdity
  • small-keyman/degrees-of-lewdity
  • GayRaccoon/degrees-of-lewdity
  • DAPdev6/degrees-of-lewdity
  • ScribblingScribe/degrees-of-lewdity
  • Ybyx/degrees-of-lewdity
  • Area/degrees-of-lewdcraft
  • im_definitely_not_a_/degrees-of-lewdity
  • jgl/degrees-of-lewdity
  • Dualium/degrees-of-lewdity
  • b12481632/degrees-of-lewdity
  • kink-kat/degrees-of-lewdity
  • Devalk/degrees-of-lewdity
  • Cord/degrees-of-lewdity
  • Beat120/degrees-of-lewdity
  • ano/degrees-of-lewdity
  • djnjsed/degrees-of-lewdity
  • TalliasVijaandUraniu/degrees-of-lewdity
  • StinkyLizard/degrees-of-lewdity
  • Kamikaza404/degrees-of-lewdity
  • ammm/more-shortcuts
  • rustynails/degrees-of-lewdity-kylar-expansion-mod
  • lifeAnime/degrees-of-lewdity
  • KrystalwithaK/degrees-of-lewdity
  • AzureSheep/degrees-of-lewdity
  • khovel/degrees-of-lewdity
  • luna/degrees-of-lewdity
  • dust36/degrees-of-lewdity
  • shun/degrees-of-lewdity
  • TonyFox/degrees-of-lewdity
  • Eilitai/dol-solar
  • dolcontributor/degrees-of-lewdity
  • stalesandwich/degrees-of-lewdity
  • HZero/degrees-of-lewdity
  • KiraaCorsac/degrees-of-lewdity
  • Ruheon/degrees-of-lewdity
  • PixelArtFirend/degrees-of-lewdity-test-mod
  • Trinidad/grados-de-lascivia
  • QuiltedQuail/degrees-of-lewdity
  • evrgentesee/degrees-of-lewdity
  • ALambert/degrees-of-lewdity-the-cat-mod
  • Green745/degrees-of-lewdity
  • saltyycoffee/dol-saltyys-mod
  • xao321/degrees-of-lewdity
  • Vogel100/degrees-of-lewdity
  • FadedLines/degrees-of-lewdity
  • deformedgodcomplex/degrees-of-lewdity
  • tracktack00/dol
  • VortluexIridum/DOL
  • ChickChuck2/degrees-of-lewdity-pt-br
  • pumpinglemma/degrees-of-lewdity
  • Host/degrees-of-lewdity
  • ChexAndBalances/degrees-of-lewdity
  • Fost3r/degrees-of-lewdity
  • Tarkin/degrees-of-lewdity
  • Juno/dol-saltyys-mod
  • TonyBologna/degrees-of-lewdity-foster
  • Stadler76/degrees-of-lewdity
  • Akoz/degrees-of-lewdity
  • treeib7/degrees-of-lewdity
  • dechet/degrees-of-lewdity
  • TheDivineHeir/degrees-of-lewdity
  • Enty/degrees-of-lewdity
  • 24khp/degrees-of-lewdity
  • slenderostrich/degrees-of-lewdity
  • Kirsty/degrees-of-lewdity
  • Anony5261/degrees-of-lewdity
  • veritas1A4/degrees-of-lewdity-plus
  • HeepSelk/degrees-of-lewdity
  • ThomazLIRA27/degrees-of-lewdity
  • striderxfossility/degrees-of-lewdity
  • piotrejo/degrees-of-lewdity
  • Idekk/degrees-of-lewdity
  • branthepeach/degrees-of-lewdity
  • thermal/degrees-of-lewdity
  • cutiland/degrees-of-lewdity
  • anony5264/degrees-of-lewdity
  • Warui430/degrees-of-lewdity-testing
  • Skullky/degrees-of-lewdity
  • netolilium/degrees-of-lewdity
  • TheLoneWolf3626/degrees-of-lewdity
  • majou/degrees-of-lewdity
  • joemamba/degrees-of-lewdity
  • Airbourne/degrees-of-lewd-remerged
  • FritzTheGlitch/degrees-of-lewdity
  • Orangeblur/degrees-of-lewdity
  • Bandrose1/degrees-of-lewdity
  • DoLSteph/degrees-of-lewdity
  • Newtnewt/degrees-of-lewdity
  • KinkyOne/degrees-of-lewdity
  • edward6/degrees-of-lewdity
  • Mira1/degrees-of-lewdity
  • TFS/degrees-of-lewdity
  • oxone/degrees-of-lewdity
  • golsil/degrees-of-lewdity
  • zR3V3NANTz/degrees-of-lewdity-dragon-mod
  • PepKitty/degrees-of-lewdity
  • preeded/degrees-of-lewdity
  • Beepbeep1/degrees-of-lewdity
  • LilTransDino/degrees-of-lewdity-project-1
  • warawanaineko/degrees-of-lewdity
  • salagadoola/degrees-of-lewdity
  • RatRat/transmod-plus
  • kodicraft/degrees-of-lewdity
  • wowdoge/dol-saltyys-mod
  • handleing1/degrees-of-lewdity
  • mrcomfy/degrees-of-lewdity-mall-proposal
  • CK_Rainbow/degrees-of-lewdity
  • KnotLikeThis/degrees-of-lewdity
  • popa/degrees-of-lewdity
  • Ryumi/degrees-of-lewdity
  • GayKitten/degrees-of-lewdity
  • EndlessGame/degrees-of-lewdity
  • bijikejepit/degrees-of-lewdity-modified
  • lafrlo/degrees-of-lewdity
  • auxhonater/degrees-of-lewdity
  • ParticleG/degrees-of-lewdity
  • astrox1/degrees-of-lewdity
  • AnonymousPancakes/degrees-of-lewdity-contribution-fork
  • y4vr/degrees-of-lewdity-ravishment
  • apflu/degrees-of-lewdity-dollification-mod
  • nemuzawa200101/degrees-of-lewdity
  • MagicalAstrogy/degrees-of-lewdity
  • Khaos423/degrees-of-lewdity
  • stranger/degrees-of-lewdity
  • eesoymilk/degrees-of-lewdity
  • Frostberg/degrees-of-lewdity-plus
  • ToumanLin/degrees-of-lewdity-toumanlin
  • Murkey/degrees-of-lewdity
  • MasterCast04/degrees-of-lewdity-chimera-tail-mod
  • Tanny78/tannymod
  • Gwen1/degrees-of-lewdity-scent
  • Ducati/degrees-of-lewdity-plus
  • lune/degrees-of-lewdity
  • snowywar/degrees-of-lewdity
  • TsundereBandit/degrees-of-lewdity-plus
  • Siede/degrees-of-lewdity
  • fire2244/degrees-of-lewdity
  • decarabia/degrees-of-lewdity
  • JinoWills/degrees-of-lewdity
  • creeping1023/degrees-of-lewdity
  • ShinH/degrees-of-lewdity
  • WHALER/degrees-of-lewdity
  • WHALERSWHALER/degrees-of-lewdity-whalers-mod
  • googlyman/degrees-of-lewdity
  • Dakser/degrees-of-lewdity-plus
  • mikatakamo/dolp-randomfix-randomcontribution
  • handle5/degrees-of-lewdity
  • SpaciousStarship/degrees-of-lewdity-plus-starship-fork
  • GeneralFire/degrees-of-lewdity
  • BrokenSoul/degrees-of-lewdity
  • Twig/degrees-of-lewdity
  • noneedforthis/slight-combat-rework
  • AiHoshino/degrees-of-lewdity-vn-mod
  • baileys/degrees-of-lewdity
  • Ddkdkk/degrees-of-lewdity-plus
  • miyakoAki4828/degrees-of-lewdity
  • ojicon/degrees-of-lewdity-indonesian-translation
  • PuppeterMaster25/degrees-of-lewdity
  • Chieferton/degrees-of-lewdity-plus
  • UnbarredStream/degrees-of-lewdity-dragon-mod
  • LupusXLass1404/degrees-of-lewdity
  • MisoSquared/degrees-of-lewdity
  • IndexIsDumb/degrees-of-lewdity
  • nekoboinick/degrees-of-lewdity
  • Testry/degrees-of-lewdity
  • Cuhloe69/degrees-of-lewdity-plus
  • omvjro/degrees-of-lewdity
  • Testry/degrees-of-lewdity-plus
  • Avos/degrees-of-lewdity
  • Averall/degrees-of-lewdity-plus
  • Sh1na/degrees-of-lewdity-plus
  • fizzyboi/degrees-of-lewdity
  • Sh1na/degrees-of-lewdity
  • Prnjujujaj/degrees-of-lewdity-plus
  • Nikonov/degrees-of-lewdity-plus
  • AnonymousPossum/degrees-of-lewdity-ap-temple
  • Sabot/degrees-of-lewdity-mecha-mod
  • Shadi1089/degrees-of-lewdity-plus
  • sbdto/degrees-of-lewdity
  • theothersteve7/degrees-of-lewdity
  • melllow/degrees-of-lewdity-mellows-files
  • WinterPeach/degrees-of-lewdity-bunny-plus
  • boolin/degrees-of-lewdity-dragon-mod
  • Izeija/degrees-of-lewdity-plus-Herm-NPCs
  • test126/degrees-of-lewdity-plus
  • WolfSeige/degrees-of-lewdity
  • Frostberg/transmod-plus
  • erdd/test-degrees-of-lewdity
  • ekdms4467/degrees-of-lewdity-plus
  • MrAdvisor/degrees-of-lewdity-mellows-files
  • bugmenot97/degrees-of-lewdity-plus-ryona-edition
  • numbersir/degrees-of-lewdity
  • Paragon/degrees-of-lewdity
  • eude/degrees-of-lewdity
  • liggems/degrees-of-lewdity
  • hoihoi/degrees-of-lewdity
  • WreckieRed/degrees-of-lewdity-plus-wreckie-red
  • BlueMuffin/degrees-of-lewdity
  • edwardspec/degrees-of-lewdity
  • Neng222/degrees-of-lewdity
  • SeiraHawawa/degrees-of-lewdity
  • trashee/degrees-of-lewdity
  • Dukesnwowisb/degrees-of-lewdity-plus
  • sugarcoma/degrees-of-lewdity
  • squ1dteeth/degrees-of-lewdity
  • shojoprotagonist/degrees-of-lewdity
  • Annon173/degrees-of-lewdity-annon173
  • Brrr/degrees-of-lewdity
  • goose/dol-goosemod
  • mizzzz/degrees-of-lewdity-mizz
  • Uchiki/degrees-of-lewdity
  • Leet0/degrees-of-lewdity
  • Someone1/degrees-of-lewdity
  • Ntimpaa88/wholesome-and-whoresome-addons
  • antnoodle/degrees-of-lewdity-plus
  • Isari/degrees-of-lewdity-plus
  • variegations/degrees-of-lewdity
  • nsqueet/degrees-of-lewdity
  • DevilD0L/degrees-of-lewdity
  • HypeS84/graus-de-lascivia
  • Dwarfblood/degrees-of-lewdity-plus
  • LurkerNo255/degrees-of-lewdity-nobody-safe
  • Sl/degrees-of-lewdity-mikili
  • arugula/transmod-fork
  • handlebeater/degrees-of-lewdity-plus
  • pizzaghg/degrees-of-lewdity-plus
  • RepoRogue6960/degrees-of-lewdity
  • CharaEmbry/degrees-of-lewdity-plus
  • nanabanashi/degrees-of-lewdity-plus
  • kagurazakanyaa/degrees-of-lewdity-plus
  • Songdog/degrees-of-lewdity
  • Nicole09/degrees-of-lewdity-plus
332 results
Show changes
Showing
with 1699 additions and 1585 deletions
{
"extends": "@tsconfig/node16/tsconfig.json",
"compilerOptions": {
"types": ["node"]
},
"include": ["main.ts"],
"exclude": ["node_modules"]
}
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@cspotcode/source-map-consumer@0.8.0":
version "0.8.0"
resolved "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz"
integrity sha512-41qniHzTU8yAGbCp04ohlmSrZf8bkf/iJsl3V0dRGsQN/5GFfx+LbCSsCpp2gqrqjTVg/K6O8ycoV35JIwAzAg==
"@cspotcode/source-map-support@0.7.0":
version "0.7.0"
resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.7.0.tgz"
integrity sha512-X4xqRHqN8ACt2aHVe51OxeA2HjbcL4MqFqXkrmQszJ1NOUuUu5u6Vqx/0lZSVNku7velL5FC/s5uEAj1lsBMhA==
dependencies:
"@cspotcode/source-map-consumer" "0.8.0"
"@tsconfig/node10@^1.0.7":
version "1.0.8"
resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz"
integrity sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==
"@tsconfig/node12@^1.0.7":
version "1.0.9"
resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz"
integrity sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==
"@tsconfig/node14@^1.0.0":
version "1.0.1"
resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz"
integrity sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==
"@tsconfig/node16@^1.0.2":
version "1.0.2"
resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz"
integrity sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==
"@types/cli-color@^2.0.2":
version "2.0.2"
resolved "https://registry.npmjs.org/@types/cli-color/-/cli-color-2.0.2.tgz"
integrity sha512-1ErQIcmNHtNViGKTtB/TIKqMkC2RkKI2nBneCr9hSCPo9H05g9VzjlaXPW3H0vaI8zFGjJZvSav+VKDKCtKgKA==
"@types/node@*", "@types/node@^17.0.23":
version "17.0.23"
resolved "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz"
integrity sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==
"@types/pngjs@^6.0.1":
version "6.0.1"
resolved "https://registry.npmjs.org/@types/pngjs/-/pngjs-6.0.1.tgz"
integrity sha512-J39njbdW1U/6YyVXvC9+1iflZghP8jgRf2ndYghdJb5xL49LYDB+1EuAxfbuJ2IBbWIL3AjHPQhgaTxT3YaYeg==
dependencies:
"@types/node" "*"
acorn-walk@^8.1.1:
version "8.2.0"
resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz"
integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==
acorn@^8.4.1:
version "8.7.0"
resolved "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz"
integrity sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==
ansi-styles@^3.2.1:
version "3.2.1"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
dependencies:
color-convert "^1.9.0"
ansi-styles@^4.1.0:
version "4.3.0"
resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz"
integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
dependencies:
color-convert "^2.0.1"
arg@^4.1.0:
version "4.1.3"
resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz"
integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
array-back@^3.0.1, array-back@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/array-back/-/array-back-3.1.0.tgz"
integrity sha512-TkuxA4UCOvxuDK6NZYXCalszEzj+TLszyASooky+i742l9TqsOdYCMJJupxRic61hwquNtppB3hgcuq9SVSH1Q==
array-back@^4.0.1:
version "4.0.2"
resolved "https://registry.npmjs.org/array-back/-/array-back-4.0.2.tgz"
integrity sha512-NbdMezxqf94cnNfWLL7V/im0Ub+Anbb0IoZhvzie8+4HJ4nMQuzHuy49FkGYCJK2yAloZ3meiB6AVMClbrI1vg==
chalk@^2.4.2:
version "2.4.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
dependencies:
ansi-styles "^3.2.1"
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
chalk@^4.1.0:
version "4.1.2"
resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
dependencies:
ansi-styles "^4.1.0"
supports-color "^7.1.0"
cli-color@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/cli-color/-/cli-color-2.0.2.tgz"
integrity sha512-g4JYjrTW9MGtCziFNjkqp3IMpGhnJyeB0lOtRPjQkYhXzKYr6tYnXKyEVnMzITxhpbahsEW9KsxOYIDKwcsIBw==
dependencies:
d "^1.0.1"
es5-ext "^0.10.59"
es6-iterator "^2.0.3"
memoizee "^0.4.15"
timers-ext "^0.1.7"
color-convert@^1.9.0:
version "1.9.3"
resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
dependencies:
color-name "1.1.3"
color-convert@^2.0.1:
version "2.0.1"
resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz"
integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
dependencies:
color-name "~1.1.4"
color-name@1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=
color-name@~1.1.4:
version "1.1.4"
resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
command-line-args@^5.1.1:
version "5.2.1"
resolved "https://registry.npmjs.org/command-line-args/-/command-line-args-5.2.1.tgz"
integrity sha512-H4UfQhZyakIjC74I9d34fGYDwk3XpSr17QhEd0Q3I9Xq1CETHo4Hcuo87WyWHpAF1aSLjLRf5lD9ZGX2qStUvg==
dependencies:
array-back "^3.1.0"
find-replace "^3.0.0"
lodash.camelcase "^4.3.0"
typical "^4.0.0"
command-line-usage@^6.1.0:
version "6.1.2"
resolved "https://registry.npmjs.org/command-line-usage/-/command-line-usage-6.1.2.tgz"
integrity sha512-I+0XN613reAhpBQ6icsPOTwu9cvhc9NtLtUcY2fGYuwm9JZiWBzFDA8w0PHqQjru7Xth7fM/y9TJ13+VKdjh7Q==
dependencies:
array-back "^4.0.1"
chalk "^2.4.2"
table-layout "^1.0.1"
typical "^5.2.0"
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz"
integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
d@1, d@^1.0.1:
version "1.0.1"
resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz"
integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
dependencies:
es5-ext "^0.10.50"
type "^1.0.1"
deep-extend@~0.6.0:
version "0.6.0"
resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"
integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
diff@^4.0.1:
version "4.0.2"
resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz"
integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
es5-ext@^0.10.35, es5-ext@^0.10.46, es5-ext@^0.10.50, es5-ext@^0.10.53, es5-ext@^0.10.59, es5-ext@~0.10.14, es5-ext@~0.10.2, es5-ext@~0.10.46:
version "0.10.59"
resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.59.tgz"
integrity sha512-cOgyhW0tIJyQY1Kfw6Kr0viu9ZlUctVchRMZ7R0HiH3dxTSp5zJDLecwxUqPUrGKMsgBI1wd1FL+d9Jxfi4cLw==
dependencies:
es6-iterator "^2.0.3"
es6-symbol "^3.1.3"
next-tick "^1.1.0"
es6-iterator@^2.0.3:
version "2.0.3"
resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz"
integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
dependencies:
d "1"
es5-ext "^0.10.35"
es6-symbol "^3.1.1"
es6-symbol@^3.1.1, es6-symbol@^3.1.3:
version "3.1.3"
resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz"
integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
dependencies:
d "^1.0.1"
ext "^1.1.2"
es6-weak-map@^2.0.3:
version "2.0.3"
resolved "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz"
integrity sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==
dependencies:
d "1"
es5-ext "^0.10.46"
es6-iterator "^2.0.3"
es6-symbol "^3.1.1"
escape-string-regexp@^1.0.5:
version "1.0.5"
resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
event-emitter@^0.3.5:
version "0.3.5"
resolved "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz"
integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
dependencies:
d "1"
es5-ext "~0.10.14"
ext@^1.1.2:
version "1.6.0"
resolved "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz"
integrity sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==
dependencies:
type "^2.5.0"
find-replace@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/find-replace/-/find-replace-3.0.0.tgz"
integrity sha512-6Tb2myMioCAgv5kfvP5/PkZZ/ntTpVK39fHY7WkWBgvbeE+VHd/tZuZ4mrC+bxh4cfOZeYKVPaJIZtZXV7GNCQ==
dependencies:
array-back "^3.0.1"
has-flag@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0=
has-flag@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz"
integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
is-promise@^2.2.2:
version "2.2.2"
resolved "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz"
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==
lodash.camelcase@^4.3.0:
version "4.3.0"
resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz"
integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
lru-queue@^0.1.0:
version "0.1.0"
resolved "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz"
integrity sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=
dependencies:
es5-ext "~0.10.2"
make-error@^1.1.1:
version "1.3.6"
resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz"
integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
memoizee@^0.4.15:
version "0.4.15"
resolved "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz"
integrity sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==
dependencies:
d "^1.0.1"
es5-ext "^0.10.53"
es6-weak-map "^2.0.3"
event-emitter "^0.3.5"
is-promise "^2.2.2"
lru-queue "^0.1.0"
next-tick "^1.1.0"
timers-ext "^0.1.7"
next-tick@1, next-tick@^1.1.0:
version "1.1.0"
resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz"
integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
pngjs@^6.0.0:
version "6.0.0"
resolved "https://registry.npmjs.org/pngjs/-/pngjs-6.0.0.tgz"
integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg==
reduce-flatten@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-2.0.0.tgz"
integrity sha512-EJ4UNY/U1t2P/2k6oqotuX2Cc3T6nxJwsM0N0asT7dhrtH1ltUxDn4NalSYmPE2rCkVpcf/X6R0wDwcFpzhd4w==
string-format@^2.0.0:
version "2.0.0"
resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz"
integrity sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==
supports-color@^5.3.0:
version "5.5.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
dependencies:
has-flag "^3.0.0"
supports-color@^7.1.0:
version "7.2.0"
resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz"
integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
dependencies:
has-flag "^4.0.0"
table-layout@^1.0.1:
version "1.0.2"
resolved "https://registry.npmjs.org/table-layout/-/table-layout-1.0.2.tgz"
integrity sha512-qd/R7n5rQTRFi+Zf2sk5XVVd9UQl6ZkduPFC3S7WEGJAmetDTjY3qPN50eSKzwuzEyQKy5TN2TiZdkIjos2L6A==
dependencies:
array-back "^4.0.1"
deep-extend "~0.6.0"
typical "^5.2.0"
wordwrapjs "^4.0.0"
timers-ext@^0.1.7:
version "0.1.7"
resolved "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz"
integrity sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==
dependencies:
es5-ext "~0.10.46"
next-tick "1"
ts-command-line-args@^2.2.1:
version "2.2.1"
resolved "https://registry.npmjs.org/ts-command-line-args/-/ts-command-line-args-2.2.1.tgz"
integrity sha512-mnK68QA86FYzQYTSA/rxIjT/8EpKsvQw9QkawPic8I8t0gjAOw3Oa509NIRoaY1FmH7hdrncMp7t7o+vYoceNQ==
dependencies:
chalk "^4.1.0"
command-line-args "^5.1.1"
command-line-usage "^6.1.0"
string-format "^2.0.0"
ts-node@^10.7.0:
version "10.7.0"
resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.7.0.tgz"
integrity sha512-TbIGS4xgJoX2i3do417KSaep1uRAW/Lu+WAL2doDHC0D6ummjirVOXU5/7aiZotbQ5p1Zp9tP7U6cYhA0O7M8A==
dependencies:
"@cspotcode/source-map-support" "0.7.0"
"@tsconfig/node10" "^1.0.7"
"@tsconfig/node12" "^1.0.7"
"@tsconfig/node14" "^1.0.0"
"@tsconfig/node16" "^1.0.2"
acorn "^8.4.1"
acorn-walk "^8.1.1"
arg "^4.1.0"
create-require "^1.1.0"
diff "^4.0.1"
make-error "^1.1.1"
v8-compile-cache-lib "^3.0.0"
yn "3.1.1"
type@^1.0.1:
version "1.2.0"
resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz"
integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
type@^2.5.0:
version "2.6.0"
resolved "https://registry.npmjs.org/type/-/type-2.6.0.tgz"
integrity sha512-eiDBDOmkih5pMbo9OqsqPRGMljLodLcwd5XD5JbtNB0o89xZAwynY9EdCDsJU7LtcVCClu9DvM7/0Ep1hYX3EQ==
typescript@^4.6.3:
version "4.6.3"
resolved "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz"
integrity sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==
typical@^4.0.0:
version "4.0.0"
resolved "https://registry.npmjs.org/typical/-/typical-4.0.0.tgz"
integrity sha512-VAH4IvQ7BDFYglMd7BPRDfLgxZZX4O4TFcRDA6EN5X7erNJJq+McIEp8np9aVtxrCJ6qx4GTYVfOWNjcqwZgRw==
typical@^5.2.0:
version "5.2.0"
resolved "https://registry.npmjs.org/typical/-/typical-5.2.0.tgz"
integrity sha512-dvdQgNDNJo+8B2uBQoqdb11eUCE1JQXhvjC/CZtgvZseVd5TYMXnq0+vuUemXbd/Se29cTaUuPX3YIc2xgbvIg==
v8-compile-cache-lib@^3.0.0:
version "3.0.0"
resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.0.tgz"
integrity sha512-mpSYqfsFvASnSn5qMiwrr4VKfumbPyONLCOPmsR3A6pTY/r0+tSaVbgPWSAIuzbk3lCTa+FForeTiO+wBQGkjA==
wordwrapjs@^4.0.0:
version "4.0.1"
resolved "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-4.0.1.tgz"
integrity sha512-kKlNACbvHrkpIw6oPeYDSmdCTu2hdMHoyXLTcUKala++lx5Y+wjJ/e474Jqv5abnVmwxw08DiTuHmw69lJGksA==
dependencies:
reduce-flatten "^2.0.0"
typical "^5.2.0"
yn@3.1.1:
version "3.1.1"
resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz"
integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
......@@ -4,8 +4,10 @@ declare interface AnyDict {
declare interface Dict<T> {
[index: string]: T;
}
type GradientType = 'linear' | 'radial';
declare interface BlendGradientSpec {
gradient: 'linear'|'radial';
gradient: GradientType;
/**
* * For linear gradient: [x0, y0, x1, y1].
* * For radial gradient: [x0, y0, r0, x1, y1, r1].
......@@ -16,17 +18,28 @@ declare interface BlendGradientSpec {
* Pairs of `[offset, color]` or `[color]`.
* Default offsets are for evenly spaced gradient
*/
colors: ([number,string]|string)[];
colors: ([number, string] | string)[];
}
/**
* For applying brightness, contrast and other 'scalar' adjustment gradients
*/
declare interface AdjustmentGradientSpec {
gradient: GradientType,
values: number[],
adjustments: ([number, number] | number)[];
}
declare interface BlendPatternSpec {
/**
* Pattern identifier or a specification, sent to pattern provider to get an actual image
*/
pattern: string|object;
pattern: string | object;
}
declare type BlendSpec = string|BlendGradientSpec|BlendPatternSpec;
declare type BlendSpec = string | BlendGradientSpec | BlendPatternSpec;
declare interface CompositeLayerParams {
model?: any;
/**
* Render the layer. Default true, only exact `false` value disables rendering
*/
......@@ -39,10 +52,14 @@ declare interface CompositeLayerParams {
* Blend color/gradient/pattern. For color, CSS color string.
*/
blend?: BlendSpec;
/**
* Blend mode for the whole layer.
*/
compositeOperation?: GlobalCompositeOperation;
/**
* Blend mode.
*/
blendMode?: string;
blendMode?: GlobalCompositeOperation;
/**
* Desaturate the image before processing.
*/
......@@ -50,7 +67,7 @@ declare interface CompositeLayerParams {
/**
* Adjust brightness before processing. -1..+1, 0 is don't change
*/
brightness?: number;
brightness?: number | AdjustmentGradientSpec;
/**
* Adjust contrast before processing. >=0, 1 is don't change
*/
......@@ -58,7 +75,7 @@ declare interface CompositeLayerParams {
/**
* Mask, a stencil image to cut out and display only select parts of this layer.
*/
masksrc?: string;
masksrc?: string | HTMLCanvasElement | MaskObject | (string | HTMLCanvasElement | MaskObject)[];
/**
* Alpha, 0-1. Default 1
*/
......@@ -85,17 +102,24 @@ declare interface CompositeLayerParams {
*/
dx?: number;
dy?: number;
/**
* Subsprite position on target canvas
*/
frameDx?: number;
frameDy?: number;
/**
* Animation name
*/
animation?: string;
scale?: boolean;
worn?: object;
}
declare interface CompositeLayerSpec extends CompositeLayerParams {
name?: string;
/**
* Image URL
*/
src: string;
src: string | HTMLCanvasElement;
}
declare interface KeyframeSpec {
......@@ -119,7 +143,9 @@ declare interface KeyframeSpec {
}
declare type AnimationSpec = KeyframeAnimationSpec | SimpleAnimationSpec;
declare interface KeyframeAnimationSpec {
frameCount: number;
keyframes: KeyframeSpec[];
}
declare interface SimpleAnimationSpec {
......@@ -130,7 +156,24 @@ declare interface SimpleAnimationSpec {
duration: number;
}
declare interface MaskObject {
path: string;
offsetX?: number;
offsetY?: number;
convert?: boolean;
}
declare interface Offset {
x: number;
y: number;
}
declare interface MaskSpec {
convert: boolean;
}
declare interface CompositeLayer extends CompositeLayerSpec {
maskBlendMode: GlobalCompositeOperation;
/**
* `src` of cached `image` (if `src` changes, `image` will be reloaded)
*/
......@@ -142,11 +185,19 @@ declare interface CompositeLayer extends CompositeLayerSpec {
/**
* Loaded/cached mask image
*/
mask?: CanvasImageSource;
mask?: CanvasImageSource | (CanvasImageSource)[];
/**
* Offset of mask image
*/
maskOffsets?: Offset[];
/**
* Offset of mask image
*/
maskOptions?: MaskSpec;
/**
* Value of `masksrc` corresponding to current `mask` (if masksrc changes mask will be reloaded)
*/
cachedMaskSrc?: string;
cachedMaskSrc?: string | MaskObject | (string | MaskObject)[];
/**
* Encoded processing options used to display cachedImage
*/
......@@ -155,4 +206,12 @@ declare interface CompositeLayer extends CompositeLayerSpec {
* Last displayed composed image
*/
cachedImage?: CanvasImageSource;
/**
* Scale it?
*/
scale?: boolean;
/**
* Mask alpha
*/
maskAlpha?: number;
}
{
"name": "model",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "model",
"version": "0.1.0",
"devDependencies": {
"@types/tinycolor2": "^1.4.2",
"typescript": "^5.0.2"
}
},
"node_modules/@types/tinycolor2": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.3.tgz",
"integrity": "sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==",
"dev": true
},
"node_modules/typescript": {
"version": "5.0.2",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz",
"integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==",
"dev": true,
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=12.20"
}
}
}
}
......@@ -7,6 +7,6 @@
},
"devDependencies": {
"@types/tinycolor2": "^1.4.2",
"typescript": "~3.9.3"
"typescript": "^5.0.2"
}
}
/// <reference path="model.d.ts" />
/// <reference types="tinycolor2" />
declare namespace Renderer {
export function isMaskObject(mask: string | HTMLCanvasElement | CanvasImageSource | MaskObject | undefined | null): mask is MaskObject;
export function isMaskOffsetObject(mask: string | HTMLCanvasElement | CanvasImageSource | MaskObject | undefined | null): mask is MaskObject;
export function isMaskConvertObject(mask: string | HTMLCanvasElement | CanvasImageSource | MaskObject | undefined | null): mask is MaskObject;
export interface LayerImageLoader {
loadImage(src: string, layer: CompositeLayer, successCallback: (src: string, layer: CompositeLayer, image: HTMLImageElement) => any, errorCallback: (src: string, layer: CompositeLayer, error: any) => any): any;
loadImage(src: string | HTMLCanvasElement, layer: CompositeLayer, successCallback: (src: string | HTMLCanvasElement, layer: CompositeLayer, image: HTMLCanvasElement) => any, errorCallback: (src: string | HTMLCanvasElement, layer: CompositeLayer, error: any) => any): any;
}
export const DefaultImageLoader: LayerImageLoader;
export let ImageLoader: LayerImageLoader;
......@@ -52,21 +55,21 @@ declare namespace Renderer {
/**
* Creates a cutout of color in shape of sourceImage
*/
export function cutout(sourceImage: CanvasImageSource, color: string, canvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
export function cutout(sourceImage: CanvasImageSource, color: string | CanvasGradient | CanvasPattern, canvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
/**
* Cuts out from base a shape in form of stencil.
* Modifies and returns base.
*/
export function cutoutFrom(base: CanvasRenderingContext2D, stencil: CanvasImageSource): CanvasRenderingContext2D;
export function cutoutFrom(base: CanvasRenderingContext2D, stencil: CanvasImageSource, operation?: GlobalCompositeOperation): CanvasRenderingContext2D;
/**
* Paints sourceImage over cutout of it filled with color.
*/
export function composeOverCutout(sourceImage: CanvasImageSource, color: string, blendMode?: string, canvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
export function composeOverCutout(sourceImage: CanvasImageSource, color: string | CanvasGradient | CanvasPattern, blendMode?: GlobalCompositeOperation, canvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
/**
* Repeatedly fill all sub-frames of canvas with same style.
* (Makes sense with gradient and pattern fills, to keep consistents across all sub-frames)
*/
export function fillFrames(fillStyle: string | CanvasGradient | CanvasPattern, canvas: CanvasRenderingContext2D, frameCount: number, frameWidth: number): void;
export function fillFrames(fillStyle: string | CanvasGradient | CanvasPattern, canvas: CanvasRenderingContext2D, frameCount: number, frameWidth: number, blendMode: GlobalCompositeOperation): void;
export let Patterns: Dict<CanvasPattern>;
/**
* CanvasPattern generator/provider.
......@@ -78,40 +81,46 @@ declare namespace Renderer {
/**
* Paints sourceImage over same-sized canvas filled with pattern or gradient
*/
export function composeOverSpecialRect(sourceImage: CanvasImageSource, fillStyle: CanvasGradient | CanvasPattern, blendMode: string, frameCount: number, targetCanvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
export function composeOverSpecialRect(sourceImage: CanvasImageSource, fillStyle: CanvasGradient | CanvasPattern, blendMode: GlobalCompositeOperation, frameCount: number, targetCanvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
/**
* Paints sourceImage under same-sized canvas filled with pattern or gradient
*/
export function composeUnderSpecialRect(sourceImage: CanvasImageSource, fillStyle: CanvasGradient | CanvasPattern, blendMode: GlobalCompositeOperation, frameCount: number, targetCanvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
/**
* Paints sourceImage over same-sized canvas filled with color
*/
export function composeOverRect(sourceImage: CanvasImageSource, color: string, blendMode: string, targetCanvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
export function composeOverRect(sourceImage: CanvasImageSource, color: string, blendMode: GlobalCompositeOperation, targetCanvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
/**
* Paints over sourceImage a cutout of it filled with color.
*/
export function composeUnderCutout(sourceImage: CanvasImageSource, color: string, blendMode?: string, canvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
export function composeUnderCutout(sourceImage: CanvasImageSource, color: string, blendMode?: GlobalCompositeOperation, canvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
/**
* Paints over sourceImage a same-sized canvas filled with color
*/
export function composeUnderRect(sourceImage: CanvasImageSource, color: string, blendMode?: string, targetCanvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
export function composeUnderRect(sourceImage: CanvasImageSource, color: string, blendMode?: GlobalCompositeOperation, targetCanvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
export let ImageCaches: {
[index: string]: HTMLImageElement;
[index: string]: HTMLCanvasElement;
};
export let ImageErrors: {
[index: string]: boolean;
};
export let imageIsLoading: boolean;
/**
* Switch between compose(Over|Under)(Rect|Cutout)
*/
export function compose(composeOver: boolean, doCutout: boolean, sourceImage: CanvasImageSource, color: string, blendMode: string, targetCanvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
export function compose(composeOver: boolean, doCutout: boolean, sourceImage: CanvasImageSource, color: string, blendMode: GlobalCompositeOperation, targetCanvas?: CanvasRenderingContext2D): CanvasRenderingContext2D;
/**
* Fills properties in `target` from `source`.
* If `overwrite` is false, only missing properties are copied.
* In both cases, brightness is added, contrast is multiplied.
* Returns target
*/
export function mergeLayerData(target: CompositeLayerSpec, source: CompositeLayerParams, overwrite?: boolean): CompositeLayerSpec;
export function mergeLayerData(target: Partial<CompositeLayerSpec>, source: CompositeLayerParams, overwrite?: boolean): Partial<CompositeLayerSpec>;
export function encodeProcessing(spec: CompositeLayerSpec): string;
export function composeLayersAgain(): void;
export function desaturateImage(image: CanvasImageSource, resultCanvas?: CanvasRenderingContext2D, doCutout?: boolean): HTMLCanvasElement;
export function filterImage(image: CanvasImageSource, filter: string, resultCanvas?: CanvasRenderingContext2D): HTMLCanvasElement;
export function adjustGradientBrightness(image: CanvasImageSource, frameCount: number, brightness: AdjustmentGradientSpec, resultCanvas?: CanvasRenderingContext2D): HTMLCanvasElement;
export function adjustBrightness(image: CanvasImageSource, brightness: number, resultCanvas?: CanvasRenderingContext2D, doCutout?: boolean): HTMLCanvasElement;
export function adjustLevels(image: CanvasImageSource,
/**
......@@ -211,8 +220,18 @@ declare namespace Renderer {
start(): void;
stop(): void;
}
export function refresh(model: {
canvas: HTMLCanvasElement;
layerList: CompositeLayerSpec[];
redraw: () => void;
}): void;
export function clearCaches(model: {
layerList: CompositeLayerSpec[];
}): void;
export function invalidateLayerCaches(layers: CompositeLayer[]): void;
export function animateLayersAgain(): any;
export function getAnimatingCanvas(targetCanvas: CanvasRenderingContext2D): AnimatingCanvas | undefined;
export function getAnimatingCanvases(): WeakMap<CanvasRenderingContext2D, AnimatingCanvas> | undefined;
export let Animations: Dict<AnimationSpec>;
/**
* Animation spec provider; default implementation is look up in Renderer.Animations by layer's `animation` property.
......
This diff is collapsed.
This diff is collapsed.
{
"compilerOptions": {
"target": "ES2015",
"lib": ["DOM", "ES2015", "ES2017.Object"],
"target": "ES2020",
"module": "None",
"moduleResolution": "Node",
"outDir": ".",
......
......@@ -3,11 +3,11 @@
"@types/tinycolor2@^1.4.2":
version "1.4.2"
resolved "https://registry.yarnpkg.com/@types/tinycolor2/-/tinycolor2-1.4.2.tgz#721ca5c5d1a2988b4a886e35c2ffc5735b6afbdf"
integrity sha512-PeHg/AtdW6aaIO2a+98Xj7rWY4KC1E6yOy7AFknJQ7VXUGNrMlyxDFxJo7HqLtjQms/ZhhQX52mLVW/EX3JGOw==
version "1.4.3"
resolved "https://registry.npmjs.org/@types/tinycolor2/-/tinycolor2-1.4.3.tgz"
integrity sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==
typescript@~3.9.3:
version "3.9.9"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.9.9.tgz#e69905c54bc0681d0518bd4d587cc6f2d0b1a674"
integrity sha512-kdMjTiekY+z/ubJCATUPlRDl39vXYiMV9iyeMuEuXZh2we6zz80uovNN2WlAxmmdE/Z/YQe+EbOEXB5RHEED3w==
typescript@^5.0.2:
version "5.0.2"
resolved "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz"
integrity sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==
......@@ -142,7 +142,7 @@ function processSlot(setupfile,imgdir,varname,hasIntegrity) {
if (json.colour_sidebar) {
let ifiles = ["full"];
if (hasIntegrity) {
ifiles.push("frayed", "tattered", "torn");
ifiles.push("frayed", "torn", "tattered");
}
files.push(...ifiles);
if (json.hood) {
......@@ -172,7 +172,7 @@ function processSlot(setupfile,imgdir,varname,hasIntegrity) {
if (json.accessory === 1 && json.accessory_colour_sidebar) {
let accfiles = [];
if (json.accessory_integrity_img) {
accfiles.push("full_acc", "frayed_acc", "tattered_acc", "torn_acc");
accfiles.push("full_acc", "frayed_acc", "torn_acc", "tattered_acc");
} else {
accfiles.push("acc")
}
......@@ -212,7 +212,7 @@ function processSlot(setupfile,imgdir,varname,hasIntegrity) {
}
function convertAllClothes() {
let slots = ["hands", "face", "feet", "genitals", "hands", "head", "legs", "lower", "neck", "over_head", "over_lower", "over_upper", "upper"];
let slots = ["hands", "face", "feet", "genitals", "hands", "head", "legs", "lower", "neck", "over_head", "over_lower", "over_upper", "upper", "handheld"];
for (let slot of slots) {
processSlot(`game/base-clothing/clothing-${slot}.twee`, `img/clothes/${slot}/`, `setup.clothes.${slot}`, true);
}
......@@ -220,39 +220,7 @@ function convertAllClothes() {
processSlot("game/base-clothing/clothing-under-upper.twee", "img/clothes/under_upper/", "setup.clothes.under_upper", true);
}
function convertAllHair() {
let lengths = ["short","shoulder","chest","navel","thighs","feet"];
let sidedir = baseurl+"img/hair/sides";
let fringedir = baseurl+"img/hair/fringe";
let files = [];
for (let sidestyle of fs.readdirSync(sidedir)) {
for (let l of lengths) {
let path = sidedir+"/"+sidestyle+"/"+l+".png";
files.push(path);
}
}
for (let fringestyle of fs.readdirSync(fringedir)) {
for (let l of lengths) {
let path = fringedir+"/"+fringestyle+"/"+l+".png";
files.push(path);
}
}
files.push(baseurl+"img/hair/red/backhairthighsred.png");
files.push(baseurl+"img/hair/red/backhairfeetred.png");
for (let path of files) {
if (!fs.existsSync(path)) continue;
console.log("Processing ",path);
try {
desaturateFile(path,hairpreset)
} catch (e) {
console.error(e.message);
failedFiles.push(path);
}
}
}
convertAllClothes();
// convertAllHair();
if (failedFiles.length>0) {
......
<link type="image/png" rel="icon" sizes="16x16" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAGJUExURUdwTM5+RYZPI4BVKoRNH4lQIwAAAHU7H6xoMo1SInlRG4ZMIYNGIa5oNJdaLKtnNK5qNo5VHMJ3QKdkMZ1cMJ5dLqBfLaJgMqRfMJhYKYdQKNGvo6FhM6tkNJRVJ4tGF8B4QZ1cLaliM5FUJ5ZWKPbXxuPBs5NWJ4xSJKhiNJlZKPrp39Krmb2qpKBdLdGom927oo9SI7qHZJpaKbiWiruhmYlRIpVbNtqHTP/u4rVpOqhiMr9xP61jM7FnN7hrO7ttPptbK89+RumaVteFSL90PadbHN2PSKVYHLN1S6ZgMuO7n+3j3P/s34NOI/3p3ZRXKadjNOCPUOOTUsh6Qs59QPCiWsh3O7ZmKrh1Oo9NGMJ2Qp9YJrhqOrBkLtvSz694UpBSIOCUU7CFaNikhKdoOq9ySfHby6OZlHR4f6FvRp9TFpVTIP7o15t7ZqmHbY2YqODEruXEr7K3wC5ejfrNsODi5s+omPTazSJSgb29whxOfvLTxfzk1b+Ma8PEyfPj2+Hm63iNotY+v8UAAAA4dFJOUwD8PQYhfQEEtkkJKhexXbrGEu+WdaXC/rPoRln8+HUL++r0vIX1kPSx4p7s9q7OOP6Y1P1r/av8OyD8ogAAAOZJREFUGBk1wIWWglAUBdCjggzqdHd3N/chpWKP6HR3d3d/ubhcbtjczuIiW4kXeVypQ8oJVFR6YHOXBeelPLPaBUB0SAtLy6FwMBLZaGsAULMYWlldM/374XVlq90Drj4eiJrb5zLbPdrUO1ohMtkfvUjdxGMnB6ra6YLIZO0y9f94fUene0oXIDJZ0xN/Hw9EZ4bWAvj6FZah57d3otvjZh+AEd3I0O+PRbQTqxMA9Kks/fJlvVpzidoq2Jy9k0b6+/N+7LCJL0cO5x2fmX2a4Ad4AQVT01dDw6MoEHoGk0TJ7kbYsoQUMAKQPM6bAAAAAElFTkSuQmCC" />
<meta name="color-scheme" content="light dark"/>
<meta
http-equiv="Content-Security-Policy"
content="default-src 'self' 'unsafe-eval' 'unsafe-inline'; img-src 'self' data:; font-src 'self' data:"/>
\ No newline at end of file
import argparse
import pathlib
import re
widget_regex = re.compile(r"""<<widget '?"?([\w\-_]+)"?'?""")
macro_regex = re.compile(r"""Macro\.add\(["']([\w\-_]+)["']""")
define_macro_regex = re.compile(r'DefineMacroS?\("([\w\-_]+)"')
javascript_regex = re.compile(r"function ([\w\-_]+)\(")
used_regex = re.compile(r"<</?([\w\-_]+).*?>>")
comment_regex = re.compile(r"<!--[\s\S]*?-->")
javascript_comment1_regex = re.compile(r"\s*//.*")
javascript_comment2_regex = re.compile(r"\s*/\*[\s\S]*?\*/")
default = {
"if",
"elseif",
"else",
"set",
"link",
"linkappend",
"linkprepend",
"linkreplace",
"case",
"widget",
"break",
"include",
"compute",
"nobr",
"return",
"for",
"silently",
"audio",
"cacheaudio",
"createaudiogroup",
"createplaylist",
"masteraudio",
"playlist",
"done",
"print",
"append",
"unset",
"switch",
"prepend",
"radiobutton",
"repeat",
"default",
"stop",
"run",
"replace",
"numberbox",
"cycle",
"copy",
"timed",
"checkbox",
"addclass",
"removeclass",
"continue",
"listbox",
"optionsfrom",
"option",
"capture",
"button",
"choice",
"remove",
"onchange",
"condition",
"dynamicblock",
"textbox",
"actions",
"back",
"safereplace",
"script",
"toggleclass",
"twinescript",
"-",
"goto",
"type",
"textarea",
}
def get_js_macros(path: pathlib.Path):
content = path.read_text(encoding="utf-8")
content = re.sub(javascript_comment1_regex, "", content)
content = re.sub(javascript_comment2_regex, "", content)
macros = set()
for i in re.findall(macro_regex, content):
macros.add(i)
for i in re.findall(define_macro_regex, content):
macros.add(i)
for i in re.findall(javascript_regex, content):
macros.add(i)
return macros
def get_twee_macros(path: pathlib.Path):
content = path.read_text(encoding="utf-8")
content = re.sub(comment_regex, "", content)
content = re.sub(javascript_comment2_regex, "", content)
macros = set()
for i in re.findall(widget_regex, content):
macros.add(i)
return macros
def check(path, macros):
content = path.read_text(encoding="utf-8")
if path.suffix == ".js":
content = re.sub(javascript_comment1_regex, "", content)
m = re.search(javascript_comment2_regex, content)
while m:
t = content[m.start() : m.end()]
content = content.replace(t, "\n" * t.count("\n"))
m = re.search(javascript_comment2_regex, content)
elif path.suffix == ".twee":
m = re.search(comment_regex, content)
while m:
t = content[m.start() : m.end()]
content = content.replace(t, "\n" * t.count("\n"))
m = re.search(comment_regex, content)
m = re.search(javascript_comment2_regex, content)
while m:
t = content[m.start() : m.end()]
content = content.replace(t, "\n" * t.count("\n"))
m = re.search(javascript_comment2_regex, content)
for i in re.finditer(used_regex, content):
if i.group(1).startswith("-"):
continue
if i.group(1).lower() not in macros:
n = content[: i.start()].count("\n") + 1
print(f"{str(path)}:{n}: {i.group(1)}")
parser = argparse.ArgumentParser(description="Checks macros.")
parser.add_argument("paths", nargs="*", type=pathlib.Path)
args = parser.parse_args()
if not args.paths:
print("No paths")
exit(1)
paths: list[pathlib.Path] = args.paths
targets = []
macros = default
for i in paths:
if i.suffix == ".js":
macros |= get_js_macros(i)
targets.append(i)
elif i.suffix == ".twee":
macros |= get_twee_macros(i)
targets.append(i)
macros = set(map(str.lower, macros))
for i in targets:
check(i, macros)
Copyright (c) 2013-2020, Thomas Michael Edwards <thomasmedwards@gmail.com>.
Copyright (c) 2013-2021, Thomas Michael Edwards <thomasmedwards@gmail.com>.
All rights reserved.
Redistribution and use in source and binary forms, with or without
......
File added
/*
* This is a TypeScript typings file with definitions an documentation of in-game structures.
*
* While documenting everything here is optional, the definitions might be picked by IDE,
* and, should TypeScript rewrite become a thing in future, would work as a static type check.
*/
declare interface ClothesItem {
index: number;
name: string;
name_cap: string;
/**
* Folder name
*/
variable: string;
integrity: number;
integrity_max: number;
fabric_strength: number;
reveal: number;
bustresize: number;
one_piece: number;
strap: number;
open: number;
word: "a";
state: string;
state_base: string;
state_top: string;
state_top_base: string;
plural: number;
/**
* key in setup.colours.prefilters identifying preprocessing required for canvas renderer.
* default is "clothes"
*/
prefilter?: string;
colour: string|0;
colour_options: string[];
colour_sidebar: 0|1;
exposed: number;
exposed_base: number;
vagina_exposed: number;
vagina_exposed_base: number;
anus_exposed: number;
anus_exposed_base: number;
type: string[];
set: string;
gender: string;
femininity: number;
warmth: number;
cost: number;
description: string;
shop: string[];
accessory: number;
accessory_colour: string|0;
accessory_colour_options: string[];
accessory_colour_sidebar: number;
/**
* if 1, then accessory files are integrity-dependent "acc_(torn|tattered|frayed|full).png"
*/
accessory_integrity_img?: 0|1;
high_img: 0|1;
back_img: 0|1;
/**
* Recolouring of back image
* * "" (default) - depending on colour_sidebar
* * "no" - do not recolour image
* * "primary" - use primary/main colour
* * "secondary" - use secondary/accessory colour
*/
back_img_colour?: ""|"no"|"primary"|"secondary";
/**
* (For upper, over_upper, under_upper slots)
* 1 if has sleeve images, named (left|right)[_cover].png".
* Colouring depends on sleeve_colour property.
*/
sleeve_img: number;
/**
* (For upper, over_upper, under_upper slots)
* 1 if has sleeve accessory images, named (left|right)[_cover]_acc.png".
* These images are not colored.
* Requires sleeve_img: 1.
*/
sleeve_acc_img: number;
/**
* (For upper, over_upper, under_upper slots)
* Recolouring of sleeves images:
* * "" (default) - depending on colour_sidebar
* * "no" - do not recolour image
* * "primary" - use primary/main colour
* * "secondary" - use secondary/accessory colour
*/
sleeve_colour?: ""|"no"|"primary"|"secondary";
breast_img: number;
cursed: number;
location: number;
iconFile: string;
accIcon: number;
outfitPrimary: object;
outfitSecondary: string[];
notuck: number;
/**
* (For head slots)
* if 1, this item has mask.png image to cut out hair & animal ears layers
*/
mask_img?: number;
// TODO list and document other options
}
declare namespace setup {
/**
* Slot names
*/
export let clothes_all_slots: string[];
export namespace clothes {
export let over_upper: ClothesItem[];
export let over_lower: ClothesItem[];
export let upper: ClothesItem[];
export let lower: ClothesItem[];
export let under_upper: ClothesItem[];
export let under_lower: ClothesItem[];
export let over_head: ClothesItem[];
export let head: ClothesItem[];
export let face: ClothesItem[];
export let neck: ClothesItem[];
export let hands: ClothesItem[];
export let legs: ClothesItem[];
export let feet: ClothesItem[];
export let genitals: ClothesItem[];
}
}
This diff is collapsed.
......@@ -272,7 +272,7 @@ See <a href="https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingCon
Patterns are images that are tiled horizontally and vertically, and applied to the layer with specified blend mode.
```js
T.modeloptions.worn_upper_colour = "custom";
T.modeloptions.worn.upper_colour = "custom";
T.modeloptions.filters.worn_lower_custom = {
blend: { pattern:"wolfharmony" },
blendMode:"hard-light"
......
docs/assets/exhib1.png

24.7 KiB