silkedit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. checksums.yaml +7 -0
  2. data/.rbcli +0 -0
  3. data/CHANGELOG.md +3 -0
  4. data/CODE_OF_CONDUCT.md +132 -0
  5. data/README.md +302 -0
  6. data/Rakefile +8 -0
  7. data/exe/silkedit +14 -0
  8. data/lib/commands/backup_restore.rb +25 -0
  9. data/lib/commands/cheat.rb +19 -0
  10. data/lib/commands/edit_diff.rb +47 -0
  11. data/lib/commands/examples/command.rb +51 -0
  12. data/lib/commands/examples/script.rb +36 -0
  13. data/lib/commands/journal.rb +34 -0
  14. data/lib/commands/permasave_permaload.rb +62 -0
  15. data/lib/commands/scripts/.keep +0 -0
  16. data/lib/commands/unpack_repack.rb +27 -0
  17. data/lib/commands/zone_mkzone.rb +102 -0
  18. data/lib/config/config.rb +28 -0
  19. data/lib/config/envvars.rb +23 -0
  20. data/lib/config/hooks.rb +22 -0
  21. data/lib/config/logger.rb +36 -0
  22. data/lib/config/parser.rb +34 -0
  23. data/lib/config/updatechecker.rb +12 -0
  24. data/lib/silkedit/cheats/cheatengine.rb +34 -0
  25. data/lib/silkedit/cheats/hollow_knight_cheats.rb +5 -0
  26. data/lib/silkedit/cheats/merger.rb +103 -0
  27. data/lib/silkedit/cheats/silksong_cheats.rb +121 -0
  28. data/lib/silkedit/cheats/silksong_enemyjournal.rb +119 -0
  29. data/lib/silkedit/cheats/silksong_zoner.rb +98 -0
  30. data/lib/silkedit/config/savegame.yaml +13 -0
  31. data/lib/silkedit/config/silkedit.yaml +6 -0
  32. data/lib/silkedit/config/silksong/cheatdata.yaml +1145 -0
  33. data/lib/silkedit/config/silksong/enemylist.yaml +1418 -0
  34. data/lib/silkedit/config/silksong/old.yaml +4345 -0
  35. data/lib/silkedit/config/silksong/permasaves.yaml +10 -0
  36. data/lib/silkedit/config/silksong/unfinished.yaml +628 -0
  37. data/lib/silkedit/config/silksong/zones.yaml +1686 -0
  38. data/lib/silkedit/images/.keep +0 -0
  39. data/lib/silkedit/images/silksong/Aknid.png +0 -0
  40. data/lib/silkedit/images/silksong/Alita.png +0 -0
  41. data/lib/silkedit/images/silksong/Barnak.png +0 -0
  42. data/lib/silkedit/images/silksong/Beastfly.png +0 -0
  43. data/lib/silkedit/images/silksong/Bell_Beast.png +0 -0
  44. data/lib/silkedit/images/silksong/Bell_Eater.png +0 -0
  45. data/lib/silkedit/images/silksong/Bloatroach.png +0 -0
  46. data/lib/silkedit/images/silksong/Broodmother.png +0 -0
  47. data/lib/silkedit/images/silksong/Brushflit.png +0 -0
  48. data/lib/silkedit/images/silksong/Burning_Bug.png +0 -0
  49. data/lib/silkedit/images/silksong/Caranid.png +0 -0
  50. data/lib/silkedit/images/silksong/Choir_Bellbearer.png +0 -0
  51. data/lib/silkedit/images/silksong/Choir_Clapper.png +0 -0
  52. data/lib/silkedit/images/silksong/Choir_Elder.png +0 -0
  53. data/lib/silkedit/images/silksong/Choir_Flyer.png +0 -0
  54. data/lib/silkedit/images/silksong/Choir_Hornhead.png +0 -0
  55. data/lib/silkedit/images/silksong/Choir_Pouncer.png +0 -0
  56. data/lib/silkedit/images/silksong/Choristor.png +0 -0
  57. data/lib/silkedit/images/silksong/Clawmaiden.png +0 -0
  58. data/lib/silkedit/images/silksong/Clover_Dancers.png +0 -0
  59. data/lib/silkedit/images/silksong/Cloverstag.png +0 -0
  60. data/lib/silkedit/images/silksong/Cogwork_Choirbug.png +0 -0
  61. data/lib/silkedit/images/silksong/Cogwork_Clapper.png +0 -0
  62. data/lib/silkedit/images/silksong/Cogwork_Cleanser.png +0 -0
  63. data/lib/silkedit/images/silksong/Cogwork_Crawler.png +0 -0
  64. data/lib/silkedit/images/silksong/Cogwork_Dancers.png +0 -0
  65. data/lib/silkedit/images/silksong/Cogwork_Defender.png +0 -0
  66. data/lib/silkedit/images/silksong/Cogwork_Hauler.png +0 -0
  67. data/lib/silkedit/images/silksong/Cogwork_Spine.png +0 -0
  68. data/lib/silkedit/images/silksong/Cogwork_Underfly.png +0 -0
  69. data/lib/silkedit/images/silksong/Cogworker.png +0 -0
  70. data/lib/silkedit/images/silksong/Conchfly.png +0 -0
  71. data/lib/silkedit/images/silksong/Coral_Furm.png +0 -0
  72. data/lib/silkedit/images/silksong/Corrcrust_Karaka.png +0 -0
  73. data/lib/silkedit/images/silksong/Covetous_Pilgrim.png +0 -0
  74. data/lib/silkedit/images/silksong/Craggler.png +0 -0
  75. data/lib/silkedit/images/silksong/Cragglite.png +0 -0
  76. data/lib/silkedit/images/silksong/Craw.png +0 -0
  77. data/lib/silkedit/images/silksong/Craw_Juror.png +0 -0
  78. data/lib/silkedit/images/silksong/Crawfather.png +0 -0
  79. data/lib/silkedit/images/silksong/Crust_King_Khann.png +0 -0
  80. data/lib/silkedit/images/silksong/Crustcrag.png +0 -0
  81. data/lib/silkedit/images/silksong/Crustcrawler.png +0 -0
  82. data/lib/silkedit/images/silksong/Deep_Diver.png +0 -0
  83. data/lib/silkedit/images/silksong/Disgraced_Chef_Lugoli.png +0 -0
  84. data/lib/silkedit/images/silksong/Drapefly.png +0 -0
  85. data/lib/silkedit/images/silksong/Drapelord.png +0 -0
  86. data/lib/silkedit/images/silksong/Drapemite.png +0 -0
  87. data/lib/silkedit/images/silksong/Dreg_Catcher.png +0 -0
  88. data/lib/silkedit/images/silksong/Dreg_Husk.png +0 -0
  89. data/lib/silkedit/images/silksong/Dregwheel.png +0 -0
  90. data/lib/silkedit/images/silksong/Driftlin.png +0 -0
  91. data/lib/silkedit/images/silksong/Driznarga.png +0 -0
  92. data/lib/silkedit/images/silksong/Driznit.png +0 -0
  93. data/lib/silkedit/images/silksong/Ductsucker.png +0 -0
  94. data/lib/silkedit/images/silksong/Elder_Pilgrim.png +0 -0
  95. data/lib/silkedit/images/silksong/Envoy.png +0 -0
  96. data/lib/silkedit/images/silksong/Escalion.png +0 -0
  97. data/lib/silkedit/images/silksong/Father_of_the_Flame.png +0 -0
  98. data/lib/silkedit/images/silksong/Fertid.png +0 -0
  99. data/lib/silkedit/images/silksong/First_Sinner.png +0 -0
  100. data/lib/silkedit/images/silksong/Flapping_Fertid.png +0 -0
  101. data/lib/silkedit/images/silksong/Flintbeetle.png +0 -0
  102. data/lib/silkedit/images/silksong/Flintflame_Flyer.png +0 -0
  103. data/lib/silkedit/images/silksong/Flintstone_Flyer.png +0 -0
  104. data/lib/silkedit/images/silksong/Fluttermite.png +0 -0
  105. data/lib/silkedit/images/silksong/Forebrothers_Signis_&_Gron.png +0 -0
  106. data/lib/silkedit/images/silksong/Fourth_Chorus.png +0 -0
  107. data/lib/silkedit/images/silksong/Freshfly.png +0 -0
  108. data/lib/silkedit/images/silksong/Furm.png +0 -0
  109. data/lib/silkedit/images/silksong/Gahlia.png +0 -0
  110. data/lib/silkedit/images/silksong/Gargant_Gloom.png +0 -0
  111. data/lib/silkedit/images/silksong/Garpid.png +0 -0
  112. data/lib/silkedit/images/silksong/Giant_Drapemite.png +0 -0
  113. data/lib/silkedit/images/silksong/Gloomsac.png +0 -0
  114. data/lib/silkedit/images/silksong/Grand_Mother_Silk.png +0 -0
  115. data/lib/silkedit/images/silksong/Grand_Reed.png +0 -0
  116. data/lib/silkedit/images/silksong/Great_Conchfly.png +0 -0
  117. data/lib/silkedit/images/silksong/Groal_the_Great.png +0 -0
  118. data/lib/silkedit/images/silksong/Grom.png +0 -0
  119. data/lib/silkedit/images/silksong/Gromling.png +0 -0
  120. data/lib/silkedit/images/silksong/Guardfly.png +0 -0
  121. data/lib/silkedit/images/silksong/Gurr_the_Outcast.png +0 -0
  122. data/lib/silkedit/images/silksong/Hardbone_Elder.png +0 -0
  123. data/lib/silkedit/images/silksong/Hardbone_Hopper.png +0 -0
  124. data/lib/silkedit/images/silksong/Hoker.png +0 -0
  125. data/lib/silkedit/images/silksong/Huge_Flea.png +0 -0
  126. data/lib/silkedit/images/silksong/Imoba.png +0 -0
  127. data/lib/silkedit/images/silksong/Judge.png +0 -0
  128. data/lib/silkedit/images/silksong/Kai.png +0 -0
  129. data/lib/silkedit/images/silksong/Kakri.png +0 -0
  130. data/lib/silkedit/images/silksong/Karak_Gor.png +0 -0
  131. data/lib/silkedit/images/silksong/Karaka.png +0 -0
  132. data/lib/silkedit/images/silksong/Kilik.png +0 -0
  133. data/lib/silkedit/images/silksong/Kindanir.png +0 -0
  134. data/lib/silkedit/images/silksong/Lace.png +0 -0
  135. data/lib/silkedit/images/silksong/Lampbearer.png +0 -0
  136. data/lib/silkedit/images/silksong/Last_Claw.png +0 -0
  137. data/lib/silkedit/images/silksong/Last_Judge.png +0 -0
  138. data/lib/silkedit/images/silksong/Lavalarga.png +0 -0
  139. data/lib/silkedit/images/silksong/Lavalug.png +0 -0
  140. data/lib/silkedit/images/silksong/Leaf_Glider.png +0 -0
  141. data/lib/silkedit/images/silksong/Leaf_Roller.png +0 -0
  142. data/lib/silkedit/images/silksong/Lost_Garmond.png +0 -0
  143. data/lib/silkedit/images/silksong/Lost_Lace.png +0 -0
  144. data/lib/silkedit/images/silksong/Maestro.png +0 -0
  145. data/lib/silkedit/images/silksong/Marrowmaw.png +0 -0
  146. data/lib/silkedit/images/silksong/Massive_Mossgrub.png +0 -0
  147. data/lib/silkedit/images/silksong/Mawling.png +0 -0
  148. data/lib/silkedit/images/silksong/Memoria.png +0 -0
  149. data/lib/silkedit/images/silksong/Minister.png +0 -0
  150. data/lib/silkedit/images/silksong/Miremite.png +0 -0
  151. data/lib/silkedit/images/silksong/Mite.png +0 -0
  152. data/lib/silkedit/images/silksong/Mitemother.png +0 -0
  153. data/lib/silkedit/images/silksong/Mnemonid.png +0 -0
  154. data/lib/silkedit/images/silksong/Mnemonord.png +0 -0
  155. data/lib/silkedit/images/silksong/Moorwing.png +0 -0
  156. data/lib/silkedit/images/silksong/Mortician.png +0 -0
  157. data/lib/silkedit/images/silksong/Moss_Mother.png +0 -0
  158. data/lib/silkedit/images/silksong/Mossgrub.png +0 -0
  159. data/lib/silkedit/images/silksong/Mossmir.png +0 -0
  160. data/lib/silkedit/images/silksong/Mothleaf_Lagnia.png +0 -0
  161. data/lib/silkedit/images/silksong/Muckmaggot.png +0 -0
  162. data/lib/silkedit/images/silksong/Muckroach.png +0 -0
  163. data/lib/silkedit/images/silksong/Nuphar.png +0 -0
  164. data/lib/silkedit/images/silksong/Nyleth.png +0 -0
  165. data/lib/silkedit/images/silksong/Overgrown_Pilgrim.png +0 -0
  166. data/lib/silkedit/images/silksong/Palestag.png +0 -0
  167. data/lib/silkedit/images/silksong/Pendra.png +0 -0
  168. data/lib/silkedit/images/silksong/Pendragor.png +0 -0
  169. data/lib/silkedit/images/silksong/Penitent.png +0 -0
  170. data/lib/silkedit/images/silksong/Phacia.png +0 -0
  171. data/lib/silkedit/images/silksong/Phantom.png +0 -0
  172. data/lib/silkedit/images/silksong/Pharlid.png +0 -0
  173. data/lib/silkedit/images/silksong/Pharlid_Diver.png +0 -0
  174. data/lib/silkedit/images/silksong/Pilgrim_Bellbearer.png +0 -0
  175. data/lib/silkedit/images/silksong/Pilgrim_Groveller.png +0 -0
  176. data/lib/silkedit/images/silksong/Pilgrim_Guide.png +0 -0
  177. data/lib/silkedit/images/silksong/Pilgrim_Hiker.png +0 -0
  178. data/lib/silkedit/images/silksong/Pilgrim_Hornfly.png +0 -0
  179. data/lib/silkedit/images/silksong/Pilgrim_Hulk.png +0 -0
  180. data/lib/silkedit/images/silksong/Pilgrim_Pouncer.png +0 -0
  181. data/lib/silkedit/images/silksong/Pinstress.png +0 -0
  182. data/lib/silkedit/images/silksong/Plasmid.png +0 -0
  183. data/lib/silkedit/images/silksong/Plasmidas.png +0 -0
  184. data/lib/silkedit/images/silksong/Plasmified_Zango.png +0 -0
  185. data/lib/silkedit/images/silksong/Pokenabbin.png +0 -0
  186. data/lib/silkedit/images/silksong/Pollenica.png +0 -0
  187. data/lib/silkedit/images/silksong/Pond_Skipper.png +0 -0
  188. data/lib/silkedit/images/silksong/Pondcatcher.png +0 -0
  189. data/lib/silkedit/images/silksong/Puny_Penitent.png +0 -0
  190. data/lib/silkedit/images/silksong/Reed.png +0 -0
  191. data/lib/silkedit/images/silksong/Rhinogrund.png +0 -0
  192. data/lib/silkedit/images/silksong/Roachcatcher.png +0 -0
  193. data/lib/silkedit/images/silksong/Roachfeeder.png +0 -0
  194. data/lib/silkedit/images/silksong/Roachkeeper.png +0 -0
  195. data/lib/silkedit/images/silksong/Roachserver.png +0 -0
  196. data/lib/silkedit/images/silksong/Sandcarver.png +0 -0
  197. data/lib/silkedit/images/silksong/Savage_Beastfly.png +0 -0
  198. data/lib/silkedit/images/silksong/Scabfly.png +0 -0
  199. data/lib/silkedit/images/silksong/Scrollreader.png +0 -0
  200. data/lib/silkedit/images/silksong/Second_Sentinel.png +0 -0
  201. data/lib/silkedit/images/silksong/Servitor_Boran.png +0 -0
  202. data/lib/silkedit/images/silksong/Servitor_Ignim.png +0 -0
  203. data/lib/silkedit/images/silksong/Shadow_Charger.png +0 -0
  204. data/lib/silkedit/images/silksong/Shadow_Creeper_(Silksong).png +0 -0
  205. data/lib/silkedit/images/silksong/Shardillard.png +0 -0
  206. data/lib/silkedit/images/silksong/Shellwood_Gnat.png +0 -0
  207. data/lib/silkedit/images/silksong/Shrine_Guardian_Seth.png +0 -0
  208. data/lib/silkedit/images/silksong/Silk_Snipper.png +0 -0
  209. data/lib/silkedit/images/silksong/Sister_Splinter.png +0 -0
  210. data/lib/silkedit/images/silksong/Skarr_Scout.png +0 -0
  211. data/lib/silkedit/images/silksong/Skarr_Stalker.png +0 -0
  212. data/lib/silkedit/images/silksong/Skarrgard.png +0 -0
  213. data/lib/silkedit/images/silksong/Skarrlid.png +0 -0
  214. data/lib/silkedit/images/silksong/Skarrsinger_Karmelita.png +0 -0
  215. data/lib/silkedit/images/silksong/Skarrwing.png +0 -0
  216. data/lib/silkedit/images/silksong/Skrill.png +0 -0
  217. data/lib/silkedit/images/silksong/Skull_Brute.png +0 -0
  218. data/lib/silkedit/images/silksong/Skull_Scuttler.png +0 -0
  219. data/lib/silkedit/images/silksong/Skull_Tyrant.png +0 -0
  220. data/lib/silkedit/images/silksong/Skullwing.png +0 -0
  221. data/lib/silkedit/images/silksong/Slubberlug.png +0 -0
  222. data/lib/silkedit/images/silksong/Smelt_Shoveller.png +0 -0
  223. data/lib/silkedit/images/silksong/Smokerock_Sifter.png +0 -0
  224. data/lib/silkedit/images/silksong/Snitchfly.png +0 -0
  225. data/lib/silkedit/images/silksong/Spear_Skarr.png +0 -0
  226. data/lib/silkedit/images/silksong/Spinebeak_Kai.png +0 -0
  227. data/lib/silkedit/images/silksong/Spit_Squit.png +0 -0
  228. data/lib/silkedit/images/silksong/Splinter.png +0 -0
  229. data/lib/silkedit/images/silksong/Splinterbark.png +0 -0
  230. data/lib/silkedit/images/silksong/Splinterhorn.png +0 -0
  231. data/lib/silkedit/images/silksong/Squatcraw.png +0 -0
  232. data/lib/silkedit/images/silksong/Squatcraw_Juror.png +0 -0
  233. data/lib/silkedit/images/silksong/Squirrm.png +0 -0
  234. data/lib/silkedit/images/silksong/Steelspine_Kai.png +0 -0
  235. data/lib/silkedit/images/silksong/Stilkin.png +0 -0
  236. data/lib/silkedit/images/silksong/Stilkin_Trapper.png +0 -0
  237. data/lib/silkedit/images/silksong/Summoned_Saviour.png +0 -0
  238. data/lib/silkedit/images/silksong/Surgeon.png +0 -0
  239. data/lib/silkedit/images/silksong/Swamp_Squit.png +0 -0
  240. data/lib/silkedit/images/silksong/Tallcraw.png +0 -0
  241. data/lib/silkedit/images/silksong/Tallcraw_Juror.png +0 -0
  242. data/lib/silkedit/images/silksong/Tarmite.png +0 -0
  243. data/lib/silkedit/images/silksong/The_Unravelled.png +0 -0
  244. data/lib/silkedit/images/silksong/Thread_Raker.png +0 -0
  245. data/lib/silkedit/images/silksong/Tormented_Trobbio.png +0 -0
  246. data/lib/silkedit/images/silksong/Trobbio.png +0 -0
  247. data/lib/silkedit/images/silksong/Undercrank.png +0 -0
  248. data/lib/silkedit/images/silksong/Underloft.png +0 -0
  249. data/lib/silkedit/images/silksong/Underpoke.png +0 -0
  250. data/lib/silkedit/images/silksong/Underscrub.png +0 -0
  251. data/lib/silkedit/images/silksong/Undersweep.png +0 -0
  252. data/lib/silkedit/images/silksong/Underworker.png +0 -0
  253. data/lib/silkedit/images/silksong/Vaultborn.png +0 -0
  254. data/lib/silkedit/images/silksong/Vaultkeeper.png +0 -0
  255. data/lib/silkedit/images/silksong/Verdanir.png +0 -0
  256. data/lib/silkedit/images/silksong/Vicious_Caranid.png +0 -0
  257. data/lib/silkedit/images/silksong/Void_Mass.png +0 -0
  258. data/lib/silkedit/images/silksong/Void_Tendrils_(Silksong).png +0 -0
  259. data/lib/silkedit/images/silksong/Voltvyrm.png +0 -0
  260. data/lib/silkedit/images/silksong/Wardenfly.png +0 -0
  261. data/lib/silkedit/images/silksong/Watcher_at_the_Edge.png +0 -0
  262. data/lib/silkedit/images/silksong/Widow.png +0 -0
  263. data/lib/silkedit/images/silksong/Winged_Furm.png +0 -0
  264. data/lib/silkedit/images/silksong/Winged_Lifeseed.png +0 -0
  265. data/lib/silkedit/images/silksong/Winged_Pilgrim.png +0 -0
  266. data/lib/silkedit/images/silksong/Winged_Pilgrim_Bellbearer.png +0 -0
  267. data/lib/silkedit/images/silksong/Wingmould_(Silksong).png +0 -0
  268. data/lib/silkedit/images/silksong/Wisp.png +0 -0
  269. data/lib/silkedit/images/silksong/Wood_Wasp.png +0 -0
  270. data/lib/silkedit/images/silksong/Wraith.png +0 -0
  271. data/lib/silkedit/images/silksong/Yago.png +0 -0
  272. data/lib/silkedit/images/silksong/Yuma.png +0 -0
  273. data/lib/silkedit/images/silksong/Yumama.png +0 -0
  274. data/lib/silkedit/savegame/crypto.rb +25 -0
  275. data/lib/silkedit/savegame/diff.rb +158 -0
  276. data/lib/silkedit/savegame/packer.rb +75 -0
  277. data/lib/silkedit/savegame/savefile.rb +153 -0
  278. data/lib/silkedit/util/system.rb +37 -0
  279. data/lib/silkedit/version.rb +5 -0
  280. data/lib/silkedit.rb +9 -0
  281. data/sig/silkedit.rbs +4 -0
  282. metadata +504 -0
@@ -0,0 +1,119 @@
1
+ require 'open-uri'
2
+ require 'nokogiri'
3
+
4
+ module Silkedit::Cheat
5
+ module SilksongJournaler
6
+ @enemylist = YAML.safe_load_file(File.join(Silkedit::LIBDIR, 'config', 'silksong', 'enemylist.yaml'), symbolize_names: false)
7
+
8
+ def update_journal(should_update_kills_only: true)
9
+ enemylist = Silkedit::Cheat::SilksongJournaler.module_eval { @enemylist }
10
+ Rbcli.log.info 'Applying ', 'JOURNAL'
11
+ enemylist['playerData']['EnemyJournalKillData']['list'].each do |known_enemy|
12
+ sleep 0.05
13
+ player_enemy = @data['playerData']['EnemyJournalKillData']['list'].find { |i| i['Name'] == known_enemy['Name'] }
14
+ self.display_enemy(known_enemy, player_enemy, show_images: false)
15
+ if player_enemy.nil?
16
+ if should_update_kills_only
17
+ Rbcli.log.info " Not Seen. Skipping.".colorize(:grey)
18
+ else
19
+ new_entry = {
20
+ 'Name' => known_enemy['Name'],
21
+ 'Record' => {
22
+ 'Kills' => known_enemy['Record']['Kills'],
23
+ 'HasBeenSeen' => false
24
+ } }
25
+ @data['playerData']['EnemyJournalKillData']['list'].append(new_entry)
26
+ Rbcli.log.info " Added to journal.".colorize(:magenta)
27
+ end
28
+ elsif player_enemy['Record']['Kills'] < known_enemy['Record']['Kills']
29
+ next if (known_enemy['Record']['Kills'] < 10) && !Silkedit::Sys.yes_no?(" Set #{known_enemy['GameName'].colorize(:blue)} kills from #{player_enemy['Record']['Kills'].to_s.colorize(:red)} to #{known_enemy['Record']['Kills'].to_s.colorize(:green)}?")
30
+ player_enemy['Record']['Kills'] = known_enemy['Record']['Kills']
31
+ player_enemy['Record']['HasBeenSeen'] = true
32
+ Rbcli.log.info " Updated kills.".colorize(:cyan)
33
+ else
34
+ Rbcli.log.info " Already Completed.".colorize(:green)
35
+ end
36
+ end
37
+ end
38
+
39
+ def enemy_list(only_missing: false, show_images: false)
40
+ enemylist = Silkedit::Cheat::SilksongJournaler.module_eval { @enemylist }
41
+ enemylist['playerData']['EnemyJournalKillData']['list'].each do |known_enemy|
42
+ player_enemy = @data['playerData']['EnemyJournalKillData']['list'].find { |i| i['Name'] == known_enemy['Name'] }
43
+ left = player_enemy.nil? ? known_enemy['Record']['Kills'] : known_enemy['Record']['Kills'] - player_enemy['Record']['Kills']
44
+ left = 0 if left < 0
45
+ next if only_missing && left <= 0
46
+ self.display_enemy(known_enemy, player_enemy, show_images: show_images)
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def display_enemy(known_enemy, player_enemy, show_images: false)
53
+ self.show_enemy_image(known_enemy['GameName']) if show_images
54
+ left = player_enemy.nil? ? known_enemy['Record']['Kills'] : known_enemy['Record']['Kills'] - player_enemy['Record']['Kills']
55
+ left = 0 if left < 0
56
+ e_complete = left <= 0 ? '*'.colorize(:cyan) : ' '
57
+ e_name = known_enemy['GameName'].ljust(27).colorize(:blue).bold
58
+ e_seen = player_enemy.nil? ? 'N'.colorize(:red) : 'Y'.colorize(:green)
59
+ e_kills = (player_enemy.nil? ? 0 : player_enemy['Record']['Kills']).to_s.rjust(4).colorize(:green)
60
+ e_req = known_enemy['Record']['Kills'].to_s.rjust(4).colorize(:blue)
61
+ e_need = left.to_s.rjust(4).colorize(left <= 0 ? :cyan : :red)
62
+ Rbcli.log.info "#{e_complete} #{e_name} Seen? #{e_seen} Kills: #{e_kills} Needed: #{e_req} Left: #{e_need}"
63
+ end
64
+
65
+ def show_enemy_image(name)
66
+ `which imgcat > /dev/null 2>&1`
67
+ return false unless $?.success?
68
+ enemy_name = name.gsub(' ', '_')
69
+ # enemy_image_directory = File.expand_path(Rbcli::Warehouse.get(:config, :parsedopts)[:images_directory])
70
+ enemy_image_directory = File.join(Silkedit::LIBDIR, 'images', 'silksong')
71
+ cached_image_option_1 = File.join(enemy_image_directory, "#{enemy_name}.png")
72
+ cached_image_option_2 = File.join(enemy_image_directory, "#{enemy_name}_(Silksong).png")
73
+
74
+ command = "imgcat '%s'"
75
+
76
+ if File.exist?(cached_image_option_1)
77
+ system(format(command, cached_image_option_1))
78
+ elsif File.exist?(cached_image_option_2)
79
+ system(format(command, cached_image_option_2))
80
+ else
81
+ got_image = self.get_large_enemy_image(enemy_name, cached_image_option_1)
82
+ got_image = self.get_large_enemy_image("#{enemy_name}_(Silksong)", cached_image_option_2) unless got_image
83
+ show_enemy_image(name) if got_image
84
+ end
85
+ end
86
+
87
+ def get_large_enemy_image(enemy_name, desired_filename)
88
+ begin
89
+ page_url = "https://hollowknight.wiki/w/#{enemy_name}"
90
+ html = URI.open(page_url, 'User-Agent' => 'Ruby/Nokogiri').read
91
+ doc = Nokogiri::HTML(html)
92
+ img = doc.at_css('img.pi-image-thumbnail')
93
+ return false unless img
94
+
95
+ raw = img['src'] || img['data-src'] || img['srcset']
96
+ return false unless raw && !raw.strip.empty?
97
+
98
+ raw = raw.split(',').first.split(/\s+/).first
99
+ image_url = if raw.start_with?('//')
100
+ "https:#{raw}"
101
+ elsif raw =~ %r{\Ahttps?://}
102
+ raw
103
+ else
104
+ URI.join(page_url, raw).to_s
105
+ end
106
+ URI.open(image_url, 'rb', 'User-Agent' => 'Ruby/Nokogiri') do |image_io|
107
+ FileUtils.mkdir_p(File.dirname(desired_filename)) unless File.directory?(File.dirname(desired_filename))
108
+ File.open(desired_filename, 'wb') do |file|
109
+ IO.copy_stream(image_io, file)
110
+ end
111
+ end
112
+ return true
113
+ rescue StandardError => _e
114
+ return false
115
+ end
116
+ end
117
+
118
+ end
119
+ end
@@ -0,0 +1,98 @@
1
+ module Silkedit::Cheat
2
+ module SilksongZoner
3
+ @zonedata = YAML.safe_load_file(File.join(Silkedit::LIBDIR, 'config', 'silksong', 'zones.yaml'), symbolize_names: false)
4
+ @shortcuts = @zonedata['_shortcuts']
5
+ @zonelist = @zonedata.reject { |k, _v| k.start_with?('_') }.to_a.map do |region, r_values|
6
+ r_values.map do |spawnpoint, data|
7
+ {
8
+ "slug" => "#{region}.#{spawnpoint}",
9
+ "shortcut" => @shortcuts.values.include?("#{region}.#{spawnpoint}") ? @shortcuts.key("#{region}.#{spawnpoint}") : nil
10
+ }.merge(data)
11
+ end
12
+ end.flatten
13
+
14
+ def list_zones
15
+ zonelist = Silkedit::Cheat::SilksongZoner.module_eval { @zonelist }
16
+ zonelist.map { |z| z.select { |k, _v| %w[slug shortcut min_act].include?(k) }.transform_keys(&:to_sym) }
17
+ end
18
+
19
+ def list_shortcuts
20
+ Silkedit::Cheat::SilksongZoner.module_eval { @shortcuts }
21
+ end
22
+
23
+ def zone_to(zone, force_soft_reqs: false, enforce_min_act: true)
24
+ zonedata = Silkedit::Cheat::SilksongZoner.module_eval { @zonedata }
25
+ zonelist = Silkedit::Cheat::SilksongZoner.module_eval { @zonelist }
26
+ shortcuts = Silkedit::Cheat::SilksongZoner.module_eval { @shortcuts }
27
+ Rbcli.log.info "Zoning to #{zone}", 'ZONER'
28
+ return self.zone_to(shortcuts[zone]) if shortcuts.key?(zone)
29
+ return :no_zone unless zonelist.find { |z| z['slug'] == zone }
30
+ region, target = zone.split('.')
31
+ Silkedit::Cheat.merge_cheat(
32
+ @data,
33
+ zonedata[region][target],
34
+ should_merge_arrays: true,
35
+ force_soft_reqs: force_soft_reqs,
36
+ enforce_min_act: enforce_min_act
37
+ )
38
+ end
39
+
40
+ def save_current_zone(name, shortcut = nil, act_override = nil, overwrite: false)
41
+ region, target = name.downcase.split('.')
42
+ return :badname unless region && target
43
+ return :badact if !act_override.nil? && (act_override < 1 || act_override > 3)
44
+ return :badshortcut if !shortcut.nil? && shortcut.include?('.')
45
+
46
+ zone = {
47
+ 'data' => {
48
+ 'playerData' => {
49
+ 'atBench' => @data['playerData']['atBench'],
50
+ 'respawnScene' => @data['playerData']['respawnScene'],
51
+ 'mapZone' => @data['playerData']['mapZone'],
52
+ 'extraRestZone' => @data['playerData']['extraRestZone'],
53
+ 'respawnMarkerName' => @data['playerData']['respawnMarkerName'],
54
+ 'respawnType' => @data['playerData']['respawnType'],
55
+ 'hazardRespawnFacing' => @data['playerData']['hazardRespawnFacing'],
56
+ }
57
+ },
58
+ 'soft_reqs' => {},
59
+ 'hard_reqs' => {},
60
+ 'min_act' => act_override || Silkedit::Cheat.get_game_act(@data)
61
+ }
62
+
63
+ rosarylock = @data['sceneData']['persistentBools']['serializedList'].find { |i| i['SceneName'] == @data['playerData']['respawnScene'] && i['ID'] == 'bell_toll_machine' }
64
+ zone['soft_reqs'].merge!({'sceneData' => {'persistentBools' => {'serializedList' => [rosarylock]}}}) unless rosarylock.nil?
65
+ leverlock = @data['sceneData']['persistentInts']['serializedList'].find { |i| i['SceneName'] == @data['playerData']['respawnScene'] && i['ID'].include?('Bellshrine Sequence') }
66
+ zone['soft_reqs'].merge!({'sceneData' => {'persistentInts' => {'serializedList' => [leverlock]}}}) unless leverlock.nil?
67
+
68
+ zonedata = Silkedit::Cheat::SilksongZoner.module_eval { @zonedata }
69
+ zonelist = Silkedit::Cheat::SilksongZoner.module_eval { @zonelist }
70
+ known_zone_idx = zonelist.find_index do |known_zone|
71
+ known_zone['data']['playerData']['respawnScene'] == zone['data']['playerData']['respawnScene'] &&
72
+ known_zone['data']['playerData']['respawnMarkerName'] == zone['data']['playerData']['respawnMarkerName']
73
+ end
74
+
75
+ if known_zone_idx
76
+ if overwrite
77
+ old_region, old_target = zonelist[known_zone_idx]['slug'].split('.')
78
+ zonedata[old_region].delete(old_target)
79
+ zonedata.delete(old_region) if zonedata[old_region].empty?
80
+ else
81
+ return zonelist[known_zone_idx]['slug']
82
+ end
83
+ end
84
+
85
+ zonedata[region] ||= {}
86
+ zonedata[region][target] = zone
87
+ zonedata[region] = zonedata[region].sort_by { |k, _v| k }.to_h
88
+ zonedata = zonedata.sort_by { |k, _v| k }.to_h
89
+
90
+ if shortcut
91
+ zonedata['_shortcuts'][shortcut] = "#{region}.#{target}"
92
+ end
93
+
94
+ File.write(File.join(Silkedit::LIBDIR, 'config', 'silksong', 'zones.yaml'), YAML.safe_dump(zonedata))
95
+ :success
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,13 @@
1
+ ---
2
+ savegame_directory:
3
+ hollow_knight:
4
+ macos: '~/Library/Application Support/unity.Team Cherry.Hollow Knight'
5
+ linux: '~/.config/unity3d/Team Cherry/Hollow Knight'
6
+ windows: '%UserProfile%\AppData\LocalLow\Team Cherry\Hollow Knight'
7
+ silksong:
8
+ macos: '~/Library/Application Support/unity.Team-Cherry.Silksong/%STEAMID%'
9
+ linux: '~/.config/unity3d/Team Cherry/Hollow Knight Silksong/%STEAMID%'
10
+ windows: '%USERPROFILE%/AppData/LocalLow/Team Cherry/Hollow Knight Silksong/%STEAMID%'
11
+ max_backups: 5
12
+ use_yaml: true
13
+ aes_key: 'UKu52ePUBwetZ9wNX88o54dnfKRu0T1l'
@@ -0,0 +1,6 @@
1
+ ---
2
+ editor_command: vi '%FILE%'
3
+ permasave_file_location:
4
+ macos: '~/.silkedit.yaml'
5
+ linux: '~/.silkedit.yaml'
6
+ windows: '%APPDATA%\silkedit\silkedit.yaml'