preview for challenges and new system
[carveJwlIkooP6JGAAIwe30JlM.git] / ent_skateshop.c
1 #ifndef ENT_SKATESHOP_C
2 #define ENT_SKATESHOP_C
3
4 #define VG_GAME
5 #include "vg/vg.h"
6 #include "vg/vg_steam_ugc.h"
7 #include "vg/vg_msg.h"
8 #include "ent_skateshop.h"
9 #include "world.h"
10 #include "player.h"
11 #include "gui.h"
12 #include "menu.h"
13 #include "pointcloud.h"
14 #include "highscores.h"
15 #include "steam.h"
16 #include "addon.h"
17 #include "save.h"
18
19 /*
20 * Checks string equality but does a hash check first
21 */
22 static inline int const_str_eq( u32 hash, const char *str, const char *cmp )
23 {
24 if( hash == vg_strdjb2(cmp) )
25 if( !strcmp( str, cmp ) )
26 return 1;
27 return 0;
28 }
29
30 VG_STATIC void skateshop_update_viewpage(void){
31 u32 page = global_skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX;
32
33 for( u32 i=0; i<SKATESHOP_VIEW_SLOT_MAX; i++ ){
34 u32 j = SKATESHOP_VIEW_SLOT_MAX-1-i;
35 struct shop_view_slot *slot = &global_skateshop.shop_view_slots[j];
36 addon_cache_unwatch( k_addon_type_board, slot->cache_id );
37 }
38
39 for( u32 i=0; i<SKATESHOP_VIEW_SLOT_MAX; i++ ){
40 struct shop_view_slot *slot = &global_skateshop.shop_view_slots[i];
41 u32 request_id = page*SKATESHOP_VIEW_SLOT_MAX + i;
42 slot->cache_id = addon_cache_create_viewer( k_addon_type_board,
43 request_id );
44 }
45 }
46
47 /*
48 * op/subroutine: k_workshop_op_item_load
49 * -----------------------------------------------------------------------------
50 */
51
52 VG_STATIC void world_scan_thread( void *_args ){
53 addon_mount_content_folder( k_addon_type_world, "maps", ".mdl" );
54 addon_mount_workshop_items();
55 vg_async_call( async_addon_reg_update, NULL, 0 );
56 }
57
58 /*
59 * Asynchronous scan of local disk for worlds
60 */
61 VG_STATIC void skateshop_op_world_scan(void){
62 vg_loader_start( world_scan_thread, NULL );
63 }
64
65 VG_STATIC void board_processview_thread( void *_args ){
66 addon_cache_load_loop();
67 }
68
69 VG_STATIC void board_scan_thread( void *_args ){
70 addon_mount_content_folder( k_addon_type_board, "boards", ".mdl" );
71 addon_mount_workshop_items();
72 vg_async_call( async_addon_reg_update, NULL, 0 );
73 vg_async_stall();
74 board_processview_thread(NULL);
75 }
76
77 VG_STATIC void skateshop_op_board_scan(void){
78 vg_loader_start( board_scan_thread, NULL );
79 }
80
81 VG_STATIC void skateshop_op_processview(void){
82 vg_loader_start( board_processview_thread, NULL );
83 }
84
85 /*
86 * Regular stuff
87 * -----------------------------------------------------------------------------
88 */
89
90 /*
91 * VG event init
92 */
93 VG_STATIC void skateshop_init(void){
94 }
95
96 static u16 skateshop_selected_cache_id(void){
97 if( addon_count(k_addon_type_board) ){
98 addon_reg *reg = get_addon_from_index(k_addon_type_board,
99 global_skateshop.selected_board_id);
100 return reg->cache_id;
101 }
102 else return 0;
103 }
104
105 VG_STATIC void pointcloud_async_end(void *_, u32 __)
106 {
107 pointcloud_animate( k_pointcloud_anim_opening );
108 }
109
110 VG_STATIC void pointcloud_clear_async(void *_, u32 __)
111 {
112 pointcloud.count = 0;
113 pointcloud_animate( k_pointcloud_anim_opening );
114 }
115
116 VG_STATIC void skateshop_world_preview_loader_thread( void *_data )
117 {
118 addon_reg *reg = _data;
119
120 char path_buf[4096];
121 vg_str path;
122 vg_strnull( &path, path_buf, 4096 );
123 addon_get_content_folder( reg, &path );
124 vg_strcat( &path, "/preview.bin" );
125
126 vg_linear_clear(vg_mem.scratch);
127 u32 size;
128
129 void *data = vg_file_read( vg_mem.scratch, path_buf, &size );
130 if( data ){
131 if( size < sizeof(pointcloud_buffer) ){
132 vg_async_call( pointcloud_clear_async, NULL, 0 );
133 return;
134 }
135
136 vg_async_item *call = vg_async_alloc(size);
137 pointcloud_buffer *pcbuf = call->payload;
138 memcpy( pcbuf, data, size );
139
140 u32 point_count = (size-sizeof(pointcloud_buffer)) /
141 sizeof(struct pointcloud_vert);
142 pcbuf->max = point_count;
143 pcbuf->count = point_count;
144 pcbuf->op = k_pointcloud_op_clear;
145
146 vg_async_dispatch( call, async_pointcloud_sub );
147 vg_async_call( pointcloud_async_end, NULL, 0 );
148 }
149 else{
150 vg_async_call( pointcloud_clear_async, NULL, 0 );
151 }
152 }
153
154 VG_STATIC void skateshop_world_preview_loader_thread_and_end( void *_data ){
155 skateshop_world_preview_loader_thread( _data );
156 }
157
158 VG_STATIC void skateshop_load_world_preview( addon_reg *reg ){
159 vg_loader_start( skateshop_world_preview_loader_thread_and_end, reg );
160 }
161
162 /*
163 * VG event preupdate
164 */
165 void temp_update_playermodel(void);
166 VG_STATIC void ent_skateshop_preupdate( ent_skateshop *shop ){
167 /* input filter */
168 world_instance *world = world_current_instance();
169
170 /* camera positioning */
171 ent_camera *ref = mdl_arritm( &world->ent_camera,
172 mdl_entity_id_id(shop->id_camera) );
173
174 v3f dir = {0.0f,-1.0f,0.0f};
175 mdl_transform_vector( &ref->transform, dir, dir );
176 m3x3_mulv( localplayer.invbasis, dir, dir );
177 player_vector_angles( world_static.focus_cam.angles, dir, 1.0f, 0.0f );
178
179 v3f lookat;
180 if( shop->type == k_skateshop_type_boardshop ||
181 shop->type == k_skateshop_type_worldshop ){
182 ent_marker *display = mdl_arritm( &world->ent_marker,
183 mdl_entity_id_id(shop->boards.id_display) );
184 v3_sub( display->transform.co, localplayer.rb.co, lookat );
185 }
186 else if( shop->type == k_skateshop_type_charshop )
187 v3_sub( ref->transform.co, localplayer.rb.co, lookat );
188 else
189 vg_fatal_error( "Unknown store (%u)\n", shop->type );
190
191 q_axis_angle( localplayer.rb.q, (v3f){0.0f,1.0f,0.0f},
192 atan2f(lookat[0],lookat[2]) );
193
194 v3_copy( ref->transform.co, world_static.focus_cam.pos );
195 world_static.focus_cam.fov = ref->fov;
196
197 /* input */
198 if( shop->type == k_skateshop_type_boardshop ){
199 if( !vg_loader_availible() ) return;
200
201 gui_helper_action( axis_display_string( k_sraxis_mbrowse_h ), "browse" );
202 gui_helper_action( button_display_string( k_srbind_mback ), "exit" );
203
204 u16 cache_id = skateshop_selected_cache_id();
205 if( cache_id ){
206 gui_helper_action( button_display_string( k_srbind_maccept ), "pick" );
207 }
208
209 /*
210 * Controls
211 * ----------------------
212 */
213 u32 opage = global_skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX;
214
215 if( button_down( k_srbind_mleft ) ){
216 if( global_skateshop.selected_board_id > 0 ){
217 global_skateshop.selected_board_id --;
218 }
219 }
220
221 if( button_down( k_srbind_mright ) ){
222 if( global_skateshop.selected_board_id+1 <
223 addon_count(k_addon_type_board) )
224 {
225 global_skateshop.selected_board_id ++;
226 }
227 }
228
229 u32 npage = global_skateshop.selected_board_id/SKATESHOP_VIEW_SLOT_MAX;
230
231 if( opage != npage ){
232 skateshop_update_viewpage();
233 skateshop_op_processview();
234 }
235 else if( cache_id && button_down( k_srbind_maccept )){
236 vg_info( "chose board from skateshop (%u)\n",
237 global_skateshop.selected_board_id );
238
239 addon_cache_unwatch( k_addon_type_board, localplayer.board_view_slot );
240 addon_cache_watch( k_addon_type_board, cache_id );
241 localplayer.board_view_slot = cache_id;
242
243 world_entity_unfocus();
244 skaterift_autosave(1);
245 return;
246 }
247 }
248 else if( shop->type == k_skateshop_type_charshop ){
249 if( !vg_loader_availible() ) return;
250
251 gui_helper_action( axis_display_string( k_sraxis_mbrowse_h ), "browse" );
252 gui_helper_action( button_display_string( k_srbind_mback ), "exit" );
253 gui_helper_action( button_display_string( k_srbind_maccept ), "pick" );
254
255 int changed = 0;
256
257 if( button_down( k_srbind_mleft ) ){
258 if( global_skateshop.selected_player_id > 0 ){
259 global_skateshop.selected_player_id --;
260 }
261 else{
262 global_skateshop.selected_player_id =
263 addon_count(k_addon_type_player) -1;
264 }
265
266 changed = 1;
267 }
268
269 if( button_down( k_srbind_mright ) ){
270 if( global_skateshop.selected_player_id+1 <
271 addon_count(k_addon_type_player) ){
272 global_skateshop.selected_player_id ++;
273 }
274 else{
275 global_skateshop.selected_player_id = 0;
276 }
277
278 changed = 1;
279 }
280
281 if( changed ){
282 player__use_model( &localplayer, global_skateshop.selected_player_id );
283 skateshop_op_processview();
284 }
285
286 if( button_down( k_srbind_maccept ) ){
287 world_entity_unfocus();
288 }
289 }
290 else if( shop->type == k_skateshop_type_worldshop ){
291 int browseable = 0,
292 loadable = 0;
293
294 if( addon_count(k_addon_type_world) && vg_loader_availible() ){
295 gui_helper_action( axis_display_string(k_sraxis_mbrowse_h), "browse" );
296 browseable = 1;
297 }
298
299 if( vg_loader_availible() && global_skateshop.selected_world_id > 0 ){
300 gui_helper_action( button_display_string(k_srbind_maccept),
301 "open rift" );
302 loadable = 1;
303 }
304
305 int change = 0;
306
307 if( browseable ){
308 if( button_down( k_srbind_mleft ) ){
309 if( global_skateshop.selected_world_id > 0 )
310 {
311 global_skateshop.selected_world_id --;
312 change = 1;
313 }
314 }
315
316 if( button_down( k_srbind_mright ) ){
317 if( global_skateshop.selected_world_id+1 <
318 addon_count(k_addon_type_world) )
319 {
320 global_skateshop.selected_world_id ++;
321 change = 1;
322 }
323 }
324 }
325
326 if( change && pointcloud_idle() ){
327 pointcloud_animate( k_pointcloud_anim_hiding );
328 }
329
330 if( vg_loader_availible() ){
331 addon_reg *reg = get_addon_from_index( k_addon_type_world,
332 global_skateshop.selected_world_id );
333
334 /* automatically load in clouds */
335 if( loadable && button_down( k_srbind_maccept ) ){
336 vg_info( "Select rift (%u)\n",
337 global_skateshop.selected_world_id );
338 skaterift_change_world_start( reg );
339 return;
340 }
341 else{
342 if( pointcloud.anim == k_pointcloud_anim_idle_closed ){
343 if( global_skateshop.pointcloud_world_id !=
344 global_skateshop.selected_world_id )
345 {
346 global_skateshop.pointcloud_world_id =
347 global_skateshop.selected_world_id;
348 skateshop_load_world_preview( reg );
349 }
350 else{
351 pointcloud_animate( k_pointcloud_anim_opening );
352 }
353 }
354 else if( pointcloud.anim == k_pointcloud_anim_idle_open ){
355 if( global_skateshop.pointcloud_world_id !=
356 global_skateshop.selected_world_id )
357 {
358 pointcloud_animate( k_pointcloud_anim_hiding );
359 }
360 }
361 }
362 }
363 }
364 else{
365 vg_fatal_error( "Unknown store (%u)\n", shop->type );
366 }
367
368 if( button_down( k_srbind_mback ) ){
369 world_entity_unfocus();
370 return;
371 }
372 }
373
374 VG_STATIC void skateshop_render_boardshop( ent_skateshop *shop ){
375 world_instance *world = world_current_instance();
376 u32 slot_count = vg_list_size(global_skateshop.shop_view_slots);
377
378 ent_marker *mark_rack = mdl_arritm( &world->ent_marker,
379 mdl_entity_id_id(shop->boards.id_rack)),
380 *mark_display = mdl_arritm( &world->ent_marker,
381 mdl_entity_id_id(shop->boards.id_display));
382
383 SDL_AtomicLock( &addon_system.sl_cache_using_resources );
384 struct addon_cache *cache = &addon_system.cache[k_addon_type_board];
385
386 /* Render loaded boards in the view slots */
387 for( u32 i=0; i<slot_count; i++ ){
388 struct shop_view_slot *slot = &global_skateshop.shop_view_slots[i];
389 float selected = 0.0f;
390
391 if( !slot->cache_id )
392 goto fade_out;
393
394 addon_cache_entry *entry = vg_pool_item( &cache->pool, slot->cache_id );
395
396 if( entry->state != k_addon_cache_state_loaded )
397 goto fade_out;
398
399 struct player_board *board =
400 addon_cache_item( k_addon_type_board, slot->cache_id );
401
402 mdl_transform xform;
403 transform_identity( &xform );
404
405 xform.co[0] = -((float)i - ((float)slot_count)*0.5f)*0.45f;
406 mdl_transform_mul( &mark_rack->transform, &xform, &xform );
407
408
409 if( entry->reg_index == global_skateshop.selected_board_id ){
410 selected = 1.0f;
411 }
412
413 float t = slot->view_blend;
414 v3_lerp( xform.co, mark_display->transform.co, t, xform.co );
415 q_nlerp( xform.q, mark_display->transform.q, t, xform.q );
416 v3_lerp( xform.s, mark_display->transform.s, t, xform.s );
417
418 struct player_board_pose pose = {0};
419 m4x3f mmdl;
420 mdl_transform_m4x3( &xform, mmdl );
421 render_board( &skaterift.cam, world, board, mmdl,
422 &pose, k_board_shader_entity );
423
424 fade_out:;
425 float rate = 5.0f*vg.time_delta;
426 slot->view_blend = vg_lerpf( slot->view_blend, selected, rate );
427 }
428
429 ent_marker *mark_info = mdl_arritm( &world->ent_marker,
430 mdl_entity_id_id(shop->boards.id_info));
431 m4x3f mtext, mrack;
432 mdl_transform_m4x3( &mark_info->transform, mtext );
433 mdl_transform_m4x3( &mark_rack->transform, mrack );
434
435 #if 0
436 const char *text_title = "Fish - Title";
437 const char *text_author = "by Shaniqua";
438 #endif
439
440 m4x3f mlocal, mmdl;
441 m4x3_identity( mlocal );
442
443 float scale = 0.2f,
444 thickness = 0.03f;
445
446 font3d_bind( &gui.font, &skaterift.cam );
447 shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} );
448
449 /* Selection counter
450 * ------------------------------------------------------------------ */
451 m3x3_zero( mlocal );
452 v3_zero( mlocal[3] );
453 mlocal[0][0] = -scale*2.0f;
454 mlocal[1][2] = -scale*2.0f;
455 mlocal[2][1] = -thickness;
456 mlocal[3][2] = -0.7f;
457 m4x3_mul( mrack, mlocal, mmdl );
458
459 if( addon_count(k_addon_type_board) ){
460 char buf[16];
461 int i=0;
462 i+=highscore_intl( buf+i, global_skateshop.selected_board_id+1, 3 );
463 buf[i++] = '/';
464 i+=highscore_intl( buf+i, addon_count(k_addon_type_board), 3 );
465 buf[i++] = '\0';
466
467 font3d_simple_draw( &gui.font, 0, k_font_shader_default,
468 buf, &skaterift.cam, mmdl );
469 }
470 else{
471 font3d_simple_draw( &gui.font, 0, k_font_shader_default,
472 "Nothing installed", &skaterift.cam, mmdl );
473 }
474
475 u16 cache_id = skateshop_selected_cache_id();
476 struct addon_cache_entry *entry = vg_pool_item( &cache->pool, cache_id );
477 addon_reg *reg = NULL;
478
479 if( entry ) reg = entry->reg_ptr;
480
481 if( !reg ){
482 SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
483 global_skateshop.render.item_title = "";
484 global_skateshop.render.item_desc = "";
485 return;
486 }
487
488 if( global_skateshop.render.reg_id != global_skateshop.selected_board_id ){
489 global_skateshop.render.item_title = "";
490 global_skateshop.render.item_desc = "";
491 vg_msg root = {0};
492 root.buf = reg->metadata;
493 root.len = reg->metadata_len;
494 root.max = sizeof(reg->metadata);
495
496 vg_msg workshop = root;
497 if( vg_msg_seekframe( &workshop, "workshop", 0 ) ){
498 const char *title = vg_msg_seekkvstr( &workshop, "title", 0 );
499 if( title ) global_skateshop.render.item_title = title;
500
501 const char *dsc = vg_msg_seekkvstr( &workshop, "author", 0 );
502 if( dsc ) global_skateshop.render.item_desc = dsc;
503 }
504
505 global_skateshop.render.reg_id = global_skateshop.selected_board_id;
506 }
507
508 /* Skin title
509 * ----------------------------------------------------------------- */
510 m3x3_zero( mlocal );
511 m3x3_setdiagonalv3( mlocal, (v3f){ scale, scale, thickness } );
512 mlocal[3][0] = -font3d_string_width( &gui.font, 0,
513 global_skateshop.render.item_title );
514 mlocal[3][0] *= scale*0.5f;
515 mlocal[3][1] = 0.1f;
516 mlocal[3][2] = 0.0f;
517 m4x3_mul( mtext, mlocal, mmdl );
518 font3d_simple_draw( &gui.font, 0, k_font_shader_default,
519 global_skateshop.render.item_title,
520 &skaterift.cam, mmdl );
521
522 /* Author name
523 * ----------------------------------------------------------------- */
524 scale *= 0.4f;
525 m3x3_setdiagonalv3( mlocal, (v3f){ scale, scale, thickness } );
526 mlocal[3][0] = -font3d_string_width( &gui.font, 0,
527 global_skateshop.render.item_desc );
528 mlocal[3][0] *= scale*0.5f;
529 mlocal[3][1] = 0.0f;
530 mlocal[3][2] = 0.0f;
531 m4x3_mul( mtext, mlocal, mmdl );
532 font3d_simple_draw( &gui.font, 0, k_font_shader_default,
533 global_skateshop.render.item_desc,
534 &skaterift.cam, mmdl );
535
536 SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
537 }
538
539 VG_STATIC void skateshop_render_charshop( ent_skateshop *shop ){
540 }
541
542 VG_STATIC void skateshop_render_worldshop( ent_skateshop *shop ){
543 world_instance *world = world_current_instance();
544
545 ent_marker *mark_display = mdl_arritm( &world->ent_marker,
546 mdl_entity_id_id(shop->worlds.id_display)),
547 *mark_info = mdl_arritm( &world->ent_marker,
548 mdl_entity_id_id(shop->boards.id_info));
549
550 if( global_skateshop.render.world_reg != global_skateshop.selected_world_id){
551 global_skateshop.render.world_title = "";
552
553 addon_reg *reg = get_addon_from_index( k_addon_type_world,
554 global_skateshop.selected_world_id );
555 vg_msg root = {0};
556 root.buf = reg->metadata;
557 root.len = reg->metadata_len;
558 root.max = sizeof(reg->metadata);
559 vg_msg workshop = root;
560 if( vg_msg_seekframe( &workshop, "workshop", 0 ) ){
561 global_skateshop.render.world_title = vg_msg_seekkvstr( &workshop,
562 "title", 0 );
563 }
564 global_skateshop.render.world_loc = vg_msg_seekkvstr(&root,"location",0);
565 global_skateshop.render.world_reg = global_skateshop.selected_world_id;
566 }
567
568 /* Text */
569 char buftext[128], bufsubtext[128];
570 vg_str info, subtext;
571 vg_strnull( &info, buftext, 128 );
572 vg_strnull( &subtext, bufsubtext, 128 );
573
574 if( addon_count(k_addon_type_world) ){
575 addon_reg *reg = get_addon_from_index( k_addon_type_world,
576 global_skateshop.selected_world_id );
577
578 info.i+=highscore_intl( info.buffer+info.i,
579 global_skateshop.selected_world_id+1, 3 );
580 info.buffer[info.i++] = '/';
581 info.i+=highscore_intl( info.buffer+info.i,
582 addon_count(k_addon_type_world), 3 );
583 info.buffer[info.i++] = ' ';
584 info.buffer[info.i] = '\0';
585
586 vg_strcat( &info, global_skateshop.render.world_title );
587 if( !vg_loader_availible() ){
588 vg_strcat( &subtext, "Loading..." );
589 }
590 else{
591 addon_reg *reg = get_addon_from_index( k_addon_type_world,
592 global_skateshop.selected_world_id );
593
594 if( reg->alias.workshop_id )
595 vg_strcat( &subtext, "(Workshop) " );
596
597 vg_strcat( &subtext, global_skateshop.render.world_loc );
598 }
599 }
600 else{
601 vg_strcat( &info, "No worlds installed" );
602 }
603
604
605 m4x3f mtext,mlocal,mtextmdl;
606 mdl_transform_m4x3( &mark_info->transform, mtext );
607
608 font3d_bind( &gui.font, &skaterift.cam );
609 shader_model_font_uColour( (v4f){1.0f,1.0f,1.0f,1.0f} );
610
611 float scale = 0.2f, thickness = 0.015f, scale1 = 0.08f;
612 m3x3_zero( mlocal );
613 m3x3_setdiagonalv3( mlocal, (v3f){ scale, scale, thickness } );
614 mlocal[3][0] = -font3d_string_width( &gui.font, 0, buftext );
615 mlocal[3][0] *= scale*0.5f;
616 mlocal[3][1] = 0.1f;
617 mlocal[3][2] = 0.0f;
618 m4x3_mul( mtext, mlocal, mtextmdl );
619 font3d_simple_draw( &gui.font, 0, k_font_shader_default,
620 buftext, &skaterift.cam, mtextmdl );
621
622 m3x3_setdiagonalv3( mlocal, (v3f){ scale1, scale1, thickness } );
623 mlocal[3][0] = -font3d_string_width( &gui.font, 0, bufsubtext );
624 mlocal[3][0] *= scale1*0.5f;
625 mlocal[3][1] = -scale1*0.3f;
626 m4x3_mul( mtext, mlocal, mtextmdl );
627 font3d_simple_draw( &gui.font, 0, k_font_shader_default,
628 bufsubtext, &skaterift.cam, mtextmdl );
629
630 /* pointcloud */
631 m4x3f mmdl;
632 mdl_transform_m4x3( &mark_display->transform, mmdl );
633 m4x3_rotate_y( mmdl, vg.time * 0.2 );
634
635 glEnable(GL_BLEND);
636 glBlendFunc(GL_ONE, GL_ONE);
637 glDisable(GL_DEPTH_TEST);
638 pointcloud_render( world, &skaterift.cam, mmdl );
639 glDisable(GL_BLEND);
640 glEnable(GL_DEPTH_TEST);
641 }
642
643 /*
644 * World: render event
645 */
646 VG_STATIC void skateshop_render( ent_skateshop *shop ){
647 if( shop->type == k_skateshop_type_boardshop )
648 skateshop_render_boardshop( shop );
649 else if( shop->type == k_skateshop_type_charshop )
650 skateshop_render_charshop( shop );
651 else if( shop->type == k_skateshop_type_worldshop )
652 skateshop_render_worldshop( shop );
653 else
654 vg_fatal_error( "Unknown store (%u)\n", shop->type );
655 }
656
657 /*
658 * Entity logic: entrance event
659 */
660 VG_STATIC void ent_skateshop_call( world_instance *world, ent_call *call ){
661 u32 index = mdl_entity_id_id( call->id );
662 ent_skateshop *shop = mdl_arritm( &world->ent_skateshop, index );
663 vg_info( "skateshop_call\n" );
664
665 if( skaterift.activity != k_skaterift_default ) return;
666 if( !vg_loader_availible() ) return;
667
668 if( call->function == k_ent_function_trigger ){
669 if( localplayer.subsystem != k_player_subsystem_walk ) return;
670
671 vg_info( "Entering skateshop\n" );
672
673 world_entity_focus( call->id );
674 #if 0
675 localplayer.immobile = 1;
676 menu.disable_open = 1;
677 skaterift.activity = k_skaterift_skateshop;
678
679 v3_zero( localplayer.rb.v );
680 v3_zero( localplayer.rb.w );
681 localplayer._walk.move_speed = 0.0f;
682 global_skateshop.ptr_ent = shop;
683 #endif
684
685 if( shop->type == k_skateshop_type_boardshop ){
686 skateshop_update_viewpage();
687 skateshop_op_board_scan();
688 }
689 else if( shop->type == k_skateshop_type_charshop ){
690
691 }
692 else if( shop->type == k_skateshop_type_worldshop ){
693 pointcloud_animate( k_pointcloud_anim_opening );
694 skateshop_op_world_scan();
695 }
696 }
697 }
698
699 #endif /* ENT_SKATESHOP_C */