🤔 Para Refletir :
"Poucos sabem do que somos feitos. Sonhos não passam da realidade na qual a mente humana gostaria de vivenciar."
- Yonori Akari

Ajuda converter do Ruby para JavaScript

JulioRPGCriator

Cidadão
Membro
Membro
Juntou-se
17 de Fevereiro de 2017
Postagens
103
Bravecoins
0
Boa noite galera, primeiramente venho dizer que a Steam esta com engines em promoção de ate 90% do valor da ferramenta aproveitem e de uma olhada, após um bom tempo usando o RMVXace e ter me acostumado com RUBY por ter muito conteúdo online e suporte aqui no condado comprei o RMMV quentinho na promoção acima a algum tempo acho que nas ferias de 2017 e venho tentando criar meu próprio ABS porem todos sabem a dificuldade que eu enfrentei por não conhecer a linguagem....
Ironia do destino ainda não saco nada apesar de cursos e gastos pra tentar aprender isso online!!

Consegui criar boa parte das coisas que fiz no RUBY no Javascript, Porem tenho muita dificuldade! Queria uma ajuda pra converter os plugins que produzi no Ruby e trazer ao JavaScript ate mesmo coloco todos cientes que logo sai um jogo meu completo... [member=3]RyanKamos[/member] depois volto a falar com você sobre pixel art e seu trabalho se estiver com tempo...

segue o video:
[youtube]https://youtu.be/e-Ylk3EmiKA[/youtube]

o codigo é o seguinte no Ruby:

Código:
module ABS_Configurations
  Default_Animation = 1
  Opacity_Burn = 10
  Enemy_Recover = 60
  Player_Recover = 60
  Botton_Attack = :A
end

class Game_Map
  attr_accessor :enemies
  attr_accessor :damage_sprites
  alias abs_setup setup
  def setup(map_id)
    @enemies.nil? ? @enemies = [] : @enemies.clear
    abs_setup(map_id)
  end
end

class ABS_Enemy
  include ABS_Configurations
  attr_accessor :enemy_hp
  attr_accessor :enemy_exp
  attr_accessor :enemy_atk
  attr_accessor :enemy_def
  attr_reader :enemy_name
  attr_reader :enemy_animation
  def initialize(id)
    enemy = Game_Enemy.new(0,id)
    note = enemy.enemy.note
    if note.include?("animation=")
      animation_id = note.sub("animation=","")
      @enemy_animation = animation_id.to_i
    else
      @enemy_animation = Default_Animation
    end
    @enemy_hp = enemy.mhp
    @enemy_exp = enemy.exp
    @enemy_atk = enemy.atk
    @enemy_def = enemy.def
    @enemy_name = enemy.name
  end
end

class Game_Event < Game_Character
  attr_reader :enemy
  alias abs_setup_page setup_page_settings
  alias abs_initialize initialize
  alias abs_update update
  alias abs_start start
  def initialize(map_id, event)
    @enemy = nil
    @recover = 0
    abs_initialize(map_id, event)
  end
  def setup_page_settings
    abs_setup_page
    check_enemy
  end
  def check_enemy
    unless @enemy.nil?
      @enemy = nil 
      $game_map.enemies.delete(self) if $game_map.enemies.include?(self)
    end
    return if @list.nil?
    for command in @list
      next unless command.code == 108 or command.code == 408
      if command.parameters[0].include?("cmd:enemy=")
        id = command.parameters[0].sub("cmd:enemy=","")
        @enemy = ABS_Enemy.new(id.to_i)
        @trigger = 2
        $game_map.enemies.push(self)
      end
    end
  end
  def damage_enemy(value)
    value -= @enemy.enemy_def
    value = 0 if value < 0
    $game_map.damage_sprites.push(Damage_Sprite.new(self,value))
    @enemy.enemy_hp -= value
    if @enemy.enemy_hp <= 0
      $game_map.enemies.delete(self) 
      RPG::SE.new("Collapse1",80).play
    end
  end
  def update
    if @enemy != nil
      @recover -= 1 if @recover > 0
      update_enemy_death if @enemy.enemy_hp <= 0
    end
    abs_update
  end
  def update_enemy_death
    if @opacity > 0
      @opacity -= ABS_Configurations::Opacity_Burn
    else
      @character_name = ""
      @opacity = 255
      @priority_type = 0
      @trigger = 0
      @enemy = nil
    end
  end
  def start
    @enemy.nil? ? abs_start : attack
  end
  def attack
    return if @enemy.enemy_hp <= 0 or @recover > 0
    @recover = ABS_Configurations::Enemy_Recover
    $game_player.animation_id = @enemy.enemy_animation
    $game_player.damage_hero(@enemy.enemy_atk)
  end
end

class Game_Player < Game_Character
  alias abs_initialize initialize
  alias abs_update update
  def initialize
    @recover = 0
    @player_death = false
    abs_initialize
  end
  def update
    @recover -= 1 if @recover > 0
    update_attack if @recover == 0 and Input.trigger?(ABS_Configurations::Botton_Attack)
    update_player_death if @player_death
    abs_update
  end
  def update_attack
    return if @player_death
    for enemy in $game_map.enemies
      ax = @x - enemy.x
      ay = @y - enemy.y
      case @direction
      when 2
        attack_enemy(enemy) if ax == 0 and ay == -1
      when 4
        attack_enemy(enemy) if ay == 0 and ax == 1
      when 6
        attack_enemy(enemy) if ay == 0 and ax == -1
      when 8
        attack_enemy(enemy) if ax == 0 and ay == 1
      end
    end
  end
  def attack_enemy(event)
    hero = $game_party.members[0]
    event.damage_enemy(hero.atk)
    event.animation_id = hero.weapons[0].animation_id
    @recover = ABS_Configurations::Player_Recover
  end
  def damage_hero(value)
    return if @player_death
    hero = $game_party.members[0]
    value -= hero.def
    value = 0 if value < 0
    $game_map.damage_sprites.push(Damage_Sprite.new(self,value))
    if value > hero.hp
      hero.hp = 1
      @player_death = true
      RPG::SE.new("Collapse1",80).play
    else
      hero.hp -= value
    end
  end
  def update_player_death
    if @opacity > 0
      @opacity -= ABS_Configurations::Opacity_Burn
    else
      SceneManager.goto(Scene_Gameover)
    end
  end
end

class Spriteset_Map
  alias abs_initialize initialize
  alias abs_update update
  alias abs_dispose dispose
  def initialize
    $game_map.damage_sprites = []
    abs_initialize
  end
  def update
    abs_update
    trash = []
    for sprite in $game_map.damage_sprites
      sprite.update
      trash.push(sprite) if sprite.disposed?
    end
    for item in trash
      $game_map.damage_sprites.delete(item)
    end
    trash.clear
  end
  def dispose
    abs_dispose
    for sprite in $game_map.damage_sprites
      sprite.bitmap.dispose
      sprite.dispose
    end
    $game_map.damage_sprites.clear
  end
end

class Damage_Sprite < Sprite
  def initialize(target,value)
    super(nil)
    @target = target
    self.bitmap = Bitmap.new(100,20)
    self.bitmap.draw_text(x,y,100,20,value,1)
    self.ox = 50
    self.x = @target.screen_x
    self.y = @target.screen_y - 48
    self.z = 999
    @timer = 25
  end
  def update
    self.x = @target.screen_x
    self.y = @target.screen_y - 48
    if @timer > 0
      @timer -= 1
      self.zoom_x += 0.01
      self.zoom_y += 0.01
    else
      self.opacity > 0 ? self.opacity -= 15 : dispose
    end
  end
  def dispose
    self.bitmap.dispose
    super
  end
end

HUD

Código:
class Spriteset_Map
  alias hud_init initialize
  alias hud_update update
  alias hud_dispose dispose
  def initialize
    @hud_player = Game_HUD.new($game_player.actor)
    hud_init
  end
  def update
    SceneManager.goto(Scene_Gameover) if $game_player.actor.hp <= 0    
    @hud_player.update
    hud_update
  end
  def dispose
    @hud_player.dispose 
    hud_dispose    
  end
end

class Sprite
  def width=(width)
    src_rect.width = width
  end
end

class Game_HUD
  def initialize(actor)
    @actor = actor
    @last_level = @actor.level
    @hud_graphic = Sprite.new
    @hud_graphic.bitmap = Cache.picture("Layout")
    @hud_graphic.x = 0
    @hud_graphic.y = 0
    @hud_graphic.z = 999
    @hud_face = Sprite.new
    @hud_face.bitmap = Cache.picture("Face")
    @hud_face.x = 0
    @hud_face.y = 0
    @hud_face.z = 1000
    @hud_hp = Sprite.new
    @hud_hp.bitmap = Cache.picture("Layout_HP")
    @hud_hp.x = 84
    @hud_hp.y = 10
    @hud_hp.z = 1000
    @hud_mp = Sprite.new
    @hud_mp.bitmap = Cache.picture("Layout_MP")
    @hud_mp.x = 84
    @hud_mp.y = 18
    @hud_mp.z = 1000
    @hud_lv = Sprite.new
    @hud_lv.bitmap = Cache.picture("Level_" + (@actor.level / 10).to_s)
    @hud_lv.x = 24
    @hud_lv.y = 21
    @hud_lv.z = 1000
    @hud_lv2 = Sprite.new
    @hud_lv2.bitmap = Cache.picture("Level_" + (@actor.level % 10).to_s)
    @hud_lv2.x = 32
    @hud_lv2.y = 21
    @hud_lv2.z = 1000
    @hud_xp = Sprite.new
    @hud_xp.bitmap = Cache.picture("Layout_XP")
    @hud_xp.x = 0
    @hud_xp.y = 32
    @hud_xp.z = 1000    
  end
  def update
    @hud_hp.width = 100 * @actor.hp / @actor.mhp
    @hud_mp.width = 100 * @actor.mp / @actor.mmp
    @hud_xp.width = 100 * (@actor.exp - @actor.current_level_exp) / (@actor.next_level_exp - @actor.current_level_exp)
    if @last_level != @actor.level
      @hud_lv.bitmap = Cache.picture("Level_" + (@actor.level / 10).to_s)
      @hud_lv2.bitmap = Cache.picture("Level_" + (@actor.level % 10).to_s)
      @last_level = @actor.level
    end
  end
  def dispose
    @hud_graphic.dispose
    @hud_face.dispose
    @hud_hp.dispose
    @hud_mp.dispose
    @hud_xp.dispose
    @hud_lv.dispose
    @hud_lv2.dispose
  end
end

Consegui fazer isso porem ainda não funcional no JavaScript;

Código:
var EnemyABS_initialize = Game_Event.prototype.initialize;
Game_Event.prototype.initialize = function(mapId, eventId) {
	EnemyABS_initialize.call(this, mapId, eventId);
	if (this.isEnemy()) {
		this._eventEnemyId = Number($dataMap.events[eventId].meta.enemy);
		this._eventEnemyMHp = $dataEnemies[this._eventEnemyId].params[0];
		this._eventEnemyMMp = $dataEnemies[this._eventEnemyId].params[1];
		this._eventEnemyAtk = $dataEnemies[this._eventEnemyId].params[2];
		this._eventEnemyDef = $dataEnemies[this._eventEnemyId].params[3];
		this._eventEnemyMat = $dataEnemies[this._eventEnemyId].params[4];
		this._eventEnemyMdf = $dataEnemies[this._eventEnemyId].params[5];
		this._eventEnemyAgi = $dataEnemies[this._eventEnemyId].params[6];
		this._eventEnemyLuk = $dataEnemies[this._eventEnemyId].params[7];
		this._eventEnemyActions = $dataEnemies[this._eventEnemyId].actions;
	};
};
//Atualização do cooldown, Morte;
var EnemyABS_update = Game_Event.prototype.update;
Game_Event.prototype.update = function(){
 	EnemyABS_update.call(this);
 	if (this.isEnemy()) {
  		this.EnemyCooldown();	
 	};
};
//Formula do Cooldown.
Game_Event.prototype.EnemyCooldown = function() {
	var Wait = ((50 - this._eventEnemyAgi) / 50) * 180 + 180;
	if (this._waitCount == undefined || this._waitCount == null){
  		this._waitCount = Wait;
	};
	var Wait_Max = 360
	var Wait_Min = 180 
	this.Wait_Max = Wait > 360 ? 360 : Wait;
	this.Wait_Min = Wait < 180 ? 180 : Wait;
	if (this.isEnemy()) {
		if (this._waitCount >= 0) {
			this._waitCount--;
		} else {
			this.EnemyDistanceendDirection();
			this._waitCount = Wait;
 		};
	};
};
//Reconhecendo o inimigo.
Game_Event.prototype.isEnemy = function() {
	return $dataMap.events[this._eventId].meta.enemy;
};
//Inimigo morre ao Hp se torna menor ou igual a 0.
var EnemyABS_EnemyDeath = Game_Event.prototype.EnemyDeath;
Game_Event.prototype.EnemyDeath = function() {
	EnemyABS_EnemyDeath.call(this);
	if (this.isEnemy()) {
		if (this._eventEnemyHp <= 0) this.erase();
	};
};
//Verificando HP atual do inimigo.
Game_Event.prototype.EnemyHP = function() {
    if (this.isEnemy()) {
        var _eventEnemyHp = this._hp;
        this._eventEnemyHp *= 100;
        this._eventEnemyHp /= this._eventEnemyMHp;
        return this._eventEnemyHp;
    };
};
//Verificando MP atual do inimigo.
Game_Event.prototype.EnemyMP = function() {
    if (this.isEnemy()) {
        var _eventEnemyMp = this._mp;
        this._eventEnemyMp *= 100;
        this._eventEnemyMp /= this._eventEnemyMMp;
        return this._eventEnemyMp;
    };
};
//Verificando a distancia e a direcao do evento em relacao ao player.
Game_Event.prototype.EnemyDistanceendDirection = function() {
	if (!this.isEnemy()) {
		return;
	};
	switch (this.direction()) {
		case 2: if (this.y >= $gamePlayer.y) { return }; break;
  		case 4: if (this.x <= $gamePlayer.x) { return }; break;
  		case 6: if (this.x >= $gamePlayer.x) { return }; break;
  		case 8: if (this.y <= $gamePlayer.y) { return }; break;
	};
	var distance = $gameMap.distance(
		$gamePlayer.x, $gamePlayer.y, this.x, this.y
	);
	if (distance < 2) {
		this.EnemyPhysicalAttack();
	};
};
//Movimentacao do evento.
var EnemyABS_updateSelfMovement = Game_Event.prototype.updateSelfMovement;
Game_Event.prototype.updateSelfMovement = function() {
	EnemyABS_updateSelfMovement.call(this);
	if (!this.isEnemy()) {
		return;
	};
	if (this.isNearThePlayer()) {
		this.moveTowardPlayer();
    } else {
        this.moveRandom();
	};
};
//Proximidade entre evento e Player.
var EnemyABS_isNearThePlayer = Game_Event.prototype.isNearThePlayer;
Game_Event.prototype.isNearThePlayer = function() {
	if (!this.isEnemy()) {
		return EnemyABS_isNearThePlayer.apply(this, arguments);
	};
    var sx = Math.abs(this.deltaXFrom($gamePlayer.x));
    var sy = Math.abs(this.deltaYFrom($gamePlayer.y));
    return sx + sy < 5;
};
//Animacoes de ataque do Evento.
Game_Event.prototype.EnemyPhysicalAttack = function() {
	if (this.isEnemy()) {
	    for (var i = 0; i < this._eventEnemyActions.length; i++) {
       		$gamePlayer.requestAnimation(this._eventEnemyActions[i].skillId);
       		$gameParty.leader().hp -= this._eventEnemyAtk;
       		console.log($gameParty.leader().hp)
       		console.log(this._eventEnemyAtk)
       		return $gameParty.leader().hp;
		};
	};
};

Se alguem puder me socorrer ta complicado pra mim kkk não achei que ia chegar ao ponto de travar como travei.
 
Não consegue destrinchar aonde você está com problemas hahah? É que pelo objeto inteiro é complicado eu conseguir te ajudar muito. Tentou fazer testes unitários nas funções? Para saber separadamente se cada função faz oque você quer?

Ex: eu testei aqui funciona, mas não sei o que é para não funcionar
 
Raizen comentou:
Não consegue destrinchar aonde você está com problemas hahah? É que pelo objeto inteiro é complicado eu conseguir te ajudar muito. Tentou fazer testes unitários nas funções? Para saber separadamente se cada função faz oque você quer?

Sim sim testei na parte final esta printando os valores da vida e atk sem redução como se estivesse em loop infinito, nao esta contabilizando como no ruby...
e não sei como fazer printar os valores na tela da forma correta...

exemplo:  10hp-5atk deveria ser 5hp porem ta dando 10hp não subtrai >  <

acho que talvez por eu ter usado o for mais não sei se errei em usar ele sinceramente eu mesmo fiquei com duvida ao usar ele pois ele serve pra loop, pela função sempre repetir achei que seria certo por ele ali....
 
Andei pesquisando sobre conversão do Script e acabei encontrando um tal de Opal...
[member=1152]Hudell[/member] até comentou sobre em um dos posts sobre o mesmo e sobre uma possível incompatibilidade
Entre o Rgss2 e Rgss3 que realmente existe! Boa parte do código deu erro!

Alguém pode dar uma ajuda?
 
Voltar
Topo Inferior