Jump to content
Sign in to follow this  
caanmasu

[QUEST] Simulador de media y habilidad

Recommended Posts

Hola a todos

Traigo esta quest. Creada e ideada por mí, 100% original de Camilo.

 

EDICIÓN URGENTE: añadí límite en los cambios/iteraciones.  Eso depende del rendimiento de sus servidores. El personaje cuando tarda un minuto, estando en diálogo con un NPC haciendo un proceso, el servidor se cae. En la nueva edición, puse como máximo 2 millones; en mi server local se demora 6 segundos en llegar a los 2 millones. Pueden cambiar ese parámetro en la variable LIMITE.

 

Descarga los archivos en el adjunto y mira todo de aquí para abajo.

 

Debes iniciar sesión para ver el contenido del enlace en esta publicación.

 

 

simulador.quest

--[[	QUEST
Quest creada por Camilo Martínez
Esta quest fue creada con el fin de entretenimiento
usando un simulador de media y habilidad.

Especificaciones:
1. Dar clic al NPC indicado y abrirá una ventana con dos
opciones: Sacar media y habilidad; Iteraciones infinitas
2. Al presionar sobre Iteraciones infinitas mostrará
páginas de 10 filas donde se muestran números de media
y habilidad aleatorios. Las páginas son infinitas en cuanto
le presiones al botón "Siguiente".
3. Al presionar sobre Sacar media y habilidad, te pedirá
la media deseada, la habilidad deseada y la cantidad de cambios
(iteraciones) a usar.
Si no quieres sacar habilidad, simplemente déjala en un número
que sabes que no saldrá, como el 999.
En iteraciones, elige un número muy grande.
El resultado de esta operación es mostrar la cantidad de cambios
utilizados para obtener la media o habilidad igual o mayor
a las digitadas por ti. 

Notas: [ACADÉMICO]
1. La función para obtener estos valores está basada en la source del
game en el archivo Item_addon.cpp
2. La media depende de la habilidad. Eso se puede ver en la función.
La habilidad se saca de una distribución gaussiana (normal)
con parámetros media (promedio) = 0 y desviación estándar = 5.
Una vez obtenida la habilidad, se le suma 0.5 y si el valor obtenido
es menor o igual a 20, sacará una función para la media.
Si es mayor a 21, sacará otra función para sacar la media.
3. ¿Cómo obtener la función? ya que se trata de uso de números aleatorios
para realizar simulaciones o eventos, la cosa cambia, hay que usar un
método llamado Box-Muller. La función está en el questlib.lua y en 
simulador.py. La función number() o math.random() funcionan perfecto 
con el método ya que retornan variables aleatorias uniformes (todos los
números caen con una probabilidad aproximadamente igual).
4. En C++ ya se encontraba la función gaussiana.
En Python se encuenta como random.gauss()
En Lua no se encontraba. Así que la tomé de Box-Muller. Al probar, me
pareció que sacaba los valores muy cercanos a las de los otros dos
lenguajes así que supongo que esta función simula muy bien.
En ninguno de los tres lenguajes (aunque no se trata del lenguaje sino
de la función), se logró obtener una media de 60.
5. La función de Box-Muller la encontré standard (media 0 y desviación
estándar 1) así que tuve que averiguar una más genérica. Encontré una pero
los resultados no me daban. La media no tenía problema porque sumaba con la función
y la media es 0, así que daba igual.
La desviación estándar estaba dentro de la raíz. Como no me daban bien los
resultados (no pasaba de 40 de media(arma)), la elevé al cuadrado (quedó la desviación
estándar afuera de la raíz)
Los resultados cambiaron y se aproximaron bastante a mi simulación por Python.
6. La ventaja de usar el simulador es que puedes "usar" miles de Objeto Encantado
en un segundo. Así que puedes poner libremente media de 50 y 1kk de cambios para
probar.
7. Reportar cualquier error
Que se entretengan :)
Discord: Camilo#0869
--]]


quest simulador begin
	state start begin
		function llenar_pagina()
			say_title("Habilidad	Media")
			for j=1, 10 do
				local h, m = calcular_hab_med()
				say(h.."	"..m)
			end
		end
		function sacar_bonus()
  			LIMITE = 2000000
			say("Ingresa la media que quieres sacar")
			local med = tonumber(input())
			say("Ingresa la habilidad que quieres sacar")
			local hab = tonumber(input())
			if med == nil or hab == nil then return end
			say("Ingresa la cantidad de cambios")
  			say("(Máximo "..LIMITE..")")
			local iter = tonumber(input())
			if iter == nill or iter > LIMITE then return end
			for i = 1, iter do
				local h, m = calcular_hab_med()
				if m >= med or h >= hab then
					say_title("Media y habilidad")
					say("[ENTER]Resultados: [ENTER]"..i.." cambios")
					say(m.." daño de media")
					say(h.." daño de habilidad")
					return  
				end
			end
			syschat("No salió el bonus deseado")
		end

		when 20095.chat."Media y habilidad" begin
			local sel = select("Sacar media y habilidad", "Cambios infinitas", "Cerrar")
			if sel == 1 then
				simulador.sacar_bonus()
			elseif sel == 2 then
				simulador.llenar_pagina()
				while true do
					if select("Siguiente", "Cerrar") == 1 then
						simulador.llenar_pagina()
					else
						return
					end
				end
			end
		end
	end
end

 

questlib.lua

function gaussian (mean, variance)
    return  variance*math.sqrt(-2 * math.log(math.random())) * math.cos(2 * math.pi * math.random()) + mean
end

function calcular_hab_med()
	local g = gaussian(0, 5)
	local hab = math.floor(g) + 0.5
	local med = 0
	if math.abs(hab) <= 20 then
		med = -2*hab+math.abs(number(-8, 8) + number(-8, 8))+number(1, 4)
	else
		med = -2*hab+number(1, 5)
	end
	return math.floor(hab), math.floor(med) 
end

 

Este código es para simular por Python3 por local o web. Deshabilita el print de adentro para que no aparezca en cada iteración la media y la habilidad. Este archivo no va en ninguna parte del juego, aclaro.

#Simulador de media y habilidad. La probabilidad de sacar media y habilidad es la clásica del oficial

import random
import math

def calcularmedia(num, intentos):

  for i in range(intentos):

    valor_bonus = 500

    n1 = random.gauss(0, 5)
    iSkillBonus = int(n1) + float(0.5)
    iNormalHitBonus = 0
    if math.fabs(iSkillBonus) <= 20:
     iNormalHitBonus = -2 * iSkillBonus + math.fabs(random.randint(-8, 8) + random.randint(-8, 8)) + random.randint(1, 4)
    else:
      iNormalHitBonus = -2 * iSkillBonus + random.randint(1, 5)
    hab = "Habilidad", int(iSkillBonus)
    med = "Media", int(iNormalHitBonus)
    print (med, hab)
    if iNormalHitBonus >= num:
      return (i+1), "cambios", med, hab, "Yang gastado", (i+1)*valor_bonus
  return "no dopó, Yang gastado: ", (i+1)*valor_bonus

#En donde va el 50 es la media y el 1000000 es la cantidad de cambios a utilizar
print (calcularmedia(30, 1000000))

 

Éxitos!

 

 

Share this post


Link to post
Share on other sites
hace 6 horas, Metin2Arceus dijo:

Muy buena voy a probarla si funciona que la de tanakas ni me funcionaba

Brother borra la carpeta object, haz un make.sh, reboot, compila la quest y prueba; yo también tengo ese problema

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...