* fix stack size, file listing works * fix scrollbar, update docs * cut long filenames * Dolphin: overhaul unlocking logic, unlocked message added * furi - added common_defines.h, minor macro cleanup; fix scrollbar type conversion * remove door opening animation * adaptive long file name shortening, item icons, invert selection * archive: browser tab, file types (beta); scenes: fix sleep emote * dont trim unknown extensions * fix string_size usage * array container for file list, fixes * better path handling * archive: renaming, adding to favorites worksl scrollbar fix: limit min bar height to 1px to prevent disappearance on large lists Co-authored-by: あく <alleteam@gmail.com>
		
			
				
	
	
		
			101 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
#include <furi.h>
 | 
						|
#include "scene.h"
 | 
						|
#include "assets/emotes.h"
 | 
						|
 | 
						|
static uint16_t roll_new(uint16_t prev, uint16_t max) {
 | 
						|
    uint16_t val = 999;
 | 
						|
    while(val != prev) {
 | 
						|
        val = random() % max;
 | 
						|
        break;
 | 
						|
    }
 | 
						|
    return val;
 | 
						|
}
 | 
						|
 | 
						|
static void scene_proceed_action(SceneState* state) {
 | 
						|
    furi_assert(state);
 | 
						|
 | 
						|
    state->prev_action = state->action;
 | 
						|
    state->action = (state->prev_action != state->next_action) ?
 | 
						|
                        state->next_action :
 | 
						|
                        roll_new(state->next_action, ACTIONS_NUM);
 | 
						|
    state->action_timeout = default_timeout[state->action];
 | 
						|
}
 | 
						|
 | 
						|
static void scene_dolphin_go_to_poi(SceneState* state) {
 | 
						|
    furi_assert(state);
 | 
						|
    if(state->player_global.x < state->poi) {
 | 
						|
        state->player_flipped = false;
 | 
						|
        state->player_v.x = SPEED_X / 2;
 | 
						|
    } else if(state->player_global.x > state->poi) {
 | 
						|
        state->player_flipped = true;
 | 
						|
        state->player_v.x = -SPEED_X / 2;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void scene_action_handler(SceneState* state) {
 | 
						|
    furi_assert(state);
 | 
						|
    if(state->action == MINDCONTROL && state->player_v.x != 0) {
 | 
						|
        state->action_timeout = default_timeout[state->action];
 | 
						|
    }
 | 
						|
 | 
						|
    if(state->action_timeout > 0) {
 | 
						|
        state->action_timeout--;
 | 
						|
    } else {
 | 
						|
        if(random() % 1000 > 500) {
 | 
						|
            state->next_action = roll_new(state->prev_action, ACTIONS_NUM);
 | 
						|
            state->poi = roll_new(state->player_global.x, WORLD_WIDTH / 4);
 | 
						|
        }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void dolphin_scene_update_state(SceneState* state, uint32_t t, uint32_t dt) {
 | 
						|
    furi_assert(state);
 | 
						|
    scene_action_handler(state);
 | 
						|
    UNUSED(dialogues_list);
 | 
						|
 | 
						|
    switch(state->action) {
 | 
						|
    case WALK:
 | 
						|
        if(state->player_global.x == state->poi) {
 | 
						|
            state->player_v.x = 0;
 | 
						|
            scene_proceed_action(state);
 | 
						|
        } else {
 | 
						|
            scene_dolphin_go_to_poi(state);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    case EMOTE:
 | 
						|
        state->player_flipped = false;
 | 
						|
        if(state->action_timeout == 0) {
 | 
						|
            scene_proceed_action(state);
 | 
						|
            state->emote_id = roll_new(state->previous_emote, SIZEOF_ARRAY(emotes_list));
 | 
						|
            break;
 | 
						|
        }
 | 
						|
    case INTERACT:
 | 
						|
        if(state->action_timeout == 0) {
 | 
						|
            if(state->prev_action == MINDCONTROL) {
 | 
						|
                state->action = MINDCONTROL;
 | 
						|
            } else {
 | 
						|
                scene_proceed_action(state);
 | 
						|
            }
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    case SLEEP:
 | 
						|
        if(state->poi != 154) { // temp
 | 
						|
            state->poi = 154;
 | 
						|
        } else if(state->player_global.x != state->poi) {
 | 
						|
            scene_dolphin_go_to_poi(state);
 | 
						|
        } else {
 | 
						|
            state->player_v.x = 0;
 | 
						|
            if(state->action_timeout == 0) {
 | 
						|
                state->poi = roll_new(state->player_global.x, WORLD_WIDTH / 4);
 | 
						|
                scene_proceed_action(state);
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        }
 | 
						|
    default:
 | 
						|
        if(state->action_timeout == 0) {
 | 
						|
            scene_proceed_action(state);
 | 
						|
        }
 | 
						|
        break;
 | 
						|
    }
 | 
						|
}
 |