O TEMA DO FÓRUM ESTÁ EM MANUTENÇÃO. FEEDBACKS AQUI: ACESSAR

Como mudar o Nome da Classe dentro do jogo.

Iniciado por Red, 25/04/2020 às 18:51

25/04/2020 às 18:51 Última edição: 26/04/2020 às 15:13 por ~Ragnar
Olá a todos, estou precisando de uma ajudinha para isso. Desejo mudar o nome da classe do herói dentro do jogo, a mudança vai acontecer de acordo com o nível dele, por exemplo:

Nível 1 = Bronze 1 Estrela
Nível 2 = Bronze 2 Estrelas
...

E por ai vaí. Pensei em fazer usando um evento comum que continha uma variável que pegava o nível do herói e em seguida uma estrutura condicional que mudava o nome de acordo. Pensei em usar o seguinte scriptcall mas não tive sucesso:
$gameActors.actor(1).changeClassName(Bronze 1 Estrela)


Se puderem me dar uma força nisso, agradeço.

Edit: Deste jeito que eu estava fazendo seria necessário ativar uma switch ou chamar o evento comum quando o herói subisse de nível para poder atualizar, mas para o jeito que estou pensando em fazer o herói subir de nível, que seria cultivando(meio que meditando) isso não seria necessário.
Consegui meu equilíbrio cortejando a insanidade.

Fala Ragnar!
Então, estou tentando aqui realizar o procedimento por plugin, só por curiosidade minha xD

Você consegue mudar o nome da classe do personagem, acessando:
$dataClasses[ID].name = "Bronze nível 1";

O problema é que ao fazer isso, o nome da classe será mudado em todos os save files. Se você começar um novo jogo, o nome da classe estará mudado também.
Ao contrário do que eu pensei, não fica salvo no save file, é uma variável global.

Com um pouco de evento comum, você até consegue fazer isso no mapa inicial de cada jogo:

Se nivel do personagem for 1 > muda o nome do classe...
Se o nível do personagem for 2 > muda o nome do classe...

Mas aí você teria que fazer isso toda vez que carregasse um save também(load).
Então você poderia dinâmicamente mudar isso.

Se você gostar dessa solução pode usar. Eu vou fazer o plugin assim mesmo ^^

25/04/2020 às 19:26 #2 Última edição: 25/04/2020 às 19:40 por ~Ragnar
Cara eu fiz uns testes aqui e parece ter funcionado perfeitamente. Upei um save até o nível 5 e salvei. depois em um novo savegame upei ate o 3 ou foi 2 e salvei. Quando entrei de novo que tava lvl 5 tava correto. Mas no caso tinha um evento que executava a checagem de nível pra mudar o rank do personagem.
Tem como fazer com que execute o evento comum ao criar um novo jogo ou carregar um novo jogo?

Edit: Testei aqui com o personagem em outro mapa que não tinha o evento pra atualizar e criando um novo save game não mudou nada.
Edit²: Se tu puder me ajudar com um plugin que ative uma switch ou chame um evento comum me ajudaria bastante, não só com a questão do level mas também com um script de filtro de tela que eu uso.
Consegui meu equilíbrio cortejando a insanidade.

CitarO problema é que ao fazer isso, o nome da classe será mudado em todos os save files. Se você começar um novo jogo, o nome da classe estará mudado também.
Ao contrário do que eu pensei, não fica salvo no save file, é uma variável global.

Não é o caso. A variável global não sincroniza automaticamente com os arquivos do banco de dados. O que vai acontecer na verdade é que se você fechar o jogo e abrir novamente, a mudança não vai mais estar lá.

Um plugin é a forma menos pior de resolver isso, mas me parece que o problema em si é estranho. Onde que o sistema de rank tem a ver com classes? Seria legal ter uma visão melhor disso pra poder resolver o problema de forma assertiva, e talvez melhor do que a que o próprio Ragnar imaginou.
~ Masked

Isso seria somente para mudar o nome da classe. Eu estou usando um script de menu do MOG, dai na aba status tem o Nome da Classe, eu queria utilizar isso para mostrar o ranking do personagem.
Modificar o script do MOG seria mais problemático do que simplesmente mudar o nome da classe.
Consegui meu equilíbrio cortejando a insanidade.

CitarNão é o caso. A variável global não sincroniza automaticamente com os arquivos do banco de dados. O que vai acontecer na verdade é que se você fechar o jogo e abrir novamente, a mudança não vai mais estar lá.
Bom, não sei descrever com termos técnicos... mas aqui eu fiz o seguinte:
- Comecei um novo jogo > evolui de level > meu código executou uma função que muda o nome da classe quando evolui de level > salvei o jogo.
- Comecei outro jogo > O nome da classe estava mudado.
- Fechei o editor do mv > abri de novo > comecei um novo jogo e carreguei o jogo antigo > o nome da classe estava original.

CitarUm plugin é a forma menos pior de resolver isso, mas me parece que o problema em si é estranho.
É, eu consegui fazer funcionar.
Fiz um código que altera o nome da classe dinâmicamente baseando-se nos membros do grupo.
Consegui aplicar ele quando começa um novo jogo e também quando evolui de level.
Mas to com uns problemas na hora de dar o load, que não tá funfando.
Mais tarde ou amanhã vou continuar pra resolver isso ^^

Citação de: ~Ragnar online 25/04/2020 às 20:02
Isso seria somente para mudar o nome da classe. Eu estou usando um script de menu do MOG, dai na aba status tem o Nome da Classe, eu queria utilizar isso para mostrar o ranking do personagem.
Modificar o script do MOG seria mais problemático do que simplesmente mudar o nome da classe.

Não acho. O problema de querer dar uma solução sem saber aplicá-la é bem esse: às vezes de outro jeito é muito mais fácil, e você não pensou nele/acha que é difícil.

Se tudo que você quer é trocar o texto que tem o nome da classe por um rank, então é beeem mais fácil modificar o menu do MOG do que alterar toda a lógica de nome de classe do RM: a primeira é só alterar um método, trocando um texto; já a última envolve alterar o nome da classe, verificar as mudanças de nível do jogador, persistir essas mudanças/garantir que elas sejam aplicadas na inicialização, etc. Resumindo, é uma puta gambiarra.

Dica de ouro pra pedir ajuda: diga onde você quer chegar, não como.

No caso, é só alterar o MOG_SceneStatus (imagino que seja esse, o script de menu mesmo não mostra classe), na linha 573:

this.drawActorClass(this._actor, Moghunter.scStatus_ClassX, Moghunter.scStatus_ClassY);


Ao invés de this.drawActorClass, podemos usar um drawText, que é mais genérico e permite escrever o que você preferir:

this.drawText("Bronze nível " + this._actor.level, Moghunter.scStatus_ClassX, Moghunter.scStatus_ClassY);


Claro, imagino que você gostaria de não usar sempre "Bronze", nesse caso você pode definir faixas de nível para cada "elo" (código porquinho, só pra demonstrar como ficaria):

const levelThresholds = [10, 25, 40];       // Deve estar ordenado!
const ranks = ["Bronze", "Prata", "Ouro"];  // Conforme ordem da lista acima

let level = this._actor.level;
let rank = 0;

while (rank < levelThresholds.length && levelThresholds[rank] < level)
  rank++;

this.drawText(ranks[rank] + " nível " + (level - levelThresholds[actualRank]), Moghunter.scStatus_ClassX, Moghunter.scStatus_ClassY);


Idealmente eu escreveria um plugin pra modificar isso, mas o plugin do mog não é muito extensível, então ia ser chato :s
Não é uma alteração muito drástica. Acredito que seja tranquilo tu aplicar aí.

CitarBom, não sei descrever com termos técnicos... mas aqui eu fiz o seguinte:
- Comecei um novo jogo > evolui de level > meu código executou uma função que muda o nome da classe quando evolui de level > salvei o jogo.
- Comecei outro jogo > O nome da classe estava mudado.
- Fechei o editor do mv > abri de novo > comecei um novo jogo e carreguei o jogo antigo > o nome da classe estava original.

Não tem termo técnico pra usar aí. Exatamente como eu disse, se você fechar o jogo (fechar o jogo, pra mim = o executável, fechar a janela) a variável $dataClasses é descarregada e na próxima vez que você executa ele ela é lida do arquivo Data/Classes.json, que não é alterado pela modificação na variável global. Isso acontece porque o DataManager carrega os objetos no começo da execução do jogo e não recarrega quando você vai pra tela de título ou dá load num jogo.
~ Masked

26/04/2020 às 00:49 #7 Última edição: 26/04/2020 às 01:02 por Eliaquim
Citar(fechar o jogo, pra mim = o executável, fechar a janela)
Hammmm taa!! Agora entendi o que você quis dizer.
Era isso mesmo que eu tava pensando xD

Eu também pensei em simplesmente alterar o menu do mog depois que ele falou... mas fiquei com preguiça de entender o código dele(e também já tinha começado o meu), como estou praticando, acabei fazendo o plugin mesmo xD

Dá uma olhada ragnar e ve se tá funfando.
Eli_ClassesNames.js
Para usar você só precisa fazer o seguinte:
Vai no campo de notas da classe que você quer mudar o nome de acordo com o nível e coloca isso:

<customNames:nome1,nome2,nome3,nome4,etc...>

o primeiro nome é para o level 1, o segundo nome para o level 2 e etc...
Não precisa preencher para todos os levels. Se não tiver um nome do level 10 em diante, por exemplo, ele vai pegar o último nome da lista.

Eu ainda vou trabalhar melhor nesse plugin pra facilitar ainda mais esse setup, mas por enquanto é isso.

Só uma observação:

Não pode ter atores com classes repetidas(de mesmo ID).
Se tiver dois guerreiros no seu grupo, cria duas classes iguais de guerreiro no banco de dados.

[EDIT]OBS2: Caraca... agora que vi que eu podiater sido mais fácil se eu tivesse mexido aqui:
Window_Base.prototype.drawActorClass = function(actor, x, y, width) {
    width = width || 168;
    this.resetTextColor();
    this.drawText(actor.currentClass().name, x, y, width);
};

:viiish:

26/04/2020 às 01:50 #8 Última edição: 26/04/2020 às 01:59 por Brandt
Entendo a vontade de fazer o plugin para praticar, mas que fique clara a sugestão de pensar antes se realmente é o que devia ser feito. Praticar maus hábitos mais atrapalha do que ajuda. E bastava uma busca rápida no código do MOG pra achar o trecho onde ele escreve o nome de classe, muito menos trabalho que fazer um plugin, por mais simples que seja. Se o objetivo é aprender, ao invés de trabalhar mais nesse plugin, sugiro que busque uma solução mais apropriada.

Quanto à função drawActorClass: sim, foi mais ou menos o que eu falei na minha mensagem. Preferi não sobrescrever a função por questão de consistência: da mesma forma que não acredito que faça sentido trocar o nome da classe pra simular esse sistema de rank, não acho que faz sentido modificar um método que, pelo nome, evidentemente serve para escrever o nome da classe, e não um rank ou algo do tipo. Sinceramente, acho que o problema é mais como estão feitas as coisas no RPG Maker, mas isso não é desculpa pra fazer coxambras. Alterar direto o plugin do MOG é a solução menos dispendiosa aqui mesmo, creio.

É importante manter a semântica das coisas o mais intacta possível. Você pode não perceber de imediato, mas conforme você se permite botar coisas numa função que não têm a ver com o propósito original dela vai ficando cada vez mais difícil entender e manter as coisas.
~ Masked

26/04/2020 às 12:12 #9 Última edição: 26/04/2020 às 14:19 por ~Ragnar
Muito obrigado pela ajuda de vocês. Vai ter 72 Ranks/nomes diferentes.
Eliaquim já já vou fazer os testes e volto aqui.

Edit: Testei aqui e deu tudo certo, muito obrigado.
Consegui meu equilíbrio cortejando a insanidade.

haha!
Show de bola Ragnar!
Que bom que deu certo!
Mais pra frente devo pensar em um jeito melhor de fazer isso, me fala por aqui ou por mp se vc tiver algum problema usando esse plugin :)

Certo, muito obrigado novamente. Estarei mudando o tópico para resolvido.
Consegui meu equilíbrio cortejando a insanidade.