sexta-feira, 20 de setembro de 2013

Sistema de Inventario + Overloadable Operators

E ae pessoal, tudo bem?

Já faz alguns dias... alguns vários dias pra ser bem sincero... que eu estou trabalhando no Sistema de Inventário do Like a Boss. Oficialmente essa é a primeira vez que eu faço um sistema de inventário, todos nossos outros jogos era meio que migué, a loja era o inventário e se o item tava comprado trocava de "Comprar" pra "Equipar" e é isso ai.

Sério... quando eu comecei esse sistema, eu pensei "bom, inventário... vai ser tranquilo... pega o item, joga numa lista de itens... quando o kra abrir o inventario preenche a interface com base nessa lista... e ja era, cabo!!!!1111"

Nunca...
Pra falar a verdade eu to impressionado como essa porra de sistema ta me dando trabalho. Mas a verdade é que, basicamente, ele realmente é só adicionar e tirar de uma lista, como q pode ser tão difícil assim? Bom, é ai que começa a putaria da programação. Como q eu posso adicionar e tirar items de uma lista, se eu nem sei o que é um item? Como vou subdividir meus items, que propriedades essas porra de item tem que ter? Bom, blz, tão vamo la, definir o que é um item!

Eu sei que Like a Boss tem genericamente falando 5 tipos de item: Equipamentos (Armaduras e Armas que podem receber upgrades), Gemas (para colocar nos equipamentos), Poções (para tomar (não me diga)), "Brincos" (na verdade qquer porcaria, são um tipo de equipamento mas sem modelo, sem slot pra gema, sem poder dar upgrade) e por fim... lixo, que é sempre bom pra encher os inventários alheios.

Depois de ownar horrores com The Unstoppable Force dando knockback em geral... chega às lojas... The STOPPABLE Force! Essa é a alma dos itens lixo... são lixo, mas são da hora =P
Cada um tem características bem diferentes um do outro... alguns tem modelo atrelado... outros pode dar upgrade... outros tem efeitos diferentes se usado de maneiras diferentes... enfim, acabei por criar uma classe Item e uma pra cada tipo de item com as características únicas de cada um, até ai, tranquilo.

O problema é quando você começa a perceber que isso é só o comecinhoooo de nada... Os itens atualmente (mas pode mudar) são por chefe, e não por player. Já que você pode jogar com vários chefes diferentes, cada um tem sua campanha, cada um tem seus items. Isso ainda está em discussão, mas no momento é assim. Então primeira coisa é fazer toda a lógica de toda a interface do inventário funcionar com base no chefe atual, e criar a lista de inventário por chefe. Só que ai, também tem que fazer a lista de itens equipados... só que ai, precisa pegar os stats dos items equipados e incrementar nos stats do player... só que ai, precisa definir todos os stats que existem no jogo... só que ai, precisa definir como eles vão funcionar internamente... só que ai, precisa implementar nos códigos antigos multiplicadores e a porra toda... só que ai, precisa criar um operador custom pra somar uma puta lista de stats com outra lista... só que ai, eu preciso salvar os itens que estão na bag... só que ai, preciso duplicar os items de um banco de dados para a bag... só que ai.... sério, eu to a uns 4-5 dias só no "só que ai..."

Mas eu só queria fazer um sisteminha de inventário...
Enfim, dizer "sistema de inventário", é ser muito bonzinho. Na verdade estou trabalhando no sistema de stats + inventario + upgrades + sockets + input + efetivamente dar efeito aos stats. Não é a toa que essa porcaria ta me tomando tanto tempo. Na verdade é tanto tempo que hoje eu tive que trabalhar em outra coisa (alguns bugfixes principalmente), pra depois voltar, porque eu to sentindo que até o sistema de inventario estar 100% pronto pra colocar no jogo e o player efetivamente ter items, ainda vai levar mais alguns dias... ah, e PS: não são dias 4-5 dias de 8 horas de trabalho... são 4-5 dias dormindo no escritório...

Assim que eu me sinto quando durmo no escritório sem chuveiro...
Claro, fiz outras coisas nesse período, algumas pendências ainda do jogo do Cartoon, um monte de contatos que eu precisava responder, coisas que precisava escrever, atualizar o blog que é minha promessa... haha mas enfim, ta sendo tenso.

Alias, pra esse não ser um post totalmente voltado pras minhas choradeiras do dia a dia, eu mencionei ai pra cima uma coisa que eu tenho certeza que muita gente não sabe que existe/não sabe como fazer/ta pouco se fudendo: operador customizado!

Qué isso Allan, to super interessado em saber como são esses tal de operadores!!11
O que que eu realmente quero dizer com isso? Bom... pra nós é obvio que quando eu escrevo 1 + 1, o que eu quero dizer é que é pra máquina somar 1 ao 1 inicial, pra me dar um outro resultado numérico. Outro exemplo que se torna óbvio de tanto que a gente usa é dizer que "string1" + "string2" = "string1string2", pq afinal de contas é obvio que eu to pedindo pra máquina concatenar as strings pra me formar uma 3a string (PS: evitem concatenar strings sempre que possível). Mas, por exemplo no meu caso, eu tenho uma classe chamada BossAttributes, que tem todos os atributos do chefe. O que acontece se eu disser BossAttributes1 + BossAttributes2????


Porra nenhumaaa!!! Aeeee!!!1111 Bom, pra ser justo, acontece, a máquina basicamente vai me dizer "porra, qq vc quer q eu faça com essa merda, sô adivinho por acaso???" porque o computador não sabe o que "+" quer dizer nesse sentido. O que o OPERADOR "+" quer dizer... mas eu, por sua vez, sei. Eu quero que ele pegue todos os atributos do chefe, e some com os pares do outro lado... então, pra exemplificar, digamos que eu tenho AttackPower, Health e Armor. Quando eu digo BossAttributes1 + BossAttributes2, eu quero que ele faça, na prática: BossAttributes1.AttackPower + BossAttributes2.AttackPower, BossAttributes1.Health + BossAttributes2.Health... e dai por diante... mas, como que eu ensino a máquina a aprender a fazer soma básica?

É tão simples que chega a ser escroto. Eu nem sei se tem muito o que explicar, quando vocês verem a sintaxe do negócio. Vou colocar uma imagem do código que fica mais fácil.

PS: Atualmente esses sao os atributos do Like a Boss.
Bom, como vocês podem ver, tudo que você precisa fazer é criar um método static (dentro da classe), que retorna o tipo da sua classe, com a palavra chave operator, e dizer que tipo de operador você ta dando overload. Nos parâmetros você passa (nesse caso) os dois valores que vão ser "somados", e ai você simplesmente escreve o código do que você quer que a máquina faça. A partir desse momento, eu posso dizer que BossAttributes1 + BossAttributes2 e a máquina efetivamente sabe o que eu quero dizer com isso, e que é pra somar do jeito certo. Existe uma lista de operadores que podem ser "sobrecarregados" (a tradução de overloaded pra esse caso não me agrada muito), e algumas notas a serem consideradas, aqui. Alias, outra dica é, tudo que você quiser saber de C#, se você souber o que procurar, existe na documentação da Microsoft... o que é algo mto legal da linguagem diga-se de passagem.

Eu nunca usei muito isso, mas eu sei que existem casos em que isso facilita d++++ a vida, esse é certamente um deles. Outros operadores podem abrir outras possibilidades, e se alguém que tiver lendo já usou pra alguma coisa diferente e saiba uma dica pra dar de algo que possa ser útil ou uma correção a algo que mencionei, por favor deixe um comentário!

Abraços,
Allan

Nenhum comentário:

Postar um comentário