diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..97a5070 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin +resource.syso \ No newline at end of file diff --git a/.readme/preview.png b/.readme/preview.png new file mode 100644 index 0000000..7a40602 Binary files /dev/null and b/.readme/preview.png differ diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..12a59cb --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["golang.go"] +} diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..2ab560a --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,15 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Debug", + "type": "go", + "request": "launch", + "mode": "auto", + "program": "${workspaceFolder}" + } + ] +} \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..85096b0 --- /dev/null +++ b/Makefile @@ -0,0 +1,2 @@ +build: + go build -ldflags "-s -w" -o "bin/Ragnarok Buddy.exe" diff --git a/README.md b/README.md new file mode 100644 index 0000000..a67acf5 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +
Ragnarok desktop buddy
+ +#### Instructions +1. Download the latest release [here](https://github.com/gccruz93/ragnarok-buddy/releases). +2. Run the exe. +3. A cfg.ini file will appear, configure as you like. +4. Enjoy your new pets! +5. IMPORTANT: Right now, the only way to close is through the Task Manager! Sorry for the inconvenience! + +#### Features +- Available pets: Angeling, Baphomet Jr., Ghostring, Kobold Axe, Kobold Hammer, Kobold Mace, Lunatic, Poring, Smokie, Spore. More coming soon... +- Hover a pet for a moment to remove it. +- A new random pet will spawn until reaches the limit configured. + +#### Features on the way +- More pets, sounds, effects and "gamemodes". + +#### Preview + \ No newline at end of file diff --git a/TOOLS.md b/TOOLS.md new file mode 100644 index 0000000..6024883 --- /dev/null +++ b/TOOLS.md @@ -0,0 +1 @@ +https://ezgif.com/effects \ No newline at end of file diff --git a/assets.go b/assets.go new file mode 100644 index 0000000..227d395 --- /dev/null +++ b/assets.go @@ -0,0 +1,77 @@ +package main + +import ( + "bytes" + "desktop-buddy/assets" + "image" + "image/draw" + "image/gif" + "io" + "log" + + "github.com/hajimehoshi/ebiten/v2" + "github.com/hajimehoshi/ebiten/v2/audio/wav" +) + +var loadedGifs map[string][]*ebiten.Image +var loadedAudios map[string][]byte + +const sampleRate = 48000 + +func loadGif(name string) { + if _, ok := loadedGifs[name]; ok { + return + } + file, err := assets.Assets.ReadFile(name) + if err != nil { + log.Println("loadGif ERR: " + name) + return + } + loadedGif, _ := gif.DecodeAll(bytes.NewReader(file)) + loadedGifs[name] = splitAnimatedGIF(loadedGif) +} + +func loadAudio(name string) { + if _, ok := loadedAudios[name]; ok { + return + } + file, err := assets.Assets.ReadFile(name) + if err != nil { + log.Println("loadAudio ERR: " + name) + return + } + s, _ := wav.DecodeWithSampleRate(sampleRate, bytes.NewReader(file)) + b, _ := io.ReadAll(s) + loadedAudios[name] = b +} + +func splitAnimatedGIF(gif *gif.GIF) []*ebiten.Image { + var frames []*ebiten.Image + imgWidth, imgHeight := getGifDimensions(gif) + + for _, srcImg := range gif.Image { + frame := image.NewRGBA(image.Rect(0, 0, imgWidth, imgHeight)) + draw.Draw(frame, frame.Bounds(), srcImg, image.Point{}, draw.Over) + frames = append(frames, ebiten.NewImageFromImage(frame)) + } + + return frames +} +func getGifDimensions(gif *gif.GIF) (x, y int) { + var lowestX, lowestY, highestX, highestY int + for _, img := range gif.Image { + if img.Rect.Min.X < lowestX { + lowestX = img.Rect.Min.X + } + if img.Rect.Min.Y < lowestY { + lowestY = img.Rect.Min.Y + } + if img.Rect.Max.X > highestX { + highestX = img.Rect.Max.X + } + if img.Rect.Max.Y > highestY { + highestY = img.Rect.Max.Y + } + } + return highestX - lowestX, highestY - lowestY +} diff --git a/assets/assets.go b/assets/assets.go new file mode 100644 index 0000000..6399973 --- /dev/null +++ b/assets/assets.go @@ -0,0 +1,10 @@ +package assets + +import "embed" + +//go:embed cursors/* +//go:embed monster/* +//go:embed npc/* +//go:embed sound/* +//go:embed ba_frostjoke.txt +var Assets embed.FS diff --git a/assets/ba_frostjoke.txt b/assets/ba_frostjoke.txt new file mode 100644 index 0000000..a40af34 --- /dev/null +++ b/assets/ba_frostjoke.txt @@ -0,0 +1,118 @@ +A mãe do André, do Pierre e do Deniro... é a Maya??? +Ando muito estressado. Devem ser essa poções da fúria... +As Plantas Infernais dos Bioquímicos são atacadas por Moscas Infernais? +Au Au Au eu sou o carnissau!!! E sou mal!!! +Bafomé jr... por que não bafinho? Aposto que eles não escovam os dentes~ +Cautela e caldo de galinha não faz mal à ninguém... exceto à galinha! +Chon Chon? Mon Mon Fon Fon !!! +Chuva de meteor...**CORRE, CORRE, TÁ CAINDO!** +Coitado do Pé-Grande. Pegou um resfriado porque só anda descalço... +Combo Triplo vem com refrigerante e fritas? +Como o Mímico venceu o Espadachim? Dando o golpe do baú! +Como se chama um Andarilho com Aumentar Agilidade? Um Correrilho! +Desgraça pouca é bobagem... é bobagem! +Destino nas Cartas! ...Sorte! Saída livre da prisão! +Devagar se vai ao longe... mas demora um tempão! Prefiro usar um teleporte +Dois amigos passeando em Lutie quando um deles exclama: 'HATII!' e o amigo responde: 'Saúde!' +EU não TOCO RAUL!! +Esses Shuras são bipolares... uma hora estão Zen, outra estão em Fúria!! +Esses dias sonhei com um cavalo estranho, acho que foi um Pesadelo. +Esses dias vi um Sacerdote usar Lex Divina em uma planta e ela virou uma MUDA! +Estava pensando... Metaler é um Rocker que gosta de heavy metal? +Estou pedindo a um tempão e esse Arcebispo não me cura! Que ABsurdo! +Estão chovendo Porings e Lunáticos. E daí? +Eu sou tão popular! Até os monstros vêm a mim! +Falei pra você não tomar aquelas Poções da Recuperação, agora você tá quase repetindo de ano! +HADOUKEN! hummm ainda não.... +Hoje é festa lá no PvP! Pode aparecer! Vai ter briga até o amanhecer! +Há, miau miau! Pegadinha de Malangdo! +Ira de...Nossa...esse Thor deve estar MUITO bravo! +Leite acaba muito rápido... deviam vender o longa-vida! +Lá vem o Mestre Taekwon dizer que a culpa é das estrelas! +Magnus Exorcismusmusmusmusmusmus... +Me dá umas bananas! Irei enfrentar várias Cãibras! +Meninos, se continuarem com essa mania de chuva de flechas vão pegar um resfirado perigoso! +Meu prato predileto? Ora, um omelete com ovo de Andre +Morrer na WoE é igual a consórcio: quando menos espera é contemplado. +No PvP, todo dia é um 7x1 diferente. +não deixa o bardo morrer! Deixa o bardo tocar! O bardo toca o Bragi! Bragi pra gente spammar! +não gosto da Ilha das Tartarugas... lá tem muito Agressor... +não namore uma feiticeira! Quando o amor acaba, ela te desencanta e te tira tudo! +não sou Atroce, mas sou monstrão! BIRL!! +não! Barreira de Gelo não! Eu pedi em cubos! +O Peco Peco chama-se Peco Peco só porque faz Peco Peco? não entendi... +O Sapo de Roda não lava o pé. não lava porque não quer... Bom, ele também não mora na lagoa... +O oposto do Metaling é o Pagodeling? +O que não pode faltar nos livros de culinária? Gergeling! +O que o Guardião Real foi fazer no médico? Exame de Toque!! +O que o bongun disse pra Eggyra? Se você continuar de olho na Munak, te transformo em Magnolia!! +O que o morcego disse para o outro? "você me parece Familiar." +O que um Serial Killer foi fazer de manhã? Matar a fome. +O que um filhote do lobo do deserto falou para o outro???"au au" +Odaliscas....Homens são capazes de perder seus Emperiums por elas.... +Ohhh não, um esqueleto. Melhor chamar um super-herói! +Olha o churrasco!!! Solta Barrera de Fogo ae Bruxo! +Os Cavaleiros deviam chamar Pecoleiros, porque nenhum deles anda a cavalo! +Os carrinhos dos mercadores deveriam ser maiores para pegarmos uma carona +Os esporos são cogumelos azuis geneticamente alterados. +Ota, ota, ota, o meu forte é a rima!!! +Outro dia encontrei o Rocker. Até agora estou procurando o Pagoder e nada... +Ho, hi, hi, eu sou um super-herói!!! +Pelos poderes de Graysk... Oooops, acho que isso não vai funcionar +Picky são Peco Pecos subdesenvolvidos +Pirulito que bate-bate, pirulito que já bateu, pode não acreditar, mas quem te congelou fui eu! +Poeeeeeeeeiraaaaaa, Poeeeeeeeeiraaaaaaa levantou em Pronteraaaaa. +Por que a professora usou os óculos Vermelhos? Para vermelhor! Haha! +Por que o Anolian tirou o filhote da escola? Porque ele réptil de ano! +Por que os Mercenários conseguem procurar pedras? Por causa da Perícia em Katar! +Poring parece geléia de morango. Drops, de laranja. Qual será o sabor do Marin? +Poring.. Poporing.. o que em depois? Popopoporing?! +Porque a Abelha Rainha foi devorada? Porque ela pousou em uma Rosa Selvagem! +Porque o mercador atravessou a ponte de Aldebaran? Ora, pra chegar do outro lado +Po, porque ninguem mata Creamy? Ah, porque Creamy não compensa. +Quais os monstros mais radicais de Rune-Midgard? O Rocker e o Metaller! +Qual a diferença entre vocês e um picolé? O palito! +Qual o monstro que tem problema de hipertensão? o SALgueiro! +Qual é o mais calmos dos orcs? O Zen-orc !! +Que calor! Quem abriu esses Portões do Inferno? +Quero vê-la Sohee quero vê-la mobá quero vê o seu Choko dançar sem parar +Rajada Congelante !! Opa, não posso usar isso... mas funcionou! +Sabe o que a Alice faz quando está com cabelo embaraçado? Aliza. +Sabe o que o Aprendiz rebelde foi fazer no Vulcão de Thor? Fugir de Kasa! +Sabe o que o aprendiz disse por Bafomé? Nada... não deu tempo!!! +Sabe o tipo sanguíneo dos Arcebispos? AB! +Sabe porque a Dona Risadinha vive rindo? Acho que ela também não... +Sabe porque os bruxos gostam de congelar os outros? Porque eles são pé frio. +Sabe porque os lunáticos têm este nome? Porque eles vieram da Lua! +Sabe qual a lingua dos Poring? Por�s. E dos Poporings? Popor�s! +Sabe qual foi a maior cria��o dos anf�bios? O Sapo de Roda!!! +Sabe qual o �nico monstro que nunca perde o hor�rio? Oras, o Alarme !!!! +Sabe qual programa de com�dia mais famoso de Rune Midgard? Eremes e Venatu! +Sabe qual � a flor favorita da Senhora Orc? A orc-�dea! +Sabe qual � a musa dos Porings ? Jennifer Jeloppis +Sapo de Roda~~~Roda~Roda~Roda~P�~P�~Sapo não � peixe~Carangejo peixe �~~ +Se Alberta não tivesse sa�da para o mar ela se chamaria Felchada? +Se Poring Noel � o monstro do natal, o da p�scoa com certeza seria o Poring Pascoalino!!! +Se o filhote de lobo do deserto fosse filho do Garm, ele nasceria com resfriado. +Se o rei fosse feliz e não triste ele se chamaria Felizlan III? +Se um Arcano usar Cometa e atingir um Cavaleiro R�nico, o Drag�o dele vira f�ssil? +Se você usar ressuscitar em um Megalodon ele vira uma Fen? +Ser� que as Kafras s�o clones? Todas elas tem a mesma cara? +Ser� que o irm�o mais velho dos Yo-yos � aquele gorila grande do cinema? +Ser� que o rei chama-se Tristan III porque ele � triplamente triste? +Ser� que os Drops s�o refrescantes? +Ser� que os Justiceiros j� foram presos? Porque eles t�m rea��o em cadeia! +Ser� que os Lun�ticos t�m este nome porque eles vieram da Lua? +Sopro de Terra! Fogo! Vento! Gelo! Cora��o! Eu sou o Capit�o R�nico! +Sou forte. Tiro 100 do Rocker!!!11! +TEM UM CONGELADO AQUI DO MEU LADO! +Tempestade, Temporal, Chuva de Flechas... gostam mesmo de um clima ruim hein, arqueiros? +Trov�o de Jup�ter.. � 110 ou 220v? +T� curando de gra�a !!! Brincadeira, eu sou um Bardo não um Novi�o, +Um KS incomoda muita gente. Dois KSs incomodam, incomodam muito mais... +Um poring por dia d� sa�de e energia! +Um tronco est�ril � aquele que não pode ter filhos. +Vida de Trovador não � f�cil, ter que andar na �rea do Temporal � um risco pra sa�de! +você quer moleza ent�o senta no Poring. +Vou pra Arunafeltz! Tu Veins comigo? +Vou te ensinar a fazer ovo frito... pegue o ovo, jogue na panela, Ifrit! \ No newline at end of file diff --git a/assets/cursors/cursor_attack.bmp b/assets/cursors/cursor_attack.bmp new file mode 100644 index 0000000..fa90b31 Binary files /dev/null and b/assets/cursors/cursor_attack.bmp differ diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100644 index 0000000..782dc7b Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/icon.jpg b/assets/icon.jpg new file mode 100644 index 0000000..06f3446 Binary files /dev/null and b/assets/icon.jpg differ diff --git a/assets/monster/angeling_idle_left.gif b/assets/monster/angeling_idle_left.gif new file mode 100644 index 0000000..c4b7f2f Binary files /dev/null and b/assets/monster/angeling_idle_left.gif differ diff --git a/assets/monster/angeling_idle_right.gif b/assets/monster/angeling_idle_right.gif new file mode 100644 index 0000000..fce422e Binary files /dev/null and b/assets/monster/angeling_idle_right.gif differ diff --git a/assets/monster/angeling_walk_left.gif b/assets/monster/angeling_walk_left.gif new file mode 100644 index 0000000..5f20ef3 Binary files /dev/null and b/assets/monster/angeling_walk_left.gif differ diff --git a/assets/monster/angeling_walk_right.gif b/assets/monster/angeling_walk_right.gif new file mode 100644 index 0000000..c11f541 Binary files /dev/null and b/assets/monster/angeling_walk_right.gif differ diff --git a/assets/monster/baphometjr_idle_left.gif b/assets/monster/baphometjr_idle_left.gif new file mode 100644 index 0000000..9626048 Binary files /dev/null and b/assets/monster/baphometjr_idle_left.gif differ diff --git a/assets/monster/baphometjr_idle_right.gif b/assets/monster/baphometjr_idle_right.gif new file mode 100644 index 0000000..d225667 Binary files /dev/null and b/assets/monster/baphometjr_idle_right.gif differ diff --git a/assets/monster/baphometjr_walk_left.gif b/assets/monster/baphometjr_walk_left.gif new file mode 100644 index 0000000..4c830f6 Binary files /dev/null and b/assets/monster/baphometjr_walk_left.gif differ diff --git a/assets/monster/baphometjr_walk_right.gif b/assets/monster/baphometjr_walk_right.gif new file mode 100644 index 0000000..7520ce6 Binary files /dev/null and b/assets/monster/baphometjr_walk_right.gif differ diff --git a/assets/monster/ghostring_idle_left.gif b/assets/monster/ghostring_idle_left.gif new file mode 100644 index 0000000..40f9348 Binary files /dev/null and b/assets/monster/ghostring_idle_left.gif differ diff --git a/assets/monster/ghostring_idle_right.gif b/assets/monster/ghostring_idle_right.gif new file mode 100644 index 0000000..b1f552b Binary files /dev/null and b/assets/monster/ghostring_idle_right.gif differ diff --git a/assets/monster/ghostring_walk_left.gif b/assets/monster/ghostring_walk_left.gif new file mode 100644 index 0000000..40f9348 Binary files /dev/null and b/assets/monster/ghostring_walk_left.gif differ diff --git a/assets/monster/ghostring_walk_right.gif b/assets/monster/ghostring_walk_right.gif new file mode 100644 index 0000000..b1f552b Binary files /dev/null and b/assets/monster/ghostring_walk_right.gif differ diff --git a/assets/monster/kobold_axe_idle_left.gif b/assets/monster/kobold_axe_idle_left.gif new file mode 100644 index 0000000..a9a66be Binary files /dev/null and b/assets/monster/kobold_axe_idle_left.gif differ diff --git a/assets/monster/kobold_axe_idle_right.gif b/assets/monster/kobold_axe_idle_right.gif new file mode 100644 index 0000000..ff37529 Binary files /dev/null and b/assets/monster/kobold_axe_idle_right.gif differ diff --git a/assets/monster/kobold_axe_walk_left.gif b/assets/monster/kobold_axe_walk_left.gif new file mode 100644 index 0000000..3e484e4 Binary files /dev/null and b/assets/monster/kobold_axe_walk_left.gif differ diff --git a/assets/monster/kobold_axe_walk_right.gif b/assets/monster/kobold_axe_walk_right.gif new file mode 100644 index 0000000..5479728 Binary files /dev/null and b/assets/monster/kobold_axe_walk_right.gif differ diff --git a/assets/monster/kobold_hammer_idle_left.gif b/assets/monster/kobold_hammer_idle_left.gif new file mode 100644 index 0000000..fc86bf8 Binary files /dev/null and b/assets/monster/kobold_hammer_idle_left.gif differ diff --git a/assets/monster/kobold_hammer_idle_right.gif b/assets/monster/kobold_hammer_idle_right.gif new file mode 100644 index 0000000..dfc56ac Binary files /dev/null and b/assets/monster/kobold_hammer_idle_right.gif differ diff --git a/assets/monster/kobold_hammer_walk_left.gif b/assets/monster/kobold_hammer_walk_left.gif new file mode 100644 index 0000000..86a9b32 Binary files /dev/null and b/assets/monster/kobold_hammer_walk_left.gif differ diff --git a/assets/monster/kobold_hammer_walk_right.gif b/assets/monster/kobold_hammer_walk_right.gif new file mode 100644 index 0000000..022b7ea Binary files /dev/null and b/assets/monster/kobold_hammer_walk_right.gif differ diff --git a/assets/monster/kobold_mace_idle_left.gif b/assets/monster/kobold_mace_idle_left.gif new file mode 100644 index 0000000..842a2da Binary files /dev/null and b/assets/monster/kobold_mace_idle_left.gif differ diff --git a/assets/monster/kobold_mace_idle_right.gif b/assets/monster/kobold_mace_idle_right.gif new file mode 100644 index 0000000..3c03e28 Binary files /dev/null and b/assets/monster/kobold_mace_idle_right.gif differ diff --git a/assets/monster/kobold_mace_walk_left.gif b/assets/monster/kobold_mace_walk_left.gif new file mode 100644 index 0000000..7d1db52 Binary files /dev/null and b/assets/monster/kobold_mace_walk_left.gif differ diff --git a/assets/monster/kobold_mace_walk_right.gif b/assets/monster/kobold_mace_walk_right.gif new file mode 100644 index 0000000..4217ec1 Binary files /dev/null and b/assets/monster/kobold_mace_walk_right.gif differ diff --git a/assets/monster/lunatic_idle_left.gif b/assets/monster/lunatic_idle_left.gif new file mode 100644 index 0000000..ec746fb Binary files /dev/null and b/assets/monster/lunatic_idle_left.gif differ diff --git a/assets/monster/lunatic_idle_right.gif b/assets/monster/lunatic_idle_right.gif new file mode 100644 index 0000000..4d701b8 Binary files /dev/null and b/assets/monster/lunatic_idle_right.gif differ diff --git a/assets/monster/lunatic_walk_left.gif b/assets/monster/lunatic_walk_left.gif new file mode 100644 index 0000000..dcdb0b6 Binary files /dev/null and b/assets/monster/lunatic_walk_left.gif differ diff --git a/assets/monster/lunatic_walk_right.gif b/assets/monster/lunatic_walk_right.gif new file mode 100644 index 0000000..01c58d2 Binary files /dev/null and b/assets/monster/lunatic_walk_right.gif differ diff --git a/assets/monster/poring_idle_left.gif b/assets/monster/poring_idle_left.gif new file mode 100644 index 0000000..4146858 Binary files /dev/null and b/assets/monster/poring_idle_left.gif differ diff --git a/assets/monster/poring_idle_right.gif b/assets/monster/poring_idle_right.gif new file mode 100644 index 0000000..dc10981 Binary files /dev/null and b/assets/monster/poring_idle_right.gif differ diff --git a/assets/monster/poring_walk_left.gif b/assets/monster/poring_walk_left.gif new file mode 100644 index 0000000..d819f70 Binary files /dev/null and b/assets/monster/poring_walk_left.gif differ diff --git a/assets/monster/poring_walk_right.gif b/assets/monster/poring_walk_right.gif new file mode 100644 index 0000000..502da30 Binary files /dev/null and b/assets/monster/poring_walk_right.gif differ diff --git a/assets/monster/smokie_idle_left.gif b/assets/monster/smokie_idle_left.gif new file mode 100644 index 0000000..60680c0 Binary files /dev/null and b/assets/monster/smokie_idle_left.gif differ diff --git a/assets/monster/smokie_idle_right.gif b/assets/monster/smokie_idle_right.gif new file mode 100644 index 0000000..7df2763 Binary files /dev/null and b/assets/monster/smokie_idle_right.gif differ diff --git a/assets/monster/smokie_walk_left.gif b/assets/monster/smokie_walk_left.gif new file mode 100644 index 0000000..6144abf Binary files /dev/null and b/assets/monster/smokie_walk_left.gif differ diff --git a/assets/monster/smokie_walk_right.gif b/assets/monster/smokie_walk_right.gif new file mode 100644 index 0000000..5a1dfa7 Binary files /dev/null and b/assets/monster/smokie_walk_right.gif differ diff --git a/assets/monster/spore_idle_left.gif b/assets/monster/spore_idle_left.gif new file mode 100644 index 0000000..98dc06e Binary files /dev/null and b/assets/monster/spore_idle_left.gif differ diff --git a/assets/monster/spore_idle_right.gif b/assets/monster/spore_idle_right.gif new file mode 100644 index 0000000..db918bf Binary files /dev/null and b/assets/monster/spore_idle_right.gif differ diff --git a/assets/monster/spore_walk_left.gif b/assets/monster/spore_walk_left.gif new file mode 100644 index 0000000..1867a98 Binary files /dev/null and b/assets/monster/spore_walk_left.gif differ diff --git a/assets/monster/spore_walk_right.gif b/assets/monster/spore_walk_right.gif new file mode 100644 index 0000000..2ae6089 Binary files /dev/null and b/assets/monster/spore_walk_right.gif differ diff --git a/assets/npc/kafra_left.gif b/assets/npc/kafra_left.gif new file mode 100644 index 0000000..80c28f6 Binary files /dev/null and b/assets/npc/kafra_left.gif differ diff --git a/assets/sound/_hit_sword.wav b/assets/sound/_hit_sword.wav new file mode 100644 index 0000000..fcb1f2c Binary files /dev/null and b/assets/sound/_hit_sword.wav differ diff --git a/assets/sound/baphometjr_idle.wav b/assets/sound/baphometjr_idle.wav new file mode 100644 index 0000000..468fe97 Binary files /dev/null and b/assets/sound/baphometjr_idle.wav differ diff --git a/assets/sound/poring_attack.wav b/assets/sound/poring_attack.wav new file mode 100644 index 0000000..99ed67f Binary files /dev/null and b/assets/sound/poring_attack.wav differ diff --git a/assets/sound/poring_damage.wav b/assets/sound/poring_damage.wav new file mode 100644 index 0000000..7ca0215 Binary files /dev/null and b/assets/sound/poring_damage.wav differ diff --git a/assets/sound/poring_die.wav b/assets/sound/poring_die.wav new file mode 100644 index 0000000..d0dfc42 Binary files /dev/null and b/assets/sound/poring_die.wav differ diff --git a/assets/sound/poring_move.wav b/assets/sound/poring_move.wav new file mode 100644 index 0000000..0786fe3 Binary files /dev/null and b/assets/sound/poring_move.wav differ diff --git a/cfg.go b/cfg.go new file mode 100644 index 0000000..029acd1 --- /dev/null +++ b/cfg.go @@ -0,0 +1,54 @@ +package main + +import ( + "fmt" + "os" + + "gopkg.in/ini.v1" +) + +type Cfg struct { + MainVolume float64 `ini:"main_volume" json:"main_volume"` + Max int `ini:"max" json:"max"` +} + +func (c *Cfg) Load() { + ini.PrettyFormat = false + cfg, err := ini.Load("cfg.ini") + + if err != nil { + cfg = ini.Empty() + c.LoadDefaults() + _ = cfg.ReflectFrom(c) + _ = cfg.SaveTo("cfg.ini") + } + + err = cfg.MapTo(&c) + if err != nil { + fmt.Printf("Fail to map file: %v", err) + os.Exit(1) + } + + if c.MainVolume < 0 { + c.MainVolume = 0 + } else if c.MainVolume > 1 { + c.MainVolume = 1 + } +} + +func (c *Cfg) Save() { + _ = os.Remove("cfg.bkp.ini") + _ = os.Rename("cfg.ini", "cfg.bkp.ini") + cfg := ini.Empty() + _ = cfg.ReflectFrom(c) + err := cfg.SaveTo("cfg.ini") + if err != nil { + fmt.Printf("Fail to save file: %v", err) + os.Exit(1) + } +} + +func (c *Cfg) LoadDefaults() { + c.MainVolume = 0.5 + c.Max = 10 +} diff --git a/cfg.ini b/cfg.ini new file mode 100644 index 0000000..ed9a9cd --- /dev/null +++ b/cfg.ini @@ -0,0 +1,2 @@ +main_volume=0.5 +max=5 diff --git a/ecs.go b/ecs.go new file mode 100644 index 0000000..987ac59 --- /dev/null +++ b/ecs.go @@ -0,0 +1,61 @@ +package main + +import ( + "github.com/hajimehoshi/ebiten/v2" +) + +type Entity struct { + x, y, vx, vy float64 + height, width int + frameIndex, frameSpeed, frameAudio, frameLength int + gif string + audio string + alpha float32 +} + +func (e *Entity) Update() { + e.y = float64(screenHeight - e.height) + e.y += e.vy + + if frameCount%e.frameSpeed == 0 { + e.frameIndex = (e.frameIndex + 1) % e.frameLength + + if e.frameIndex == e.frameAudio && e.audio != "" && cfg.MainVolume > 0 { + p := audioContext.NewPlayerFromBytes(loadedAudios[e.audio]) + p.SetVolume(cfg.MainVolume) + p.Play() + } + } + + if e.alpha != 1 { + e.alpha += 0.01 + if e.alpha >= 1 { + e.alpha = 1 + } + } +} + +func (e *Entity) Draw(screen *ebiten.Image) { + op := &ebiten.DrawImageOptions{} + op.ColorScale.ScaleAlpha(e.alpha) + op.GeoM.Translate(e.x, e.y) + screen.DrawImage(loadedGifs[e.gif][e.frameIndex], op) +} + +func (e *Entity) SetGif(path string, speed int) { + loadGif(path) + e.gif = path + e.width = loadedGifs[e.gif][0].Bounds().Dx() + e.height = loadedGifs[e.gif][0].Bounds().Dy() + e.frameLength = len(loadedGifs[e.gif]) + e.frameSpeed = speed + e.frameIndex = 0 +} + +func (e *Entity) SetAudio(path string, frame int) { + if path != "" { + loadAudio(path) + } + e.audio = path + e.frameAudio = frame +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..2b96791 --- /dev/null +++ b/go.mod @@ -0,0 +1,20 @@ +module desktop-buddy + +go 1.22.1 + +require github.com/hajimehoshi/ebiten/v2 v2.6.7 + +require github.com/stretchr/testify v1.9.0 // indirect + +require ( + github.com/ebitengine/oto/v3 v3.1.1 // indirect + github.com/ebitengine/purego v0.6.1 // indirect + github.com/jezek/xgb v1.1.1 // indirect + golang.org/x/exp/shiny v0.0.0-20240318143956-a85f2c67cd81 // indirect + golang.org/x/image v0.15.0 + golang.org/x/mobile v0.0.0-20240320162201-c76e57eead38 // indirect + golang.org/x/sync v0.6.0 // indirect + golang.org/x/sys v0.18.0 // indirect + golang.org/x/text v0.14.0 // indirect + gopkg.in/ini.v1 v1.67.0 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..737e4aa --- /dev/null +++ b/go.sum @@ -0,0 +1,32 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/ebitengine/oto/v3 v3.1.1 h1:utFNkSF4yXqA7VhMg7oHp3OSdz3vuzJQ42rCDnd8pc8= +github.com/ebitengine/oto/v3 v3.1.1/go.mod h1:bQM4zk9glIVjTynn8X0Lp1zngTlZltFFfzJvx543vdA= +github.com/ebitengine/purego v0.6.1 h1:sjN8rfzbhXQ59/pE+wInswbU9aMDHiwlup4p/a07Mkg= +github.com/ebitengine/purego v0.6.1/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ= +github.com/hajimehoshi/bitmapfont/v3 v3.0.0 h1:r2+6gYK38nfztS/et50gHAswb9hXgxXECYgE8Nczmi4= +github.com/hajimehoshi/bitmapfont/v3 v3.0.0/go.mod h1:+CxxG+uMmgU4mI2poq944i3uZ6UYFfAkj9V6WqmuvZA= +github.com/hajimehoshi/ebiten/v2 v2.6.7 h1:rxlMxu487wZN/JteykmuGdO1qotOolL8vJDU85lPh7A= +github.com/hajimehoshi/ebiten/v2 v2.6.7/go.mod h1:gKgQI26zfoSb6j5QbrEz2L6nuHMbAYwrsXa5qsGrQKo= +github.com/jezek/xgb v1.1.1 h1:bE/r8ZZtSv7l9gk6nU0mYx51aXrvnyb44892TwSaqS4= +github.com/jezek/xgb v1.1.1/go.mod h1:nrhwO0FX/enq75I7Y7G8iN1ubpSGZEiA3v9e9GyRFlk= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/exp/shiny v0.0.0-20240318143956-a85f2c67cd81 h1:JfOcDr8A3W1l+tHaR4QMCL3w6UHsfRRr2845M1TQwX4= +golang.org/x/exp/shiny v0.0.0-20240318143956-a85f2c67cd81/go.mod h1:3F+MieQB7dRYLTmnncoFbb1crS5lfQoTfDgQy6K4N0o= +golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8= +golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/mobile v0.0.0-20240320162201-c76e57eead38 h1:Pje51YXhl8Griu25k5zJBD48T4C0qA7YUd5myQfnFLo= +golang.org/x/mobile v0.0.0-20240320162201-c76e57eead38/go.mod h1:DN+F2TpepQEh5goqWnM3gopfFakSWM8OmHiz0rPRjT4= +golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ= +golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= +gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go new file mode 100644 index 0000000..c19cc94 --- /dev/null +++ b/main.go @@ -0,0 +1,120 @@ +/* +Copyright © 2024