[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Модератор форума: Jery, Rey  
Форум » Knights and Merchants: Remake » Общий » вопросы по разработке кам ремейк (хочу узнать про разроботки кам ремейк как его пишут)
вопросы по разработке кам ремейк
KromДата: Пятница, 21.06.2013, 16:30 | Сообщение # 226
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
AlexandrV, смотря что ты хочешь сделать.

Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
Alexandr_5Дата: Пятница, 21.06.2013, 16:44 | Сообщение # 227
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 4
Репутация: 33
Статус: Offline
Krom, Уничтожать здания при потери золотого рудника а перед этим показать сообщение.
Код
Procedure OnMissionStart;
begin
    Actions.ShowMsg(0,'О нет, вы посмотрите, Афины атакуют золотой рудник. Если граждане потеряют этот рудник то и город потерян.');
end;

Procedure OnTick;
var ActivDestoryedHouse:Boolean;
begin
    If States.HouseDestroyed(4) then begin
      ActivDestoryedHouse:=True;
    end else begin
      ActivDestoryedHouse:=False;
    end;
    If ActivDestoryedHouse then begin
      Actions.HouseAddDamage(11,10);
     Actions.HouseAddDamage(8,10);
     Actions.HouseAddDamage(27,10);
     Actions.HouseAddDamage(0,10);
    end;
end;


Итог: Показывает только сообщения а здания не разрушает интересно почему


Сообщение отредактировал AlexandrV - Пятница, 21.06.2013, 16:44
 
KromДата: Пятница, 21.06.2013, 16:52 | Сообщение # 228
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
Можно проще - делаешь обработчик события OnHouseDestoyed и в нем проверяешь какой именно дом уничтожился, если нужный рудник то уничтожаешь другие здания.

Советую не хранить текст в скрипте, а использовать libx, тогда можно миссию будет проще перевести на другие языки.


Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
Alexandr_5Дата: Пятница, 21.06.2013, 17:17 | Сообщение # 229
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 4
Репутация: 33
Статус: Offline
Krom, А как текст считывать из Libx

Добавлено (21.06.2013, 17:03)
---------------------------------------------
Код
var ActivDestoryedHouse:Boolean;
Procedure OnMissionStart;
begin
      Actions.ShowMsg(0,'О нет, вы посмотрите, Афины атакуют золотой рудник. Если граждане потеряют этот рудник то и город потерян.');
end;
Procedure OnHouseDestoyed(aHouseID: Integer; aDestroyerIndex: Integer);
begin
      if (aHouseID = 4)and(aDestroyerIndex = 1) then begin
        ActivDestoryedHouse:=True;
      end else begin
        ActivDestoryedHouse:=False;
      end;
end;

Procedure OnTick;
begin
      If ActivDestoryedHouse then begin
        Actions.HouseAddDamage(11,10);
       Actions.HouseAddDamage(8,10);
       Actions.HouseAddDamage(27,10);
       Actions.HouseAddDamage(0,10);
      end;
end;


А теперь почему не хочет разрушать  здания может разрушать надо както по другому. И вообще по идеи надо указыват у какого игрока разрушать надо какое здание и сколько отнимать

Добавлено (21.06.2013, 17:17)
---------------------------------------------
Решил коечто проверить

Код
var ActivDestoryedHouse:Boolean;
Procedure OnMissionStart;
begin
   Actions.ShowMsg(0,'О нет, вы посмотрите, Афины атакуют золотой рудник. Если граждане потеряют этот рудник то и город потерян.');
end;
Procedure OnHouseDestoyed(aHouseID: Integer; aDestroyerIndex: Integer);
begin
   if aHouseID = 4 then begin
     ActivDestoryedHouse:=True;
   end;
end;

Procedure OnTick;
begin
   If ActivDestoryedHouse = true then begin
     Actions.HouseAddDamage(11,10);
  Actions.HouseAddDamage(8,10);
  Actions.HouseAddDamage(27,10);
  Actions.HouseAddDamage(0,10);
  Actions.HouseDestroy(11,True);
   end;
end;



Оно в принципе не хочет работать. Ошибок нет но и здание не разрушает.


Сообщение отредактировал AlexandrV - Пятница, 21.06.2013, 17:20
 
KromДата: Пятница, 21.06.2013, 17:35 | Сообщение # 230
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
Похоже, что ты неверно используешь HouseAddDamage - почему там стоят константы (11, 8, 27, 0, 11), как ты их получил? Тебе надо при запуске миссии сделать что-то типа

HouseToKill1 := States.HouseAt(X, Y); чтобы получить Ид дома по координатам Х,Y

и потом внизу вот так это применять: Actions.HouseAddDamage(HouseToKill1, 10);


Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
Alexandr_5Дата: Пятница, 21.06.2013, 17:39 | Сообщение # 231
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 4
Репутация: 33
Статус: Offline
Krom, я получил ID домов по этой теме

https://code.google.com/p/castlesand/wiki/MissionScriptsLookups

HouseToKill1 А какого типа переменная

и как узнать координаты здания. Даже в ремейке это сложно.
 
KromДата: Пятница, 21.06.2013, 17:44 | Сообщение # 232
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
AlexandrV, В таблицах перечислены ID типов домов, это не тоже самое что уникальный индекс дома в игре (HouseId).

HouseId: Integer;

Узнать координаты здания можно в редакторе карт, они выводятся в левом верхнем углу рядом с миникартой. Наводишь курсор на вход дома и смотришь координаты. Точно не помню, может быть их можно брать прямо так, или нужно отнять по 1 от каждой компоненты (т.е. если вход на 45:45 то в скрипте указывать 45:45 или 44:44 - просто не помню)


Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
Alexandr_5Дата: Пятница, 21.06.2013, 17:45 | Сообщение # 233
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 4
Репутация: 33
Статус: Offline
Код
var ActivDestoryedHouse:Boolean;
HouseToKill1:Integer;
Procedure OnMissionStart;
begin
    Actions.ShowMsg(0,'О нет, вы посмотрите, Афины атакуют золотой рудник. Если граждане потеряют этот рудник то и город потерян.');
end;
Procedure OnHouseDestoyed(aHouseID: Integer; aDestroyerIndex: Integer);
begin
    if aHouseID = 4 then begin
      ActivDestoryedHouse:=True;
    end;
end;

Procedure OnTick;
begin
    If ActivDestoryedHouse = true then begin
      HouseToKill1 := States.HouseAt(63, 61);
      Actions.HouseAddDamage(HouseToKill1,10);
    end;
end;


или

Код
var ActivDestoryedHouse:Boolean;
HouseToKill1:Integer;
Procedure OnMissionStart;
begin
   Actions.ShowMsg(0,'О нет, вы посмотрите, Афины атакуют золотой рудник. Если граждане потеряют этот рудник то и город потерян.');
end;
Procedure OnHouseDestoyed(aHouseID: Integer; aDestroyerIndex: Integer);
begin
   if aHouseID = 4 then begin
     ActivDestoryedHouse:=True;
   end;
end;

Procedure OnTick;
begin
   If ActivDestoryedHouse = true then begin
     HouseToKill1 := States.HouseAt(62, 60);
     Actions.HouseAddDamage(HouseToKill1,10);
   end;
end;


Не работает. Не разрушает координаты должны быть верными


Сообщение отредактировал AlexandrV - Пятница, 21.06.2013, 17:48
 
KromДата: Пятница, 21.06.2013, 17:50 | Сообщение # 234
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
AlexandrV, значит надо заниматься отладкой и искать в чем причина, неправильные координаты, или тип дома, или что-то еще.

Что если ты оставишь только эту процедуру в файле а все остальное уберешь?

Procedure OnTick;
var HouseToKill1: Integer;
begin
HouseToKill1 := States.HouseAt(63, 61);
Actions.HouseAddDamage(HouseToKill1, 10);
end;


Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
Alexandr_5Дата: Пятница, 21.06.2013, 17:53 | Сообщение # 235
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 4
Репутация: 33
Статус: Offline
Krom, Спасибо неправильно ID здание было вот так работает. Теперь надо разобраться как узнать уничтожено ли здание или нет

Код
var ActivDestoryedHouse:Boolean;
HouseToKill1:Integer;
Procedure OnMissionStart;
begin
   Actions.ShowMsg(0,'О нет, вы посмотрите, Афины атакуют золотой рудник. Если граждане потеряют этот рудник то и город потерян.');
end;

Procedure OnTick;
begin
     HouseToKill1 := States.HouseAt(62, 60);
     Actions.HouseAddDamage(HouseToKill1,10);
end;
 
KromДата: Пятница, 21.06.2013, 17:55 | Сообщение # 236
Воитель
Группа: Супер Модераторы
Сообщений: 2526
Награды: 25
Репутация: 153
Статус: Offline
AlexandrV, в остальном все так же останется - пишешь код в OnHouseDestroyed

Нашли баг в КаМ Ремейке? Отправьте отчет на с пометками, желательно на английском, в какой версии, что и когда случилось, приложите реплей или сохраненную игру в которой этот баг воспроизводится.
 
Alexandr_5Дата: Пятница, 21.06.2013, 18:28 | Сообщение # 237
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 4
Репутация: 33
Статус: Offline
Код
var ActivDestoryedHouse:Boolean;
HouseToKill1:Integer;
Procedure OnMissionStart;
begin
    Actions.ShowMsg(0,'О нет, вы посмотрите, Афины атакуют золотой рудник. Если граждане потеряют этот рудник то и город потерян.');
end;
Procedure OnHouseDestoyed(aHouseID: Integer; aDestroyerIndex: Integer);   
begin   
     if aHouseID = States.HouseAt(36, 49) then begin   
       ActivDestoryedHouse:=True;   
     end;   
end;

Procedure OnTick;
begin
    if ActivDestoryedHouse = true then begin
      HouseToKill1 := States.HouseAt(62, 60);
      Actions.HouseAddDamage(HouseToKill1,10);
    end;
end;


Почему он переменной не возвращает True когда здание уничтожено

Добавлено (21.06.2013, 18:09)
---------------------------------------------
Понял ошибку. Я делал проверку на разрушен ли железный рудник а надо на золотой а не железный

Код
var ActivDestoryedHouse:Boolean;
HouseToKill1:Integer;
Procedure OnMissionStart;
begin
   Actions.ShowMsg(0,'О нет, вы посмотрите, Афины атакуют золотой рудник. Если граждане потеряют этот рудник то и город потерян.');
end;
Procedure OnHouseDestoyed(aHouseID: Integer; aDestroyerIndex: Integer);  
begin  
    if aHouseID = 5 then begin  
      ActivDestoryedHouse:=True;  
    end;  
end;

Procedure OnTick;
begin
   If ActivDestoryedHouse = true then begin  
     HouseToKill1 := States.HouseAt(62, 60);
     Actions.HouseAddDamage(HouseToKill1,10);
   end;
end;


и так тоже не работает

Добавлено (21.06.2013, 18:28)
---------------------------------------------
Решил проблемму

Код
var
HouseToKill1:Integer;
Procedure OnMissionStart;
begin
   Actions.ShowMsg(0,'О нет, вы посмотрите, Афины атакуют золотой рудник. Если граждане потеряют этот рудник то и город потерян.');
end;

Procedure OnTick;
begin
   If States.HouseAt(37, 50) <= 0 then begin  
     HouseToKill1 := States.HouseAt(62, 60);
     Actions.HouseAddDamage(HouseToKill1,10);
   end;
end;


Но это не правильно. Если Здания нет в этом месте это не означает что его вообще нет впрочем мне это сейчас подходит так как нужно узнать уничтожено ли определенное здание


Сообщение отредактировал AlexandrV - Пятница, 21.06.2013, 18:13
 
Alexandr_5Дата: Вторник, 25.06.2013, 12:20 | Сообщение # 238
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 4
Репутация: 33
Статус: Offline
Код
Const  
  Timers1:integer=10;
var
HouseToKill1:Integer;
Activ1,Activ2:Boolean;
Procedure OnMissionStart;
begin
   Actions.ShowMsg(0,'<$0>');
end;

Procedure OnTick;
begin
   If (States.HouseAt(37, 50) <= 0)And(Activ1 = False) then begin
  Activ1 := False;
  Activ2:=True;
   end;
   If Activ2 = true then begin
     If Timers1 > 0 then begin
    Timers1:=Timers1-1;
  end else begin
    HouseToKill1 := States.HouseAt(62, 60);
       Actions.HouseAddDamage(HouseToKill1,3);
  end;
   end;
end;


2 проблеммы

1 Почему это текст не считывается

2 Эта проблема возникла позже когда я добавил константу и переделал код

[Error] (1:14): is ('=') expected

Добавлено (25.06.2013, 12:20)
---------------------------------------------
Скажите мне все параметры Libx за кроме [$FFFFFF] и |

Прикрепления: TNW04.rus.libx(0.1 Kb)


Сообщение отредактировал AlexandrV - Суббота, 22.06.2013, 12:16
 
JeryДата: Вторник, 25.06.2013, 19:34 | Сообщение # 239
Мечник
Группа: Модераторы
Сообщений: 568
Награды: 2
Репутация: 50
Статус: Offline
Воу воу я конечно не знаю как там в паскале обстоят дела, но наверно константа на то и константа, что ее значение присваивается при объявлении и больше не изменяется. А у тебя Timers1:=Timers1-1; и еще и объявлена неправильно.  facepalm

«Художник не тогда знает, что он достиг совершенства, когда нечего добавить, но когда нечего больше отнять». (Антуан де Сент-Экзюпери)

Сообщение отредактировал Jery - Вторник, 25.06.2013, 19:36
 
Alexandr_5Дата: Суббота, 27.07.2013, 19:58 | Сообщение # 240
Воитель
Группа: Проверенные
Сообщений: 1330
Награды: 4
Репутация: 33
Статус: Offline
Видно да я тоже об этом подумал. Хотя без разницы. Миссия сдохла.

Добавлено (25.06.2013, 23:25)
---------------------------------------------
Есть скрипт для проверки какому игроку принадлежит определенное здание

Добавлено (26.06.2013, 00:35)
---------------------------------------------
Код
Var t1:Array[1..4] of Integer;
   b1,b2:Boolean;
   b3:Array[1..4] of boolean;
procedure OnMissionStart;
begin
   b1:=True;
   b2:=False;
   b3[1]:=False;
   b3[2]:=False;
   b3[3]:=False;
   b3[4]:=True;
   t1[1]:=10;
   t1[2]:=20;
   t1[3]:=30;
   t1[4]:=40;
end;
Procedure OnTick;
begin
   if States.PlayerDefeated(1) then begin
     Actions.GiveHouse(2,11,139,4);
  if (States.HouseOwner(States.HouseAt(139,4)) = 2)and(b1 = true) then begin
    Actions.ShowMsgGoto(0,139,4,'<$0>');
    b1:=False;
    b2:=True;
  end;
  If (States.UnitAt(135,3) = 0)and(b2 = true) then begin
    Actions.ShowMsg(0,'<$4>');
    b3[1]:=True;
    b3[2]:=True;
    b3[3]:=True;
    b3[4]:=True;
    b2:=False;
  end;
  If (t1[1] > 0)and(b3[1]=true) then begin
    t1[1]:=t1[1]-1;
  end;
  If (t1[1] <= 0)and(b3[1]=true) then begin
    Actions.ShowMsg(0,'<$1>');
    b3[1]:=False;
  end;
  If (t1[2] > 0)and(b3[2]=true) then begin
    t1[2]:=t1[2]-1;
  end;
  If (t1[3] <= 0)and(b3[3]=true) then begin
    Actions.ShowMsg(0,'<$2>');
    b3[3]:=False;
  end;
  If (t1[3] > 0)and(b3[3]=true) then begin
    t1[3]:=t1[3]-1;
  end;
  If (t1[3] <= 0)and(b3[3]=true) then begin
    Actions.ShowMsg(0,'<$3>');
    b3[3]:=False;
  end;
  If (t1[4] > 0)and(b3[4]=true) then begin
    t1[4]:=t1[4]-1;
  end;
  If (t1[4] <= 0)and(b3[4]=true) then begin
    Actions.PlayerWin([0],true);
    b3[4]:=False;
  end;
   end;
end;


Вот скрипт написал для первой миссии. Вродебы должно быть все верно. надеюсь ниче не перепутал.

Добавлено (27.06.2013, 20:13)
---------------------------------------------
Андрей проверь скрипт. Не увеен что будет работать а сам проверить не могу так как миссию не могу пройти

Код
Var t1:Array[1..4] of Integer;
   b1,b2:Boolean;
   b3:Array[1..4] of boolean;
procedure OnMissionStart;
begin
   b1:=True;
   b2:=False;
   b3[1]:=False;
   b3[2]:=False;
   b3[3]:=False;
   b3[4]:=True;
   t1[1]:=10;
   t1[2]:=20;
   t1[3]:=30;
   t1[4]:=40;
end;
Procedure OnTick;
begin
   if States.PlayerDefeated(1) then begin
     Actions.GiveHouse(2,11,139,4);
    if (States.HouseOwner(States.HouseAt(139,4)) = 2)and(b1 = true) then begin
      Actions.ShowMsgGoto(0,139,4,'<$0>');
      b1:=False;
      b2:=True;
    end;
    If (States.UnitAt(135,3) = 0)and(b2 = true) then begin
      Actions.ShowMsg(0,'<$4>');
      b3[1]:=True;
      b3[2]:=True;
      b3[3]:=True;
      b3[4]:=True;
      b2:=False;
    end;
    If (t1[1] > 0)and(b3[1]=true) then begin
      t1[1]:=t1[1]-1;
    end;
    If (t1[1] <= 0)and(b3[1]=true) then begin
      Actions.ShowMsg(0,'<$1>');
      b3[1]:=False;
    end;
    If (t1[2] > 0)and(b3[2]=true) then begin
      t1[2]:=t1[2]-1;
    end;
    If (t1[3] <= 0)and(b3[3]=true) then begin
      Actions.ShowMsg(0,'<$2>');
      b3[3]:=False;
    end;
    If (t1[3] > 0)and(b3[3]=true) then begin
      t1[3]:=t1[3]-1;
    end;
    If (t1[3] <= 0)and(b3[3]=true) then begin
      Actions.ShowMsg(0,'<$3>');
      b3[3]:=False;
    end;
    If (t1[4] > 0)and(b3[4]=true) then begin
      t1[4]:=t1[4]-1;
    end;
    If (t1[4] <= 0)and(b3[4]=true) then begin
      Actions.PlayerWin([0],true);
      b3[4]:=False;
    end;
   end;
end;

Добавлено (27.07.2013, 19:58)
---------------------------------------------
Хочу узнать какие это языки

Код
[Save Language]
MaxSL=22
SL0=eng
SL1=rus
SL2=ukr
SL3=bel
SL4=ptb
SL5=bul
SL6=chn
SL7=cze
SL8=dut
SL9=est
SL10=fre
SL11=ger
SL12=hun
SL13=ita
SL14=jpn
SL15=lit
SL16=nor
SL17=pol
SL18=rom
SL19=svk
SL20=spa
SL21=swe
SL22=tur
MaxGlawSL=1
GlawSL0=0
GlawSL1=1

eng, rus, ukr Я знаю а вот что значат остальные. Буду очень признателен если вы к каждому языку предоставите флаг или имя иконки флага из ремейка.

Это параметры для выбора сколько переводов будет сохранено.


Сообщение отредактировал AlexandrV - Среда, 26.06.2013, 00:42
 
Форум » Knights and Merchants: Remake » Общий » вопросы по разработке кам ремейк (хочу узнать про разроботки кам ремейк как его пишут)
Поиск: