У меня на карте есть здание, которое стоит 225 дерева. Это здание может делать улучшения, которые работают только на само здание.
Стоимость улучшения первого уровня - 450 дерева.
Второго улучшения - 675.
Третьего - 900, и т. д. (растёт на 225 дерева).
Помогите написать формулу или функцию, которая будет возвращать стоимость здания, учитывая все улучшения, функция может брать уровень улучшения (возможно, еще что-то, если нужно).
Например, если здание имеет улучшение третьего уровня, функция должна вернуть: стоимость самого здания + стоимость улучшения первого уровня + стоимость улучшения второго уровня + стоимость улучшения третьего уровня.
З                        = 225                             = 225
З + У1                   = 225 + 450                       = 675
З + У1 + У2              = 225 + 450 + 675                 = 1350
З + У1 + У2 + У3         = 225 + 450 + 675 + 900           = 2250
З + У1 + У2 + У3 + У4    = 225 + 450 + 675 + 900 + 1125    = 3375

Принятый ответ

мб с циклом
int GetPrice (unit whichUnit)
{
	int i = GetPlayerTechCount( GetOwningPlayer( whichUnit ), techId, true )
	int a=225
	loop {exitwhen(i<=0); a=a+(i+1)*225; i=i-1}
	return a
}
1
23
7 лет назад
Отредактирован Тимур
1
Эм, ну наверное так:
225 * ( GetPlayerTechCount( GetOwningPlayer( whichUnit ), techId, true ) + 1 )
Где whichUnit - здание, стоимость которого в древесине нужно узнать, а techId - id улучшения, уровень которого проверяем.
0
21
7 лет назад
Отредактирован scopterectus
0
Тимур:
Эм, ну наверное так:
225 * ( GetPlayerTechCount( GetOwningPlayer( whichUnit ), techId, true ) + 1 )
Где whichUnit - здание, стоимость которого в древесине нужно узнать, а techId - id улучшения, уровень которого проверяем.
Не получается. Верно возвращает, лишь для здания без улучшений.

З                                   =  225                                        = 225
З + У1                          = 225 + 450                               = 675
З + У1 + У2                  = 225 + 450 + 675                     = 1350
З + У1 + У2 + У3         = 225 + 450 + 675 + 900            = 2250
З + У1 + У2 + У3 + У4 = 225 + 450 + 675 + 900 + 1125 = 3375
Где 3 - стоимость здания, где У - улучшение с уровнем.
0
27
7 лет назад
Отредактирован MpW
0
ScopteRectuS, сделай базу данных. стандартным способом узнать не получится, нет такой нативки. мемхаком наверное
первый способ
вот при инициализации, берешь целочисленную записываешь в хэш
//по равкоду
call SaveInteger(Hash, rawcode, 0, 225) //1 здание
call SaveInteger(Hash, upgrage1, 0, 450) //upgrage 1
call SaveInteger(Hash, upgrage2, 0, 675) //upgrage 2
//вместо rawcode или upgrage 1,2 пиши например так: 'hfoo' - это обыкновенные числа в 256-ричной системе
если нужно достать стоимость, в качестве ключа проверяешь равкод (rawcode, upgrage 1,2)
set CostWood = LoadInteger(Hash, GetUnitTypeId(GetTriggerUnit()), 0) 
по хэндлу
вот при инициализации, берешь целочисленную записываешь в хэш
//по равкоду записываешь изначальную стоимость здания
call SaveInteger(Hash, rawcode, 0, 225) //стоимость здание - древесина
call SaveInteger(Hash, rawcode, 1, 100) //стоимость здание - золото
//сохраняем по ключу хэндлу GetHandleId, по формуле от изначально стоимости
call SaveInteger(Hash, GetHandleId(GetTriggeriUnit()), 0, 0)  //кол-во апргрейдов равно ноль
при улучшении строительства прибавляешь счетчик
set id = GetHandleId(GetTriggeriUnit()) //хэндл юнита, номер объекта
set k = LoadInteger(Hash, id, 0) //загружаем счетчик апгрейдов по ключу хэндлов
call SaveInteger(Hash, id, 0, k+1) //сохраняем кол-во апргрейдов
А когда нужно достать стоимость по той формуле, что выше. Ты берешь счетчик, изначальную цену, и считываешь себе стоимость.
можно еще в качестве базы данных поля в РО забить, но что-то не вижу ничего. У здании уровни не отображаются, хп у итемов делаются так как там не видно хп, короче не много вариантов у зданий. Есть еще CustomValue, но на триггерах это
0
21
7 лет назад
0
Steal nerves:
ScopteRectuS, сделай базу данных. стандартным способом узнать не получится, нет такой нативки.
первый способ
вот при инициализации, берешь целочисленную записываешь в хэш
//по равкоду
call SaveInteger(Hash, rawcode, 0, 225) //1 здание
call SaveInteger(Hash, upgrage1, 0, 450) //upgrage 1
call SaveInteger(Hash, upgrage2, 0, 675) //upgrage 2
если нужно достать стоимость, в качестве ключа проверяешь равкод (rawcode, upgrage 1,2)
по хэндлу
вот при инициализации, берешь целочисленную записываешь в хэш
//по равкоду записываешь изначальную стоимость здания
call SaveInteger(Hash, rawcode, 0, 225) //стоимость здание - древесина
call SaveInteger(Hash, rawcode, 1, 100) //стоимость здание - золото
//сохраняем по ключу хэндлу GetHandleId, по формуле от изначально стоимости
call SaveInteger(Hash, GetHandleId(GetTriggeriUnit()), 0, 0)  //кол-во апргрейдов равно ноль
У меня очень много уровней (писать всё это, может где-нибудь неправильно равкод введу), неужели вообще нет какого-нибудь способа? Необязательно функцию, может как-то математически можно вывести?
Этот комментарий удален
0
21
7 лет назад
0
biridius:
Не работает. (
4
20
7 лет назад
Отредактирован biridius
4
мб с циклом
int GetPrice (unit whichUnit)
{
	int i = GetPlayerTechCount( GetOwningPlayer( whichUnit ), techId, true )
	int a=225
	loop {exitwhen(i<=0); a=a+(i+1)*225; i=i-1}
	return a
}
Принятый ответ
0
21
7 лет назад
0
int GetPrice (unit whichUnit)
{
int i = GetPlayerTechCount( GetOwningPlayer( whichUnit ), techId, true )
int a=225
loop {exitwhen(i==0); a+=((i+1)*225); i=i-1}
return a
}
Чувак, ты лучший! Работает!
Чтобы оставить комментарий, пожалуйста, войдите на сайт.