(module ;; Handwritten Wasm engine, ABI v3. Header 0..63, immutable stats at 512. ;; Towers retain their v1 layout at 12288, effects at 24576. ;; Balloons: 4096 slots * 64 bytes at 65536. No host simulation imports. (memory (export "memory") 40 40) (data (i32.const 393216) "\c8\00\00\00\8c\00\00\00\c8\00\00\00\40\01\00\00\00\00\00\00\00\00\00\00\64\00\00\00\be\00\00\00\c2\01\00\00\00\00\00\00\00\00\00\00\5a\00\00\00\c8\00\00\00\3f\02\00\00\00\00\00\00\00\00\00\00\04\01\00\00\96\00\00\00\dc\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\64\00\00\00\e1\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\96\00\00\00\96\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\77\01\00\00\fa\00\00\00\8a\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\fa\00\00\00\90\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\c8\00\00\00\2c\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\90\01\00\00\96\00\00\00\5e\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\c8\00\00\00\2c\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\96\00\00\00\c8\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\c4\09\00\00\d0\07\00\00\c4\09\00\00\00\00\00\00\00\00\00\00\00\00\00\00\dc\05\00\00\6c\07\00\00\00\00\00\00\00\00\00\00\00\00\00\00\b8\0b\00\00\b0\04\00\00\00\00\00\00\00\00\00\00\00\00\00\00\90\01\00\00\5e\01\00\00\5e\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\fa\00\00\00\90\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\2c\01\00\00\c2\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00") (data (i32.const 512) "\01\00\00\00\00\00\80\3f\ff\ff\ff\ff\00\00\00\00\ff\ff\ff\ff\00\00\00\00\01\00\00\00\0c\00\00\00\01\00\00\00\33\33\b3\3f\00\00\00\00\01\00\00\00\ff\ff\ff\ff\00\00\00\00\02\00\00\00\0c\00\00\00\01\00\00\00\66\66\e6\3f\01\00\00\00\01\00\00\00\ff\ff\ff\ff\00\00\00\00\03\00\00\00\0c\00\00\00\01\00\00\00\cd\cc\4c\40\02\00\00\00\01\00\00\00\ff\ff\ff\ff\00\00\00\00\04\00\00\00\0c\00\00\00\01\00\00\00\00\00\60\40\03\00\00\00\01\00\00\00\ff\ff\ff\ff\00\00\00\00\05\00\00\00\0c\00\00\00\01\00\00\00\66\66\e6\3f\04\00\00\00\02\00\00\00\ff\ff\ff\ff\00\00\00\00\06\00\00\00\0a\00\00\00\01\00\00\00\00\00\00\40\04\00\00\00\02\00\00\00\ff\ff\ff\ff\00\00\00\00\06\00\00\00\0a\00\00\00\01\00\00\00\00\00\40\40\04\00\00\00\02\00\00\00\ff\ff\ff\ff\00\00\00\00\06\00\00\00\0c\00\00\00\01\00\00\00\00\00\80\3f\05\00\00\00\02\00\00\00\ff\ff\ff\ff\00\00\00\00\07\00\00\00\0c\00\00\00\01\00\00\00\66\66\e6\3f\05\00\00\00\01\00\00\00\06\00\00\00\01\00\00\00\07\00\00\00\0c\00\00\00\01\00\00\00\cd\cc\0c\40\09\00\00\00\02\00\00\00\ff\ff\ff\ff\00\00\00\00\08\00\00\00\0c\00\00\00\0a\00\00\00\00\00\20\40\0a\00\00\00\02\00\00\00\ff\ff\ff\ff\00\00\00\00\09\00\00\00\0f\00\00\00\c8\00\00\00\00\00\80\3f\0b\00\00\00\04\00\00\00\ff\ff\ff\ff\00\00\00\00\0a\00\00\00\1c\00\00\00\bc\02\00\00\00\00\80\3e\0c\00\00\00\04\00\00\00\ff\ff\ff\ff\00\00\00\00\0b\00\00\00\24\00\00\00\a0\0f\00\00\ec\51\38\3e\0d\00\00\00\04\00\00\00\ff\ff\ff\ff\00\00\00\00\0c\00\00\00\2a\00\00\00\90\01\00\00\00\00\30\40\0b\00\00\00\04\00\00\00\ff\ff\ff\ff\00\00\00\00\0d\00\00\00\1c\00\00\00\20\4e\00\00\ec\51\38\3e\0e\00\00\00\02\00\00\00\0f\00\00\00\03\00\00\00\0e\00\00\00\34\00\00\00") (data (i32.const 327680) "\00\00\00\00\00\00\00\00\00\02\05\00\01\00\00\00\18\02\05\00\01\00\00\00\30\02\05\00\03\00\00\00\78\02\05\00\03\00\00\00\c0\02\05\00\03\00\00\00\08\03\05\00\03\00\00\00\50\03\05\00\04\00\00\00\b0\03\05\00\04\00\00\00\10\04\05\00\01\00\00\00\28\04\05\00\03\00\00\00\70\04\05\00\04\00\00\00\d0\04\05\00\03\00\00\00\18\05\05\00\02\00\00\00\48\05\05\00\08\00\00\00\08\06\05\00\05\00\00\00\80\06\05\00\03\00\00\00\c8\06\05\00\01\00\00\00\e0\06\05\00\02\00\00\00\10\07\05\00\04\00\00\00\70\07\05\00\01\00\00\00\88\07\05\00\03\00\00\00\d0\07\05\00\01\00\00\00\e8\07\05\00\02\00\00\00\18\08\05\00\02\00\00\00\48\08\05\00\02\00\00\00\78\08\05\00\02\00\00\00\a8\08\05\00\04\00\00\00\08\09\05\00\01\00\00\00\20\09\05\00\02\00\00\00\50\09\05\00\01\00\00\00\68\09\05\00\04\00\00\00\c8\09\05\00\03\00\00\00\10\0a\05\00\02\00\00\00\40\0a\05\00\02\00\00\00\70\0a\05\00\04\00\00\00\d0\0a\05\00\05\00\00\00\48\0b\05\00\05\00\00\00\c0\0b\05\00\05\00\00\00\38\0c\05\00\05\00\00\00\b0\0c\05\00\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\14\00\00\00\00\00\00\00\1b\04\00\00\00\00\00\00\00\00\00\00\00\00\00\00\23\00\00\00\00\00\00\00\74\04\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0a\00\00\00\00\00\00\00\32\01\00\00\00\00\00\00\01\00\00\00\00\00\00\00\05\00\00\00\56\01\00\00\dd\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0f\00\00\00\47\02\00\00\eb\03\00\00\00\00\00\00\00\00\00\00\00\00\00\00\19\00\00\00\00\00\00\00\d0\02\00\00\00\00\00\00\01\00\00\00\00\00\00\00\12\00\00\00\da\01\00\00\70\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0a\00\00\00\67\03\00\00\0f\04\00\00\00\00\00\00\01\00\00\00\00\00\00\00\0c\00\00\00\00\00\00\00\34\01\00\00\00\00\00\00\00\00\00\00\00\00\00\00\05\00\00\00\56\01\00\00\df\01\00\00\00\00\00\00\01\00\00\00\00\00\00\00\0f\00\00\00\04\02\00\00\de\03\00\00\00\00\00\00\02\00\00\00\00\00\00\00\04\00\00\00\00\00\00\00\67\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0f\00\00\00\40\01\00\00\6c\02\00\00\00\00\00\00\01\00\00\00\00\00\00\00\0f\00\00\00\88\02\00\00\62\04\00\00\00\00\00\00\01\00\00\00\00\00\00\00\0a\00\00\00\00\00\00\00\34\01\00\00\00\00\00\00\02\00\00\00\00\00\00\00\05\00\00\00\56\01\00\00\7f\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\14\00\00\00\c5\02\00\00\4f\05\00\00\00\00\00\00\01\00\00\00\00\00\00\00\0a\00\00\00\59\05\00\00\48\06\00\00\00\00\00\00\01\00\00\00\00\00\00\00\14\00\00\00\00\00\00\00\8a\02\00\00\00\00\00\00\02\00\00\00\00\00\00\00\02\00\00\00\ad\02\00\00\cf\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0a\00\00\00\4a\03\00\00\c0\03\00\00\00\00\00\00\02\00\00\00\00\00\00\00\0c\00\00\00\48\04\00\00\c4\06\00\00\00\00\00\00\02\00\00\00\00\00\00\00\1e\00\00\00\00\00\00\00\71\04\00\00\00\00\00\00\01\00\00\00\00\00\00\00\3c\00\00\00\00\00\00\00\34\08\00\00\00\00\00\00\01\00\00\00\00\00\00\00\14\00\00\00\34\08\00\00\50\0a\00\00\00\00\00\00\01\00\00\00\00\00\00\00\16\00\00\00\50\0a\00\00\3f\0b\00\00\00\00\00\00\03\00\00\00\00\00\00\00\03\00\00\00\00\00\00\00\3c\00\00\00\00\00\00\00\02\00\00\00\00\00\00\00\0c\00\00\00\0c\01\00\00\85\02\00\00\00\00\00\00\01\00\00\00\00\00\00\00\0a\00\00\00\8c\02\00\00\70\03\00\00\00\00\00\00\00\00\00\00\00\00\00\00\0a\00\00\00\6b\03\00\00\7e\04\00\00\00\00\00\00\02\00\00\00\00\00\00\00\0a\00\00\00\00\00\00\00\34\01\00\00\00\00\00\00\01\00\00\00\00\00\00\00\0f\00\00\00\56\01\00\00\c2\02\00\00\00\00\00\00\03\00\00\00\00\00\00\00\05\00\00\00\58\03\00\00\13\04\00\00\00\00\00\00\01\00\00\00\00\00\00\00\32\00\00\00\00\00\00\00\08\07\00\00\00\00\00\00\02\00\00\00\00\00\00\00\17\00\00\00\85\00\00\00\8d\07\00\00\00\00\00\00\00\00\00\00\00\00\00\00\12\00\00\00\00\00\00\00\46\02\00\00\00\00\00\00\00\00\00\00\00\00\00\00\1f\00\00\00\3a\02\00\00\3e\06\00\00\00\00\00\00\01\00\00\00\00\00\00\00\05\00\00\00\ab\00\00\00\ee\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\0a\00\00\00\be\03\00\00\10\04\00\00\00\00\00\00\02\00\00\00\00\00\00\00\05\00\00\00\57\01\00\00\9a\01\00\00\00\00\00\00\02\00\00\00\00\00\00\00\05\00\00\00\a6\04\00\00\f9\04\00\00\00\00\00\00\03\00\00\00\00\00\00\00\04\00\00\00\02\02\00\00\3b\02\00\00\00\00\00\00\03\00\00\00\00\00\00\00\05\00\00\00\8e\05\00\00\ec\05\00\00\00\00\00\00\00\00\00\00\00\00\00\00\14\00\00\00\00\00\00\00\dc\05\00\00\00\00\00\00\04\00\00\00\00\00\00\00\05\00\00\00\1d\04\00\00\d1\04\00\00\00\00\00\00\02\00\00\00\00\00\00\00\0c\00\00\00\55\01\00\00\d9\04\00\00\00\00\00\00\03\00\00\00\00\00\00\00\0a\00\00\00\14\02\00\00\e4\04\00\00\00\00\00\00\01\00\00\00\00\00\00\00\0f\00\00\00\a7\00\00\00\57\05\00\00\00\00\00\00\02\00\00\00\00\00\00\00\14\00\00\00\00\00\00\00\8b\02\00\00\00\00\00\00\03\00\00\00\00\00\00\00\08\00\00\00\6b\03\00\00\c1\03\00\00\00\00\00\00\02\00\00\00\00\00\00\00\14\00\00\00\0c\00\00\00\97\02\00\00\00\00\00\00\03\00\00\00\02\00\00\00\0c\00\00\00\00\00\00\00\2c\01\00\00\00\00\00\00\02\00\00\00\00\00\00\00\3c\00\00\00\00\00\00\00\dc\05\00\00\00\00\00\00\02\00\00\00\00\00\00\00\14\00\00\00\dc\05\00\00\49\06\00\00\00\00\00\00\02\00\00\00\00\00\00\00\0a\00\00\00\00\00\00\00\ad\00\00\00\00\00\00\00\03\00\00\00\02\00\00\00\05\00\00\00\ab\00\00\00\37\01\00\00\00\00\00\00\04\00\00\00\00\00\00\00\0f\00\00\00\66\01\00\00\2f\03\00\00\00\00\00\00\03\00\00\00\00\00\00\00\04\00\00\00\29\03\00\00\b2\03\00\00\00\00\00\00\05\00\00\00\00\00\00\00\06\00\00\00\00\00\00\00\3b\01\00\00\00\00\00\00\04\00\00\00\00\00\00\00\0a\00\00\00\8a\02\00\00\bf\03\00\00\00\00\00\00\04\00\00\00\00\00\00\00\04\00\00\00\e9\03\00\00\3f\04\00\00\00\00\00\00\03\00\00\00\00\00\00\00\28\00\00\00\05\00\00\00\5d\02\00\00\00\00\00\00\06\00\00\00\00\00\00\00\10\00\00\00\00\00\00\00\e0\01\00\00\00\00\00\00\05\00\00\00\00\00\00\00\07\00\00\00\00\00\00\00\96\00\00\00\00\00\00\00\06\00\00\00\00\00\00\00\07\00\00\00\21\01\00\00\99\01\00\00\00\00\00\00\02\00\00\00\01\00\00\00\01\00\00\00\00\00\00\00\3c\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\14\00\00\00\b4\00\00\00\1c\02\00\00\00\00\00\00\03\00\00\00\02\00\00\00\19\00\00\00\00\00\00\00\48\03\00\00\00\00\00\00\07\00\00\00\00\00\00\00\0a\00\00\00\04\04\00\00\f4\04\00\00\00\00\00\00\04\00\00\00\00\00\00\00\17\00\00\00\00\00\00\00\0a\02\00\00\00\00\00\00\09\00\00\00\00\00\00\00\04\00\00\00\99\02\00\00\67\03\00\00\00\00\00\00\03\00\00\00\00\00\00\00\2d\00\00\00\38\06\00\00\07\08\00\00\00\00\00\00\02\00\00\00\00\00\00\00\2d\00\00\00\77\04\00\00\30\06\00\00\00\00\00\00\01\00\00\00\00\00\00\00\3c\00\00\00\b4\02\00\00\94\04\00\00\00\00\00\00\00\00\00\00\00\00\00\00\64\00\00\00\01\00\00\00\d1\02\00\00\00\00\00\00\08\00\00\00\00\00\00\00\06\00\00\00\00\00\00\00\2c\01\00\00\00\00\00\00\03\00\00\00\00\00\00\00\32\00\00\00\00\00\00\00\94\02\00\00\00\00\00\00\03\00\00\00\02\00\00\00\0f\00\00\00\fd\02\00\00\93\03\00\00\00\00\00\00\08\00\00\00\00\00\00\00\09\00\00\00\00\00\00\00\10\03\00\00\00\00\00\00\09\00\00\00\00\00\00\00\08\00\00\00\72\01\00\00\a3\02\00\00\00\00\00\00\09\00\00\00\02\00\00\00\02\00\00\00\54\03\00\00\bb\03\00\00\00\00\00\00\05\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00\31\01\00\00\00\00\00\00\06\00\00\00\00\00\00\00\08\00\00\00\15\00\00\00\46\01\00\00\00\00\00\00\05\00\00\00\00\00\00\00\0f\00\00\00\00\00\00\00\1c\02\00\00\00\00\00\00\06\00\00\00\00\00\00\00\14\00\00\00\6c\02\00\00\00\05\00\00\00\00\00\00\07\00\00\00\00\00\00\00\0a\00\00\00\26\05\00\00\8e\06\00\00\00\00\00\00\03\00\00\00\01\00\00\00\0d\00\00\00\40\01\00\00\f0\05\00\00\00\00\00\00\00\00\00\00\01\00\00\00\14\00\00\00\00\00\00\00\2c\01\00\00\00\00\00\00\03\00\00\00\00\00\00\00\a0\00\00\00\00\00\00\00\70\08\00\00\00\00\00\00\09\00\00\00\00\00\00\00\06\00\00\00\05\02\00\00\42\06\00\00\00\00\00\00\06\00\00\00\00\00\00\00\19\00\00\00\00\00\00\00\5a\02\00\00\00\00\00\00\0a\00\00\00\00\00\00\00\05\00\00\00\5d\03\00\00\e6\03\00\00\00\00\00\00\04\00\00\00\00\00\00\00\23\00\00\00\81\04\00\00\24\06\00\00\00\00\00\00\05\00\00\00\00\00\00\00\1e\00\00\00\46\06\00\00\e9\07\00\00\00\00\00\00\04\00\00\00\00\00\00\00\28\00\00\00\00\00\00\00\5b\00\00\00\00\00\00\00\04\00\00\00\00\00\00\00\28\00\00\00\fd\01\00\00\4e\02\00\00\00\00\00\00\04\00\00\00\00\00\00\00\3c\00\00\00\fb\03\00\00\eb\04\00\00\00\00\00\00\02\00\00\00\03\00\00\00\0a\00\00\00\f1\00\00\00\41\01\00\00\00\00\00\00\02\00\00\00\03\00\00\00\0a\00\00\00\f8\02\00\00\49\03\00\00\00\00\00\00\05\00\00\00\00\00\00\00\19\00\00\00\00\00\00\00\8b\02\00\00\00\00\00\00\06\00\00\00\00\00\00\00\19\00\00\00\ad\02\00\00\38\05\00\00\00\00\00\00\08\00\00\00\00\00\00\00\0f\00\00\00\5a\05\00\00\3a\07\00\00\00\00\00\00\09\00\00\00\00\00\00\00\0a\00\00\00\5c\07\00\00\91\08\00\00\00\00\00\00\06\00\00\00\01\00\00\00\07\00\00\00\d3\09\00\00\33\0a\00\00\00\00\00\00\06\00\00\00\00\00\00\00\11\00\00\00\00\00\00\00\d8\00\00\00\00\00\00\00\08\00\00\00\00\00\00\00\0e\00\00\00\22\01\00\00\24\03\00\00\00\00\00\00\09\00\00\00\00\00\00\00\0a\00\00\00\d5\02\00\00\4e\04\00\00\00\00\00\00\0b\00\00\00\00\00\00\00\02\00\00\00\58\06\00\00\d0\06\00\00\00\00\00\00\04\00\00\00\00\00\00\00\2a\00\00\00\78\00\00\00\f5\05\00\00\00\00\00\00\05\00\00\00\00\00\00\00\0a\00\00\00\00\00\00\00\34\01\00\00\00\00\00\00\06\00\00\00\00\00\00\00\0a\00\00\00\57\01\00\00\8b\02\00\00\00\00\00\00\0a\00\00\00\02\00\00\00\02\00\00\00\6c\08\00\00\e4\08\00\00\00\00\00\00\09\00\00\00\00\00\00\00\14\00\00\00\ff\02\00\00\8a\05\00\00\00\00\00\00\0a\00\00\00\00\00\00\00\12\00\00\00\cf\05\00\00\16\08\00\00\00\00\00\00\0c\00\00\00\00\00\00\00\01\00\00\00\00\00\00\00\3c\00\00\00\00\00\00\00") (global $groupStart (mut i32) (i32.const 0)) (global $groupCount (mut i32) (i32.const 0)) (global $event (mut i32) (i32.const 0)) (global $end (mut i32) (i32.const 65536)) (global $attack (mut i32) (i32.const 0)) (global $reserved (mut i32) (i32.const 0)) (global $alloc (mut i32) (i32.const 65536)) (func $add (param $p i32) (param $n i32) (i32.store (local.get $p) (i32.add (i32.load (local.get $p)) (local.get $n)))) (func $sq (param $x f32) (result f32) (f32.mul (local.get $x) (local.get $x))) (func $dist (param $x f32) (param $y f32) (param $a f32) (param $b f32) (result f32) (f32.add (call $sq (f32.sub (local.get $x) (local.get $a))) (call $sq (f32.sub (local.get $y) (local.get $b))))) (func $stat (param $type i32) (result i32) (i32.add (i32.const 512) (i32.mul (local.get $type) (i32.const 32)))) (func $health (export "health") (param $type i32) (param $flags i32) (result i32) (local $hp i32) (if (i32.gt_u (local.get $type) (i32.const 16)) (then (return (i32.const 0)))) (local.set $hp (i32.load (call $stat (local.get $type)))) (if (i32.and (local.get $flags) (i32.const 4)) (then (if (i32.eq (local.get $type) (i32.const 8)) (then (return (i32.const 4)))) (if (i32.ge_u (local.get $type) (i32.const 11)) (then (local.set $hp (i32.mul (local.get $hp) (i32.const 2))))))) (local.get $hp)) (func $flags (param $type i32) (param $flags i32) (result i32) (local.set $flags (i32.and (local.get $flags) (i32.const 7))) (if (i32.and (i32.ne (local.get $type) (i32.const 8)) (i32.lt_u (local.get $type) (i32.const 11))) (then (local.set $flags (i32.and (local.get $flags) (i32.const 3))))) (if (i32.ge_u (local.get $type) (i32.const 12)) (then (local.set $flags (i32.and (local.get $flags) (i32.const 5))))) (if (i32.eq (local.get $type) (i32.const 15)) (then (local.set $flags (i32.or (local.get $flags) (i32.const 1))))) (local.get $flags)) (func $child_flags (param $type i32) (param $flags i32) (result i32) (if (i32.eq (local.get $type) (i32.const 15)) (then (return (i32.or (local.get $flags) (i32.const 2))))) (if (i32.lt_u (local.get $type) (i32.const 12)) (then (local.set $flags (i32.and (local.get $flags) (i32.const 3))))) (local.get $flags)) (func $rbe (export "rbe") (param $type i32) (param $flags i32) (result i32) (local $s i32) (local $n i32) (local $f i32) (if (i32.gt_u (local.get $type) (i32.const 16)) (then (return (i32.const 0)))) (local.set $s (call $stat (local.get $type))) (local.set $f (call $child_flags (local.get $type) (local.get $flags))) (local.set $n (call $health (local.get $type) (local.get $flags))) (if (i32.load offset=12 (local.get $s)) (then (local.set $n (i32.add (local.get $n) (i32.mul (i32.load offset=12 (local.get $s)) (call $rbe (i32.load offset=8 (local.get $s)) (local.get $f))))))) (if (i32.load offset=20 (local.get $s)) (then (local.set $n (i32.add (local.get $n) (i32.mul (i32.load offset=20 (local.get $s)) (call $rbe (i32.load offset=16 (local.get $s)) (local.get $f))))))) (local.get $n)) (func (export "pool_end") (result i32) (global.get $end)) ;; Track length 1783. Return x or y at distance d. (func $pos (export "position") (param $d f32) (param $axis i32) (result f32) (if (f32.lt (local.get $d) (f32.const 164)) (then (return (select (f32.const 110) (f32.sub (local.get $d) (f32.const 24)) (local.get $axis))))) (if (f32.lt (local.get $d) (f32.const 334)) (then (return (select (f32.sub (local.get $d) (f32.const 54)) (f32.const 140) (local.get $axis))))) (if (f32.lt (local.get $d) (f32.const 524)) (then (return (select (f32.const 280) (f32.sub (local.get $d) (f32.const 194)) (local.get $axis))))) (if (f32.lt (local.get $d) (f32.const 704)) (then (return (select (f32.sub (f32.const 804) (local.get $d)) (f32.const 330) (local.get $axis))))) (if (f32.lt (local.get $d) (f32.const 894)) (then (return (select (f32.const 100) (f32.sub (local.get $d) (f32.const 374)) (local.get $axis))))) (if (f32.lt (local.get $d) (f32.const 1164)) (then (return (select (f32.sub (local.get $d) (f32.const 794)) (f32.const 520) (local.get $axis))))) (if (f32.lt (local.get $d) (f32.const 1354)) (then (return (select (f32.const 370) (f32.sub (local.get $d) (f32.const 644)) (local.get $axis))))) (if (f32.lt (local.get $d) (f32.const 1509)) (then (return (select (f32.sub (f32.const 1724) (local.get $d)) (f32.const 710) (local.get $axis))))) (select (f32.const 215) (f32.sub (local.get $d) (f32.const 799)) (local.get $axis))) (func (export "reset") (param $sandbox i32) (memory.fill (i32.const 0) (i32.const 0) (i32.const 512)) (memory.fill (i32.const 2048) (i32.const 0) (i32.const 325632)) (call $reset_projectiles) (i32.store (i32.const 32) (i32.ne (local.get $sandbox) (i32.const 0))) (i32.store (i32.const 0) (select (i32.const 999999) (i32.const 650) (local.get $sandbox))) (i32.store (i32.const 4) (select (i32.const 999999) (i32.const 150) (local.get $sandbox))) (global.set $event (i32.const 0)) (global.set $end (i32.const 65536)) (global.set $alloc (i32.const 65536)) (global.set $attack (i32.const 0)) (global.set $reserved (i32.const 0))) ;; Tower metadata: tiers 0/4/8, caltrop timer 24, freeze duration 32, ;; splash radius 40, damage kind 44, detection 48, shot count 52, pierce 56, ;; f32 reload 60, f32 projectile speed 64, lifetime 68, f32 range 72, ;; powers 76, damage 80, ceramic bonus 84, MOAB bonus 88, visual 92. (data (i32.const 394240) "\00\00\80\3f\00\00\00\00\f3\04\35\3f\f3\04\35\3f\32\31\8d\24\00\00\80\3f\f3\04\35\bf\f3\04\35\3f\00\00\80\bf\32\31\0d\25\f3\04\35\bf\f3\04\35\bf\ca\c9\53\a5\00\00\80\bf\f3\04\35\3f\f3\04\35\bf\00\00\80\3f\00\00\00\00\bd\1b\4f\3f\18\79\16\3f\7a\37\9e\3e\71\78\73\3f\7a\37\9e\be\71\78\73\3f\bd\1b\4f\bf\18\79\16\3f\00\00\80\bf\32\31\0d\25\bd\1b\4f\bf\18\79\16\bf\7a\37\9e\be\71\78\73\bf\7a\37\9e\3e\71\78\73\bf\bd\1b\4f\3f\18\79\16\bf\00\00\80\3f\00\00\00\00\d7\b3\5d\3f\00\00\00\3f\00\00\00\3f\d7\b3\5d\3f\32\31\8d\24\00\00\80\3f\00\00\00\bf\d7\b3\5d\3f\d7\b3\5d\bf\00\00\00\3f\00\00\80\bf\32\31\0d\25\d7\b3\5d\bf\00\00\00\bf\00\00\00\bf\d7\b3\5d\bf\ca\c9\53\a5\00\00\80\bf\00\00\00\3f\d7\b3\5d\bf\d7\b3\5d\3f\00\00\00\bf") (func $tx (param $t i32) (result i32) (i32.add (i32.const 860160) (i32.mul (i32.div_u (i32.sub (local.get $t) (i32.const 12288)) (i32.const 48)) (i32.const 128)))) (func $tier (export "tier") (param $id i32) (param $path i32) (result i32) (local $t i32) (local.set $t (call $tower (local.get $id))) (if (i32.or (i32.eqz (local.get $t)) (i32.gt_u (local.get $path) (i32.const 2))) (then (return (i32.const 0)))) (if (i32.eqz (i32.load (local.get $t))) (then (return (i32.const 0)))) (i32.load (i32.add (call $tx (local.get $t)) (i32.mul (local.get $path) (i32.const 4))))) (func $cost (export "cost") (param $type i32) (result i32) (if (i32.gt_u (local.get $type) (i32.const 5)) (then (return (i32.const 0)))) (i32.load (i32.add (i32.const 393216) (i32.mul (local.get $type) (i32.const 64))))) (func $range (export "range") (param $type i32) (result f32) (if (i32.eqz (local.get $type)) (then (return (f32.const 80)))) (if (i32.eq (local.get $type) (i32.const 1)) (then (return (f32.const 57.5)))) (if (i32.eq (local.get $type) (i32.const 3)) (then (return (f32.const 50)))) (if (i32.eq (local.get $type) (i32.const 4)) (then (return (f32.const 150)))) (f32.const 100)) (func (export "tower_range") (param $id i32) (result f32) (local $t i32) (local.set $t (call $tower (local.get $id))) (if (i32.eqz (local.get $t)) (then (return (f32.const 0)))) (f32.load offset=72 (call $tx (local.get $t)))) (func $configure (param $t i32) (local $m i32) (local $type i32) (local $a i32) (local $b i32) (local $c i32) (local $range f32) (local $delay f32) (local $power i32) (local.set $m (call $tx (local.get $t))) (local.set $type (i32.load offset=12 (local.get $t))) (local.set $a (i32.load (local.get $m))) (local.set $b (i32.load offset=4 (local.get $m))) (local.set $c (i32.load offset=8 (local.get $m))) (memory.fill (i32.add (local.get $m) (i32.const 32)) (i32.const 0) (i32.const 96)) (i32.store offset=32 (local.get $m) (i32.const 90)) (i32.store offset=52 (local.get $m) (i32.const 1)) (i32.store offset=56 (local.get $m) (i32.const 2)) (i32.store offset=68 (local.get $m) (i32.const 30)) (i32.store offset=80 (local.get $m) (i32.const 1)) (f32.store offset=64 (local.get $m) (f32.const 12.5)) (local.set $range (call $range (local.get $type))) (local.set $delay (f32.const 57)) (if (i32.eqz (local.get $type)) (then (i32.store offset=56 (local.get $m) (i32.add (i32.const 2) (select (i32.const 3) (local.get $a) (i32.ge_u (local.get $a) (i32.const 2))))) (if (local.get $b) (then (local.set $delay (f32.mul (local.get $delay) (select (f32.const 0.6375) (f32.const 0.85) (i32.ge_u (local.get $b) (i32.const 2))))))) (if (local.get $c) (then (local.set $range (f32.const 100)))) (if (i32.ge_u (local.get $c) (i32.const 2)) (then (local.set $range (f32.const 120)) (i32.store offset=48 (local.get $m) (i32.const 1)) (f32.store offset=64 (local.get $m) (f32.const 15.625)))) (if (i32.eq (local.get $a) (i32.const 3)) (then (i32.store offset=56 (local.get $m) (i32.const 22)) (i32.store offset=68 (local.get $m) (i32.const 100)) (i32.store offset=80 (local.get $m) (i32.const 2)) (i32.store offset=84 (local.get $m) (i32.const 1)) (i32.store offset=92 (local.get $m) (i32.const 6)) (f32.store offset=64 (local.get $m) (f32.const 8)) (local.set $delay (f32.mul (f32.const 69) (select (f32.const 0.6375) (select (f32.const 0.85) (f32.const 1) (local.get $b)) (i32.ge_u (local.get $b) (i32.const 2))))))) (if (i32.eq (local.get $b) (i32.const 3)) (then (i32.store offset=52 (local.get $m) (i32.const 3)) (local.set $delay (f32.mul (local.get $delay) (f32.const 0.75))))) (if (i32.eq (local.get $c) (i32.const 3)) (then (i32.store offset=80 (local.get $m) (i32.const 3)) (i32.store offset=56 (local.get $m) (i32.add (i32.const 4) (select (i32.const 8) (select (i32.const 3) (i32.const 0) (local.get $a)) (i32.eq (local.get $a) (i32.const 2))))) (local.set $range (f32.const 150)) (i32.store offset=92 (local.get $m) (i32.const 7)) (f32.store offset=64 (local.get $m) (f32.const 18.75)))))) (if (i32.eq (local.get $type) (i32.const 1)) (then (local.set $delay (f32.mul (f32.const 67.2) (select (f32.const 0.5625) (select (f32.const 0.75) (f32.const 1) (local.get $a)) (i32.eq (local.get $a) (i32.const 2))))) (local.set $range (f32.add (local.get $range) (f32.mul (f32.convert_i32_s (local.get $b)) (f32.const 10)))) (i32.store offset=52 (local.get $m) (i32.add (i32.const 8) (i32.mul (local.get $c) (i32.const 2)))) (i32.store offset=56 (local.get $m) (select (i32.const 4) (i32.const 1) (i32.eq (local.get $b) (i32.const 2)))) (i32.store offset=68 (local.get $m) (i32.const 8)) (f32.store offset=64 (local.get $m) (select (f32.const 13) (f32.const 10) (local.get $b))) (i32.store offset=92 (local.get $m) (i32.const 1)))) (if (i32.eq (local.get $type) (i32.const 2)) (then (local.set $delay (f32.mul (f32.const 90) (select (f32.const 0.5625) (select (f32.const 0.75) (f32.const 1) (local.get $b)) (i32.eq (local.get $b) (i32.const 2))))) (if (local.get $c) (then (local.set $range (f32.add (local.get $range) (f32.const 17.5))))) (f32.store offset=40 (local.get $m) (select (f32.const 45) (f32.const 30) (local.get $a))) (i32.store offset=56 (local.get $m) (i32.add (i32.const 14) (select (i32.const 16) (select (i32.const 6) (i32.const 0) (local.get $a)) (i32.eq (local.get $a) (i32.const 2))))) (i32.store offset=80 (local.get $m) (select (i32.const 2) (i32.const 1) (i32.eq (local.get $a) (i32.const 2)))) (i32.store offset=44 (local.get $m) (i32.const 1)) (i32.store offset=92 (local.get $m) (i32.const 2)) (f32.store offset=64 (local.get $m) (select (f32.const 12) (f32.const 7.5) (i32.eq (local.get $b) (i32.const 2)))) (if (i32.eq (local.get $c) (i32.const 2)) (then (local.set $power (i32.or (local.get $power) (i32.const 4100))))))) (if (i32.eq (local.get $type) (i32.const 3)) (then (local.set $delay (f32.const 144)) (i32.store offset=44 (local.get $m) (i32.const 2)) (i32.store offset=56 (local.get $m) (select (i32.const 40) (i32.const 30) (local.get $b))) (if (local.get $b) (then (i32.store offset=32 (local.get $m) (i32.const 132)))) (if (local.get $a) (then (local.set $power (i32.or (local.get $power) (i32.const 64))))) (if (i32.eq (local.get $a) (i32.const 2)) (then (local.set $power (i32.or (local.get $power) (i32.const 1))) (i32.store offset=48 (local.get $m) (i32.const 1)))) (if (i32.eq (local.get $b) (i32.const 2)) (then (local.set $power (i32.or (local.get $power) (i32.const 128))))) (if (local.get $c) (then (local.set $range (f32.add (local.get $range) (f32.const 17.5))))) (if (i32.eq (local.get $c) (i32.const 2)) (then (local.set $power (i32.or (local.get $power) (i32.const 16))))))) (if (i32.eq (local.get $type) (i32.const 4)) (then (local.set $delay (select (f32.const 1.8) (f32.const 3.6) (i32.eq (local.get $a) (i32.const 2)))) (i32.store offset=56 (local.get $m) (i32.add (i32.add (i32.const 1) (local.get $a)) (select (i32.const 1) (i32.const 0) (i32.eq (local.get $b) (i32.const 2))))) (if (local.get $a) (then (i32.store offset=44 (local.get $m) (select (i32.const 5) (i32.const 3) (i32.eq (local.get $a) (i32.const 2)))) (i32.store offset=92 (local.get $m) (select (i32.const 9) (i32.const 8) (i32.eq (local.get $a) (i32.const 2)))))) (local.set $range (f32.add (local.get $range) (select (f32.const 75) (select (f32.const 30) (f32.const 0) (local.get $b)) (i32.eq (local.get $b) (i32.const 2))))) (if (local.get $c) (then (local.set $power (i32.or (local.get $power) (i32.const 512))))) (if (i32.eq (local.get $c) (i32.const 2)) (then (local.set $range (f32.add (local.get $range) (f32.const 7.5))) (i32.store offset=48 (local.get $m) (i32.const 1)) (local.set $power (i32.or (local.get $power) (i32.const 65536))))) (if (i32.eqz (local.get $a)) (then (i32.store offset=92 (local.get $m) (i32.const 4)))))) (if (i32.eq (local.get $type) (i32.const 5)) (then (local.set $delay (select (f32.const 25.2) (f32.const 42) (local.get $a))) (i32.store offset=48 (local.get $m) (i32.const 1)) (i32.store offset=56 (local.get $m) (select (i32.const 4) (i32.const 2) (i32.eq (local.get $a) (i32.const 2)))) (i32.store offset=92 (local.get $m) (i32.const 5)) (if (local.get $b) (then (local.set $power (i32.or (local.get $power) (i32.const 1024))))) (if (i32.eq (local.get $b) (i32.const 2)) (then (local.set $power (i32.or (local.get $power) (i32.const 32))))) (if (local.get $c) (then (local.set $range (f32.add (local.get $range) (f32.const 17.5))) (local.set $power (i32.or (local.get $power) (i32.const 2048))))))) (f32.store offset=60 (local.get $m) (local.get $delay)) (f32.store offset=72 (local.get $m) (local.get $range)) (i32.store offset=76 (local.get $m) (local.get $power)) (i32.store offset=16 (local.get $t) (i32.add (i32.add (local.get $a) (local.get $b)) (local.get $c)))) (func $upgrade_cost (export "upgrade_cost") (param $id i32) (param $path i32) (result i32) (local $t i32) (local $m i32) (local $level i32) (local $j i32) (local $used i32) (local $other i32) (local.set $t (call $tower (local.get $id))) (if (i32.or (i32.eqz (local.get $t)) (i32.gt_u (local.get $path) (i32.const 2))) (then (return (i32.const 0)))) (if (i32.eqz (i32.load (local.get $t))) (then (return (i32.const 0)))) (local.set $m (call $tx (local.get $t))) (local.set $level (i32.load (i32.add (local.get $m) (i32.mul (local.get $path) (i32.const 4))))) (if (i32.ge_u (local.get $level) (select (i32.const 3) (i32.const 2) (i32.eqz (i32.load offset=12 (local.get $t))))) (then (return (i32.const 0)))) (loop $paths (if (i32.load (i32.add (local.get $m) (i32.mul (local.get $j) (i32.const 4)))) (then (local.set $used (i32.add (local.get $used) (i32.const 1))))) (if (i32.and (i32.ne (local.get $j) (local.get $path)) (i32.ge_u (i32.load (i32.add (local.get $m) (i32.mul (local.get $j) (i32.const 4)))) (i32.const 3))) (then (local.set $other (i32.const 1)))) (local.set $j (i32.add (local.get $j) (i32.const 1))) (br_if $paths (i32.lt_u (local.get $j) (i32.const 3)))) (if (i32.or (i32.and (i32.eqz (local.get $level)) (i32.ge_u (local.get $used) (i32.const 2))) (i32.and (local.get $other) (i32.ge_u (local.get $level) (i32.const 2)))) (then (return (i32.const 0)))) (i32.load (i32.add (i32.add (i32.const 393220) (i32.mul (i32.load offset=12 (local.get $t)) (i32.const 64))) (i32.mul (i32.add (i32.mul (local.get $path) (i32.const 5)) (local.get $level)) (i32.const 4))))) (func (export "upgrade") (param $id i32) (param $path i32) (result i32) (local $t i32) (local $price i32) (local.set $price (call $upgrade_cost (local.get $id) (local.get $path))) (if (i32.or (i32.eqz (local.get $price)) (i32.or (i32.ge_u (i32.load (i32.const 12)) (i32.const 2)) (i32.lt_s (i32.load (i32.const 0)) (local.get $price)))) (then (return (i32.const 0)))) (local.set $t (call $tower (local.get $id))) (call $add (i32.add (call $tx (local.get $t)) (i32.mul (local.get $path) (i32.const 4))) (i32.const 1)) (call $add (i32.add (local.get $t) (i32.const 36)) (local.get $price)) (call $add (i32.const 0) (i32.sub (i32.const 0) (local.get $price))) (call $configure (local.get $t)) (i32.const 1)) (func $can_place (export "can_place") (param $x f32) (param $y f32) (result i32) (local $d f32) (local $t i32) (if (i32.or (f32.ne (local.get $x) (local.get $x)) (f32.ne (local.get $y) (local.get $y))) (then (return (i32.const 0)))) (if (i32.or (i32.or (f32.lt (local.get $x) (f32.const 24)) (f32.gt (local.get $x) (f32.const 936))) (i32.or (f32.lt (local.get $y) (f32.const 26)) (f32.gt (local.get $y) (f32.const 454)))) (then (return (i32.const 0)))) (loop $track (if (f32.lt (call $dist (local.get $x) (local.get $y) (call $pos (local.get $d) (i32.const 0)) (call $pos (local.get $d) (i32.const 1))) (f32.const 2304)) (then (return (i32.const 0)))) (local.set $d (f32.add (local.get $d) (f32.const 12))) (br_if $track (f32.le (local.get $d) (f32.const 1783)))) (local.set $t (i32.const 12288)) (loop $towers (if (i32.load (local.get $t)) (then (if (f32.lt (call $dist (local.get $x) (local.get $y) (f32.load offset=4 (local.get $t)) (f32.load offset=8 (local.get $t))) (f32.const 1936)) (then (return (i32.const 0)))))) (local.set $t (i32.add (local.get $t) (i32.const 48))) (br_if $towers (i32.lt_u (local.get $t) (i32.const 14592)))) (i32.const 1)) (func (export "place") (param $type i32) (param $x f32) (param $y f32) (result i32) (local $t i32) (local $price i32) (if (i32.or (i32.gt_u (local.get $type) (i32.const 5)) (i32.ge_u (i32.load (i32.const 12)) (i32.const 2))) (then (return (i32.const -1)))) (local.set $price (call $cost (local.get $type))) (if (i32.or (i32.lt_s (i32.load (i32.const 0)) (local.get $price)) (i32.eqz (call $can_place (local.get $x) (local.get $y)))) (then (return (i32.const -1)))) (local.set $t (i32.const 12288)) (loop $find (if (i32.eqz (i32.load (local.get $t))) (then (memory.fill (local.get $t) (i32.const 0) (i32.const 48)) (i32.store (local.get $t) (i32.const 1)) (f32.store offset=4 (local.get $t) (local.get $x)) (f32.store offset=8 (local.get $t) (local.get $y)) (i32.store offset=12 (local.get $t) (local.get $type)) (i32.store offset=36 (local.get $t) (local.get $price)) (memory.fill (call $tx (local.get $t)) (i32.const 0) (i32.const 128)) (global.set $towerSerial (i32.add (global.get $towerSerial) (i32.const 1))) (i32.store offset=44 (local.get $t) (global.get $towerSerial)) (call $configure (local.get $t)) (call $add (i32.const 0) (i32.sub (i32.const 0) (local.get $price))) (return (i32.div_u (i32.sub (local.get $t) (i32.const 12288)) (i32.const 48))))) (local.set $t (i32.add (local.get $t) (i32.const 48))) (br_if $find (i32.lt_u (local.get $t) (i32.const 14592)))) (i32.const -1)) (func $tower (param $id i32) (result i32) (if (i32.ge_u (local.get $id) (i32.const 48)) (then (return (i32.const 0)))) (i32.add (i32.const 12288) (i32.mul (local.get $id) (i32.const 48)))) (func (export "sell") (param $id i32) (result i32) (local $t i32) (local $cash i32) (local.set $t (call $tower (local.get $id))) (if (i32.eqz (local.get $t)) (then (return (i32.const 0)))) (if (i32.or (i32.eqz (i32.load (local.get $t))) (i32.ge_u (i32.load (i32.const 12)) (i32.const 2))) (then (return (i32.const 0)))) (local.set $cash (i32.div_u (i32.mul (i32.load offset=36 (local.get $t)) (i32.const 7)) (i32.const 10))) (call $add (i32.const 0) (local.get $cash)) (i32.store (local.get $t) (i32.const 0)) (local.get $cash)) ;; Spatial grid, collision, persistent projectiles and per-projectile hit histories. ;; A 256-byte bitmap per balloon stores 2048 projectile slots. Children inherit it. ;; Reusing a projectile slot clears its bit across live balloons, avoiding stale hits. (global $towerSerial (mut i32) (i32.const 0)) (global $balloonSerial (mut i32) (i32.const 0)) (global $pEnd (mut i32) (i32.const 917504)) (global $pAlloc (mut i32) (i32.const 917504)) (global $gridReady (mut i32) (i32.const 0)) (global $gridCount (mut i32) (i32.const 0)) (global $gridOverflow (mut i32) (i32.const 0)) (global $collisionTime (mut f32) (f32.const 2)) (global $damagePower (mut i32) (i32.const 0)) (global $freezeTicks (mut i32) (i32.const 90)) (global $rng (mut i32) (i32.const 1831565813)) (func $bm (param $b i32) (result i32) (i32.add (i32.const 524288) (i32.mul (i32.div_u (i32.sub (local.get $b) (i32.const 65536)) (i32.const 64)) (i32.const 32)))) (func $bits (param $b i32) (result i32) (i32.add (i32.const 1310720) (i32.mul (i32.div_u (i32.sub (local.get $b) (i32.const 65536)) (i32.const 64)) (i32.const 256)))) (func $balloon_speed (param $b i32) (result f32) (local $speed f32) (local $m i32) (if (i32.gt_s (i32.load offset=24 (local.get $b)) (i32.const 0)) (then (return (f32.const 0)))) (local.set $m (call $bm (local.get $b))) (local.set $speed (f32.mul (f32.const 1.05) (f32.load offset=4 (call $stat (i32.load offset=20 (local.get $b)))))) (if (i32.load offset=4 (local.get $m)) (then (local.set $speed (f32.mul (local.get $speed) (f32.const 0.5))))) (if (i32.gt_s (i32.load offset=12 (local.get $m)) (i32.const 0)) (then (local.set $speed (f32.neg (local.get $speed))))) (if (i32.gt_s (i32.load offset=16 (local.get $m)) (i32.const 0)) (then (local.set $speed (f32.mul (local.get $speed) (f32.const 0.7))))) (local.get $speed)) (func $random (result f32) (global.set $rng (i32.xor (global.get $rng) (i32.shl (global.get $rng) (i32.const 13)))) (global.set $rng (i32.xor (global.get $rng) (i32.shr_u (global.get $rng) (i32.const 17)))) (global.set $rng (i32.xor (global.get $rng) (i32.shl (global.get $rng) (i32.const 5)))) (f32.div (f32.convert_i32_u (global.get $rng)) (f32.const 4294967296))) (func $clear_projectiles (memory.fill (i32.const 917504) (i32.const 0) (i32.const 196608)) (memory.fill (i32.const 1310720) (i32.const 0) (i32.const 1048576)) (memory.fill (i32.const 655360) (i32.const 0) (i32.const 512)) (global.set $pEnd (i32.const 917504)) (global.set $pAlloc (i32.const 917504)) (global.set $gridReady (i32.const 0)) (global.set $gridCount (i32.const 0)) (global.set $gridOverflow (i32.const 0)) (i32.store (i32.const 48) (i32.const 0)) (i32.store (i32.const 44) (i32.const 0))) (func $reset_projectiles (memory.fill (i32.const 524288) (i32.const 0) (i32.const 2097152)) (call $clear_projectiles) (global.set $towerSerial (i32.const 0)) (global.set $balloonSerial (i32.const 0)) (global.set $rng (i32.const 1831565813)) (global.set $damagePower (i32.const 0)) (global.set $freezeTicks (i32.const 90))) (func (export "projectile_end") (result i32) (global.get $pEnd)) (func $born (param $b i32) (param $parent i32) (local $m i32) (local $pm i32) (local $perma i32) (local $soak i32) (local $time i32) (local $power i32) (local.set $m (call $bm (local.get $b))) (if (local.get $parent) (then (local.set $pm (call $bm (local.get $parent))) (if (i32.lt_u (i32.load offset=20 (local.get $parent)) (i32.const 12)) (then (local.set $perma (i32.load offset=4 (local.get $pm))) (local.set $soak (i32.load offset=8 (local.get $pm))) (local.set $power (i32.load offset=24 (local.get $pm))) (if (local.get $soak) (then (local.set $time (i32.load offset=24 (local.get $parent))))))) (if (i32.ne (local.get $parent) (local.get $b)) (then (memory.copy (call $bits (local.get $b)) (call $bits (local.get $parent)) (i32.const 256))))) (else (memory.fill (call $bits (local.get $b)) (i32.const 0) (i32.const 256)))) (memory.fill (local.get $m) (i32.const 0) (i32.const 32)) (global.set $balloonSerial (i32.add (global.get $balloonSerial) (i32.const 1))) (i32.store (local.get $m) (global.get $balloonSerial)) (i32.store offset=4 (local.get $m) (local.get $perma)) (i32.store offset=8 (local.get $m) (select (i32.sub (local.get $soak) (i32.const 1)) (i32.const 0) (local.get $soak))) (i32.store offset=20 (local.get $m) (local.get $time)) (i32.store offset=24 (local.get $m) (local.get $power))) (func $grid_cell (param $x f32) (param $y f32) (result i32) (i32.add (i32.trunc_f32_s (f32.min (f32.const 15) (f32.max (f32.const 0) (f32.floor (f32.div (local.get $x) (f32.const 64)))))) (i32.mul (i32.trunc_f32_s (f32.min (f32.const 7) (f32.max (f32.const 0) (f32.floor (f32.div (local.get $y) (f32.const 64)))))) (i32.const 16)))) (func $grid_insert (param $b i32) (local $head i32) (local $node i32) (if (i32.or (f32.lt (f32.load offset=8 (local.get $b)) (f32.const -80)) (f32.gt (f32.load offset=8 (local.get $b)) (f32.const 1040))) (then (return))) (if (i32.ge_u (global.get $gridCount) (i32.const 16384)) (then (global.set $gridOverflow (i32.const 1)) (return))) (local.set $head (i32.add (i32.const 655360) (i32.mul (call $grid_cell (f32.load offset=8 (local.get $b)) (f32.load offset=12 (local.get $b))) (i32.const 4)))) (local.set $node (i32.add (i32.const 659456) (i32.mul (global.get $gridCount) (i32.const 12)))) (global.set $gridCount (i32.add (global.get $gridCount) (i32.const 1))) (i32.store (local.get $node) (local.get $b)) (i32.store offset=4 (local.get $node) (i32.load (call $bm (local.get $b)))) (i32.store offset=8 (local.get $node) (i32.load (local.get $head))) (i32.store (local.get $head) (local.get $node))) (func $build_grid (local $b i32) (global.set $gridReady (i32.const 0)) (global.set $gridCount (i32.const 0)) (global.set $gridOverflow (i32.const 0)) (memory.fill (i32.const 655360) (i32.const 0) (i32.const 512)) (local.set $b (i32.const 65536)) (block $empty (br_if $empty (i32.eq (global.get $end) (local.get $b))) (loop $items (if (i32.load (local.get $b)) (then (call $grid_insert (local.get $b)))) (local.set $b (i32.add (local.get $b) (i32.const 64))) (br_if $items (i32.lt_u (local.get $b) (global.get $end))))) (global.set $gridReady (i32.const 1))) (func $hit_address (param $p i32) (param $b i32) (result i32) (i32.add (call $bits (local.get $b)) (i32.mul (i32.shr_u (i32.div_u (i32.sub (local.get $p) (i32.const 917504)) (i32.const 96)) (i32.const 5)) (i32.const 4)))) (func $hit_mask (param $p i32) (result i32) (i32.shl (i32.const 1) (i32.and (i32.div_u (i32.sub (local.get $p) (i32.const 917504)) (i32.const 96)) (i32.const 31)))) (func $seen (param $p i32) (param $b i32) (result i32) (i32.and (i32.load (call $hit_address (local.get $p) (local.get $b))) (call $hit_mask (local.get $p)))) (func $mark (param $p i32) (param $b i32) (local $addr i32) (local.set $addr (call $hit_address (local.get $p) (local.get $b))) (i32.store (local.get $addr) (i32.or (i32.load (local.get $addr)) (call $hit_mask (local.get $p))))) (func $projectile (param $t i32) (param $x f32) (param $y f32) (param $vx f32) (param $vy f32) (param $target i32) (param $visual i32) (result i32) (local $p i32) (local $n i32) (local $b i32) (local $m i32) (local $addr i32) (local $mask i32) (local.set $p (global.get $pAlloc)) (loop $find (if (i32.load (local.get $p)) (then (local.set $p (i32.add (local.get $p) (i32.const 96))) (if (i32.ge_u (local.get $p) (i32.const 1114112)) (then (local.set $p (i32.const 917504)))) (local.set $n (i32.add (local.get $n) (i32.const 1))) (br_if $find (i32.lt_u (local.get $n) (i32.const 2048)))))) (if (i32.load (local.get $p)) (then (i32.store (i32.const 48) (i32.const 1)) (return (i32.const 0)))) (local.set $mask (i32.xor (call $hit_mask (local.get $p)) (i32.const -1))) (local.set $b (i32.const 65536)) (block $empty (br_if $empty (i32.eq (global.get $end) (local.get $b))) (loop $clear (if (i32.load (local.get $b)) (then (local.set $addr (call $hit_address (local.get $p) (local.get $b))) (i32.store (local.get $addr) (i32.and (i32.load (local.get $addr)) (local.get $mask))))) (local.set $b (i32.add (local.get $b) (i32.const 64))) (br_if $clear (i32.lt_u (local.get $b) (global.get $end))))) (local.set $m (call $tx (local.get $t))) (memory.fill (local.get $p) (i32.const 0) (i32.const 96)) (i32.store (local.get $p) (i32.const 1)) (f32.store offset=4 (local.get $p) (local.get $x)) (f32.store offset=8 (local.get $p) (local.get $y)) (f32.store offset=12 (local.get $p) (local.get $vx)) (f32.store offset=16 (local.get $p) (local.get $vy)) (i32.store offset=20 (local.get $p) (i32.load offset=68 (local.get $m))) (i32.store offset=24 (local.get $p) (i32.load offset=56 (local.get $m))) (i32.store offset=28 (local.get $p) (i32.load offset=80 (local.get $m))) (i32.store offset=32 (local.get $p) (i32.load offset=44 (local.get $m))) (i32.store offset=36 (local.get $p) (i32.load offset=48 (local.get $m))) (i32.store offset=40 (local.get $p) (local.get $t)) (i32.store offset=44 (local.get $p) (i32.load offset=44 (local.get $t))) (f32.store offset=48 (local.get $p) (select (f32.const 10) (f32.const 2.5) (i32.eq (local.get $visual) (i32.const 6)))) (i32.store offset=52 (local.get $p) (i32.load offset=76 (local.get $m))) (i32.store offset=60 (local.get $p) (local.get $target)) (if (local.get $target) (then (i32.store offset=64 (local.get $p) (i32.load (call $bm (local.get $target)))))) (f32.store offset=68 (local.get $p) (f32.load offset=64 (local.get $m))) (i32.store offset=72 (local.get $p) (i32.load offset=84 (local.get $m))) (i32.store offset=76 (local.get $p) (i32.load offset=88 (local.get $m))) (f32.store offset=80 (local.get $p) (f32.load offset=40 (local.get $m))) (i32.store offset=84 (local.get $p) (i32.load offset=32 (local.get $m))) (i32.store offset=92 (local.get $p) (local.get $visual)) (call $add (i32.const 44) (i32.const 1)) (global.set $pAlloc (i32.add (local.get $p) (i32.const 96))) (if (i32.gt_u (global.get $pAlloc) (global.get $pEnd)) (then (global.set $pEnd (global.get $pAlloc)))) (if (i32.ge_u (global.get $pAlloc) (i32.const 1114112)) (then (global.set $pAlloc (i32.const 917504)))) (local.get $p)) (func $retire (param $p i32) (if (i32.load (local.get $p)) (then (i32.store (local.get $p) (i32.const 0)) (call $add (i32.const 44) (i32.const -1))))) (func $intersection (param $p i32) (param $b i32) (param $x f32) (param $y f32) (param $dx f32) (param $dy f32) (result f32) (local $qx f32) (local $qy f32) (local $length f32) (local $dot f32) (local $c f32) (local $disc f32) (local $r f32) (if (i32.or (i32.eqz (i32.load (local.get $b))) (call $seen (local.get $p) (local.get $b))) (then (return (f32.const 2)))) (if (i32.and (i32.eqz (i32.load offset=36 (local.get $p))) (i32.and (i32.load offset=32 (local.get $b)) (i32.const 1))) (then (return (f32.const 2)))) (local.set $qx (f32.sub (local.get $x) (f32.load offset=8 (local.get $b)))) (local.set $qy (f32.sub (local.get $y) (f32.load offset=12 (local.get $b)))) (local.set $r (f32.add (f32.load offset=48 (local.get $p)) (f32.convert_i32_s (i32.load offset=28 (call $stat (i32.load offset=20 (local.get $b))))))) (local.set $c (f32.sub (f32.add (call $sq (local.get $qx)) (call $sq (local.get $qy))) (call $sq (local.get $r)))) (if (f32.le (local.get $c) (f32.const 0)) (then (return (f32.const 0)))) (local.set $length (f32.add (call $sq (local.get $dx)) (call $sq (local.get $dy)))) (if (f32.le (local.get $length) (f32.const 0.00001)) (then (return (f32.const 2)))) (local.set $dot (f32.add (f32.mul (local.get $qx) (local.get $dx)) (f32.mul (local.get $qy) (local.get $dy)))) (local.set $disc (f32.sub (call $sq (local.get $dot)) (f32.mul (local.get $length) (local.get $c)))) (if (f32.lt (local.get $disc) (f32.const 0)) (then (return (f32.const 2)))) (f32.div (f32.sub (f32.neg (local.get $dot)) (f32.sqrt (local.get $disc))) (local.get $length))) (func $collision (param $p i32) (param $x f32) (param $y f32) (param $dx f32) (param $dy f32) (result i32) (local $min i32) (local $max i32) (local $cx i32) (local $cy i32) (local $node i32) (local $b i32) (local $best i32) (local $time f32) (local $pad f32) (global.set $collisionTime (f32.const 2)) (if (global.get $gridOverflow) (then (local.set $b (i32.const 65536)) (block $empty (br_if $empty (i32.eq (global.get $end) (local.get $b))) (loop $all (local.set $time (call $intersection (local.get $p) (local.get $b) (local.get $x) (local.get $y) (local.get $dx) (local.get $dy))) (if (i32.and (f32.ge (local.get $time) (f32.const 0)) (f32.le (local.get $time) (f32.const 1))) (then (if (f32.lt (local.get $time) (global.get $collisionTime)) (then (global.set $collisionTime (local.get $time)) (local.set $best (local.get $b)))))) (local.set $b (i32.add (local.get $b) (i32.const 64))) (br_if $all (i32.lt_u (local.get $b) (global.get $end))))) (return (local.get $best)))) (local.set $pad (f32.add (f32.const 52) (f32.load offset=48 (local.get $p)))) (local.set $min (call $grid_cell (f32.sub (f32.min (local.get $x) (f32.add (local.get $x) (local.get $dx))) (local.get $pad)) (f32.sub (f32.min (local.get $y) (f32.add (local.get $y) (local.get $dy))) (local.get $pad)))) (local.set $max (call $grid_cell (f32.add (f32.max (local.get $x) (f32.add (local.get $x) (local.get $dx))) (local.get $pad)) (f32.add (f32.max (local.get $y) (f32.add (local.get $y) (local.get $dy))) (local.get $pad)))) (local.set $cy (i32.shr_u (local.get $min) (i32.const 4))) (loop $rows (local.set $cx (i32.and (local.get $min) (i32.const 15))) (loop $cols (local.set $node (i32.load (i32.add (i32.const 655360) (i32.mul (i32.add (local.get $cx) (i32.mul (local.get $cy) (i32.const 16))) (i32.const 4))))) (block $none (br_if $none (i32.eqz (local.get $node))) (loop $nodes (local.set $b (i32.load (local.get $node))) (if (i32.eq (i32.load offset=4 (local.get $node)) (i32.load (call $bm (local.get $b)))) (then (local.set $time (call $intersection (local.get $p) (local.get $b) (local.get $x) (local.get $y) (local.get $dx) (local.get $dy))) (if (i32.and (f32.ge (local.get $time) (f32.const 0)) (f32.le (local.get $time) (f32.const 1))) (then (if (f32.lt (local.get $time) (global.get $collisionTime)) (then (global.set $collisionTime (local.get $time)) (local.set $best (local.get $b)))))))) (local.set $node (i32.load offset=8 (local.get $node))) (br_if $nodes (local.get $node)))) (local.set $cx (i32.add (local.get $cx) (i32.const 1))) (br_if $cols (i32.le_u (local.get $cx) (i32.and (local.get $max) (i32.const 15))))) (local.set $cy (i32.add (local.get $cy) (i32.const 1))) (br_if $rows (i32.le_u (local.get $cy) (i32.shr_u (local.get $max) (i32.const 4))))) (local.get $best)) (func $slow_and_freeze (param $b i32) (param $kind i32) (local $m i32) (local $type i32) (local.set $m (call $bm (local.get $b))) (local.set $type (i32.load offset=20 (local.get $b))) (if (i32.eq (local.get $kind) (i32.const 2)) (then (i32.store offset=24 (local.get $b) (global.get $freezeTicks)) (i32.store offset=24 (local.get $m) (global.get $damagePower)) (i32.store offset=8 (local.get $m) (i32.ne (i32.and (global.get $damagePower) (i32.const 128)) (i32.const 0))) (if (i32.and (global.get $damagePower) (i32.const 64)) (then (i32.store offset=4 (local.get $m) (i32.const 1)))))) (if (i32.and (i32.lt_u (local.get $type) (i32.const 12)) (i32.ne (i32.and (global.get $damagePower) (i32.const 1024)) (i32.const 0))) (then (if (f32.lt (call $random) (f32.const 0.25)) (then (i32.store offset=12 (local.get $m) (i32.const 60)))))) (if (i32.and (i32.ne (local.get $type) (i32.const 16)) (i32.ne (i32.and (global.get $damagePower) (i32.const 512)) (i32.const 0))) (then (if (i32.lt_u (local.get $type) (i32.const 12)) (then (f32.store offset=4 (local.get $b) (f32.max (f32.const 0) (f32.sub (f32.load offset=4 (local.get $b)) (f32.const 7.5)))) (f32.store offset=8 (local.get $b) (call $pos (f32.load offset=4 (local.get $b)) (i32.const 0))) (f32.store offset=12 (local.get $b) (call $pos (f32.load offset=4 (local.get $b)) (i32.const 1))) (if (global.get $gridReady) (then (call $grid_insert (local.get $b))))) (else (i32.store offset=16 (local.get $m) (i32.const 60))))))) (func $impact (param $p i32) (param $b i32) (local $t i32) (local $damage i32) (local $type i32) (local $flags i32) (local.set $t (i32.load offset=40 (local.get $p))) (if (i32.or (i32.eqz (i32.load (local.get $t))) (i32.ne (i32.load offset=44 (local.get $t)) (i32.load offset=44 (local.get $p)))) (then (local.set $t (i32.const 0)))) (local.set $damage (i32.load offset=28 (local.get $p))) (local.set $type (i32.load offset=20 (local.get $b))) (local.set $flags (i32.load offset=32 (local.get $b))) (if (i32.eq (local.get $type) (i32.const 11)) (then (local.set $damage (i32.add (local.get $damage) (i32.load offset=72 (local.get $p)))))) (if (i32.ge_u (local.get $type) (i32.const 12)) (then (local.set $damage (i32.add (local.get $damage) (i32.load offset=76 (local.get $p)))))) (if (i32.and (i32.and (local.get $flags) (i32.const 1)) (i32.ne (i32.and (i32.load offset=52 (local.get $p)) (i32.const 65536)) (i32.const 0))) (then (local.set $damage (i32.add (local.get $damage) (i32.const 2))))) (if (i32.and (i32.load offset=52 (local.get $p)) (i32.const 32)) (then (i32.store offset=32 (local.get $b) (i32.and (local.get $flags) (i32.const 6))))) (global.set $damagePower (i32.load offset=52 (local.get $p))) (global.set $freezeTicks (i32.load offset=84 (local.get $p))) (call $hit (local.get $b) (local.get $damage) (local.get $t) (i32.load offset=32 (local.get $p)) (i32.load offset=36 (local.get $p)))) (func $effect (param $x f32) (param $y f32) (param $radius f32) (param $type i32) (local $e i32) (local.set $e (i32.add (i32.const 24576) (i32.mul (global.get $event) (i32.const 24)))) (global.set $event (i32.rem_u (i32.add (global.get $event) (i32.const 1)) (i32.const 256))) (f32.store (local.get $e) (local.get $x)) (f32.store offset=4 (local.get $e) (local.get $y)) (f32.store offset=8 (local.get $e) (local.get $radius)) (i32.store offset=16 (local.get $e) (i32.const 12)) (i32.store offset=20 (local.get $e) (local.get $type))) (func $explode (param $p i32) (local $b i32) (local $n i32) (global.set $attack (i32.add (global.get $attack) (i32.const 1))) (call $effect (f32.load offset=4 (local.get $p)) (f32.load offset=8 (local.get $p)) (f32.load offset=80 (local.get $p)) (select (i32.const 3) (i32.const 2) (i32.eq (i32.load offset=32 (local.get $p)) (i32.const 2)))) (local.set $b (i32.const 65536)) (block $empty (br_if $empty (i32.eq (global.get $end) (local.get $b))) (loop $blast (if (i32.and (i32.load (local.get $b)) (i32.eqz (call $seen (local.get $p) (local.get $b)))) (then (if (i32.and (i32.or (i32.load offset=36 (local.get $p)) (i32.eqz (i32.and (i32.load offset=32 (local.get $b)) (i32.const 1)))) (f32.le (call $dist (f32.load offset=4 (local.get $p)) (f32.load offset=8 (local.get $p)) (f32.load offset=8 (local.get $b)) (f32.load offset=12 (local.get $b))) (call $sq (f32.load offset=80 (local.get $p))))) (then (call $mark (local.get $p) (local.get $b)) (call $impact (local.get $p) (local.get $b)) (local.set $n (i32.add (local.get $n) (i32.const 1))))))) (local.set $b (i32.add (local.get $b) (i32.const 64))) (br_if $blast (i32.and (i32.lt_u (local.get $b) (global.get $end)) (i32.lt_u (local.get $n) (i32.load offset=24 (local.get $p)))))))) (func $fragments (param $p i32) (result i32) (local $n i32) (local $q i32) (local $vector i32) (if (i32.gt_u (i32.load (i32.const 44)) (i32.const 2040)) (then (return (i32.const 0)))) (loop $eight (local.set $vector (i32.add (i32.const 394240) (i32.mul (local.get $n) (i32.const 8)))) (local.set $q (call $projectile (i32.load offset=40 (local.get $p)) (f32.load offset=4 (local.get $p)) (f32.load offset=8 (local.get $p)) (f32.mul (f32.load (local.get $vector)) (f32.const 10)) (f32.mul (f32.load offset=4 (local.get $vector)) (f32.const 10)) (i32.const 0) (i32.const 11))) (i32.store offset=20 (local.get $q) (i32.const 15)) (i32.store offset=24 (local.get $q) (i32.const 1)) (i32.store offset=28 (local.get $q) (i32.const 1)) (i32.store offset=32 (local.get $q) (i32.const 0)) (i32.store offset=36 (local.get $q) (i32.load offset=36 (local.get $p))) (i32.store offset=44 (local.get $q) (i32.load offset=44 (local.get $p))) (f32.store offset=48 (local.get $q) (f32.const 2.5)) (i32.store offset=52 (local.get $q) (i32.const 0)) (i32.store offset=72 (local.get $q) (i32.const 0)) (i32.store offset=76 (local.get $q) (i32.const 0)) (f32.store offset=80 (local.get $q) (f32.const 0)) (local.set $n (i32.add (local.get $n) (i32.const 1))) (br_if $eight (i32.lt_u (local.get $n) (i32.const 8)))) (i32.const 1)) (func $homing (param $p i32) (local $b i32) (local $target i32) (local $best f32) (local $d f32) (local $vx f32) (local $vy f32) (local.set $best (f32.const 1000000)) (local.set $b (i32.const 65536)) (block $empty (br_if $empty (i32.eq (global.get $end) (local.get $b))) (loop $search (if (i32.and (i32.load (local.get $b)) (i32.eqz (call $seen (local.get $p) (local.get $b)))) (then (if (i32.or (i32.load offset=36 (local.get $p)) (i32.eqz (i32.and (i32.load offset=32 (local.get $b)) (i32.const 1)))) (then (local.set $d (call $dist (f32.load offset=4 (local.get $p)) (f32.load offset=8 (local.get $p)) (f32.load offset=8 (local.get $b)) (f32.load offset=12 (local.get $b)))) (if (f32.lt (local.get $d) (local.get $best)) (then (local.set $best (local.get $d)) (local.set $target (local.get $b)))))))) (local.set $b (i32.add (local.get $b) (i32.const 64))) (br_if $search (i32.lt_u (local.get $b) (global.get $end))))) (if (i32.eqz (local.get $target)) (then (return))) (local.set $vx (f32.sub (f32.load offset=8 (local.get $target)) (f32.load offset=4 (local.get $p)))) (local.set $vy (f32.sub (f32.load offset=12 (local.get $target)) (f32.load offset=8 (local.get $p)))) (local.set $d (f32.max (f32.const 0.001) (f32.sqrt (f32.add (call $sq (local.get $vx)) (call $sq (local.get $vy)))))) (f32.store offset=12 (local.get $p) (f32.mul (f32.div (local.get $vx) (local.get $d)) (f32.load offset=68 (local.get $p)))) (f32.store offset=16 (local.get $p) (f32.mul (f32.div (local.get $vy) (local.get $d)) (f32.load offset=68 (local.get $p))))) (func $step_projectiles (local $p i32) (local $b i32) (local $x f32) (local $y f32) (local $dx f32) (local $dy f32) (local $immune i32) (local.set $p (i32.const 917504)) (block $empty (br_if $empty (i32.eq (global.get $pEnd) (local.get $p))) (loop $shots (if (i32.eq (i32.load (local.get $p)) (i32.const 2)) (then (if (call $fragments (local.get $p)) (then (call $retire (local.get $p))))) (else (if (i32.load (local.get $p)) (then (if (i32.and (i32.load offset=52 (local.get $p)) (i32.const 2048)) (then (call $homing (local.get $p)))) (local.set $x (f32.load offset=4 (local.get $p))) (local.set $y (f32.load offset=8 (local.get $p))) (local.set $dx (f32.load offset=12 (local.get $p))) (local.set $dy (f32.load offset=16 (local.get $p))) (block $done (loop $hits (local.set $b (call $collision (local.get $p) (local.get $x) (local.get $y) (local.get $dx) (local.get $dy))) (br_if $done (i32.eqz (local.get $b))) (if (f32.gt (f32.load offset=80 (local.get $p)) (f32.const 0)) (then (f32.store offset=4 (local.get $p) (f32.add (local.get $x) (f32.mul (local.get $dx) (global.get $collisionTime)))) (f32.store offset=8 (local.get $p) (f32.add (local.get $y) (f32.mul (local.get $dy) (global.get $collisionTime)))) (call $explode (local.get $p)) (if (i32.and (i32.load offset=52 (local.get $p)) (i32.const 4096)) (then (if (call $fragments (local.get $p)) (then (call $retire (local.get $p))) (else (i32.store (local.get $p) (i32.const 2))))) (else (call $retire (local.get $p)))) (br $done))) (local.set $immune (i32.eqz (call $can_damage (i32.load offset=20 (local.get $b)) (i32.load offset=32 (local.get $b)) (i32.load offset=24 (local.get $b)) (i32.load offset=32 (local.get $p)) (i32.load offset=36 (local.get $p)) (i32.load offset=52 (local.get $p))))) (call $mark (local.get $p) (local.get $b)) (global.set $attack (i32.add (global.get $attack) (i32.const 1))) (call $impact (local.get $p) (local.get $b)) (call $add (i32.add (local.get $p) (i32.const 24)) (i32.const -1)) (if (i32.or (local.get $immune) (i32.le_s (i32.load offset=24 (local.get $p)) (i32.const 0))) (then (call $retire (local.get $p)) (br $done))) (br $hits))) (if (i32.eq (i32.load (local.get $p)) (i32.const 1)) (then (f32.store offset=4 (local.get $p) (f32.add (local.get $x) (local.get $dx))) (f32.store offset=8 (local.get $p) (f32.add (local.get $y) (local.get $dy))) (call $add (i32.add (local.get $p) (i32.const 20)) (i32.const -1)) (if (i32.or (i32.le_s (i32.load offset=20 (local.get $p)) (i32.const 0)) (i32.or (i32.or (f32.lt (f32.load offset=4 (local.get $p)) (f32.const -100)) (f32.gt (f32.load offset=4 (local.get $p)) (f32.const 1060))) (i32.or (f32.lt (f32.load offset=8 (local.get $p)) (f32.const -100)) (f32.gt (f32.load offset=8 (local.get $p)) (f32.const 580))))) (then (call $retire (local.get $p)))))))))) (local.set $p (i32.add (local.get $p) (i32.const 96))) (br_if $shots (i32.lt_u (local.get $p) (global.get $pEnd)))))) ;; Cash counts one coin per shell, independently of multi-HP damage/RBE. (func $cash_rbe (param $type i32) (result i32) (local $s i32) (local $total i32) (local.set $s (call $stat (local.get $type))) (local.set $total (i32.const 1)) (if (i32.load offset=12 (local.get $s)) (then (local.set $total (i32.add (local.get $total) (i32.mul (i32.load offset=12 (local.get $s)) (call $cash_rbe (i32.load offset=8 (local.get $s)))))))) (if (i32.load offset=20 (local.get $s)) (then (local.set $total (i32.add (local.get $total) (i32.mul (i32.load offset=20 (local.get $s)) (call $cash_rbe (i32.load offset=16 (local.get $s)))))))) (local.get $total)) (func $new (param $type i32) (param $flags i32) (param $d f32) (param $chain i32) (param $paid i32) (param $cashpaid i32) (param $parent i32) (param $popBudget i32) (param $cashBudget i32) (result i32) (local $b i32) (local $tries i32) (if (i32.ge_u (i32.add (i32.load (i32.const 20)) (global.get $reserved)) (i32.const 4096)) (then (return (i32.const 0)))) (local.set $b (global.get $alloc)) (loop $slot (if (i32.load (local.get $b)) (then (local.set $b (i32.add (local.get $b) (i32.const 64))) (if (i32.ge_u (local.get $b) (i32.const 327680)) (then (local.set $b (i32.const 65536)))) (local.set $tries (i32.add (local.get $tries) (i32.const 1))) (br_if $slot (i32.lt_u (local.get $tries) (i32.const 4096)))))) (if (i32.load (local.get $b)) (then (return (i32.const 0)))) (local.set $flags (call $flags (local.get $type) (local.get $flags))) (call $born (local.get $b) (local.get $parent)) (memory.fill (local.get $b) (i32.const 0) (i32.const 64)) (i32.store (local.get $b) (i32.const 1)) (f32.store offset=4 (local.get $b) (local.get $d)) (f32.store offset=8 (local.get $b) (call $pos (local.get $d) (i32.const 0))) (f32.store offset=12 (local.get $b) (call $pos (local.get $d) (i32.const 1))) (if (call $can_damage (local.get $type) (local.get $flags) (i32.const 0) (i32.const 2) (i32.const 1) (i32.load offset=24 (call $bm (local.get $b)))) (then (i32.store offset=24 (local.get $b) (i32.load offset=20 (call $bm (local.get $b)))))) (i32.store offset=28 (call $bm (local.get $b)) (select (call $rbe (local.get $type) (local.get $flags)) (local.get $popBudget) (i32.lt_s (local.get $popBudget) (i32.const 0)))) (i32.store offset=20 (call $bm (local.get $b)) (select (call $cash_rbe (local.get $type)) (local.get $cashBudget) (i32.lt_s (local.get $cashBudget) (i32.const 0)))) (i32.store offset=16 (local.get $b) (call $health (local.get $type) (local.get $flags))) (i32.store offset=20 (local.get $b) (local.get $type)) (i32.store offset=32 (local.get $b) (local.get $flags)) (i32.store offset=36 (local.get $b) (i32.or (local.get $chain) (i32.shl (i32.const 1) (local.get $type)))) (i32.store offset=40 (local.get $b) (i32.const 180)) (i32.store offset=44 (local.get $b) (local.get $paid)) (i32.store offset=48 (local.get $b) (i32.load (i32.const 28))) (i32.store offset=52 (local.get $b) (select (i32.const 0) (call $health (local.get $type) (local.get $flags)) (i32.and (local.get $paid) (i32.shl (i32.const 1) (local.get $type))))) (i32.store offset=56 (local.get $b) (global.get $attack)) (i32.store offset=60 (local.get $b) (local.get $cashpaid)) (call $add (i32.const 20) (i32.const 1)) (if (global.get $gridReady) (then (call $grid_insert (local.get $b)))) (global.set $alloc (i32.add (local.get $b) (i32.const 64))) (if (i32.gt_u (global.get $alloc) (global.get $end)) (then (global.set $end (global.get $alloc)))) (if (i32.ge_u (global.get $alloc) (i32.const 327680)) (then (global.set $alloc (i32.const 65536)))) (local.get $b)) (func (export "send_bloon") (param $type i32) (param $flags i32) (param $count i32) (result i32) (local $n i32) (if (i32.or (i32.eqz (i32.load (i32.const 32))) (i32.ge_u (i32.load (i32.const 12)) (i32.const 2))) (then (return (i32.const 0)))) (if (i32.or (i32.gt_u (local.get $type) (i32.const 16)) (i32.or (i32.gt_u (local.get $flags) (i32.const 7)) (i32.or (i32.eqz (local.get $count)) (i32.gt_u (local.get $count) (i32.const 100))))) (then (return (i32.const 0)))) (if (i32.gt_u (i32.add (i32.load (i32.const 20)) (local.get $count)) (i32.const 4096)) (then (return (i32.const 0)))) (loop $send (drop (call $new (local.get $type) (local.get $flags) (f32.mul (f32.convert_i32_s (local.get $n)) (f32.const -28)) (i32.const 0) (i32.const 0) (i32.const 0) (i32.const 0) (i32.const -1) (i32.const -1))) (local.set $n (i32.add (local.get $n) (i32.const 1))) (br_if $send (i32.lt_u (local.get $n) (local.get $count)))) (i32.store (i32.const 12) (i32.const 1)) (local.get $n)) (func (export "clear_bloons") (result i32) (if (i32.eqz (i32.load (i32.const 32))) (then (return (i32.const 0)))) (memory.fill (i32.const 65536) (i32.const 0) (i32.const 262144)) (memory.fill (i32.const 24576) (i32.const 0) (i32.const 6144)) (call $clear_projectiles) (i32.store (i32.const 20) (i32.const 0)) (i32.store (i32.const 24) (i32.const 0)) (i32.store (i32.const 36) (i32.const 0)) (i32.store (i32.const 12) (i32.const 0)) (i32.store (i32.const 4) (i32.const 999999)) (global.set $end (i32.const 65536)) (global.set $alloc (i32.const 65536)) (i32.const 1)) (func (export "start") (result i32) (local $index i32) (local $g i32) (local $p i32) (if (i32.or (i32.load (i32.const 12)) (i32.load (i32.const 32))) (then (return (i32.const 0)))) (if (i32.ge_u (i32.load (i32.const 8)) (i32.const 40)) (then (return (i32.const 0)))) (call $add (i32.const 8) (i32.const 1)) (local.set $index (i32.add (i32.const 327680) (i32.mul (i32.load (i32.const 8)) (i32.const 8)))) (global.set $groupStart (i32.load (local.get $index))) (global.set $groupCount (i32.load offset=4 (local.get $index))) (memory.fill (i32.const 2048) (i32.const 0) (i32.const 512)) (i32.store (i32.const 24) (i32.const 0)) (i32.store (i32.const 40) (i32.const 0)) (loop $count (local.set $p (i32.add (global.get $groupStart) (i32.mul (local.get $g) (i32.const 24)))) (call $add (i32.const 24) (i32.load offset=8 (local.get $p))) (local.set $g (i32.add (local.get $g) (i32.const 1))) (br_if $count (i32.lt_u (local.get $g) (global.get $groupCount)))) (i32.store (i32.const 12) (i32.const 1)) (i32.const 1)) (func $spawn_balloon (local $g i32) (local $p i32) (local $counter i32) (local $sent i32) (local $count i32) (local $due i32) (loop $groups (local.set $p (i32.add (global.get $groupStart) (i32.mul (local.get $g) (i32.const 24)))) (local.set $counter (i32.add (i32.const 2048) (i32.mul (local.get $g) (i32.const 4)))) (local.set $sent (i32.load (local.get $counter))) (local.set $count (i32.load offset=8 (local.get $p))) (block $notdue (loop $due (br_if $notdue (i32.ge_u (local.get $sent) (local.get $count))) (local.set $due (i32.load offset=12 (local.get $p))) (if (i32.gt_u (local.get $count) (i32.const 1)) (then (local.set $due (i32.add (local.get $due) (i32.div_u (i32.mul (i32.sub (i32.load offset=16 (local.get $p)) (local.get $due)) (local.get $sent)) (i32.sub (local.get $count) (i32.const 1))))))) (br_if $notdue (i32.lt_u (i32.load (i32.const 40)) (local.get $due))) (br_if $notdue (i32.eqz (call $new (i32.load (local.get $p)) (i32.load offset=4 (local.get $p)) (f32.const 0) (i32.const 0) (i32.const 0) (i32.const 0) (i32.const 0) (i32.const -1) (i32.const -1)))) (local.set $sent (i32.add (local.get $sent) (i32.const 1))) (i32.store (local.get $counter) (local.get $sent)) (call $add (i32.const 24) (i32.const -1)) (br $due))) (local.set $g (i32.add (local.get $g) (i32.const 1))) (br_if $groups (i32.lt_u (local.get $g) (global.get $groupCount))))) ;; Damage kinds: 0 sharp, 1 explosive, 2 cold, 3 energy, 4 fire, 5 plasma, 6 normal. (func (export "can_damage") (param $type i32) (param $flags i32) (param $frozen i32) (param $kind i32) (param $detect i32) (param $power i32) (result i32) (call $can_damage (local.get $type) (call $flags (local.get $type) (local.get $flags)) (local.get $frozen) (local.get $kind) (local.get $detect) (local.get $power))) (func $can_damage (param $type i32) (param $flags i32) (param $frozen i32) (param $kind i32) (param $detect i32) (param $power i32) (result i32) (if (i32.or (i32.gt_u (local.get $type) (i32.const 16)) (i32.gt_u (local.get $kind) (i32.const 6))) (then (return (i32.const 0)))) (if (i32.and (i32.eqz (local.get $detect)) (i32.and (local.get $flags) (i32.const 1))) (then (return (i32.const 0)))) (if (i32.eq (local.get $kind) (i32.const 6)) (then (return (i32.const 1)))) (if (i32.and (i32.ne (local.get $frozen) (i32.const 0)) (i32.or (i32.and (i32.eqz (local.get $kind)) (i32.eqz (i32.and (local.get $power) (i32.const 8)))) (i32.and (i32.eq (local.get $kind) (i32.const 2)) (i32.eqz (i32.and (local.get $power) (i32.const 16)))))) (then (return (i32.const 0)))) (if (i32.and (i32.eqz (i32.and (local.get $power) (i32.const 1))) (i32.and (i32.or (i32.eq (local.get $type) (i32.const 8)) (i32.eq (local.get $type) (i32.const 15))) (i32.or (i32.eqz (local.get $kind)) (i32.or (i32.eq (local.get $kind) (i32.const 2)) (i32.eq (local.get $kind) (i32.const 3)))))) (then (return (i32.const 0)))) (if (i32.and (i32.eqz (i32.and (local.get $power) (i32.const 4))) (i32.and (i32.eq (local.get $kind) (i32.const 1)) (i32.or (i32.eq (local.get $type) (i32.const 5)) (i32.or (i32.eq (local.get $type) (i32.const 9)) (i32.eq (local.get $type) (i32.const 15)))))) (then (return (i32.const 0)))) (if (i32.and (i32.eq (local.get $kind) (i32.const 2)) (i32.or (i32.ge_u (local.get $type) (i32.const 12)) (i32.or (i32.eq (local.get $type) (i32.const 6)) (i32.eq (local.get $type) (i32.const 9))))) (then (return (i32.const 0)))) (if (i32.and (i32.eq (local.get $type) (i32.const 7)) (i32.ge_u (local.get $kind) (i32.const 3))) (then (return (i32.const 0)))) (i32.const 1)) (func $hit (param $b i32) (param $damage i32) (param $t i32) (param $kind i32) (param $detect i32) (local $type i32) (local $flags i32) (local $hp i32) (local $dealt i32) (local $credit i32) (local $paid i32) (local $cashpaid i32) (local $bit i32) (local $s i32) (local $n i32) (local $j i32) (local $child i32) (local $ct i32) (local $chain i32) (local $d f32) (local $remainder i32) (local $popBudget i32) (local $cashBudget i32) (local $childPop i32) (local $childCash i32) (local $popWeight i32) (local $cashWeight i32) (local $weight i32) (if (i32.or (i32.eqz (i32.load (local.get $b))) (i32.le_s (local.get $damage) (i32.const 0))) (then (return))) (local.set $type (i32.load offset=20 (local.get $b))) (local.set $flags (i32.load offset=32 (local.get $b))) (if (i32.eqz (call $can_damage (local.get $type) (local.get $flags) (select (i32.const 0) (i32.load offset=24 (local.get $b)) (i32.eq (i32.load offset=56 (local.get $b)) (global.get $attack))) (local.get $kind) (local.get $detect) (global.get $damagePower))) (then (return))) (local.set $hp (i32.load offset=16 (local.get $b))) (local.set $s (call $stat (local.get $type))) (local.set $n (i32.add (i32.load offset=12 (local.get $s)) (i32.load offset=20 (local.get $s)))) ;; Splitting is transactional: never silently discard children when the pool is full. (if (i32.and (i32.ge_s (local.get $damage) (local.get $hp)) (i32.gt_u (i32.add (i32.add (i32.load (i32.const 20)) (global.get $reserved)) (local.get $n)) (i32.const 4097))) (then (i32.store (i32.const 36) (i32.const 1)) (return))) (local.set $dealt (select (local.get $damage) (local.get $hp) (i32.lt_s (local.get $damage) (local.get $hp)))) (local.set $credit (select (local.get $dealt) (i32.load offset=52 (local.get $b)) (i32.lt_s (local.get $dealt) (i32.load offset=52 (local.get $b))))) (if (i32.gt_u (local.get $credit) (i32.load offset=28 (call $bm (local.get $b)))) (then (local.set $credit (i32.load offset=28 (call $bm (local.get $b)))))) (call $add (i32.add (call $bm (local.get $b)) (i32.const 28)) (i32.sub (i32.const 0) (local.get $credit))) (call $add (i32.add (local.get $b) (i32.const 52)) (i32.sub (i32.const 0) (local.get $credit))) (call $add (i32.const 16) (local.get $credit)) (if (local.get $t) (then (call $add (i32.add (local.get $t) (i32.const 32)) (local.get $credit)))) (local.set $bit (i32.shl (i32.const 1) (local.get $type))) (local.set $paid (i32.or (i32.load offset=44 (local.get $b)) (local.get $bit))) (i32.store offset=44 (local.get $b) (local.get $paid)) (i32.store offset=40 (local.get $b) (i32.const 180)) (i32.store offset=28 (local.get $b) (i32.const 6)) (call $slow_and_freeze (local.get $b) (local.get $kind)) (i32.store offset=56 (local.get $b) (global.get $attack)) (i32.store offset=16 (local.get $b) (i32.sub (local.get $hp) (local.get $dealt))) (if (i32.gt_s (i32.load offset=16 (local.get $b)) (i32.const 0)) (then (return))) (local.set $cashpaid (i32.load offset=60 (local.get $b))) (if (i32.and (i32.eqz (i32.and (local.get $cashpaid) (local.get $bit))) (i32.gt_s (i32.load offset=20 (call $bm (local.get $b))) (i32.const 0))) (then (call $add (i32.const 0) (i32.const 1)) (call $add (i32.add (call $bm (local.get $b)) (i32.const 20)) (i32.const -1)))) (local.set $cashpaid (i32.or (local.get $cashpaid) (local.get $bit))) (local.set $d (f32.load offset=4 (local.get $b))) (local.set $chain (i32.load offset=36 (local.get $b))) (local.set $flags (call $child_flags (local.get $type) (local.get $flags))) (local.set $remainder (i32.sub (local.get $damage) (local.get $dealt))) ;; Damage does not penetrate a MOAB-class shell into its children. (if (i32.ge_u (local.get $type) (i32.const 12)) (then (local.set $paid (i32.const 0)) (local.set $cashpaid (i32.const 0)) (local.set $chain (i32.const 0)) (local.set $remainder (i32.const 0)))) (local.set $popBudget (i32.load offset=28 (call $bm (local.get $b)))) (local.set $cashBudget (i32.load offset=20 (call $bm (local.get $b)))) (if (local.get $n) (then (local.set $popWeight (i32.sub (call $rbe (local.get $type) (i32.load offset=32 (local.get $b))) (call $health (local.get $type) (i32.load offset=32 (local.get $b))))) (local.set $cashWeight (i32.sub (call $cash_rbe (local.get $type)) (i32.const 1))))) (i32.store (local.get $b) (i32.const 0)) (call $add (i32.const 20) (i32.const -1)) (global.set $reserved (i32.add (global.get $reserved) (local.get $n))) (block $nochildren (br_if $nochildren (i32.eqz (local.get $n))) (loop $children (local.set $ct (select (i32.load offset=8 (local.get $s)) (i32.load offset=16 (local.get $s)) (i32.lt_u (local.get $j) (i32.load offset=12 (local.get $s))))) ;; Partition outstanding credits; regrowing into a branching ancestor must ;; not create a new budget for every descendant. (local.set $weight (call $rbe (local.get $ct) (local.get $flags))) (local.set $childPop (i32.div_u (i32.mul (local.get $popBudget) (local.get $weight)) (local.get $popWeight))) (local.set $popBudget (i32.sub (local.get $popBudget) (local.get $childPop))) (local.set $popWeight (i32.sub (local.get $popWeight) (local.get $weight))) (local.set $weight (call $cash_rbe (local.get $ct))) (local.set $childCash (i32.div_u (i32.mul (local.get $cashBudget) (local.get $weight)) (local.get $cashWeight))) (local.set $cashBudget (i32.sub (local.get $cashBudget) (local.get $childCash))) (local.set $cashWeight (i32.sub (local.get $cashWeight) (local.get $weight))) (global.set $reserved (i32.sub (global.get $reserved) (i32.const 1))) (local.set $child (call $new (local.get $ct) (local.get $flags) (f32.sub (local.get $d) (f32.mul (f32.convert_i32_u (local.get $j)) (f32.const 3))) (local.get $chain) (local.get $paid) (local.get $cashpaid) (local.get $b) (local.get $childPop) (local.get $childCash))) (if (i32.and (i32.eq (local.get $kind) (i32.const 2)) (call $can_damage (local.get $ct) (local.get $flags) (i32.const 0) (i32.const 2) (local.get $detect) (global.get $damagePower))) (then (call $slow_and_freeze (local.get $child) (i32.const 2)))) (if (local.get $remainder) (then (call $hit (local.get $child) (local.get $remainder) (local.get $t) (local.get $kind) (local.get $detect)))) (local.set $j (i32.add (local.get $j) (i32.const 1))) (br_if $children (i32.lt_u (local.get $j) (local.get $n)))))) (func (export "sandbox_strike") (param $slot i32) (param $damage i32) (param $kind i32) (param $detect i32) (result i32) (local $b i32) (if (i32.or (i32.eqz (i32.load (i32.const 32))) (i32.ge_u (local.get $slot) (i32.const 4096))) (then (return (i32.const 0)))) (local.set $b (i32.add (i32.const 65536) (i32.mul (local.get $slot) (i32.const 64)))) (if (i32.eqz (i32.load (local.get $b))) (then (return (i32.const 0)))) (global.set $attack (i32.add (global.get $attack) (i32.const 1))) (global.set $damagePower (i32.const 0)) (global.set $freezeTicks (i32.const 90)) (call $hit (local.get $b) (local.get $damage) (i32.const 0) (local.get $kind) (local.get $detect)) (i32.const 1)) (func (export "targeting") (param $id i32) (param $priority i32) (result i32) (local $t i32) (local.set $t (call $tower (local.get $id))) (if (i32.or (i32.eqz (local.get $t)) (i32.gt_u (local.get $priority) (i32.const 3))) (then (return (i32.const 0)))) (if (i32.or (i32.eqz (i32.load (local.get $t))) (i32.ge_u (i32.load (i32.const 12)) (i32.const 2))) (then (return (i32.const 0)))) (if (i32.or (i32.eq (i32.load offset=12 (local.get $t)) (i32.const 1)) (i32.eq (i32.load offset=12 (local.get $t)) (i32.const 3))) (then (return (i32.const 0)))) (i32.store offset=40 (local.get $t) (local.get $priority)) (i32.const 1)) (func $fire (param $t i32) (local $b i32) (local $target i32) (local $best f32) (local $score f32) (local $r f32) (local $distance f32) (local $detect i32) (local $priority i32) (local $type i32) (local $m i32) (local $p i32) (local $n i32) (local $count i32) (local $vector i32) (local $x f32) (local $y f32) (local $vx f32) (local $vy f32) (local $dx f32) (local $dy f32) (local.set $m (call $tx (local.get $t))) (local.set $type (i32.load offset=12 (local.get $t))) (local.set $priority (i32.load offset=40 (local.get $t))) (local.set $detect (i32.load offset=48 (local.get $m))) (local.set $r (call $sq (f32.load offset=72 (local.get $m)))) (local.set $best (f32.const -1e20)) (local.set $b (i32.const 65536)) (block $empty (br_if $empty (i32.eq (global.get $end) (i32.const 65536))) (loop $search (if (i32.and (i32.load (local.get $b)) (i32.or (local.get $detect) (i32.eqz (i32.and (i32.load offset=32 (local.get $b)) (i32.const 1))))) (then (local.set $distance (call $dist (f32.load offset=4 (local.get $t)) (f32.load offset=8 (local.get $t)) (f32.load offset=8 (local.get $b)) (f32.load offset=12 (local.get $b)))) (if (f32.le (local.get $distance) (local.get $r)) (then (local.set $score (f32.load offset=4 (local.get $b))) (if (i32.eq (local.get $priority) (i32.const 1)) (then (local.set $score (f32.neg (local.get $score))))) (if (i32.eq (local.get $priority) (i32.const 2)) (then (local.set $score (f32.neg (local.get $distance))))) (if (i32.eq (local.get $priority) (i32.const 3)) (then (local.set $score (f32.convert_i32_s (i32.add (i32.mul (i32.load offset=24 (call $stat (i32.load offset=20 (local.get $b)))) (i32.const 2)) (i32.ne (i32.and (i32.load offset=32 (local.get $b)) (i32.const 4)) (i32.const 0))))))) (if (i32.or (f32.gt (local.get $score) (local.get $best)) (i32.and (f32.eq (local.get $score) (local.get $best)) (f32.gt (f32.load offset=4 (local.get $b)) (f32.load offset=4 (local.get $target))))) (then (local.set $target (local.get $b)) (local.set $best (local.get $score)))))))) (local.set $b (i32.add (local.get $b) (i32.const 64))) (br_if $search (i32.lt_u (local.get $b) (global.get $end))))) (if (i32.eqz (local.get $target)) (then (return))) ;; Leave eight slots available so a fragmenting bomb can always make progress. (local.set $count (i32.load offset=52 (local.get $m))) (if (i32.gt_u (i32.add (i32.load (i32.const 44)) (local.get $count)) (i32.const 2040)) (then (i32.store (i32.const 48) (i32.const 1)) (return))) (local.set $x (f32.load offset=4 (local.get $t))) (local.set $y (f32.load offset=8 (local.get $t))) (f32.store offset=24 (local.get $t) (f32.load offset=8 (local.get $target))) (f32.store offset=28 (local.get $t) (f32.load offset=12 (local.get $target))) (local.set $dx (f32.sub (f32.load offset=8 (local.get $target)) (local.get $x))) (local.set $dy (f32.sub (f32.load offset=12 (local.get $target)) (local.get $y))) (local.set $distance (f32.max (f32.const 0.001) (f32.sqrt (f32.add (call $sq (local.get $dx)) (call $sq (local.get $dy)))))) ;; Aim ahead on the track; the projectile still has to intersect the moving target. (local.set $distance (f32.add (f32.load offset=4 (local.get $target)) (f32.mul (call $balloon_speed (local.get $target)) (f32.div (local.get $distance) (f32.load offset=64 (local.get $m)))))) (local.set $dx (f32.sub (call $pos (local.get $distance) (i32.const 0)) (local.get $x))) (local.set $dy (f32.sub (call $pos (local.get $distance) (i32.const 1)) (local.get $y))) (local.set $distance (f32.max (f32.const 0.001) (f32.sqrt (f32.add (call $sq (local.get $dx)) (call $sq (local.get $dy)))))) (local.set $dx (f32.div (local.get $dx) (local.get $distance))) (local.set $dy (f32.div (local.get $dy) (local.get $distance))) (loop $volley (local.set $vx (local.get $dx)) (local.set $vy (local.get $dy)) (if (i32.eq (local.get $type) (i32.const 1)) (then (local.set $vector (i32.add (select (i32.const 394240) (select (i32.const 394304) (i32.const 394384) (i32.eq (local.get $count) (i32.const 10))) (i32.eq (local.get $count) (i32.const 8))) (i32.mul (local.get $n) (i32.const 8)))) (local.set $vx (f32.load (local.get $vector))) (local.set $vy (f32.load offset=4 (local.get $vector))))) (if (i32.and (i32.eq (local.get $count) (i32.const 3)) (i32.ne (local.get $n) (i32.const 1))) (then (local.set $distance (select (f32.const -0.139543) (f32.const 0.139543) (i32.eqz (local.get $n)))) (local.set $vx (f32.sub (f32.mul (local.get $dx) (f32.const 0.990268)) (f32.mul (local.get $dy) (local.get $distance)))) (local.set $vy (f32.add (f32.mul (local.get $dy) (f32.const 0.990268)) (f32.mul (local.get $dx) (local.get $distance)))))) (local.set $p (call $projectile (local.get $t) (local.get $x) (local.get $y) (f32.mul (local.get $vx) (f32.load offset=64 (local.get $m))) (f32.mul (local.get $vy) (f32.load offset=64 (local.get $m))) (local.get $target) (i32.load offset=92 (local.get $m)))) (if (i32.eq (local.get $type) (i32.const 3)) (then (f32.store offset=80 (local.get $p) (f32.load offset=72 (local.get $m))) (call $explode (local.get $p)) (call $retire (local.get $p)))) (local.set $n (i32.add (local.get $n) (i32.const 1))) (br_if $volley (i32.lt_u (local.get $n) (local.get $count)))) (if (i32.and (i32.eq (local.get $type) (i32.const 5)) (i32.ge_u (i32.load offset=8 (local.get $m)) (i32.const 2))) (then (if (i32.le_s (i32.load offset=24 (local.get $m)) (i32.const 0)) (then (if (i32.lt_u (i32.load (i32.const 44)) (i32.const 2040)) (then (local.set $p (call $projectile (local.get $t) (f32.load offset=8 (local.get $target)) (f32.load offset=12 (local.get $target)) (f32.const 0) (f32.const 0) (i32.const 0) (i32.const 10))) (i32.store offset=20 (local.get $p) (i32.const 420)) (i32.store offset=24 (local.get $p) (i32.const 5)) (i32.store offset=52 (local.get $p) (i32.const 0)) (i32.store offset=24 (local.get $m) (i32.const 240)))))))) (f32.store offset=20 (local.get $t) (f32.add (f32.load offset=20 (local.get $t)) (f32.load offset=60 (local.get $m))))) (func (export "step") (local $b i32) (local $t i32) (local $type i32) (local $speed f32) (local $above i32) (local $next i32) (if (i32.ne (i32.load (i32.const 12)) (i32.const 1)) (then (return))) (call $add (i32.const 28) (i32.const 1)) (if (i32.gt_s (i32.load (i32.const 24)) (i32.const 0)) (then (call $spawn_balloon))) (call $add (i32.const 40) (i32.const 1)) (local.set $b (i32.const 65536)) (block $nomove (br_if $nomove (i32.eq (global.get $end) (i32.const 65536))) (loop $move (if (i32.and (i32.load (local.get $b)) (i32.ne (i32.load offset=48 (local.get $b)) (i32.load (i32.const 28)))) (then (local.set $type (i32.load offset=20 (local.get $b))) (if (i32.and (i32.load offset=32 (local.get $b)) (i32.const 2)) (then (call $add (i32.add (local.get $b) (i32.const 40)) (i32.const -1)) (if (i32.le_s (i32.load offset=40 (local.get $b)) (i32.const 0)) (then (local.set $above (i32.and (i32.load offset=36 (local.get $b)) (i32.shl (i32.const -1) (i32.add (local.get $type) (i32.const 1))))) (if (local.get $above) (then (local.set $next (i32.ctz (local.get $above))) (i32.store offset=20 (local.get $b) (local.get $next)) (i32.store offset=16 (local.get $b) (call $health (local.get $next) (i32.load offset=32 (local.get $b)))) (i32.store offset=52 (local.get $b) (select (i32.const 0) (call $health (local.get $next) (i32.load offset=32 (local.get $b))) (i32.and (i32.load offset=44 (local.get $b)) (i32.shl (i32.const 1) (local.get $next))))) (local.set $type (local.get $next)))) (i32.store offset=40 (local.get $b) (i32.const 180)))))) (local.set $speed (f32.mul (f32.load offset=4 (call $stat (local.get $type))) (f32.const 1.05))) (if (i32.load offset=4 (call $bm (local.get $b))) (then (local.set $speed (f32.mul (local.get $speed) (f32.const 0.5))))) (if (i32.gt_s (i32.load offset=12 (call $bm (local.get $b))) (i32.const 0)) (then (local.set $speed (f32.neg (f32.min (local.get $speed) (f32.max (f32.const 0) (f32.load offset=4 (local.get $b)))))) (call $add (i32.add (call $bm (local.get $b)) (i32.const 12)) (i32.const -1)))) (if (i32.gt_s (i32.load offset=16 (call $bm (local.get $b))) (i32.const 0)) (then (local.set $speed (f32.mul (local.get $speed) (f32.const 0.7))) (call $add (i32.add (call $bm (local.get $b)) (i32.const 16)) (i32.const -1)))) (if (i32.gt_s (i32.load offset=24 (local.get $b)) (i32.const 0)) (then (local.set $speed (f32.const 0)) (call $add (i32.add (local.get $b) (i32.const 24)) (i32.const -1)))) (f32.store offset=4 (local.get $b) (f32.add (f32.load offset=4 (local.get $b)) (local.get $speed))) (f32.store offset=8 (local.get $b) (call $pos (f32.load offset=4 (local.get $b)) (i32.const 0))) (f32.store offset=12 (local.get $b) (call $pos (f32.load offset=4 (local.get $b)) (i32.const 1))) (if (i32.gt_s (i32.load offset=28 (local.get $b)) (i32.const 0)) (then (call $add (i32.add (local.get $b) (i32.const 28)) (i32.const -1)))) (if (f32.ge (f32.load offset=4 (local.get $b)) (f32.const 1783)) (then (call $add (i32.const 4) (i32.sub (i32.const 0) (i32.sub (call $rbe (local.get $type) (i32.load offset=32 (local.get $b))) (i32.sub (call $health (local.get $type) (i32.load offset=32 (local.get $b))) (i32.load offset=16 (local.get $b)))))) (i32.store (local.get $b) (i32.const 0)) (call $add (i32.const 20) (i32.const -1)))))) (local.set $b (i32.add (local.get $b) (i32.const 64))) (br_if $move (i32.lt_u (local.get $b) (global.get $end))))) (call $build_grid) (local.set $t (i32.const 12288)) (loop $shoot (if (i32.load (local.get $t)) (then (call $add (i32.add (call $tx (local.get $t)) (i32.const 24)) (i32.const -1)) (f32.store offset=20 (local.get $t) (f32.max (f32.const -1) (f32.sub (f32.load offset=20 (local.get $t)) (f32.const 1)))) (if (f32.le (f32.load offset=20 (local.get $t)) (f32.const 0)) (then (call $fire (local.get $t)))))) (local.set $t (i32.add (local.get $t) (i32.const 48))) (br_if $shoot (i32.lt_u (local.get $t) (i32.const 14592)))) (call $step_projectiles) (global.set $gridReady (i32.const 0)) (local.set $b (i32.const 24576)) (loop $fade (if (i32.gt_s (i32.load offset=16 (local.get $b)) (i32.const 0)) (then (call $add (i32.add (local.get $b) (i32.const 16)) (i32.const -1)))) (local.set $b (i32.add (local.get $b) (i32.const 24))) (br_if $fade (i32.lt_u (local.get $b) (i32.const 30720)))) (if (i32.le_s (i32.load (i32.const 4)) (i32.const 0)) (then (i32.store (i32.const 4) (i32.const 0)) (i32.store (i32.const 12) (i32.const 2)) (return))) (if (i32.eqz (i32.add (i32.load (i32.const 20)) (i32.load (i32.const 24)))) (then (if (i32.eqz (i32.load (i32.const 32))) (then (call $add (i32.const 0) (i32.add (i32.const 100) (i32.load (i32.const 8)))))) (i32.store (i32.const 12) (select (i32.const 3) (i32.const 0) (i32.ge_u (i32.load (i32.const 8)) (i32.const 40)))) (memory.fill (i32.const 24576) (i32.const 0) (i32.const 6144)) (call $clear_projectiles) (global.set $end (i32.const 65536)) (global.set $alloc (i32.const 65536))))) )