From 89f049c527ab3f58a1ae84e51458bb183725216c Mon Sep 17 00:00:00 2001 From: rexim Date: Sat, 5 Oct 2024 18:54:58 +0700 Subject: [PATCH] Remove unused bindings for C3 functions --- client.c3 | 40 ++++++++++++++++++++-------------------- client.mjs | 20 -------------------- client.mts | 40 ---------------------------------------- client.wasm | Bin 75342 -> 73088 bytes server.c3 | 42 +++++++++++++++++++++--------------------- server.mjs | 21 --------------------- server.mts | 42 ------------------------------------------ server.wasm | Bin 89773 -> 87875 bytes 8 files changed, 41 insertions(+), 164 deletions(-) diff --git a/client.c3 b/client.c3 index ef53e34..179df68 100644 --- a/client.c3 +++ b/client.c3 @@ -416,7 +416,7 @@ fn void cull_and_sort_sprites(SpritePool *sprite_pool) { fn int(Sprite *a, Sprite *b) => (int)math::copysign(1.0f, b.pdist - a.pdist)); } -fn void push_sprite(SpritePool *sprite_pool, Image *image, float x, float y, float z, float scale, int crop_position_x, int crop_position_y, int crop_size_x, int crop_size_y) @extern("push_sprite") @wasm { +fn void push_sprite(SpritePool *sprite_pool, Image *image, float x, float y, float z, float scale, int crop_position_x, int crop_position_y, int crop_size_x, int crop_size_y) { if (sprite_pool.length >= SPRITE_POOL_CAPACITY) return; usz last = sprite_pool.length; @@ -472,7 +472,7 @@ fn void render_sprites(Image *display, float *zbuffer, SpritePool *sprite_pool) } } -fn void emit_particle(float source_x, float source_y, float source_z, ParticlePool *particle_pool) @extern("emit_particle") @wasm { +fn void emit_particle(float source_x, float source_y, float source_z, ParticlePool *particle_pool) { foreach (&particle: particle_pool.items) { if (particle.lifetime <= 0) { particle.lifetime = PARTICLE_LIFETIME; @@ -537,7 +537,7 @@ fn void kill_all_items(Item[]* items) { } } -fn bool verify_items_collected_batch_message(Message *message) @extern("verify_items_collected_batch_message") @wasm { +fn bool verify_items_collected_batch_message(Message *message) { if (message.size < ItemsCollectedBatchMessage.sizeof) return false; if ((message.size - ItemsCollectedBatchMessage.sizeof)%int.sizeof != 0) return false; ItemsCollectedBatchMessage* items_collected_batch_message = (ItemsCollectedBatchMessage*)message; @@ -545,7 +545,7 @@ fn bool verify_items_collected_batch_message(Message *message) @extern("verify_i return true; } -fn bool apply_items_collected_batch_message_to_level_items(ItemsCollectedBatchMessage *message, Item[]* items) @extern("apply_items_collected_batch_message_to_level_items") @wasm { +fn bool apply_items_collected_batch_message_to_level_items(ItemsCollectedBatchMessage *message, Item[]* items) { usz count = (message.size - ItemsCollectedBatchMessage.sizeof)/int.sizeof; for (usz i = 0; i < count; ++i) { @@ -567,7 +567,7 @@ fn bool apply_items_collected_batch_message_to_level_items(ItemsCollectedBatchMe return true; } -fn bool verify_items_spawned_batch_message(Message *message) @extern("verify_items_spawned_batch_message") @wasm { +fn bool verify_items_spawned_batch_message(Message *message) { if (message.size < ItemsSpawnedBatchMessage.sizeof) return false; if ((message.size - ItemsSpawnedBatchMessage.sizeof)%ItemSpawned.sizeof != 0) return false; ItemsSpawnedBatchMessage* items_spawned_batch_message = (ItemsSpawnedBatchMessage*)message; @@ -575,7 +575,7 @@ fn bool verify_items_spawned_batch_message(Message *message) @extern("verify_ite return true; } -fn bool apply_items_spawned_batch_message_to_level_items(ItemsSpawnedBatchMessage *message, Item[]* items) @extern("apply_items_spawned_batch_message_to_level_items") @wasm { +fn bool apply_items_spawned_batch_message_to_level_items(ItemsSpawnedBatchMessage *message, Item[]* items) { usz count = (message.size - ItemsCollectedBatchMessage.sizeof)/ItemSpawned.sizeof; for (usz i = 0; i < count; ++i) { int itemIndex = message.items[i].itemIndex; @@ -593,7 +593,7 @@ fn bool apply_items_spawned_batch_message_to_level_items(ItemsSpawnedBatchMessag return true; } -fn void render_items(SpritePool *sprite_pool, Item[]* items, float time, Image *key_image, Image *bomb_image) @extern("render_items") @wasm { +fn void render_items(SpritePool *sprite_pool, Item[]* items, float time, Image *key_image, Image *bomb_image) { foreach (item: *items) { if (item.alive) { float z = 0.25f + ITEM_AMP - ITEM_AMP*math::sin(ITEM_FREQ*(float)math::PI*time + item.position.x + item.position.y); @@ -659,7 +659,7 @@ fn void update_bombs_on_client_side(SpritePool *sprite_pool, ParticlePool *parti } } -fn bool verify_bombs_spawned_batch_message(Message *message) @extern("verify_bombs_spawned_batch_message") @wasm { +fn bool verify_bombs_spawned_batch_message(Message *message) { if (message.size < BombsSpawnedBatchMessage.sizeof) return false; if ((message.size - BombsSpawnedBatchMessage.sizeof)%BombSpawned.sizeof != 0) return false; BombsSpawnedBatchMessage* bombs_spawned_batch_message = (BombsSpawnedBatchMessage*)message; @@ -667,7 +667,7 @@ fn bool verify_bombs_spawned_batch_message(Message *message) @extern("verify_bom return true; } -fn bool apply_bombs_spawned_batch_message_to_level_items(BombsSpawnedBatchMessage *message, Bombs *bombs) @extern("apply_bombs_spawned_batch_message_to_level_items") @wasm { +fn bool apply_bombs_spawned_batch_message_to_level_items(BombsSpawnedBatchMessage *message, Bombs *bombs) { usz count = (message.size - BombsSpawnedBatchMessage.sizeof)/BombSpawned.sizeof; for (usz i = 0; i < count; ++i) { int bombIndex = message.bombs[i].bombIndex; @@ -688,7 +688,7 @@ fn bool apply_bombs_spawned_batch_message_to_level_items(BombsSpawnedBatchMessag return true; } -fn bool verify_bombs_exploded_batch_message(Message *message) @extern("verify_bombs_exploded_batch_message") @wasm { +fn bool verify_bombs_exploded_batch_message(Message *message) { if (message.size < BombsExplodedBatchMessage.sizeof) return false; if ((message.size - BombsExplodedBatchMessage.sizeof)%BombExploded.sizeof != 0) return false; BombsExplodedBatchMessage* bombs_exploded_batch_message = (BombsExplodedBatchMessage*)message; @@ -696,7 +696,7 @@ fn bool verify_bombs_exploded_batch_message(Message *message) @extern("verify_bo return true; } -fn bool apply_bombs_exploded_batch_message_to_level_items(BombsExplodedBatchMessage *message, Bombs *bombs, ParticlePool *particle_pool) @extern("apply_bombs_exploded_batch_message_to_level_items") @wasm { +fn bool apply_bombs_exploded_batch_message_to_level_items(BombsExplodedBatchMessage *message, Bombs *bombs, ParticlePool *particle_pool) { usz count = (message.size - BombsExplodedBatchMessage.sizeof)/BombExploded.sizeof; for (usz i = 0; i < count; ++i) { int bombIndex = message.bombs[i].bombIndex; @@ -740,7 +740,7 @@ const Control[*] CONTROL_KEYS = { {83, MOVING_BACKWARD}, }; -fn bool verify_hello_message(Message *message) @extern("verify_hello_message") @wasm { +fn bool verify_hello_message(Message *message) { if (message.size != HelloMessage.sizeof) return false; HelloMessage* hello_message = (HelloMessage*)message; if (hello_message.kind != HELLO) return false; @@ -759,7 +759,7 @@ fn void apply_hello_message_to_me(HelloMessage *hello_message, Item[]* items) { me.hue = hello_message.hue; } -fn bool verify_players_joined_batch_message(Message *message) @extern("verify_players_joined_batch_message") @wasm { +fn bool verify_players_joined_batch_message(Message *message) { if (message.size < PlayersJoinedBatchMessage.sizeof) return false; if ((message.size - PlayersJoinedBatchMessage.sizeof)%PlayerStruct.sizeof != 0) return false; PlayersJoinedBatchMessage* players_joined_batch_message = (PlayersJoinedBatchMessage*)message; @@ -767,7 +767,7 @@ fn bool verify_players_joined_batch_message(Message *message) @extern("verify_pl return true; } -fn void apply_players_joined_batch_message(PlayersJoinedBatchMessage *message) @extern("apply_players_joined_batch_message") @wasm { +fn void apply_players_joined_batch_message(PlayersJoinedBatchMessage *message) { usz count = (message.size - PlayersJoinedBatchMessage.sizeof)/PlayerStruct.sizeof; for (usz i = 0; i < count; ++i) { PlayerStruct *player_struct = &message.players[i]; @@ -797,7 +797,7 @@ fn void apply_players_joined_batch_message(PlayersJoinedBatchMessage *message) @ } } -fn bool verify_players_left_batch_message(Message *message) @extern("verify_players_left_batch_message") @wasm { +fn bool verify_players_left_batch_message(Message *message) { if (message.size < PlayersLeftBatchMessage.sizeof) return false; if ((message.size - PlayersLeftBatchMessage.sizeof)%uint.sizeof != 0) return false; PlayersLeftBatchMessage* players_left_batch_message = (PlayersLeftBatchMessage*)message; @@ -805,14 +805,14 @@ fn bool verify_players_left_batch_message(Message *message) @extern("verify_play return true; } -fn void apply_players_left_batch_message(PlayersLeftBatchMessage *message) @extern("apply_players_left_batch_message") @wasm { +fn void apply_players_left_batch_message(PlayersLeftBatchMessage *message) { usz count = (message.size - PlayersLeftBatchMessage.sizeof)/uint.sizeof; for (usz i = 0; i < count; ++i) { other_players.remove(message.ids[i]); } } -fn bool verify_players_moving_batch_message(Message *message) @extern("verify_players_moving_batch_message") @wasm { +fn bool verify_players_moving_batch_message(Message *message) { if (message.size < PlayersMovingBatchMessage.sizeof) return false; if ((message.size - PlayersMovingBatchMessage.sizeof)%PlayerStruct.sizeof != 0) return false; PlayersMovingBatchMessage* players_moving_batch_message = (PlayersMovingBatchMessage*)message; @@ -820,7 +820,7 @@ fn bool verify_players_moving_batch_message(Message *message) @extern("verify_pl return true; } -fn bool apply_players_moving_batch_message(PlayersMovingBatchMessage *message) @extern("apply_players_moving_batch_message") @wasm { +fn bool apply_players_moving_batch_message(PlayersMovingBatchMessage *message) { usz count = (message.size - PlayersMovingBatchMessage.sizeof)/PlayerStruct.sizeof; for (usz i = 0; i < count; ++i) { PlayerStruct *player_struct = &message.players[i]; @@ -946,7 +946,7 @@ fn void ping_server_if_needed() @extern("ping_server_if_needed") @wasm { } } -fn bool verify_pong_message(Message *message) @extern("verify_pong_message") @wasm { +fn bool verify_pong_message(Message *message) { if (message.size != PongMessage.sizeof) return false; PongMessage* pong_message = (PongMessage*)message; if (pong_message.kind != PONG) return false; @@ -954,7 +954,7 @@ fn bool verify_pong_message(Message *message) @extern("verify_pong_message") @wa } uint ping = 0; -fn void process_pong_message(PongMessage *message) @extern("process_pong_message") @wasm { +fn void process_pong_message(PongMessage *message) { ping = platform_now_msecs() - message.timestamp; } diff --git a/client.mjs b/client.mjs index b744a5e..0976ae5 100644 --- a/client.mjs +++ b/client.mjs @@ -165,37 +165,17 @@ async function instantiateWasmClient(url) { allocate_sprite_pool: wasm.instance.exports.allocate_sprite_pool, reset_sprite_pool: wasm.instance.exports.reset_sprite_pool, render_minimap: wasm.instance.exports.render_minimap, - push_sprite: wasm.instance.exports.push_sprite, allocate_particle_pool: wasm.instance.exports.allocate_particle_pool, - emit_particle: wasm.instance.exports.emit_particle, - verify_items_collected_batch_message: wasm.instance.exports.verify_items_collected_batch_message, - apply_items_collected_batch_message_to_level_items: wasm.instance.exports.apply_items_collected_batch_message_to_level_items, - verify_items_spawned_batch_message: wasm.instance.exports.verify_items_spawned_batch_message, - apply_items_spawned_batch_message_to_level_items: wasm.instance.exports.apply_items_spawned_batch_message_to_level_items, - render_items: wasm.instance.exports.render_items, - verify_bombs_spawned_batch_message: wasm.instance.exports.verify_bombs_spawned_batch_message, - apply_bombs_spawned_batch_message_to_level_items: wasm.instance.exports.apply_bombs_spawned_batch_message_to_level_items, - verify_bombs_exploded_batch_message: wasm.instance.exports.verify_bombs_exploded_batch_message, - apply_bombs_exploded_batch_message_to_level_items: wasm.instance.exports.apply_bombs_exploded_batch_message_to_level_items, allocate_image: wasm.instance.exports.allocate_image, image_width: wasm.instance.exports.image_width, image_height: wasm.instance.exports.image_height, image_pixels: wasm.instance.exports.image_pixels, players_count: wasm.instance.exports.players_count, unregister_all_other_players: wasm.instance.exports.unregister_all_other_players, - verify_hello_message: wasm.instance.exports.verify_hello_message, - verify_players_joined_batch_message: wasm.instance.exports.verify_players_joined_batch_message, - apply_players_joined_batch_message: wasm.instance.exports.apply_players_joined_batch_message, - verify_players_left_batch_message: wasm.instance.exports.verify_players_left_batch_message, - apply_players_left_batch_message: wasm.instance.exports.apply_players_left_batch_message, - verify_players_moving_batch_message: wasm.instance.exports.verify_players_moving_batch_message, - apply_players_moving_batch_message: wasm.instance.exports.apply_players_moving_batch_message, key_down: wasm.instance.exports.key_down, key_up: wasm.instance.exports.key_up, render_game: wasm.instance.exports.render_game, ping_server_if_needed: wasm.instance.exports.ping_server_if_needed, - verify_pong_message: wasm.instance.exports.verify_pong_message, - process_pong_message: wasm.instance.exports.process_pong_message, ping_msecs: wasm.instance.exports.ping_msecs, process_message: wasm.instance.exports.process_message, }; diff --git a/client.mts b/client.mts index 25c2940..e2a91bf 100644 --- a/client.mts +++ b/client.mts @@ -61,37 +61,17 @@ interface WasmClient extends common.WasmCommon { allocate_sprite_pool: () => number, reset_sprite_pool: (sprite_pool: number) => void, render_minimap: (display: number, scene: number, sprite_pool: number) => void; - push_sprite: (sprite_pool: number, image: number, x: number, y: number, z: number, scale: number, crop_position_x: number, crop_position_y: number, crop_size_x: number, crop_size_y: number) => void; allocate_particle_pool: () => number, - emit_particle: (source_x: number, source_y: number, source_z: number, particle_pool: number) => void, - verify_items_collected_batch_message: (message: number) => boolean, - apply_items_collected_batch_message_to_level_items: (message: number, items: number) => boolean, - verify_items_spawned_batch_message: (message: number) => boolean, - apply_items_spawned_batch_message_to_level_items: (message: number, items: number) => boolean, - render_items: (sprite_pool: number, items: number, time: number, key_image: number, bomb_image: number) => void, - verify_bombs_spawned_batch_message: (message: number) => boolean, - apply_bombs_spawned_batch_message_to_level_items: (message: number, bombs: number) => boolean, - verify_bombs_exploded_batch_message: (message: number) => boolean, - apply_bombs_exploded_batch_message_to_level_items: (message: number, bombs: number, particle_pool: number) => boolean, allocate_image: (width: number, height: number) => number, image_width: (image: number) => number, image_height: (image: number) => number, image_pixels: (image: number) => number, players_count: () => number, unregister_all_other_players: () => void, - verify_hello_message: (message: number) => number, - verify_players_joined_batch_message: (message: number) => boolean, - apply_players_joined_batch_message: (message: number) => void, - verify_players_left_batch_message: (message: number) => boolean, - apply_players_left_batch_message: (message: number) => void, - verify_players_moving_batch_message: (message: number) => boolean, - apply_players_moving_batch_message: (message: number) => boolean, key_down: (key_code: number, bombs: number) => void, key_up: (key_code: number) => void, render_game: (display: number, zbuffer: number, sprite_pool: number, particle_pool: number, scene: number, items: number, bombs: number, key_image: number, bomb_image: number, particle_image: number, wall_image: number, player_image: number, delta_time: number, time: number) => void, ping_server_if_needed: () => void, - verify_pong_message: (message: number) => boolean, - process_pong_message: (message: number) => void, ping_msecs: () => number, process_message: (message: number, items: number, bombs: number, particle_pool: number) => boolean, } @@ -247,37 +227,17 @@ async function instantiateWasmClient(url: string): Promise { allocate_sprite_pool: wasm.instance.exports.allocate_sprite_pool as () => number, reset_sprite_pool: wasm.instance.exports.reset_sprite_pool as (sprite_pool: number) => void, render_minimap: wasm.instance.exports.render_minimap as (display: number, scene: number, sprite_pool: number) => void, - push_sprite: wasm.instance.exports.push_sprite as (sprite_pool: number, image: number, x: number, y: number, z: number, scale: number, crop_position_x: number, crop_position_y: number, crop_size_x: number, crop_size_y: number) => void, allocate_particle_pool: wasm.instance.exports.allocate_particle_pool as () => number, - emit_particle: wasm.instance.exports.emit_particle as (source_x: number, source_y: number, source_z: number, particle_pool: number) => void, - verify_items_collected_batch_message: wasm.instance.exports.verify_items_collected_batch_message as (message: number) => boolean, - apply_items_collected_batch_message_to_level_items: wasm.instance.exports.apply_items_collected_batch_message_to_level_items as (message: number, items: number) => boolean, - verify_items_spawned_batch_message: wasm.instance.exports.verify_items_spawned_batch_message as (message: number) => boolean, - apply_items_spawned_batch_message_to_level_items: wasm.instance.exports.apply_items_spawned_batch_message_to_level_items as (message: number, items: number) => boolean, - render_items: wasm.instance.exports.render_items as (sprite_pool: number, items: number, time: number, key_image: number, bomb_image: number) => void, - verify_bombs_spawned_batch_message: wasm.instance.exports.verify_bombs_spawned_batch_message as (message: number) => boolean, - apply_bombs_spawned_batch_message_to_level_items: wasm.instance.exports.apply_bombs_spawned_batch_message_to_level_items as (message: number, bombs: number) => boolean, - verify_bombs_exploded_batch_message: wasm.instance.exports.verify_bombs_exploded_batch_message as (message: number) => boolean, - apply_bombs_exploded_batch_message_to_level_items: wasm.instance.exports.apply_bombs_exploded_batch_message_to_level_items as (message: number, bombs: number, particle_pool: number) => boolean, allocate_image: wasm.instance.exports.allocate_image as (width: number, height: number) => number, image_width: wasm.instance.exports.image_width as (image: number) => number, image_height: wasm.instance.exports.image_height as (image: number) => number, image_pixels: wasm.instance.exports.image_pixels as (image: number) => number, players_count: wasm.instance.exports.players_count as () => number, unregister_all_other_players: wasm.instance.exports.unregister_all_other_players as () => void, - verify_hello_message: wasm.instance.exports.verify_hello_message as (message: number) => number, - verify_players_joined_batch_message: wasm.instance.exports.verify_players_joined_batch_message as (message: number) => boolean, - apply_players_joined_batch_message: wasm.instance.exports.apply_players_joined_batch_message as (message: number) => void, - verify_players_left_batch_message: wasm.instance.exports.verify_players_left_batch_message as (message: number) => boolean, - apply_players_left_batch_message: wasm.instance.exports.apply_players_left_batch_message as (message: number) => void, - verify_players_moving_batch_message: wasm.instance.exports.verify_players_moving_batch_message as (message: number) => boolean, - apply_players_moving_batch_message: wasm.instance.exports.apply_players_moving_batch_message as (message: number) => boolean, key_down: wasm.instance.exports.key_down as (key_code: number) => void, key_up: wasm.instance.exports.key_up as (key_code: number) => void, render_game: wasm.instance.exports.render_game as (display: number, zbuffer: number, sprite_pool: number, particle_pool: number, scene: number, items: number, bombs: number, key_image: number, bomb_image: number, particle_image: number, wall_image: number, player_image: number, delta_time: number, time: number) => void, ping_server_if_needed: wasm.instance.exports.ping_server_if_needed as () => void, - verify_pong_message: wasm.instance.exports.verify_pong_message as (message: number) => boolean, - process_pong_message: wasm.instance.exports.process_pong_message as (message: number) => void, ping_msecs: wasm.instance.exports.ping_msecs as () => number, process_message: wasm.instance.exports.process_message as (message: number) => boolean, }; diff --git a/client.wasm b/client.wasm index 5acb0e7ae15700204d1af82d90fed698e0a54183..cf4542c6d48fe02ed461acb07658d6bd29dc2e9c 100755 GIT binary patch delta 3376 zcmZ`*dvp}l8J}-vvpf4D!y}K~B%9d{3B-^G0SN&D1Ooy^L3uwXlik^5VPBcqB_x6g zeE`RbfEOJFN<|dZ_O!KgS`-x$i71MXdJq-60jjp>sns41?ZNb5zuDa+;L(4+d%y4g zzSo_5=lh{Sb*oL zLZ{p9CiQd`bHd;vG5U9%>;|b_@I~6fRGB5#B1hVUrbwuX8fVn)@hDYpm8Gyxl7(h5 zBvBPv(LlIaP$YRHngV_yEJ;4eM^##q_K+fZ6{;#TDo4DMq6i@rVzWezw?~6wyCf@u zHxduWsOtQ9SeBXtN{lQuW;rKhi@{*TE5;~zP)uC6ZXLASxiSow^G z-13Gc{qE~0pWrT%4z>g_huGb7OZ)qs)(|yyfTrvdV#~=+mxSt*LxPWUQS} z=cM#<4XK1H+dLZ6JM6y4<#*T#MscnaQo5- zEB73^xV97?C+2mX+Ns1l9Zx6Ocsg? zmVZjb^0oRVUmkRmBU=igTRXkw1`9ppwQYN#M_ay~W^h>bz$gZKNo1!3UL*OtD#;5w zry%C)&W5~Ry%3KLzk{Lv8(7anJd$HT3laC7gZIg#{cbp;t=M1a!qA&uY{HJ)*LUupi7VYFzE5)9t@Z`zQ&Pk7~5s)-=kCQGG)wTG`4&1OQUhG+Frun=SgkH z%XpA=9s-FILWcXqFWljOr@X*Uo>U0$d>BL@A!r z#}XYzxU7x*td7Rvp13kmfB14JGD$xJ59 zL?v@!CgWI|;u6P3X29tYjvEd`SbrUDR&OvMg<}bIj=Uos#ZFo8uHa9Cya&yb-NSX!(B$dKNwe93Tp;H=bccM&5um0@u*LK zHIt8`TfHq0ip-t?C@D2m*^4HpkzzC&B%;Bk{xc6U&7(^P;!Vy64-~7b^I@X7WK7yh zre*NvF@u+to@JWH~1N2*apJ5{$yh zL%bomm9@9fiz!KVQ8#r6lq46^zRxY{ewQ_ZDJi{+b zQoY((2>CEe#b3B%{v9Kfn6Dxbsffg5LO70%`NIuaX`4S75o3a1j)Vj;+&()$ZJra6 zLt-o@$rVX}KdH`9FBO85zB5-93n9BaCeIz2h6ln!G3J>CA?^!oj0GmlX9XdI^eZso zC+Z9y3S0}Uf{+Xt3;6tZ+0zPAI8^U;s55!Uz6;A(Xv3Ajrg&KK`D1}agPMZcJ(+q= zEUu*j%a%4p@70q;e3)c0H&A^bC{-wuv|)*w;321T>F}EuyupYfEi?L)sDcyER7-tb>H6_L#IP!{02$ysK|<%myPP9Zg9^Mjfz(cHiet?Jxn#_#c5D!k+DA?PQ}zzN=@~x z_20}co7L-XD4<(h>M9SoAfVQGzzyrwl^*;FY*62J+rMMa$4dYDueT#TE>Pj`;mV}h2a%?J1#ls?p8Fk9to-P9oS#(FbK)nT{ ep6kA$)nNlUHtT)o!WQ*6#kd*wtM3#;*Z%>$s*WH4 delta 4866 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 GtoR@5*}Rtk diff --git a/server.c3 b/server.c3 index 78084f5..26500f7 100644 --- a/server.c3 +++ b/server.c3 @@ -180,7 +180,7 @@ fn String display_time_interval(uint diffSecs) { return result_count == 0 ? "0 secs" : string::join_new(&result, " ", allocator::temp()); } -fn void stats_print_per_n_ticks(int n) @extern("stats_print_per_n_ticks") @wasm { +fn void stats_print_per_n_ticks(int n) { if (stats[StatEntry.TICKS_COUNT].counter.value%n == 0) { io::printn("Stats:"); foreach (&stat: stats) { @@ -189,7 +189,7 @@ fn void stats_print_per_n_ticks(int n) @extern("stats_print_per_n_ticks") @wasm } } -fn void stats_push_sample(StatEntry entry, float sample) @extern("stats_push_sample") @wasm { +fn void stats_push_sample(StatEntry entry, float sample) { assert(entry < StatEntry.COUNT); Stat *stat = &stats[entry]; assert(stat.kind == StatKind.AVERAGE); @@ -207,7 +207,7 @@ fn void stats_inc_counter(StatEntry entry, int delta) @extern("stats_inc_counter List() collected_items; -fn void collect_items_by_player_at(float player_position_x, float player_position_y, Item[] *items) @extern("collect_items_by_player_at") @wasm { +fn void collect_items_by_player_at(float player_position_x, float player_position_y, Item[] *items) { foreach (item_index, item: *items) { if (item.alive) { if (common::collect_item(player_position_x, player_position_y, items, item_index)) { @@ -217,7 +217,7 @@ fn void collect_items_by_player_at(float player_position_x, float player_positio } } -fn ItemsCollectedBatchMessage *collected_items_as_batch_message(Item[]* items) @extern("collected_items_as_batch_message") @wasm { +fn ItemsCollectedBatchMessage *collected_items_as_batch_message(Item[]* items) { if (collected_items.size == 0) return null; int size = ItemsCollectedBatchMessage.sizeof + int.sizeof*collected_items.size; ItemsCollectedBatchMessage *message = mem::tcalloc(size); @@ -234,14 +234,14 @@ fn ItemsCollectedBatchMessage *collected_items_as_batch_message(Item[]* items) @ List() thrown_bombs; -fn void throw_bomb_on_server_side(uint player_id, Bombs *bombs) @extern("throw_bomb_on_server_side") @wasm { +fn void throw_bomb_on_server_side(uint player_id, Bombs *bombs) { if (try player = players.get(player_id)) { int index = common::throw_bomb(player.player.position.x, player.player.position.y, player.player.direction, bombs); if (index >= 0) thrown_bombs.push(index); } } -fn BombsSpawnedBatchMessage *thrown_bombs_as_batch_message(Bombs *bombs) @extern("thrown_bombs_as_batch_message") @wasm { +fn BombsSpawnedBatchMessage *thrown_bombs_as_batch_message(Bombs *bombs) { if (thrown_bombs.size == 0) return null; int size = BombsSpawnedBatchMessage.sizeof + BombSpawned.sizeof*thrown_bombs.size; BombsSpawnedBatchMessage *message = mem::tcalloc(size); @@ -265,7 +265,7 @@ fn BombsSpawnedBatchMessage *thrown_bombs_as_batch_message(Bombs *bombs) @extern List() exploded_bombs; -fn void update_bombs_on_server_side(Scene *scene, float delta_time, Bombs *bombs) @extern("update_bombs_on_server_side") @wasm { +fn void update_bombs_on_server_side(Scene *scene, float delta_time, Bombs *bombs) { foreach (bombIndex, &bomb: *bombs) { if (bomb.lifetime > 0) { common::update_bomb(bomb, scene, delta_time); @@ -276,7 +276,7 @@ fn void update_bombs_on_server_side(Scene *scene, float delta_time, Bombs *bombs } } -fn BombsExplodedBatchMessage* exploded_bombs_as_batch_message(Bombs* bombs) @extern("exploded_bombs_as_batch_message") @wasm { +fn BombsExplodedBatchMessage* exploded_bombs_as_batch_message(Bombs* bombs) { if (exploded_bombs.size == 0) return null; int size = BombsExplodedBatchMessage.sizeof + BombExploded.sizeof*exploded_bombs.size; BombsExplodedBatchMessage *message = mem::tcalloc(size); @@ -334,7 +334,7 @@ fn void unregister_player(uint id) @extern("unregister_player") @wasm { players.remove(id); } -fn PlayersJoinedBatchMessage *all_players_as_joined_batch_message() @extern("all_players_as_joined_batch_message") @wasm { +fn PlayersJoinedBatchMessage *all_players_as_joined_batch_message() { if (players.is_empty()) return null; int size = PlayersJoinedBatchMessage.sizeof + PlayerStruct.sizeof*players.len(); PlayersJoinedBatchMessage *message = mem::tcalloc(size); @@ -397,7 +397,7 @@ fn PlayersLeftBatchMessage *left_players_as_batch_message() { return message; } -fn void process_joined_players(Item[]* items) @extern("process_joined_players") @wasm { +fn void process_joined_players(Item[]* items) { if (joined_ids.is_empty()) return; // Initialize joined players @@ -449,7 +449,7 @@ fn void process_joined_players(Item[]* items) @extern("process_joined_players") } } -fn void process_left_players() @extern("process_left_players") @wasm { +fn void process_left_players() { // Notifying about whom left if (left_ids.is_empty()) return; PlayersLeftBatchMessage *players_left_batch_message = left_players_as_batch_message(); @@ -458,7 +458,7 @@ fn void process_left_players() @extern("process_left_players") @wasm { }; } -fn void process_moving_players() @extern("process_moving_players") @wasm { +fn void process_moving_players() { int count = 0; players.@each_entry(; PlayerOnServerEntry* entry) { if (entry.value.new_moving != entry.value.player.moving) { @@ -489,7 +489,7 @@ fn void process_moving_players() @extern("process_moving_players") @wasm { }; } -fn void process_thrown_bombs(Bombs *bombs) @extern("process_thrown_bombs") @wasm { +fn void process_thrown_bombs(Bombs *bombs) { // Notifying about thrown bombs BombsSpawnedBatchMessage *bombs_spawned_batch_message = thrown_bombs_as_batch_message(bombs); if (bombs_spawned_batch_message != null) { @@ -499,7 +499,7 @@ fn void process_thrown_bombs(Bombs *bombs) @extern("process_thrown_bombs") @wasm } } -fn void process_world_simulation(Item[] *items, Scene *scene, Bombs *bombs, float delta_time) @extern("process_world_simulation") @wasm { +fn void process_world_simulation(Item[] *items, Scene *scene, Bombs *bombs, float delta_time) { // Simulating the world for one server tick. players.@each_entry(; PlayerOnServerEntry* entry) { common::update_player(&entry.value.player, scene, delta_time); @@ -522,7 +522,7 @@ fn void process_world_simulation(Item[] *items, Scene *scene, Bombs *bombs, floa } } -fn void process_pings() @extern("process_pings") @wasm { +fn void process_pings() { // Sending out pings ping_ids.@each_entry(; PingEntry *entry) { uint id = entry.key; @@ -537,7 +537,7 @@ fn void process_pings() @extern("process_pings") @wasm { }; } -fn void player_update_moving(uint id, AmmaMovingMessage *message) @extern("player_update_moving") @wasm { +fn void player_update_moving(uint id, AmmaMovingMessage *message) { if (try value = players.get_ref(id)) { if (message.start) { value.new_moving |= (1<<(uint)message.direction); @@ -547,31 +547,31 @@ fn void player_update_moving(uint id, AmmaMovingMessage *message) @extern("playe } } -fn void schedule_ping_for_player(uint id, PingMessage *message) @extern("schedule_ping_for_player") @wasm { +fn void schedule_ping_for_player(uint id, PingMessage *message) { ping_ids.set(id, message.timestamp); } -fn void clear_intermediate_ids() @extern("clear_intermediate_ids") @wasm { +fn void clear_intermediate_ids() { joined_ids.clear(); left_ids.clear(); ping_ids.clear(); } -fn bool verify_ping_message(Message *message) @extern("verify_ping_message") @wasm { +fn bool verify_ping_message(Message *message) { if (message.size != PingMessage.sizeof) return false; PingMessage* ping_message = (PingMessage*)message; if (ping_message.kind != PING) return false; return true; } -fn bool verify_amma_throwing_message(Message *message) @extern("verify_amma_throwing_message") @wasm { +fn bool verify_amma_throwing_message(Message *message) { if (message.size != AmmaThrowingMessage.sizeof) return false; AmmaThrowingMessage* amma_throwing_message = (AmmaThrowingMessage*)message; if (amma_throwing_message.kind != AMMA_THROWING) return false; return true; } -fn bool verify_amma_moving_message(Message *message) @extern("verify_amma_moving_message") @wasm { +fn bool verify_amma_moving_message(Message *message) { if (message.size != AmmaMovingMessage.sizeof) return false; AmmaMovingMessage* amma_moving_message = (AmmaMovingMessage*)message; if (amma_moving_message.kind != AMMA_MOVING) return false; diff --git a/server.mjs b/server.mjs index 274c6f6..98de978 100644 --- a/server.mjs +++ b/server.mjs @@ -121,31 +121,10 @@ async function instantiateWasmServer(path) { return { ...wasmCommon, stats_inc_counter: wasm.instance.exports.stats_inc_counter, - stats_push_sample: wasm.instance.exports.stats_push_sample, - stats_print_per_n_ticks: wasm.instance.exports.stats_print_per_n_ticks, reconstruct_state_of_items: wasm.instance.exports.reconstruct_state_of_items, - collect_items_by_player_at: wasm.instance.exports.collect_items_by_player_at, - collected_items_as_batch_message: wasm.instance.exports.collected_items_as_batch_message, throw_bomb: wasm.instance.exports.throw_bomb, - throw_bomb_on_server_side: wasm.instance.exports.throw_bomb_on_server_side, - thrown_bombs_as_batch_message: wasm.instance.exports.thrown_bombs_as_batch_message, - update_bombs_on_server_side: wasm.instance.exports.update_bombs_on_server_side, - exploded_bombs_as_batch_message: wasm.instance.exports.exploded_bombs_as_batch_message, register_new_player: wasm.instance.exports.register_new_player, unregister_player: wasm.instance.exports.unregister_player, - all_players_as_joined_batch_message: wasm.instance.exports.all_players_as_joined_batch_message, - process_joined_players: wasm.instance.exports.process_joined_players, - process_left_players: wasm.instance.exports.process_left_players, - process_moving_players: wasm.instance.exports.process_moving_players, - player_update_moving: wasm.instance.exports.player_update_moving, - process_thrown_bombs: wasm.instance.exports.process_thrown_bombs, - process_world_simulation: wasm.instance.exports.process_world_simulation, - process_pings: wasm.instance.exports.process_pings, - schedule_ping_for_player: wasm.instance.exports.schedule_ping_for_player, - clear_intermediate_ids: wasm.instance.exports.clear_intermediate_ids, - verify_ping_message: wasm.instance.exports.verify_ping_message, - verify_amma_throwing_message: wasm.instance.exports.verify_amma_throwing_message, - verify_amma_moving_message: wasm.instance.exports.verify_amma_moving_message, process_message_on_server: wasm.instance.exports.process_message_on_server, tick: wasm.instance.exports.tick, }; diff --git a/server.mts b/server.mts index f2c346a..85a5a17 100644 --- a/server.mts +++ b/server.mts @@ -110,31 +110,10 @@ function tick() { interface WasmServer extends common.WasmCommon { stats_inc_counter: (entry: number, delta: number) => void, - stats_push_sample: (entry: number, sample: number) => void, - stats_print_per_n_ticks: (n: number) => void, reconstruct_state_of_items: (items: number) => number, - collect_items_by_player_at: (player_position_x: number, player_position_y: number, items: number) => void, - collected_items_as_batch_message: (items: number) => number, throw_bomb: (player_position_x: number, player_position_y: number, player_direction: number, bombs: number) => number, - throw_bomb_on_server_side: (player_id: number, bombs: number) => number, - thrown_bombs_as_batch_message: (bombs: number) => number, - update_bombs_on_server_side: (scene: number, delta_time: number, bombs: number) => void, - exploded_bombs_as_batch_message: (bombs: number) => number, register_new_player: (id: number, x: number, y: number, hue: number) => void, unregister_player: (id: number) => void, - all_players_as_joined_batch_message: () => number, - process_joined_players: (items: number) => void, - process_left_players: () => void, - process_moving_players: () => void, - player_update_moving: (id: number, message: number) => void, - process_thrown_bombs: (bombs: number) => void, - process_world_simulation: (items: number, scene: number, bombs: number, delta_time: number) => void, - process_pings: () => void, - schedule_ping_for_player: (id: number, message: number) => void, - clear_intermediate_ids: () => void, - verify_ping_message: (message: number) => boolean, - verify_amma_throwing_message: (message: number) => boolean, - verify_amma_moving_message: (message: number) => boolean, process_message_on_server: (id: number, message: number, bombs: number) => boolean, tick: (items: number, bombs: number, scene: number) => number, } @@ -175,31 +154,10 @@ async function instantiateWasmServer(path: string): Promise { return { ...wasmCommon, stats_inc_counter: wasm.instance.exports.stats_inc_counter as (entry: number) => void, - stats_push_sample: wasm.instance.exports.stats_push_sample as (entry: number, sample: number) => void, - stats_print_per_n_ticks: wasm.instance.exports.stats_print_per_n_ticks as (n: number) => void, reconstruct_state_of_items: wasm.instance.exports.reconstruct_state_of_items as (items: number) => number, - collect_items_by_player_at: wasm.instance.exports.collect_items_by_player_at as (player_position_x: number, player_position_y: number, items: number) => void, - collected_items_as_batch_message: wasm.instance.exports.collected_items_as_batch_message as (items: number) => number, throw_bomb: wasm.instance.exports.throw_bomb as (player_position_x: number, player_position_y: number, player_direction: number, bombs: number) => number, - throw_bomb_on_server_side: wasm.instance.exports.throw_bomb_on_server_side as (player_id: number, bombs: number) => number, - thrown_bombs_as_batch_message: wasm.instance.exports.thrown_bombs_as_batch_message as (bombs: number) => number, - update_bombs_on_server_side: wasm.instance.exports.update_bombs_on_server_side as (scene: number, delta_time: number, bombs: number) => void, - exploded_bombs_as_batch_message: wasm.instance.exports.exploded_bombs_as_batch_message as (bombs: number) => number, register_new_player: wasm.instance.exports.register_new_player as (id: number, x: number, y: number, hue: number) => void, unregister_player: wasm.instance.exports.unregister_player as (id: number) => void, - all_players_as_joined_batch_message: wasm.instance.exports.all_players_as_joined_batch_message as () => number, - process_joined_players: wasm.instance.exports.process_joined_players as (items: number) => void, - process_left_players: wasm.instance.exports.process_left_players as () => void, - process_moving_players: wasm.instance.exports.process_moving_players as () => void, - player_update_moving: wasm.instance.exports.player_update_moving as (id: number, message: number) => void, - process_thrown_bombs: wasm.instance.exports.process_thrown_bombs as (bombs: number) => void, - process_world_simulation: wasm.instance.exports.process_world_simulation as (items: number, scene: number, bombs: number, delta_time: number) => void, - process_pings: wasm.instance.exports.process_pings as () => void, - schedule_ping_for_player: wasm.instance.exports.schedule_ping_for_player as (id: number, timestamp: number) => void, - clear_intermediate_ids: wasm.instance.exports.clear_intermediate_ids as () => void, - verify_ping_message: wasm.instance.exports.verify_ping_message as (message: number) => boolean, - verify_amma_throwing_message: wasm.instance.exports.verify_amma_throwing_message as (message: number) => boolean, - verify_amma_moving_message: wasm.instance.exports.verify_amma_moving_message as (message: number) => boolean, process_message_on_server: wasm.instance.exports.process_message_on_server as (id: number, message: number, bombs: number) => boolean, tick: wasm.instance.exports.tick as (items: number, bombs: number, scene: number) => number, }; diff --git a/server.wasm b/server.wasm index 1927af9cbfaa1e9da1d1a123f9fa97f49be5ca13..267e30efc544535ab762974a0131523ea083854a 100755 GIT binary patch delta 4123 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 delta 5593 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