You are not logged in.
Pages: 1
Всем ещё раз привет. Сразу к делу.
Скрипт: бонус (см. р. "модификации"), последняя версия. http://upanel.biz/r/bonus.cs
Исходник: http://upanel.biz/r/bonus.txt
И запись из SCMLOG после вылета:
********************************************
thread rbonus
Local variables dump:
1156936683 -994583857 1096167062 17826353 1103035424 1115773914 39977088 0 0 0 0 1157381014 1156939719 -994585265 1097215733 0
17891889 6881864 7602762 0 0 -998637568 1095118486 0 1157385397 -994926855 1098425869 0 0 0 1 1
********************************************
00003037: 00D6
get numeric params: 1
param 1 = 0
00003041: 056E
get numeric params: 1
param 1 = 0
00003046: 004D (&IFresult = False)
get numeric params: 1
param 1 = -3118 (&label: 0860)
00003118: 0860
get numeric params: 2
param 1 = 1
param 2 = 0
00003126: 00D6
get numeric params: 1
param 1 = 0
00003130: 00DF
get numeric params: 1
param 1 = 1
00003135: 004D (&IFresult = False)
get numeric params: 1
param 1 = -3158 (&label: 04BB)
00003158: 04BB
get numeric params: 1
param 1 = 0
00003163: 00A1
get numeric params: 4
param 1 = 1
param 2 = 1963.99
param 3 = -1470.67
param 4 = 14.39
00003177: 057E
get numeric params: 1
param 1 = 0
00003181: 0581
get numeric params: 1
param 1 = 1
00003185: 00D6
get numeric params: 1
param 1 = 0
00003189: 8214
get numeric params: 1
param 1 = 17891889
00003194: 004D (&IFresult = True)
get numeric params: 1
param 1 = -3206 (&label: 00D6)
00003201: 0215
get numeric params: 1
param 1 = 17891889
00003206: 00D6
get numeric params: 1
param 1 = 0
00003210: 8214
get numeric params: 1
param 1 = 17891889
00003215: 004D (&IFresult = True)
get numeric params: 1
param 1 = -3227 (&label: 00D6)
00003222: 0215
get numeric params: 1
param 1 = 6881864
00003227: 00D6
get numeric params: 1
param 1 = 0
00003231: 8214
get numeric params: 1
param 1 = 17891889
00003236: 004D (&IFresult = True)
get numeric params: 1
param 1 = -3248 (&label: 016A)
00003243: 0215
get numeric params: 1
param 1 = 7602762
00003248: 016A
get numeric params: 2
param 1 = 500
param 2 = 1
00003255: 0051
*********************************
> Total opcodes: 51604255
> Logging finished: 22:28:14
Powered by SCMLog v1.05
*********************************Бонус может быть любым. Глючит почему-то 0051: return, причём не сразу, а лишь после того, как подберёшь несколько бонусов. Я, конечно, понимаю, что такой здоровый код разбирать мало кто будет (хотя он написан с использованием высокоуровневых конструкций и большую часть кода там составляют метки :name ... return), но отчего вообще на return-е может быть вылет?
Last edited by WinuX (12-06-2010 19:35)
Offline
Не проверял, но если это не gosub, т.е. просто использовать голый return вне процедуры, должен быть вылет...
Offline
Offline
Gosub в скрипте применён неправильно. Посмотрел исходник, первым бросился в глаза этот участок:
:bad
0209: 10@ = random_int_in_ranges 0 6
//10@ = 5
if or
10@ == 0
10@ == 3
then
gosub @bomb
end
if 10@ == 1
then
gosub @wanted
end
if 10@ == 2
then
gosub @loosemoney
end
if 10@ == 4
then
gosub @looseweapon
end
if 10@ == 5
then
gosub @withoutradar
end
return
....
:withoutradar
if
$ONMISSION == 1
then
gosub @bad
else
0ACA: "Radar nedostupen 1 minutu"
057E: set_radar_grey 1
wait 250
057E: set_radar_grey 0
wait 250
057E: set_radar_grey 1
wait 250
057E: set_radar_grey 0
wait 250
057E: set_radar_grey 1
33@ = 0
while 33@ < 58000
wait 1000
057E: set_radar_grey 1
end
057E: set_radar_grey 0
wait 250
057E: set_radar_grey 1
wait 250
057E: set_radar_grey 0
wait 250
057E: set_radar_grey 1
wait 250
057E: set_radar_grey 0
end
returnЗдесь цикл gosub @bad - gosub @withoutradar - gosub @bad может повториться большое число раз. При этом ни разу не будет выполнен return, что приведёт к превышению лимита вложенности и ошибке.
Last edited by Den_spb (12-06-2010 21:43)
Offline
но там максимальная вложенность всего лишь 2. Вызывается gosub, из него ещё раз gosub. Может вызваться третий или даже пятый уровень вложенности. Чёрт. Максимум 8 уровней. Наверное, действительно вложенность. Хотя ещё не факт.
Offline
но там максимальная вложенность всего лишь 2
Верно, из-за двух уровней ошибки не возникнет. Но код, который я привёл выше, может повторяться большое число раз - до превышения лимита и возникновения ошибки.
Вылетает из-за превышения лимита вложенности - иных причин тут нет.
Last edited by Den_spb (12-06-2010 21:40)
Offline
Переделал так, чтобы gosub не вызывал gosub, содержащий gosub, который может вызвать этот же gosub. Утром буду тестировать. Сделал так: задаём переменную равной нулю. Затем переходим к бонусам. Если один из них выполнился, то переменная становится равной единице и затем бонус снова перемещается. Если не выполнилось, значит переходим до того момента, пока что-нибудь да не выполнится.
Offline
С gosub там явный перебор. Зачем вообще выбирать сначала тип бонуса (хороший, нейтральный, плохой), а потом вид бонуса, если можно сразу выбрать конкретный бонус (random(0,15))? После выбора одного из бонусов, лучше делать переход, используя jump_table. Скрипт станет явно проще, а там, глядишь, и глюки пропадут. 
Offline
Зачем вообще выбирать сначала тип бонуса (хороший, нейтральный, плохой), а потом вид бонуса, если можно сразу выбрать конкретный бонус (random(0,15))
Бонусов-то разное количество, а это сделано, чтобы шанс выпадения каждой категории был равнозначным. От глюков вроде избавился, 5 часов не выявили ни одного 
Offline
Pages: 1