SoC. Не бесконечные болты — различия между версиями — S.T.A.L.K.E.R. Inside Wiki

SoC. Не бесконечные болты — различия между версиями

Материал из S.T.A.L.K.E.R. Inside Wiki

Перейти к: навигация, поиск
(Новая страница: «Итак тут я опишу как реализовать болты которые будут заканчиваться. Сразу пишу о том, что…»)
 
Строка 1: Строка 1:
 
Итак тут я опишу как реализовать болты которые будут заканчиваться.
 
Итак тут я опишу как реализовать болты которые будут заканчиваться.
Сразу пишу о том, что будем делать основываясь на гранатах, так, что не исключено что болт может рвануть (не нанеся урон и только через продолжительный участок времени, так что гг навряд ли будет по близости.) а также если бросим болт под ноги НПСу, он шуганётся как от грены (это на самом деле не плохо, если отключены глаза на затылке можно попробовать их таким образом отвлечь).
+
Сразу пишу о том, что будем делать основываясь на гранатах, так, что не исключено что болт может рвануть (не нанеся урон и только через продолжительный участок времени, так что гг навряд ли будет по близости.), а также, если бросим болт под ноги НПСу, он шуганётся, как от грены (это на самом деле не плохо, если отключены глаза на затылке, можно попробовать их таким образом отвлечь).
  
 
Итак приступим.
 
Итак приступим.
 
Нам потребуются такие файлы:
 
Нам потребуются такие файлы:
gamedata\config\weapons\w_rgd5.ltx
+
===gamedata\config\weapons\w_rgd5.ltx
 
gamedata\config\weapons\w_bolt.ltx
 
gamedata\config\weapons\w_bolt.ltx
 
gamedata\config\misc\items.ltx
 
gamedata\config\misc\items.ltx
 
gamedata\scripts\escape_dialog.script
 
gamedata\scripts\escape_dialog.script
gamedata\scripts\bind_stalker.script
+
gamedata\scripts\bind_stalker.script===
  
В первую очередь лезем в файл w_bolt.ltx, там самая первая строка которая за что-то отвечает:
+
В первую очередь лезем в файл ===w_bolt.ltx===, там самая первая строка, которая за что-то отвечает:
 
<code>
 
<code>
 
[bolt]:identity_immunities
 
[bolt]:identity_immunities
Строка 19: Строка 19:
 
</code>
 
</code>
 
Сохраняем и закрываем.
 
Сохраняем и закрываем.
Затем, открываем файл w_rgd5.ltx, спускаемся в самый низ и пишем это:
+
Затем, открываем файл ===w_rgd5.ltx===, спускаемся в самый низ и пишем это:
  
<code>
+
<ini>
 
[bolt]:grenade_rgd5  
 
[bolt]:grenade_rgd5  
 
visual = weapons\bolt\wpn_bolt.ogf
 
visual = weapons\bolt\wpn_bolt.ogf
Строка 80: Строка 80:
 
anim_throw_act = attack_0_act
 
anim_throw_act = attack_0_act
 
anim_throw_end = attack_0_end
 
anim_throw_end = attack_0_end
</code>
+
</ini>
  
 
Подробно:
 
Подробно:
  
<code>
+
<ini>
 
[bolt]:grenade_rgd5 ;--секция с отсылкой на секцию grenade_rgd5
 
[bolt]:grenade_rgd5 ;--секция с отсылкой на секцию grenade_rgd5
 
visual = weapons\bolt\wpn_bolt.ogf ;--визуал, в данном случае модель болта
 
visual = weapons\bolt\wpn_bolt.ogf ;--визуал, в данном случае модель болта
Строка 143: Строка 143:
 
anim_throw_act = attack_0_act
 
anim_throw_act = attack_0_act
 
anim_throw_end = attack_0_end
 
anim_throw_end = attack_0_end
</code>
+
</ini>
  
 
Всё, сохраняем, закрываем. Этот файл нам больше не нужен.
 
Всё, сохраняем, закрываем. Этот файл нам больше не нужен.
Теперь лезем в файл items.ltx и в конец пишем:
+
Теперь лезем в файл ===items.ltx=== и в конец пишем:
  
<code>
+
<ini>
 
[bolt_box]:identity_immunities
 
[bolt_box]:identity_immunities
 
GroupControlSection = spawn_group
 
GroupControlSection = spawn_group
Строка 195: Строка 195:
 
position_offset = 0.0,0.0,0.0
 
position_offset = 0.0,0.0,0.0
 
angle_offset = 1.570790,1.570790,3.92699
 
angle_offset = 1.570790,1.570790,3.92699
</code>
+
</ini>
  
 
Сохраняем, закрываем.
 
Сохраняем, закрываем.
Дальше мы должны открыть файл escape_dialog.script
+
Дальше мы должны открыть файл ===escape_dialog.script===
 
В конец файла внесём свою функцию:
 
В конец файла внесём свою функцию:
  
<code>
+
<lua>
 
function use_bolt_box_oz(obj)
 
function use_bolt_box_oz(obj)
  if obj ~= nil then
+
    if obj ~= nil then
      if obj:section() == "bolt_box" then
+
        if obj:section() == "bolt_box" then
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
            for i = 1, 25 do --Совершаем спавн 25 раз
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
            alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
        end
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
 
end
 
end
 
     end
 
     end
 
end
 
end
</code>
+
</lua>
  
 
Подробно:
 
Подробно:
  
<code>
+
<lua>
 
function use_bolt_box_oz(obj) --функция с названием use_bolt_box_oz(obj)
 
function use_bolt_box_oz(obj) --функция с названием use_bolt_box_oz(obj)
  if obj ~= nil then
+
    if obj ~= nil then
      if obj:section() == "bolt_box" then -- объект который должны мы использовать (коробка болтов)
+
        if obj:section() == "bolt_box" then -- объект который должны мы использовать (коробка болтов)
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавн болта в инвентарь гг  
+
            for i = 1, 25 do --Совершаем спавн 25 раз
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
            alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавн болта в инвентарь гг
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
        end -- окончание цикла for i =...
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
    alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
+
 
end --окончание if
 
end --окончание if
 
     end --окончание if
 
     end --окончание if
end -- окончание функции
+
end --окончание функции
</code>
+
</lua>
  
В этом же файле находим функцию give_weapon_to_actor и вносим такие строчки перед end:
+
В этом же файле находим функцию ==give_weapon_to_actor== и вносим такие строчки перед ==end==:
  
 
<code>
 
<code>
Строка 279: Строка 235:
  
 
В этом файле тоже всё.
 
В этом файле тоже всё.
Теперь ломимся в bind_stalker.script
+
Теперь ломимся в ===bind_stalker.script===
Пишем в функцию function actor_binder:net_destroy() это:  
+
Пишем в функцию ==function actor_binder:net_destroy()== это:  
  
 
<code>
 
<code>
Строка 294: Строка 250:
 
В конец файла добавляем нашу функцию:
 
В конец файла добавляем нашу функцию:
  
<code>
+
<lua>
 
function actor_binder:use_object(obj)
 
function actor_binder:use_object(obj)
 
     escape_dialog.use_bolt_box_oz(obj)
 
     escape_dialog.use_bolt_box_oz(obj)
 
end
 
end
</code>
+
</lua>
  
 
Подробно:
 
Подробно:
  
<code>
+
<lua>
 
function actor_binder:use_object(obj) -- function название нашей функции
 
function actor_binder:use_object(obj) -- function название нашей функции
 
     escape_dialog.use_bolt_box_oz(obj) --вызов функции use_bolt_box_oz(obj) из файла escape_dialog.script
 
     escape_dialog.use_bolt_box_oz(obj) --вызов функции use_bolt_box_oz(obj) из файла escape_dialog.script
 
end --окончание функции
 
end --окончание функции
</code>
+
</lua>
  
 
Ну вот и всё, сохраняем и закрываем данный файл.
 
Ну вот и всё, сохраняем и закрываем данный файл.
Заходим в игру, и если я нигде не ошибся наблюдаем не бесконечный болт в начале игры. Что бы болт был не один - идите к Волку, он даст вам ещё 1 болт и  
+
Заходим в игру, и, если я нигде не ошибся, наблюдаем не бесконечный болт в начале игры. Чтобы болт был не один, идите к Волку, он даст вам ещё 1 болт и целую коробку болтов. Чтобы изъять болты из коробки, просто воспользуйтесь ей, кликните по ней 2 раза.
целую коробку болтов. Что бы изъять болты из коробки просто воспользуйтесь ей, кликните по ней 2 раза.
+
Надеюсь, что статья оказалась вам полезна.
Надеюсь что статья оказалась вам полезна.
+
  
 
Автор: Dj Ultor
 
Автор: Dj Ultor
  
 
[[Категория:Скрипты]]
 
[[Категория:Скрипты]]

Версия 08:34, 2 декабря 2014

Итак тут я опишу как реализовать болты которые будут заканчиваться. Сразу пишу о том, что будем делать основываясь на гранатах, так, что не исключено что болт может рвануть (не нанеся урон и только через продолжительный участок времени, так что гг навряд ли будет по близости.), а также, если бросим болт под ноги НПСу, он шуганётся, как от грены (это на самом деле не плохо, если отключены глаза на затылке, можно попробовать их таким образом отвлечь).

Итак приступим. Нам потребуются такие файлы: ===gamedata\config\weapons\w_rgd5.ltx gamedata\config\weapons\w_bolt.ltx gamedata\config\misc\items.ltx gamedata\scripts\escape_dialog.script gamedata\scripts\bind_stalker.script===

В первую очередь лезем в файл ===w_bolt.ltx===, там самая первая строка, которая за что-то отвечает:

[bolt]:identity_immunities

Меняем её вот так:

[old_bolt]:identity_immunities

Сохраняем и закрываем. Затем, открываем файл ===w_rgd5.ltx===, спускаемся в самый низ и пишем это:

 
[bolt]:grenade_rgd5 
visual				= weapons\bolt\wpn_bolt.ogf
inv_name			= "Болт"
inv_name_short		= "Болт"
inv_weight			= 0.05
cost				= 1
hud					= bolt_hud2
ef_weapon_type		= 1
description			= "Обычный металлический болт"
destroy_time		= 5000000;3500
 
attach_position_offset	= -0.021,-0.075,0.0
attach_angle_offset		= 0,0,0
attach_bone_name		= 
 
blast				= 0
blast_r				= 0
blast_impulse		= 0
;delete
blast_impulse_factor = 1
 
frags				= 0
frags_r				= 0
frag_hit			= 0
frag_hit_impulse	= 0
 
;звуки
snd_explode = monsters\biting\def_0    ;rgd5_explode
snd_checkout = monsters\biting\def_0
explode_particles	= weapons\wg-hit-ground
 
inv_grid_width		= 1
inv_grid_height		= 1
inv_grid_x			= 22
inv_grid_y			= 6
 
light_color		         = 0.0,0.0,0.0
light_range		         = 0.0
light_time 		         = 0.0
 
[bolt_hud2]
fire_point          = 0.05, 0.0, 0.1
fire_bone           = bolt_0
orientation         = 0,0,0
position            = 0,0,0
visual              = weapons\bolt\wpn_bolt_hud.ogf
 
throw_point			= 0,0.4,0.3
throw_dir			= 0,0,0
 
anim_show			= draw3
anim_hide			= holster_0
anim_idle			= idle_0
anim_playing		= idle_01
anim_throw_begin	              = attack_0_begin
anim_throw_idle		= attack_0_idle
anim_throw_act		= attack_0_act	
anim_throw_end		= attack_0_end
 

Подробно:

 
[bolt]:grenade_rgd5 ;--секция с отсылкой на секцию grenade_rgd5
visual				= weapons\bolt\wpn_bolt.ogf ;--визуал, в данном случае модель болта
inv_name			= "Болт" ;--название
inv_name_short		= "Болт" ;--название
inv_weight			= 0.05 ;вес
cost				= 1 ;цена за штуку
hud					= bolt_hud2 ;--ссылка на худ
ef_weapon_type		= 1 ;тип оружия (не менять ни в коем случае, можно сломать двигло)
description			= "Обычный металлический болт" ;--описание предмета
destroy_time		= 5000000;3500 ;лучше оставить как есть, а так это время через которое болт пропадёт
 
attach_position_offset	= -0.021,-0.075,0.0
attach_angle_offset		= 0,0,0
attach_bone_name		= 
 
blast				= 0 ;мощность взрыва, так как это болт, пусть будет 0
blast_r				= 0 ; радиус взрыва
blast_impulse		= 0 ;импульс от взрыва (отражается на дальности отлёта туши от места взрыва)
;delete
blast_impulse_factor = 1
 
frags				= 0 ;кол-во осколков
frags_r				= 0 ; радиус разлёта осколков
frag_hit			= 0 ; урон от 1 попавшего осколка
frag_hit_impulse	= 0 ; импульс от 1 попавшего осколка
 
;звуки
snd_explode = monsters\biting\def_0    ;rgd5_explode звук взрыва
snd_checkout = monsters\biting\def_0 ;звук броска
explode_particles	= weapons\wg-hit-ground ; партикл взрыва (в данном случае поставлен партикл ничего не показывающий)
 
inv_grid_width		= 1 
inv_grid_height		= 1
inv_grid_x			= 22
inv_grid_y			= 6
 
light_color		         = 0.0,0.0,0.0 ;цвет освещения во время взрыва по RGB
light_range		         = 0.0 ;насыщенность на сколько я понимаю
light_time 		         = 0.0 ;время подсветки
 
[bolt_hud2] ;секция худа
fire_point          = 0.05, 0.0, 0.1
fire_bone           = bolt_0
orientation         = 0,0,0
position            = 0,0,0
visual              = weapons\bolt\wpn_bolt_hud.ogf ;Визуал болта в руках гг
 
throw_point			= 0,0.4,0.3
throw_dir			= 0,0,0
 
anim_show			= draw3
anim_hide			= holster_0
anim_idle			= idle_0
anim_playing		= idle_01
anim_throw_begin	              = attack_0_begin
anim_throw_idle		= attack_0_idle
anim_throw_act		= attack_0_act	
anim_throw_end		= attack_0_end
 

Всё, сохраняем, закрываем. Этот файл нам больше не нужен. Теперь лезем в файл ===items.ltx=== и в конец пишем:

 
[bolt_box]:identity_immunities
GroupControlSection	= spawn_group
discovery_dependency = 
$spawn 				= "food and drugs\kolbasa"
;$prefetch 			= 32
class				= II_FOOD
cform				= skeleton
visual				= physics\box\box_metall_01.ogf
radius				= 1
;script_binding		= escape_dialog.use_snd
 
inv_name			        = "Коробка болтов"
inv_name_short		        = "Коробка болтов"
description			= "Коробка с болтами, содержит в себе 25 болтов."
inv_weight			= 1.35
can_trade			= on
inv_grid_width		= 2
inv_grid_height		= 1
inv_grid_x			= 8
inv_grid_y			= 18
cost				= 30
 
; eatable item
eat_health = 0
eat_satiety = 0
eat_power = 0
eat_radiation = 0
wounds_heal_perc = 0
eat_portions_num = -1
 
; food item
slot				= 4
animation_slot		= 4
 
;hud item
hud = wpn_vodka_hud
 
attach_angle_offset		= 0.440521, 1.378287, -0.644026
attach_position_offset	= 0.104196, -0.010821, 0.076969
attach_bone_name		= bip01_r_hand
auto_attach				= false
 
// should be deleted after update
bone_name				= bip01_r_hand
position_offset			 = 0.0,0.0,0.0
angle_offset			 = 1.570790,1.570790,3.92699
 

Сохраняем, закрываем. Дальше мы должны открыть файл ===escape_dialog.script=== В конец файла внесём свою функцию:

 
function use_bolt_box_oz(obj)
    if obj ~= nil then
        if obj:section() == "bolt_box" then
            for i = 1, 25 do --Совершаем спавн 25 раз
    	        alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id())
    	    end
	end
    end
end
 

Подробно:

 
function use_bolt_box_oz(obj) --функция с названием use_bolt_box_oz(obj)
    if obj ~= nil then
        if obj:section() == "bolt_box" then -- объект который должны мы использовать (коробка болтов)
            for i = 1, 25 do --Совершаем спавн 25 раз
    	        alife():create("bolt", db.actor:position(), db.actor:level_vertex_id(), db.actor:game_vertex_id(), db.actor:id()) -- спавн болта в инвентарь гг
    	    end -- окончание цикла for i =...
	end --окончание if
    end --окончание if
end --окончание функции
 

В этом же файле находим функцию ==give_weapon_to_actor== и вносим такие строчки перед ==end==:

dialogs.relocate_item_section(trader, "bolt_box", "in")  
dialogs.relocate_item_section(trader, "bolt", "in")

В этом файле тоже всё. Теперь ломимся в ===bind_stalker.script=== Пишем в функцию ==function actor_binder:net_destroy()== это:

self.object:set_callback(callback.use_object, nil)

И в функцию actor_binder:reinit() это:

self.object:set_callback(callback.use_object, self.use_object, self)

В конец файла добавляем нашу функцию:

 
function actor_binder:use_object(obj)
    escape_dialog.use_bolt_box_oz(obj)
end
 

Подробно:

 
function actor_binder:use_object(obj) -- function название нашей функции
    escape_dialog.use_bolt_box_oz(obj) --вызов функции use_bolt_box_oz(obj) из файла escape_dialog.script
end --окончание функции
 

Ну вот и всё, сохраняем и закрываем данный файл. Заходим в игру, и, если я нигде не ошибся, наблюдаем не бесконечный болт в начале игры. Чтобы болт был не один, идите к Волку, он даст вам ещё 1 болт и целую коробку болтов. Чтобы изъять болты из коробки, просто воспользуйтесь ей, кликните по ней 2 раза. Надеюсь, что статья оказалась вам полезна.

Автор: Dj Ultor

Другие места
LANGUAGE