Портирование Mobile Basic игры на MIDlet Pascal. Пишем код

от
Прочие языки    just for fun, lulz, портирование, gamedev

ПредисловиеЭто был черновик статьи от 2017 года :swoon:
wtf.PNG
Рабочий код с той поры уже изменился, т.к. код из единого файла я начал разносить по модулям. Благо, остался репозиторий. Статья будет дополняться. Пока же публикую в том виде, в котором она была в 2017.

- Портирование Mobile Basic игры на MIDlet Pascal. Начало

И снова здравствуйтеС момента написания прошлой статьи я всё думал, как бы поменьше написать текста, но при этом ничего важного (на мой взгляд) не упустить. Ничего не придумал, да и думать лень, потому приступим к написанию кода непосредственно на MIDlet Pascal. Привожу полный листинг на МВ, рекомендую открыть его и просматривать.
LoW.txt
В прошлый раз я хотел дополнить статью фотографиями тех самых распечаток с пометками, но мне было тупо лень искать их я их где-то потерял :-( Так что попробуйте сами представить, что, где и почему. Не стесняйтесь предлагать свои варианты реализации в комментарии, ибо я тот еще архитектор, @Helltar не даст соврать :кек2: Поехали!

Загрузка ресурсов. Переменные и константыНадеюсь, основы МР вы знаете, ибо я объяснять их не собираюсь (забыл всё, гГ).
  1. program LoW;
  2. var
  3.   scrW, scrH: integer;
  4. begin
  5.   // super hard code
  6. end.
Реализуем вспомогательную процедуру - CLS.
  1. procedure Cls;
  2. begin
  3.     SetColor(255, 255, 255);
  4.     FillRect(0, 0, scrW, scrH);
  5.     Repaint;
  6. end;
И конечно же, я забыл про переменные!
  1. var
  2.   // Серебро   Медь         Доспехи     Оружие       Ноги        Голова
  3.   silverCoins, copperCoins, lvlOfArmor, lvlOfWeapon, lvlOfShoes, lvlOfHealmet: integer;
  4.   // Дерево Железо Еда
  5.   wood, iron, meat: integer;
  6.   // Лвл Опыт След.лвл
  7.   level, exp, nextLvl: integer;
  8.   // Флаги квестов                    Магические навыки
  9.   bQuest1, bQuest2, bQuest3, bQuest4, bMag1, bMag2, bMag3: integer;
  10.   // DEF=       +DOD         +DSP         +DSL         +OB(своя защита)
  11.   totalProtect, bodyProtect, footProtect, headProtect, personalProtect: integer;
  12.   // ATK=SILA   +WN(Урон_оружия)
  13.   attack, power, damag, i: integer;
  14.  
  15.   // Вместо OR$ и т.д. юзается массив
  16.   arShmot: array [0..3] of string;
  17.   // Аналогично, пункты выбора и т.д. (для отрисовки)
  18.   arMenu: array [0..3] of string;
  19.   arRasa: array [0..8] of string;
  20.   arClas: array [0..8] of string;
  21.   arLoca: array [0..2] of string;
  22.   arVrid: array [0..5] of string;
  23.   arHero: array [0..4] of string;
  24.   arTave: array [0..2] of string;
  25.   arTrad: array [0..5] of string;
  26.   arMags: array [0..3] of string;
  27.   arAren: array [0..8] of string;
  28.   arMagic: array [0..3] of string;
  29.   arHara: array [0..9] of string;
  30.   //arVesh: array [0..3] of string;
  31.  
  32.   arItem: array [0..10] of integer;
  33.   arImage: array [0..2] of image;
  34.   cmdGo, cmdClick: command;
  35.  
  36.   life, fullLife, mana, fullMana, iLand, iVrid, iHero, itemMenu: integer;
  37.   enemyDamage, enemyFullDamage, enemyLife, enemyFullLife, enemyID, expEnemy, enemyGold: integer;
  38.   enemyName: string;
  39.  
  40.   scrW, scrH, xPosIc, yPosIc: integer;
  41.   sPreText, sRasa, sClas, sOryzh, sFoot, sHead, sBody: string;
  42.   iTextH, rndDrop: integer;
  43.   rs: recordStore;
  44.   arIndex: array [0..30] of integer;
Далее я буду просто приводить участки кода на МВ и МР
  1. 1 GELLOAD "logo","logo2.png"
  2. 2 DRAWGEL "logo",0,0: SLEEP 3500: CLS : GOTO 10
  1. procedure ResLoading;
  2. begin
  3.     for i := 0 to 2 do
  4.     begin
  5.       arImage[i] := loadImage('/' + i + '.png');
  6.     end;
  7. end;
Загрузка картинок для сплеш экранов. Здесь все просто. Разве что непонятно, откуда взялись еще файлы - это добавлен еще один splash (мой) и иконка игры (используется на экране 'Об игре').

  1. const
  2.   MENU = 'Legends of Warriors';
  3.   RASA = 'Выбери расу';
  4.   CLAS = 'Выбери класс';
  5.   LOCA = 'Местность';
  6.   VRID = 'Вридорг';
  7.   HERO = 'Герой';
  8.   TAVE = 'Таверна';
  9.   TRAD = 'Торговец';
  10.   MAGS = 'Магистр';
  11.   AREN = 'Арена';
  12.   MAGI = 'Выбор умения';
  13.   BACK = 'Назад';
  14.   //--------------
  15.   MENU0 = 'Новая игра';
  16.   MENU1 = 'Продолжить';
  17.   MENU2 = 'Об игре';
  18.   MENU3 = 'Выход';
  19.   //--------------
  20.   RASA0 = 'Человек';
  21.   RASA1 = 'Эльф';
  22.   RASA2 = 'Орк';
  23.   RASA3 = 'Мертвец';
  24.   RASA4 = 'Гном';
  25.   RASA5 = 'Мутант';
  26.   RASA6 = 'Северный человек';
  27.   RASA7 = 'Пещерный орк';
  28.   //--------------
  29.   CLAS0 = 'Воин';
  30.   CLAS1 = 'Рыцарь';
  31.   CLAS2 = 'Маг';
  32.   CLAS3 = 'Паладин';
  33.   CLAS4 = 'Мастер';
  34.   CLAS5 = 'Магистр';
  35.   CLAS6 = 'Некромант';
  36.   CLAS7 = 'Красный маг';
  37.   //--------------
  38.   LOCA0 = 'Вридорг';
  39.   LOCA1 = 'Катакомбы';
  40.   LOCA2 = 'Развалины';
  41.   //--------------
  42.   VRID0 = 'Твой герой';
  43.   VRID1 = 'Таверна';
  44.   VRID2 = 'Торговец';
  45.   VRID3 = 'Магистр магии';
  46.   VRID4 = 'Арена';
  47.   //--------------
  48.   HERO0 = 'Характеристики';
  49.   HERO1 = 'Вещи';
  50.   HERO2 = 'Ресурсы';
  51.   HERO3 = 'Спальный мешок';
  52.   //--------------
  53.   TAVE0 = 'Поесть (10 m)';
  54.   TAVE1 = 'Работа';
  55.   //--------------
  56.   TRAD0 = 'Оружие';
  57.   TRAD1 = 'Доспехи';
  58.   TRAD2 = 'Сапоги';
  59.   TRAD3 = 'Шлемы';
  60.   TRAD4 = 'Работа';
  61.   //--------------
  62.   MAGS0 = 'Обмен денег';
  63.   MAGS1 = 'Магия';
  64.   MAGS2 = 'Медитация';
  65.   //--------------
  66.   AREN0 = 'Крыса';
  67.   AREN1 = 'Гоблин';
  68.   AREN2 = 'Скелет';
  69.   AREN3 = 'Огрол';
  70.   AREN4 = 'Вервольф';
  71.   AREN5 = 'Троль';
  72.   AREN6 = 'Великан';
  73.   AREN7 = 'Дракон';
  74.   //--------------
  75.   MAGI0 = 'Фаербол';
  76.   MAGI1 = 'Лечение';
  77.   MAGI2 = 'Проклятие';
  78.   //--------------
  79.   HARA0 = 'Здоровье: ';
  80.   HARA1 = 'Мана: ';
  81.   HARA2 = 'Атака: ';
  82.   HARA3 = 'Защита: ';
  83.   HARA4 = 'Уровень: ';
  84.   HARA5 = 'Опыт: ';
  85.   HARA6 = 'Раса: ';
  86.   HARA7 = 'Серебро: ';
  87.   HARA8 = 'медяки: ';
  88.   HARA9 = 'Класс: ';
  89.   //--------------
  90.   VESH0 = 'Оружие: ';
  91.   VESH1 = 'Броня: ';
  92.   VESH2 = 'Шлем: ';
  93.   VESH3 = 'Обувь: ';
  94.   //--------------
  95.   RESY0 = 'Древесина: ';
  96.   RESY1 = 'Железо: ';
  97.   RESY2 = 'Еда: ';
  98.  
  99.   // Сообщения НПС, текст
  100.   ABOUT =
  101.     'Автор Vapigor. Сохранение в спальном мешке.';
  102.   START1 = 'Вы прибыли в Вридорг в поисках работы. Хорошенько осмотритесь.';
  103.  
  104.   POEL0 = 'Заплатив 10 монет, ты неплохо подкрепился';
  105.   POEL1 = 'Бесплатно не кормлю!';
  106.  
  107.   NOEDA0 = 'Хь, принеси мне 10 кусков мяса, получишь монет';
  108.   NOEDA1 = 'Спасибо, держи деньги. Принеси еще';
  109.   NOEDA2 = 'Я жду мясо...';
  110.  
  111.   NOZHE0 =
  112.     'За 30 слитков железа получишь лучший меч, его нигде не купишь';
  113.   NOZHE1 = 'Всего лишь 30 слитков и меч твой';
  114.   NOZHE2 = 'Как и договаривались, держи меч!';
  115.  
  116.   NOMAG =
  117.     'Ты слишком слаб, чтобы изучать магию. Прокачайся';
  118.   SOHR = 'Ты медитируешь';
  119.   SONMSG = 'Ты спишь, жди.';
  120.  
  121.   NODER0 = 'Гоблин: принеси мне 20 дерева, дам серебро';
  122.   NODER1 = '1 серебр. монета за 20 древесины';
  123.   NODER2 = 'Спасибо, принеси еще, я заплачу';
  124.  
  125.   MUDR0 =
  126.     'Мудрец: Я дам тебе сапоги, если отгадаешь загадку';
  127.   MUDR1 = 'Имя захватчика Вридорга в Fantasy Reign 1 от Vapigor?';
  128.   MUDR2 = 'Не угадал, удача прошла мимо';
  129.   MUDR3 =
  130.     'Ты неплохо знаешь историю Тиверна, держи сапоги';
  131.   MUDR4 = 'Мудрец молчит...';
Константы. Лучше вынести все в файлы ресурсов и циклом считывать в соответствующие массивы. Пока для удобства все строки представил как константы, чтобы не искать текст среди кода.

:ps: нет, все это никогда не будет переписано на рфо ява4андроид