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

Game_Punish

Iniciado por Corvo, 18/01/2020 às 12:54

18/01/2020 às 12:54 Última edição: 18/01/2020 às 12:57 por Corvo
Game_Punish


Este código altera alguns pontos do jogo quando o arquivo executável está presente na pasta. Serve para sacanear meliantes que, após a distribuição final do projeto, vão lá alterar o banco de dados pra ter vida fácil. O objetivo, claro, não é impedir que o usuário jogue e implodir sua casa. Ele pode abrir o jogo, deletar este código e prosseguir normalmente. É só uma brincadeira com os desavisados. Somente instale em seu projeto após tê-lo concluído! Você não conseguirá realizar testes com o código em uso.

#==============================================================================
# ** Game_Punish
#------------------------------------------------------------------------------
#  This module manages small changes to be executed when the game is opened in
# test mode and / or after its distribution. Install only after the development
# step, when your project is distributed as a complete game.
#------------------------------------------------------------------------------
# Version 1.0.0
#------------------------------------------------------------------------------
# Use is free for developers registered in centrorpg.com
#==============================================================================

module Game_Punish

  # Checks whether the editable file has been included in the folder.
  EXEC = File.file?("Game.rvproj2")
  # Text that will replace all dialogues if the game has been violated:
  MESSAGE = "Something is wrong."
  # Text to be shown in the menus.
  ERROR_WORD = "xxx"
  # Character parameters to lock:
  PARAMETERS = [0, 1, 2, 3, 4, 5, 6, 7]
  # CAUTION! If this option is enabled, the game will delete the editable file.
  CORRECTION = false
  
end
 
#==============================================================================
# ** Game_Party
#------------------------------------------------------------------------------
#  This class handles parties. Information such as gold and items is included.
# Instances of this class are referenced by $game_party.
#==============================================================================

class Game_Party < Game_Unit
  #--------------------------------------------------------------------------
  # * Unequip All
  #--------------------------------------------------------------------------
  def unequip_all
    members.each do |i|
     i.equip_slots.each do |j|
       i.change_equip(j, nil)
     end
    end
  end
end
#==============================================================================
# ** Game_Message
#------------------------------------------------------------------------------
#  This class handles the state of the message window that displays text or
# selections, etc. The instance of this class is referenced by $game_message.
#==============================================================================

class Game_Message
  #--------------------------------------------------------------------------
  # * Add Text
  #--------------------------------------------------------------------------
  def add(text)
    if Game_Punish::EXEC
      @texts.push(Game_Punish::MESSAGE)
    else
      @texts.push(text)
    end
  end
end

#==============================================================================
# ** Scene_Base
#------------------------------------------------------------------------------
#  This is a super class of all scenes within the game.
#==============================================================================

class Scene_Base
  #--------------------------------------------------------------------------
  # * Correction
  #--------------------------------------------------------------------------
  def correction
    File.delete("Game.rvproj2") if File.exist?("Game.rvproj2")
  end
  #--------------------------------------------------------------------------
  # * Punish
  #--------------------------------------------------------------------------
  def punish
    $game_party.members.each { |actor| actor.change_level(1, false) }
    $game_party.unequip_all
    $game_party.lose_gold($game_party.gold)
    for i in Game_Punish::PARAMETERS
      $game_party.members.each { |actor| actor.add_param(i, -99) }
    end
    if Game_Punish::CORRECTION
      correction
    end
  end
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    if Game_Punish::EXEC
      punish
    end
    update_basic
  end
end

#==============================================================================
# ** Vocab
#------------------------------------------------------------------------------
#  This module defines terms and messages. It defines some data as constant
# variables. Terms in the database are obtained from $data_system.
#==============================================================================

module Vocab
  if Game_Punish::EXEC
    # Shop Screen
    ShopBuy         = Game_Punish::ERROR_WORD
    ShopSell        = Game_Punish::ERROR_WORD
    ShopCancel      = Game_Punish::ERROR_WORD
    Possession      = Game_Punish::ERROR_WORD
    # Status Screen
    ExpTotal        = Game_Punish::ERROR_WORD
    ExpNext         = Game_Punish::ERROR_WORD
    # Save/Load Screen
    SaveMessage     = Game_Punish::ERROR_WORD
    LoadMessage     = Game_Punish::ERROR_WORD
    File            = Game_Punish::ERROR_WORD
    # Display when there are multiple members
    PartyName       = Game_Punish::ERROR_WORD
    # Basic Battle Messages
    Emerge          = Game_Punish::ERROR_WORD
    Preemptive      = Game_Punish::ERROR_WORD
    Surprise        = Game_Punish::ERROR_WORD
    EscapeStart     = Game_Punish::ERROR_WORD
    EscapeFailure   = Game_Punish::ERROR_WORD
    # Battle Ending Messages
    Victory         = Game_Punish::ERROR_WORD
    Defeat          = Game_Punish::ERROR_WORD
    ObtainExp       = Game_Punish::ERROR_WORD
    ObtainGold      = Game_Punish::ERROR_WORD
    ObtainItem      = Game_Punish::ERROR_WORD
    LevelUp         = Game_Punish::ERROR_WORD
    ObtainSkill     = Game_Punish::ERROR_WORD
    # Use Item
    UseItem         = Game_Punish::ERROR_WORD
    # Critical Hit
    CriticalToEnemy = Game_Punish::ERROR_WORD
    CriticalToActor = Game_Punish::ERROR_WORD
    # Results for Actions on Actors
    ActorDamage     = Game_Punish::ERROR_WORD
    ActorRecovery   = Game_Punish::ERROR_WORD
    ActorGain       = Game_Punish::ERROR_WORD
    ActorLoss       = Game_Punish::ERROR_WORD
    ActorDrain      = Game_Punish::ERROR_WORD
    ActorNoDamage   = Game_Punish::ERROR_WORD
    ActorNoHit      = Game_Punish::ERROR_WORD
    # Results for Actions on Enemies
    EnemyDamage     = Game_Punish::ERROR_WORD
    EnemyRecovery   = Game_Punish::ERROR_WORD
    EnemyGain       = Game_Punish::ERROR_WORD
    EnemyLoss       = Game_Punish::ERROR_WORD
    EnemyDrain      = Game_Punish::ERROR_WORD
    EnemyNoDamage   = Game_Punish::ERROR_WORD
    EnemyNoHit      = Game_Punish::ERROR_WORD
    # Evasion/Reflection
    Evasion         = Game_Punish::ERROR_WORD
    MagicEvasion    = Game_Punish::ERROR_WORD
    MagicReflection = Game_Punish::ERROR_WORD
    CounterAttack   = Game_Punish::ERROR_WORD
    Substitute      = Game_Punish::ERROR_WORD
    # Buff/Debuff
    BuffAdd         = Game_Punish::ERROR_WORD
    DebuffAdd       = Game_Punish::ERROR_WORD
    BuffRemove      = Game_Punish::ERROR_WORD
    # Skill or Item Had No Effect
    ActionFailure   = Game_Punish::ERROR_WORD
    # Error Message
    PlayerPosError  = Game_Punish::ERROR_WORD
    EventOverflow   = Game_Punish::ERROR_WORD

    # Basic Status
    def self.basic(basic_id)
      Game_Punish::ERROR_WORD
    end

    # Parameters
    def self.param(param_id)
      return Game_Punish::ERROR_WORD
      $data_system.terms.params[param_id]
    end

    # Equip Type
    def self.etype(etype_id)
      return Game_Punish::ERROR_WORD
      $data_system.terms.etypes[etype_id]
    end

    # Commands
    def self.command(command_id)
      return Game_Punish::ERROR_WORD
      $data_system.terms.commands[command_id]
    end

    # Currency Unit
    def self.currency_unit
      return Game_Punish::ERROR_WORD
      $data_system.currency_unit
    end
  end
end




Este script irá alterar os seguintes pontos:

  • Todos os diálogos do jogo serão substituídos por uma mensagem pré-configurada.
  • Todos os termos da interface serão alterados para uma palvra também configurada previamente.
  • Não será possível evoluir os personagens ou seus parâmetros.
  • Não será possível manter itens equipados.
  • Não será possível manter moedas no inventário.
  • É possível permitir que o código apague o arquivo executável por si mesmo.



O uso é livre para todos os membros registrados em centrorpg.com.

Só podia ser coisa do temível Corvo, eu adorei a ideia kkkk
na epoca do VX e VX Ace eu costumava alterar formato de alguns arquivos da pasta data para .dll, alterar localizações de graficos, alterar o ini e etc, fazendo assim ser impossível rodar no programa mesmo sendo desencriptado kkkkkk so ia funcionar com quem não conhecesse bem os arquivos internos do game (quase 100% kkkkk)
Enfim uma grande ideia
Clique e conheça o meu canal - Canal RPG Maker Zone

Agora os meliantes irão tomar de seu próprio veneno.  :fawkes:
Obrigado por disponibilizar, Corvo!
^~^) -Rhyan.

Acho que vale a pena avisar que precisa apagar o Game.rvproj2 da pasta do jogo antes de distribuir também aehuhaeuhe

Uma sugestão: além/ao invés de verificar o rvproj2, verificar a data de modificação dos arquivos .rvdata2 usando File.mtime. Dá pra fazer isso comparando por exemplo com a data de um arquivo oculto e mocozado em alguma pasta do jogo (Audio, Graphics, System, sei lá), basta gerar o arquivo na primeira vez que o jogo é executado. Dá pra esconder o arquivo com a função SetFileAttributes:

SetFileAttributes = Win32API.new('Kernel32', 'SetFileAttributesA', 'pl', 'i')
FILE_ATTRIBUTE_HIDDEN = 0x2

# Exemplo
File.write('System/.timestamp', '')
SetFileAttributes.call('System/.timestamp', FILE_ATTRIBUTE_HIDDEN)


Uma outra ideia, dessa vez pra evitar o cara apagar o script: crie um script que "instala" o script no projeto, inserindo ele no meio de vários scripts padrão, de preferência de forma ofuscada (vou tentar adaptar meu documentador pra ofuscar código e te dou um toque) e com redundâncias.
~ Masked

Obrigado, pessoal. o/

Citação de: Brandt online 21/01/2020 às 21:35
Acho que vale a pena avisar que precisa apagar o Game.rvproj2 da pasta do jogo antes de distribuir também aehuhaeuhe
[...]

Achei que não precisasse haha.  :top:
Boas sugestões. Inicialmente eu iria jogar dentro da Audio/SE como arquivo .ogg mesmo, bem camuflado, mas não havia pensado em esconder. Para ser honesto, nem eu vou usar este código. Há meios mais inteligentes de sacanear o jogador durante o projeto, deixando-o brincar como se nada estivesse acontecendo. O impacto disso aqui é muito bruto, perceptível demais para ter graça. ._.

Fique à vontade para editar, se quiser.