Skip to content

space_adventure_4k.rb #337

@myltik1702

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

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