小ネタ

 今までに日記等で出していた小ネタのログ。
使いたい人はどうぞ使ってやって下さい。
ただ、PHPのコメントは今の所書かれていませんので、あしからず。

汎用的な対数の取得(Ruby)

#==============================================================================
# ■ Math
#==============================================================================
module Math
  # クラスメソッド宣言
  class << self
    #--------------------------------------------------------------------------
    # ● 汎用的な対数取得
    #--------------------------------------------------------------------------
    alias :natural_log :log
    def log(x, exp)
      return Math.log10(x) / Math.log10(exp)
    end
  end
  #--------------------------------------------------------------------------
  # ● 汎用的な対数取得
  #--------------------------------------------------------------------------
  alias :natural_log :log
  def log(x, exp)
    return Math.log10(x) / Math.log10(exp)
  end
end

汎用的な対数の取得(PHP)

function general_log(x, exp){
  return(log10(x) / log10(exp));
}

エネミーレベルの設定(RGSS)

#==============================================================================
# ■ Game_Enemy
#==============================================================================
class Game_Enemy < Game_Battler
  #--------------------------------------------------------------------------
  # ● 名前の取得
  #--------------------------------------------------------------------------
  def name
    base = $data_enemies[@enemy_id].name
    return base.sub!(/\s*lv\d+/i){""}
  end
  #--------------------------------------------------------------------------
  # ● レベルの取得
  #--------------------------------------------------------------------------
  def level
    base = $data_enemies[@enemy_id].name[/lv(\d+)/i]
    return (base.nil? ? 1 : $1.to_i)
  end
end

Melt・メニューからロード画面を呼び出す(RGSS)

#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map
  #--------------------------------------------------------------------------
  # ● メニューの呼び出し
  #--------------------------------------------------------------------------
  def call_menu
    # メニュー SE 演奏フラグがセットされている場合
    if $game_temp.menu_beep
      # 決定 SE を演奏
      $game_system.se_play($data_system.decision_se)
      # メニュー SE 演奏フラグをクリア
      $game_temp.menu_beep = false
    end
    # プレイヤーの姿勢を矯正
    $game_player.straighten
    # メニュー画面に切り替え
    $scene = Scene_Menu.new
  end
end

#==============================================================================
# ■ Scene_Menu
#==============================================================================
class Scene_Menu
  #--------------------------------------------------------------------------
  # ● フレーム更新 (コマンドウィンドウがアクティブの場合)
  #--------------------------------------------------------------------------
  alias :melt_update_command :update_command
  def update_command
    # B ボタンが押された場合
    if Input.trigger?(Input::B)
      # キャンセル SE を演奏
      $game_system.se_play($data_system.cancel_se)
      # メニュー呼び出しフラグをクリア
      $game_temp.menu_calling = false
      # 
      @windows.each{|window| window.slideout! }
      @slideout_count = 8
      @slideout_next_scene = Scene_Map
      $game_temp.menu_index = 0
      return
    end
    melt_update_command
  end
end

#==============================================================================
# ■ Scene_Load
#==============================================================================
class Scene_Load < Scene_File
  #--------------------------------------------------------------------------
  # ● キャンセル時の処理
  #--------------------------------------------------------------------------
  def on_cancel
    # キャンセル SE を演奏
    $game_system.se_play($data_system.cancel_se)
    if $game_temp.menu_calling
      # メニュー画面に切り替え
      $scene = Scene_Menu.new(XRXS_MeLT.commands.index($scene.class))
    else
      # タイトル画面に切り替え
      $scene = Scene_Title.new
    end
  end
end

名前からスイッチや変数を操作する(RGSS)

#==============================================================================
# ■ Game_Switches
#==============================================================================
class Game_Switches
  #--------------------------------------------------------------------------
  # ● スイッチの取得
  #     switch    : スイッチ ID
  #--------------------------------------------------------------------------
  alias :base_r :[]
  def [](switch)
    if  switch.is_a?(Numeric)
      return base_r(switch)
    elsif switch.is_a?(String)
      # 同名のスイッチが複数ある場合、一番若い番号の値を返す
      if $data_system.switches.index(switch) != nil
        return @data[$data_system.switches.index(switch)]
      else
        return false
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● スイッチの設定
  #     switch    : スイッチ ID
  #     value     : ON (true) / OFF (false)
  #--------------------------------------------------------------------------
  alias :base_w :[]=
  def []=(switch, value)
    if switch.is_a?(Numeric)
      base_w(switch, value)
    elsif switch.is_a?(String)
      # 同名のスイッチが複数ある場合、一番若い番号を書き換える
      if $data_system.switches.index(switch) != nil
        @data[$data_system.switches.index(switch)] = value
      end
    end
  end
end

#==============================================================================
# ■ Game_Variables
#==============================================================================
class Game_Variables
  #--------------------------------------------------------------------------
  # ● 変数の取得
  #     variable    : 変数 ID
  #--------------------------------------------------------------------------
  alias :base_r :[]
  def [](variable)
    if variable_a?(Numeric)
      return base_r(variable)
    elsif variable_a?(String)
      # 同名のスイッチが複数ある場合、一番若い番号の値を返す
      if $data_system.variables.index(variable) != nil
        return @data[$data_system.variables.index(variable)]
      else
        return 0
      end
    else
      return 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 変数の設定
  #     variable    : 変数 ID
  #     value       : 変数の値
  #--------------------------------------------------------------------------
  alias :base_w :[]=
  def []=(variable, value)
    if variable_a?(Numeric)
      return base_w(variable, value)
    elsif variable_a?(String)
      # 同名のスイッチが複数ある場合、一番若い番号を書き換える
      if $data_system.variables.index(variable) != nil
        @data[$data_system.variables.index(variable)] = value
      end
    end
  end
end

ピクチャのZ座標を変換する(RGSS)

#==============================================================================
# ■ Spriteset_Map
#==============================================================================

class Spriteset_Map
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    # ビューポートを作成
    @viewport1 = Viewport.new(0, 0, 640, 480)
    @viewport2 = Viewport.new(0, 0, 640, 480)
    @viewport3 = Viewport.new(0, 0, 640, 480)
    @viewport2.z = 200
    @viewport3.z = 5000
    # タイルマップを作成
    @tilemap = Tilemap.new(@viewport1)
    @tilemap.tileset = RPG::Cache.tileset($game_map.tileset_name)
    for i in 0..6
      autotile_name = $game_map.autotile_names[i]
      @tilemap.autotiles[i] = RPG::Cache.autotile(autotile_name)
    end
    @tilemap.map_data = $game_map.data
    @tilemap.priorities = $game_map.priorities
    # パノラマプレーンを作成
    @panorama = Plane.new(@viewport1)
    @panorama.z = -1000
    # フォグプレーンを作成
    @fog = Plane.new(@viewport1)
    @fog.z = 3000
    # キャラクタースプライトを作成
    @character_sprites = []
    for i in $game_map.events.keys.sort
      sprite = Sprite_Character.new(@viewport1, $game_map.events[i])
      @character_sprites.push(sprite)
    end
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    # 天候を作成
    @weather = RPG::Weather.new(@viewport1)
    # ピクチャを作成
    @picture_sprites = []
    for i in 1..50
      @picture_sprites.push(Sprite_Picture.new(@viewport1,
        $game_screen.pictures[i]))
    end
    # タイマースプライトを作成
    @timer_sprite = Sprite_Timer.new
    # フレーム更新
    update
  end
end

#==============================================================================
# ■ Sprite_Picture
#==============================================================================

class Sprite_Picture < Sprite
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    # ピクチャのファイル名が現在のものと異なる場合
    if @picture_name != @picture.name
      # ファイル名をインスタンス変数に記憶
      @picture_name = @picture.name
      # ファイル名が空でない場合
      if @picture_name != ""
        # ピクチャグラフィックを取得
        self.bitmap = RPG::Cache.picture(@picture_name)
      end
    end
    # ファイル名が空の場合
    if @picture_name == ""
      # スプライトを不可視に設定
      self.visible = false
      return
    end
    # スプライトを可視に設定
    self.visible = true
    # 転送元原点を設定
    if @picture.origin == 0
      self.ox = 0
      self.oy = 0
    else
      self.ox = self.bitmap.width / 2
      self.oy = self.bitmap.height / 2
    end
    # スプライトの座標を設定
    self.x = @picture.x
    self.y = @picture.y
    # (何か@Z座標.拡張子)というファイル名を使用します
    temp_z = @picture_name[/@(-?\d+)\.(png|jpg|jpeg)/]
    if temp_z.nil?
      self.z = $1.to_i
    else
      self.z = 500 + @picture.number
    end
    # 拡大率、不透明度、ブレンド方法を設定
    self.zoom_x = @picture.zoom_x / 100.0
    self.zoom_y = @picture.zoom_y / 100.0
    self.opacity = @picture.opacity
    self.blend_type = @picture.blend_type
    # 回転角度、色調を設定
    self.angle = @picture.angle
    self.tone = @picture.tone
  end
end

Interpreterからイベントを参照(RGSS)

#==============================================================================
# ■ Game_CommonEvent
#==============================================================================
class Game_CommonEvent
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    # 並列処理が有効の場合
    if @interpreter != nil
      # 実行中でなければセットアップ
      unless @interpreter.running?
        @interpreter.setup(self.list, nil)
      end
      # インタプリタを更新
      @interpreter.update
    end
  end
end

#==============================================================================
# ■ Game_Event
#==============================================================================
class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    # 自動実行イベントの起動判定
    check_event_trigger_auto
    # 並列処理が有効の場合
    if @interpreter != nil
      # 実行中でない場合
      unless @interpreter.running?
        # イベントをセットアップ
        @interpreter.setup(@list, self)
      end
      # インタプリタを更新
      @interpreter.update
    end
  end
end

#==============================================================================
# ■ Interpreter 
#==============================================================================

class Interpreter
  #--------------------------------------------------------------------------
  # ● クリア
  #--------------------------------------------------------------------------
  alias :base_clear :clear
  def clear
    # 呼び戻す
    base_clear
    # イベントをセット
    @event = nil
  end
  #--------------------------------------------------------------------------
  # ● イベントのセットアップ
  #     list     : 実行内容
  #     event_id : イベント
  #--------------------------------------------------------------------------
  def setup(list, event)
    # インタプリタの内部状態をクリア
    clear
    # マップ ID を記憶
    @map_id = $game_map.map_id
    # イベントを記憶
    @event = event
    @event_id = (@event == nil ? 0 : event.id)
    # 実行内容を記憶
    @list = list
    # インデックスを初期化
    @index = 0
    # 分岐データ用のハッシュをクリア
    @branch.clear
  end
  #--------------------------------------------------------------------------
  # ● 起動中イベントのセットアップ
  #--------------------------------------------------------------------------
  def setup_starting_event
    # 必要ならマップをリフレッシュ
    if $game_map.need_refresh
      $game_map.refresh
    end
    # コモンイベントの呼び出しが予約されている場合
    if $game_temp.common_event_id > 0
      # イベントをセットアップ
      setup($data_common_events[$game_temp.common_event_id].list, nil)
      # 予約を解除
      $game_temp.common_event_id = 0
      return
    end
    # ループ (マップイベント)
    for event in $game_map.events.values
      # 起動中のイベントが見つかった場合
      if event.starting
        # 自動実行でなければ
        if event.trigger < 3
          # 起動中フラグをクリア
          event.clear_starting
          # ロック
          event.lock
        end
        # イベントをセットアップ
        setup(event.list, event.id)
        return
      end
    end
    # ループ (コモンイベント)
    for common_event in $data_common_events.compact
      # トリガーが自動実行かつ条件スイッチが ON の場合
      if common_event.trigger == 1 and
         $game_switches[common_event.switch_id] == true
        # イベントをセットアップ
        setup(common_event.list, nil)
        return
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● コモンイベント
  #--------------------------------------------------------------------------
  def command_117
    # コモンイベントを取得
    common_event = $data_common_events[@parameters[0]]
    # コモンイベントが有効の場合
    if common_event != nil
      # 子インタプリタを作成
      @child_interpreter = Interpreter.new(@depth + 1)
      @child_interpreter.setup(common_event.list, @event)
    end
    # 継続
    return true
  end
end

#==============================================================================
# ■ Scene_Battle
#==============================================================================

class Scene_Battle
  #--------------------------------------------------------------------------
  # ● バトルイベントのセットアップ
  #--------------------------------------------------------------------------
  def setup_battle_event
    # バトルイベント実行中の場合
    if $game_system.battle_interpreter.running?
      return
    end
    # バトルイベントの全ページを検索
    for index in 0...$data_troops[@troop_id].pages.size
      # イベントページを取得
      page = $data_troops[@troop_id].pages[index]
      # イベント条件を c で参照可能に
      c = page.condition
      # 何も条件が指定されていない場合は次のページへ
      unless c.turn_valid or c.enemy_valid or c.actor_valid or c.switch_valid
        next
      end
      # 実行済みの場合は次のページへ
      if $game_temp.battle_event_flags[index]
        next
      end
      # ターン 条件確認
      if c.turn_valid
        n = $game_temp.battle_turn
        a = c.turn_a
        b = c.turn_b
        if (b == 0 and n != a) or
           (b > 0 and (n < 1 or n < a or n % b != a % b))
          next
        end
      end
      # エネミー 条件確認
      if c.enemy_valid
        enemy = $game_troop.enemies[c.enemy_index]
        if enemy == nil or enemy.hp * 100.0 / enemy.maxhp > c.enemy_hp
          next
        end
      end
      # アクター 条件確認
      if c.actor_valid
        actor = $game_actors[c.actor_id]
        if actor == nil or actor.hp * 100.0 / actor.maxhp > c.actor_hp
          next
        end
      end
      # スイッチ 条件確認
      if c.switch_valid
        if $game_switches[c.switch_id] == false
          next
        end
      end
      # イベントをセットアップ
      $game_system.battle_interpreter.setup(page.list, nil)
      # このページのスパンが [バトル] か [ターン] の場合
      if page.span <= 1
        # 実行済みフラグをセット
        $game_temp.battle_event_flags[index] = true
      end
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新 (メインフェーズ ステップ 6 : リフレッシュ)
  #--------------------------------------------------------------------------
  def update_phase4_step6
    # アクション強制対象のバトラーをクリア
    $game_temp.forcing_battler = nil
    # コモンイベント ID が有効の場合
    if @common_event_id > 0
      # イベントをセットアップ
      common_event = $data_common_events[@common_event_id]
      $game_system.battle_interpreter.setup(common_event.list, nil)
    end
    # ステップ 1 に移行
    @phase4_step = 1
  end
end

画像の大きさを取得(Ruby)

#==============================================================================
# ■ File
#==============================================================================
class File
  #--------------------------------------------------------------------------
  # ● 画像の大きさの取得
  #--------------------------------------------------------------------------
  def size
    # 現在のファイルポインタを保存し、ファイルポインタを先頭に戻す
    point = self.pos
    self.rewind
    # オブジェクトが画像ファイルの場合
    if self.path =~ /(png|gif|jpeg|jpg)/i
      # 拡張子別に動作を分ける
      case $1.downcase
      # 拡張子が png の場合
      when "png"
        temp = self.read(4)
        # ヘッダが正しい場合
        if temp == "\x87PNG"
          # 12バイトスキップ
          self.read(12)
          # サイズを取得
          temp = self.read(8)
          result = temp.unpack("N2")
          # ファイルポインタを元に戻す
          self.seek(point)
          return result
        else
          # ファイルポインタを元に戻す
          self.seek(point)
          return
        end
      # 拡張子が gif の場合
      when "gif"
        # ヘッダの確認
        temp = self.read(6)
        # ヘッダが正しい場合
        if temp =~ /GIF8[79]a/
          # 画像の大きさを読み込む
          temp = self.read(4)
          result = temp.unpack("v2")
          # ファイルポインタを元に戻す
          self.seek(point)
          return result
        else
          # ファイルポインタを元に戻す
          self.seek(point)
          return
        end
      else # と言っても jpeg しか無いが
        temp = self.read(10)
        # ヘッダが正しい場合
        if temp == "\xff\xd8\xff\xe0\x00\x10JFIF"
          temp = self.read(8192)
          # 
          posit = temp.rindex((/\xff(\xC0|\xC2)\x00\x11\x08/) != 0
          if posit != nil
            # ファイルポインタを大きさ部分の直前に持っていく
            self.seek(posit + 5)
            # 画像の大きさを読み込む
            temp = self.read(4)
            result = temp.unpack("n2")[0]
            # ファイルポインタを元に戻す
            self.seek(point)
            return result
          else
            # ファイルポインタを元に戻す
            self.seek(point)
            return
          end
        else
          # ファイルポインタを元に戻す
          self.seek(point)
          return
        end
      end
    else
      # そのまま返す
      return
    end
  end
  #--------------------------------------------------------------------------
  # ● 画像の幅の取得
  #--------------------------------------------------------------------------
  def width
    result = self.size
    return (result.nil? ? nil : result[0])
  end
  #--------------------------------------------------------------------------
  # ● 画像の高さの取得
  #--------------------------------------------------------------------------
  def height
    result = self.size
    return (result.nil? ? nil : result[1])
  end
end

画像の大きさを取得(PHP)

if(preg_match("/\.(png|gif|jpeg|jpg)$/i", $filename, $match) != 0){
  switch(strtolower($match[1])){
  case "png":
  if($file = fopen($filename, "r")){
    if($lock_type == 1){flock($file, LOCK_SH);}
    $bytes = fread($file, 4);
    if($byte == "\x89\x50\x4E\x47"){
      $src = $filename;
      $bytes = fread($file, 12);
      $bytes = fread($file, 8);
      $temp = unpack("N2", $bytes);
      $width = $temp[0];
      $height = $temp[1];
    }
    fclose($file);
  }
  break;
  case "gif":
  if($file = fopen($filename, "r")){
    if($lock_type == 1){flock($file, LOCK_SH);}
    $bytes = fread($file, 4);
    if($byte == "GIF87a" or $byte == "GIF89a"){
      $src = $filename;
      $bytes = fread($file, 4);
      $temp = unpack("v2", $bytes);
      $width = $temp[0];
      $height = $temp[1];
    }
    fclose($file);
  }
  break;
  default:
  if($file = fopen($filename, "r")){
    if($lock_type == 1){flock($file, LOCK_SH);}
    $bytes = fread($file, 10);
    if($byte == "\xFF\xD8\xFF\xE0\x00\x10JFIF"){
      $src = $filename;
      $bytes = fread($file, 8192);
      if($pos = strripos("\xFF\xC0\x00\x11\x08", $byte) !== false){
        fseek($pos + 5, SEEK_SET);
        $bytes = fread($file, 4);
        $width = $temp[0] * 256 + $temp[1];
        $height = $temp[2] * 256 + $temp[3];
      }elseif($pos = strripos("\xFF\xC2\x00\x11\x08", $byte) !== false){
        fseek($pos + 5, SEEK_SET);
        $bytes = fread($file, 4);
        $temp = unpack("n2", $bytes)
        $width = $temp[0];
        $height = $temp[1];
      }
    }
    fclose($file);
  }
  break;
  }
}