You are not logged in.
О, удачно заглянул, новое сообщение) Привет. Еще занимаешься реверсом?
Вот тут есть оригинальные скрипты SA без примесей ремастера https://github.com/Sergeanur/UndefinifiedGrove. У того же автора можно еще найти скрипты VC и III.
Очень интересно почитать комментарии R* к разным миссиям.
Приятно видеть новую версию SB. Seemann, я представляю, какой титанический труд был переписать на новый движок все наработки последнего двадцатилетия. По технической части вопросов тут нет, работа выполнена героически. Вопрос немного в другом: какие были ощущения погружаться в код, который был написан годах в 2005-2008? Даже не с точки зрения эффективности и качества кода (Delphi-код двадцатилетней давности говорит сам за себя), а скорее с позиции философии. Что этот код был написан тобой, работает, приносит пользу - и приносил все это время.
привет)
не думал об этом, но раз ты спросил, то вот одна мысль, с которой хочется поделиться. многие авторы и их проекты увядают на старте из-за излишней увлеченности качеством кода. это когда ты начинаешь погружаться в оптимизацию, правильную архитектуру, красивый код и т.д. в итоге, как говорится, за деревьями не увидел леса, т.е. потерял интерес, мотивацию от отсутствия реального результата. а реальный результат, это когда программа, пусть и неидеально написана, но работает и делает то, для чего она задумана. на эту тему есть много рассуждений, о вреде ранней оптимизации, о необходимости частого инкрементального прогресса и т.д.
насчет философии, для меня это не много, не мало как дом, который построил своими руками, живешь в нем и продолжаешь постоянно улучшать)))
да уж, кто бы мог подумать) я читал про этот баг со скиммером, веселая штука.
кстати, на канале English Ben вышел стрим с прохождением твоего мода
https://www.youtube.com/watch?v=86aZvWomik4
Всем привет, кто шарит в саньке за этот опкод?
04D2: set_plane $PTERO45_1 fly_autopilot_around_point -2340.18 1401.524 160.0 altitude_between 0.0 and 0.0
Столкнулся с критическим багом, точнее, даже не я, а спидраннеры моего мода спустя десяток лет... в этом году стал наблюдать, что вроде как именно этот опкод не работает (и вроде на 11 винде), у меня на 7 и 10 не удается данный баг воспроизвести. А именно - вместо того, чтобы лететь как обычно, ломается координата Z - самолет появляется, судя по миникарте, где-то высоко в небе и очень медленно движется (пикирует вниз?), может ли кто помочь разобраться? Из-за сломанного полета миссия становится непроходимой и тут же проваливается. В чате советовал спидраннерам поэкспериментировать с частотой кадров, разрешением и перезапуском игры - ничего не помогало.
ну сразу бросается в глаза mix/max altitute выставленная в 0. Как самолет может летать на такой высоте? Может надо поставить что-то вроде 10.0..50.0 ?
Я тут) И мне нужна помощь с исправлением критического бага в моем моде, который появился из ниоткуда спустя 12 лет после резила, бывает и такое)
О, привет! Если ты про мод про жизнь динозавров, то конечно поможем ) можно тут или в дискорде
Это да. Для тех, кто пропустил последние лет пять, краткий список основных событий.
Новая полная база опкодов https://library.sannybuilder.com/
Sanny Builder апнулся до версии 4.
CLEO апнулась до версии 5
В сети пролетали исходники GTA V и частично San Andreas.
На гитхабе можно найти полностью отревершенный код III и VC, а также частично отревершенный San Andreas.
Вместе с выходом ремастеров трилогии были выложены полные исходники скриптов всех игр, с комментариями создателей.
Вышел CLEO Redux с поддержкой языка JavaScript для всей трилогии и кучи других игр.

Seemann wrote:Я безнадежно застрял в прошлом поколении: GTA3-VC-San Andreas. До сих пор ковыряюсь.
Привет, всё ещё "в прошлом" ?) GTA5 - не, не ковыряешь?
ps: Буду приходить каждые 4 года и спрашивать
ну, я сделал CLEO для GTA IV. Можно и для GTA V, только после сливов исходников особого спортивного интереса нет. GTA6, когда выйдет, я конечно гляну, но особых планов пока нет
привет)
Vital или Cowboy69 могут знать ответ. Найди их в дискорде (https://sannybuilder.com/discord)
Я всё починил, просто создал в мейне такой код:
:VARIABLES wait 500 Actor.StorePos($PLAYER_ACTOR, 3@, 4@, 5@) 08F1: get_zone_at 3@ 4@ 5@ nameB_to s$9451 // 8-byte string if Player.InZone($PLAYER_CHAR, s$9451) jf @VARIABLES 090C: set_specific_zone_to_trigger_gang_war zone s$9451 090D: highlight_all_inactive_gang_zones_as_available_for_gangwars gosub @VARIABLES
в конце наверно должно быть jump @VARIABLES вместо gosub
вот исходник лоурайдера
MISSION_START
MISSION_END
// GLOBALS
VAR_INT lowrider_game_is_active
VAR_INT lowrider_pscore
VAR_INT lowrider_oscore
VAR_INT lowrider_level
VAR_INT lowrider_last_level
VAR_INT lowrider_opposition_skill
VAR_FLOAT wheel_fl wheel_bl wheel_fr wheel_br
CONST_INT LOWRIDER_PERFECT_SCORE 50
CONST_INT LOWRIDER_GOOD_SCORE 25
CONST_INT LOWRIDER_OK_SCORE 15
CONST_INT LOWRIDER_BAD_SCORE 0
CONST_INT LOWRIDER_VBAD_SCORE 0
CONST_INT LOWRIDER_PERFECT_TIME 126
CONST_INT LOWRIDER_PERFECT_TIME_NEG -126
CONST_INT LOWRIDER_GOOD_TIME 244
CONST_INT LOWRIDER_GOOD_TIME_NEG -244
CONST_INT LOWRIDER_OK_TIME 344
CONST_INT LOWRIDER_OK_TIME_NEG -344
CONST_INT LOWRIDER_BAD_TIME 450
CONST_INT LOWRIDER_BAD_TIME_NEG -450
CONST_INT LOWRIDER_BEAT_PERFECT 0
CONST_INT LOWRIDER_BEAT_GOOD 1
CONST_INT LOWRIDER_BEAT_ALRIGHT 2
CONST_INT LOWRIDER_BEAT_PAST 3
CONST_INT LOWRIDER_BEAT_FUTURE 4
CONST_INT LOWRIDER_BEAT_WRONG_BUTTON 5
CONST_INT LOWRIDER_BEAT_MISTIMED_BUTTON 6
CONST_INT LOWRIDER_SCORE_LIMIT 999999
CONST_INT LOWRIDER_OVERALL_BAD 0
CONST_INT LOWRIDER_OVERALL_GOOD 1
CONST_INT LOWRIDER_OVERALL_PERFECT 2
CONST_INT LOWRIDER_SCORE_PERFECT_MULTIPLER 10
CONST_INT SPRITE_PERFECT 54
CONST_INT SPRITE_BAD 55
CONST_INT SPRITE_GOOD 56
CONST_INT LOWRIDER_SCORE_TOTAL_BEATS_TO_REPORT 4
VAR_INT lowr_perfect_beat_counter
VAR_INT lowr_good_beat_counter
VAR_INT lowr_bad_beat_counter
VAR_INT lowr_overall_state
{
lowrider_game:
SCRIPT_NAME LOWGAME
// input parameters
LVAR_INT pcar
LVAR_INT ocar
LVAR_INT bounce_girl
// workings
LVAR_FLOAT pcar_x pcar_y pcar_z
LVAR_FLOAT ocar_x ocar_y ocar_z
LVAR_FLOAT vec_x vec_y vec_z
LVAR_FLOAT force_multiplier
LVAR_INT flag
LVAR_INT temp_seq
LVAR_INT lowrider_sequence
LVAR_INT car_got_roof
LVAR_INT temp_int
LVAR_INT player_stick_position
LVAR_INT last_stick_position
LVAR_INT beat_time beat_type beat_num
LVAR_INT beat_fuckup
LVAR_INT cumulative_score
LVAR_INT last_scored_beat
LVAR_FLOAT temp_float
LVAR_INT last_opp_scored_beat
VAR_INT old_beat_num
LVAR_INT last_print
LVAR_INT consecutive_goods
LVAR_INT consecutive_bads
// set initial flags
force_multiplier = 0.01
lowrider_level = 0
flag = 0
car_got_roof = 0
lowrider_pscore = 0
lowrider_oscore = 0
player_stick_position = 0
beat_fuckup = 0
cumulative_score = 0
last_scored_beat = -1
last_opp_scored_beat = 0
last_stick_position = 0
old_beat_num = -1
LOAD_SPRITE SPRITE_BAD upr
LOAD_SPRITE SPRITE_PERFECT downl
LOAD_SPRITE SPRITE_GOOD upl
// fake creates
IF flag = -1
CREATE_CAR PONY 0.0 0.0 0.0 pcar
CREATE_CAR PONY 0.0 0.0 0.0 ocar
CREATE_CHAR PEDTYPE_CIVMALE MALE01 0.0 0.0 0.0 bounce_girl
WAIT 0
WAIT 0
WAIT 0
ENDIF
// check input is valid
IF DOES_VEHICLE_EXIST pcar
IF IS_CAR_DEAD pcar
GOTO terminate_lowrider_game
ENDIF
ELSE
GOTO terminate_lowrider_game
ENDIF
IF DOES_VEHICLE_EXIST ocar
IF IS_CAR_DEAD ocar
GOTO terminate_lowrider_game
ENDIF
ELSE
GOTO terminate_lowrider_game
ENDIF
IF lowrider_opposition_skill < 1
lowrider_opposition_skill = 1
ELSE
IF lowrider_opposition_skill > 5
lowrider_opposition_skill = 5
ENDIF
ENDIF
// get initial values
IF NOT IS_CAR_DEAD pcar
GET_CAR_COORDINATES pcar pcar_x pcar_y pcar_z
ENDIF
IF NOT IS_CAR_DEAD ocar
GET_CAR_COORDINATES ocar ocar_x ocar_y ocar_z
ENDIF
lowrider_game_is_active = 1
lowrider_game_loop:
WAIT 0
// this is to fix the bug if player dies from starvation while on mini game
IF flag < 5
IF NOT DOES_VEHICLE_EXIST pcar
bd_terminate_script = 1
flag = 5
ENDIF
ENDIF
SWITCH flag
// initialise
CASE 0
SET_CAR_DENSITY_MULTIPLIER 0.0
SET_PED_DENSITY_MULTIPLIER 0.0
CLEAR_AREA pcar_x pcar_y pcar_z 200.0 TRUE
// load anims
REQUEST_ANIMATION LOWRIDER
WHILE NOT HAS_ANIMATION_LOADED LOWRIDER
WAIT 0
ENDWHILE
// setup girl in car
IF NOT IS_CAR_DEAD pcar
LOCK_CAR_DOORS pcar CARLOCK_LOCKED_PLAYER_INSIDE
APPLY_BRAKES_TO_PLAYERS_CAR player1 ON
SET_CAR_PROOFS pcar TRUE TRUE TRUE TRUE TRUE
// default offsets
x = 0.6200
y = 0.3100
z = -0.1670
ENDIF
TIMERB = 0
// give girl initial sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_idleloop LOWRIDER 4.0 FALSE FALSE FALSE FALSE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_idleloop LOWRIDER 4.0 FALSE FALSE FALSE FALSE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_idleloop LOWRIDER 4.0 FALSE FALSE FALSE FALSE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_idleloop LOWRIDER 4.0 FALSE FALSE FALSE FALSE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_hurry LOWRIDER 4.0 FALSE FALSE FALSE FALSE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_hair LOWRIDER 4.0 FALSE FALSE FALSE FALSE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_idleloop LOWRIDER 4.0 FALSE FALSE FALSE FALSE -1
SET_SEQUENCE_TO_REPEAT lowrider_sequence 1
CLOSE_SEQUENCE_TASK lowrider_sequence
IF NOT IS_CHAR_DEAD bounce_girl
IF IS_CHAR_ATTACHED_TO_ANY_CAR bounce_girl
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
ENDIF
ENDIF
// check if car has roof
car_got_roof = 0
IF NOT IS_CAR_DEAD pcar
IF IS_CAR_MODEL pcar REMINGTN
OR IS_CAR_MODEL pcar SLAMVAN
OR IS_CAR_MODEL pcar TORNADO
car_got_roof = 1
ELSE
IF IS_CAR_MODEL pcar BLADE
OR IS_CAR_MODEL pcar BROADWAY
OR IS_CAR_MODEL pcar SAVANNA
GET_CURRENT_CAR_MOD pcar VEHICLE_UPGRADE_ROOF temp_int
IF NOT temp_int = -1
car_got_roof = 1
ENDIF
ELSE
car_got_roof = 1
ENDIF
ENDIF
ENDIF
IF NOT IS_CHAR_DEAD bounce_girl
IF NOT IS_CHAR_ATTACHED_TO_ANY_CAR bounce_girl
car_got_roof = 1
ENDIF
ENDIF
// initialise all the scores
lowr_perfect_beat_counter = 0
lowr_good_beat_counter = 0
lowr_bad_beat_counter = 0
lowrider_pscore = 0
lowr_overall_state = 0
lowrider_oscore = 0
flag++
BREAK
// wait to make sure track is playing
CASE 1
GET_BEAT_TRACK_STATUS temp_int
IF temp_int = CUTSCENE_TRACK_PLAYING
//DISPLAY_NTH_ONSCREEN_COUNTER_WITH_STRING lowrider_pscore COUNTER_DISPLAY_NUMBER 1 LOWR1
//DISPLAY_NTH_ONSCREEN_COUNTER_WITH_STRING lowrider_oscore COUNTER_DISPLAY_NUMBER 2 LOWR2
flag++
TIMERA = 0
ENDIF
BREAK
// game is playing - update scores and bounce girl
CASE 2
GET_BEAT_TRACK_STATUS temp_int
IF TIMERB > 40000
IF lowr_overall_state = LOWRIDER_OVERALL_PERFECT
IF IS_BIG_VEHICLE 42 // Hack to determine if the game is in English langauge setting
DRAW_SPRITE SPRITE_PERFECT 340.0 30.0 95.0 25.0 255 255 255 255
ELSE
PRINT_BIG DNC_002 50000 5 // PERFECT!
ENDIF
ENDIF
IF lowr_overall_state = LOWRIDER_OVERALL_GOOD
IF IS_BIG_VEHICLE 42
DRAW_SPRITE SPRITE_GOOD 350.0 30.0 49.5 26.1 255 255 255 255
ELSE
PRINT_BIG DNC_004 50000 5 // GOOD!
ENDIF
ENDIF
IF lowr_overall_state = LOWRIDER_OVERALL_BAD
IF IS_BIG_VEHICLE 42
DRAW_SPRITE SPRITE_BAD 350.0 30.0 35.7 20.7 255 255 255 255
ELSE
PRINT_BIG DNC_003 50000 5 // BAD!
ENDIF
ENDIF
ENDIF
IF IS_PS2_KEYBOARD_KEY_JUST_PRESSED PS2_KEY_SPACE
TIMERA = 90000
ENDIF
GET_BEAT_PROXIMITY -1 beat_time beat_type beat_num
IF NOT beat_type = 33
LVAR_FLOAT fTempVal
fTempVal = 0.0
fTempVal =# lowrider_pscore
SET_WIDGET_INFO WIDGET_PLAYER_SCORE 1 0 0 1 1 fTempVal LOWR1
fTempVal =# lowrider_oscore
SET_WIDGET_INFO WIDGET_OPPOSITION_SCORE 1 0 0 1 1 fTempVal LOWR2
FORCE_BIG_MESSAGE_AND_COUNTER TRUE
/// ------------- FIGURE HOW GOOD THIS ATTEMPT WAS -----------------------------------
GET_BEAT_PROXIMITY 0 beat_time beat_type beat_num
//WRITE_DEBUG_WITH_INT beat_num beat_num
// scoring system ---------------------------------------
GOSUB LOWR_get_stick_position
IF NOT beat_type = SPRITE_STKUR
AND NOT beat_type = SPRITE_STKDL
AND NOT beat_type = SPRITE_STKUL
AND NOT beat_type = SPRITE_STKDR
IF NOT beat_num = last_scored_beat
stored_beat = -1
// if player has moved stick
IF NOT player_stick_position = 0
// player hits beat spot on (zone 1)
IF beat_time > LOWRIDER_PERFECT_TIME_NEG
AND beat_time < LOWRIDER_PERFECT_TIME
// player has hit the right beat
IF player_stick_position = beat_type
stored_beat = LOWRIDER_BEAT_PERFECT
ELSE
// player hits wrong beat
beat_fuckup = 1
stored_beat = LOWRIDER_BEAT_WRONG_BUTTON
ENDIF
ELSE
// player hits beat medium zone (zone 2)
IF beat_time > LOWRIDER_GOOD_TIME_NEG
AND beat_time < LOWRIDER_GOOD_TIME
// player has hit the right beat
IF player_stick_position = beat_type
stored_beat = LOWRIDER_BEAT_GOOD
ELSE
// player hits wrong beat
beat_fuckup = 1
stored_beat = LOWRIDER_BEAT_WRONG_BUTTON
ENDIF
ELSE
// player hits beat in easy zone (zone 3)
IF beat_time > LOWRIDER_OK_TIME_NEG
AND beat_time < LOWRIDER_OK_TIME
// player has hit the right beat
IF player_stick_position = beat_type
stored_beat = LOWRIDER_BEAT_ALRIGHT
ELSE
// player hits wrong beat
beat_fuckup = 1
stored_beat = LOWRIDER_BEAT_WRONG_BUTTON
ENDIF
ELSE
// player has missed beat
IF beat_time > LOWRIDER_BAD_TIME_NEG
OR beat_time < LOWRIDER_BAD_TIME
IF player_stick_position = beat_type
beat_fuckup = 1
IF beat_time < 0
stored_beat = LOWRIDER_BEAT_PAST
ELSE
stored_beat = LOWRIDER_BEAT_FUTURE
ENDIF
ELSE
beat_fuckup = 1
stored_beat = LOWRIDER_BEAT_WRONG_BUTTON
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BD_RenderHit = 0
IF stored_beat = LOWRIDER_BEAT_PERFECT
BD_RenderHit = BD_HIT_PERFECT
consecutive_goods++
ELSE
IF stored_beat = LOWRIDER_BEAT_GOOD
BD_RenderHit = BD_HIT_GOOD
consecutive_goods++
ENDIF
IF stored_beat = LOWRIDER_BEAT_WRONG_BUTTON
consecutive_bads++
ELSE
BD_RenderHit = BD_HIT_STANDARD
consecutive_bads++
ENDIF
ENDIF
ELSE
IF beat_time < LOWRIDER_BAD_TIME_NEG
beat_fuckup = 1
stored_beat = LOWRIDER_BEAT_PAST
consecutive_bads++
ENDIF
ENDIF
IF NOT stored_beat = -1
GOSUB LOWR_Update_Overall_Report
GOSUB LOWR_update_score_and_stats
//GOSUB LOWR_Print_Input_Feedback
last_scored_beat = beat_num
ENDIF
ENDIF
ENDIF
// make sure players score can't fall below zero
IF lowrider_pscore < 0
lowrider_pscore = 0
ENDIF
// make sure cars don't roll over --------------------------
IF NOT IS_CAR_DEAD pcar
IF NOT LOCATE_CAR_2D pcar pcar_x pcar_y 3.0 3.0 FALSE
GET_CAR_COORDINATES pcar x y z
vec_x = pcar_x - x
vec_y = pcar_y - y
vec_x *= force_multiplier
vec_y *= force_multiplier
APPLY_FORCE_TO_CAR pcar vec_x vec_y 0.0 0.0 0.0 0.0
ENDIF
ENDIF
IF NOT IS_CAR_DEAD ocar
IF NOT LOCATE_CAR_2D ocar ocar_x ocar_y 3.0 3.0 FALSE
GET_CAR_COORDINATES ocar x y z
vec_x = ocar_x - x
vec_y = ocar_y - y
vec_x *= force_multiplier
vec_y *= force_multiplier
APPLY_FORCE_TO_CAR ocar vec_x vec_y 0.0 0.0 0.0 0.0
ENDIF
ENDIF
// make opposition car bounce to the music -------------------
IF beat_time < 100
AND beat_time > -100
IF beat_type = 9
wheel_fl = 1.0
wheel_bl = 1.0
wheel_fr = 0.0
wheel_br = 0.0
ENDIF
IF beat_type = 10
wheel_fl = 0.0
wheel_bl = 0.0
wheel_fr = 1.0
wheel_br = 1.0
ENDIF
IF beat_type = 11
wheel_fl = 0.0
wheel_bl = 0.0
wheel_fr = 1.0
wheel_br = 0.0
ENDIF
IF beat_type = 12
wheel_fl = 0.0
wheel_bl = 1.0
wheel_fr = 0.0
wheel_br = 0.0
ENDIF
IF beat_type = 13
wheel_fl = 1.0
wheel_bl = 0.0
wheel_fr = 1.0
wheel_br = 0.0
ENDIF
IF beat_type = 14
wheel_fl = 0.0
wheel_bl = 1.0
wheel_fr = 0.0
wheel_br = 1.0
ENDIF
IF beat_type = 15
wheel_fl = 1.0
wheel_bl = 0.0
wheel_fr = 0.0
wheel_br = 0.0
ENDIF
IF beat_type = 16
wheel_fl = 0.0
wheel_bl = 0.0
wheel_fr = 0.0
wheel_br = 1.0
ENDIF
// give opposition score depending on their skill
IF NOT beat_num = last_opp_scored_beat
GOSUB update_lowrider_opposition_score
last_opp_scored_beat = beat_num
ENDIF
ELSE
wheel_fl = 0.0
wheel_bl = 0.0
wheel_fr = 0.0
wheel_br = 0.0
ENDIF
// control ocar hydraulics
IF NOT IS_CAR_DEAD ocar
IF DOES_CAR_HAVE_HYDRAULICS ocar
CONTROL_CAR_HYDRAULICS ocar wheel_fl wheel_bl wheel_fr wheel_br
ENDIF
ENDIF
// BOUNCING GIRL ===============================================================
IF car_got_roof = 0
// control the level of the bounce girl --------------------
// once passed level -1 never go back
IF lowrider_level = -1
IF NOT player_stick_position = 0
lowrider_level = 0
ENDIF
ENDIF
// once passed level 0 never go back
IF lowrider_level = 0
IF consecutive_goods > 5
lowrider_level++
consecutive_goods = 0
ENDIF
ENDIF
IF lowrider_level = 1
IF consecutive_goods > 5
lowrider_level++
consecutive_goods = 0
consecutive_bads = 0
ENDIF
ENDIF
IF lowrider_level = 2
IF consecutive_goods > 5
lowrider_level++
consecutive_goods = 0
consecutive_bads = 0
ENDIF
IF consecutive_bads > 1
lowrider_level--
consecutive_bads = 0
ENDIF
ENDIF
IF lowrider_level = 3
IF consecutive_goods > 5
lowrider_level++
consecutive_goods = 0
consecutive_bads = 0
ENDIF
IF consecutive_bads > 1
lowrider_level--
consecutive_bads = 0
ENDIF
ENDIF
IF lowrider_level = 4
IF consecutive_goods > 5
lowrider_level++
consecutive_goods = 0
consecutive_bads = 0
ENDIF
IF consecutive_bads > 1
lowrider_level--
consecutive_bads = 0
ENDIF
ENDIF
IF lowrider_level = 5
IF consecutive_bads > 1
lowrider_level--
consecutive_goods = 0
consecutive_bads = 0
ENDIF
ENDIF
// ------------------------- girl anims --------------------------
// we have changed l
IF NOT IS_CHAR_DEAD bounce_girl
IF NOT lowrider_last_level = lowrider_level
IF lowrider_level = -1
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_hair LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_hurry LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_idleloop LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
SET_SEQUENCE_TO_REPEAT lowrider_sequence 1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
IF lowrider_last_level = -1
AND lowrider_level = 0
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_idle_to_l0 LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l0_loop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
IF lowrider_last_level = 0
AND lowrider_level = 1
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l0_to_l1 LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l1_loop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
IF lowrider_last_level = 1
AND lowrider_level = 2
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l1_to_l2 LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l2_loop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
IF lowrider_last_level = 2
AND lowrider_level = 3
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l2_to_l3 LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l3_loop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
IF lowrider_last_level = 3
AND lowrider_level = 4
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l3_to_l4 LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l4_loop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
IF lowrider_last_level = 4
AND lowrider_level = 5
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l4_to_l5 LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l5_loop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
IF lowrider_last_level > 1
AND lowrider_level = 1
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l345_to_l1 LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l1_loop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
IF lowrider_last_level = 1
AND lowrider_level = 0
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l12_to_l0 LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l0_loop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
IF lowrider_last_level = 0
AND lowrider_level = -1
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_hair LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_hurry LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_idleloop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
lowrider_last_level = lowrider_level
ENDIF
IF NOT last_stick_position = player_stick_position
AND NOT player_stick_position = 0
temp_int = 0
temp_float = 1.0
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_idle_to_l0
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_idle_to_l0 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l12_to_l0
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l12_to_l0 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l345_to_l1
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l345_to_l1 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l0_to_l1
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l0_to_l1 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l1_to_l2
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l1_to_l2 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l2_to_l3
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l2_to_l3 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l3_to_l4
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l3_to_l4 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l4_to_l5
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l4_to_l5 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_bdbnce
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_bdbnce temp_float
ENDIF
IF temp_float < 0.9
temp_int = 1
ENDIF
IF temp_int = 0
IF lowrider_level = 0
OPEN_SEQUENCE_TASK temp_seq
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l0_bnce LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK temp_seq
PERFORM_SEQUENCE_TASK bounce_girl temp_seq
CLEAR_SEQUENCE_TASK temp_seq
ENDIF
IF lowrider_level = 1
OPEN_SEQUENCE_TASK temp_seq
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l1_bnce LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK temp_seq
PERFORM_SEQUENCE_TASK bounce_girl temp_seq
CLEAR_SEQUENCE_TASK temp_seq
ENDIF
IF lowrider_level = 2
OPEN_SEQUENCE_TASK temp_seq
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l2_bnce LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK temp_seq
PERFORM_SEQUENCE_TASK bounce_girl temp_seq
CLEAR_SEQUENCE_TASK temp_seq
ENDIF
IF lowrider_level = 3
OPEN_SEQUENCE_TASK temp_seq
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l3_bnce LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK temp_seq
PERFORM_SEQUENCE_TASK bounce_girl temp_seq
CLEAR_SEQUENCE_TASK temp_seq
ENDIF
IF lowrider_level = 4
OPEN_SEQUENCE_TASK temp_seq
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l4_bnce LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK temp_seq
PERFORM_SEQUENCE_TASK bounce_girl temp_seq
CLEAR_SEQUENCE_TASK temp_seq
ENDIF
IF lowrider_level = 5
OPEN_SEQUENCE_TASK temp_seq
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l5_bnce LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK temp_seq
PERFORM_SEQUENCE_TASK bounce_girl temp_seq
CLEAR_SEQUENCE_TASK temp_seq
ENDIF
ENDIF
last_stick_position = player_stick_position
ENDIF
IF beat_fuckup = 1
IF player_stick_position = 0
IF lowrider_level > 0
IF NOT IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_bdbnce
OPEN_SEQUENCE_TASK temp_seq
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_bdbnce LOWRIDER 4.0 FALSE FALSE FALSE TRUE -1
CLOSE_SEQUENCE_TASK temp_seq
PERFORM_SEQUENCE_TASK bounce_girl temp_seq
CLEAR_SEQUENCE_TASK temp_seq
CLEAR_SEQUENCE_TASK lowrider_sequence
OPEN_SEQUENCE_TASK lowrider_sequence
TASK_PLAY_ANIM_NON_INTERRUPTABLE -1 lrgirl_l1_loop LOWRIDER 4.0 TRUE FALSE FALSE FALSE -1
CLOSE_SEQUENCE_TASK lowrider_sequence
ENDIF
lowrider_level = 1
lowrider_last_level = 1
ENDIF
ENDIF
beat_fuckup = 0
ENDIF
// if char is not playing certain anims then do the sequence task
temp_int = 0
temp_float = 1.0
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_bdbnce
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_bdbnce temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_idle_to_l0
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_idle_to_l0 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l12_to_l0
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l12_to_l0 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l345_to_l1
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l345_to_l1 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l0_bnce
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l0_bnce temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l0_to_l1
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l0_to_l1 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l1_to_l2
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l1_to_l2 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l2_to_l3
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l2_to_l3 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l3_to_l4
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l3_to_l4 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l4_to_l5
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l4_to_l5 temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l1_bnce
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l1_bnce temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l2_bnce
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l2_bnce temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l3_bnce
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l3_bnce temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l4_bnce
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l4_bnce temp_float
ENDIF
IF IS_CHAR_PLAYING_ANIM bounce_girl lrgirl_l5_bnce
GET_CHAR_ANIM_CURRENT_TIME bounce_girl lrgirl_l5_bnce temp_float
ENDIF
IF temp_float < 0.9
temp_int = 1
ENDIF
IF temp_int = 0
GET_SCRIPT_TASK_STATUS bounce_girl PERFORM_SEQUENCE_TASK temp_int
IF temp_int = FINISHED_TASK
PERFORM_SEQUENCE_TASK bounce_girl lowrider_sequence
ENDIF
ENDIF
ENDIF // is char dead
ENDIF // car_got_roof
// quit out
//SET_PLAYER_CONTROL player1 OFF // This should be set, but breaks old saves :(
IF IS_BUTTON_PRESSED PAD1 TRIANGLE
OR IS_WIDGET_RELEASED WIDGET_RHYTHM_EXIT
lowrider_pscore = 0
flag++
ENDIF
ELSE
// track has finished
flag++
TIMERA = 0
ENDIF
BREAK
// wait for beat display to finish
CASE 3
//IF beat_display_script_started = 0
flag++
//ENDIF
BREAK
// fade out music
CASE 4
IF IS_PLAYER_PLAYING player1
SET_PLAYER_CONTROL player1 OFF
ENDIF
DO_FADE 500 FADE_OUT
WHILE GET_FADING_STATUS
WAIT 0
ENDWHILE
bd_terminate_script = 1
flag++
BREAK
// track has ended
CASE 5
GET_BEAT_TRACK_STATUS temp_int
IF temp_int = CUTSCENE_TRACK_PLAYING
STOP_BEAT_TRACK
ENDIF
CLEAR_ONSCREEN_COUNTER lowrider_pscore
CLEAR_ONSCREEN_COUNTER lowrider_oscore
REMOVE_ANIMATION LOWRIDER
GOTO terminate_lowrider_game
BREAK
ENDSWITCH
GOTO lowrider_game_loop
update_lowrider_opposition_score:
GENERATE_RANDOM_INT_IN_RANGE 0 10 temp_int
IF lowrider_opposition_skill = 0
OR lowrider_opposition_skill = 1
SWITCH temp_int
CASE 0
CASE 1
lowrider_oscore += LOWRIDER_BAD_SCORE
BREAK
CASE 2
CASE 3
CASE 4
CASE 5
lowrider_oscore += LOWRIDER_OK_SCORE
BREAK
CASE 6
CASE 7
CASE 8
lowrider_oscore += LOWRIDER_GOOD_SCORE
BREAK
CASE 9
lowrider_oscore += LOWRIDER_PERFECT_SCORE
BREAK
ENDSWITCH
ELSE
IF lowrider_opposition_skill = 2
SWITCH temp_int
CASE 0
lowrider_oscore += LOWRIDER_BAD_SCORE
BREAK
CASE 1
CASE 2
CASE 3
CASE 4
lowrider_oscore += LOWRIDER_OK_SCORE
BREAK
CASE 5
CASE 6
CASE 7
lowrider_oscore += LOWRIDER_GOOD_SCORE
BREAK
CASE 8
CASE 9
lowrider_oscore += LOWRIDER_PERFECT_SCORE
BREAK
ENDSWITCH
ELSE
IF lowrider_opposition_skill = 3
SWITCH temp_int
CASE 0
lowrider_oscore += LOWRIDER_BAD_SCORE
BREAK
CASE 1
CASE 2
CASE 3
lowrider_oscore += LOWRIDER_OK_SCORE
BREAK
CASE 4
CASE 5
CASE 6
lowrider_oscore += LOWRIDER_GOOD_SCORE
BREAK
CASE 7
CASE 8
CASE 9
lowrider_oscore += LOWRIDER_PERFECT_SCORE
BREAK
ENDSWITCH
ELSE
IF lowrider_opposition_skill = 4
SWITCH temp_int
CASE 0
CASE 1
CASE 2
lowrider_oscore += LOWRIDER_OK_SCORE
BREAK
CASE 3
CASE 4
CASE 5
CASE 6
lowrider_oscore += LOWRIDER_GOOD_SCORE
BREAK
CASE 7
CASE 8
CASE 9
lowrider_oscore += LOWRIDER_PERFECT_SCORE
BREAK
ENDSWITCH
ELSE
IF lowrider_opposition_skill = 5
SWITCH temp_int
CASE 0
CASE 1
lowrider_oscore += LOWRIDER_OK_SCORE
BREAK
CASE 2
CASE 3
CASE 4
CASE 5
lowrider_oscore += LOWRIDER_GOOD_SCORE
BREAK
CASE 6
CASE 7
CASE 8
CASE 9
lowrider_oscore += LOWRIDER_PERFECT_SCORE
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF lowrider_oscore < 0
lowrider_oscore = 0
ENDIF
RETURN
terminate_lowrider_game:
lowrider_game_is_active = 0
TERMINATE_THIS_SCRIPT
/********************************************
PRINT INPUT FEEDBACK
********************************************/
LOWR_Print_Input_Feedback:
SWITCH stored_beat
CASE LOWRIDER_BEAT_PERFECT
SHAKE_PAD PAD1 200 255
BREAK
CASE LOWRIDER_BEAT_GOOD
SHAKE_PAD PAD1 200 200
BREAK
CASE LOWRIDER_BEAT_ALRIGHT
SHAKE_PAD PAD1 200 110
BREAK
DEFAULT
SHAKE_PAD PAD1 200 50
BREAK
ENDSWITCH
PRINT_BIG DNC_013 1000 5 //That's it!
SWITCH last_print
DEFAULT
IF stored_beat = LOWRIDER_BEAT_PERFECT
PRINT_BIG DNC_005 1000 5 // Great timing!
ENDIF
IF stored_beat = LOWRIDER_BEAT_GOOD
PRINT_BIG DNC_006 1000 5 // Well done!
ENDIF
IF stored_beat = LOWRIDER_BEAT_ALRIGHT
PRINT_BIG DNC_007 1000 5 // Alright
ENDIF
IF stored_beat = LOWRIDER_BEAT_PAST
PRINT_BIG DNC_008 1000 5 // Too late!
ENDIF
IF stored_beat = LOWRIDER_BEAT_FUTURE
PRINT_BIG DNC_009 1000 5 // Too early!
ENDIF
IF stored_beat = LOWRIDER_BEAT_WRONG_BUTTON
PRINT_BIG DNC_010 1000 5 // Wrong!
ENDIF
IF stored_beat = LOWRIDER_BEAT_MISTIMED_BUTTON
PRINT_BIG DNC_011 1000 5 // Poor timing!
ENDIF
last_print = 2
BREAK
CASE 2
IF stored_beat = LOWRIDER_BEAT_PERFECT
PRINT_BIG DNC_012 1000 5 //Synchronized!
ENDIF
IF stored_beat = LOWRIDER_BEAT_GOOD
PRINT_BIG DNC_013 1000 5 //That's it!
ENDIF
IF stored_beat = LOWRIDER_BEAT_ALRIGHT
PRINT_BIG DNC_014 1000 5 //Not bad!
ENDIF
IF stored_beat = LOWRIDER_BEAT_PAST
PRINT_BIG DNC_015 1000 5 //You missed it!
ENDIF
IF stored_beat = LOWRIDER_BEAT_FUTURE
PRINT_BIG DNC_016 1000 5 //You're fast!
ENDIF
IF stored_beat = LOWRIDER_BEAT_WRONG_BUTTON
PRINT_BIG DNC_017 1000 5 //Not that one!
ENDIF
IF stored_beat = LOWRIDER_BEAT_MISTIMED_BUTTON
PRINT_BIG DNC_018 1000 5 //Try again!
ENDIF
++last_print
BREAK
CASE 3
IF stored_beat = LOWRIDER_BEAT_PERFECT
PRINT_BIG DNC_019 1000 5 //The master!
ENDIF
IF stored_beat = LOWRIDER_BEAT_GOOD
PRINT_BIG DNC_020 1000 5 //You got it!
ENDIF
IF stored_beat = LOWRIDER_BEAT_ALRIGHT
PRINT_BIG DNC_021 1000 5 //Can do better!
ENDIF
IF stored_beat = LOWRIDER_BEAT_PAST
PRINT_BIG DNC_022 1000 5 //You're late!
ENDIF
IF stored_beat = LOWRIDER_BEAT_FUTURE
PRINT_BIG DNC_023 1000 5 //Slow down!
ENDIF
IF stored_beat = LOWRIDER_BEAT_WRONG_BUTTON
PRINT_BIG DNC_024 1000 5 //Random!
ENDIF
IF stored_beat = LOWRIDER_BEAT_MISTIMED_BUTTON
PRINT_BIG DNC_025 1000 5 //Not on time!
ENDIF
++last_print
BREAK
ENDSWITCH
RETURN
/********************************************
UPDATE OVERALL REPORT
********************************************/
LOWR_Update_Overall_Report:
temp_int = lowr_good_beat_counter + lowr_bad_beat_counter
temp_int += lowr_perfect_beat_counter
IF temp_int > 0
IF temp_int >= LOWRIDER_SCORE_TOTAL_BEATS_TO_REPORT
IF lowr_perfect_beat_counter = LOWRIDER_SCORE_TOTAL_BEATS_TO_REPORT
IF lowr_overall_state = LOWRIDER_OVERALL_GOOD
OR lowr_overall_state = LOWRIDER_OVERALL_PERFECT
//--- Can enter perfect
lowr_overall_state = LOWRIDER_OVERALL_PERFECT
ELSE
// GOOD! //use a big number, the next state will brak it
lowr_overall_state = LOWRIDER_OVERALL_GOOD
ENDIF
ELSE
IF lowr_good_beat_counter > lowr_bad_beat_counter
//DISPLAY_TEXT 232.0 50.0 DNC_004 // GOOD! //use a big number, the next state will brak it
lowr_overall_state = LOWRIDER_OVERALL_GOOD
ELSE
IF lowr_overall_state = LOWRIDER_OVERALL_PERFECT
//PRINT_BIG DNC_004 50000 7 // GOOD! //use a big number, the next state will brak it
lowr_overall_state = LOWRIDER_OVERALL_GOOD
ELSE
IF lowr_overall_state = LOWRIDER_OVERALL_GOOD
//PRINT_BIG DNC_003 50000 7 // BAD! //use a big number, the next state will brak it
lowr_overall_state = LOWRIDER_OVERALL_BAD
ELSE
//PRINT_BIG DNC_003 50000 7 // BAD! //use a big number, the next state will brak it
lowr_overall_state = LOWRIDER_OVERALL_BAD
ENDIF
ENDIF
ENDIF
ENDIF
//--- Clear the counters
lowr_perfect_beat_counter = 0
lowr_good_beat_counter = 0
lowr_bad_beat_counter = 0
ENDIF
ENDIF
RETURN
LOWR_update_score_and_stats:
SWITCH stored_beat
CASE LOWRIDER_BEAT_PERFECT
IF lowrider_pscore < LOWRIDER_SCORE_LIMIT
IF lowr_overall_state = LOWRIDER_OVERALL_PERFECT
temp_int = LOWRIDER_PERFECT_SCORE * LOWRIDER_SCORE_PERFECT_MULTIPLER
lowrider_pscore += temp_int
ELSE
lowrider_pscore += LOWRIDER_PERFECT_SCORE
ENDIF
ENDIF
lowr_perfect_beat_counter++
BREAK
CASE LOWRIDER_BEAT_GOOD
IF lowrider_pscore < LOWRIDER_SCORE_LIMIT
IF lowr_overall_state = LOWRIDER_OVERALL_PERFECT
temp_int = LOWRIDER_GOOD_SCORE * LOWRIDER_SCORE_PERFECT_MULTIPLER
lowrider_pscore += temp_int
ELSE
lowrider_pscore += LOWRIDER_GOOD_SCORE
ENDIF
ENDIF
lowr_good_beat_counter++
BREAK
CASE LOWRIDER_BEAT_ALRIGHT
IF lowrider_pscore < LOWRIDER_SCORE_LIMIT
IF lowr_overall_state = LOWRIDER_OVERALL_PERFECT
temp_int = LOWRIDER_OK_SCORE * LOWRIDER_SCORE_PERFECT_MULTIPLER
lowrider_pscore += temp_int
ELSE
lowrider_pscore += LOWRIDER_OK_SCORE
ENDIF
ENDIF
lowr_good_beat_counter++
BREAK
CASE LOWRIDER_BEAT_PAST
IF lowrider_pscore > 0
lowrider_pscore += LOWRIDER_BAD_SCORE
ENDIF
lowr_bad_beat_counter++
BREAK
CASE LOWRIDER_BEAT_FUTURE
IF lowrider_pscore > 0
lowrider_pscore += LOWRIDER_BAD_SCORE
ENDIF
lowr_bad_beat_counter++
BREAK
CASE LOWRIDER_BEAT_WRONG_BUTTON
IF lowrider_pscore > 0
lowrider_pscore += LOWRIDER_VBAD_SCORE
ENDIF
lowr_bad_beat_counter++
BREAK
CASE LOWRIDER_BEAT_MISTIMED_BUTTON
IF lowrider_pscore > 0
lowrider_pscore += LOWRIDER_VBAD_SCORE
ENDIF
lowr_bad_beat_counter++
BREAK
ENDSWITCH
// make sure score hasn't gone above maximum
IF lowrider_pscore > LOWRIDER_SCORE_LIMIT
lowrider_pscore = LOWRIDER_SCORE_LIMIT
ENDIF
RETURN
LOWR_get_stick_position:
GET_POSITION_OF_ANALOGUE_STICKS PAD1 lstickx lsticky rstickx rsticky
temp_float =# rstickx
vec_x = temp_float
temp_float =# rsticky
vec_y = temp_float
GET_DISTANCE_BETWEEN_COORDS_2D 0.0 0.0 vec_x vec_y temp_float
player_stick_position = 0
IF temp_float > 64.0
GET_ANGLE_BETWEEN_2D_VECTORS vec_x vec_y 0.0 -1.0 temp_float
// must be up
IF temp_float < 15.0
player_stick_position = 13 // up
ELSE
IF temp_float < 75.0
IF rstickx > 0
player_stick_position = 11 // right and up
ELSE
player_stick_position = 15 // left and up
ENDIF
ELSE
IF temp_float < 105.0
IF rstickx > 0
player_stick_position = 10 // right
ELSE
player_stick_position = 9 // left
ENDIF
ELSE
IF temp_float < 165.0
IF rstickx > 0
player_stick_position = 16 // right down
ELSE
player_stick_position = 12 // left down
ENDIF
ELSE
// must be down
player_stick_position = 14 // left down
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
RETURN
}
если подскажешь, как это делается в VC, можно попробовать поискать аналог в SA
наверно, можно начать с https://thirteenag.github.io/p2dfx#about
CLEO для San Andreas: The Definitive Edition
https://re.cleo.li
Привет!
Еще хорошо работает https://github.com/iAmAsval/FModel
Будет ли поддержка клео для ремастера игр?
Убедись, что файл, который ты компилируешь, и файл, который ты запускаешь в игре или декомпилируешь, - один и тот же.
В файле, скомпилированном с "Как есть", должно быть %d
Я вроде всё или почти всё перенес в онлайн версию. https://docs.sannybuilder.com/v/ru/scm-documentation/sa
Каких материалов не хватает по сравнению со старой справкой?
Преимущество онлайн версии в простоте обновления вне релизов программы и возможности ссылаться на нее из интернет-источников (форумы, чаты и т.п.)
How do I set a value to a variable with a command while I'm in the game?
the question is not clear. you can set a value with the set command, like 0004: $var = 1 or 0006: 0@ = 1 etc
{$CLEO}
0000:
while true
wait 250
if
0ADC: test_cheat "SETVAR"
then
0@ = 10 // or any other value
end
end
попробуй на бета-версии v3.8.0
https://github.com/sannybuilder/dev/rel … 8.0-beta.0
mfisto
спасибо за файл. я нашел и исправил ошибку. постараюсь в ближайшие дни выложить обновление.
Это происходит в функции
.text:005B89F0 CVehicle::SetDriver((CPed *)) proc near
вот например добавление 20 ХП
.text:005B8AC2 call GetPlayerPed
.text:005B8AC7 mov dl, ds:_players.maxHealth
.text:005B8ACD fld flt_69C69C
можно записать 0 по этому адресу
.data:0069C69C flt_69C69C dd 20.0
тогда здоровье не будет увеличиваться
с оружием чуть сложнее
.text:005B8C0D mov ecx, ebp ; CPed *
.text:005B8C0F push 1 ; flag
.text:005B8C11 push 3 ; weaponIndex
.text:005B8C13 call CPed__HasWeapon
.text:005B8C18 test al, al
.text:005B8C1A jz loc_5B8CD0
.text:005B8C20
.text:005B8C20 loc_5B8C20: ; CODE XREF: CVehicle::SetDriver((CPed *))+21Bj
.text:005B8C20 push 1 ; flags
.text:005B8C22 push 261 ; modelIndex
.text:005B8C27 call RequestStream
самое простое что тут можно сделать, это инвертировать проверку на наличие оружия у игрока. в оригинальной версии оружие выдается, если у игрока еще нет шотгана, можно сделать наоборот. если шотгана нет - не выдавать.
для этого должно быть достаточно записать 0x85 по адресу 005B8C1B
write_memory 0x005B8C1B 1 0x85 1
ps. в игре не проверял
Можешь выложить свой скрипт и classes.db, на котором воспроизводится ошибка, я посмотрю в чем дело