Skip to content

space_adventure_4k.rb #337

Description

@myltik1702

#!/usr/bin/env ruby

encoding: utf-8

require 'json'
require 'colorize' # для цветной вывода (установите: gem install colorize)

class SpaceAdventure4K
SAVE_FILE = 'savegame_4k.json'
VERSION = '1.2.0'

Меню с расширенными опциями

MAIN_MENU = {
'1' => 'Проверить курс (координаты и статус)',
'2' => 'Переместиться в сектор (X Y Z)',
'3' => 'Исследовать текущий сектор',
'4' => 'Поговорить с ИИ‑помощником «Эхо‑4K»',
'5' => 'Проверить инвентарь и экипировку',
'6' => 'Сохранить игру',
'7' => 'Посетить космический рынок',
'8' => 'Выйти из игры',
'9' => 'Активировать сканер аномалий',
'10' => 'Проверить журнал миссий',
'give_credits' => '[ОТЛАДКА] Начислить 8 888 888 888 CR',
'give_all' => '[ОТЛАДКА] Получить всё: топливо, кристаллы, артефакты'
}

def initialize
load_game || reset_game
@mission_log = []
end

def reset_game
@position = { x: 0, y: 0, z: 0 }
@health = 100
@fuel = 150 # увеличено
@credits = 100 # увеличено
@Crystals = 0
@inventory = ['сканер-прототип']
@game_over = false
@sector_map = {}
@Level = 1
@target = { x: 8, y: -5, z: 4 } # дальше
@Ship = :phoenix_4k
@shield_active = false
@anomaly_level = 0 # уровень аномалий в текущем секторе
@experience = 0
end

def load_game
if File.exist?(SAVE_FILE)
data = JSON.parse(File.read(SAVE_FILE))
@position = data['position']
@health = data['health']
@fuel = data['fuel']
@credits = data['credits']
@Crystals = data['crystals'] || 0
@inventory = data['inventory']
@sector_map = data['sector_map']
@Level = data['level']
@target = data['target']
@Ship = data['ship'] || :phoenix_4k
@shield_active = data['shield_active'] || false
@anomaly_level = data['anomaly_level'] || 0
@experience = data['experience'] || 0
@mission_log = data['mission_log'] || []
puts "✅ Игра загружена! Версия #{VERSION}".green
return true
end
false
end

def save_game
data = {
position: @position,
health: @health,
fuel: @fuel,
credits: @credits,
crystals: @Crystals,
inventory: @inventory,
sector_map: @sector_map,
level: @Level,
target: @target,
ship: @Ship,
shield_active: @shield_active,
anomaly_level: @anomaly_level,
experience: @experience,
mission_log: @mission_log
}
File.write(SAVE_FILE, JSON.generate(data))
puts "💾 Игра сохранена в #{SAVE_FILE}!".blue
end

def show_status
system_info = [
"🚀 КОСМИЧЕСКИЙ СИМУЛЯТОР «ГАЛАКТИКА‑4K» v#{VERSION}",
"📍 Позиция: X=#{@position[:x]}, Y=#{@position[:y]}, Z=#{@position[:z]}",
"🎯 Цель: X=#{@target[:x]}, Y=#{@target[:y]}, Z=#{@target[:z]}",
"❤ Здоровье: #{bar(@health, 100, :red)} (#{@health}%)",
"⛽ Топливо: #{bar(@fuel, 150, :yellow)} (#{@fuel} ед.)",
"💰 Кредиты: #{@credits} CR",
"💎 Кристаллы: #{@Crystals} 🔮",
"🛡 Защита: #{@shield_active ? 'активна' : 'выкл.'}",
"🗺 Исследовано: #{@sector_map.size} секторов",
"⭐ Опыт: #{@experience} XP",
"📜 Уровень: #{@Level}",
"🧭 До цели: #{calc_distance(@position, @target).round(1)} ед."
]

puts "\n! + "═" * 60
system_info.each { |line| puts "│ #{line}".light_white }
puts "═! * 60

end

def bar(value, max, color)
filled = (value.to_f / max * 20).to_i
bar = '█' * filled + '░' * (20 - filled)
bar.colorize(color)
end

def ship_name(symbol)
{
phoenix_4k: 'Феникс‑4K (улучшенный)',
warrior_4k: 'Воин‑4K',
scout_4k: 'Скаут‑4K'
}[symbol] || 'Неизвестный корабль'
end

def calc_distance(a, b)
Math.sqrt((a[:x] - b[:x])**2 + (a[:y] - b[:y])**2 + (a[:z] - b[:z])**2)
end

def prompt
print "\n▸ ".cyan
gets.chomp.downcase
end

def display_menu
puts "\n🚀 ЧТО ВЫ ХОТИТЕ СДЕЛАТЬ?"
MAIN_MENU.each do |key, label|
puts " #{key.rjust(3)}. #{label}".light_cyan
end
end

def show_mini_map
puts "\n🗺 МИНИ‑КАРТА (область ±2 от текущей позиции)".yellow
(-2..2).each do |dz|
line = []
(-2..2).each do |dy|
(-2..2).each do |dx|
abs_x = @position[:x] + dx
abs_y = @position[:y] + dy
abs_z = @position[:z] + dz
key = "#{abs_x}-#{abs_y}-#{abs_z}"
if abs_x == @position[:x] && abs_y == @position[:y] && abs_z == @position[:z]
line << "[*]".green
elsif @sector_map[key]
line << "[.]".blue
else
line << "[...]".dark_gray
end
end
end
puts line.join(" ")
end
end

def explore_sector(pos)
key = "#{pos[:x]}-#{pos[:y]}-#{pos[:z]}"
if @sector_map[key]
puts "Этот сектор уже исследован. Данные в архиве.".yellow
return
end

puts "\n🔍 Активирую 4K‑сканеры... Анализ сектора #{key}...".cyan
sleep 0.7

event = weighted_random_event

case event
when :credit_cache
  gain = rand(50..150)
  @credits += gain
  log_mission("Найден кэш кредитов: +#{gain} CR")
  puts "✓ Обнаружен тайник с кредитами! +#{gain} CR.".green


when :pirate_attack
  if @inventory.include?('щит‑4K')
    puts "⚔ Щит‑4K поглотил удар! Атака нейтрализована.".blue
  else
    damage = rand(20..4

Activity

  1. myltik1702 commented on Jan 13, 2026

    @myltik1702
    Author

    интеграция звёздного конгресса ### Звёздный Конгресс в мире SpaceAdventure‑4K

    Добавим в симулятор политико‑дипломатическую механику — «Звёздный Конгресс», где игрок может:

    • участвовать в голосованиях;
    • заключать союзы;
    • получать бонусы за дипломатические успехи;
    • разблокировать эксклюзивные артефакты и технологии.

    Дополнение к коду: модуль Звёздного Конгресса

    Вставьте этот код в класс SpaceAdventure4K (например, после метода explore_sector).

      # --- ЗВЁЗДНЫЙ КОНГРЕСС ---
      CONGRESS_OPTIONS = {
        '1' => 'Участвовать в голосовании (получить бонус)',
        '2' => 'Предложить союз фракции',
        '3' => 'Запросить дипломатическую помощь',
        '4' => 'Посмотреть рейтинг влияния',
        '5' => 'Вернуться в главное меню'
      }
    
      def star_congress
        puts "\n🌠 ЗВЁЗДНЫЙ КОНГРЕСС — Центр межзвёздной политики"
        puts "Ваш уровень влияния: #{@influence} единиц"
        puts "-" * 50
    
        CONGRESS_OPTIONS.each { |key, label| puts "#{key}. #{label}" }
    
        choice = prompt
        case choice
        when '1'
          congress_vote
        when '2'
          propose_alliance
        when '3'
          request_aid
        when '4'
          show_influence_rank
        when '5'
          return
        else
          puts "Неверный выбор. Попробуйте снова."
        end
      end
    
      def congress_vote
        # Случайное голосование с наградой
        issues = [
          { name: "Квота на добычу кристаллов", bonus: { credits: 200, crystals: 5 } },
          { name: "Безопасность торговых путей", bonus: { fuel: 50, shield: true } },
          { name: "Исследования аномалий", bonus: { experience: 100, item: "анализатор‑4K" } }
        ]
        issue = issues.sample
    
        puts "\n📝 На голосовании: #{issue[:name]}"
        puts "Выберите позицию:"
        puts "1. Поддержить (шанс 70% на успех)"
        puts "2. Против (шанс 30% на крупный бонус при победе)"
    
    
        vote = prompt
        if vote == '1'
          if rand < 0.7
            apply_congress_bonus(issue[:bonus])
            puts "✅ Голосование прошло успешно! Вы получили:"
            display_bonus(issue[:bonus])
          else
            puts "❌ Вы проиграли голосование. Нет наград."
          end
        elsif vote == '2'
          if rand < 0.3
            # Увеличенные бонусы за рискованный выбор
            boosted = issue[:bonus].map { |k, v| [k, v * 2] }.to_h
            apply_congress_bonus(boosted)
            puts "🎉 Риск оправдал себя! Вы получили удвоенные награды:"
            display_bonus(boosted)
          else
            puts "❌ Ваш протест не нашёл поддержки. Нет наград."
          end
        else
          puts "Отмена голосования."
        end
      end
    
      def propose_alliance
        factions = ['Союз Свободных Секторов', 'Корпорация „Небула“', 'Кланы Астероидов']
        target = factions.sample
    
        puts "\n🤝 Вы предлагаете союз фракции: #{target}"
        sleep 1
    
        if rand < 0.6 # 60% шанс на успех
          reward = { credits: rand(100..300), item: "дипломатический пропуск" }
          apply_congress_bonus(reward)
          @allies << target unless @allies.include?(target)
    
          puts "✅ Союз заключён! Вы получили:"
          display_bonus(reward)
          puts "Теперь вы в союзе с: #{@allies.join(', ')}"
        else
          puts "❌ Фракция отклонила предложение. Попробуйте позже."
        end
      end
    
      def request_aid
        if @influence < 50
          puts "\n⚠️ Слишком низкий уровень влияния. Наберите 50+ единиц, чтобы запрашивать помощь."
          return
        end
    
        aid_types = [
          { type: "Топливо", amount: 100, cost: 30 },
          { type: "Ремонт щита", effect: :shield_repair, cost: 40 },
          { type: "Разведданные", item: "карта аномалий", cost: 50 }
        ]
        choice = aid_types.sample
    
    
        puts "\n🛡 Запрос на помощь: #{choice[:type]}"
        puts "Стоимость: #{choice[:cost]} единиц влияния"
    
        if @influence >= choice[:cost]
          @influence -= choice[:cost]
    
          if choice[:amount]
            @fuel += choice[:amount]
            puts "✅ Получено #{choice[:amount]} ед. топлива."
          elsif choice[:effect] == :shield_repair
            @shield_active = true
            puts "✅ Щит полностью восстановлен!"
          elsif choice[:item]
            @inventory << choice[:item]
            puts "✅ Получен предмет: #{choice[:item]}"
          end
        else
          puts "❌ Недостаточно влияния. Требуется #{choice[:cost]} единиц."
        end
      end
    
      def show_influence_rank
        rank = case @influence
               when 0...20 then "Новобранец"
               when 20...50 then "Посланник"
               when 50...100 then "Советник"
               else "Архигерцог Космоса"
               end
    
        puts "\n🏆 Ваш рейтинг влияния: #{@influence} ед. (#{rank})"
        puts "Прогресс до следующего ранга: #{(@influence % 30)}/30"
      end
    
      def apply_congress_bonus(bonus)
        bonus.each do |key, value|
          case key
          when :credits then @credits += value
          when :crystals then @crystals += value
          when :fuel then @fuel += value
          when :experience then @experience += value
          when :shield then @shield_active = true
          when :item then @inventory << value unless @inventory.include?(value)
          end
        end
        @influence += bonus.values.sum { |v| v.is_a?(Numeric) ? v / 20 : 1 } # рост влияния за действия
      end
    
      def display_bonus(bonus)
        bonus.each do |key, value|
          case key
          when :credits then puts "  💰 +#{value} CR"
          when :crystals then puts "  💎 +#{value} кристаллов"
          when :fuel then puts "  ⛽ +#{value} ед. топлива"
          when :experience then puts "  ⭐ +#{value} XP"
          when :shield then puts "  🛡 Щит активирован!"
          when :item then puts "  🎁 Получен: #{value}"
          end
        end
      end
    
      # --- ИНИЦИАЛИЗАЦИЯ ДОП. ПОЛЕЙ ---
      def reset_game
        super
        @influence = 10        # начальное влияние
        @allies = []             # список союзных фракций
        @congress_rank = 'Новобранец'
      end
    
      def load_game
        if File.exist?(SAVE_FILE)
          data = JSON.parse(File.read(SAVE_FILE))
          # ... (предыдущие поля)
          @influence = data['influence'] || 10
          @allies = data['allies'] || []
          @congress_rank = data['congress_rank'] || 'Новобранец'
          # ...
        end
        false
      end
    
      def save_game
        data = {
          # ... (предыдущие поля)
          influence: @influence,
          allies: @allies,
          congress_rank: @congress_rank
        }
        File.write(SAVE_FILE, JSON.generate(data))
      end

    Как интегрировать

    1. Добавьте зависимости:

      gem install colorize
    2. Расширьте MAIN_MENU, добавив пункт:

      '11' => 'Посетить Звёздный Конгресс'
    3. В основном цикле игры (где обрабатывается ввод) добавьте:

      when '11'
        star_congress
    4. **Обновите `save

  2. myltik1702 commented on Jun 14, 2026

    @myltik1702
    Author

    'colorize'

    system_info = [
    "ОС: Ubuntu 22.04",
    "Память: 8 ГБ",
    "Процессор: Intel i5"
    ]

    puts "\n! + "═" * 60
    system_info.each { |line| puts "│ #{line}".light_white }
    puts "═" * 60

  3. myltik1702 commented on Jun 14, 2026

    @myltik1702
    Author

    'colorize'

    system_info = [
    "ОС: Ubuntu 22.04",
    "Память: 8 ГБ",
    "Процессор: Intel i5"
    ]

    puts "\n! + "═" * 60
    system_info.each { |line| puts "│ #{line}".light_white }
    puts "═" * 60

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions