[functions] [function] args="level,n" name="score" formula="set(level.player.vars.score, level.player.vars.score + n)" [/function] [function] args="level" name="kc" formula="[set(level.player.driver.max_hitpoints, 10), set(level.player.driver.hitpoints, 10), set(level.player.driver.spit_power, 160), set(level.player.driver.tongue_length, 22), set(level.player.driver.unlocked_items, level.player.driver.unlocked_items + ['powerup_invincible'] + ['powerup_shooting'] + ['powerup_reflexes'])]" [/function] #three functions to help with powerup testing [function] args="level" name="shooting" formula="set(level.player.driver.unlocked_items, ['powerup_shooting', 'points_cube'])" [/function] [function] args="level" name="invincible" formula="set(level.player.driver.unlocked_items, ['powerup_invincible', 'points_cube'])" [/function] [function] args="level" name="reflexes" formula="set(level.player.driver.unlocked_items, ['powerup_reflexes', 'points_cube'])" [/function] [function] args="level,n" name="gold" formula="[ if(level.player.driver.coins + n >= 10, achievement('pocket_money')), #We give a little leeway to the players; the actual maximum is 1059 coins (frogatto 1.1)# if(level.player.driver.coins + n >= 1048, achievement('gold_hoarder')), if(level.player.driver.coins + n >= 99999, [achievement('speed_trader'), set(level.player.driver.coins, 99999), set(level.player.vars.gold_counter, 99999-level.player.driver.coins)], [add(level.player.driver.coins, n), add(level.player.vars.gold_counter, n)] ), set(level.player.vars.last_got_gold, level.player.cycle), fire_event(level.player,'display_gold')]" [/function] [function] args="parent*" name="spawn_item" formula="if(level.player.vars.next_unlocked_item, [spawn(level.player.vars.next_unlocked_item, parent.midpoint_x, parent.y, parent.facing), set(level.player.vars.next_unlocked_item, null())], if(unlocked_items, spawn( choose(unlocked_items, 1d1000) , parent.midpoint_x, parent.y, parent.facing, [set(velocity_x, velocity_x/6 +1d600-300), set(velocity_y, velocity_y/6)]))) where unlocked_items = filter(if(level.player.vehicle, level.player.vehicle.vars.unlocked_items, level.player.vars.unlocked_items), 'item', if(level.player.hitpoints = level.player.max_hitpoints and item = 'heart_object' or level.player.vars.powerup_time > 0 and strstr(item, 'powerup'), 0, 1))" # if we want vehicle items AND player items when you're in a vehicle, then do the following: #where unlocked_items = if(level.player.vehicle, level.player.vehicle.vars.unlocked_items + level.player.driver.vars.unlocked_items, level.player.vars.unlocked_items) " [/function] [function] name="register_kill" args="obj" formula="[ [if(time() - kc[size(kc)-4][1] < 10, achievement('rampage')), if(kc[15][0].type = kc[14][0].type and kc[15][0].type = kc[13][0].type and kc[15][0].type = kc[12][0].type and kc[15][0].type = kc[11][0].type and kc[15][0].type = kc[10][0].type and kc[15][0].type = kc[9][0].type and kc[15][0].type = kc[8][0].type and kc[15][0].type = kc[7][0].type and kc[15][0].type = kc[6][0].type and kc[15][0].type = obj.type, achievement('grudge'))]where kc = obj.level.player.vars.achievement_kill_chain, set(obj.level.player.vars.achievement_kill_chain, slice(obj.level.player.vars.achievement_kill_chain, 1, 16) + [[obj, time()]]) ]" [/function] [function] name="splash_effect" args="obj" formula="if(obj.underwater, [if(abs(obj.water_bounds[1] - obj.midpoint_y) > 40, spawn('water_splash_underwater_big', obj.midpoint_x, obj.midpoint_y, if(1d2=2,obj.facing,-obj.facing)), spawn('water_splash', obj.midpoint_x, obj.water_bounds[1]+10, if(1d2=2,obj.facing,-obj.facing))), sound('water-enter.ogg'),])" [/function] [function] name="death_burst" args="obj" formula="[if(obj.underwater, splash_effect(obj), spawn('die_cloud', obj.midpoint_x, obj.midpoint_y, obj.facing))]" [/function] [function] #wrapped version of death_burst that tracks death for achievements name="death_burst_tracked" args="obj" formula="[death_burst(obj),register_kill(obj)]" [/function] [function] name="elastic_collision" args="a,b" #takes two objects as parameters, changes their velocities according to an elastic collision # note deep magic on if(a < b) - this compares the memory addresses, and is done to ensure collisions aren't calculated twice (once on each end of the collision). #formula=" [set(a, 'velocity_x', -1200 ), set(b, 'velocity_x', 1200) ] " # formula=" [set(a, 'velocity_x', (a.velocity_x*1000 * (a.mass - b.mass)/(a.mass + b.mass) + (b.velocity_x*1000 * b.mass)/ (a.mass + b.mass))/1000 ), set(b, 'velocity_x', ((a.mass * a.velocity_x*1000)/(a.mass + b.mass) + b.velocity_x*1000 * (b.mass - a.mass )/(a.mass + b.mass))/10 ) ]" formula="if(a.mass and b.mass, [set(a.velocity_x, (momentum_x/2)/a.mass), set(b.velocity_x, (momentum_x/2)/b.mass)] where momentum_x = a.velocity_x*a.mass + b.velocity_x*b.mass)" [/function] #additional functions, by group: @include "data/geometry-functions.cfg" @include "data/time-functions.cfg" @include "data/list-functions.cfg" [/functions]