[Engine/Tutorial] Game Patching 1.3

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Engine/Tutorial] Game Patching 1.3

Mensagem por Gonçalves em Qua 17 Abr 2013, 03:23

INTRODUÇÃO
Olá. Vou mostrá-los por meio desse tutorial como criar um sistema de patching para jogos/softwares em geral. Para isso usaremos uma engine criada por mim, com o auxílio de 2 extensões e uma dll.

No arquivo que disponibilizarei abaixo, se encontra duas engines diferentes: Um arquivo e Vários arquivos. A primeira é um pouco mais fácil de fazer, porquê basta substituir o .exe do jogo (nesse exemplo usamos apenas uma extensão). A segunda é para jogos com mais de um arquivo, como por exemplo jogos com recursos externos. Nesse caso precisamos de duas extensões e uma dll.

No exemplo de um arquivo, usamos a extensão de download para puxar da internet informações sobre a versão mais nova, e para baixar a versão atualizado. No segundo exemplo usamos, além da de download, a extensão e dll para extrair arquivos de uma pasta .zip.


DOWNLOADS
  • Engine: https://dl.dropboxusercontent.com/u/89134981/GAP%20%20v1.3.rar
  • Extensão p/ download: http://gmc.yoyogames.com/index.php?showtopic=509556
  • Extensão/Dll p/ extração: http://gmc.yoyogames.com/index.php?showtopic=512333

As extensões e a dll se encontram junto com a engine já, mas caso queira saber mais informações visite os links.


ANTES DE COMEÇAR
Antes de começar a mexer na engine, crie uma conta no dropbox.com, site de armazenamento de arquivos. Não é obrigatório mas recomendo deixar todos os arquivos que utilizaremos para atualizar jogos na pasta Public do dropbox.

Agora acesse esse link: https://write-box.appspot.com/ e anexe a ferramenta à sua conta dropbox. Esse será nosso editor de texto, e com ele poderemos editar nosso "servidor" online sem muitos esforços.


"SERVIDOR" POR .INI
Utilizando a extensão de download, iremos puxar informação do nosso "servidor", e assim saberemos qual a versão mais atual do software, e o link para download.

Nossa .ini conterá:

Código:
[update]
major=Versão major atual
minor=Versão minor atual
release=Release atual
build=Build atual
link=Link da versão atual

Essa .ini deve estar no nosso dropbox e será ajustado constantemente, sempre que um nova versão do software for lançada. Dela, o jogo irá extrair informação para saber se está atualizado ou não, e de onde deve baixar a mais atual versão. O meu se encontra assim:

Código:
[update]
major=2
minor=0
release=0
build=0
link=http://dl.dropboxusercontent.com/u/89134981/Game-Patch/Jogo%20V2.rar

Como a versão da gmk é 1.0.0.0, o jogo sugere que você faça a atualização.


A ENGINE
Rode a engine para ver como tudo funciona na prática. Quase 100% dos códigos estão comentados, então é bem fácil entender e modificar. O jogo (a room principal) em si dizendo a versão que está. Imagem:


Ao clicar na tela, vamos à room_upcheck (onde será checado se há novas atualizações). Nela, a .ini é baixada do meu Dropbox. Imagem:


O número da versão será puxada de nossa ini, que no caso é 2 (que seria a versão mais atual). A versão do meu jogo é a 1. Nisso vamos à tela room_updown. Nessa room o jogo irá pegar a string da key link (link da versão mais nova) e irá baixar. Imagem:


Após baixar, a engine irá jogar o conteúdo baixado na pasta do jogo, substituindo os iguais. Logo depois o jogo é fechado e automaticamente a nova versão é aberta.


ATUALIZANDO O "SERVIDOR"
Agora, suponhamos que uma versão foi lançada (a 2.0), e iremos lançar a 2.1. O que fazemos? Vamos no editor de textos do dropbox e editamos nossa .ini, com o novo número de versão mais atual e link novo. Exemplo:

Código:
major=2
minor=1
release=0
build=0
link=http://dl.dropboxusercontent.com/u/89134981/Game-Patch/Jogo%20V2.1.rar

Basta clicar em Sync ao terminar. Pronto, o "servidor" já está atualizado.


PEGANDO LINKS
Para pegar os links para usar na engine, é bem simples. Clique o com o botão direito no arquivo > Copiar link público. O link estará assim:

https://dl.dr...

Devemos tirar o s de https para que funcione (creio que s seja uma criptografia de segurança). Ficando assim:

http://dl.dr...

Isso vale para todos os links envolvidos.


SCRIPTS
Criei alguns scripts para facilitar a vida do programador. São eles:

O version_set define a versão, com major, minor, release e build.

O version_get retorna uma string com a versão do programa.

O version_uptodate retorna true se estiver atualizado, e false se não estiver.

O download_init substitui aquele monte de códigos no Create dos objetos que criam downloads, com ele só precisa usar um argumento.

O download_create substitui algumas linhas de código de quando o download acaba. Basta pôr nos argumentos o nome que o arquivo baixado terá.

O version_getnewer retorna uma string com o número da versão mais nova, com isso você poderá obter e utilizar esse valor com mais facilidade.

O filesize_named pega um valor em kbytes e passa pra megabytes ou gigabytes se necessário, e já adiciona após o valor. Retorna uma string.

CRÉDITOS
  • A mim, criador da engine e tutorial
  • À GMBR, por ceder o espaço
  • A Maarten Baert, criador da extensão de download
  • A Adventus, criador da extensão de extração de pasta zip


flw Obrigado pela atenção, até mais! flw


Última edição por Gonçalves em Sex 19 Abr 2013, 04:24, editado 6 vez(es)

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por MagnetBomber em Qua 17 Abr 2013, 18:50

é normal demorar para buscar?
e qual nome eu ponho na ini?

MagnetBomber

Ranking : Nota C
Número de Mensagens : 206
Idade : 15
Data de inscrição : 07/04/2013
Notas recebidas : C
Reputação : 9
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Gonçalves em Qua 17 Abr 2013, 20:49

Se o link de download estiver errado (ou não for direto) dará problema e a engine não irá funcionar corretamente.

A ini baixada pela engine é update.ini, mas você pode mudar se quiser.

Para ter certeza de que botou o link de download certo, pegue o link aqui:


Na minha net de 4mb não demora mais de 3 segundos para buscar.

Até mais!

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por MagnetBomber em Qua 17 Abr 2013, 21:06

agora foi!

MagnetBomber

Ranking : Nota C
Número de Mensagens : 206
Idade : 15
Data de inscrição : 07/04/2013
Notas recebidas : C
Reputação : 9
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por The Wizard em Qua 17 Abr 2013, 21:45

Ótimo tutorial/engine Gonçalves, não sabia dessa possibilidade, é uma pena que só funciona no Mediafire, poucas pessoas usam ele, porém me ajudará bastante, e irá ajudar muitos aqui no fórum, até mais Gon =)

off-topic:
Gon SERIAL precisa de uma fonte para funcionar... pelo o que vi você só baixou o jogo, o download da fonte está disponível nesse link

The Wizard

Ranking : Nota B
Número de Mensagens : 1129
Idade : 18
Data de inscrição : 24/03/2010
Notas recebidas : B
Reputação : 17
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 1

http://awesomewizards.deviantart.com/

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Supersonic822 em Qua 17 Abr 2013, 21:50

O grande problema do mediafire é que vc não pode fazer atualizações em seus arquivos facilmente. Mas tirando isso, bom tutorial.

Supersonic822

Número de Mensagens : 19
Data de inscrição : 12/03/2013
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Gonçalves em Qua 17 Abr 2013, 21:55

@MagnetBomber:

Que bom. Espero que seja útil!

@The Wizard:

É uma pena mesmo, mas o fato de outros servidores não terem essa função Update, faz com que você perca o link da ini sempre que atualizasse, aí bugaria tudo.

No Mediafire tem um função chamada Edit, que possibilita editar o arquivo, ao invés de usar o Update. Infelizmente o link muda, aí complica. Se eu descobrir uma forma de editar sem mudar o link, seria perfeito! sorrindo2

@Supersonic822:

E aí, cara? Você conhece algum que facilite a atualização de arquivos ou até mesmo edição direto do site que mantenha o link? Seria perfeito pro tutorial.

Vou melhorar a engine em si e deixar mais status de download ali pra ficar mais legal (tamanho do download, kb's já baixados, e se conseguir bolarei um sistema de tempo estimado também se possível, rs). E com mais comentários também.

Até mais!

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Miyamoto em Qua 17 Abr 2013, 22:03

Muito bom, mas da pra deixar a(s) versão(ões) antigas para download? E quanto a jogar com uma versão antiga, é possivel, mesmo sendo um jogo online?

Miyamoto

Número de Mensagens : 11
Data de inscrição : 09/04/2013
Reputação : 0
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Gonçalves em Qua 17 Abr 2013, 22:08

@Miyamoto:

Obrigado! Então cara, em jogos online normalmente é obrigatória a atualização (até porquê tem adição de itens, quests, etc.). Pra falar a verdade não conheço bem como funcionam as engines de GM Online, mas creio que precise sim.

No caso por exemplo de um software, isso seria opcional, mas em jogos de interação entre jogadores, creio que não seja possível.

Você pode deixar as versões antigas pra download, mas isso não vai atualizar seu jogo!

Até mais!

Edit: Na engine tem uns scripts, percebi agora. NENHUM deles é necessário, podem apagar!

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Supersonic822 em Qua 17 Abr 2013, 22:35

Gonçalves escreveu:@MagnetBomber:

Que bom. Espero que seja útil!

@The Wizard:

É uma pena mesmo, mas o fato de outros servidores não terem essa função Update, faz com que você perca o link da ini sempre que atualizasse, aí bugaria tudo.

No Mediafire tem um função chamada Edit, que possibilita editar o arquivo, ao invés de usar o Update. Infelizmente o link muda, aí complica. Se eu descobrir uma forma de editar sem mudar o link, seria perfeito! sorrindo2

@Supersonic822:

E aí, cara? Você conhece algum que facilite a atualização de arquivos ou até mesmo edição direto do site que mantenha o link? Seria perfeito pro tutorial.

Vou melhorar a engine em si e deixar mais status de download ali pra ficar mais legal (tamanho do download, kb's já baixados, e se conseguir bolarei um sistema de tempo estimado também se possível, rs). E com mais comentários também.

Até mais!
Tem outro jeito: usar o gex GMLibrary do Jiraya (pesquisa aqui no fórum). Ele pode baixar do dropbox também, mas não dá pra calcular se o download já acabou etc...
Eu tentei fazer isso com o gex:

Create:
Código:

using("system.h");
step1=0
download=web_create_download("http://dl.dropbox.com/u/14720376/updater.ini","updater.temp");
web_start_download(download);
file_state =0
alarm[0]=room_speed*5
Alarm 0 (room11 era o menu do meu jogo):

Código:

if file_exists("updater.temp") {ini_open("updater.temp")
global.webversion=ini_read_real("Updater","Version",1)
global.fname=ini_read_string("Updater","Fname","fail.temp")
global.updateurl=ini_read_string("Updater","Url","http://dl.dropbox.com/u/14720376/willpackHD.zip")
if global.updatelocalversion=global.webversion{room_goto(room11)}
if global.updatelocalversion<global.webversion {
file_state=1
}
if global.updatelocalversion>global.webversion{room_goto(room11)}}
else {file_state=3}

Key press Y:
Código:

if file_state =1 {execute_shell(global.updateurl,""); game_end()}

Draw:
Código:

if file_state=0 {draw_text(10,room_height/1.2+24,"Verificando...");}
if file_state=1 {draw_text(10,room_height/1.2+24,"Nova versão disponível. Pressione Y para atualizar.");}

if file_state=3 {draw_text(10,room_height/1.2+24,"A verificação falhou. Reinicie o jogo e verifique se vc está conectado à internet. Caso não esteja conectado, mude as opções do jogo para não verificar atualizações.");}
if file_state=4 {draw_text(10,room_height/1.2+24,"Quando acabar a atualização, clique aqui e pressione Esc para sair do jogo.");}

Vc também precisa de um ini na pasta do game com isso ai:

Código:
[Updater]
Version=1
Language=2
Updater=1

E o ini hospedado na net:

Código:
[Updater]
Version=2
Fname=willpackHD.zip
Url=http://dl.dropbox.com/u/14720376/willpackHD.zip
---------------------------------------------------------
Enfim, eu tentei. O código é bem bugado e se o down demorar mais que 5 segundos, o sistema interpreta como que o download falhou.

Supersonic822

Número de Mensagens : 19
Data de inscrição : 12/03/2013
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Gonçalves em Qui 18 Abr 2013, 23:52

Atualizei a engine. Baixe AQUI.

Criei três scripts: version_set, version_get e version_uptodate.

O version_set define a versão, com major, minor, release e build. Uso:

Código:
//version_set(major,minor,release,build)
version_set(1,0,0,0)

O version_get retorna uma string com a versão do programa. Se o argumento for true, ele elimina os zeros, exemplo: 2.0.0.0 fica 2 | 3.6.0.0 fica 3.6 | 4.8.4.0 fica 4.8.4. Se o argumento for false, todos são retornados. Uso:

Código:
versao = version_get(true)

Há um exemplo na engine.

O version_uptodate retorna true se estiver atualizado, e false se não estiver. Dentro desse script também definimos o link do mais recente (caso não esteja encontrando).

E algumas melhorias no código em si.

A ini do seu mediafire deve seguir o novo exemplo:

Código:
[update]
major=
minor=
release=
build=
link=

Até mais!
______________________________________________

Atualizei engine novamente. Baixe AQUI.

Criei mais quatro scripts: download_init, download_create, version_getnewer e filesize_named. São mais pra facilitar vida mesmo.

O download_init substitui aquele monte de códigos no Create dos objetos que criam downloads, com ele só precisa usar um argumento.

O download_create substitui algumas linhas de código de quando o download acaba. Basta pôr nos argumentos o nome que o arquivo baixado terá.

O version_getnewer retorna uma string com o número da versão mais nova, com isso você poderá obter e utilizar esse valor com mais facilidade.

O filesize_named pega um valor em kbytes e passa pra megabytes ou gigabytes se necessário, e já adiciona após o valor. Retorna uma string.

Quase 100% do código está comentado (exceto obj_download). Está muito mais fácil de entender.

Imagens:



______________________________________________

Atualizei novamente a engine. Baixe AQUI.

Agora há a possibilidade de atualizar jogos com mais de um arquivo. No exemplo dessa engine, temos uma sprite externa.

Para esses casos, ao invés de baixar a .exe atualizada, baixaremos o .zip atualizado (com todo o conteúdo do novo jogo). Usamos o GMZ.dll para extrair o conteúdo do zip e substituir pelo atual, com isso mais de um arquivo poderá ser substituído.

No exemplo que tem aí, temos uma sprite na versão 1, que será substituída por outro na v2.

A engine continua simples de entender, usar e modificar à sua necessidade. Se encontrar algum bug favor avisar! E não se esqueça de instalar a gex do GMZ.

Obrigado pela atenção. Até mais!

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por PedroX em Sex 19 Abr 2013, 00:06

Muito bom o tutorial! A formatação está muito boa e, claro, o resultado também.

Dica de site: Dropbox. Ele disponibiliza link direto e não muda ao atualizar. Basta clicar em 'Copy public link', desde que esteja na pasta Public.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Gonçalves em Sex 19 Abr 2013, 00:36

@PedroX: Descobri como editar textos pelo Dropbox, e o melhor: o link não muda! Realmente dropbox é o melhor site de armazenamento.

Para isso, só usar essa ferramenta para editar: https://write-box.appspot.com/

Apertar Sync e voila!

Estarei passando todo o conteúdo do tópico de volta ao dropbox. Vou atualizar o tópico em breve.

Até mais!

EDIT: Novo arquivo, com as duas engines, ambas com links do dropbox: https://dl.dropboxusercontent.com/u/89134981/GAP%20%20v1.3.rar

Tutorial refeito.

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Supersonic822 em Sex 19 Abr 2013, 17:58

Eu upei o updater.ini pro server:

Código:
[update]
link=http://dl.dropboxusercontent.com/u/14720376/willpackHD.zip
major=2
minor=1
release=0
build=0
Além do create do ct_jogo, não modifiquei nada:

Código:
// Definindo a versão do jogo (Major, minor, release e build, respectivamente)
version_set(1,0,0,0)

// Nome da ini de checagem de versão
global.ini = "update.ini"

// Link da ini (LEMBRE-SE, ESSA NÃO DEVE MUDAR NUNCA)
global.ini_link="http://dl-web.dropbox.com/get/Public/SZ_Updater/updater.ini?w=AADopBKo3mteA61DYFEeSOzoQSW1vWAL4YbW-MoRWPhrXg"

// Nome do jogo, que será dado ao baixado, recomendo colocar o mesmo em todas as versões, assim substituirá um pelo outro
global.jogo = "willpackhd"

sprite_index = sprite_add(working_directory+"\sprites\ah.png",0,0,0,0,0)

Mas mesmo com o major 2 e o minor 1, sempre diz que tá atualizado Sad

Supersonic822

Número de Mensagens : 19
Data de inscrição : 12/03/2013
Reputação : 5
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Gonçalves em Sex 19 Abr 2013, 19:12

@Supersonic822:

Talvez o link esteja errado, eu lembro que aconteceu isso comigo uma vez e eu acho que foi por causa do link, que era gigante.

Pra testar se está errado o link, quando aparecer a mensagem "Seu jogo está atualizado", vai na pasta do seu jogo que a ini estará lá. Abra e veja o que está escrito.

Recomendo não criar muitas sub-pastas no dropbox porquê deixará o link extenso. Portanto não sei se é isso o problema, farei testes.

Até mais!

Gonçalves

Ranking : Nota B
Número de Mensagens : 1013
Data de inscrição : 29/10/2010
Notas recebidas : B + A + C
Reputação : 79
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 2
   : 0
   : 0

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por PedroX em Sex 19 Abr 2013, 19:32

Esse não é o link do INI nem a pau:

Código:
http://dl-web.dropbox.com/get/Public/SZ_Updater/updater.ini?w=AADopBKo3mteA61DYFEeSOzoQSW1vWAL4YbW-MoRWPhrXg

Claramente não é passado o seu ID do Dropbox. Ao meu ver, é uma url que leva para o site, a fim de pegar o link.

Usou "Copy public link" ?

Edit: Analisando seus links passados, consegui chegar ao link certo:

http://dl.dropboxusercontent.com/u/14720376/SZ_Updater/updater.ini

Agora sim mostra seu ID (14720376). E é o link certo.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: [Engine/Tutorial] Game Patching 1.3

Mensagem por Conteúdo patrocinado Hoje à(s) 09:59


Conteúdo patrocinado


Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum