scr_poke.c

  #include <stdio.h>
#include <dos.h>
#define VIDEO 0xB800   // CGA base

void main(void)
 {
   FILE *fp;  
   int offset;
   char value;  

   if ((fp = fopen("SAVE_SCR.DAT", "rb")) == NULL)
     printf("Error opening file/n");
   else
    {
      for (offset = 0; offset < 8000; offset++)
       {
         fscanf(fp, "%c", &value);
         pokeb(VIDEO, offset, value);
       }
      fclose(fp);
    }
 }

######################################################### ### Encounter list UI ### ### 取消概率显示 + 仅保留基础信息版本 ### ######################################################### # 界面配置 BACKGROUND_ALPHA = 220 # 背景透明度 TEXT_LEFT_MARGIN = 20 # 文本左边距 TEXT_ROW_SPACING = 25 # 行间距 FONT_SIZE = 24 # 字体大小 TITLE_COLOR = Color.new(255, 255, 0) # 标题黄色 CONTENT_COLOR = Color.new(255, 255, 255)# 内容白色 EMPTY_COLOR = Color.new(255, 100, 100) # 无数据浅红 # 自定义遇敌类型名称 USER_DEFINED_NAMES = { :Land => "草地", :LandDay => "草地 (day)", :LandNight => "草地 (night)", :LandMorning => "草地 (morning)", :Cave => "洞穴", :Water => "冲浪", :OldRod => "钓鱼 (旧)", :GoodRod => "钓鱼 (好)", :SuperRod => "钓鱼 (超级)", :RockSmash => "碎岩" } # 遇敌类型ID映射 module EncounterTypes Names = { 0 => :Land, 1 => :LandDay, 2 => :LandNight, 3 => :LandMorning, 4 => :LandEvening, 7 => :Cave, 8 => :CaveWater, 13 => :Water, 14 => :WaterRock, 19 => :OldRod, 20 => :GoodRod, 21 => :SuperRod, 22 => :RockSmash } unless const_defined?(:Names) end class EncounterList_Scene def initialize @viewport = Viewport.new(0, 0, Graphics.width, Graphics.height) @viewport.z = 99999 @sprites = {} @index = 0 @map_id = $game_map.map_id @encounter_tables = load_actual_encounter_data end # 加载遇敌数据(仅提取基础信息) def load_actual_encounter_data data = {} begin manager = PokemonEncounters.new manager.setup(@map_id) raw = manager.instance_variable_get(:@enctypes) || manager.instance_variable_get(:@encounters) || manager.instance_variable_get(:@data) || manager.instance_variable_get(:@encounter_table) || [] if raw.is_a?(Array) raw.each_with_index do |entries, type_id| next unless entries.is_a?(Array) next if entries.empty? type_key = EncounterTypes::Names[type_id] || "Type_#{type_id}" # 仅过滤有效的数组条目(至少包含ID和等级) valid_entries = entries.select { |e| e.is_a?(Array) && e.size >= 2 } data[type_key.to_sym] = valid_entries unless valid_entries.empty? end end rescue => e @load_error = e.message end data end # 创建文本精灵 def create_text_sprites @sprites[:title] = Sprite.new(@viewport) @sprites[:title].bitmap = Bitmap.new(Graphics.width - 2*TEXT_LEFT_MARGIN, 30) @sprites[:title].x = TEXT_LEFT_MARGIN @sprites[:title].y = 20 @sprites[:title].z = 100000 @sprites[:empty] = Sprite.new(@viewport) @sprites[:empty].bitmap = Bitmap.new(Graphics.width - 2*TEXT_LEFT_MARGIN, 60) @sprites[:empty].x = TEXT_LEFT_MARGIN @sprites[:empty].y = Graphics.height / 2 - 30 @sprites[:empty].z = 100000 @sprites[:empty].visible = false @sprites[:bg] = Sprite.new(@viewport) @sprites[:bg].bitmap = Bitmap.new(Graphics.width, Graphics.height) @sprites[:bg].bitmap.fill_rect(0, 0, Graphics.width, Graphics.height, Color.new(0, 0, 0, BACKGROUND_ALPHA)) end def pbStartScene create_text_sprites draw_encounter_list pbFadeInAndShow(@sprites) { pbUpdate } end # 交互逻辑 def pbEncounter type_count = @encounter_tables.keys.size loop do Graphics.update Input.update pbUpdate if Input.trigger?(Input::RIGHT) && type_count > 1 && @index < type_count - 1 @index += 1 draw_encounter_list elsif Input.trigger?(Input::LEFT) && type_count > 1 && @index > 0 @index -= 1 draw_encounter_list elsif Input.trigger?(Input::B) break end end end # 绘制遇敌列表(移除概率相关逻辑) def draw_encounter_list # 清除之前的内容精灵 @sprites.each_key do |key| key_str = key.to_s if key_str =~ /^poke_/ @sprites[key].dispose @sprites.delete(key) end end type_count = @encounter_tables.keys.size current_type = @encounter_tables.keys[@index] raw_list = current_type ? @encounter_tables[current_type] : [] # 去重(保留唯一ID) unique_list = [] seen_ids = {} raw_list.each do |entry| next if entry.size < 1 # 至少需要ID species_id = entry[0] unless seen_ids.key?(species_id) seen_ids[species_id] = true unique_list << entry end end # 无数据处理 if unique_list.empty? error_msg = @load_error ? "Load error: #{@load_error}" : "此地图没有宝可梦" draw_text(@sprites[:empty].bitmap, error_msg, EMPTY_COLOR) @sprites[:empty].visible = true return end # 绘制标题(移除概率相关描述) map_name = $game_map.name || "Unknown" type_name = USER_DEFINED_NAMES[current_type] || current_type.to_s draw_text(@sprites[:title].bitmap, "#{map_name} | #{type_name} ", TITLE_COLOR) # 绘制宝可梦数据(仅显示ID、名称、等级范围) unique_list.each_with_index do |entry, i| species_id = entry[0] || "?" min_lv = entry.size >= 2 ? entry[1].to_i : 1 # 最小等级(默认1) max_lv = entry.size >= 3 ? entry[2].to_i : min_lv # 最大等级(默认同最小) # 获取宝可梦名称(容错处理) name = PBSpecies.getName(species_id) rescue "ID:#{species_id}" # 创建显示精灵 @sprites[:"poke_#{i}"] = Sprite.new(@viewport) @sprites[:"poke_#{i}"].bitmap = Bitmap.new(Graphics.width - 2*TEXT_LEFT_MARGIN, 25) @sprites[:"poke_#{i}"].x = TEXT_LEFT_MARGIN @sprites[:"poke_#{i}"].y = 60 + i*TEXT_ROW_SPACING @sprites[:"poke_#{i}"].z = 100000 @sprites[:"poke_#{i}"].visible = true # 文本内容(移除概率部分) text = "ID:#{species_id} #{name} Lv.#{min_lv}-#{max_lv}" draw_text(@sprites[:"poke_#{i}"].bitmap, text, CONTENT_COLOR) end end # 绘制文本 def draw_text(bitmap, text, color) bitmap.clear font = bitmap.font font.size = FONT_SIZE font.color = color font.bold = (color == TITLE_COLOR) bitmap.draw_text(0, 0, bitmap.width, bitmap.height, text, 0) end def pbUpdate pbUpdateSpriteHash(@sprites) end def pbEndScene pbFadeOutAndHide(@sprites) { pbUpdate } pbDisposeSpriteHash(@sprites) @viewport.dispose end end class EncounterList_Screen def initialize(scene) @scene = scene end def pbStartScreen @scene.pbStartScene @scene.pbEncounter @scene.pbEndScene end end def pbViewEncounters return unless $game_map scene = EncounterList_Scene.new screen = EncounterList_Screen.new(scene) screen.pbStartScreen end结合代码添加新功能,根据地图遭遇循环遇敌
最新发布
10-31
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值