Перейти к содержанию

Домостроителям! Сортировка.


Рекомендуемые сообщения

Сейчас. ИМХО, мало домов в Морре делаются без алхимической лаборатории... А что главное для алхимика? Это аккуратно рассортированные предметы, чтобы каждый лежал отдельно в своем ящичке, откуда его можно легко взять в нужных количествах.

 

Сегодня вечером тут появится пример подобного скрипта (скриптов, если честно) с тестовым плагом и подробными комментариями... следите за темой!

Ссылка на комментарий
Поделиться на другие сайты

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

 

Тестовый пример и все скрипты в отдельных папках вы найдете в приаттаченом архиве. Чтобы посмотреть, как оно работает, подключите плаг и в консоли введите coc, House_mage (это копия Дома мага), там будут 4 ящика для зелий, активатор (сортировщик), свиток и ящик с ингред. для теста...

А теперь, как это все устроено.

 

ВНИМАНИЕ! ВСЕ СКРИПТЫ ДЛЯ ПОЛНОГО ВАРИАНТА, СО СВИТКОМ. ЕСЛИ ВЫ БУДЕТЕ ДЕЛАТЬ БЕЗ СВИТКА, ТО ВАМ НЕ ПОНАДОБЯТСЯ 2 ПОСЛЕДНИХ СКРИПТА, А ТАКЖЕ СЛЕДУЮЩИЕ СТРОКИ В ОСНОВНОМ:

StopScript, "ingred_counter_main1"

;StopScript, "ingred_counter_main2"

set saltrice_count to ( B_contain_saltrice -> GetItemCount, "ingred_saltrice_01" )

 

1. Нужно создать контейнеры для каждого ингредиента (вместа с Трибуналом и БМ их 125, н есть и уникальные, которые сортировать не надо) со вместимостью (Emcubrance) 0. Теперь мы сможем добавить туда травы через скрипт, а вот сам игрок положить туда ничего не сможет (и не нужно это, сортировщик все равно работает быстрее). Также в каждом сундуке должен лежать любой предмет и он не должен покидать контенера, иначе скрипты могут неработать... предупредите об этом игрока.

2. Скрипты:

begin boblen_sorter_start

short state
short button
short active
;Этот скрипт висит на активаторе и запускает
;первый сортировочный скрипт

if ( OnActivate == 1 ); активировали скрипт
  set active to 1
endif

if ( active == 0 ); пока неактивен - неработаем
  return
elseif ( active == 1 )
  if ( state == 0 )
     MessageBox, "Начать сортировку?", "Да", "Нет"; задали вопрос
     set state to 1; больше не задаем
  endif
endif

if ( state == 1 )
  set button to GetButtonPressed;ловим реакцию игрока
  if ( button == -1 ); пока ничего не нажато - неработаем
     return
  elseif ( button == 0 ); Нажали "да"
     StartScript, "boblen_sorter_main1"; Запуск 1го сортиров.скрипта
     set active to 0
     set state to 0
     return
  elseif ( button == 1 ); нажали "нет" - возврат на исходную
     set active to 0
     set state to 0
     return
  endif
endif

end

Этот скрипт висит на активаторе и запускает первый сортировочный глобальный скрипт (т.к. ингредиентов моного, то и сортировочных скриптов лучше сделать несколько, они будут стартовать друг за другом.

Далее осн.скрипт:

begin boblen_sorter_main1

; Глобальный скрипт

short state;переменная состояния
short text_message;для теста

if ( state == 4 ); state = число игред.-1
  MessageBox, "Сортировка окончена"
;Следующая строка включает следующий по порядку сорт.скрипт
; В последнем скрипте ее быть не должно
 ;StartScript "boblen_sorter_main2"
  StopScript, "boblen_sorter_main1"
  set state to 0
  set text_message to 0
  return
endif

if ( state == 0 ); первый ингед.
if ( text_message == 0 ); эти строки для тестовых сообщений-закомментируйте их, если хотите
  MessageBox, "Сортирую соленый рис"
  set text_message to ( text_message + 1 )
endif
;Это главная сорировочная часть, она сделана методом половинного деления
;Так скрипт быстрее работает, нежели сортировать по одному предмету
;Это можно сделать и через While, но, думаю, так лучше, т.к.
;практически не повлияет на скорость.
  if ( Player -> GetItemCount, "ingred_saltrice_01" >= 512 )
     Player -> RemoveItem, "ingred_saltrice_01", 512
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 512
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" >= 256 )
     Player -> RemoveItem, "ingred_saltrice_01", 256
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 256
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" >= 128 )
     Player -> RemoveItem, "ingred_saltrice_01", 128
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 128
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" >= 64 )
     Player -> RemoveItem, "ingred_saltrice_01", 64
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 64
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" >= 32 )
     Player -> RemoveItem, "ingred_saltrice_01", 32
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 32
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" >= 16 )
     Player -> RemoveItem, "ingred_saltrice_01", 16
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 16
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" >= 8 )
     Player -> RemoveItem, "ingred_saltrice_01", 8
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 8
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" >= 4 )
     Player -> RemoveItem, "ingred_saltrice_01", 4
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 4
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" >= 2 )
     Player -> RemoveItem, "ingred_saltrice_01", 2
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 2
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" > 0 )
     Player -> RemoveItem, "ingred_saltrice_01", 1
     B_contain_saltrice -> AddItem, "ingred_saltrice_01", 1
  elseif ( Player -> GetItemCount, "ingred_saltrice_01" == 0 )
;следующая строка считает кол-во ингред.в контейнере, чтобы отразить в свитке
; saltrice_count - глоб.переменная, содержащая кол-во определ.ингред
; поменяйте ее на нужную
     StopScript, "ingred_counter_main1"
;уберите комент и продублируйте след.строки на нужное кол-во списочных скр.
    ;StopScript, "ingred_counter_main2"
     set saltrice_count to ( B_contain_saltrice -> GetItemCount, "ingred_saltrice_01" )
     set state to 1
  endif
endif

if ( state == 1 )
if ( text_message == 1 )
  MessageBox, "Сортирую мясо крысы"
  set text_message to ( text_message + 1 )
endif
  if ( Player -> GetItemCount, "ingred_rat_meat_01" >= 512 )
     Player -> RemoveItem, "ingred_rat_meat_01", 512
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 512
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" >= 256 )
     Player -> RemoveItem, "ingred_rat_meat_01", 256
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 256
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" >= 128 )
     Player -> RemoveItem, "ingred_rat_meat_01", 128
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 128
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" >= 64 )
     Player -> RemoveItem, "ingred_rat_meat_01", 64
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 64
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" >= 32 )
     Player -> RemoveItem, "ingred_rat_meat_01", 32
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 32
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" >= 16 )
     Player -> RemoveItem, "ingred_rat_meat_01", 16
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 16
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" >= 8 )
     Player -> RemoveItem, "ingred_rat_meat_01", 8
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 8
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" >= 4 )
     Player -> RemoveItem, "ingred_rat_meat_01", 4
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 4
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" >= 2 )
     Player -> RemoveItem, "ingred_rat_meat_01", 2
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 2
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" > 0 )
     Player -> RemoveItem, "ingred_rat_meat_01", 1
     B_contain_rat -> AddItem, "ingred_rat_meat_01", 1
  elseif ( Player -> GetItemCount, "ingred_rat_meat_01" == 0 )
     StopScript, "ingred_counter_main1"
;уберите комент и продублируйте след.строки на нужное кол-во списочных скр.
    ;StopScript, "ingred_counter_main2"
     set ratmeat_count to ( B_contain_rat -> GetItemCount, "ingred_rat_meat_01" )
     set state to 2
  endif
endif

if ( state == 2 )
if ( text_message == 2 )
  MessageBox, "Сортирую корень трамы"
  set text_message to ( text_message + 1 )
endif
  if ( Player -> GetItemCount, "ingred_trama_root_01" >= 512 )
     Player -> RemoveItem, "ingred_trama_root_01", 512
     B_contain_trama -> AddItem, "ingred_trama_root_01", 512
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" >= 256 )
     Player -> RemoveItem, "ingred_trama_root_01", 256
     B_contain_trama -> AddItem, "ingred_trama_root_01", 256
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" >= 128 )
     Player -> RemoveItem, "ingred_trama_root_01", 128
     B_contain_trama -> AddItem, "ingred_trama_root_01", 128
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" >= 64 )
     Player -> RemoveItem, "ingred_trama_root_01", 64
     B_contain_trama -> AddItem, "ingred_trama_root_01", 64
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" >= 32 )
     Player -> RemoveItem, "ingred_trama_root_01", 32
     B_contain_trama -> AddItem, "ingred_trama_root_01", 32
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" >= 16 )
     Player -> RemoveItem, "ingred_trama_root_01", 16
     B_contain_trama -> AddItem, "ingred_trama_root_01", 16
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" >= 8 )
     Player -> RemoveItem, "ingred_trama_root_01", 8
     B_contain_trama -> AddItem, "ingred_trama_root_01", 8
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" >= 4 )
     Player -> RemoveItem, "ingred_trama_root_01", 4
     B_contain_trama -> AddItem, "ingred_trama_root_01", 4
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" >= 2 )
     Player -> RemoveItem, "ingred_trama_root_01", 2
     B_contain_trama -> AddItem, "ingred_trama_root_01", 2
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" > 0 )
     Player -> RemoveItem, "ingred_trama_root_01", 1
     B_contain_trama -> AddItem, "ingred_trama_root_01", 1
  elseif ( Player -> GetItemCount, "ingred_trama_root_01" == 0 )
     StopScript, "ingred_counter_main1"
;уберите комент и продублируйте след.строки на нужное кол-во списочных скр.
    ;StopScript, "ingred_counter_main2"
     set trama_count to ( B_contain_trama -> GetItemCount, "ingred_trama_root_01" )
     set state to 3
  endif
endif

if ( state == 3 )
if ( text_message == 3 )
  MessageBox, "Сортирую шкуру алита"
  set text_message to ( text_message + 1 )
endif
  if ( Player -> GetItemCount, "ingred_alit_hide_01" >= 512 )
     Player -> RemoveItem, "ingred_alit_hide_01", 512
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 512
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" >= 256 )
     Player -> RemoveItem, "ingred_alit_hide_01", 256
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 256
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" >= 128 )
     Player -> RemoveItem, "ingred_alit_hide_01", 128
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 128
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" >= 64 )
     Player -> RemoveItem, "ingred_alit_hide_01", 64
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 64
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" >= 32 )
     Player -> RemoveItem, "ingred_alit_hide_01", 32
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 32
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" >= 16 )
     Player -> RemoveItem, "ingred_alit_hide_01", 16
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 16
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" >= 8 )
     Player -> RemoveItem, "ingred_alit_hide_01", 8
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 8
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" >= 4 )
     Player -> RemoveItem, "ingred_alit_hide_01", 4
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 4
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" >= 2 )
     Player -> RemoveItem, "ingred_alit_hide_01", 2
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 2
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" > 0 )
     Player -> RemoveItem, "ingred_alit_hide_01", 1
     B_contain_alit -> AddItem, "ingred_alit_hide_01", 1
  elseif ( Player -> GetItemCount, "ingred_alit_hide_01" == 0 )
     StopScript, "ingred_counter_main1"
;уберите комент и продублируйте след.строки на нужное кол-во списочных скр.
    ;StopScript, "ingred_counter_main2"
     set alithide_count to ( B_contain_alit -> GetItemCount, "ingred_alit_hide_01" )
     set state to 4
  endif
endif

end

В этом скрипте применен метод половинного деления, т.к. работает он быстрее, чем простое удаление по одной штучке, но и скрипт получается больше. Поэтому их у вас, скорее всего, будет несколько. А следующие строки

StopScript, "ingred_counter_main1"

;уберите комент и продублируйте след.строки на нужное кол-во списочных скр.

      ;StopScript, "ingred_counter_main2"

Я ввел только сейчас, в скрипте в плаге их нет, но они должны помочь пресечь доступ к одной переменной из разных скриптов.

 

2. Самое неприятное. Нужно создать КУЧУ глобальных переменных. в которых будет храниться кол-во ингредиентов в каждом ящике. В принципе можно обойтись и без свитка, тогд вся след.часть вам не пригодится, но я подумал, что алхимику всегда удобно знать, что у него есть, а чего нету.

Далее создаем свиток (или книгу, не важно) и пишем в ней то, что есть и у меня, только на столько ингредиентов, на сколько нужно.

И снова скрипты:

begin ingred_counter_start

; Этот скрипт должен быть НА ВСЕХ контейнерах с ингредиентами
; Он стартует глоб.скрипт для того, чтобы снова подсчитать
; ингредиенты в ящике
short active_state

if ( OnActivate == 1 )
  set active_state to 1
  Activate
endif

if ( active_state == 0 )
  return
elseif ( active_state == 1 )
  if ( ScriptRunning, "ingred_counter_main1" == 0 )
     MessageBox, "Запускаем ingred_counter_main1";отладочные сообщения
     StartScript, "ingred_counter_main1"
     set active_state to 0
  else
     MessageBox, "ingred_counter_main1 уже запущен"
     set active_state to 0
  endif
endif
end

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

А вот осн.скрипт, их также будет несколько и в тестовом плаге скрипт необновленный:

begin ingred_counter_main1

;Глобальный скрипт, пересчитывающий число ингредиентов
; в контейнерах после доступа к ним

float timer

;В следующих строках запускайте все свои глоб.скрипты для списка
; возможно их будет 3 или 4
;StartScript, "ingred_counter_main2"

if ( GetPCCell, "House_mage" != 1 ); если ушли из дома - выкл.скрипт
  set timer to 0
  StopScript, "ingred_counter_main1"
 ;StopScript, "ingred_counter_main2"
  MessageBox, "Ingred_counter_main1 остановлен";закомментируйте строку после теста
  return
endif

if ( timer > 120 );после 2 минут работы останавливаем
  set timer to 0
  StopScript, "ingred_counter_main1"
 ;StopScript, "ingred_counter_main2"
  MessageBox, "Ingred_counter_main1 остановлен"
  return
endif
;---------------------------------------------------
;В скрипты "ingred_counter_main2" и последующие вставляйте
; только эту часть, не объявляйте переменную timer
; не вводите строки set timer to 0 и set timer to ( timer + GetSecondsPassed )
; и продублируйте нужное число раз;StopScript, "ingred_counter_main2"
;----------------------------------------------------
if (( B_contain_saltrice -> GetItemCount, "ingred_saltrice_01" ) != saltrice_count )
  set saltrice_count to ( B_contain_saltrice -> GetItemCount, "ingred_saltrice_01" )
  StopScript, "ingred_counter_main1"
 ;StopScript, "ingred_counter_main2"
  set timer to 0
  MessageBox, "Ingred_counter_main1 остановлен"
  return
endif

if (( B_contain_rat -> GetItemCount, "ingred_rat_meat_01" ) != ratmeat_count )
  set ratmeat_count to ( B_contain_rat -> GetItemCount, "ingred_rat_meat_01" )
  StopScript, "ingred_counter_main1"
 ;StopScript, "ingred_counter_main2"
  set timer to 0
  MessageBox, "Ingred_counter_main1 остановлен"
  return
endif

if (( B_contain_trama -> GetItemCount, "ingred_trama_root_01" ) != trama_count )
  set trama_count to ( B_contain_trama -> GetItemCount, "ingred_trama_root_01" )
  StopScript, "ingred_counter_main1"
 ;StopScript, "ingred_counter_main2"
  set timer to 0
  MessageBox, "Ingred_counter_main1 остановлен"
  return
endif

if (( B_contain_alit -> GetItemCount, "ingred_alit_hide_01" ) != alithide_count )
  set alithide_count to ( B_contain_alit -> GetItemCount, "ingred_alit_hide_01" )
  StopScript, "ingred_counter_main1"
 ;StopScript, "ingred_counter_main2"
  set timer to 0
  MessageBox, "Ingred_counter_main1 остановлен"
  return
endif

set timer to ( timer + GetSecondsPassed )

end

Надеюсь в деле копирования нужных скриптов вы разберетесь сами, там все не так уж сложно... а для того, чтобы проще было писать осн.сортировочный скрипт - в архиве вам в помощь файлик main_template, как им пользоваться написано в нем самом. Удачного модостроительства

Ссылка на комментарий
Поделиться на другие сайты

А теперь я покажу вам, как можно создать мусорный ящик для всяких ненужных уже вещей. Ведь к середине игры в вашем поместье (или где вы там живете) скапливается куча вещей, которые и продавать лень, и пространство они замусоривают, замедляя игру.

Вот и выход - ложим их в этот ящик и они все уходят в небытие...

 

Для этого нам понадобится пустой контейнер, теперь уже с ненулевой загрузкой, ставьте ее побольше - нам туда много чего придется сложить, и какой-нибудь активатор. В аттаче вы найдете архив с примерами скриптов, а также плаг для теста (это тот же плагин, что и в предыдущем случае, лишь дополненный мусоркой, она в другом конце комнаты).

 

1. Скрипт

 

begin trash_activator

short active
short message_state
short buton
short trash_timer
; Trash_reset - глоб.переменная, указывающая на начало обнуления контейнера

if ( OnActivate == 1 ); Активировали
  set active to 1
endif

if ( active == 0 ); если нет - неработаем
  return
endif

if ( active == 1 ); Фаза 1
  if ( message_state == 0 ); Задаем вопрос
     MessageBox, "Очистить мусорный контейнер?", "Да", "Нет"
     set message_state to 1
  elseif ( message_state == 1 );вопрос задан, ждем ответ
     set buton to GetButtonPressed
     if ( buton == -1 )
        return
     elseif ( buton == 0 ); ответили "Да" - идем в фазу 2
        set message_state to 0
        set active to 2
        set trash_timer to 0
     elseif ( buton == 1 ); ответили "нет" - возвращаемся назад
        set message_state to 0
        set active to 0
        set trash_timer to 0
     endif
  endif
endif

if ( active == 2 ); Фаза 2
  set Trash_reset to 1;начали удаление контейнера
  set active to 3
elseif ( active == 3 ); фаза 3
  set trash_timer to ( trash_timer + 1 ); даем ему время на удаление - 6 фреймов
  if ( trash_timer < 6 )
     return
  else
     set active to 4
  endif
elseif ( active == 4 ); фаза 4
;ставим новый пустой контейнер на прежнее место и обнуляем переменные
  PlaceItemCell, boblen_trashcan, House_mage, 4980.496, 3081.028, 16036.777, 10800
  set trash_timer to 0
  set active to 0
endif

end

 

Он вешается на активатор и служит для задания вопроса игроку, а также включает скрипт на ящике для его удаления, а после ставит новую копию ящика на старое место.

 

2. Скрипт

 

begin trash_reset_scr

short deltimer
;Trash_reset - глоб.переменная, указывающая на начало обнуления контейнера

if ( Trash_reset == 0 ); собираем вещички
  if ( deltimer != 0 ); обнулим тут таймер
     set deltimer to 0
  endif
  return
endif

if ( Trash_reset == 1 ); начинаем очистку!!!
  if ( deltimer == 0 ); 1 фрейм - дисаблим сундук
     Disable
  endif
  if ( deltimer < 4 ); ждем 4 фрейма
     set deltimer to ( deltimer + 1 )
  endif
  if ( deltimer == 4 ); 4 фрейм - обнуляем глоб.перем.для послед.использ.
     set Trash_reset to 0
     set deltimer to ( deltimer + 1 )
  endif
  if ( deltimer == 5 ); 5 фрейм - удаляем себя полностью
     SetDelete, 1
  endif
endif

end

 

Он вешается на мусорный контейнер и служит для его удаления.

 

 

Вот и все, надеюсь он поможет вам создать дом Вашей (и нашей) мечты. И не забывайте принимать участие в конкурсе.

Ссылка на комментарий
Поделиться на другие сайты

И еще один скрипт для вашего дома. Вам ведь всегда хотелось иметь в доме бочки с выпивкой, а то она такая тяжелая. Нет ничего проще - создаем активатор, мождель уже есть в игре, и вешаем на него такой скрипт (я приведу скрипт для мацта, для остальных напитков вам придется заменить только ID напитков и их названия в messagebox - ничего сложного).

Попробовать в работе можно, подключив плаг из архива и набрав в консоли coc, drink_house

Скрипт:

begin BES_mazt_script_adv

short MessageOn
short buttons
short capacity;вместимость бочки
short tempcapacity
short tempcap
short active
; active=0 - скрипт не работает
; active=1 - задаем вопросы
; active=10 - секция 10 - заполнение кега
; active=20 - секция 20 - выбираем сколько взять
; active=30 - секция 30 - не используется
; active=40 - секция 40 - взять нужное кол-во
; active=50 - секция 50 - пьем из бочки

if ( OnActivate == 1 )
  set active to 1
endif

if ( active == 0 )
  return
endif

if ( active == 1 ); самое начало скрипта
  if ( capacity == 0 ); в бочке ничего нет
     if ( MessageOn == 0 ); спросим и пойдем дальше
        MessageBox, "В бочке нет мацта", "Заполнить кег", "Ненадо"
        set MessageOn to 1
     elseif ( MessageOn == 1 ); тут будем ждать, пока игрок выберет
        set buttons to GetButtonPressed
        if ( buttons == -1 )
           return
        elseif ( buttons == 0 );нажал "Заполнить"
           set active to 10; идем в секцию 10
           set MessageOn to 0
        elseif ( buttons == 1 ); нажал "Ненадо" - все сбросим
          set MessageOn to 0
          set active to 0
        endif
     endif
  elseif ( capacity > 0 ); в бочке что-то есть
     if ( MessageOn == 0 ); сообщим сколько и спросим побольше
        MessageBox, "В бочке %g порций мацта", capacity, "Заполнить кег", "Заполнить тару", "Выпить", "Отмена"
        set MessageOn to 1
     elseif ( MessageOn == 1 ); тут будем ждать, пока игрок выберет
        set buttons to GetButtonPressed
        if ( buttons == -1 )
           return
        elseif ( buttons == 0 ); Выбрал "Заполнить"
           set active to 10; Идем в секцию 10
           set MessageOn to 0
        elseif ( buttons == 1 ); Выбрал разлить в тару
           set active to 20; идем в секцию 20
           set tempcapacity to 1
           set MessageOn to 0
        elseif ( buttons == 2 ); выбрал выпить
           set active to 50; идем в секцию 50
           set MessageOn to 0
        elseif ( buttons == 3 ); выбрал "Отмена"
           set active to 0; сбросим все
           set MessageOn to 0
        endif
     endif
  endif
endif

;Секция 10 - заполнение бочки
;Заполняем методом половинного деления
;После выдаем сообщение, сколько порций в бочке

if ( active == 10 )
  if ( player -> GetItemCount, "Potion_Local_Brew_01" >= 128 )
     set capacity to ( capacity + 128 )
     player -> RemoveItem, "Potion_Local_Brew_01", 128
  elseif ( player -> GetItemCount, "Potion_Local_Brew_01" >= 32 )
     set capacity to ( capacity + 32 )
     player -> RemoveItem, "Potion_Local_Brew_01", 32
  elseif ( player -> GetItemCount, "Potion_Local_Brew_01" >= 8 )
     set capacity to ( capacity + 8 )
     player -> RemoveItem, "Potion_Local_Brew_01", 8
  elseif ( player -> GetItemCount, "Potion_Local_Brew_01" >= 1 )
     set capacity to ( capacity + 1 )
     player -> RemoveItem, "Potion_Local_Brew_01", 1
  elseif ( player -> GetItemCount, "Potion_Local_Brew_01" == 0 )
     PlaySound, "potion success"
     MessageBox, "Сейчас в бочке %g порций мацта", capacity
     set active to 0
     return
  endif
endif

;Секция 20 - выбрать, сколько взять

if ( active == 20 )
  if ( MessageOn == 0 ); зададим вопрос
     MessageBox, "Сейчас в бочке %g порций мацта. Вы берете %g порций", capacity, tempcapacity, "-100", "-10", "-1", "OK", "+1", "+10", "+100", "Все", "Ничего"
     set MessageOn to 1
  elseif ( MessageOn == 1 )
     set buttons to GetButtonPressed
     if ( buttons == -1 ); ждем ответа
        return
     elseif ( buttons == 0 ); выбрали -100
        set tempcapacity to ( tempcapacity - 100 )
        if ( tempcapacity < 0 )
           set tempcapacity to 0
           set MessageOn to 0; спросим еще
        elseif ( tempcapacity > capacity )
           set tempcapacity to capacity
           set MessageOn to 0
        endif
        set MessageOn to 0
     elseif ( buttons == 1 ); выбрали -10
        set tempcapacity to ( tempcapacity - 10 )
        if ( tempcapacity < 0 )
           set tempcapacity to 0
           set MessageOn to 0
        elseif ( tempcapacity > capacity )
           set tempcapacity to capacity
           set MessageOn to 0
        endif
        set MessageOn to 0
     elseif ( buttons == 2 ); выбрали -1
        set tempcapacity to ( tempcapacity - 1 )
        if ( tempcapacity < 0 )
           set tempcapacity to 0
           set MessageOn to 0
        elseif ( tempcapacity > capacity )
           set tempcapacity to capacity
           set MessageOn to 0
        endif
        set MessageOn to 0
     elseif ( buttons == 3 ); выбрали ОК - идем в секцию 40
        set active to 40
        set MessageOn to 0
        set capacity to ( capacity - tempcapacity ); считаем остаток
        set tempcap to tempcapacity; запоминаем сколько взяли
     elseif ( buttons == 4 ); выбрали +1
        set tempcapacity to ( tempcapacity + 1 )
        if ( tempcapacity < 0 )
           set tempcapacity to 0
           set MessageOn to 0
        elseif ( tempcapacity > capacity )
           set tempcapacity to capacity
           set MessageOn to 0
        endif
        set MessageOn to 0
     elseif ( buttons == 5 ); выбрали +10
        set tempcapacity to ( tempcapacity + 10 )
        if ( tempcapacity < 0 )
           set tempcapacity to 0
           set MessageOn to 0
        elseif ( tempcapacity > capacity )
           set tempcapacity to capacity
           set MessageOn to 0
        endif
        set MessageOn to 0
     elseif ( buttons == 6 ); выбрали +100
        set tempcapacity to ( tempcapacity + 100 )
        if ( tempcapacity < 0 )
           set tempcapacity to 0
           set MessageOn to 0
        elseif ( tempcapacity > capacity )
           set tempcapacity to capacity
           set MessageOn to 0
        endif
        set MessageOn to 0
     elseif ( buttons == 7 ); выбрали все
        set tempcapacity to capacity; идем брать все
        set tempcap to tempcapacity
        set capacity to 0
        set active to 40
        set MessageOn to 0
     elseif ( buttons == 8 ); выбрали отмену - сбросим
        set tempcapacity to 1
        set MessageOn to 0
        set active to 0
     endif
  endif
endif
     


;Секция 40 - взять все
;Забираем также, как и заполняем бочку
;Методом половинного деления
;По окончании выдаем сообщение и останавливаемся

if ( active == 40 )
  if ( tempcapacity >= 128 )
        set tempcapacity to ( tempcapacity - 128 )
        player -> AddItem, "Potion_Local_Brew_01", 128
  elseif ( tempcapacity >= 32 )
        set tempcapacity to ( tempcapacity - 32 )
        player -> AddItem, "Potion_Local_Brew_01", 32
  elseif ( tempcapacity >= 8 )
        set tempcapacity to ( tempcapacity - 8 )
        player -> AddItem, "Potion_Local_Brew_01", 8
  elseif ( tempcapacity >= 1 )
        set tempcapacity to ( tempcapacity - 1 )
        player -> AddItem, "Potion_Local_Brew_01", 1
  elseif ( tempcapacity == 0 )
        PlaySound, "potion success"
        MessageBox, "Вы взяли %g порций мацта. В бочке осталось %g порций", tempcap, capacity
        set active to 0
  endif
endif

;Секция 50 - выпить

if ( active == 50 )
  if ( capacity > 0 ); выпивки достаточно
     set capacity to ( capacity - 1 );возьмем порцию
     player -> AddItem, "Potion_Local_Brew_01", 1; дадим игроку
     player -> Equip, "Potion_Local_Brew_01"; заставим его выпить
     MessageBox, "Вы выпили порцию мацта. В бочке осталось %g порций.", capacity; Скажем остаток
     set active to 0; остановимся
  else
     set active to 1; А если недостаточно - предложим заполнить
  endif
endif

end

Ссылка на комментарий
Поделиться на другие сайты

  • 2 месяца спустя...
  • 6 месяцев спустя...
  • 1 месяц спустя...
В этом скрипте применен метод половинного деления, т.к. работает он быстрее, чем простое удаление по одной штучке, но и скрипт получается больше. Поэтому их у вас, скорее всего, будет несколько.

А почему нельзя:

short trama_root

set trama root to ( player -> Getitemcount "trama root" )

player->removeitem "trama root" trama_root

trama_container->additem "trama root" trama_root

Ссылка на комментарий
Поделиться на другие сайты

А почему нельзя:

short trama_root

set trama root to ( player -> Getitemcount "trama root" )

player->removeitem "trama root" trama_root

trama_container->additem "trama root" trama_root

 

Потому, уважаемый, что эти функции могут принимать глобальные переменные и только в поле результатов диалога.

Ссылка на комментарий
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...