Skip to content

Commit

Permalink
init
Browse files Browse the repository at this point in the history
  • Loading branch information
gccruz93 committed Mar 25, 2024
0 parents commit b9822c8
Show file tree
Hide file tree
Showing 69 changed files with 909 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
bin
resource.syso
Binary file added .readme/preview.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
3 changes: 3 additions & 0 deletions .vscode/extensions.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"recommendations": ["golang.go"]
}
15 changes: 15 additions & 0 deletions .vscode/launch.json
Original file line number Diff line number Diff line change
@@ -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}"
}
]
}
2 changes: 2 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
build:
go build -ldflags "-s -w" -o "bin/Ragnarok Buddy.exe"
19 changes: 19 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
<p align="center"><b>Ragnarok desktop buddy</b></p>

#### 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
<p align="center"><img alt="" src=".readme/preview.png"></p>
1 change: 1 addition & 0 deletions TOOLS.md
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
https://ezgif.com/effects
77 changes: 77 additions & 0 deletions assets.go
Original file line number Diff line number Diff line change
@@ -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
}
10 changes: 10 additions & 0 deletions assets/assets.go
Original file line number Diff line number Diff line change
@@ -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
118 changes: 118 additions & 0 deletions assets/ba_frostjoke.txt
Original file line number Diff line number Diff line change
@@ -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!
Binary file added assets/cursors/cursor_attack.bmp
Binary file not shown.
Binary file added assets/favicon.ico
Binary file not shown.
Binary file added assets/icon.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/angeling_idle_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/angeling_idle_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/angeling_walk_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/angeling_walk_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/baphometjr_idle_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/baphometjr_idle_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/baphometjr_walk_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/baphometjr_walk_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/ghostring_idle_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/ghostring_idle_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/ghostring_walk_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/ghostring_walk_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_axe_idle_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_axe_idle_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_axe_walk_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_axe_walk_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_hammer_idle_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_hammer_idle_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_hammer_walk_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_hammer_walk_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_mace_idle_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_mace_idle_right.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_mace_walk_left.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/monster/kobold_mace_walk_right.gif
Binary file added assets/monster/lunatic_idle_left.gif
Binary file added assets/monster/lunatic_idle_right.gif
Binary file added assets/monster/lunatic_walk_left.gif
Binary file added assets/monster/lunatic_walk_right.gif
Binary file added assets/monster/poring_idle_left.gif
Binary file added assets/monster/poring_idle_right.gif
Binary file added assets/monster/poring_walk_left.gif
Binary file added assets/monster/poring_walk_right.gif
Binary file added assets/monster/smokie_idle_left.gif
Binary file added assets/monster/smokie_idle_right.gif
Binary file added assets/monster/smokie_walk_left.gif
Binary file added assets/monster/smokie_walk_right.gif
Binary file added assets/monster/spore_idle_left.gif
Binary file added assets/monster/spore_idle_right.gif
Binary file added assets/monster/spore_walk_left.gif
Binary file added assets/monster/spore_walk_right.gif
Binary file added assets/npc/kafra_left.gif
Binary file added assets/sound/_hit_sword.wav
Binary file not shown.
Binary file added assets/sound/baphometjr_idle.wav
Binary file not shown.
Binary file added assets/sound/poring_attack.wav
Binary file not shown.
Binary file added assets/sound/poring_damage.wav
Binary file not shown.
Binary file added assets/sound/poring_die.wav
Binary file not shown.
Binary file added assets/sound/poring_move.wav
Binary file not shown.
54 changes: 54 additions & 0 deletions cfg.go
Original file line number Diff line number Diff line change
@@ -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
}
2 changes: 2 additions & 0 deletions cfg.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
main_volume=0.5
max=5
61 changes: 61 additions & 0 deletions ecs.go
Original file line number Diff line number Diff line change
@@ -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
}
Loading

0 comments on commit b9822c8

Please sign in to comment.